--- linux-source-2.6.8.1-2.6.8.1.orig/arch/x86_64/kernel/process.c +++ linux-source-2.6.8.1-2.6.8.1/arch/x86_64/kernel/process.c @@ -477,6 +477,8 @@ write_pda(pcurrent, next_p); write_pda(kernelstack, (unsigned long)next_p->thread_info + THREAD_SIZE - PDA_STACKOFFSET); + unlazy_fpu(prev_p); + /* * Now maybe reload the debug registers */ --- linux-source-2.6.8.1-2.6.8.1.orig/scripts/package/Makefile +++ linux-source-2.6.8.1-2.6.8.1/scripts/package/Makefile @@ -77,7 +77,7 @@ $(MAKE) $(CONFIG_SHELL) $(srctree)/scripts/package/builddeb -clean-rule += && rm -rf $(objtree)/debian/ +#clean-rule += && rm -rf $(objtree)/debian/ # Help text displayed when executing 'make help' --- linux-source-2.6.8.1-2.6.8.1.orig/debian/changelog +++ linux-source-2.6.8.1-2.6.8.1/debian/changelog @@ -0,0 +1,2497 @@ +linux-source-2.6.8.1 (2.6.8.1-16.30) warty-security; urgency=low + + * Fix typo in previous update. + + -- Ben Collins Thu, 27 Apr 2006 16:12:48 -0400 + +linux-source-2.6.8.1 (2.6.8.1-16.29) warty-security; urgency=low + + * [SECURITY] + - CVE-2006-0038: Fix possible overflow in netfilters do_replace() + - CVE-2006-0557: sys_mbind sanity checking + - CVE-2006-1052: selinux: tracer SID fix + - CVE-2006-1242: increment the IP ID field after receiving unsolicited TCP + SYN-ACK packets + - CVE-2006-1343: information leak in SO_ORIGINAL_DST + - CVE-2006-1066: x86_64 PTRACE_SINGLESTEP oops + - CVE-2006-1368: Gadget RNDIS fix alloc bug. (buffer overflow) + - CVE-2006-1525: ip_route_input panic fix + + -- Ben Collins Thu, 27 Apr 2006 11:34:23 -0400 + +linux-source-2.6.8.1 (2.6.8.1-16.28) warty-security; urgency=low + + Changes by Ben Collins: + + * [SECURITY] + - CVE-direct-io: direct IO write memory leak fix + + - CVE-sigaction: copy_sighand() vs do_sigaction() race + + - CVE-2006-0554: XFS ftruncate() bug could expose stale data + + - CVE-2006-0555: Normal user can panic NFS client with direct I/O + + - CVE-2006-0741: x86_64: Check for bad elf entry address + + - CVE-2006-0742: [IA64] die_if_kernel() can return + + -- Ben Collins Thu, 9 Mar 2006 11:13:46 -0500 + +linux-source-2.6.8.1 (2.6.8.1-16.27) warty-security; urgency=low + + Changed by Ben Collins: + + * [SECURITY] + - CVE-2005-4605: procfs information disclosure + + - CVE-2005-4618: sysctl: don't overflow the user-supplied buffer with '\0' + + - CVE-2005-3356: double decrement of mqueue_mnt->mnt_count in sys_mq_open + + - CVE-2006-0095: dm-crypt: zero key before freeing it + + - CVE-2006-0096: SDLA firmware upgrade should require CAP_SYS_RAWIO (not + just CAP_NET_ADMIN) + + -- Ben Collins Thu, 12 Jan 2006 12:40:09 -0500 + +linux-source-2.6.8.1 (2.6.8.1-16.26) warty-security; urgency=high + + Changes by Fabio M. Di Nitto: + + * [SECURITY]: Fix abuse of loadkeys command: + - Add patch drivers-char-vtioctl_CVE-2005-3257.dpatch. + (CVE-2005-3257) + + * [SECURITY]: Fix ptrace self-attach rule: + - Add patch kernel-ptrace_CVE-2005-3783.dpatch. + (CVE-2005-3783) + + * [SECURITY]: Don't auto-reap traced children: + - Add patch kernel-signal_CVE-2005-3784.dpatch. + (CVE-2005-3784) + + * [SECURITY]: Fix refcnt of struct ip6_flowlabel: + - Add patch net-ipv6-ip6flowlabel_CVE-2005-3806.dpatch. + (CVE-2005-3806) + + * [SECURITY]: Fix DST leak in icmp_push_reply(): + - Add patch net-ipv4-icmp_CVE-2005-3848.dpatch. + + * [SECURITY]: Fix time_out_leases DoS: + - Add patch fs-locks_CVE-2005-3857.dpatch. + (CVE-2005-3857) + + * [SECURITY]: Fix ip6_input_finish() memory leak: + - Add patch net-ipv6-ip6input_CVE-2005-3858.dpatch. + (CVE-2005-3858) + + -- Fabio M. Di Nitto Tue, 20 Dec 2005 10:08:30 +0100 + +linux-source-2.6.8.1 (2.6.8.1-16.25) warty-security; urgency=high + + Changes by Fabio M. Di Nitto: + + * Update CAN information for 2.6.8.1-16.24 release: + - Rename audit-syscall_mem-leak-CAN-2005-XXXX.dpatch to + audit-syscall_mem-leak-CAN-2005-3181.dpatch. + + * [SECURITY]: Fix URB early termination OOPS: + - Add patch drivers-usb-devio_CVE-2005-3055.dpatch. + (CVE-2005-3055) + + * [SECURITY]: Fix orinoco information leakage due to incorrect padding: + - Add patch drivers-net-wireless-orinoco_CVE-2005-3180.dpatch + (CVE-2005-3180) + + * [SECURITY]: Fix resource leak in handling of POSIX timers in the + exec() function: + - Add patch fs-exec_CVE-2005-3271.dpatch. + (CVE-2005-3271) + + * [SECURITY]: Fix weakness in the network bridge driver: + - Add patch net-bridge_CVE-2005-3272.dpatch. + (CVE-2005-3272) + + * [SECURITY]: Fix buffer overflow in the rose_rt_ioctl() function: + - Add patch net-rose-roseroute_CVE-2005-3273.dpatch. + (CVE-2005-3273) + + * [SECURITY]: Fix race conditions on ip_vs_conn_tab list modification: + - Add patch net-ipv4-ipvs-ip_vs_conn_CVE-2005-3274.dpatch. + (CVE-2005-3274) + + * [SECURITY]: Fix infinite loop in udp_v6_get_port(): + - Add patch net-ipv6-udp_CVE-2005-2973.dpatch. + (CVE-2005-2973) + + * [SECURITY]: Fix logic error in the network address translation: + - Add patch net-ipv4-netfilter-ip-nat_CVE-2005-3275.dpatch. + (CVE-2005-3275) + + * [SECURITY]: Fix sys_get_thread_area (small) information leak: + - Add patch arch-i386-kernel-process_CVE-2005-3276.dpatch. + (CVE-2005-3276) + + * [SECURITY]: Fix sysctl unregistration oops: + - Add patch kernel-sysctl_CVE-2005-2709.dpatch. + (CVE-2005-2709) + + * Bump the abi. + + -- Fabio M. Di Nitto Tue, 15 Nov 2005 10:09:56 +0100 + +linux-source-2.6.8.1 (2.6.8.1-16.24) warty-security; urgency=high + + Changes by Fabio M. Di Nitto: + + * [SECURITY]: Fix race between core dumping and exec with shared mm: + - Add patch stolen-from-head_CAN-2005-3106.dpatch. + (CAN-2005-3106) + + * [SECURITY]: Fix coredump_wait deadlock with ptracer & tracee on shared mm: + - Add patch stolen-from-head_CAN-2005-3107.dpatch. + (CAN-2005-3107) + + * [SECURITY]: Fix look up struct page pointer of physical address in + iounmap (amd64 only): + - Add patch stolen-from-head_CAN-2005-3108.dpatch. + NOTE: the patch also include a change_page_attr_addr backport from 2.6.12 + since the function did not exist in 2.6.10. + (CAN-2005-3108) + + * [SECURITY]: Fix HFS not to leak s_fs_info and an oops: + - Add patch stolen-from-head_CAN-2005-3109.dpatch. + (CAN-2005-3109) + + * [SECURITY]: Fix ebtables netfilter race on SMP: + - Add patch stolen-from-head_CAN-2005-3110.dpatch. + (CAN-2005-3110) + + * [SECURITY]: Fix names_cache memory leak with CONFIG_AUDITSYSCALL: + - Add patch audit-syscall_mem-leak-CAN-2005-3181.dpatch. + (CAN-2005-3181) + + Changes by Herbert Xu: + + * sys_set_mempolicy() doesnt check if mode < 0 in mm/mempolicy.c + (Eric Dumazet, CAN-2005-3053). + + -- Fabio M. Di Nitto Sun, 09 Oct 2005 11:50:12 +0200 + +linux-source-2.6.8.1 (2.6.8.1-16.23) warty-security; urgency=high + + * x86_64: Rewrite exception stack backtracing in arch/x86_64/kernel/traps.c + (Andi Kleen, CAN-2005-1767). + * Lost fput in 32bit ioctl on x86-64 in arch/x86_64/ia32/ia32_ioctl.c + (Kirill Korotaev, CAN-2005-3044). + * Lost sockfd_put() in routing_ioctl() in fs/compat_ioctl.c + (Kirill Korotaev, CAN-2005-3044). + + -- Herbert Xu Fri, 23 Sep 2005 22:42:00 +1000 + +linux-source-2.6.8.1 (2.6.8.1-16.22) warty-security; urgency=high + + * sg.c: fix a memory leak in devices seq_file implementation in + drivers/scsi/sg.c (Jan Blunck, CAN-2005-2800). + * Compat sendmsg stack overflow (Al Viro, CAN-2005-2490): + . include/linux/compat.h + . net/compat.c + . net/socket.c + * Long-standing xattr sharing bug (Andreas Gruenbacher, CAN-2005-2801): + . fs/ext2/xattr.c + . fs/ext3/xattr.c + * Fixed type of last_pkts array in ipt_recent in + net/ipv4/netfilter/ipt_recent.c (David S. Miller, CAN-2005-2872, + CAN-2005-2873). + + -- Herbert Xu Thu, 8 Sep 2005 23:02:10 +1000 + +linux-source-2.6.8.1 (2.6.8.1-16.21) warty-security; urgency=high + + * [XFRM]: Fix possible overflow of sock->sk_policy in net/xfrm/xfrm_user.c + (Herbert Xu, CAN-2005-2456). + * [IPSEC]: Restrict socket policy loading to CAP_NET_ADMIN (Herbert Xu, + CAN-2005-2555): + . net/ipv4/ip_sockglue.c + . net/ipv6/ipv6_sockglue.c + * zlib updates and zisofs input buffer size check (Tim Yamin, CAN-2005-2457, + CAN-2005-2458, CAN-2005-2459): + . arch/ppc64/boot/zlib.c + . fs/isofs/compress.c + . include/linux/zlib.h + . lib/inflate.c + . lib/zlib_inflate/inftrees.c + * [BRIDGE]: Fixed vlan MII ioctl device argument in net/8021q/vlan_dev.c + (Stephen Hemminger, CAN-2005-2548). + + -- Herbert Xu Wed, 17 Aug 2005 22:51:55 +1000 + +linux-source-2.6.8.1 (2.6.8.1-16.20) warty-security; urgency=high + + * x86_64: check if ptrace RIP is canonical in arch/x86_64/kernel/ptrace.c + (Andi Kleen, CAN-2005-1762). + * x86_64: Compat mode program can hang kernel in arch/x86_64/mm/fault.c + (unknown, CAN-2005-1765). + + -- Herbert Xu Tue, 14 Jun 2005 22:45:06 +1000 + +linux-source-2.6.8.1 (2.6.8.1-16.19) warty-security; urgency=high + + * Fix get_unmapped_area sanity tests (Linus Torvalds, CAN-2005-1265): + . include/linux/err.h + . mm/mmap.c + * Fix canonical checking for segment registers in ptrace in + arch/x86_64/kernel/ptrace.c (Andi Kleen, CAN-2005-0756). + * Don't allow accesses below register frame in ptrace in + arch/x86_64/kernel/ptrace.c (Andi Kleen, CAN-2005-1763). + + -- Herbert Xu Wed, 1 Jun 2005 20:53:18 +1000 + +linux-source-2.6.8.1 (2.6.8.1-16.18) warty-security; urgency=high + + * Added missing 00list files. + * Require 00list-$(revision) to exist in clean target. + + -- Herbert Xu Fri, 20 May 2005 21:14:15 +1000 + +linux-source-2.6.8.1 (2.6.8.1-16.17) warty-security; urgency=high + + * Fixed dpatch header of patches from 2.6.8.1-16.15. + + -- Herbert Xu Fri, 20 May 2005 19:46:20 +1000 + +linux-source-2.6.8.1 (2.6.8.1-16.16) warty-security; urgency=high + + * Fix root hole in raw device (Stephen Tweedie, CAN-2005-1264): + . drivers/block/ioctl.c + . drivers/char/raw.c + * Disable Hyper Threading by default (Herbert Xu, CAN-2005-0109): + . Documentation/kernel-parameters.txt + . arch/i386/Kconfig + . arch/i386/kernel/cpu/intel.c + . arch/i386/kernel/setup.c + . arch/x86_64/Kconfig + + -- Herbert Xu Thu, 19 May 2005 20:37:47 +1000 + +linux-source-2.6.8.1 (2.6.8.1-16.15) warty-security; urgency=low + + * Fixed local crash in fib_seq_start (CAN-2005-1041) + * Fix integer overflow in the ELF loader's core dump function, leading to a + possible privilege elevation (CAN-2005-1263) + * Ensure that the it87 and via686a hardware monitoring drivers create their + sysfs alarms files as read-only (CAN-2005-1369) + + -- Thom May Thu, 12 May 2005 17:09:59 +0100 + +linux-source-2.6.8.1 (2.6.8.1-16.14) warty-security; urgency=high + + * Fix possible futex mmap_sem deadlock (Olof Johansson, CAN-2005-0937): + . kernel/futex.c + . mm/mempolicy.c + * Fixed signedness problem in sysfs in fs/sysfs/file.c (Alexander Nyberg, + CAN-2005-0867). + * Fixed jbd race that releases in-use journal_heads (Stephen Tweedie): + . fs/jbd/commit.c + . fs/jbd/journal.c + . fs/jbd/transaction.c + . include/linux/jbd.h + * Fix journal_unmap_buffer race in fs/jbd/transaction.c (Stephen Tweedie). + + -- Herbert Xu Wed, 6 Apr 2005 19:52:37 +1000 + +linux-source-2.6.8.1 (2.6.8.1-16.13) warty-security; urgency=high + + * Zero block in ext2_make_empty in fs/ext2/dir.c (Mathieu Lafon, + CAN-2005-0400). + * Fixes to ISO9660 range checking flaws (Linus Torvalds, CAN-2005-0815): + . fs/isofs/inode.c + . fs/isofs/rock.c + * Check i_size in shmem_nopage in mm/shmem.c (Hugh Dickins, CAN-2005-0977). + * Only allow root to set the N_MOUSE line discipline in + drivers/input/serio/serport.c (Vojtech Pavlik, CAN-2005-0839). + * Fixed kfree argument in load_elf_library in fs/binfmt_elf.c (Herbert Xu, + CAN-2005-0749). + * Fixed bluetooth protocol check in net/bluetooth/af_bluetooth.c + (Marcel Holtmann, CAN-2005-0750). + + -- Herbert Xu Thu, 31 Mar 2005 18:17:11 +1000 + +linux-source-2.6.8.1 (2.6.8.1-16.12) warty-security; urgency=high + + * Fix sign checks in copy_from_read_buf() in drivers/char/n_tty.c + (Georgi Guninski, CAN-2005-0530). + * Fix signed compare in proc_file_read() in fs/proc/generic + (Georgi Guninski, CAN-2005-0529). + * Use proper 64-bit clean types in reiserfs in fs/reiserfs/file.c + (Georgi Guninski, CAN-2005-0532). + * Fix ATM copy-to-user usage (Georgi Guninski, CAN-2005-0531): + . net/atm/addr.c + . net/atm/addr.h + * Fixed loop in ppp_async LCP parsing in drivers/net/ppp_async.c + (Ben Martel & Stephen Blackheath, CAN-2005-0384). + * Reset ip_summed field on SKB sub-frags (Herbert Xu, CAN-2005-0209): + . net/ipv4/ip_output.c + . net/ipv6/ip6_output.c + * Fix ip_copy_metadata dst leaks (Patrick McHardy & YOSHIFUJI Hideaki, + CAN-2005-0210): + . net/ipv4/ip_output.c + . net/ipv6/ip6_output.c + * Fix race condition in radeon drm driver (Eric Anholt, CAN-2005-0767): + . drivers/char/drm/drm_os_linux.h + . drivers/char/drm/radeon_drv.h + . drivers/char/drm/radeon_state.c + * Initialise f_maxcount in open_private_file in fs/file_table.c (Herbert Xu). + * Return proper error on overflow condition in epoll in fs/eventpoll.c + (Georgi Guninski, CAN-2005-0736). + + -- Herbert Xu Mon, 14 Mar 2005 18:33:55 +1100 + +linux-source-2.6.8.1 (2.6.8.1-16.11) warty-security; urgency=high + + * Fixed CMSG_COMPAT_OK length check in net/compat.c (Olaf Kirch). + * Fixed shmctl SHM_LOCK permissions in ipc/shm.c (Hugh Dickins, + CAN-2005-0176). + * Fix overflow of nls_ascii in fs/nls/nls_ascii.c (OGAWA Hirofumi, + CAN-2005-0177). + * Protect against tty changes using tty_sem (Alan Cox, CAN-2005-0178): + . drivers/char/tty_io.c + . kernel/exit.c + . kernel/sys.c + * Keep fragment queues private to each user (Patrick McHardy, CAN-2005-0449): + . include/linux/netfilter_ipv4/ip_conntrack.h + . include/net/ip.h + . net/ipv4/ip_fragment.c + . net/ipv4/ip_input.c + . net/ipv4/ipvs/ip_vs_core.c + . net/ipv4/netfilter/ip_conntrack_core.c + . net/ipv4/netfilter/ip_conntrack_standalone.c + . net/ipv4/netfilter/ip_fw_compat.c + . net/ipv4/netfilter/ip_nat_standalone.c + * Increment ABI due to fragment patch. + * Add f_maxcount for fs-specific per-file maximum IO size (Linus Torvalds): + . arch/mips/kernel/linux32.c + . fs/compat.c + . fs/file_table.c + . fs/locks.c + . fs/read_write.c + . include/linux/fs.h + + -- Herbert Xu Thu, 10 Feb 2005 22:13:36 +1100 + +linux-source-2.6.8.1 (2.6.8.1-16.10) warty-security; urgency=high + + * Added missing expand_stack nitpick in mm/mmap.c. + + -- Herbert Xu Fri, 14 Jan 2005 21:07:06 +1100 + +linux-source-2.6.8.1 (2.6.8.1-16.9) warty-security; urgency=high + + * Check user-supplied len value in drivers/char/moxa.c (Andres Salomon, + CAN-2005-0504). + * Check user-supplied in_size in fs/coda/upcall.c (me). + * Fix exploitable hole in sg_scsi_ioctl (James Bottomley, CAN-2005-0180). + * Fixed expand_stack hole in mm/mmap.c (Linus Torvalds, CAN-2005-0179). + * Updated do_brk fix (Marcelo Tosatti, CAN-2004-1235, CAN-2005-0001): + . arch/mips/kernel/irixelf.c + . arch/x86_64/ia32/ia32_aout.c + . fs/binfmt_aout.c + . fs/binfmt_elf.c + . include/linux/mm.h + . mm/mmap.c + . mm/nommu.c + * Check user-supplied length before copy_from_user in drivers/char/random.c + (Andres Salomon). + * NFS client O_DIRECT error case fix in fs/nfs/direct.c (Bill Rugolsky, + CAN-2005-0207). + * Updated smbfs security fix (Urban Widmark): + . fs/smbfs/proc.c + . fs/smbfs/request.c + + -- Herbert Xu Thu, 13 Jan 2005 22:28:55 +1100 + +linux-source-2.6.8.1 (2.6.8.1-16.8) warty-security; urgency=high + + * Added missing 00list files. + + -- Herbert Xu Sun, 9 Jan 2005 05:30:17 +1100 + +linux-source-2.6.8.1 (2.6.8.1-16.7) warty-security; urgency=high + + * Rebuilt from clean source tar ball. + + -- Herbert Xu Sat, 8 Jan 2005 12:45:42 +1100 + +linux-source-2.6.8.1 (2.6.8.1-16.6) warty-security; urgency=high + + * Fix memory leak in net/ipv4/ip_conntrack_ftp.c (Patrick McHardy). + * Track capabilities in default dummy security module code in + security/dummy.c (Chris Wright, CAN-2004-1337). + * Fixed do_brk races (Marcelo Tosatti, CAN-2004-1235): + . arch/mips/kernel/irixelf.c + . arch/x86_64/ia32/ia32_aout.c + . fs/binfmt_aout.c + . fs/binfmt_elf.c + . include/linux/mm.h + . mm/mmap.c + . mm/nommu.c + + -- Herbert Xu Fri, 7 Jan 2005 19:59:03 +1100 + +linux-source-2.6.8.1 (2.6.8.1-16.5) warty-security; urgency=high + + * Make sure VC resizing fits in s16 (CAN-2004-1333). + . drivers/char/vt.c + + * Do not leak IP options. + . net/ipv4/ip_options.c + + * Backport x86_64 quota fix. + . arch/x86_64/ia32/sys_ia32.c + + -- Fabio M. Di Nitto Wed, 22 Dec 2004 12:30:16 +0100 + +linux-source-2.6.8.1 (2.6.8.1-16.4) warty-security; urgency=high + + * ia64/x86_64/s390 overlapping vma fix (Zou Nan hai, CAN-2005-0003): + . arch/x86_64/ia32/ia32_binfmt.c + . fs/exec.c + . include/linux/mm.h + . mm/mmap.c + + -- Herbert Xu Thu, 16 Dec 2004 21:48:59 +1100 + +linux-source-2.6.8.1 (2.6.8.1-16.3) warty-security; urgency=high + + * Fixed IGMP bugs (Chris Wright, CAN-2004-1137): + . net/ipv4/igmp.c + . net/ipv6/mcast.c + + -- Herbert Xu Tue, 14 Dec 2004 22:23:42 +1100 + +linux-source-2.6.8.1 (2.6.8.1-16.2) warty-security; urgency=high + + * Serialize dgram read using semaphore just like stream in net/unix/af_unix.c + (David S. Miller, CAN-2004-1068). + * Check lock ownership (unknown, CAN-2004-1056): + . drivers/char/drm/i810_dma.c + . drivers/char/drm/i830_dma.c + . drivers/char/drm/i830_irq.c + * Fix proc_pid_cmdline race in fs/proc/base.c (Roger Luethi, CAN-2004-1058). + * Fix SEQPACKET crash with AF_UNIX in net/unix/af_unix.c (James Morris, + CAN-2004-1069). + * Fix CMSG validation checks wrt signedness (Herbert Xu, David Miller, + CAN-CAN-2004-1016): + . include/linux/socket.h + . net/compat.c + . net/core/scm.c + . net/ipv4/ip_sockglue.c + . net/ipv6/datagram.c + . net/sctp/socket.c + * Fixed buffer overrun in sys32_ni_syscall on x86_64/ia32 in + arch/x86_64/ia32/sys_ia32.c (jeremy@goop.org, CAN-2004-1151). + * Fixed tty locking issues (Alan Cox, CAN-2004-0814): + . Documentation/tty.txt + . drivers/bluetooth/hci_ldisc.c + . drivers/char/amiserial.c + . drivers/char/cyclades.c + . drivers/char/epca.c + . drivers/char/esp.c + . drivers/char/generic_serial.c + . drivers/char/hvc_console.c + . drivers/char/hvcs.c + . drivers/char/isicom.c + . drivers/char/moxa.c + . drivers/char/mxser.c + . drivers/char/n_tty.c + . drivers/char/pcmcia/synclink_cs.c + . drivers/char/pcxx.c + . drivers/char/pty.c + . drivers/char/riscom8.c + . drivers/char/rocket.c + . drivers/char/selection.c + . drivers/char/ser_a2232.c + . drivers/char/serial167.c + . drivers/char/serial_tx3912.c + . drivers/char/specialix.c + . drivers/char/stallion.c + . drivers/char/sx.c + . drivers/char/synclink.c + . drivers/char/synclinkmp.c + . drivers/char/tty_io.c + . drivers/char/tty_ioctl.c + . drivers/char/viocons.c + . drivers/char/vme_scc.c + . drivers/char/vt_ioctl.c + . drivers/isdn/capi/capi.c + . drivers/isdn/i4l/isdn_tty.c + . drivers/macintosh/macserial.c + . drivers/net/hamradio/mkiss.c + . drivers/net/irda/irtty-sir.c + . drivers/net/ppp_async.c + . drivers/net/ppp_synctty.c + . drivers/net/slip.c + . drivers/net/wan/pc300_tty.c + . drivers/net/wan/sdla_chdlc.c + . drivers/net/wireless/strip.c + . drivers/s390/char/con3215.c + . drivers/s390/char/sclp_tty.c + . drivers/s390/char/sclp_vt220.c + . drivers/s390/net/ctctty.c + . drivers/sbus/char/aurora.c + . drivers/serial/68328serial.c + . drivers/serial/68360serial.c + . drivers/serial/mcfserial.c + . drivers/serial/serial_core.c + . drivers/tc/zs.c + . drivers/usb/class/bluetty.c + . drivers/usb/class/cdc-acm.c + . drivers/usb/serial/digi_acceleport.c + . drivers/usb/serial/empeg.c + . drivers/usb/serial/io_edgeport.c + . drivers/usb/serial/io_ti.c + . drivers/usb/serial/ir-usb.c + . drivers/usb/serial/keyspan_pda.c + . drivers/usb/serial/mct_u232.c + . drivers/usb/serial/usb-serial.c + . drivers/usb/serial/whiteheat.c + . fs/proc/proc_tty.c + . include/linux/tty.h + . include/linux/tty_ldisc.h + . drivers/net/ppp_async.c + . drivers/net/ppp_synctty.c + * Increment ABI due to tty locking patch. + + -- Herbert Xu Sat, 11 Dec 2004 13:23:24 +1100 + +linux-source-2.6.8.1 (2.6.8.1-16.1) warty-security; urgency=high + + * Fixed security leak/hole, CAN-2004-0883 CAN-2004-0949 (Urban Widmark): + . fs/smbfs/proc.c + . fs/smbfs/request.c + * Mark region special in remap_pfn_range in mm/memory.c (Linus Torvalds). + * Reverted 486 emulation patch: + . arch/i386/Kconfig + . arch/i386/kernel/Makefile + . arch/i386/kernel/emu.c + . arch/i386/kernel/entry.S + * Fixed bugs in ELF loader in fs/binfmt_elf.c (Paul Starzetz, + CAN-2004-1070, CAN-2004-1071, CAN-2004-1072, CAN-2004-1073). + * Check for overlapping vma's in setup_arg_pages (Chris Wright, + CAN-2004-1074): + . fs/binfmt_aout.c. + . fs/exec.c. + + -- Herbert Xu Thu, 18 Nov 2004 20:26:49 +1100 + +linux-source-2.6.8.1 (2.6.8.1-16) warty; urgency=low + + * Enabled MAGIC_SYSRQ on i386. + * Fixed name of acpi_ps_parse_aml patch. + + -- Herbert Xu Tue, 12 Oct 2004 21:07:07 +1000 + +linux-source-2.6.8.1 (2.6.8.1-15) warty; urgency=low + + * Fix method_desc crash in acpi_ps_parse_aml in drivers/acpi/parser/psparse.c + (me). + + -- Herbert Xu Sun, 10 Oct 2004 20:21:43 +1000 + +linux-source-2.6.8.1 (2.6.8.1-14) warty; urgency=low + + * Skip SATA reset in drivers/scsi/sata_nv.c (unknown). + * Properly recognise PowerMac7,3 in arch/ppc/platforms/pmac_feature.c + (Andreas Schwab). + + -- Herbert Xu Sat, 9 Oct 2004 22:13:41 +1000 + +linux-source-2.6.8.1 (2.6.8.1-13) warty; urgency=low + + * Load firmware from standard locations (me): + . drivers/net/wireless/acx/acx100_helper.c + . drivers/net/wireless/acx/acx100_usb.c + + -- Herbert Xu Thu, 7 Oct 2004 22:28:30 +1000 + +linux-source-2.6.8.1 (2.6.8.1-12) warty; urgency=low + + * Disable acpi_early_init when acpi=off is set in drivers/acpi/bus.c (me). + + -- Herbert Xu Tue, 5 Oct 2004 21:50:16 +1000 + +linux-source-2.6.8.1 (2.6.8.1-11) warty; urgency=low + + * Added PCI table for 3w-xxxx in drivers/scsi/3w-xxxx.c (me). + * Reverted via-velocity update: + . include/linux/pci_ids.h + . drivers/net/via-velocity.c + . drivers/net/via-velocity.h + * Fixed notifier oopses in via-velocity (Francois Romieu): + . drivers/net/via-velocity.c + . drivers/net/via-velocity.h + * Updated ipw2200 driver to 0.11: + . Documentation/networking/README.ipw2100 + . drivers/net/wireless/Kconfig + . drivers/net/wireless/ieee80211/* + . drivers/net/wireless/ipw2200/* + + -- Herbert Xu Mon, 4 Oct 2004 11:22:33 +1000 + +linux-source-2.6.8.1 (2.6.8.1-10) warty; urgency=low + + * Disable local APIC in acpi_power_off in drivers/acpi/sleep/poweroff.c + (unknown). + * Sleep interruptibly in therm_adt746x thread in + drivers/macintosh/therm_adt746x.c (me). + * Removed meta packages. + * Updated via-velocity from bk (Linux): + . include/linux/pci_ids.h + . drivers/net/via-velocity.c + . drivers/net/via-velocity.h + * Help vendors count to 1 in usb-storage in drivers/usb/storage/transport.c + (Alan Stern). + * Enabled IDEDMA_ONLYDISK. + * Updated ipw2200 driver to 0.10. + + -- Herbert Xu Thu, 30 Sep 2004 21:19:45 +1000 + +linux-source-2.6.8.1 (2.6.8.1-9) warty; urgency=low + + * Disabled CONFIG_PCI_MSI. + * Updated ipw2200 driver to 0.8. + + -- Herbert Xu Mon, 27 Sep 2004 20:07:28 +1000 + +linux-source-2.6.8.1 (2.6.8.1-8) warty; urgency=low + + * Disabled NDIS wrapper on amd64/powerpc. + * Added eagle-usb driver (Frederick Ros): + . drivers/usb/misc/Kconfig + . drivers/usb/misc/Makefile + . drivers/usb/misc/eagle-usb/* + + -- Herbert Xu Sun, 26 Sep 2004 20:25:11 +1000 + +linux-source-2.6.8.1 (2.6.8.1-7) warty; urgency=low + + * Enabled SCSI_CONSTANTS/SCSI_MULTI_LUN on powerpc. + * Added adm8211 driver (Michael Wu): + . drivers/net/wireless/Kconfig + . drivers/net/wireless/Makefile + . drivers/net/wireless/adm8211/* + * Added prism54 firmware 1.0.4.3. + * Moved wireless firmware to /lib. + * Added ACPI patch 20040826 (Intel). + * Added NDIS wrapper (Pontus Fuchs): + . drivers/net/Kconfig + . drivers/net/Makefile + . drivers/net/ndiswrapper/* + * Increment ABI due to ACPI patch. + * Unregister properly if no devices are found in + drivers/scsi/aic7xxx/aic79xx_osm.c (me). + * Updated sk98lin driver in drivers/net/sk98lin/* (Marvell). + * Fixed TCP header length check in net/ipv6/netfilter/ip6t_LOG.c + (Olaf Kirch). + * Updated build-dependency on kernel-package. + + -- Herbert Xu Fri, 24 Sep 2004 23:50:59 +1000 + +linux-source-2.6.8.1 (2.6.8.1-6) warty; urgency=low + + * Updated sk98lin PCI table based on skge_probe() in + drivers/net/sk98lin/skge.c (Herbert Xu). + + -- Herbert Xu Sat, 18 Sep 2004 13:28:04 +1000 + +linux-source-2.6.8.1 (2.6.8.1-5) warty; urgency=low + + * Revert changes which somehow got applied directly in the diff, which were + then duplicated by the dpatch, causing build failures + + -- Matt Zimmerman Mon, 13 Sep 2004 23:03:43 -0700 + +linux-source-2.6.8.1 (2.6.8.1-4) warty; urgency=low + + * Add "unpatch" target to debian/rules (for dpatch-edit-patch) + * debian/patches/skge-hotplug.dpatch: Add PCI table for hotplug + so that the sk98lin driver is automatically loaded (Warty #1141) + + -- Matt Zimmerman Mon, 13 Sep 2004 14:44:58 -0700 + +linux-source-2.6.8.1 (2.6.8.1-3) warty; urgency=low + + * Set subarch to pmac on powerpc. + * Added atmel firmware 1.1. + * Updated ipw2200 driver to 0.7. + * Commented out debian purge rule in scripts/package/Makefile. + + -- Herbert Xu Thu, 9 Sep 2004 19:21:35 +1000 + +linux-source-2.6.8.1 (2.6.8.1-2) unstable; urgency=low + + * Fixed low-level ISDN CAPI drivers skb free + (Carsten Paeth, Armin Schindler): + . drivers/isdn/capi/capidrv.c + . drivers/isdn/hardware/avm/b1.c + . drivers/isdn/hardware/avm/b1dma.c + . drivers/isdn/hardware/avm/c4.c + . drivers/isdn/hardware/avm/t1isa.c + . drivers/isdn/hardware/eicon/capifunc.c + * Merged powerpc patches from Debian: + . drivers/serial/8250.c + . drivers/ide/pci/via82cxxx.c + * Added build-dependency on sharutils for uudecode. + * Added misdn driver (Karsten Keil): + . drivers/isdn/hardware/Kconfig + . drivers/isdn/hardware/Makefile + . drivers/isdn/hardware/misdn/* + * Added TI ACX100 support (ACX100 Open Source Project): + . drivers/net/wireless/Kconfig + . drivers/net/wireless/Makefile + . drivers/net/wireless/acx/* + * Kill floating-point operations in acx100 in drivers/net/wireless/acx/idma.c + (me). + * Corrected typo in description of SMP packages. + * Fixed ipw2100 build problem on powerpc in + drivers/net/wireless/ipw2100/ipw2100_fw.c (me). + * Added PowerPC packages. + * Added AMD64 packages. + * Fixed acx100 build problem on amd64 in + drivers/net/wireless/acx/wlan_compat.h (me). + * Updated kernel-package dependency for ubuntu. + + -- Herbert Xu Sat, 4 Sep 2004 20:06:07 +1000 + +linux-source-2.6.8.1 (2.6.8.1-1) unstable; urgency=low + + * Initial release based on Debian 2.6.8-2. + * Fixed bio memory leak in fs/bio.c (bk). + * Reverted bd_claim check on partition/device in fs/block_dev.c (unknown). + * Added mppe support (unknown): + . drivers/net/Kconfig + . drivers/net/Makefile + . drivers/net/arcfour.c + . drivers/net/arcfour.h + . drivers/net/ppp_generic.c + . drivers/net/ppp_mppe_compress.c + . drivers/net/sha1.c + . drivers/net/sha1.h + . include/linux/ppp-comp.h + * Allow mlock as user (Chris Wright): + . fs/hugetlbfs/inode.c + . include/asm-alpha/resource.h + . include/asm-arm/resource.h + . include/asm-arm26/resource.h + . include/asm-cris/resource.h + . include/asm-h8300/resource.h + . include/asm-i386/resource.h + . include/asm-ia64/resource.h + . include/asm-m68k/resource.h + . include/asm-parisc/resource.h + . include/asm-ppc/resource.h + . include/asm-ppc64/resource.h + . include/asm-s390/resource.h + . include/asm-sh/resource.h + . include/asm-sparc/resource.h + . include/asm-sparc64/resource.h + . include/asm-v850/resource.h + . include/asm-x86_64/resource.h + . include/linux/mm.h + . include/linux/sched.h + . include/linux/shm.h + . ipc/shm.c + . kernel/user.c + . mm/mlock.c + . mm/mmap.c + . mm/mremap.c + . mm/shmem.c + * Automatically compute tcp_default_win_scale (Stephen Hemminger): + . include/net/tcp.h + . net/ipv4/sysctl_net_ipv4.c + . net/ipv4/tcp.c + . net/ipv4/tcp_output.c + * Added generic IEEE 80211 layer (Intel): + . drivers/net/wireless/Kconfig + . drivers/net/wireless/Makefile + . drivers/net/wireless/ieee80211/* + * Added ipw2100 driver (Intel): + . Documentation/networking/README.ipw2100 + . drivers/net/wireless/Kconfig + . drivers/net/wireless/Makefile + . drivers/net/wireless/ipw2100/* + * Added ipw2200 driver (Intel): + . drivers/net/wireless/Kconfig + . drivers/net/wireless/Makefile + . drivers/net/wireless/ipw2200/* + * Added prism2_usb driver (AbsoluteValue Systems): + . drivers/net/wireless/Kconfig + . drivers/net/wireless/Makefile + . drivers/net/wireless/prism2/* + . drivers/net/wireless/wlan-ng/* + . include/wlan/* + . include/prism2/* + * Cacheline-align qdisc data in qdisc_create() in net/sched/sch_api.c + (Patrick McHardy). + * Fix class leak in CBQ scheduler in net/sched/sch_cbq.c (Patrick McHardy). + * Updated kernel-patch-debian description (Debian 2.6.8-3). + * Add a comment about the Adaptec firmware rebuild situation to README.Debian + (Debian 2.6.8-3). + * Suggest libqt3-dev for xconfig (Debian 2.6.8-3). + * Added patches from Debian 2.6.8-4: + . Added patch by Alex Clausen to stop spurious mouse button events + on older ADB using pmac notebooks (Sven Luther). + . Added g4-errata followup patch that clears the BTIC bit, instead of + just not setting it (Sven Luther). + . Update list of safe SCSI commands for SG_IO to match 2.6.9-rc1 + (Christoph Hellwig). + . Added two SCSI commands, namely VERIFY_16 and GPCMD_SEND_CUE_SHEET, + that were mentioned in the list from 2.6.9-rc1 but missing from the + corresponding header files (Jens Schmalzing). + . Replace the drivers-scsi-sym53c8xx_revert workaround with + drivers-scsi-sym_2-dv-hang, which is a proper fix for the hang + (dann frazier). + . Update scsi blacklist for USB multi card readers (Christoph Hellwig). + . Claim we're Windows (TM) to ACPI to work around broken BIOSes + (Christoph Hellwig). + . Enter ACPI mode earlier (Christoph Hellwig). + . Add small ACPI fix that makes speedstep work on some Centrino Laptops + (Christoph Hellwig). + . Fix oldworld pmacs that don't have an OF stdout. + . Update CCISS driver (Christoph Hellwig). + . Add minix block accounting fix (Christoph Hellwig). + . Fix nfsd to not errornously return ESTALE on failed permission check + (Christoph Hellwig). + . Fix SHM segment count limit off by one (Christoph Hellwig). + . Add some Sparc64 backports to make Josh happy (Christoph Hellwig). + + -- Herbert Xu Sat, 21 Aug 2004 15:04:28 +1000 + +kernel-source-2.6.8 (2.6.8-2) unstable; urgency=high + + * Add updated fix for generic UP kernel builds on IA64 (dann frazier). + * Added g4 l2 flush and MSR patch from Jacob Pan (Sven Luther). + * Added marvell gigabit ethernet driver errata patch from Nicolas Det + (Sven Luther). + * Added UP build fixes for sn_console & cyclone on ia64 (dann frazier). + + -- Sven Luther Tue, 17 Aug 2004 15:34:59 +0200 + +kernel-source-2.6.8 (2.6.8-1) unstable; urgency=high + + * New upstream release. + + * Nuke tg3.c properly in prune-non-free; rely on patch to supply driver + (Andres Salomon). + + * The following patches have been merged upstream (Andres Salomon): + . acpi-typo + . chown-gid-check + . chown-procfs + . dont-dereference-netdev.name-before-register_netdev + (partially applied; this is a broken patch) + . drivers-atkbd-quiten + . drivers-dpt_i2o-fixup + . drivers-isdn-io_funcs-fixup + . drivers-net-irda-dma_api + . drivers-net-via_rhine-avoid_bitfield + . drivers-sb-pnp_unregister + . drivers-scsi-advansys-dma_api + . drivers-scsi-sd-NO_SENSE + . drivers-usb-net-pegasus-startstop_queue + . envp + . fs-isofs-acorn + . fs-isofs-dont-check-period + . fs-jfs-compile + . include-linux-mca.h-fixups + . netfilter-signedcharbug + . netlink-macro-fixups + . powerpc-g4-errata + . xfs-update + + * The following patches have been modified (Andres Salomon): + . drivers-input-hiddev-HIDIOCGUCODE + (sparse fixes; s/(void *) arg/user_arg/g) + . remove-references-to-removed-drivers + (upstream now considers SMCTR a broken and legacy driver) + . drivers-net-tg3-readd + (forward port firmware changes to new tg3; from version 3.3 + of driver to version 3.8) + + * Stop the kernel distclean from nuking the debian directory by + having the clean rule check for debian/official (Andres Salomon). + + * Fix typo in alpha-termbits patch naming (Christoph Hellwig). + + * Drop two unneeded patches (Christoph Hellwig): + . fs-cramfs-constify + . include-thread_info-ifdefs + + * Remove -2 postfixes from patches, this is a new upstream release + (Christoph Hellwig). + + * Add NFS OOPS fix (Christoph Hellwig). + + * Add SG_IO WRITE_BUFFER capability check (Christoph Hellwig). + + * Fix IA64 generic kernel compile on UP (Christoph Hellwig). + + * Add pty leak fix from Al Viro (Christoph Hellwig). + + * Add patch from Gustavo Barbier to support IBM RS/6000 7043-240 and -E30 + (Christoph Hellwig). + + * Add 32bit ioctl translation support to XFS (closes: Bug#257265) + (Christoph Hellwig). + + * Revert sym53c8xx driver (dann frazier). + + -- Andres Salomon Sat, 14 Aug 2004 02:40:50 -0400 + +kernel-source-2.6.7 (2.6.7-4) unstable; urgency=high + + * Migrated pegasos patch from the powerpc package, as it will be accepted + upstream (Sven Luther). + + * Added a errata fix for some recent G4 processors (Sven Luther). + + * Fixed the Powerpc/Pegasos marvell discovery II builtin gigabit ethernet + driver to use the MAC address set by the firmware, instead of reading the + value from the prom in a way specific to the mips board (Sven Luther). + + -- Jens Schmalzing Thu, 5 Aug 2004 18:32:00 +0200 + +kernel-source-2.6.7 (2.6.7-3) unstable; urgency=low + + * Upgraded the fs-asfs patch to 1.0beta7 (Jens Schmalzing). + + * Updated README.NMU to explain the new build process based on split + patches and dpatch (Jens Schmalzing). + + * Added chown security fixes (closes: Bug#257504) (Christoph Hellwig). + + * Dropped modular-swsusp, doesn't work and unmaintained (Christoph Hellwig). + + * Added 3ware SATA-RAID driver, backported from mainline (Christoph Hellwig). + + * Update XFS to most current upstream BK version (Christoph Hellwig). + + * Added Marvell Ethernet driver (closes: Bug#256064) (Christoph Hellwig). + + * Added a backport of the netfilter signed char fix (Christoph Hellwig). + + -- Sven Luther Wed, 7 Jul 2004 18:12:20 +0200 + +kernel-source-2.6.7 (2.6.7-2) unstable; urgency=low + + * Removed another tainted driver (closes: Bug#242895), and amended + remove-references-to-removed-drivers.dpatch accordingly. Actually, + this was done in the previous revision, but we forgot the changelog + entry (Christoph Hellwig, Jens Schmalzing). + + * Renamed debian/revision back to version.Debian. Having it outside the + debian/ directory is mandatory for kernel-tree to work (Jens Schmalzing). + + * Added the drivers-net-tg3 patch. It only adds firmware loading + support, contrary to the drivers-net-tg3-readd patch which re-adds the + whole driver. As a consequence, the Debian patch also applies to the + vanilla kernel again. Note that this patch is only kept here for + reference for the time being and will not be activated until the next + upstream release (Jens Schmalzing). + + * Added the fs-asfs patch by Marek Szyprowski, containing support for + the Amiga Smart Filesystem. Actually, the patch was already part of + the kernel-patch-powerpc package and has been moved over from there + (Jens Schmalzing). + + -- Jens Schmalzing Thu, 24 Jun 2004 09:56:13 +0200 + +kernel-source-2.6.7 (2.6.7-1) unstable; urgency=low + + * New upstream release. + + * Added split patches in dpatch format (Christoph Hellwig and Sven Luther). + + * Lots of patches merged upstream: + . acpi-link + . console-refcounting + . doc-sound + . drivers-hotplug-acpi-unregister + . drivers-i810-update + . drivers-ide-CONFIG_IDE_STROKE-at-runtime (slight changes, allows drops + the config option completely) + . drivers-mca_53c9x-needs_mca_legacy + . drivers-mtd-sharp-missing-includes + . drivers-mtd-uclinux-rootfs + . drivers-neomagic-ids + . drivers-neomagic-oss-ids + . drivers-paride-epat (with minor updates) + . drivers-pnp-needs-x86 + . drivers-scsi-aic7xxx-fixes (slightly different) + . drivers-usb-storage-new-sony-device + . drivers-video-tgafb-needs-selection.h + . drivers-watchdog-missing-includes + . fs-isofs-remove-unused + . include-linux-mca.h-fixups (only partially) + . makefile-wc-fixup + . sparc64-NR_CPUS + . x86-dma-mapping.h-fixups + + * Dropped some patches (Christoph Hellwig): + . alpha_cia_window - incorrect (closes: #253787) + . doc-initrd_devfs - incorrect, devfs names for initrd are okay + . drivers-mwave_paper_over_sysfs_crap - buggy driver model integration + removed completely upstream + . drivers-net-ns83820-needs-FW_LOADER - incorrect, ns83820 doesn't + load firmware at all + . drivers-scsi-3w-xxxx-no_unregister - incorrect + . export-proc_get_inode - the symbol is internal for a reason. buggy + drivers using it removed in 2.6.7 + . fs-msdos-dontbug - rejected upstream + . fs-umsdosfs-crapola - umdos is disconnected from the build in 2.6 + . ppc-higher-binutils-requirement - upstream disagrees, Debian uses + dpkg build depencies anyway + . 00_doc-README.Debian - now handled differently by the packaging + + * Renamed version.Debian to debian/revision, in order to have all Debian + specific bits in the debian directory (Jens Schmalzing). + + * Added the prune target to debian/rules. It unpacks the vanilla + kernel, removes the tainted bits, and creates a free .orig.tar.gz + (Jens Schmalzing). + + * Added the monolith target to debian/rules. It saves a copy of the + original kernel tree, then for each revision applies the split patches + via dpatch and creates a monolithic patch (Jens Schmalzing). + + * Add fs-jfs-compile to fix JFS compilation (Christoph Hellwig). + + * Package the upstream changelog file, taken from ChangeLog-, + into kernel-tree. The rationale of this being that we should + distribute the upstream changelog in the usual location, but it is + enough to do this once (Jens Schmalzing). + + -- Jens Schmalzing Mon, 21 Jun 2004 12:55:48 +0200 + +kernel-source-2.6.6 (2.6.6-2) unstable; urgency=low + + * Fix i386 FPU bug. + * Transfer control of package to debian kernel team. + + -- William Lee Irwin III Tue, 15 Jun 2004 11:06:35 -0700 + +kernel-source-2.6.6 (2.6.6-1) unstable; urgency=low + + * New upstream release (closes: #243084, #244728, #245959, #247486). + * Deleted unused exit prototype in drivers/scsi/aic7xxx/aic7xxx_osm.c. + * Unregister properly if no devices are found in + drivers/scsi/aic7xxx/aic79xx_osm.c (closes: #246277, #247298). + * Fixed GUCODE type check in drivers/usb/input/hiddev.c (Sergey Vlasov). + * Added basic highmem support in drivers/scsi/advansys.c (closes: #245238). + * Changed all occurrences herbert@debian.org: + . arch/i386/power/swsusp_syms.c + . arch/x86_64/kernel/swsusp_syms.c + . kernel/power/swsusp-core.c + . kernel/power/swsusp.h + * Reverted broken "VIA KT400-8235" change in arch/i386/kernel/dmi_scan.c. + * Fixed IRQ assignment in drivers/acpi/pci_link.c (Len Brown). + * Fixed resume device check (Sau Dan Lee): + . kernel/power/swsusp-core.c + . kernel/power/swsusp.c + . kernel/power/swsusp.h + * Restored driver without firmware: + . drivers/net/Kconfig + . drivers/net/Makefile + . drivers/net/tg3.c + * Added firmware loading support (Nathaneal Nerode): + . drivers/net/Kconfig + . drivers/net/tg3.c + + -- Herbert Xu Tue, 11 May 2004 19:42:16 +1000 + +kernel-source-2.6.5 (2.6.5-4) unstable; urgency=high + + * Unregister PCI driver in drivers/pci/hotplug/acpiphp_glue.c. + * Fixed print_pirt NULL deref in drivers/pci/hotplug/shpchprm_acpi.c + (closes: #246149). + * Reverted radeon/r128 firmware changes (closes: #246587, #246594, #246627): + . drivers/char/drm/Kconfig + . drivers/char/drm/Makefile + . drivers/char/drm/r128_cce.c + . drivers/char/drm/r128_drv.h + . drivers/char/drm/r128_firmware_loader.c + . drivers/char/drm/radeon_cp.c + . drivers/char/drm/radeon_drv.h + . drivers/char/drm/radeon_firmware_loader.c + + -- Herbert Xu Fri, 30 Apr 2004 09:05:39 +1000 + +kernel-source-2.6.5 (2.6.5-3) unstable; urgency=medium + + * Added firmware loading support (Nathaneal Nerode): + . drivers/char/drm/Kconfig + . drivers/char/drm/Makefile + . drivers/char/drm/r128_cce.c + . drivers/char/drm/r128_drv.h + . drivers/char/drm/r128_firmware_loader.c + . drivers/char/drm/radeon_cp.c + . drivers/char/drm/radeon_drv.h + . drivers/char/drm/radeon_firmware_loader.c + * Removed non-free firmware: + . R128 firmware: drivers/char/drm/r128_cce.c + . Radeon firmware: drivers/char/drm/radeon_cp.c + * Read .extraversion if it exists in Makefile. + * Added support for removal in drivers/ide/ide-generic.c. + * Set GPL license in arch/i386/kernel/cpu/mcheck/non-fatal.c. + * Copy pages in reverse (closes: #234976): + . arch/i386/power/pmdisk.S + . arch/i386/power/swsusp.S + * Lowered maximum NR_CPUS to 32 in arch/sparc64/Kconfig (closes: #245971). + + -- Herbert Xu Tue, 27 Apr 2004 20:31:41 +1000 + +kernel-source-2.6.5 (2.6.5-2) unstable; urgency=low + + * Reverted pid == 1 change in kernel/fork.c. + * Allow PCI IDE drivers to be unloaded if probing fails in + drivers/ide/pci/atiixp.c. + * Fixed single word src misalign > dest misalign case in + arch/alpha/lib/stxncpy.S (glibc). + * Removed obsolete gcc workaround in sound/core/oss/Makefile. + * Fixed boundary checks for GUSAGE/SUSAGE in drivers/usb/input/hiddev.c. + * Fake inquiry for Sony Clie PEG-TJ25 in drivers/usb/storage/unusual_devs.h + (closes: #243650). + * Strip quotes from parameters in kernel/params.c (bk, closes: #243588). + * Added device release function in drivers/char/mwave/mwavedd.c + (closes: #244207). + * Set __exit tags on module_exit in drivers/ide/pci/*. + * Partially modularised software suspend: + . arch/i386/power/Makefile + . arch/i386/power/swsusp_syms.c + . arch/x86_64/kernel/Makefile + . arch/x86_64/kernel/swsusp_syms.c + . drivers/acpi/sleep/proc.c + . fs/buffer.c + . include/linux/suspend.h + . kernel/sys.c + . kernel/power/Kconfig + . kernel/power/Makefile + . kernel/power/console.c + . kernel/power/process.c + . kernel/power/swsusp-core.c + . kernel/power/swsusp.c + . kernel/power/swsusp.h + . mm/vmscan.c + * Fixed illegal __exit reference: + . drivers/scsi/aic7xxx/aic7xxx_osm.c + . drivers/scsi/aic7xxx/aic7xxx_osm.h + * Fixed local root exploit in fs/isofs/rock.c (Ernie Petrides). + * Clear b_data in journal_get_descriptor_buffer in fs/jbd/journal.c + (Ted Ts'o). + * Added module option parsing in drivers/video/vesafb.c (closes: #244031). + * Fixed vesafb_exit leaks in drivers/video/vesafb.c. + + -- Herbert Xu Fri, 23 Apr 2004 21:50:18 +1000 + +kernel-source-2.6.5 (2.6.5-1) unstable; urgency=low + + * New upstream release (closes: #235419, #238569). + * Applied SCSI Media Changer patch (closes: #238476). + * Fixed strcmp in sysfs store (closes: #234446): + . kernel/power/main.c + . kernel/power/disk.c + * Do not unshare files for pid == 1 in kernel/fork.c (closes: #239029). + * Removed ide-detect in favour of ide-generic: + . drivers/ide/Makefile + . drivers/ide/ide-default.c + . drivers/ide/ide-generic.c + . drivers/ide/ide-io.c + . drivers/ide/ide-probe.c + . drivers/ide/ide-probe-mini.c + * Check __HAVE_THREAD_FUNCTIONS in include/linux/thread_info.h (m68k). + * Unregister properly if no devices are found (closes: #237477): + . drivers/scsi/aic7xxx/aic7770_osm.c + . drivers/scsi/aic7xxx/aic7xxx_osm.c + . drivers/scsi/aic7xxx/aic7xxx_osm.h + * Fixed X86_PM_TIMER description in drivers/acpi/Kconfig (Jochen Voss, + closes: #241941). + * Removed non-free firmware and disabled their drivers (see #239952): + . QLA2XXX: drivers/scsi/qla2xxx/*_fw.c + . TIGON3: drivers/net/tg3.c + . Unused: sound/oss/724hwmcode.h + . Unused: sound/oss/Hwmcode.h + * Lowered priority of "too many keys" message in + drivers/input/keyboard/atkbd.c (closes: #239036). + * Made %docs depend on scripts_basic instead of scripts in Makefile. + * Fixed syntax error in Documentation/DocBook/parportbook.tmpl. + * Include linux/init.h for __init in sound/pcmcia/pdaudiocf/pdaudiocf.c + * Fixed bashism in Makefile. + + -- Herbert Xu Tue, 6 Apr 2004 20:42:02 +1000 + +kernel-source-2.6.4 (2.6.4-1) unstable; urgency=low + + * New upstream release (closes: #234631, #234754, #236570). + * Added vmlinux.syms: + . scripts/Makefile.modpost + . scripts/modpost.c + * Allow X86_MCE_NONFATAL to be a module: + . arch/i386/Kconfig + . arch/i386/kernel/cpu/mcheck/mce.c (Andrew Morton) + * Black listed "TOSHIBA CD-ROM XM-1702BC" in drivers/ide/ide-dma.c. + * Black listed "VIA KT400-8235" for broken_pirq in + arch/i386/kernel/dmi_scan.c (closes: #235188). + * Handle NO_SENSE in sd_rw_intr in drivers/scsi/sd.c (Alan Stern, + closes: #232494). + * Reverted tasklet change in drivers/usb/host/uhci-hcd.*. + * Fixed ThinkPad lock up problem in drivers/usb/host/uhci-hcd.c (Alan Stern). + * Put __modpost under MODVERDIR in scripts/Makefile.modpost. + * Provide *-2.6 instead of *-2.4 (closes: #236779). + * Fixed IDE CD capacity detection in drivers/ide/ide-cd.c (Jens Axboe, + closes: #216581). + * Removed dev->name lookups before register_netdev (closes: #234817): + . drivers/net/3c501.c + . drivers/net/3c503.c + . drivers/net/8390.c + . drivers/net/8390.h + . drivers/net/ac3200.c + . drivers/net/apne.c + . drivers/net/e2100.c + . drivers/net/es3210.c + . drivers/net/hp-plus.c + . drivers/net/hp.c + . drivers/net/hydra.c + . drivers/net/lne390.c + . drivers/net/mac8390.c + . drivers/net/ne.c + . drivers/net/ne2.c + . drivers/net/ne2k-pci.c + . drivers/net/ne2k_cbus.c + . drivers/net/ne3210.c + . drivers/net/oaknet.c + . drivers/net/smc-mca.c + . drivers/net/smc-ultra.c + . drivers/net/smc-ultra32.c + . drivers/net/stnic.c + . drivers/net/wd.c + . drivers/net/zorro8390.c + * Set MODVERDIR based on SUBDIRS in Makefile (Andreas Gruenbacher, + closes: #236626). + * Remove reference to drivers/parport/init.c in + Documentation/DocBook/parportbook.tmp. + + -- Herbert Xu Sat, 13 Mar 2004 14:13:45 +1100 + +kernel-source-2.6.3 (2.6.3-2) unstable; urgency=low + + * Rebuilt to fix tarball in kernel-source package. + * Really added the Post-Halloween document. + + -- Herbert Xu Mon, 23 Feb 2004 08:01:24 +1100 + +kernel-source-2.6.3 (2.6.3-1) unstable; urgency=low + + * New upstream release. + * Replaced irq_resource usage: + . drivers/isdn/hardware/avm/b1isa.c + . drivers/isdn/hardware/avm/t1isa.c + . drivers/isdn/hisax/hisax_fcclassic.c + * Added Post-Halloween document. + * Allow PCI IDE drivers to be unloaded if probing fails (closes: #202828): + . drivers/ide/arm/*.c + . drivers/ide/pci/*.c + + -- Herbert Xu Fri, 20 Feb 2004 20:48:48 +1100 + +kernel-source-2.6.2 (2.6.2-2) unstable; urgency=high + + * Added build-dependency on gs (closes: #232631). + * Restored generic SCSI proc_info function in drivers/scsi/scsi_proc.c + (closes: #232533). + * Fixed early chip programming in tg3_setup_copper_phy() in drivers/net/tg3.c + (David Miller). + * Fixed dev timer SMP deadlock in drivers/scsi/aic7xxx/aic7xxx_osm.c + (Andrew Morton). + * Check return value of do_munmap in do_mremap in mm/mremap.c (2.6.3). + + -- Herbert Xu Wed, 18 Feb 2004 21:29:09 +1100 + +kernel-source-2.6.2 (2.6.2-1) unstable; urgency=low + + * New upstream release (closes: #227071, #229745, #227240, #231466). + * Made PDC202XX_{BURST,FORCE} available even if it is a module in + drivers/ide/Kconfig. + * Fixed dead lock in drain_dac in sound/oss/i810_audio.c. + * Added drivers/ide/ide-probe-mini.c (2.4, closes: #224082, #227317, #228906, + #230195, #230755). + * Updated kernel-source description from kernel-package (closes: #226816). + * Added upstream changelog (closes: #230183). + * Added build-dependency on docbook-utils and transfig. + * Put kernel_thread_helper in right segment in arch/i386/kernel/process.c + (bk). + + -- Herbert Xu Sat, 7 Feb 2004 10:36:58 +1100 + +kernel-source-2.6.0 (2.6.0-2) unstable; urgency=low + + * Don't allow mremap of zero-sized areas in mm/mremap.c (2.6.1, + closes: #226542). + + -- Herbert Xu Sun, 11 Jan 2004 16:34:27 +1100 + +kernel-source-2.6.0 (2.6.0-1) unstable; urgency=low + + * New upstream release. + * Documented psmouse/mousedev in README.Debian (closes: #223596). + + -- Herbert Xu Sun, 21 Dec 2003 16:16:02 +1100 + +kernel-source-2.6.0-test11 (2.6.0-test11-1) unstable; urgency=low + + * New upstream release (closes: #212831, #215530, #217908, #218749, #218768, + #219239, #219944, #220432). + * Reverted set_blocksize change in fs/block_dev.c (closes: #214131). + * Removed libqt-dev suggestion in kernel-source. + * Added Freecom FX-5/FX-50 in drivers/usb/storage/unusual_devs.h + (Luke Kenneth Casson Leighton, closes: #218781). + * Unregister driver if probing fails in sound/oss/sb_card.c + (closes: #218845). + * Work around gcc bug in sound/core/oss/Makefile (closes: #203195). + * Use page cache for cramfs_read in fs/cramfs/inode.c (Al Viro). + * Fixed DMA overruns/bugs in sound/oss/i810_audio.c. + * Include asm/io.h and asm/scatterlist.h in include/asm-i386/dma-mapping.h. + * Removed uses of isa_vir_to_bus (closes: #218878): + . drivers/net/irda/ali-ircc.c + . drivers/net/irda/nsc-ircc.c + . drivers/net/irda/smsc-ircc2.c + . drivers/net/irda/via-ircc.c + . drivers/net/irda/via-ircc.h + . drivers/net/irda/w83977af_ir.c + . include/net/irda/ali-ircc.h + . include/net/irda/irda_device.h + . include/net/irda/nsc-ircc.h + . include/net/irda/w83977af_ir.h + . net/irda/irda_device.c + * Fixed Tekram DC390 driver (Guennadi Liakhovetski, closes: #221865): + . drivers/scsi/Kconfig + . drivers/scsi/dc390.h + . drivers/scsi/scsiiom.c + . drivers/scsi/tmscsim.c + . drivers/scsi/tmscsim.h + * Flush bundles when devices go down: + . include/net/xfrm.h + . net/xfrm/xfrm_policy.c + . net/xfrm/xfrm_state.c + * Fixed inclusion loop with include/net/sctp/sm.h: + . include/net/sctp/sctp.h + . net/sctp/associola.c + . net/sctp/outqueue.c + . net/sctp/socket.c + . net/sctp/transport.c + * Fixed connect/disconnect race in drivers/usb/core/hub.c (2.4, + closes: #218670). + * Initialise state for /proc/net/tcp in net/ipv4/tcp_ipv4.c (bk). + * Cleaned up debian/rules a little. + * Schedule tasklets for async removal in drivers/usb/host/uhci-hcd.*. + + -- Herbert Xu Mon, 8 Dec 2003 20:23:22 +1100 + +kernel-source-2.6.0-test9 (2.6.0-test9-1) unstable; urgency=low + + * New upstream release (closes: #216972). + * Applied x86/64bit fix in drivers/char/ftape/lowlevel/ftape-calibr.c (2.4). + * Include linux/fs.h for struct file: + . drivers/char/watchdog/scx200_wdt.c + . drivers/char/watchdog/wdt_pci.c + . drivers/char/watchdog/i810-tco.c + . drivers/char/watchdog/alim7101_wdt.c + . drivers/char/watchdog/alim1535_wdt.c + . drivers/char/watchdog/sc1200wdt.c + . drivers/char/watchdog/amd7xx_tco.c + . drivers/char/applicom.c + * Include linux/init.h for __init: + . drivers/char/moxa.c + . drivers/char/mxser.c + . drivers/mtd/chips/jedec_probe.c + . drivers/mtd/chips/sharp.c + . drivers/net/sb1000.c + . drivers/net/wan/sealevel.c + . drivers/net/wan/cosa.c + * Removed unnecessary asm/setup.h in drivers/mtd/cmdlinepart.c. + * Support architectures without asm/mca.h: + . include/linux/mca.h + . include/linux/mca-legacy.h + * Made PNPBIOS X86 only in drivers/pnp/Kconfig. + * Added CIBAUD/CMSPAR in include/asm-alpha/termbits.h. + * Include linux/selection.h for color_table in drivers/video/tgafb.c. + * Added optimise by size option: + . Makefile + . init/Kconfig + * Fixed reference count bug in net/xfrm/xfrm_policy.c. + + -- Herbert Xu Sun, 26 Oct 2003 16:16:43 +1100 + +kernel-source-2.6.0-test7 (2.6.0-test7-1) unstable; urgency=low + + * Fixed NLMSG_OK and RTA_OK: + . include/linux/netlink.h + . include/linux/rtnetlink.h + * Reverted process group accessor change (bk): + . arch/ia64/kernel/unaligned.c + . arch/sparc64/solaris/misc.c + . drivers/char/n_tty.c + . drivers/char/rocket.c + . drivers/char/tty_io.c + . drivers/char/vt.c + . drivers/char/vt_ioctl.c + . drivers/net/slip.c + . fs/binfmt_elf.c + . fs/compat_ioctl.c + . fs/dquot.c + . fs/exec.c + . fs/open.c + . fs/proc/array.c + . include/linux/sched.h + . kernel/acct.c + . kernel/exit.c + . kernel/fork.c + . kernel/pid.c + . kernel/signal.c + . kernel/sys.c + . net/ipv4/netfilter/ipt_owner.c + . net/ipv6/netfilter/ip6t_owner.c + * Export blk_queue_activity_fn for ide-probe in drivers/block/ll_rw_blk.c. + This change did not make it into the package (closes: #215223). + * Include mca-legacy.h for MCA_NOTFOUND in drivers/isdn/eicon/eicon_mod.c. + * Use gcc-2.95 compatible variadic macro in + drivers/media/video/saa7134/saa7134-core.c. + + -- Herbert Xu Sun, 12 Oct 2003 09:51:18 +1000 + +kernel-source-2.6.0-test6 (2.6.0-test6-2) unstable; urgency=low + + * Export blk_queue_activity_fn for ide-probe in drivers/block/ll_rw_blk.c. + + -- Herbert Xu Sat, 4 Oct 2003 13:45:40 +1000 + +kernel-source-2.6.0-test6 (2.6.0-test6-1) unstable; urgency=low + + * New upstream release (closes: #209307). + * Use mac_len for move ll headers: + . include/linux/skbuff.h + . net/core/dev.c + . net/ipv4/xfrm4_input.c + . net/ipv6/xfrm6_input.c + * Removed ACENIC/DGRS/DABUSB in arch/*/defconfig (closes: #211852). + * Fixed double request_region: + . drivers/net/arcnet/com20020.c + . drivers/net/arcnet/com20020-isa.c + . drivers/net/arcnet/com20020-pci.c + * Forbid unspecified tunnel mode SAs in net/xfrm/xfrm_policy.c. + * Removed duplicate policy checks for ipip tunnels: + . net/ipv4/ipip.c + . net/ipv4/xfrm4_tunnel.c + * Restored err_tty_modem label in drivers/isdn/i4l/isdn_common.c. + * Added probe declaration in drivers/net/wireless/arlan-main.c. + * Include linux/termios.h for TCGETS in fs/intermezzo/dir.c + (Kalle Olavi Niemitalo, closes: #208966). + + -- Herbert Xu Fri, 3 Oct 2003 19:38:37 +1000 + +kernel-source-2.6.0-test4 (2.6.0-test4-3) unstable; urgency=low + + * Fixed fatal bug in xfrm ll header patch: + . net/ipv4/xfrm4_input.c + . net/ipv6/xfrm6_input.c + + -- Herbert Xu Thu, 4 Sep 2003 20:51:57 +1000 + +kernel-source-2.6.0-test4 (2.6.0-test4-2) unstable; urgency=low + + * Added MODULE_LICENSE to net/xfrm/xfrm_user.c. + * Export idedefault_driver in drivers/ide/ide-default.c. + + -- Herbert Xu Mon, 1 Sep 2003 21:16:07 +1000 + +kernel-source-2.6.0-test4 (2.6.0-test4-1) unstable; urgency=low + + * New upstream release (closes: #206656). + * Fixed ll header of tunnel packets: + . include/linux/skbuff.h + . net/ipv4/xfrm4_input.c + . net/ipv6/xfrm6_input.c + * Fixed gcc 3 declaration in drivers/net/sis190.c. + * Fixed synchronize_irq() call in drivers/net/sis190.c. + * Fixed freenet_devtypo in drivers/net/wan/cosa.c. + * Fixed device name setting in drivers/net/3c509.c. + * Removed release timer in sound/pcmcia/vx/vx_entry.c. + * Always define cmpxchg in include/asm-i386/system.h (closes: #206956). + + -- Herbert Xu Sun, 31 Aug 2003 13:41:55 +1000 + +kernel-source-2.6.0-test2 (2.6.0-test2-1) unstable; urgency=low + + * Cope with exit status 2 from md5sum in drivers/isdn/hisax/cert.c. + * Fixed binutils test in scripts/ver_linux. + * Wrapped long line in kernel-source description. + * Marked IDE PCI proc entries as __devinitdata (closes: #202412): + . drivers/ide/pci/*.h + * Fixed binutils version recommendation in arch/ppc/Makefile. + * Added per-SA ECN flag: + . include/linux/pfkeyv2.h + . include/linux/xfrm.h + . include/net/inet_ecn.h + . include/net/xfrm.h + . net/ipv4/ah4.c + . net/ipv4/esp4.c + . net/ipv4/ipcomp.c + . net/ipv4/xfrm4_input.c + . net/ipv6/ah6.c + . net/ipv6/esp6.c + . net/ipv6/ipcomp.c + . net/ipv6/xfrm6_input.c + . net/key/af_key.c + . net/xfrm/xfrm_user.c + * Fixed secpath xfrm state leak: + . include/net/xfrm.h + . net/ipv4/xfrm4_input.c + . net/ipv4/xfrm4_policy.c + . net/ipv6/xfrm6_input.c + . net/ipv6/xfrm6_policy.c + . net/netsyms.c + . net/xfrm/xfrm_input.c + . net/xfrm/xfrm_policy.c + * Fixed owner setting in drivers/net/arcnet/com20020-isa.c. + * Fixed module refcounting in drivers/net/pcmcia/com20020_cs.c. + * Fixed hdlc proto type: + . drivers/net/wan/dscc4.c + . drivers/net/wan/pc300_drv.c + * Use gcc-2.95 compatible variadic macro in drivers/net/wireless/wl3501_cs.c. + * Applied 486 emulation patch (Willy Tarreau): + . arch/i386/Kconfig + . arch/i386/kernel/Makefile + . arch/i386/kernel/emu.c + . arch/i386/kernel/entry.S + + -- Herbert Xu Thu, 31 Jul 2003 20:01:30 +1000 + +kernel-source-2.6.0-test1 (2.6.0-test1-1) unstable; urgency=low + + * New upstream release (closes: #194242, #199893). + * Fixed size of default_port in drivers/net/via-rhine.c. + * Added general notes from 2.4 README.Debian file. + * Removed cmd640 from drivers/ide/pci/Makefile (closes: #195286). + * Made MCA_53C9X depend on MCA_LEGACY in drivers/scsi/Kconfig. + * Setup two 1G mappings if cia_rev == 1 in arch/alpha/kernel/core_cia.c. + * Added inclusion of linux/stddef.h due to NULL in linux/timer.h. + * Fixed multiline string literals in drivers/net/wan/sdla_chdlc.c. + * Suggest libqt-dev in kernel-source package (closes: #196296). + * Fixed IDE PCI proc entries for modules in drivers/ide/ide-proc.c. + * Fixed assembly specification in drivers/net/wan/sbni.c. + * Enable hw_resend_irq if io_apic is on (ac): + . include/asm-i386/hw_irq.h + . arch/i386/kernel/io_apic.c + * Include linux/skbuff.h for skb_put in include/linux/netlink.h. + * Include linux/spinlock.h for rwlock_t in include/net/ip6_fib.h. + * Include linux/ipv6.h for inet6_sk in include/net/ip6_route.h. + * Include net/sock.h for struct sock in include/net/ip6_route.h. + * Include linux/netdevice.h for MAX_ADDR_LEN in include/net/neighbour.h. + * Added forward declaration for struct neighbour in include/net/neighbour.h. + * Include linux/types.h for __u32 in include/linux/watchdog.h. + * Added forward declaration for struct net_device in include/linux/skbuff.h. + * Wake up km_waitq after policy changes in net/xfrm/xfrm_policy.c. + * Restored mdio_sem that replaced rtnl_lock in drivers/net/8139too.c. + * Include linux/root_dev.h for ROOT_DEV in drivers/mtd/maps/uclinux.c. + * Removed bogus devfs references in Documentation/initrd.txt (Nikolaus Rath). + * Kill temp addresses and regen timer on shutdown in net/ipv6/addrconf.c. + * Fixed optional choice setting in scripts/kconfig/confdata.c. + * Made CONFIG_IDEDISK_STROKE a runtime option (Joerg Platte): + . include/linux/ide.h + . drivers/ide/ide.c + . drivers/ide/ide-disk.c + * Export blk_rq_prep_restart for ide-disk in drivers/block/ll_rw_blk.c. + * Fixed IDE modularisation: + . drivers/ide/Kconfig + . drivers/ide/Makefile + . drivers/ide/ide.c + . drivers/ide/ide-io.c + . drivers/ide/ide-pnp.c + . drivers/ide/ide-probe.c + . drivers/ide/pci/* + . drivers/ide/setup-pci.c + . include/linux/ide.h + + -- Herbert Xu Tue, 15 Jul 2003 21:36:05 +1000 + +kernel-source-2.5.69 (2.5.69-1) unstable; urgency=low + + * New upstream release. + + -- Herbert Xu Wed, 7 May 2003 20:54:36 +1000 + +kernel-source-2.4.20 (2.4.20-6) unstable; urgency=low + + * Documented mem= change in README.Debian. + * Fixed printk warnings in init/do_mounts.c. + * Fixed printk warnings in fs/fat/file.c (closes: #178355). + * Commented out non-TeX heading in Documentation/smp.tex (Daniel van Eeden, + closes: #174554). + * Fixed dupliate detection problem in drivers/net/tokenring/ibmtr.c + (closes: #178874). + * Close old_fd and root_fd in init/do_mounts.c (Brian May, closes: #180934). + * Ignore errors from tw_setfeature in drivers/scsi/3w-xxxx.c + (closes: #181581). + * Changed all occurances of infobox+sleep to msgbox in scripts/Menuconfig + (closes: #181640). + * Use rq->special instead of rq->buffer in drivers/scsi/ide-scsi.c + (closes: #180125). + * Fixed precedence bug in drivers/sound/trident.c (John Levon). + * Documented AMD 768 erratum (closes: #177139). + * Fixed initialisation error handling in drivers/block/cciss.c. + * Fixed initialisation error handling in drivers/block/cpqarray.c. + * Fixed ptrace security hole (closes: #185375). + * Work around broken Toshiba keyboards (2.4.21pre, closes: #121335). + * Fixed sock address length check (2.4.21pre, closes: #171983). + + -- Herbert Xu Sat, 22 Mar 2003 10:05:53 +1100 + +kernel-source-2.4.20 (2.4.20-5) unstable; urgency=high + + * Fixed ethernet packet padding information leak (2.4ac, see #176178): + . via-rhine + * Added sk_padto function (closes: #176487). + + -- Herbert Xu Mon, 13 Jan 2003 19:17:48 +1100 + +kernel-source-2.4.20 (2.4.20-4) unstable; urgency=high + + * Added missing printk newlines in net/sched/sch_htb.c + (Alexandra N. Kossovsky, closes: #174152). + * Removed bogus VIA KT266 IO-APIC check. It is a useful warning. + * Removed bogus ip_conntrack_{ftp,irc} check. + * Fixed a typo in Documentation/sound/Introduction (Daniel van Eeden, + closes: #174944). + * Reverted CONFIG_VIDEO_VESA change (closes: #175614). + * Fixed ethernet packet padding information leak (2.4ac, see #176178): + . 3c501 + . 3c505 + . 3c507 + . 3c523 + . 3c527 + . 7990 + . 8139too + . 82596 + . 8390 + . a2065 + . am79c961a + . ariadne + . at1700 + . atarilance + . atp + . bagetlance + . de600 + . de620 + . declance + . depca + . eepro + . eexpress + . epic100 + . eth16i + . fmv18x + . hp100 + . lance + . lasi_82596 + . lp486e + . ni5010 + . ni52 + . ni65 + . axnet_cs + . fmvj18x_cs + . ray_cs + . xirc2ps_cs + . xircom_tulip_cb + . seeq8005 + . sgiseeq + . sk_g16 + . smc9194 + . sun3_82586 + . sun3lance + . wavelan + . yellowfin + . znet + + -- Herbert Xu Sat, 11 Jan 2003 17:31:43 +1100 + +kernel-source-2.4.20 (2.4.20-3) unstable; urgency=low + + * Fixed ext3 remount deadlock added in 2.4.20-2 (Andrew Morton). + * Fixed ext3 use-after-free bug (Andrew Morton). + * Fixed i845G AGP Gart initialisation (Michael Milligan, closes: #172724). + * Updated i810_audio driver (2.4.21pre1, closes: #172194). + + -- Herbert Xu Sat, 21 Dec 2002 13:49:15 +1100 + +kernel-source-2.4.20 (2.4.20-2) unstable; urgency=low + + * Include acpidrv.o in the kernel (Mario Holbe, closes: #168439). + * Removed CONFIG_INET_ECN_DISABLED option. + * Removed CONFIG_INET_ECN check in net/ipv4/tcp_diag.c. + * Fixed stxncpy on alpha (2.4.21pre). + * Fixed ext3 data=journal umount problem (2.4.21pre1, closes: #171632). + * Added dependency on MTD_CONCAT for sc520cdp (closes: #173045). + + -- Herbert Xu Sun, 15 Dec 2002 14:53:05 +1100 + +kernel-source-2.4.20 (2.4.20-1) unstable; urgency=low + + * New upstream release (closes: #164065, #164204, #165478, #166312, #168141, + #168190, #170962). + * Disable CONFIG_VIDEO_VESA unless VESA FB support is turned on. + * Mention Debian changes in kernel-source package description. + * Fixed a bug where ACPI is always compiled as a module (closes: #168439). + * CONFIG_VIDEO_SELECT is always on again. + * Modularised VESA FB. + * Added coreutils as an alternative to fileutils (closes: #170459). + * Replaced BUG() with printk() in fs/fat/file.c (closes: #168886). + * Fixed circular dependency in include/linux/netfilter_ipv4/ip_conntrack.h. + * Do not get seqno if we will not use it in fs/isofs/inode.c. + * Fixed HID name fix so that produce id is actually read. + * Added missing semicolons in drivers/scsi/aic7xxx/aicasm/aicasm_gram.y + (Michael Osamu Shiobara, closes: #165375). + * Made CONFIG_PARIDE_EPATC8 into a runtime option. + * Fixed double PCI unregistration in drivers/char/joystick/pcigame.c. + * Include linux/init.h in drivers/char/amd76x_pm.c. + * Include linux/init.h in drivers/scsi/cpqfcTSinit.c. + + -- Herbert Xu Sat, 30 Nov 2002 16:39:30 +1100 + +kernel-source-2.4.19 (2.4.19-5) unstable; urgency=high + + * Fixed i386 lcall DoS (Petr Vandrovec). + + -- Herbert Xu Mon, 18 Nov 2002 21:22:02 +1100 + +kernel-source-2.4.19 (2.4.19-4) unstable; urgency=low + + * Added missing headers in drivers/isdn/hisax/avma1_cs.c. + * Added missing headers in drivers/net/wan/comx-hw-munich.c. + + -- Herbert Xu Wed, 16 Oct 2002 22:42:01 +1000 + +kernel-source-2.4.19 (2.4.19-3) unstable; urgency=low + + * Fixed more ACPI module building problems. + * Fixed initialisation oops in drivers/scsi/aic7xxx/aic7770.c + (closes: #162347). + * Made CONFIG_VIDEO_SELECT conditional in drivers/video. + + -- Herbert Xu Sun, 6 Oct 2002 16:33:04 +1000 + +kernel-source-2.4.19 (2.4.19-2) unstable; urgency=low + + * Inlucde pagemap.h for unlock_page in drivers/char/drm/i810_dma.c + (closes: #144971). + * Set ?time to zero in fs/cramfs/inode.c. + * Allow ACPI to be compiled as a module. + * Fixed umsdos_solve_hlink oops in fs/umsdos/dir.c (closes: #159772). + * Honour ide?=dma in drivers/ide/via82cxxx.c (Arne Nordmark, + closes: #157925). + * Restored priority of invalidate messages in fs/buffer.c. The submitter of + #131419 did a badblocks -f. + * Wait before flushing in drivers/char/drm/mga_dma.c (ac, closes: #161100). + * Applied SCSI Media Changer patch (closes: #144850). + * Applied Big Physical Area Reservation patch (closes: #144849). + * Removed period check for executables in fs/isofs/inode.c (closes: #162190). + + -- Herbert Xu Sat, 28 Sep 2002 16:53:27 +1000 + +kernel-source-2.4.19 (2.4.19-1) unstable; urgency=low + + * New upstream release (closes: #139617, #146349). + * ip_nat_{ftp,irc} cannot be m if ip_conntrack_{ftp,irc} is y, respectively + (closes: #142532). + * Removed volume checks in fs/isofs/inode.c (closes: #138384). + * Removed gsem from drivers/usb/pegasus.c. + * Always call complete after unlinking an urb in drivers/usb/usb-ohci.c. + * Set hardsect size to 512 in drivers/scsi/sr.c (closes: #154510). + * Removed non-free firmware and disabled their drivers (closes: #150052): + . SMC Token Ring + . ACENIC + . DGRS + . DABUSB + * Lowed invalidate messages to priority DEBUG in fs/buffer.c + (closes: #131349). + + -- Herbert Xu Wed, 7 Aug 2002 21:12:03 +1000 + +kernel-source-2.4.18 (2.4.18-5) unstable; urgency=low + + * Corrected AdvWriteDWordLramNoSwap in drivers/scsi/advansys.c + (Jerome L. Quinn, closes: #128080). + * Added check for VIA KT266 IO-APIC, version == 2 (closes: #136163). + * Updated pegasus driver (2.4.19pre6). + * Added ATARAID device names to main.c (Eduard Bloch, closes: #139604). + * Updated uhci driver (Johannes Erdfelt, closes: #135785). + * Translate slashes in broken Acorn ISO9660 file systems (Darren Salt, + closes: #141660). + * Added newline to printk in drivers/sound/i810_audio.c + (handler-case@gmx.net, closes: #142214). + * Updated parport driver (2.4.19pre6). + + -- Herbert Xu Sat, 13 Apr 2002 22:07:22 +1000 + +kernel-source-2.4.18 (2.4.18-4) unstable; urgency=high + + * Fixed remaining double free in + drivers/net/zlib.c + fs/jffs2/zlib.c + + -- Herbert Xu Wed, 20 Mar 2002 20:02:18 +1100 + +kernel-source-2.4.18 (2.4.18-3) unstable; urgency=high + + * Fixed double free in + drivers/net/zlib.c + fs/jffs2/zlib.c + + -- Herbert Xu Wed, 13 Mar 2002 20:24:09 +1100 + +kernel-source-2.4.18 (2.4.18-2) unstable; urgency=low + + * Removed -g from driviers/atm/Makefile. + * Added missing personality patch to fs/binfmt_elf.c. + * Export est_cycle_freq (needed for removing CONFIG_FT_ALPHA_CLOCK). + * Extern inline -> static inline in + drivers/char/specialx.c + drivers/net/hamradio/soundmodem + * Added asm/io.h for in*/out* to + drivers/isdn/hisax/hisax_fcpcipnp.c + drivers/net/wan/farsync.c + + -- Herbert Xu Wed, 6 Mar 2002 19:53:30 +1100 + +kernel-source-2.4.18 (2.4.18-1) unstable; urgency=low + + * New upstream release (closes: #126391, #135156). + * Reverted tulip BMCR_FULLDPLX patch. + * Moved mkcramfs to the cramfs source package. + * CONFIG_SERIAL_ACPI now depends on CONFIG_SERIAL == y (closes: #132038). + * Fixed negative inodes in /proc/net (Arnaud Giersch, closes: #134704). + * pcnet32_purge_tx_ring may be called from IRQ context (Darren Salt, + closes: #134930). + * Check old_bbpnt in drivers/scsi/sr.c (2.5). + * Removed CONFIG_FT_ALPHA_CLOCK. + * Fixed the use of return values from mem*_io in drivers/isdn/sc. + * Added missing headers in drivers/pcmcia/i82092.c. + * Fixed compile error in drivers/scsi/dpt_i2o.c on alpha. + + -- Herbert Xu Thu, 28 Feb 2002 19:40:29 +1100 + +kernel-source-2.4.17 (2.4.17-1) unstable; urgency=low + + * New upstream release (closes: #122168, #123471). + * Only set startup to 0 for 21143 (rev 65) in tulip. + * Don't clear BMCR_FULLDPLX bit in tulip_find_mii as it breaks some cards + (closes: #100624). + * Fixed atyfb compilation problem (Tobias Ringstrom). + * Removed obsolete vfat patch. + * Fixed double cache allocation in mount_devfs_fs. + + -- Herbert Xu Sat, 22 Dec 2001 13:41:46 +1100 + +kernel-source-2.4.16 (2.4.16-1) unstable; urgency=low + + * New upstream release. + + -- Herbert Xu Wed, 28 Nov 2001 07:30:44 +1100 + +kernel-source-2.4.15 (2.4.15-1) unstable; urgency=low + + * New upstream release. + + -- Herbert Xu Sat, 24 Nov 2001 13:34:51 +1100 + +kernel-source-2.4.14 (2.4.14-1) unstable; urgency=low + + * New upstream release (closes: #117368, #118111). + * Made mkcramfs more verbose about write errors. + * Fixed compilation problem in loopback driver. + * Fixed compilation problem in ps2esdi.c. + * Fixed compilation problem in i2c-core.c. + + -- Herbert Xu Fri, 9 Nov 2001 20:15:49 +1100 + +kernel-source-2.4.13 (2.4.13-1) unstable; urgency=low + + * New upstream release. + * Updated kernel-source suggests (closes: #115716). + * Added support for nm256xl+ (Mattia Monga, closes: #116378). + * Fixed comment about epochs in arch/alpha/kernel/time.c. + * Fixed symlink size bug on tmpfs. + * Fixed handling of HIDs with product strings bug no manufacturer. + * Work around tmpfs symlink size bug in mkcramfs. + + -- Herbert Xu Sat, 27 Oct 2001 17:39:07 +1000 + +kernel-source-2.4.12 (2.4.12-1) unstable; urgency=low + + * New upstream release. + * Fixed typo in debian/rules (closes: #114065). + * Fixed ECN compilation problem (closes: #114192). + * Fixed typo in Documentation/sound/OPL3-SA + (Marius Gedminas, closes: #114760). + * Fixed typo in drivers/parport/ieee1284_ops.c (Tim Waugh). + * Don't kill page cache entries in set_blocksize. + + -- Herbert Xu Sat, 13 Oct 2001 11:41:03 +1000 + +kernel-source-2.4.10 (2.4.10-1) unstable; urgency=low + + * New upstream release. + * Added support for EPAT C7/C8 chips. + * Fixed dead lock on shutdown in 8139too (closes: #107779). + * Removed const from drivers/net/irda/smc-ircc.c + (Keith Owens, closes: #110193). + * Allow ECN to be compiled in but disabled. + * Removed non-free Keyspan firmware. We're no longer pristine. + * Fixed list_del bug in usb-uhci (ac patches). + * Fixed apm argument processing (ac patches). + * Added ioctl defines for cpq (ac patches). + * Included linux/init.h in drivers/net/aironet4500_card.c. + + -- Herbert Xu Sat, 29 Sep 2001 16:05:20 +1000 + +kernel-source-2.4.9 (2.4.9-1) unstable; urgency=low + + * New upstream release (closes: #63393). + * Fixed highmem CramFS bug (closes: #108893). + * Added missing include in fs/ntfs/unistr.c. + * Reverted startup==1 patch from drivers/net/tulip/21142.c. + * Fixed obsolete use of min: drivers/net/rrunner.c. + * Exported snprintf/vsnprintf (ac patches). + + -- Herbert Xu Sat, 18 Aug 2001 21:23:07 +1000 + +kernel-source-2.4.8 (2.4.8-1) unstable; urgency=low + + * New upstream release. + * Menuconfig now exits with 1 if screen is too small (closes: #106510). + * Applied NFS client seekdir patch (closes: #63063, #107045). + * Build-depend on kernel-package >= 7.48 (closes: #107545). + * Applied emu10k fixes (ac patches). + * Fixed ldm macros (ac patches). + + -- Herbert Xu Sun, 12 Aug 2001 09:04:44 +1000 + +kernel-source-2.4.7 (2.4.7-1) unstable; urgency=low + + * New upstream release (closes: #97516, #104141, #104267). + * Applied ReiserFS umount patch (closes: #100740). + * Applied DAC960 completion patch (Jens Axboe). + * Restricted CONFIG_FB_PVR2 to SH (ac patches). + + -- Herbert Xu Sun, 22 Jul 2001 11:52:29 +1000 + +kernel-source-2.4.6 (2.4.6-1) unstable; urgency=low + + * New upstream release (closes: #102864). + * Fixed pegasus_set_multicast lockup. + * Reverted sysinfo patch. + + -- Herbert Xu Thu, 5 Jul 2001 19:24:12 +1000 + +kernel-source-2.4.5 (2.4.5-1) unstable; urgency=low + + * New upstream release (closes: #78761, #96443). + * Fixed set_blocksize() on RAMDISKs. + * Removed flavour patch from Makefile as it is now obsolete. + * Fixed typo in drivers/usb/ov511.c (ac patches). + * Fixed race in fs/super.c (Alexander Viro). + + -- Herbert Xu Sun, 27 May 2001 10:25:42 +1000 + +kernel-source-2.4.4 (2.4.4-2) unstable; urgency=low + + * Hacked ide_xlate_1024 to work when IDE is modularised (closes: #94853). + * Fixed typo in pci2220i.c (ac patches). + * Treat files that begin with FD_FILL_BYTE correctly in vfat + (closes: #75413). + + -- Herbert Xu Sun, 13 May 2001 09:33:09 +1000 + +kernel-source-2.4.4 (2.4.4-1) unstable; urgency=low + + * New upstream release. + * Fixed a typo in Documentation/sound/OPL3-SA (Carlos Valdivia Yague, + closes: #95255). + + -- Herbert Xu Sun, 29 Apr 2001 10:32:51 +1000 + +kernel-source-2.4.3 (2.4.3-4) unstable; urgency=low + + * ip_conntrack_ftp fix (netfilter, closes: #94216). + + -- Herbert Xu Sun, 22 Apr 2001 11:15:02 +1000 + +kernel-source-2.4.3 (2.4.3-3) unstable; urgency=low + + * Added missing SIEMENS PCI ID (ac patches). + * Exported proc_get_inode (ac patches). + + -- Herbert Xu Mon, 16 Apr 2001 08:42:17 +1000 + +kernel-source-2.4.3 (2.4.3-2) unstable; urgency=low + + * Correct devfs path name in scsi-generic.txt (closes: #93405). + * Fixed negative padding in struct sysinfo. + + -- Herbert Xu Fri, 13 Apr 2001 19:42:42 +1000 + +kernel-source-2.4.3 (2.4.3-1) unstable; urgency=low + + * New upstream release. + + -- Herbert Xu Sun, 8 Apr 2001 16:50:40 +1000 + +kernel-source-2.4.2 (2.4.2-3) unstable; urgency=low + + * Added build-time dependency on libz-dev (closes: #89722). + * Compilation fixes in 6pack.c and genhd.h (closes: #90646). + + -- Herbert Xu Fri, 23 Mar 2001 20:30:03 +1100 + +kernel-source-2.4.2 (2.4.2-2) unstable; urgency=low + + * Added initrd support for cramfs. + * Fixed bug that prevented initrd from being freed (ac patches). + * Fixed a typo in Documentation/sound/VIBRA16 (Carlos Valdivia, + closes: #88018). + * Removed misleading securetty note in devfs README files (closes: #89148). + + -- Herbert Xu Sun, 11 Mar 2001 08:56:27 +1100 + +kernel-source-2.4.2 (2.4.2-1) unstable; urgency=low + + * New upstream release. + * Created mkcramfs package. + * Accomodate option change in binutils (closes: #87009). + * Applied loopback patch by Jens Axobe. + + -- Herbert Xu Fri, 23 Feb 2001 20:19:31 +1100 + +kernel-source-2.4.1 (2.4.1-3) unstable; urgency=low + + * Applied tmpfs patch by Christoph Rohland. + * Fixed incorrect conditional check in struct sysinfo (closes: #85603). + + -- Herbert Xu Sun, 11 Feb 2001 21:08:05 +1100 + +kernel-source-2.4.1 (2.4.1-2) unstable; urgency=low + + * Fixed the struct sysinfo warning properly (closes: #84234). + + -- Herbert Xu Sat, 10 Feb 2001 23:10:44 +1100 + +kernel-source-2.4.1 (2.4.1-1) unstable; urgency=low + + * New upstream release. + * Added support for flavours to Makefile. + * Only include asm/bitops.h if __KERNEL__ is defined in linux/fs.h + (closes: #84238). + * Added padding to struct sysinfo so that it's identical to 2.2 (#84234). + * Fixed typos in asm/socket.h (closes: #39168). + * Updated IrDA URL in asm/termios.h (closes: #42222). + + -- Herbert Xu Sun, 4 Feb 2001 10:11:47 +1100 + +kernel-source-2.4.0 (2.4.0-1) unstable; urgency=low + + * New upstream release (closes: #71874, #79490). + * Added missing build-time dependencies (closes: #81728). + + -- Herbert Xu Tue, 16 Jan 2001 11:14:16 +1100 + +kernel-source-2.4.0-test11 (2.4.0-test11-1) unstable; urgency=low + + * New upstream release. + + -- Herbert Xu Sat, 9 Dec 2000 11:34:37 +1100 + +kernel-source-2.4.0-test5 (2.4.0-test5-1) unstable; urgency=low + + * New upstream release. + + -- Herbert Xu Sat, 29 Jul 2000 17:55:37 +1000 + +kernel-source-2.4.0-test4 (2.4.0-test4-1) unstable; urgency=low + + * New upstream release. + + -- Herbert Xu Wed, 19 Jul 2000 18:37:17 +1000 + +kernel-source-2.4.0-test3 (2.4.0-test3-1) unstable; urgency=low + + * New upstream release. + + -- Herbert Xu Wed, 12 Jul 2000 09:49:57 +1000 + +kernel-source-2.4.0-test2 (2.4.0-test2-1) unstable; urgency=low + + * New upstream release. + + -- Herbert Xu Mon, 10 Jul 2000 19:24:59 +1000 + +kernel-source-2.2.17 (2.2.17pre6-1) frozen unstable; urgency=low + + * New upstream release. + + -- Herbert Xu Sat, 24 Jun 2000 21:53:40 +1000 + +kernel-source-2.2.16 (2.2.16-1) frozen unstable; urgency=high + + * New upstream release (closes: #65745). + + -- Herbert Xu Sun, 18 Jun 2000 12:42:37 +1000 + +kernel-source-2.2.15 (1:2.2.15-3) frozen unstable; urgency=low + + * Bring capabilities closer to POSIX spec (Andrew Morgan) + | Note. This subtly changes cap_bset behaviour. + + -- Herbert Xu Thu, 1 Jun 2000 09:32:11 +1000 + +kernel-source-2.2.15 (1:2.2.15-2) frozen unstable; urgency=low + + * AIC7XXX 5.1.29 (closes: #63946). + + -- Herbert Xu Sat, 13 May 2000 09:29:50 +1000 + +kernel-source-2.2.15 (1:2.2.15-1) frozen unstable; urgency=low + + * New upstream release (closes: #63675). + * Built with kernel-package 7.04.potato.1 (closes: #63290). + + -- Herbert Xu Tue, 9 May 2000 12:54:09 +1000 + +kernel-source-2.2.15pre19 (2.2.15pre19-2) frozen unstable; urgency=low + + * New upstream release (pre20). + + -- Herbert Xu Tue, 25 Apr 2000 15:31:03 +1000 + +kernel-source-2.2.15pre19 (2.2.15pre19-1) frozen unstable; urgency=low + + * New upstream release (closes: #55383). + * Applied patch from Chris Evans. + * Applied patch from David Miller. + + -- Herbert Xu Fri, 21 Apr 2000 12:15:30 +1000 + +kernel-source-2.2.14 (2.2.14-5) frozen unstable; urgency=low + + * Delete my copy of the control file before calling make-kpkg + (closes: #62269). + + -- Herbert Xu Thu, 13 Apr 2000 08:33:18 +1000 + +kernel-source-2.2.14 (2.2.14-4) frozen unstable; urgency=medium + + * Applied patch from Alexey Kuznetsov that fixes the AF_UNIX socket crash + (closes: #61335). + * Rebuilt with new kernel-package (closes: #61261). + + -- Herbert Xu Fri, 31 Mar 2000 14:12:43 +1000 + +kernel-source-2.2.14 (2.2.14-3) frozen unstable; urgency=low + + * Rebuilt with new kernel-package (closes: #60001). + * Included a patch from Eric Delaunay that + fixes a couple of argument parsing bugs in main.c (closes: #58566). + + -- Herbert Xu Thu, 23 Mar 2000 19:05:11 +1100 + +kernel-source-2.2.14 (2.2.14-2) unstable; urgency=low + + * Fixed incorrect assembly code for i386. + + -- Herbert Xu Sun, 16 Jan 2000 12:36:59 +1100 + +kernel-source-2.2.14 (2.2.14-1) unstable; urgency=low + + * New upstream release. + * Fixed a typo in aha152x.c (closes: #12636). + + -- Herbert Xu Thu, 13 Jan 2000 12:09:06 +1100 + +kernel-source-2.2.13 (2.2.13-2) unstable; urgency=low + + * Updated version number in README.Debian (closes: #49033). + * Removed kernel-image as it will be generated by the kernel-image source + package. + + -- Herbert Xu Fri, 19 Nov 1999 19:41:45 +1100 + +kernel-source-2.2.13 (2.2.13-1) unstable; urgency=low + + * New upstream release. + * Enabled ServeRAID (closes: #47653). + + -- Herbert Xu Sun, 24 Oct 1999 14:22:49 +1000 + +kernel-source-2.2.12 (2.2.12-4) unstable; urgency=low + + * Fixed a typo in tgafb.c. + * Added CONFIG_APM_DISABLE_BY_DEFAULT. + * Call make-kpkg to clean up (closes: #45603). + + -- Herbert Xu Thu, 14 Oct 1999 09:06:57 +1000 + +kernel-source-2.2.12 (2.2.12-3) unstable; urgency=low + + * Compiled with stacks aligned on dwords. + * Enabled serial consoles (closes: #46152). + + -- Herbert Xu Tue, 28 Sep 1999 17:39:34 +1000 + +kernel-source-2.2.12 (2.2.12-2) unstable; urgency=low + + * Rewrote the kmod patch to only bail out when the other side is our parent. + * Use the VFS patch rather than the autofs patch. + * Enabled Joliet extensions (fixes #42006). + * Enabled APM (fixes #42258). + + -- Herbert Xu Sat, 11 Sep 1999 23:51:00 +1000 + +kernel-source-2.2.12 (2.2.12-1) unstable; urgency=low + + * New upstream release (fixes #43865). + * Fixed an nlink update problem in nfs. + * New rules file from Hartmut Koptein. + * Fixed an overflow bug in the stallion driver. + * Fixed an autofs deadlock. + * Don't load a module that we're already trying to load (Chris Butler) (fixes + #39910). + + -- Herbert Xu Wed, 1 Sep 1999 09:12:15 +1000 + +kernel-source-2.2.10 (2.2.10-1) unstable; urgency=low + + * New upsream release. + * Moved default.config to new kernel-patch for i386. + + -- Herbert Xu Tue, 15 Jun 1999 21:59:48 +1000 + +kernel-source-2.2.9 (2.2.9-2) unstable; urgency=high + + * Fixed a network DoS attack. + + -- Herbert Xu Fri, 4 Jun 1999 21:06:28 +1000 + +kernel-source-2.2.9 (2.2.9-1) unstable; urgency=low + + * New upstream relesae. + + -- Herbert Xu Tue, 18 May 1999 10:20:08 +1000 + +kernel-source-2.2.7 (2.2.7-1) unstable; urgency=low + + * New upstream release. + + -- Herbert Xu Fri, 7 May 1999 22:19:56 +1000 + +kernel-source-2.2.5 (1:2.2.5-1) unstable; urgency=low + + * New upstream release. + + -- Herbert Xu Fri, 16 Apr 1999 13:56:45 +1000 + +kernel-source-2.0.36 (2.0.36-3) frozen unstable; urgency=low + + * Upgraded AIC7XXX to 5.1.11 which should make some owners of Adaptec cards + able to install Debian. + + -- Herbert Xu Sun, 21 Feb 1999 14:56:42 +1100 + +kernel-source-2.0.36 (2.0.36-2) frozen unstable; urgency=low + + * Applied ISDN patch from Paul Slootman that enables idle timeouts in the + manual dialmode and allows callback syncPPP connections to be made + (fixes #31516). + * Enlarged kernel message buffer so that all messages are caught by klogd. + * Included module for TLAN based network cards (fixes #31623). + * Include EtherExpressPro and FMV0181/182/183/184 as modules. + + -- Herbert Xu Sat, 16 Jan 1999 16:39:01 +1100 + +kernel-source-2.0.36 (2.0.36-1) unstable; urgency=low + + * New upstream release. + * Enabled ETH16I. + + -- Herbert Xu Sat, 28 Nov 1998 17:40:21 +1100 + +kernel-source-2.0.35 (2.0.35-3) frozen; urgency=low + + * Upgraded to aic7xxx 5.1.4 (fixes #29480, #27859, #28946). + + -- Herbert Xu Sun, 22 Nov 1998 15:41:44 +1100 + +kernel-source-2.0.35 (2.0.35-2) unstable; urgency=low + + * Upgraded to aic7xxx 5.1.0. + * Removed spurious definition in 3c523.c (fixes #25370). + * Built with kernel-package 5.11 (fixes #25623). + * Enabled autofs (fixes #22338, #27860). + + -- Herbert Xu Sat, 24 Oct 1998 17:32:06 +1000 + +kernel-source-2.0.35 (2.0.35-1) unstable; urgency=low + + * New upstream release. + + -- Herbert Xu Sun, 19 Jul 1998 08:59:44 +1000 + +kernel-source-2.0.34 (2.0.34-4) frozen unstable; urgency=high + + * Updated to aic7xxx 5.0.19 (fixes #24252). + + -- Herbert Xu Wed, 8 Jul 1998 20:06:08 +1000 + +kernel-source-2.0.34 (2.0.34-3) frozen unstable; urgency=high + + * Reversed euid test in fs/fcntl.c. + + -- Herbert Xu Tue, 30 Jun 1998 16:27:49 +1000 + +kernel-source-2.0.34 (2.0.34-2) frozen unstable; urgency=low + + * Upload to hamm as well. + + -- Herbert Xu Sun, 21 Jun 1998 16:48:13 +1000 + +kernel-source-2.0.34 (2.0.34-1) unstable; urgency=low + + * New upstream release (fixes #17651, #18788, #21231, #22330). + + -- Herbert Xu Sun, 7 Jun 1998 12:29:27 +1000 + +kernel-source-2.0.33 (2.0.33-9) frozen unstable; urgency=low + + * Disabled certain MCA NIC drivers (fixes #22254). + + -- Herbert Xu Sun, 10 May 1998 15:59:32 +1000 + +kernel-source-2.0.33 (2.0.33-8) frozen unstable; urgency=low + + * Disabled experimental drivers. + * Reapplied joliet patch (fixes #19160, #21537). + * Built with kernel-package 4.07 (fixes #21229). + * Replaced NO_PCI with !CONFIG_PCI in 3c59x.c (fixes #21916). + + -- Herbert Xu Fri, 1 May 1998 18:29:03 +1000 + +kernel-source-2.0.33 (2.0.33-7) frozen unstable; urgency=high + + * Applied IP fragmentation patch from Alan Cox. + + -- Herbert Xu Sat, 18 Apr 1998 12:57:56 +1000 + +kernel-source-2.0.33 (2.0.33-6) frozen unstable; urgency=low + + * Disabled scc since we don't support ax25 by default (fixes #20307). + + -- Herbert Xu Wed, 1 Apr 1998 19:21:05 +1000 + +kernel-source-2.0.33 (2.0.33-5) unstable; urgency=low + + * Turned rst cookies off. + + -- Herbert Xu Wed, 18 Mar 1998 20:41:27 +1100 + +kernel-source-2.0.33 (2.0.33-4) unstable; urgency=low + + * Applied patch from Paul Slootman (fixes #18787). + + -- Herbert Xu Fri, 6 Mar 1998 11:30:44 +1100 + +kernel-source-2.0.33 (2.0.33-3) stable unstable; urgency=low + + * Built with new kernel-package (3.61). + * Added support for fat32 (fixes #14042). + + -- Herbert Xu Fri, 20 Feb 1998 16:33:40 +1100 + +kernel-source-2.0.33 (2.0.33-2) stable unstable; urgency=low + + * built with new kernel-package (3.57) + + -- Herbert Xu Mon, 16 Feb 1998 08:59:11 +1100 + +kernel-source-2.0.33 (2.0.33-1) stable unstable; urgency=high + + * New upstream release (fixes #15736). + + -- Herbert Xu Sat, 7 Feb 1998 15:06:57 +1100 + +kernel-source-2.0.32 (2.0.32-3) stable unstable; urgency=low + + * Built with new kernel-package (3.49). + + -- Herbert Xu Mon, 15 Dec 1997 12:22:45 +1100 + +kernel-source-2.0.32 (2.0.32-2) stable unstable; urgency=low + + * Removed teles driver which was accidentally left in. + * Applied patch from Andreas Jaeger. + * Built with new kernel-package (3.48) for use by libc6. + + -- Herbert Xu Sun, 14 Dec 1997 09:29:26 +1100 + +kernel-source-2.0.32 (2.0.32-1) unstable; urgency=low + + * New upstream release. + * Pristine source. + * Bugs fixed (#6132, #6133, #8647, #11823, #13705). + + -- Herbert Xu Sun, 23 Nov 1997 18:34:38 +1100 + +kernel-source-2.0.29 (1:2.0.29-10) unstable; urgency=low + + * NCR53C8XX driver updates. + * Installed 3c59x 0.46C (#10902). + * Modified scc.c to compile with libc6 (#14367). + + -- Herbert Xu Mon, 17 Nov 1997 20:46:57 +1100 + +kernel-source-2.0.29 (1:2.0.29-9) unstable; urgency=low + + * Slight mod to pci.c to ignore bridges that the kernel can't handle (#11865). + * Removed sound module support. + + -- Herbert Xu Fri, 3 Oct 1997 11:17:02 +1000 + +kernel-source-2.0.29 (1:2.0.29-8) unstable; urgency=low + + * Used epoch numbers to deal with old kernel-source releases. + * Enabled support for NCPFS. + * Added sound support. + * Enabled IP firewalls, forwarding, and aliasing. + * Applied ne2000 patch from Paul Gortmaker. + + -- Herbert Xu Fri, 4 Jul 1997 22:01:16 +1000 + +kernel-source-2.0.29 (2.0.29-7) frozen unstable; urgency=high + + * Applied security patch from Alan Cox. + * Applied patch from Andreas Jellinghaus. + + -- Herbert Xu Sat, 31 May 1997 11:59:56 +1000 + +kernel-source-2.0.29 (2.0.29-6) frozen unstable; urgency=medium + + * Merged Debian changes from 2.0.30. + + -- Herbert Xu Sun, 25 May 1997 22:26:30 +1000 + --- linux-source-2.6.8.1-2.6.8.1.orig/debian/rules +++ linux-source-2.6.8.1-2.6.8.1/debian/rules @@ -0,0 +1,293 @@ +#!/usr/bin/make -f +# +# debian/rules for kernel-source. +# +# GNU copyright 1997 to 1999 by Joey Hess. +# Copyright (c) 1999-2002 Herbert Xu +# Copyright (c) 2004 Jens Schmalzing +# + +# This is the debhelper compatability version to use. +export DH_COMPAT=3 + +SHELL := sh -e + +stem := linux + +# extract the upstream release and the full package version from the changelog +release := $(shell sed -n '1s/^.*(\(.*\)-.*).*$$/\1/p' debian/changelog) + +# extract all the Debian revisions for this release from the changelog +revisions := $(shell sed -n 's/^$(stem)-source-$(release)\ .*(.*-\(.*\)).*$$/\1/p' debian/changelog | tac) + +# set the current Debian revision to the latest by default; +# note that for some targets, the two may actually be different. +revision ?= $(word $(words $(revisions)),$(revisions)) + +version.Debian: debian/changelog + sed 's/^[^ ]* (\([^)]*\)).*/\1/; q' $< > $@ + +##################### +# The following targets create the monolithic patches for all revisions. +# +# They create a copy of the current unpatched directory, then for each +# revision apply the appropriate split patches through dpatch and diff +# the result against the previous revision. Finally, they clean up the +# intermediate directories. + +# how we call ourselves recursively +RECURSION = $(MAKE) -f debian/rules + +# where to put the monolithic patches +MONODIR = debian/monolith + +# where to put the list of monolithic patches +PATCHLIST = $(MONODIR)/list + +# where to find the patch lists for dpatch +DPATCHLIST = debian/patches/00list + +# where to put the intermediate directory trees; use a tmpfs for maximum efficiency +DIFFDIR ?= $(CURDIR)/debian/diffdir + +# the name of the package +PACKAGE = $(notdir $(CURDIR)) + +.PHONY: monolith +monolith: stamp-monolith +stamp-monolith: stamp-monolith-prepare \ + $(foreach revision,$(revisions),stamp-monolith-$(revision)) + rm -rf $(DIFFDIR) + touch $@ + +stamp-monolith-prepare: + + if test -f $(DPATCHLIST); then dpatch unpatch-all; rm -f $(DPATCHLIST); fi + + rm -rf $(MONODIR); mkdir -p $(MONODIR) + + rm -rf $(DIFFDIR)/$(PACKAGE).orig + find . -path ./debian -prune -o -print | cpio -dumpl $(DIFFDIR)/$(PACKAGE).orig + + touch $@ + +stamp-monolith-%: + $(RECURSION) $(MONODIR)/patch-$(release)-$* revision=$* + touch $@ + +# for the first revision, we diff against the original +ifeq ($(revision),$(firstword $(revisions))) +PREVPACKAGE = $(PACKAGE).orig +prevrelease = $(release) +else +prerevision = $(shell echo $(revisions) | awk '{ for (i=2;i<=NF;i++) if ($$i == "$(revision)") print $$(i-1) }') +PREVPACKAGE = $(PACKAGE)-$(prerevision) +prevrelease = $(release)-$(prerevision) +endif + +$(MONODIR)/patch-$(release)-$(revision): + + dpatch unpatch-all + cp -p $(DPATCHLIST)-$(revision) $(DPATCHLIST) + dpatch patch-all + + rm -rf $(DIFFDIR)/$(PACKAGE)-$(revision) + find . -path ./debian -prune -o -print | cpio -dumpl $(DIFFDIR)/$(PACKAGE)-$(revision) + + ( cd $(DIFFDIR); diff -Nur $(PREVPACKAGE) $(PACKAGE)-$(revision) || true ) > $@ + echo $(notdir $@) $(prevrelease) $(release)-$(revision) >> $(PATCHLIST) + + +##################### +# Below comes Herbert's stuff with minimal additions + +khsed := s/^Package: $(stem)-headers-\(.*\)\(-[[:digit:]]*\)$$/\1 \2/ +debver := $(shell sed -n '$(khsed); t e; b; :e; p; q' debian/control) +export version := $(firstword $(debver)) +export debnum := $(word 2,$(debver)) +debver := $(version)$(debnum) +appvan := + +ifneq ($(debnum),) +appvan := --append_to_version $(debnum) +endif + +arch := $(shell dpkg-architecture -qDEB_HOST_ARCH) + +flavours := $(shell \ + find debian/config/$(arch) -maxdepth 1 -type f ! -name default \ + -printf '%f\n' \ +) + +builddir := debian/build +srcdir := $(builddir)/$(stem)-source-$(version) + +export DEBIAN_SRCTOP := $(CURDIR)/$(srcdir) +export DEBIAN_UPSTREAM_VERSION := $(version) +export DEBIAN_STEM := $(stem) + +debian/substvars.safe: stamp-monolith version.Debian debian/make-substvars + chmod u+x debian/make-substvars + debian/make-substvars $(stem) version.Debian $(PATCHLIST) > $@ + +subarch := +ifeq ($(strip $(arch)),powerpc) + subarch := --subarch pmac +endif + +MAKE_KPKG := make-kpkg --stem $(stem) $(subarch) + +unpack: stamp-unpack +stamp-unpack: stamp-monolith + dh_testdir + cd debian; \ + uudecode -o /dev/stdout firmware.tar.gz.uu | tar zxf - + find . -path ./debian -prune -o -print | \ + cpio -dumpl $(srcdir) + cd $(srcdir); rm -f stamp-* version.Debian + mkdir -p $(srcdir)/debian + cp debian/changelog $(srcdir)/debian + cp debian/control $(srcdir)/debian + cp debian/copyright $(srcdir)/debian + > $(srcdir)/debian/official + install debian/post-install $(srcdir)/debian + chmod u+x debian/header-install + for i in $(flavours); do \ + cp -al $(srcdir) $(builddir)/build-$$i; \ + cp debian/config/$(arch)/$$i $(builddir)/build-$$i/.config; \ + done + ln -s ../../../firmware $(srcdir)/debian + ln -sf `command -v touch` debian/bin/touch.orig + + touch stamp-unpack + +build_prereq := \ + version.Debian debian/substvars.safe debian/make-kernel-patch-pkgs \ + unpack + +build: $(build_prereq) + dh_testdir + + PATH=$$PWD/debian/bin:$$PATH; \ + cd $(srcdir); \ + make defconfig; \ + mv .config .config.old; \ + sed 's/^# \(CONFIG_MODVERSIONS\) is not set$$/\1=y/' \ + .config.old > .config; \ + make prepare + + for i in $(flavours); do \ + cd $(builddir)/build-$$i; \ + $(MAKE_KPKG) --append_to_version $(debnum)-$$i \ + build; \ + cd - > /dev/null; \ + done + +debnum: + @echo $(debnum) + +clean: + dh_testdir + dh_testroot + + [ -f debian/patches/00list-$(revision) ] || exit + + $(MAKE_KPKG) clean + dpatch unpatch-all + rm -f stamp-* .config* version.Debian $(DPATCHLIST) + rm -rf debian/patched $(DIFFDIR) $(MONODIR) + rm -rf $(builddir) + rm -f debian/bin/touch.orig + rm -f debian/substvars* + rm -rf debian/firmware + + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + > debian/files + cp -p debian/substvars.safe debian/substvars + +# Build architecture-independent files here. +binary-indep: build install + dh_testdir + dh_testroot + + chmod u+x debian/make-kernel-patch-pkgs + debian/make-kernel-patch-pkgs $(stem) + cd $(srcdir); \ + $(MAKE_KPKG) kernel-source; \ + $(MAKE_KPKG) kernel-doc + + mv $(builddir)/*.deb .. + cat $(srcdir)/debian/files >> debian/files + rm $(srcdir)/debian/files + +# Build architecture-dependent files here. +binary-arch: install + dh_testdir + dh_testroot + + cd $(srcdir); \ + HEADER_CLEAN_HOOK=$(CURDIR)/debian/header-install \ + $(MAKE_KPKG) $(appvan) kernel-headers + + for i in $(flavours); do \ + cp -al $(builddir)/build-$$i $(builddir)/install-$$i; \ + cd $(builddir)/install-$$i; \ + $(MAKE_KPKG) --append_to_version $(debnum)-$$i \ + --initrd kernel-image; \ + cd - > /dev/null; \ + cat $(builddir)/install-$$i/debian/files >> debian/files; \ + rm -rf $(builddir)/install-$$i; \ + done + + mv $(builddir)/*.deb .. + cat $(srcdir)/debian/files >> debian/files + rm $(srcdir)/debian/files + +binary: binary-indep binary-arch + +.PHONY: build clean binary-indep binary-arch binary install unpack debnum + +##################### +# The following targets set the stage for building the Debian packages. +# +# They unpack the vanilla kernel, remove the tainted bits, and package +# everything again. This produces both a free .orig.tar.gz in the +# parent directory and an unpacked version plus the debian +# subdirectory in the current directory. In order to use these +# targets, download the vanilla kernel as a gzipped tarball, put it +# into the parent directory as linux-.tar.gz, and run +# 'debian/rules prune'. + +# phony target for easy reference +.PHONY: prune +prune: ../$(stem)-source-$(release)_$(release).orig.tar.gz + +# prune the tainted bits from the vanilla kernel and package the result +../$(stem)-source-$(release)_$(release).orig.tar.gz: debian/official + chmod u+x debian/prune-non-free + debian/prune-non-free + test $(notdir $(CURDIR)) = $(stem)-source-$(release)-$(release) + tar czCf .. $@ --exclude debian $(stem)-source-$(release)-$(release) + +# unpack the vanilla kernel from a tarball, move stuff over, and create a stamp file +debian/official: ../linux-$(release).tar.gz + tar xzCf .. $< + mv ../linux-$(release)/* . + rmdir ../linux-$(release) + echo This is the Debian version of Linux $(release). > $@ + +unpatch: + dpatch unpatch-all + +printenv: + @echo revisions: $(revisions) + @echo revision: $(revision) + @echo release: $(release) + @echo prevrelease: $(prevrelease) --- linux-source-2.6.8.1-2.6.8.1.orig/debian/ChangeLog-2.6.8.1 +++ linux-source-2.6.8.1-2.6.8.1/debian/ChangeLog-2.6.8.1 @@ -0,0 +1,25703 @@ + +Summary of changes from v2.6.8 to v2.6.8.1 +============================================ + + + [PATCH] Fix NFS client screw-up in fcntl f_op removal + + Fix stupid thinkos in the fcntl f_op removal code. + + + Linux 2.6.8.1 + + +Summary of changes from v2.6.7 to v2.6.8 +============================================ + + + Kconfig typo fix from Jochen Voss + + + [ACPI] PCI IRQ update (Bjorn Helgaas) + http://bugme.osdl.org/show_bug.cgi?id=2574 + + mp_parse_prt() and iosapic_parse_prt() used to allocate all + IRQs, whether devices needed them or not. Some devices + failed because the this method enabled unused PCI Interrupt + Link Devices, which disrupted active link devices. + + Now the PRT knowledge is pulled out of the arch + code and the IRQ allocation and IO-APIC programming + is done by pci_enable_device(). + This is also a step toward allowing the addition + of new root bridges and PRTs at run-time. + + The architecture supplies + + unsigned int + acpi_register_gsi(u32 gsi, int edge_level, int active_high_low) + + which is called by acpi_pci_irq_enable(). ACPI supplies + all the information from the PRT, and the arch sets up + the routing and returns the IRQ it allocated. + + + [PATCH] Nuke HAS_IP_COPYSUM for net drivers + + Entirely untested, but Obviously Correct(TM). HAS_IP_COPYSUM has been + utterly meaningless for a long time. + + + [NETDRV #1] Ifdef builtin-only probe in ISA/MCA drivers + + Here is the bit which conditionalises the + builtin-only probe functions. + + + [NETDRV #2] Use driver-specific name for resources + + Here is the next part which uses a driver-specific name instead of + dev->name for resource allocations prior to netdev registration. + It also changes printks that are in direct response to errors in + resource allocations. + + + [PATCH] move scsi debugging helpers and give them sane names + + - give the constants.c prettyprinting helpers proper scsi_ prefixed + names (and keep compat versions for 2.6.x) + - move them to include/scsi/scsi_dbg.h so now really only legacy stuff + is left in drivers/scsi/scsi.h + + Signed-off-by: James Bottomley + + + SCSI: slave_detach -> slave_destory comment fix + + From: Guennadi Liakhovetski + + Signed-off-by: James Bottomley + + + Convert tmcscsim to new probing interfaces + + From: Guennadi Liakhovetski + + Update the driver to use the new pci, scsi and + module interfaces. + + Modified with feedback from hch + + Signed-off-by: James Bottomley + + + [PATCH] ipr scsi busy io hang + + Signed-off-by: James Bottomley + + + [PATCH] ipr duplicate ioa reset fix + + This patch closes a window where if a device had a cancel all + outstanding as a result of a check condition and the adapter + was reset for some reason, a request sense would still be issued, + which would end up timing out and issuing an additional adapter + reset. It could also result in a leak of command blocks, depending + on when it timed out. + + Signed-off-by: James Bottomley + + + [PATCH] ipr driver version 2.0.8 + + Bump driver version + + Signed-off-by: James Bottomley + + + [PATCH] USB / SCSI multi-card reader whitelist updates. + + For more info see Red Hat bugzilla entries #85851 and #124048 + + Signed-off-by: James Bottomley + + + MPT Fusion driver 3.01.07 update + + From: "Moore, Eric Dean" + + Clean up backword compatibility with 2.4 kernel and older. Patch + provided by Christoph Hellwig + + Signed-off-by: James Bottomley + + + [PATCH] SCSI: remove extra queue unplug calls + + blk_insert_request will do the right thing and either unplug the queue or + call the request_fn, so users of scsi_do_req do not need to call + generic_unplug_device themselves. The attached patch just removes that + call from scsi_lib.c and the sg driver after they do a scsi_do_req. + + Signed-off-by: James Bottomley + + + [PATCH] qla1280.c warning fix. + + drivers/scsi/qla1280.c:3124: warning: `qla1280_64bit_start_scsi' defined but not used + + Signed-off-by: James Bottomley + + + [PATCH] Stop megaraid trashing other i960 based devices + + From: Alan Cox + + In 2.4 the megaraid driver was careful to avoid stepping on wrong devices. + Specifically the megaraid3 series devices used an intel pci ID (8086:1960) + which is the generic i960 identifier not their own. + + The code to do this in 2.4 worked for almost all cases, but even that code has + mysteriously vanished in 2.6 meaning the megaraid driver trashes stuff like + promise i2o cards and compaq management cards. + + The following patch puts back the 2.4 stuff + one additional check so that the + driver isn't quite as rude as it was before. + + Signed-off-by: James Bottomley + + + [PATCH] SCSI: more whitelist updates for usb card readers + + ATech 9-in-1 card reader. + Cbox 3 5 1/2 bay with 6in1 card reader + + Signed-off-by: James Bottomley + + + [PATCH] SCSI: Correct BELKIN card reader whitelist entry. + + Should be FORCELUN not SPARSELUN ? + + Signed-off-by: James Bottomley + + + [PATCH] tmscsim: Update version after "new API" + + The "API-update" patch, just approved by Christoph deserves a new version. + + Signed-off-by: James Bottomley + + + [PATCH] tmscsim: remove DeviceCnt + + On Wed, 26 May 2004, Christoph Hellwig wrote: + > On Sun, May 23, 2004 at 11:19:58PM +0200, Guennadi Liakhovetski wrote: + > > + > > Whereas, DCBCnt is incremented on slave_alloc, decremented on + > > slave_destroy and used in a couple more places. So, is it safe to assume + > > that DeviceCnt is redundant and remove it in a next patch?... Then it + > > might be already safe to move scan_devices as you suggest? + > + > Looks like a way to go. I'm not sure what scan_device is supposed to + > do as I already wrote, but from looking at when it's set/cleared I'm + > pretty sure it tries to indicate whethere we're currently scanning for + > devices. And useing slave_alloc/slave_configure is a much safer way to + > find that out then guessing from the commands sent. + + So, here's the first one - remove DeviceCnt. + + Signed-off-by: James Bottomley + + + [PATCH] unchecked kmalloc in sr_audio_ioctl() + + From: "Luiz Fernando N. Capitulino" + + + Signed-off-by: Andrew Morton + Signed-off-by: James Bottomley + + + [PATCH] tmscsim: convert to slave_... + + On Wed, 26 May 2004, Christoph Hellwig wrote: + > Looks like a way to go. I'm not sure what scan_device is supposed to + > do as I already wrote, but from looking at when it's set/cleared I'm + > pretty sure it tries to indicate whethere we're currently scanning for + > devices. And useing slave_alloc/slave_configure is a much safer way to + > find that out then guessing from the commands sent. + + Attached is a patch, that moves scan_device to + slave_alloc/_configure/_destroy, as you suggested (to be precise, as I + understood your suggestion:-)) + + Signed-off-by: James Bottomley + + + [PATCH] ipr operational timeout oops + + This patch fixes an oops that can occur if an adapter times + out coming operational. + + Signed-off-by: James Bottomley + + + [PATCH] get I2O working with Adaptec's zero channel + + this patch now gets the mentioned controllers working with the I2O + subsystem. It tested on two different system with ASR-2005S and + ASR-2010S and reported as working. + + It's also tested on i686 and x86_64 with already working I2O controllers + without a problem. + + Signed-off-by: James Bottomley + + + [PATCH] remove calls of obsolete scsi APIs in i2o_scsi + + From: Markus Lidel + + Here is a patch from Christoph Hellwig, which removes calls of the obsolete + scsi API in i2o_scsi. + + Signed-off-by: Andrew Morton + Signed-off-by: James Bottomley + + + [PATCH] Nuke HAS_IP_COPYSUM + + HAS_IP_COPYSUM has been utterly meaningless for a long time. + + Signed-off-by: Roger Luethi + + + [PATCH] Nuke CanHaveMII and related code + + All Rhines can have a MII. + + Signed-off-by: Roger Luethi + + + [PATCH] Nuke HasESIPhy and related code + + This has been dead code forever. + + Signed-off-by: Roger Luethi + + + [PATCH] Nuke default_port, references to if_port, medialock + + As is, code doesn't do anything useful. + + Signed-off-by: Roger Luethi + + + [PATCH] Nuke all pci_flags + + All this code together can be replaced with a single #ifdef USE_MMIO. + + Signed-off-by: Roger Luethi + + + [PATCH] Return codes for rhine_init_one + + Use return codes in rhine_init_one instead of -ENODEV for all errors. + + Signed-off-by: Roger Luethi + + + [PATCH] Rewrite special-casing + + Use PCI revision to determine special cases. One bit field replaces a + bunch of data structures holding special case information. + + Replace chip_id, drv_flags in rhine_private with quirks + + Remove enum rhine_chips, struct rhine_chip_info (and array), + enum chip_capability_flags + + Add enum rhine_revs, enum rhine_quirks (some values in preparation for + subsequent changes) + + wait_for_reset() and enable_mmio() now use quirks instead of chip_id + + Remove model names from ident strings for now. + + Signed-off-by: Roger Luethi + + + [PATCH] Add rhine_power_init(): get power regs into sane state + + Add rhine_power_init(): get power regs into sane state. + Move the respective code out of rhine_init_one. Add code for + two additional patterns (Rhine III). + + Signed-off-by: Roger Luethi + + + [PATCH] USB: unusual_devs.h update + + On Mon, 3 May 2004, zcat wrote: + + > I am trying to get my camera going as a webcam (concord EyeQ Duo in PC + > mode, not HDD mode) with the 2.6.4 kernel using the se401 driver + > (compiled in).. It logged the following message, which doesn't mean much + > to me so I have no idea if it's useful information or not; + > + > May 3 21:08:11 mrsnorris kernel: usb 1-1: new full speed USB device + > using address 2 + > May 3 21:08:16 mrsnorris kernel: usb 1-1: control timeout on ep0out + > May 3 21:08:16 mrsnorris kernel: usb-storage: This device + > (0595,4343,0100 S 00 P 00) has an unneeded Protocol entry in unusual_devs.h + > May 3 21:08:16 mrsnorris kernel: Please send a copy of this message + > to + + This fixes the "unneeded Protocol entry" message. We never solved the + control timeout problem. + + Alan Stern + + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Fix disconnect bug in dummy_hcd + + Greg: + + This patch fixes a bug in disconnect handling for the dummy_hcd driver. + After a disconnect the driver would still accept URBs for endpoint 0, + leading to an oops. It also improves the ad-hoc technique used by the + driver to track its gadget's struct usb_device and fixes the way + port-power changes are handled. Please apply. + + Alan Stern + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] Add support for ISD-300 controller + + This patch adds support in unusual_devs.h for the ISD-300 USB controller + used in CD-ROM enclosures. + + With it, since 2.6.0 it allowed me to move gigabytes of data and worked + without a hitch. + + + Signed-off-by: Andrew Morton + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: pxa/rndis device descriptor + + This fixes a problem that all pxa2xx_udc g_ether devices + would run into. They'd give the wrong descriptors, like: + + > --------msg1- usbview ---------- + > Device Descriptor: bcdUSB: 0x0200 + > bDeviceClass: 0xFF + > bDeviceSubClass: 0x00 + > bDeviceProtocol: 0x00 + > bMaxPacketSize0: 0x10 (16) + + Windows doesn't like RNDIS-supporting devices to point + out that they're really vendor-specific. So this patch + makes sure they don't. + + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: usb retry cleanups + + This patch stops changing the reported fault mode in cases where retries of + GET_DESCRIPTOR fail because the device just doesn't have such a descriptor. + Plus, it stops printing messages when retrying. + + It also reduces the number of retries; the first retry seems to resolve most + of these firmware problems. + + Signed-Off-By: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: proper evaluation of the union descriptor for CDC ACM + + this changes acm_probe() to using the proper union descriptor. + It contains the workaround David suggested. Please apply. + + - fix probing to use cdc union descriptor + + Signed-off-by: Oliver Neukum + Signed-off-by: Vojtech Pavlik + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: error handling of open of acm driver + + this adds error handling to the open method of the cdc acm driver. + The change set is relative to my last patch rewriting probe. + - add error handling to open method + + + Signed-off-by: Oliver Neukum + Signed-off-by: Vojtech Pavlik + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: fix racy access to urb->status in cdc acm driver + + Hi, + + fix access to urb->status by introduction of an explicit flag + for finished data transfer. + - fix racy access to urb->status + + Signed-off-by: Oliver Neukum + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: fix race between disconnect and write of acm driver + + acm uses a workqueue to defer part of a write operation. + In case of disconnect this work must be waited for. + - fix race between write and disconnect + + Signed-off-by: Oliver Neukum + Signed-off-by: Vojtech Pavlik + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Minor cleanups for hub driver + + Greg: + + This patch takes care of some small miscellaneous items in hub.c: + + Move the definition of CONFIG to the right place; + + Print the proper value for submission status in the error log; + + Remove an unused list of all hubs; + + Remove some unneeded braces; + + Kill an accidentally-resurrected comment. + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Move usb_new_device() et al. into hub.c + + This patch moves usb_new_device(), usb_disconnect(), usb_choose_address(), + and usb_release_address() from usb.c to hub.c. As a side benefit, + choose_address() and release_address() can now become static. The other + two can't, because they have to be exported for use by HCD's when + registering/unregistering root hubs. + + Some other features of the patch: + + The usb_snddefctrl() and usb_rcvdefctrl() macros have been + removed, since only one of them was used and only in one spot. + + The comment about configuration choice needing to interact with + hub power budgeting has been moved in accordance with David's + wish. usb_new_device() checks to make sure a configuration + could be chosen and logs a warning if no choice was made. + + Following Linus's preference, the #ifdef preprocessor stuff has + been removed from around the calls the show_string routine. It + is now defined as a non-inline routine when debugging is enabled + and as an inline no-op otherwise (the compiler will optimize + away the useless tests). + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [Driver Model] Consolidate attribute definition macros + + - Create __ATTR(), __ATTR_RO(), and __ATTR_NULL macros to help define + attributes in a neat, short-hand form. + + - Apply these macros to the attribute definition in include/linux/device.h + + - Note: These can be used to more cleanly define attributes in your own + code. e.g: + + static struct device_attribute attrs[] = { + __ATTR_RO(foo), + __ATTR_RO(bar), + __ATTR(baz,0666,baz_show,baz_store), + __ATTR_NULL, + }; + + ...etc. + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] ata_check_bmdma + + Move hand-coded BMDMA status check into separate function. + + + [ACPI] fix !CONFIG_PCI build (Bjorn Helgaas) + + + [Driver Model] Fix up silly scsi usage of DEVICE_ATTR() macros. + + - Hey, just because the macro incorrectly included a ';' doesn't mean + one shouldn't add one on their own.. (Or at least be consistent.) + + Signed-off-by: Greg Kroah-Hartman + + + Add basic sysfs support for raw devices + + This is needed by people who use udev and want raw devices. + SuSE is shipping with this patch. + + Signed-off-by: Greg Kroah-Hartman + + + [sysfs] Add attr_name() macro + + - Returns the name of an embedded attribute in a higher-level + attribute. + + + [Driver Model] Add default attributes for classes class devices. + + - add struct class::class_attrs, which is designed to point to an + array of class_attributes that are added when the class is registered + and removed when the class is unregistered. + This allows for more consolidated and cleaner definition of and + management of attributes. + + - Add struct class::class_dev_attrs to do something similarly for + class devices. Each class device that is registered with the class + gets that set of attributes added for them, and subsequently removed + when the device is unregistered. + + Each array depends on a terminating attribute with a NULL name. Hint: + use the new __ATTR_NULL macro to terminate it. + + + Driver Model: More cleanup of silly scsi use of the *ATTR macros... + + Signed-off-by: Greg Kroah-Hartman + + + Driver Model: Cleanup the i2c driver silly use of the *ATTR macros which just broke + + + Signed-off-by: Greg Kroah-Hartman + + + Cset exclude: vojtech@suse.cz|ChangeSet|20040602201956|45549 + + Oops, this broke device removal pretty badly :( + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] Add class support to cpuid.c + + This patch adds class support to arch/i386/kernel/cpuid.c. This enables udev + support. I have tested on a 2-way SMP system and on a 2-way built as UP. + Here are the results for the SMP: + + [hlinder@w-hlinder2 hlinder]$ tree /sys/class/cpuid + /sys/class/cpuid + |-- cpu0 + | `-- dev + `-- cpu1 + `-- dev + + 2 directories, 2 files + [hlinder@w-hlinder2 hlinder]$ more /sys/class/cpuid/cpu0/dev + 203:0 + [hlinder@w-hlinder2 hlinder]$ more /sys/class/cpuid/cpu1/dev + 203:1 + [hlinder@w-hlinder2 hlinder]$ + + And for the UP: + + [root@w-hlinder2 root]# tree /sys/class/cpuid + /sys/class/cpuid + `-- cpu0 + `-- dev + + 1 directory, 1 file + + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: 2.6-BK usb (printing) broken + + On Sat, 29 May 2004, Jens Axboe wrote: + + > > > Both 2.6.7-rc1 and BK current spit out a bunch of: + > > > + > > > drivers/usb/class/usblp.c: usblp1: nonzero read/write bulk status received: -2 + > > > drivers/usb/class/usblp.c: usblp1: error -2 reading from printer + > > > drivers/usb/class/usblp.c: usblp1: error -115 reading from printer + > > > drivers/usb/class/usblp.c: usblp1: error -115 reading from printer + > > > ... + > > > + > > > (about ~80 of that last line) but work for me. + + > Sorry wasn't quite clear - the above messages are with 2.6.7-rc1 and + > current bk with your patch backed out. Current bk with the patch reports + > only the timeouts I originally listed. + + Okay, I feel better. + + It looks like those errors you see are caused by a bug in the usblp + driver. The patch below ought to help. + + + [PATCH] USB: kyocera 7135 patch + + Here is a patch based on 2.6.7-rc2 that makes the Kyocera 7135 work. + The Kyocera appears to have the same setup as the Trio. Its endpoints + are laid out like this: + + > >>>type address + > >>>usb bulk out: 0x01 + > >>>usb interrupt in: 0x82 + > >>>usb bulk out: 0x03 + > >>>usb bulk in: 0x84 + The last two are the ones used for the syncing communication. + + So the patch adds the ids for the kyocera and makes the treo_attach + function handle the kyocera too. I also changed the comment; it appears + there was an error in the original comment about the treo: + + Joe Nardelli wrote: + > Actually, the comment isn't quite right for Treos either (oops). It + > should read: + > + > ... + > 1st bulk in endpoint to communicate with the 2nd bulk out endpoint + > ... + + + Signed-off-by: Greg Kroah-Hartman + + + [Driver Model] Add default attributes for struct bus_type. + + - Similar to default attributes for struct class, this is an array + of attributes, terminated with an attribute with a NULL name, that + are added when the bus is registered, and removed when the bus is + unregistered. + + + USB: remove "devfs" message from kernel log for usb-serial driver + + No one uses devfs on 2.6 :) + + Signed-off-by: Greg Kroah-Hartman + + + [Driver Model] Add default device attributes to struct bus_type. + + - Add struct bus_type::dev_attrs, which is an array of device + attributes that are added to each device as they are registered. + + - Also make sure that we don't hang when removing bus attributes + if adding one failed.. + + + [PATCH] 1/2 3ware 9000 SATA-RAID driver v2.26.00.009 + + Here is an updated version v2.26.00.009 of the 3ware 9000 SATA-RAID driver. + + Changes in this release: + - Convert driver to pci_driver format. + - Remove proc interface, add sysfs attributes. + - Return SCSI_MLQUEUE_HOST_BUSY when card status is busy. + + Future versions may include: + - PAE fix + - 80 column wrap fixes + - Remove more prototypes by re-ordering functions. + - sysfs queue depth adjustment instead of module_param + + Signed-off-by: James Bottomley + + + [PATCH] 2/2 3ware 9000 SATA-RAID driver v2.26.00.009 + + Signed-off-by: James Bottomley + + + [ACPI] acpi=force overrides blacklist pci=noacpi or acpi=noirq (Andi Kleen) + + + [PATCH] fix dpt_i2o compilation for alpha and sparc + + This patch has been floating around for ages, got reminded of it again + when looking at the debian kernel package. + + Signed-off-by: James Bottomley + + + [PATCH] tmscsim: Store pDCB in device->hostdata + + On Sun, 23 May 2004, Christoph Hellwig wrote: + > The other thing is that most calls to dc390_findDCB could probably be + > replaced with stroing the pDCB in scsi_device->hostdata on slave_alloc, + > but that could aswell be done in an incremental patch. + + Done in the attached patch. Tested as usual and a bit harder. + + Signed-off-by: James Bottomley + + + [PATCH] remove sleep_on_timeout usage in megaraid + + megaraid does sleep_on_timeout on a stack waitq - use msleep instead. + + Signed-off-by: James Bottomley + + + [PATCH] handle NO_SENSE in sd + + Original patch from + http://marc.theaimsgroup.com/?l=linux-scsi&m=107428662718579&w=2 + reworked to according to James' suggestion to handle NO_SENSE the same + as RECOVERED_ERROR. + + Signed-off-by: James Bottomley + + + [PATCH] fix check_region usage in eata_pio + + I'd love to rework the init sequence a bit more, but without beeing able + to actually test the driver I'd rather stick to the bulletproof fix. + + Signed-off-by: James Bottomley + + + [PATCH] fix sym53c416 check_region usage + + again, the init code could use some bigger rework, but let's stick to + the minimal fix until we have some testers. + + Signed-off-by: James Bottomley + + + [PATCH] remove obsolete API usage from dpt_i2o + + Signed-off-by: James Bottomley + + + [PATCH] Advansys: Add basic highmem/DMA support + + On Wed, 2004-05-19 at 05:38, Herbert Xu wrote: + > This is a resend of my patch that adds basic support for highmem + > on i386 to the advansys driver. It has been tested in + > http://bugs.debian.org/245238. + > + > The maintainer email address listed in the MAINTAINERS file bounced + > so someone else will need to look at this. + + I converted your patch to use the DMA-API. This will be necessary to + use the EISA advansys boards---Of course, EISA won't work properly until + the entire driver is converted to the driverfs probing API, sigh, but + I'll get around to that eventually. + + OK, and I couldn't resist getting rid of the stupid in_isr locking on + the done function. + + Converted from original patch by Herbert Xu + Signed-off-by: James Bottomley + + + [PATCH] fix check_region usage in eata_pio + + Based on "eata_generic.h", this SCSI controller has 9 bytes of IO + space, not 8, so update request_region(), release_region(), and + n_io_port to use 9 instead of 8. + + diffstat:= + drivers/scsi/eata_pio.c | 16 ++++++++-------- + 1 files changed, 8 insertions(+), 8 deletions(-) + + Signed-off-by: James Bottomley + + + [PATCH] scsi_dev_flags must be __initdata, not __init + + __init is only for functions + + Signed-off-by: James Bottomley + + + [PATCH] Lost 2.4 change for BusLogic info + + From: Alan Cox + + I think it might be a good thing if this was fixed to match 2.4 + + Signed-off-by: Andrew Morton + Signed-off-by: James Bottomley + + + [PATCH] scsi_transport_spi.c build fix + + Signed-off-by: James Bottomley + + + [PATCH] SCSI: replace deprecated hosts.h file + + Signed-off-by: James Bottomley + + + [PATCH] 3ware 9000 driver update + + From: "Adam Radford" + + This patch updates the 3w-9xxx driver in 2.6.7-rc2-mm1 to v2.26.02.000 to + cleanup several things pointed out by Chris Hellwig / Jeff Garzik. + + Changes in this release: + - Use descriptive defines for phase numbers. + - Remove un-needed casts for TW_Command_Full + - Rework eh_reset(), eh_abort() spinlocks. + - Remove all mdelays, replace w/ schedule_timeout(). + - Remove MODULE_PARAM cmds_per_lun, add sysfs device attribute 'queue_depth'. + - Remove twa_slave_configure(). + - Remove twa_info(). + - Remove all bitfields from structures, add bitmask macros. + - Remove twa_setup_irq() wrapper, call directly. + - Remove un-needed prototypes. + - Propogate return value of pci_enable_device(), pci_set_dma_mask(), ioremap(). + - Use pci_request/free_regions(). + - Add missing call to pci_disable_device() on probe failure. + - Unregister character ioctl interface in twa_remove(). + - Make some excessively lengthy lines < 80 columns. + - Use pci_module_init() instead of pci_register_driver(). + - Remove bogus TW_IN_INTR check, fix twa_interrupt() spinlock. + - Rev driver branch to .02 to denote kernel version. + + Signed-off-by: Andrew Morton + Signed-off-by: James Bottomley + + + [PATCH] 3ware 9000 schedule_timeout fix + + From: "Adam Radford" + + This small patch fixes the broken schedule_timeout() usage in the 3w-9xxx + driver, and replaces the calls with msleep(). + + Signed-off-by: Andrew Morton + Signed-off-by: James Bottomley + + + [PATCH] missing forward declarations in scsi_eh.h + + Signed-off-by: James Bottomley + + + [PATCH] update 53c700 to avoid obsolete headers + + Signed-off-by: James Bottomley + + + [PATCH] kill dead compat code in advansys + + I actually wanted to fix up the check_region usage there but got lost + in the mess. Let's start by kicking out the 2.2 compat and using scsi + layer constants instead of their own redefinitions first. + + Signed-off-by: James Bottomley + + + sg update to 20040516 + + From: Douglas Gilbert + + Here are some further refinements to this patch with help + from Pat Mansfield: + - replace vmalloc() with kmalloc(,GFP_KERNEL) + - bump max sg devices from 8192 to 32768 + + Tested to 16k devices (and 8k devices on a box with 512MB + ram), Patch is against lk 2.6.6 (or 2.6.6-bk1). + + Signed-off-by: James Bottomley + + + Driver Model: And even more cleanup of silly scsi use of the *ATTR macros... + + Signed-off-by: Greg Kroah-Hartman + + + PCI: convert to using dev_attrs for all PCI devices. + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] I2C i2c-piix: Don't treat ServerWorks servers as Laptops + + I'm sending you this little obvious patch which should enable i2c-piix + to work on IBM servers with ServerWorks chipsets. It still will treat + any IBM/Intel machine as a laptop and refuse to work, but it's better + than before. + + + i2c: Treat only IBM machines with Intel chipsets as IBM laptops. + + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] I2C: update I2C IDs + + > > Greg, should I send a patch to you with these? + > + > Sure, if it's needed. + + Just noticed that I never sent the promised patch. Here it is. I also + added a few other IDs, since we have them in our (2.4) i2c CVS + repository. Having them in 2.6 as well will at least prevent collisions. + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] Driver Core: fix struct device::release issue + + Signed-off-by: Greg Kroah-Hartman + + + On Saturday 27 March 2004 02:14, Greg KH wrote: + > On Sat, Mar 06, 2004 at 12:47:24PM +0100, Frank A. Uepping wrote: + > > Hi, + > > if device_add fails (e.g. bus_add_device returns an error) then the release + > > method will be called for the device. Is this a bug or a feature? + > + > Are you sure this will happen? device_initialize() gets a reference + > that is still present after device_add() fails, right? So release() + > will not get called. + At the label PMError, kobject_unregister is called, which decrements the + recount by 2, which will result in calling release at label Done (put_device). + + kobject_unregister should be superseded by kobject_del. + Here is a patch: + + + [PATCH] Fixes for hot-plug drivers (updated) + + Here is the updated patch (against 2.6.7-rc1) for the shpchp and pciehp + drivers that fixes the following issues: + - proper LED status when latch is open or card is not present while the + user tries to power up the slot; (reported by D. Keck) + - check if kmalloc() return NULL before proceeding in acpi_get__hpp(); + (provided by L. Capitulino) + - add up(&ctrl->crit_sect) before return in error cases in several + places; + - proper handling of resources when there are other onboard devices + behind the p2p bridge that has the hot-plug capabaility; + - need to check negotiated link width in check_lnk_status(); + - cleanup board_added() in pciehp + + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: pegasus driver and ATEN device support + + I have created a patch to add support for ATEN device in pegasus usb driver. + I've sent the patch to the maintainer stated in pegasus.h but after several + weeks I didn't recieve a response, so I'm sending it to you now. The patch + should apply cleanly on 2.6.6, but it doesn't apply cleanly on todays -bk as + there was some patch adding some other device. One thing I'm not 100% sure + are the flags specified to PEGASUS_DEV, what means HAS_HOME_PNA? + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: fix Memory leak in visor.c and ftdi_sio.c + + Signed-off-by: Joe Nardelli + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Code cleanup for the UHCI driver + + This patch makes some simple cleanups in the UHCI driver: + + It introduces msecs_to_jiffies() conversions and uses msleep(). + + It wakes up threads waiting for an endpoint to be disabled + in the oddball case where interrupts aren't working. (This + should have been in a previous patch but I missed it.) + + It disables PCI interrupt generation whenever the controller + is reset and enables it when the controller is started. This + may possibly solve some people's problems with suspend/resume. + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Debounce all connect change events + + This patch makes the hub driver debounce all connection changes. Right + now the driver only does so if the status happens to be CONNECTED at one + particular instant. However, the whole point of debouncing is that the + connection is subject to transient interruptions until it has stabilized; + hence deciding whether to debounce based on a single initial test defeats + the entire purpose. + + There are some additional smaller changes that go along with the major + one: + + Comments added to hub_port_connect_change() detailing the + conditions under which it will be called. + + Don't clear the port's connect-changed feature if it wasn't + set. + + Skip debouncing if there wasn't a physical connection change + but only a logical port-enable change (or a firmware-download- + induced device morph -- not yet implemented). + + Clear all the hub status change indicators in hub_events() + before handling a connect change. This will reduce syslog + clutter from status change bits that remain set while khubd + is busy taking care of a new device. + + The patch includes no changes to the debounce routine itself. Please + apply. + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Superficial improvements to hub_port_debounce() + + Since my previous suggestions for changes to hub_port_debounce() + encountered so much resistance, this patch makes some fairly superficial + improvements to the code while leaving the logic of the algorithm almost + completely intact. The only behavioral change is that it actually + requests the port status at the start, rather than assuming the status is + not CONNECTED. Changes include: + + Vastly improved comments that are now unambiguous and accurately + descriptive of the code. + + Local variables changed to more sensible names. The stability + period is now reported in milliseconds rather than a meaningless + poll count. + + The sleep interval is moved from the start of the loop to the + end, so that the first time through we read the port status + immediately. + + If the connection has not stabilized after the total timeout + expires, -ETIMEDOUT is returned rather than whatever the + current connect status happens to be. + + If the connection does stabilize then the port status is returned + so that hub_port_connect_change() will have an up-to-date value + for the status rather than relying on the pre-debounce value. + + The changes I wanted to make but other people were worried about are + included as comments. A later (small) patch will uncomment them for + testing. + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Genuine changes to hub_port_debounce() + + This patch includes the algorithmic changes I would like to see in + hub_port_debounce(). They are: + + Increase the total timeout period from 400 ms to 1500 ms. + + Check the port's connect-changed status during the polling + loop. + + Return as soon as the connection has been stable for the + required time, even if it has been stably _dis_-connected. + (The current code waits for the full timeout period if there + isn't a connection.) + + In previous emails I have responded to all the concerns raised by others + about these changes, and I can't imagine how they could cause any trouble. + + Increasing the total timeout won't affect people with properly + functioning hardware. Their connections will quickly stabilize + and the routine will return just as before. People with flaky + hardware that takes a long time to settle down will now be able + to use their devices. + + Checking the connect-changed status during the polling loop will + make the test more conservative. The code will be able to + detect transient disconnections that it would have missed + before, and it won't return until the connection really _is_ + stable. Furthermore, this makes the test compliant with the + USB specification, which requires the stability timer to be + restarted whenever a connection change occurs. + + Returning early for disconnections is a simple optimization. + It's more important now that the total timeout length is 1.5 + seconds rather than 0.4 seconds. + + I urge you to apply this patch and for people to try it out. If there do + turn out to be problems... the patch is very small, well-contained, and + easy to revert. + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] Make the scsi error handler bus settle delay a per template option + + On 1 Jun 2004, James Bottomley wrote: + > On Tue, 2004-06-01 at 15:29, Alan Stern wrote: + > > In addition, the settle-time delays would have to be removed from the + > > error handler -- which means adding it to all the low-level drivers. Is + > > that doable? + > + > Well, for 2.6, I think that a simple flag indicating that the driver + > will implement it's own timeout should suffice rather than altering + > every LLD... + + Signed-off-by: Alan Stern + Signed-off-by: James Bottomley + + + [PATCH] Module section offsets in /sys/module + + So here I am trying to write about how one can apply gdb to a running + kernel, and I'd like to tell people how to debug loadable modules. Only + with the 2.6 module loader, there's no way to find out where the various + sections in the module image ended up, so you can't do much. This patch + attempts to fix that by adding a "sections" subdirectory to every module's + entry in /sys/module; each attribute in that directory associates a + beginning address with the section name. Those attributes can be used by a + a simple script to generate an add-symbol-file command for gdb, something + like: + + #!/bin/bash + # + # gdbline module image + # + # Outputs an add-symbol-file line suitable for pasting into gdb to examine + # a loaded module. + # + cd /sys/module/$1/sections + echo -n add-symbol-file $2 `/bin/cat .text` + + for section in .[a-z]* *; do + if [ $section != ".text" ]; then + echo " \\" + echo -n " -s" $section `/bin/cat $section` + fi + done + echo + + Currently, this feature is absent if CONFIG_KALLSYMS is not set. I do + wonder if CONFIG_DEBUG_INFO might not be a better choice, now that I think + about it. Section names are unmunged, so "ls -a" is needed to see most of + them. + + Signed-off-by: Greg Kroah-Hartman + + + Driver core: finally add a MAINTAINERS entry for it. + + Signed-off-by: Greg Kroah-Hartman + + + [AGPGART] Kconfig Typo fix + From: Tuncer M zayamut Ayaz + Signed-off-by: Dave Jones + + + USB: make usb devices remove their sysfs files when disconnected. + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] ia64: delete McKinley A-stepping code + + The patch below removes the config option and one bit of code for + McKinley A0/A1 CPU workarounds. These CPUs were never used in + production, and IIRC this workaround really only affected X11. + + Signed-off-by: David Mosberger + + + [PATCH] Re: Problems with cyberjack usb-serial-module since kernel 2.6.2 + + > Send me a patch to back those changes out to fix your device and I'll + > apply it. If the author is around to realize this, that should wake + > them up :) + + Ok, here you are! :) + Attached is a patch for linux-2.6.7-rc2. (though the patch hasn't changed + since -rc1) + + Again a short description: + (the patch removes most of the changes done in linux-2.6.2) + 1. Removed the local buffer of cyberjack_write, because something goes wrong + upon a write-request bigger than the buffer. Without this, a write-request + stalls with error -3. + 2. Removed some usb_clear_halt() lines. Without this, the device doesn't even + open and returns -7. + + It works for my cyberjack pinpad USB card reader on + - nforce2 chipset + - VIA KM266 chipset + - AMD Irongate chipset + + + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB Storage: GetMaxLUN tightening + + This patch started life from Alan Stern as as274, and has been heavily + modified. It narrows the case where a clear_halt() is issued after a + failed GetMaxLUN command to only a STALL case. + + Since the only legimate responses to a GetMaxLUN are STALL or data, + anything else is now considered a fatal error and we give up on the device. + + + Signed-off-by: Matthew Dharm + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: enable pwc usb camera driver + + The attached patch enables the pwc driver included with kernel 2.6.7-rc2 + + It also removes the warnings during compilation. + However, note that I blindly duplicated the release approach used by + other usb camera drivers, replacing the current no-op. + + The driver works for me with a Logitech QuickCam Notebook Pro and + GnomeMeeting. + + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Fix logic in usb_get_descriptor() + + This patch fixes a simple logic error in usb_get_descriptor(). It also + takes the opportunity to make the subroutine a little easier to read. + Please apply. + + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] ia64: fix ia32 virtual memory leaks due to partial-page mappings + + Certain IA-32 applications which do mmap/munmaps which are not + PAGE_SIZE aligned could see temporary (recovered at process exit time) + memory leaks, because the kernel didn't have enough data to decide if + the complete page could be unmapped. This patch adds a new data + structure called the "partial page list" which helps the kernel keep + track of precisely which 4k pages are in use by the IA-32 application. + + Armed with this data, the kernel can make better decisions at munmap + and mprotect time. No significant performance degradation was observed + in the workloads we tested and in some cases, the performance actually + improved! This is possibly due to the reduced length of the vma list. + + Signed-off-by: Arun Sharma + Signed-off-by: Gordon Jin + Signed-off-by: David Mosberger + + + [PATCH] USB devio.c: deadlock fix + + proc_resetdevice is called with dev->serialize held. + usb_reset_device takes dev->serialize and then calls + __usb_reset_device. To avoid deadlock, proc_resetdevice + should call __usb_reset_device directly. + + Signed-off-by: Duncan Sands + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Check port reset return code + + This patch adds checking for the SET-FEATURE request that actually does a + port reset. Without the check, the hub driver just assumes that the port + reset command actually was transferred okay. + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Fix resource leakage in the hub driver + + The hub driver is very careless about returning resources when an error + occurs while installing a new device. This patch attempts to put some + order back into the situation. Details: + + Since usb_new_device() allocates neither the device structure + nor the device address, it shouldn't release either one. + + Because usb_new_device() no longer releases the device structure, + usb_register_root_hub() doesn't need to take an extra reference + to it. + + Since the device address selection and TT setup code is used + only for new devices, not ones being reset, move that code from + hub_port_init() to hub_port_connect_change(). By the same token, + hub_port_init() doesn't have to release the device address or + the device structure. + + Just to make things look better, move the failure code in + hub_port_init() to the end of the routine. And when disabling + endpoint 0, disable both the IN and OUT parts of the endpoint. + + In hub_port_connect_change(), make all the failure paths + execute the same code so that resources are always released. + These resources comprise: the pointer from the parent to the + new child device, the HCD state for ep0, the device's address, + and the device structure itself -- in short, everything that's + set up before calling usb_new_device(). + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: unusual_devs.h update + + Given the problems that Dan Scholnik has reported, we should combine the + unusual_devs.h entries for the Casio QV cameras into one. The new + NEED_OVERRIDE flag will prevent complaints about unnecessary overrides, + and Dan says the same subclass and protocol values should work for all the + cameras. If they don't we'll hear about it soon enough! + + + On Tue, 1 Jun 2004, Dan Scholnik wrote: + > On Tue, 2004-06-01 at 14:14, Alan Stern wrote: + > > On Tue, 1 Jun 2004, Dan Scholnik wrote: + > > + > > > Up until the 2.6 kernels, there was one entry for all the QV cameras + > > > with both US_SC_8070 and US_PR_CB that I think seemed to work fine for + > > > everyone. As far as I know the only problem was all the folks emailing + > > > the log entry stating that the Casio entry wasn't needed. So, you could + > > > revert back to that, or revert back to the 2.6.3ish version (pre-as190) + > > > that had the overrides just for product IDs 1001-9009. I'm not really + > > > an expert on Casio's cameras, I'm afraid, just the one model I own which + > > > is 4-5 years old now. + > > > + > > > I'll be happy to prepare a patch any way you choose to go. + > > + > > How does this work for you? + > > + > > Alan Stern + > + > Works fine for me; that's I think exactly how it was from the beginning + > until 2.6 and the later 2.4 kernels when all the changes were made. + > Just cross your fingers that it doesn't somehow break newer Casios, as + > it would seem every camera they ever made falls under that entry. + + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: rndis (1/4) update OID support + + NDIS devices have a generic attribute get/set API where the attributes + are identified by 32 bit "OIDs". This fixes some problems with the OIDs + supported by the original RNDIS patch: + + - It included OIDs not found in the RNDIS spec. These have been + removed. As a rule, these weren't exported in the "OIDs I support" + list, and only a couple wouldn't fail those accesses, so this mostly + changes what debug printk appears. + + - OIDs used for optional 802.3 statistics were partially supported. + They're all in the OID list now, but the support is #ifdeffed out. + (Those statistics were mostly just made up, anyway!) + + - "Required" OIDs for suspend, resume, and wakeup support weren't + listed. Their messages are now defined, but support is #ifdeffed + out. Seems the docs aren't entirely accurate, and Windows can + behave reasonably without them. (This area needs help from someone + who knows MS-Windows power management.) + + There are also a few minor cleanups, more reasonable default volume level + for debug messages (never at KERN_INFO, keepalives only if VERBOSE), and + dumping of all bytes of some undocumented messages Windows XP has been + seen emitting shortly before the host suspended itself. + + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: rndis (2/4) fix memory leaks + + Tao Huang wrote: + > I'm writing udc driver for S3C2410. I found RNDIS almost not call my + > driver's free_request and free_buffer. So after run my driver about 3 + > hours the system will out of memory. + > + > This patch will fix the memory leak. + > + > There will still have memory leak when driver unload, but I don't known + > where is the proper place to fix it. + > 1) rndis.c should free resp_queue when it unload + > 2) ether.c should free tx_reqs and rx_reqs when it unload (as + > eth_reset_config) + + Thanks ... this is a nice patch to have. + + + From: Tao Huang + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: rndis (4/4) start documenting spec variances + + This partially reverts one of the changes in an earlier patch, + starting to document where Microsoft's spec is lying. Needed + to interop with Windows ME. + + + The Windows ME implementation of RNDIS relies on a message that + Microsoft's specification says isn't used. Restore this (removed + in earlier cleanup), and start collecting comments specifically + on where MSFT violates its own specifications. + + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] ia64: Rename SN "modules" variable to "sn_modules". + + SN code has a "modules" variable that conflicts with a variable of the + same name in kernel/module.c. This conflict breaks lcrash for ia64. + Rename "modules" to "sn_modules". + + Signed-off-by: Keith Owens + Signed-off-by: David Mosberger + + + [AGPGART] Don't waffle about unsupported serverworks chipsets if they don't do AGP. + From: Matt Domsch + Signed-off-by: Dave Jones + + + [PATCH] PCI: fix irq routing on acer travelmate 360 laptop + + Fixes interrupt routing on acer travelmate 360 notebooks. it looks like + the bios assigned the wrong pirq value for the cardbus bridge. just + assigning irq 10 to all devices with pirq 0x63 would break second usb port. + pirq 0x68 seems to be right one for cardbus. + + Signed-off-by: Daniel Ritz + Signed-off-by: Andrew Morton + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] I2C: add alternate VCORE calculations for w83627thf and w83637hf + + This patch adds support for the alternate in0/VCORE calculation which is + available for 2 of 4 chips this driver supports. It also fixes a minor + bug in the standard voltage input calculation. + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] I2C: drivers/i2c/chips/it87.c cleanup patch + + Attached is a cleanup patch for the it87 sensor driver, against + 2.6.7-rc2. Jean Delvare has reviewed it. + + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: usb root hubs can set power budgets + + This adds hub_set_power_budget(), mostly so that HCDs for low + powered ports (cell phone, PDA, etc) can more easily report their + true power budgets. It's not always 500mA per root hub port; this + makes dummy_hcd report the minimum, 8mA. + + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: usb suspend/resume work better on net2280 + + This makes net2280 behave more correctly with respect to + usb suspend and resume processing. + + So for example gadget zero autoresume testing works. + + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: rndis (3/4) Big Endian support for gadget RNDIS + + Add byteswapping. Original version partially worked on PPC with Net2280, + this version applies to the latest RNDIS code but hasn't been retested on + big-endian. Ping should be working in at least one one direction. + + Also added a handful of other things from my BK: track suspend/resume + (to eventually implement wake-on-lan), give a better rndis error + message, and add missing declarations for PM-related OIDs (usage is + #ifdeffed out by previous patch). + + From: Jon Neal + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] lh7a404 USB host against 2.6.7-rc2 + + Support for the Sharp LH7A404 OHCI, another non-PCI implementation. + This uses a platform_device and a workaround for a register read + problem. + + Signed-off-by: Marc Singer + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Initialize endpoint autoconfig in g_file_storage + + This one-line patch corrects a simple problem in the g_file_storage + driver. It neglected to initialize the endpoint-autoconfiguration library + before using it. Please apply. + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] Add cpu hotplug support to cpuid.c + + Here is the patch that uses a cpu hotplug callback, to allow dynamic support + of cpu id for classes in sysfs. + + This patch applies on top of the one I sent out earlier that Greg included. + I do not have access to hardware that supports cpu hotswapping (virtually or not) + so have not been able to test that aspect of the patch. However, the original + functionality of listing static cpu's still works. + + Please consider for testing or inclusion. + + Signed-off-by: Hanna Linder + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] Add platform_get_resource() + + This patch adds management of platform device resources to the + device model, allowing drivers to lookup resources, IRQs and DMA + numbers in the platform device resource array. We also add a + couple of functions which allow platform devices and their resources + to be registered. + + Signed-off-by: Russell King + Signed-off-by: Greg Kroah-Hartman + + + cpuid: fix hotplug cpu remove bug for class device. + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] I2C: w83627hf.c build fix + + with gcc-2.95: + + drivers/i2c/chips/w83627hf.c:482: parse error before `static' + drivers/i2c/chips/w83627hf.c:502: parse error before `static' + drivers/i2c/chips/w83627hf.c: In function `show_regs_fan_1': + drivers/i2c/chips/w83627hf.c:541: warning: implicit declaration of function `show_fan' + drivers/i2c/chips/w83627hf.c: In function `w83627hf_detect': + drivers/i2c/chips/w83627hf.c:1074: `dev_attr_in0_min' undeclared (first use in this function) + drivers/i2c/chips/w83627hf.c:1074: (Each undeclared identifier is reported only once + drivers/i2c/chips/w83627hf.c:1074: for each function it appears in.) + drivers/i2c/chips/w83627hf.c: At top level: + drivers/i2c/chips/w83627hf.c:428: warning: `show_regs_in_min0' defined but not used + drivers/i2c/chips/w83627hf.c:441: warning: `store_regs_in_min0' defined but not used + + Signed-off-by: Andrew Morton + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: add printer reset ioctl + + - add soft reset ioctl + + Signed-off-by: Oliver Neukum + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Fix bus-list root-hub race + + There are a few places where the code enumerates through all the USB + devices on all the buses, starting with each bus's root hub and working + down. However a bus does not always have a root hub, and the code does + not check that the root_hub pointer is non-NULL. This patch fixes the + problem, using the usb_bus_list_lock semaphore to synchronize access when + root hubs are added or removed. + + In addition it seemed like a good idea to minimize the time that a + non-fully-configured root hub is accessible through the bus's pointer. So + this patch delays setting the pointer and holds usb_bus_list_lock while + configuring a root hub. + + It turned out that a bunch of things needed to be changed for all this to + work: + + Check for NULL root_hub pointer in usb_device_read() and + usb_find_device(). + + Pass the root-hub device as a separate argument to + hcd_register_root(). + + Make usb_register_root_hub() acquire the usb_bus_list_lock and + set the bus->root_hub pointer. + + For consistency's sake, move the place where the children[] + pointer to a non-root-hub device gets stored as close as possible + to where usb_new_device() is called. + + Make usb_disconnect() acquire the usb_bus_list_lock when removing + a root hub. + + Change usb_hcd_pci_remove() and the non-PCI host drivers so that + they call usb_disconnect() with a pointer to the bus's root_hub + pointer, not a pointer to a temporary variable. + + Change all the host controller drivers not to store the root_hub + pointer in the bus structure but instead to pass it as a new + argument to hcd_register_root(). + + I made some attempt to update the hc_sl811 driver along with the rest, but + it's pretty clear that driver won't work in the current framework. Among + other things, it never reads the root hub's device descriptor. To what + extent is the driver really supported? + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Minor tidying up of hub driver + + After my last few changesets there were a few small items that needed to + be tidied up. + + Update kerneldoc to reflect the actual operation of + usb_disconnect() and usb_new_device(). The new locking + requirements are listed too, though they aren't all + implemented yet. + + Fulfill the new locking requirement in hcd_panic(). + + Remove unneeded local variables to conserve stack space in + usb_disconnect(), which calls itself recursively. + + In hub_port_connect_change(), store the parent's children[] + pointer as late as possible and don't lock the new device until + then (that's when it becomes globally accessible). This will + minimize the time that the not-fully-configured device structure + is visible to other parts of the kernel. + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Update root-hub code for the ohci-lh7a404 driver + + On Wed, 9 Jun 2004, David Brownell wrote: + + > Needs an update for ohci-lh7a404.c too ... + + I didn't even know this driver existed! Where did usb/host/* come from? + + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + USB: crap, I misapplied a patch with the wrong level + + This gets rid of usb/host and puts the file in the proper drivers/usb/host + directory. + + Signed-off-by: Greg Kroah-Hartman + + + [SPARC32]: Regenerate defconfig + + + [SPARC32]: Move non-PCI DMA definitions out of pgtable.h + + This also avoids a cyclic header inclusion problem with dma-mapping.h + and linux/mm.h triggered by the recent change to standard DMA definitions. + + + [SPARC32]: Continue to avoid the use of __builtin_trap for BUG() + + gcc 3.3.3 continues to ICE on the BUG_ON() in mm/fremap.c. + + + [SPARC32]: Fix CONFIG_SUN4 build + + + [PATCH] Driver Core: Suppress platform device suffixes + + Do not add numeric suffix to platform device name if device id is set to + -1. This can be used when there can be only one instance of a device + (like i8042). + + Signed-off-by: Dmitry Torokhov + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] Driver Core: Whitespace fixes + + Whitespace and formatting changes (a,b,c -> a, b, c) in drivers/base + + Signed-off-by: Dmitry Torokhov + Signed-off-by: Greg Kroah-Hartman + + + Driver Core: more whitespace fixups + + This catches the files I had to do by hand as Dmitry's patch differed from my tree. + + Signed-off-by: Dmitry Torokhov + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] PATCH: 2.6.7-rc3 drivers/usb/core/devio.c: user/kernel pointer bugs + + Since ctrl is copied in from userspace, ctrl.data cannot safely be + dereferenced. Let me know if you have any questions or if I've made + a mistake. + + Signed-off-by: Greg Kroah-Hartman + + + USB: sparse cleanups for the whole driver/usb/* tree. + + Signed-off-by: Greg Kroah-Hartman + + + USB: fix up dumb int_user_arg variable name as pointed out by Al Viro. + + Signed-off-by: Greg Kroah-Hartman + + + I2C: sparse cleanups for drivers/i2c/* + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] ia64: mark non-existent NUMA-nodes as offline + + I found a problem with HP NUMA configuration in 2.6.7-rc3-mm1. The + node_online_map is incorrect because of actions taken by + reassign_cpu_only_nodes in arch/ia64/mm/discontig.c. The mm1 patch + which changes the mempolicy for the init_task uses this invalid + node_online_map and eventually uses a non-existent node's zonelist + when calling __alloc_pages. + + The patch below takes care of this issue. It puts the non-existent + nodes offline. + + Signed-off-by: David Mosberger + + + [PATCH] ia64: fix race in fsys_bubble_down to avoid fp-register corruption + + The fast system-call fall-back-path has a race: it reads PSR, modifies + some bits, then writes back the new PSR. Unfortunately, the contents + of PSR may change between reading and writing it. For example, an + interrupt could occur which could trigger a context-switch. The + context-switch might in turn flush the floating-point-high (FPH) + partition to memory, clear PSR.MFH, and set PSR.DFH. To prevent this + race, the patch below turns off PSR.I before reading PSR. + + This fixes a floating-point corruption problem that was observed on a + system with a libc which has the fast system-call support enabled. + + The performance impact is minimal (on the order of a handful of cycles). + + Signed-off-by: Kevin Tian + Signed-off-by: Ken Chen + Signed-off-by: Asit Mallick + Signed-off-by: David Mosberger + + + [PATCH] fealnx-mac-address-and-other-issues.patch + + (resend - I need to get this out of my tree my one means or another..) + + + From: "SuD (Alex)" + + I recently was given a surecom 10/100 ethernet card and found that i could + not change Mac address for it as other driver/devices allow. I tried to + implement the missing feature and noticed that the device is quite peculiar + (or either my system is broken), when trying to fill mac address registers + (no matter whether io_ops is set): - If I write a byte (writeb) to an even + i/o address it seems like actually a word was written (the next byte is set + to 0). - If I write a byte to an odd i/o address my pc gets bad freezed. + + That made think of writing 16bit words (writew) for the memory address, as + opposed to what most driver examples do. It works for me (I hope i set the + lines at the right place in device_open function after the device is + reset). I hope the code is clean enough and does not mess with byte + ordering. This is the patch (this time against 2.6.5): + + (akpm: Is this right on big-endian?) + + + [PATCH] prism54: Kernel compatibility + + 2004-03-20 Margit Schubert-While + + * isl_38xx.[ch], isl_ioctl.c, islpci_dev.[ch], islpci_eth.c + islpci_hotplug.c, islpci_mgt.[ch], oid_mgt.c, prismcompat.h: + Adopt new prism54 kernel compatibility. + Remove remaining kernel version ifdefs. + + + [PATCH] fix oops from acenic ethtool + + Fix the following OOPS that happens when doing ifup on FC-2 + with 2.6.7 in acenic and a security hole due to missing capable(NET_ADMIN), + by replacing private ethtool handling with ethtool_ops. + + (Yes, Jes because of DEV_ETHTOOL_OPS define it will still work + on ancient kernels.) + + + [netdrvr acenic] remove unneeded ifdefs + + + [PATCH] prism54: Fix endian patch + + * Split out patch islpci_eth.c : + * Fix endian problem (bug 74/75 related) + + + [PATCH] add ARM smc91x driver + + + [PATCH] add NAPI help texts + + NAPI seems to be so self-explaining that no help texts are needed. ;-) + + I combined the two help texts that were at NAPI options, and added them + to all NAPI options. + + + [PATCH] prism54: Fix bugs 74/75 + + 2004-03-22 Aurelien Alleaume + + * oid_mgt.c, isl_ioctl.c : Minor bugfixes : #74 and #75. + + + [PATCH] prism54: Fix bugs 39/73 + + 2004-04-07 Margit Schubert-While + + * Bugs 39 and 73 + + + [PATCH] prism54: Fix bug 77, strengthened oid txn + + 2004-04-09 Aurelien Alleaume + + * oid_mgt.c, isl_ioctl.c : Cleanups. Bug #77. Minor stuffs. + + * islpci_mgt.c (islpci_mgt_transaction) : enforce serialization + in oid transaction. lindent.sh. + + * islpci_mgt.c (islpci_mgt_transaction) : Strengthened oid transaction. + + + [PATCH] prism54: Don't allow mib reads while unconfigured + + 004-04-17 Aurelien Alleaume + + * oid_mgt.c, isl_ioctl.c : Cleanup. Prevented real oid reading + before the card is configured with mib values (might be + related to + bug #53). + + + [PATCH] prism54: Add likely/unlikely, KO wds completely + + * islpci_mgt.h : Change init_wds definition + + * islpci_eth.c : Do some likely/unlikely + + + [PATCH] prism54: Align skb patch + + * islpci_eth.c, islpci_dev.c : Align skb->data unconditonally after + allocation. This would appear to improve RX rate + + + [PATCH] prism54: Reduce module verbosity + + 2004-05-01 Margit Schubert-While + + * Reduce module verbosity + + + [PATCH] prism54: Fix channel stats, bump version to 1.2 + + 2004-05-20 Aurelien Alleaume + + * islpci_eth.c : use dev_kfree_skb_irq instead of dev_kfree_skb where needed. + + * isl_ioctl.c : report channel instead of frequency in scan. + + * islpci_hotplug.c : bump version to 1.2 + + + [PATCH] prism54: Fix typo + + 2004-05-29 Margit Schubert-While + + * isl_ioctl.c : Fix typo + + + [PATCH] prism54: White space and indentation + + 2004-05-29 Margit Schubert-While + + * White space and indentation patch + + + [PATCH] ia64: Remove warnings when unwind debug is turned on + + Turning on UNW_DEBUG generates warnings for incorrect number of + parameters for formats and several cases of "suggest explicit braces to + avoid ambiguous `else'", because UNW_DPRINT contains an if statement. + + Signed-off-by: Keith Owens + Signed-off-by: David Mosberger + + + ia64: Update defconfig + + + [PATCH] USB: Mark devices as NOTATTACHED as soon as possible + + This patch implements something we've been lacking for a long time: a way + to mark devices as USB_STATE_NOTATTACHED as soon as we know that they're + gone. The usb_device->state member is no longer protected by the + ->serialize semaphore; instead there's a new private spinlock. Usbcore + routines should no longer set ->state directly; instead they should use + the new utility routine usb_set_device_state(). There are protections + against changing states while devices are being added or removed. + + Change assignments to udev->state into calls of + usb_set_device_state(). + + Add new private device_state_lock to the hub driver, along + with usb_set_device_state() and recursively_mark_NOTATTACHED(). + + Acquire the new spinlock while adding or removing children[] + pointers. + + When disabling a port that has a child device, mark the child + as NOTATTACHED. + + You mentioned once having tried to do something like this and running into + trouble. Take a good look and let me know if you see any difficulties + here. + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: ATI Remote driver update + + Here are some contributed improvements for the ATI remote driver. + + I submitted the driver and it was accepted several months ago. + Since then a few people have sent me patches and suggestions. + + This patch adds two things: + + (1) support for the "Lola" X10 remote, sent to me by + Seth Cohn + + (2) key autorepeat support, sent to me by + Vincent Vanackere + + The key autorepeat support has been tested by me, but the Lola support + has not, as I don't have the hardware. + + Thanks to Seth and Vincent, with my apologies for taking so long to + forward their improvements along. + + + Signed-off-by: Torrey Hoffman + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: usbtest just uses module_param() + + This prevents some warnings during modprobe. + + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: usbnet shouldn't oops on cdc error path + + If the string descriptor fetch works, no problem. Else + make the disconnect() logic -- newly called because of + "recent" changes to interface claiming logic -- use its + fast cleanup path, since we're still not fully set up yet. + + Should resolve OSDL bugid 2714; please merge. + + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: retry string fetches on ZLPs not just STALLs + + This matches the behavior for other descriptor fetches. + + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: usb on big endian, ehci needs a byteswap + + Adds a missing byteswap that would affect interrupt transfers + with EHCI on big-endian platforms, like Rick's MIPS-4km uClinux. + Needed for external hubs, and then likely for mice, keyboards, + and so on. + + From: Rick Sewill + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] PCI: clarify pci.txt wrt IRQ allocation + + I think we should make it explicit that PCI IRQs shouldn't be relied + upon until after pci_enable_device(). This patch: + + ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.7-rc3/2.6.7-rc3-mm1/broken-out/bk-acpi.patch + + does PCI interrupt routing (based on ACPI _PRT) and IRQ allocation + at pci_enable_device()-time. + + (To avoid breaking things in 2.6, the above patch still allocates + all PCI IRQs in pci_acpi_init(), before any drivers are initialized. + But that shouldn't be needed by correct drivers, and I'd like to + remove it in 2.7.) + + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] PCI Hotplug: rpaphp.patch -- multi-function devices not handled correctly + + I made changes to rpaphp code, so it can handle multi-fuction + devices correctly. The problem is that the pci_dev field of slot struct + can only record one pci_dev of the devices of a multi-fuction card. I + changed pci_dev (a single pci_dev type pointer) to pci_funcs( a list of + pci_dev type pointers). I rewrote some of the config/unconfig code to + support the slot struct change. + + Along with above changes, I added LDRSLOT(logical I/O slot) support. + We need LDRSLOT support for DLPAR I/O. A card in a LDRSLOT can't be + physically removed, but can be logically removed from one partiton and + reassinged to another partition. + + I also merged rpaphp changes from ames tree. + + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] Driver Model: Add class support to msr.c + + This patch enables class support in arch/i386/kernel/msr.c. Very simliar + to cpuid (with the fixes Zwane/Greg made, thanks). + + [root@w-hlinder2 root]# tree /sys/class/msr + /sys/class/msr + | -- msr0 + | `-- dev + `-- msr1 + `-- dev + + 2 directories, 2 files + + Thanks to Randy Dunlap for pointing out the unnecessary tabs. Fixed. + + Signed-off-by Hanna Linder + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] sysfs: fs/sysfs/inode.c: modify parents ctime and mtime on creation + + When a node is added to sysfs (e.g. a device plugged in via USB), the + filesystem fails to make this change visible in the parent directory's + ctime/mtime. This is in contrast to removing a device, because in that + case, sysfs makes use of the function simple_unlink from fs/libfs.c which + takes care of that. Instead of using simple_link from fs/libfs.c on + creation, sysfs implements its own mechanism. This patch hooks into the + function sysfs_create and sets the ctime and the mtime of the parent to + CURRENT_TIME. + + Signed-off-by: Sebastian Henschel + Signed-off-by: Greg Kroah-Hartman + + + [NET] first bits of net/core/stream.c + + Move tcp sk_wmem_queued related functions to net/core/stream.c, will be + used by other SOCK_STREAM protocols, starting with LLC. + + Also move the tcp_charge_skb to sock.h, for the same reasons. + + Signed-off-by: Arnaldo Carvalho de Melo + + + I2C: sparse cleanups again, based on comments from lkml + + This is more like the original code. + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB Storage: INQUIRY fixup, mode-sense options, Genesys devices + + This patch does a few things (all in the same section of code). It started + life as patches as226b, as280, and as275. Later it was merged into as226e + and I added significantly to it. + + + First, this patch introduces a new config option to allow people to enable + write-protect detection for their USB devices. With some luck, we've + finally got it right and can eventually remove this option in favor of + enabling this behavior all the time. + + Next, we change how we force some flags on -- it turns out that there are + some 'generic' entries in the SCSI devinfo which was overriding us when we + didn't want it. + + Finally, we add a safety check to the workaround for GeneSys Logic devices + -- if the max_sectors parameter has already been turned down, we won't turn + it up. + + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB Storage: Fix race when removing the SCSI host + + This patch fixes a race is disconnecting a usb-storage device that occurs + with the SCSI layer. It's primarily reproducable via adding delays into + various disconnect and reset processing paths, but has also been + encountered in the field. + + This patch started life as as281b, and was modified by me only to patch + properly against current kernels. + + The main features of the patch are: + + Store the host pointer at the start of the control thread + rather than trying to get it from srb->device; after the host + is removed the SCSI device structure may no longer exist. + + Keep dev_semaphore locked during the entire time the control + thread or reset handlers are using the us_data structure. + + Reorder the items in dissociate_dev() and release_resources() + so that things are released in the opposite order from the way + they were acquired originally. Don't bother to increment and + decrement the usb_device's reference count; it's unnecessary. + + In disconnect(), first set the DISCONNECTING flag so that no + more I/O will take place and no more requests will be accepted. + Next, cut short the current command and wait for it to finish. + Then call scsi_remove_host(). The SCSI core guarantees that + when scsi_remove_host() returns, the host will not be in error + recovery and all outstanding commands will have been cancelled. + + Remove some old useless left-over code that was #if'ed out. + + Use a wait_queue for the 6-second delay during device resets + so that we can be woken up in the middle if a disconnect occurs. + + The key point here is that after scsi_remove_host(), everything is idle as + far as the SCSI midlayer is concerned. But if there was a command in + progress at the time, the midlayer will abort it without telling us or + waiting for it to complete. Hence we have to wait for the control thread + to be idle before we can try to kill it. This should happen quickly, + since all I/O attempted by the thread will fail immediately. + + Signed-off-by: Matthew Dharm + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Fix bug in TT initialization introduced by earlier + + This patch repairs a bug introduced by an earlier patch: The TT + initialization code was moved to _after_ the TT's first use. The patch + simply puts the code back the way it used to be. + + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] I2C: add alternate VCORE calculations for w83627thf and w83637hf + + Pick a VRM (for VID interpretation) based on the VRM & OVT config, + if available. Props to Jean Delvare for the + idea & code fragment. + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] PCI: Fix PME bits in pci.txt + + Signed-off-by: Roger Luethi + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] PCI: Fix off-by-one in pci_enable_wake + + Fix off-by-one in pci_enable_wake. + Bit field location determined by mask, not value. + + Signed-off-by: Roger Luethi + Signed-off-by: Greg Kroah-Hartman + + + JFS: Don't allow reading beyond the inode map's EOF + + If we try to read inodes that are beyond the size of the inode map, + __read_metapages would read unitialized pages into the inode map's + address space. If the inode map is later grown in order to allocate + more inodes, the page is initialized and written under a different + address space. Having the stale page in the page cache prevents the + properly initialized page from being read, and results in errors. + + This problem can be provoked by an nfs client trying to read an inode + that does not exist. + + Signed-off-by: Dave Kleikamp + + + [libata] don't probe from workqueue + + Since we want the probe phase to call other workqueues, this is + required to eliminate future deadlocks. + + Other methods would include starting a single-shot thread just for + probing, but overall, using a separate thread for probing is pointless + since we are already in process context when we probe. + + So, we simply call ata_bus_probe directly. + + + [PATCH] USB: Remove private khubd semaphore + + This patch removes the private semaphore used by the hub driver, and uses + the regular "serialize" semaphore instead. This will satisfy the general + locking requirements for adding and removing devices attached to the hub. + The only tricky aspect is that now the hub event handler must take a + reference to the hub device while waiting to acquire the semaphore, in + case the hub is disconnected during the wait. + + The patch also replaces a few occurrences of spin_lock_irqsave() in + regions where interrupts are known to be enabled with spin_lock_irq(). + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] Typo in ethtool code in acenic driver + + In 10mbps detection code. + + + [PATCH] Kill stale references to Documentation/networking/8139too.txt + + Documentation/networking/8139too.txt was removed with this ChangeSet: + + ChangeSet@1.1371.153.2 2004-01-10 15:34:47-05:00 jgarzik@redhat.com + [netdrvr] remove Documentation/networking/8139too.txt + + All sections of the document are woefully outdated. + + + However, `grep' still reveals these references to it: + + drivers/net/8139too.c:90: See 8139too.txt for more details. + drivers/net/Kconfig:1539: as well as the + Documentation/networking/00-INDEX:7:8139too.txt + + Signed-off-by: Arthur Othieno + + + [PATCH] prism94 build fix + + init_wds is being instantiated in both isl_ioctl.c and islpci_eth.c, causing + linkage errors. + + drivers/net/wireless/prism54/islpci_mgt.o(.rodata+0x198): In function `islpci_mgmt_rx_fill': + /usr/src/25/drivers/net/wireless/prism54/islpci_mgt.c:154: multiple definition of `init_wds' + drivers/net/wireless/prism54/islpci_eth.o(.rodata+0x1c8):/usr/src/25/include/linux/skbuff.h:815: first defined here + + Signed-off-by: Andrew Morton + + + [libata] PCI IDE DMA code shuffling + + PCI IDE DMA standard (or "bmdma") helper routines ata_bmdma_stop, + ata_bmdma_ack_irq, and ata_bmdma_status are added to linux/libata.h, + and used in libata-core. + + There is a minor behavior change, such that, the Alt Status register + is read before acknowledging the bmdma interrupt. This should be ok, + and furthermore there will be more significant behavior changes + in this area coming soon. + + + [libata] PCI IDE command-end/irq-acknowledge cleanup + + Restruct default irq handler (used for many PCI IDE-like SATA + controllers) to obtain device status and acknowledge interrupts + a bit differently. + + In an attempt to better attack the "ich5 screaming interrupt" problem, + acknowledge and clear the device's INTRQ by reading the Status register + _before_ ack'ing the controller's irq status. This is a deviation + from how the Linux IDE driver acknowledges interrupts, but it may + be the best method, since the ICH5 appears to continue to assert + the interrupt bit in the BMDMA until the device INTRQ line is cleared. + + Of course, SATA has no INTRQ line per se, so ICH5 essentially has + new interrupt behavior not seen before in the PCI IDE world, while + pretending that it's compatible with PCI IDE. Sigh. + + This change affects all SATA controllers (for which there are libata + drivers) except for sata_promise and sata_sx4. + + + [libata] ->qc_prep hook + + Rename ->fill_sg hook to ->qc_prep, and call it unconditionally + (as opposed to ->fill_sg, which was called only when the + flag ATA_QCFLAG_SG was set). + + + NTFS: sparse fix: void function with return (value) + + Sparse: + ======= + CHECK fs/ntfs/attrib.c + fs/ntfs/malloc.h:57:15: warning: return expression in void function + [repeated several times] + + From: Mika Kukkonen + Signed-off-by: Randy Dunlap + Signed-off-by: Anton Altaparmakov + + + NTFS: - Add new element itype.index.collation_rule to the ntfs inode + structure and set it appropriately in ntfs_read_locked_inode(). + - Implement a new inode type "index" to allow efficient access to the + indices found in various system files and adapt inode handling + accordingly (fs/ntfs/inode.[hc]). An index inode is essentially an + attribute inode (NInoAttr() is true) with an attribute type of + AT_INDEX_ALLOCATION. As such, it is no longer allowed to call + ntfs_attr_iget() with an attribute type of AT_INDEX_ALLOCATION as + there would be no way to distinguish between normal attribute inodes + and index inodes. The function to obtain an index inode is + ntfs_index_iget() and it uses the helper function + ntfs_read_locked_index_inode(). Note, we do not overload + ntfs_attr_iget() as indices consist of multiple attributes so using + ntfs_attr_iget() to obtain an index inode would be confusing. + + Signed-off-by: Anton Altaparmakov + + + [ARM] Add clock API + + Since peripheral clocks are be derived in SoC or even platform + specific ways, we need a way to keep this information out of the + drivers. AMBA Primecells are defined in terms of functional units + where clocks are derived from external sources, and it is up to the + SoC designer to determine where to derive those clocks from. + + Therefore, we provide a very basic API which allows platforms to + provide this information in a generic manner to their peripherals. + This framework also allows peripherals to shut down unused clock + sources when they're not in use. + + + NTFS: Ensure that there is no overflow when doing page->index << + PAGE_CACHE_SHIFT by casting page->index to s64 in fs/ntfs/aops.c. + + Signed-off-by: Anton Altaparmakov + + + [ARM PATCH] 1926/3: PXAFB cleanups and fixes + + Patch from Ian Campbell + + Sorry, 1926/2 was missing a brace. Fixed here. + + Previous commentry: + I have corrected the grayscale conversion to correctly use the upper + byte rather than the lower one. As requested I have also left the + actual grayscale conversion where it was this time and just dealt with + the palette differences in pxafb_setpalettereg. + + fb_alloc_cmap is only called when bits_per_pixel is < 16, otherwise + any existing cmap is freed. + + I also fixed up all the spaces and brackets issues (not just the one + you raised previously) this introduces some noise in the patch, if + you'd like the two patches separately please ask. + + + [ARM PATCH] 1928/1: lh7a40x #7 Changes to memory model to support contiguous SDRAM + + Patch from Marc Singer + + [if's replaced by ifdef's.] + + While the BLOB boot loader doesn't support it, there are two others, + UBOOT and Logic's LOLO, that will initialize the SDRAM controller such + that the memory appears as a contiguous region. This layout to be + required for WinCE and, thus, is the default for these loaders. The + memory organization had been optimized for discontiguous blocks. Now, + it supports a default mode that is compatible with all of the + bootloaders as well as options to optimize for either contiguous or + discontiguous models. + + Withing, there is also a slight change to the way that the DEBUG_LL + macros select the UART address. Now it uses immediate constants + exclusively. + + + + [ARM] pxafb doesn't need to include asm/mach-types.h + + + [PATCH] clean up SCSI_TIMEOUT usage + + - qlogicfc.c abuses SCSI_TIEMOUT although it's not part of the scsi + core, give it it's own ISP_TIMEOUT define + - avoid redefining timeouts #ifdef DEBUG, that's a cause for heisenbugs + just waiting to happen + - now SCSI_TIMEOUT is private to scsi_scan.c, move it there + + Signed-off-by: James Bottomley + + + [PATCH] avoid obsolete scsi APIs in eata_pio + + Signed-off-by: James Bottomley + + + [PATCH] tmscsim: 64-bit cleanup + + > Although, I think, there's still a glitch there (modified if's order). + > I'll send a new version, if the approach is approved in principle. + + Ok, attached is version 3:-) It also fixes a definite (although, perhaps, + harmless) bug in scsiiom.c. And removes a redundant assignment in + tmscsim.c. + + Signed-off-by: Guennadi Liakhovetski + Signed-off-by: James Bottomley + + + [PATCH] drivers/scsi/megaraid.c: user/kernel pointer bugs + + From: "Robert T. Johnson" + + Since arg is a user pointer, so are uioc_mimd and uiocp, and hence umc is a + user pointer. Thus reading umc->xferaddr requires dereferencing a user + pointer, which isn't safe. + + Signed-off-by: Andrew Morton + Signed-off-by: James Bottomley + + + [PATCH] modular scsi/mca_53c9x doesn't work + + On Mon, Jun 14, 2004 at 08:22:15PM +0100, Christoph Hellwig wrote: + > On Mon, Jun 14, 2004 at 08:52:56PM +0200, Adrian Bunk wrote: + > > The issue described in the mail forwarded below is still present in + > > 2.6.7-rc3-mm2 (but not specific to -mm). + > > + > > I'd suggest the following workaround: + > + > Please add the exports instead. It'll affect all the other 53C9X-based + > drivers aswell. + + This sounds like a better solution. + + Signed-off-by: James Bottomley + + + [PATCH] Comment out an unused function in drivers/scsi/wd7000.c + + Eliminate unused function wd7000_abort() in wd7000 driver. + + CC [M] drivers/scsi/wd7000.o + drivers/scsi/wd7000.c:1612: warning: `wd7000_abort' defined but not used + + As the author states in his comment, this is "unfinished business" ;-) + + + From: Mika Kukkonen + Signed-off-by: Randy Dunlap + Signed-off-by: James Bottomley + + + Fix endless loop in SCSI SPI transport class + + If the driver doesn't update the peroid, we go + around forever. The fix is to keep our old period + unless the driver returns a greater one. + + Signed-off-by: James Bottomley + + + [PATCH] ia64: fix info in /proc/pal/*/bus_info + + This patch fixes to minor bugs: + - corrected descriptions for bit 52 and 53 of the /proc/pal/CPU*/bus_info + entry; they were swapped + - corrected a typo for bit 55 of the /proc/pal/CPU*/bus_info entry + + Signed-off-by: Stephane Eranian + Signed-off-by: David Mosberger + + + [ARM] Timer cleanup + + Signed-off-by: Deepak Saxena + + + [ARM] Remove bogus gettimeoffset ptr from machine_desc struct. + + This was accidently added during the timer code cleanup. + + Signed-off-by: Deepak Saxena + + + [ARM] Delete include/asm-arm/arch-nexuspci/time.h + + Signed-off-by: Deepak Saxena + + + [ARM] Delete include/asm-arm/arch-iop3xx/time.h + + Signed-off-by: Deepak Saxena + + + [ARM] Delete include/asm-arm/arch-ixp4xx/time.h + + Signed-off-by: Deepak Saxena + + + [ARM] Delete include/asm-arm/arch-versatile/time.h + + Signed-off-by: Deepak Saxena + + + [ARM] Add include/asm-arm/mach/time.h for shared timer definitions + + Signed-off-by: Deepak Saxena + + + [NET]: Update some sysctl documentation. + + I ran the following (crappy) script: + ... + In /proc/sys/ and found a host of undocumented sysctls. This patch documents + a number of them, and at least mentions the rest as 'TODO'. Please verify my + code-inspired documentation before applying! + + Signed-off-by: Bert Hubert + Signed-off-by: David S. Miller + + + [ECONET] kill some trivial warnings + + Signed-off-by: Arnaldo Carvalho de Melo + + + [NET]: Add tc extensions infrastructure. + + Signed-off-by: Jamal Hadi Salim + Signed-off-by: David S. Miller + + + [SELINUX]: Fix sock_orphan race. + + The patch below fixes a race between sock_orphan() and + selinux_socket_sock_rcv_skb() which can lead to a null pointer deref oops + under heavy load. The sk_callback_lock is used in the patch to + synchronize access to the incoming socket's inode security state. + + This patch has been under test in the Fedora kernel for over a month + without incident. + + Author: Stephen Smalley + Signed-off-by: James Morris + Signed-off-by: David S. Miller + + + [IPV6]: UDPv6 checksum. + + We always need to check UDPv6 checksum because it is mandatory. + + Author: Yoshifuji Hideaki + Signed-off-by: David S. Miller + + + [TCP]: Tweak some default sysctl values. + + tcp_default_win_scale: 7 + tcp_vegas_cong_avoid: 1 + tcp_moderate_rcvbuf: 1 + tcp_bic: 1 + + + [ATM]: Include compiler.h in atm.h + + + [NET]: Allow IP header alignment to be overriden. + + Author: Anton Blanchard + Signed-off-by: David S. Miller + + + [SELINUX]: Fine-grained Netlink support - SELinux headers + + This patch regenerates the SELinux module headers to reflect new class + and access vectors definitions. The size of the diff is misleading; + much of it is simply a change in the ordering of the automatically + generated definitions. The corresponding generation script has been + changed to ensure a stable order in the future. + + Author: Stephen Smalley + Signed-off-by: Stephen Smalley + Signed-off-by: James Morris + Signed-off-by: David S. Miller + + + [SELINUX]: Fine-grained Netlink support - move security_netlink_send() hook. + + This patch moves the security_netlink_send() LSM hook after the user copy, + so that LSM modules can safely examine skb payload content. For SELinux, + we need to look at the Netlink message type. + + Signed-off-by: James Morris + Signed-off-by: David S. Miller + + + [SELINUX]: Fine-grained Netlink support - add sk to netlink_send hook + + Modifies the LSM netlink_send() hook so that it takes a struct sock + parameter. SELinux will use this parameter to lookup the class of socket, + which was assigned during socket security initialization. + + Signed-off-by: James Morris + Signed-off-by: David S. Miller + + + [SELINUX]: Fine-grained Netlink support - SELinux changes + + This patch contains SELinux changes which add support for extended Netlink + socket classes and the associated permissions nlmsg_read and nlmsg_write. + + Signed-off-by: James Morris + Signed-off-by: David S. Miller + + + SCSI: fix uninitialised variable warning + + Spotted By: Andrew Morton + + drivers/scsi/scsi_transport_spi.c: In function `spi_dv_retrain': + drivers/scsi/scsi_transport_spi.c:393: warning: `period' might be used uninitialized in this function + + Signed-off-by: James Bottomley + + + [AGPGART] Re-add VIA VP3 support. + + The refactoring of the PCI IDs supported by the VIA driver dropped + this one. + + Spotted-by: Carsten Rietzschel + Signed-off-by: Dave Jones + + + scsi_debug: num_parts, ptype and (re-)scans + + From: Douglas Gilbert + + Changes in version 1.73: + - 'num_parts' parameter to specify 0 to 4 partitions + - 'ptype' to specify (or change via sysfs) SCSI + peripheral device type + - support ability to increase the number of targets + and/or luns then re-scan a scsi_debug host + - remove redundant trailing spaces + + The new facilties are described at: + http://www.torque.net/sg/sdebug26.html + A tarball of driver (version 1.73) is also there. + + Signed-off-by: James Bottomley + (conflict resolution) + + + [AGPGART] Delete trailing whitespace in generic routines. + + Bump copyright dates whilst we're there. + + Signed-off-by: Dave Jones + + + [NET]: Clear dev refs in dst->child. + + This is a resend of an earlier patch to dst_dev_event. I've changed + it slightly by moving the input/output assignment into dst_ifdown. + + To recap, this patch drops lingering IPsec references to a device that + is being unregistered. The child processing in the GC is too late + since it never runs until the reference on the dst hits zero which + could take a long time for things like TCP connections. + + The reason I've left the input/output assignment outside the loop is + because they aren't really necessary for the IPsec dst's, and if + it were in the loop then we'll have to do the same child processing + in ___dst_free as well. + + I've tested this with an ESP/IPCOMP tunnel and I can confirm that it + does fix the problem. + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [AGPGART] If we can't do AGP x8 in v3 mode, just drop back to x4. + + This should stop people seeing crazy stuff like agpgart + trying to set itself to x0 mode when it sees a x8 bridge and a x4 card. + + Signed-off-by: Dave Jones + + + [AGPGART] Show the untampered arguments in debug printk + + agp_v3_parse_one() does some changes to these args by the time we + get to the printk. It'll be useful to know what they started at. + + Signed-off-by: Dave Jones + + + PPC: Make Motorola CPM2 I/O core support more generic. + It's used on more than one CPU. + + + [IPV4]: Fix interface selection in multicast sockops. + + + PPC: Move CPM2 common core routines to arch/ppc/syslib/ + + + [AGPGART] Improved AGPx8 handling. + + If something fails, we should now explain what happened, + before we fall back to AGPx4 gracefully. + + Signed-off-by: Dave Jones + + + [AGPGART] Extra debugging info just in case. + + Signed-off-by: Dave Jones + + + [AGPGART] Remove typo from comment + + Signed-off-by: Dave Jones + + + [NET]: Tidy somaxconn sysctl doc. + + + PPC: Add support for ADS8272 board. + + From Kumar Gala + + + [TG3]: Always do 4gb tx dma test, and fix the test. + + Based upon a patch from Sun. + + + [TCP]: No vegas by default just yet. + + + fix throttle to limit number of requests to 50 on wire to server at one time. + + Signed-off-by: Steve French (sfrench@us.ibm.com) + + + [PATCH] add new via-velocity gigabit ethernet driver + + Contributed by VIA, cleaned up by Alan. + + + UART driver for Motorola CPM/CPM2 I/O core on 8xx/8xxx chips. + + + Remove old MPC82xx (CPM2) uart driver + + + PPC SBC82xx: Move RTC to 0xd0000000 to make room for PCI I/O stuff. + + + PCI host bridge support for Motorola MPC826x + + + Add support for i8259 IRQ controller on WindRiver PowerQUICC II + + + [PATCH] ia64: Support SN platform specific error features + + The SN prom supports fine grained error handling features, the OS needs + to tell the prom if the OS expects to use these platform specific + features. + + Signed-off-by: Keith Owens + Signed-off-by: David Mosberger + + + [PATCH] ia64: update sn2_defconfig + + Small patch to update the sn2_defconfig file. I just did a 'make oldconfig' + with the current sn2_defconfig and removed 8250 support. + Signed-off-by: David Mosberger + + + [IDE] Introduce SATA enable/disable config option + + This config option is introduced to help reduce user confusion, + and eliminate conflicts between the IDE driver (which is often + built into user kernels) and the new libata SATA driver. + + + [libata] Add NVIDIA SATA driver + + + [libata] put nvidia in Kconfig, in alphabetical order + + + ia64: Fix ia32 partial-page-list code to compile cleanly in more configs. + + + + ia64: Nuke two warnings in mca.c that showed in the simulator configuration. + + + Fix /proc/fs/cifs/Stats to handle larger return data, and correct Kconfig reference to /proc/fs/cifs/Stats + + Signed-off-by: Steve French (sfrench@us.ibm.com) + + + [libata/IDE nvidia] shuffle pci ids + + * Mark conflicting PCI ids with CONFIG_BLK_DEV_IDE_SATA + * Move not-yet-released PCI ids to libata sata_nv driver + + + [ACPI] *** Warning: "acpi_register_gsi" [drivers/serial/8250_acpi.ko] undefined! + + Signed-off-by: Andrew Morton + + + [ACPI] mp_find_ioapic() oops from mp_register_gsi() on device resume + Signed-off-by: Andrew Morton + + + [ACPI] delete "__init" from x86_64 version of mp_find_ioapic() + Signed-off-by: Arnd Bergmann + Signed-off-by: Andrew Morton + [ACPI] Fix a lockup which Sid Boyce + discovered with IOAPIC disabled. + + The problem was that drivers/serial/8250_acpi.c found COM1 in the ACPI + namespace and called acpi_register_gsi() to set up its IRQ. ACPI tells us + that the COM1 IRQ is edge triggered, active high, but acpi_register_gsi() + was ignoring the edge_level argument, so it blindly set the COM1 IRQ to be + level-triggered. + + Signed-off-by: Bjorn Helgaas + Signed-off-by: Andrew Morton + Change new Motorola copyright notices and email addresses to Freescale. + + Requested by Kumar Gala + + + Workaround for MPC826x PCI erratum #9. + + + fix typo in cifs kernel config option title + + Signed-off-by: Steve French (sfrench@us.ibm.com) + + + [SPARSE]: Get rid of warning in irtty_ioctl(). + + Don't really need verify_area because result of copy_to_user is checked. + Add annotation to get rid of sparse warnings. + + Signed-off-by: Stephen Hemminger + Signed-off-by: Jean Tourrilhes + Signed-off-by: David S. Miller + + + [SPARSE]: Add annotations to sock_filter.h + + Since sock_fprog is argument in ioctl, the filter pointer needs + to be annotated. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [BRIDGE]: Fix bridge sysfs improprely initialized kobject. + + The bridge sysfs interface introduced around 2.6.7-rc1 created a bad + entry in /sys because it didn't initialise the name member of the kobject. + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [SPARSE]: Annotate csum_and_copy_to_user(). + + + [SPARSE]: Get rid of warning in bridge ethtool ioctl. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [SPARSE]: Fix another net warning. + + Get rid of warning from assignment in conditional. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + Cset exclude: kuznet@ms2.inr.ac.ru|ChangeSet|20040616204246|05149 + + + [NET]: In unregister_netdevice(), do synchronize_net() before final dev_put(). + + This way we make sure that all destination cache updates + to remove references to this device are seen by entire + system before final destruction of the device. + + + [ACPI] PCI bus numbering workaround for ServerWorks + from David Shaohua Li + http://bugzilla.kernel.org/show_bug.cgi?id=1662 + + + [IPV6]: Fix OOPS in fragmentation. + + Incorrect SKB pointer is passed to output() callback + in ip6_fragment(). + + Work done by James Morris and Yoshifuji Hideaki. + + Signed-off-by: James Morris + Signed-off-by: Yoshifuji Hideaki + Signed-off-by: David S. Miller + + + [ARM] Consolidate various ARM timer fns. into single timer_tick() call. + + Signed-off-by: Deepak Saxena + + + [PATCH] USB: Only process ports with change events pending + + This patch adds a bit-array to the hub driver's private data structure, + used for storing the contents of the hub's interrupt status message. That + message indicates which ports have events pending (and whether the hub + itself has events pending). By only polling the status of the ports + listed in the bit-array we can save a fair amount of overhead in hub + communication. + + (The #error test added to hub.h is a little awkward, but it's purely + precautionary -- it won't matter until someone decides to support hubs + with more than 31 ports!) + + Also included in the patch, since this seemed the perfect opportunity for + it, is Byron's suggestion for handling hub events in the order in which + they were received. + + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: PhidgetServo driver fixes + + Here is a patch for the phidgetservo driver -- it was using memory after + kfree(), and using driver_info is much nicer. :) + + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] proper bios handoff in ehci-hcd + + Stuart Hayes here at Dell has identified this or/and mix-up in the + ehci-hcd driver. Because of this, ehci-hcd is not properly released by + BIOSes supporting full 2.0 and port behavior can then become erratic. + + (Code predates general availability of such BIOS firmware. This version + of the patch also fixes minor linewrap issues.) + + From: Gary Lerhaupt + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: add support for Buffalo LUA-U2-KTX + + Add support for Buffalo's LUA-U2-KTX, which is a AX8817X based usb + ethernet adapter. I just added the USB id and it worked like a dream. + + From: Neil Bortnak + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB Storage: Lexar Jumpshot CF reader + + This patch is required to fix up the jumpshot driver, and to supress + the 'unneeded entry' message for another device which uses the same + VID/PID/rev for multiple different versions of the device. + + Alan Stern cooked this patch up, originally. + + Signed-off-by: Matthew Dharm + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB Storage: unusual_devs.h update + + On Thu, 17 Jun 2004, Daniel Nouri wrote: + > I get this message when inserting my USB MMC card reader: + > + > usb 3-1: new full speed USB device using address 4 + > usb.agent[5388]: usb-storage: already loaded + > usb-storage: This device (04e6,0006,0205 S 01 P 01) has an unneeded Protocol entry in unusual_devs.h + > Please send a copy of this message to + + Thanks for letting us know. This patch will eliminate that log message. + + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Fix endian bug in g_file_storage + + This patch fixes a couple of places in g_file_storage where I forgot to + use proper byte-swapping. + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + ia64: Squish compiler-warning in perfmon.c when compiling for UP. + + + [ARM] Remove ADIFCC machine type + + The code is completely out of date, I am no longer maintaining it, + and nobdy has volunteered to do so; therefore, I am killing it. + + Signed-off-by: Deepak Saxena + + + ia64: Squish some more hazards & warnings for UP compile. + + + ia64: Fix build-problem when CONFIG_IA32 is not enabled. + + Without this fix, you'll get unresolved references to + sys_rt_sigaction(). + + + [PATCH] ia64: fix SN2 interrupt rerouting + + Signed-off-by: Patrick Gefre + Signed-off-by: David Mosberger + + + [PATCH] ia64: switching between CPEI & CPEP + + A couple of months ago Hidetoshi Seto from Fujitsu proposed + a patch to provide similar switching between interrupt mode + and polling mode for corrected platform events (CPE) as we + have for processor events (CMC) [with the obvious difference + that not all platforms support an interrupt for CPE]. + + I dusted it off and made a couple of very minor cleanups (which + Seto-san checked out last night on his test setup and confirmed + still passes). + + Signed-off-by: Tony Luck + Signed-off-by: David Mosberger + + + [XFS] No longer hold the BKL for the entire ioctl operation, + its not needed here. + + SGI Modid: xfs-linux:xfs-kern:173032a + Signed-off-by: nathans@sgi.com + + + [XFS] Remove a couple of redundant NULL parent inode pointer checks. + + SGI Modid: xfs-linux:xfs-kern:173033a + Signed-off-by: nathans@sgi.com + + + [XFS] Fix xfs_lowbit64, it mishandled zero in the high bits. + Cleanup a couple of other ffs users, since ffs(0) is apparently + undefined on some architectures. + + SGI Modid: xfs-linux:xfs-kern:173034a + Signed-off-by: nathans@sgi.com + + + [XFS] sparse: fix uses of macros before their definitions, etc. + + SGI Modid: xfs-linux:xfs-kern:173194a + Signed-off-by: nathans@sgi.com + + + [XFS] Change things to use new version of xfs_dm_init/xfs_dm_exit + + SGI Modid: xfs-linux:xfs-kern:173206a + Signed-off-by: nathans@sgi.com + + + [XFS] Fix non-dmapi build + + SGI Modid: xfs-linux:xfs-kern:173222a + Signed-off-by: nathans@sgi.com + + + [XFS] Ensure buffers that map to unwritten extents are only submitted + when properly setup. + + SGI Modid: xfs-linux:xfs-kern:173555a + Signed-off-by: nathans@sgi.com + + + [XFS] Sanitise the ACL initialisation macros. + + SGI Modid: xfs-linux:xfs-kern:173559a + Signed-off-by: nathans@sgi.com + + + [XFS] Remove unused MAC macros, never needed on Linux. + + SGI Modid: xfs-linux:xfs-kern:173561a + Signed-off-by: nathans@sgi.com + + + [XFS] Remove the one remaining, broken use of XFS_WRITEIO_LOG and + sanitize direct IO map blocks call. + + SGI Modid: xfs-linux:xfs-kern:173562a + Signed-off-by: nathans@sgi.com + + + [XFS] Fix flags argument to xfs_incore call on attr removal. + + SGI Modid: xfs-linux:xfs-kern:173563a + Signed-off-by: nathans@sgi.com + + + [XFS] Fix a race condition in the undo-delayed-write buffer routine. + + SGI Modid: xfs-linux:xfs-kern:173564a + Signed-off-by: nathans@sgi.com + + + [XFS] Fix up memory allocators to be more resilient. + + SGI Modid: xfs-linux:xfs-kern:173571a + Signed-off-by: nathans@sgi.com + + + [ACPI] fix passive cooling mode indicator (Luming Yu) + http://bugzilla.kernel.org/show_bug.cgi?id=1770 + + + [ACPI] avoid spurious interrupts on VIA + http://bugzilla.kernel.org/show_bug.cgi?id=2243 + + + [XFS] Fix for NFS+XFS data corruption problem. + See http://oss.sgi.com/bugzilla/show_bug.cgi?id=198 for full details. + + SGI Modid: xfs-linux:xfs-kern:173598a + Signed-off-by: nathans@sgi.com + + + Fix typo in name of CIFS Kconfig option and add rename stats + + + [PATCH] ppc64: Implement CONFIG_PREEMPT + + This implements CONFIG_PREEMPT for ppc64. Aside from the entry.S + changes to check the _TIF_NEED_RESCHED bit when returning from an + exception, there are various changes to make the ppc64-specific code + preempt-safe, mostly adding preempt_enable/disable or get_cpu/put_cpu + calls where needed. I have been using this on my desktop G5 for the + last week without problems. + + Signed-off-by: Paul Mackerras + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: Optimize exception/syscall entry/exit + + This rewrites the PPC64 exception entry/exit routines to make them + smaller and faster. + + In particular we no longer save all of the registers for the common + exceptions - system calls, hardware interrupts and decrementer (timer) + interrupts - only the volatile registers. The other registers are saved + and restored (if used) by the C functions we call. This involved + changing the registers we use in early exception processing from r20-r23 + to r9-r12, which ended up changing quite a lot of code in head.S. + Overall this gives us about a 20% reduction in null syscall time. + + Some system calls need all the registers (e.g. fork/clone/vfork and + [rt_]sigsuspend). For these the syscall dispatch code calls a stub that + saves the nonvolatile registers before calling the real handler. + + This also implements the force_successful_syscall_return() thing for + ppc64. + + Signed-off-by: Paul Mackerras + Signed-off-by: Linus Torvalds + + + [XFS] Fix up highmem build and error handling on inode shrink register. + + SGI Modid: xfs-linux:xfs-kern:173764a + Signed-off-by: nathans@sgi.com + + + [PATCH] alpha: fix discontigmem+initrd build + + From: Ivan Kokshaysky + + Compilation fails due to incorrect usage of NODE_DATA(). + + Reported by hpa. + + + [ACPI] handle SCI override to nth IOAPIC + http://bugzilla.kernel.org/show_bug.cgi?id=2835 + + + [IPV6] make several functions static in ip6_tunnel that should be. + + + [IPV6] XFRM: add missing xfrm6_policy_check(). + + + [IPV6] XFRM: support (uncompressed) tunnel mode ipcomp6 using xfrm6_tunnel infrastructure. + + + [XFRM] fix dependency issues for CONFIG_IPV6=m. + + + [ARM] Add support code for ARM hardware vector floating point + + This cset adds the code to handle the hardware vector floating point + unit found on some ARM926 and later CPUs. The hardware provides + an implementation for the common cases, and bounces exceptions for + other cases, which have to be handled in software, and signalling + SIGFPE as appropriate. + + + [PATCH] mm: flush TLB when clearing young + + Traditionally we've not flushed TLB after clearing the young/referenced bit, + it has seemed just a waste of time. Russell King points out that on some + architectures, with the move from 2.4 mm sweeping to 2.6 rmap, this may be a + serious omission: very frequently referenced pages never re-marked young, and + the worst choices made for unmapping. + + So, replace ptep_test_and_clear_young by ptep_clear_flush_young throughout + rmap.c. Originally I'd imagined making some kind of TLB gather optimization, + but don't see what now: whether worth it rather depends on how common + cross-cpu flushes are, and whether global or not. + + ppc and ppc64 have already found this issue, and worked around it by arranging + TLB flush from their ptep_test_and_clear_young: with the aid of pgtable rmap + pointers. I'm hoping ptep_clear_flush_young will allow ppc and ppc64 to + remove that special code, but won't change them myself. + + It's worth noting that it is Andrea's anon_vma rmap which makes the vma + available for ptep_clear_flush_young in page_referenced_one: anonmm and + pte_chains would both need an additional find_vma for that. + + Signed-off-by: Hugh Dickins + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] mm: pretest pte_young and pte_dirty + + Test for pte_young before going to the costlier atomic test_and_clear, as + asm-generic does. Test for pte_dirty before going to the costlier atomic + test_and_clear, as asm-generic does (I said before that I would not do so for + pte_dirty, but was missing the point: there is nothing atomic about deciding + to do nothing). But I've not touched the rather different ppc and ppc64. + + Signed-off-by: Hugh Dickins + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32: support for e500 and 85xx + + Here is both a GNU style and BK patch for adding support for the e500 core and + 85xx platform to 2.6. This is pretty much a direct port from 2.4 with a bit + of cleanup around the edges. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32 irq.c cpumask fix + + 2.6.7-rc3-mm1 changed cpumask_t from ulong to a struct, causing + compile-time errors in arch/ppc/kernel/irq.c. + + Proposed fix below. Tested on a G3. + + Signed-off-by: Mikael Pettersson + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: avoid multiline /proc/cmdline content on iSeries + + /proc/cmdline is filled via an OS400 call iSeries_init(). It scans the + returned data from the end, instead of the beginning. This leads to + multiple lines in /proc/cmdline + + Just scan from the beginning and stop at the first newline. This patch + changes also the /proc/iSeries/mf/*/cmdline interface to do the same as the + initial setup. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Add PPC4xx MAINTAINERS entry, merge CREDITS from 2.4 + + Add myself as the PPC4xx maintainer. Merge CREDITS entry from 2.4 + + Signed-off-by: Matt Porter + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Handle non-readable binfmt_misc executables + + + + I work in a group that works on enabling the IA-32 Execution Layer + (http://www.intel.com/pressroom/archive/releases/20040113comp.htm) on Linux. + In a few words - this is a dynamic translator for IA-32 binaries on IPF + platform. Following David Mosberger's advice - we use the binfmt_misc + mechanism for the invocation of the translator whenever the user tries to + exec an IA-32 binary. + + The EL is meant to help in the migration path from IA-32 to IPF. From our + beta customers we learnt that at first stage - they tend to keep their + environment mostly intact, using the legacy IA-32 binaries. + + Such an environment has, naturally, setuid and non-readable binaries. It + will be useless to ask the administrator to change the settings of such an + environment - some of them are very complex, and the administrators are + reluctant to make any changes in a system that already proved itself to be + robust and secure. So, our target with these patches is not to enhance the + support for scripts but rather to allow a translator to be integrated into a + working environment that is not (and should not be) aware to the fact it's + being emulated. + + As I said before - it is practically hopeless to expect an administrator of + such a system to change it so that it will suit the current behavior of + binfmt_misc. But, even if we could do that, + + I'm not sure it would be a good idea - these changes are likely to be less + secure than the suggested patches - + + - In order to execute non-readable binaries the binary will have to be made + readable, which is obviously less secure than allowing only a trusted + translator to read it + + - There will be no way for the translator to calculate the accurate + AT_SECURE value for the translated process. This might end up with the + translated process running in a non-secured mode when it actually needs to + be secured. + + + + + I prepared a patch that solves a couple of problems that interpreters have + when invoked via binfmt_misc. currently - + + 1) such interpreters cannot open non-readable binaries + + 2) the processes will have their credentials and security attributes + calculated according to interpreter permissions and not those of the + original binary + + the proposed patch solves these problems by - + + 1) opening the binary on behalf of the interpreter and passing its fd + instead of the path as argv[1] to the interpreter + + 2) calling prepare_binprm with the file struct of the binary and not the + one of the interpreter + + The new functionality is enabled by adding a special flag to the registration + string. If this flag is not added then old behavior is not changed. + + A preliminary version of this patch was sent to the list on 9/1/2003 with the + title "[PATCH]: non-readable binaries - binfmt_misc 2.6.0-test4". This new + version fixes the concerns that were raised by the patch, except of calling + unshare_files() before allocating a new fd. this is because this feature did + not enter 2.6 yet. + + + Arun Sharma says: + + We were going through an internal review of this patch: + + http://marc.theaimsgroup.com/?l=linux-kernel&m=107424598901720&w=2 + + which is in your tree already. I'm not sure if this line of code got + sufficient review. + + + /* call prepare_binprm before switching to interpreter's file + + * so that all security calculation will be done according to + + * binary and not interpreter */ + + retval = prepare_binprm(bprm); + + The case that concerns me is: unprivileged interpreter and a privileged + binary. One can use binfmt_misc to execute untrusted code (interpreter) with + elevated privileges. One could argue that all binfmt_misc interpreters are + trusted, because only root can register them. But that's a change from the + traditional behavior of binfmt_misc (and binfmt_script). + + + (Update): + + Arun pointed out that calculating the process credentials according to the + binary that needs to be translated is a bit risky, since it requires the + administrator to pay extra attention not to register an interpreter which is + not intended to run with root credentials. + + After discussing this issue with him, I would like to propose a modified + patch: The old patch did 2 things - 1) open the binary for reading and 2) + calculate the credentials according to the binary. + + I removed the riskier part of changing the credentials calculation, so the + revised patch only opens the binary for reading. It also includes few words + of warning in the description of the 'open-binary' feature in + binfmt_misc.txt, and makes the function entry_status print the flags in use. + + As for the 'credentials' part of the patch, I will prepare a separate patch + for it and send it again to the LKML, describe the problem and ask for people + comments. + + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + Enable clustering in the 53c700 driver + + Signed-off-by: James Bottomley + + + [PATCH] binfmt_misc: improve calculation of interpreter's credentials + + This patch allows for misc binaries to run with credentials and security + token that are calculated according to the binaries, and not according to the + interpreter, which is the legacy behavior of binfmt_misc. + + The way it is done is by calling prepare_binprm, which is where these + attributes are calculated, before switching the 'file' field in the bprm from + the binary to the interpreter. + + This feature should be used with care, since the interpreter will have root + permissions when running a setuid binary owned by root. + + Please note - + + - Only root can register an interpreter with binfmt_misc. The feature is + documented and the administrator is advised to handle it with care + + - The new feature is enabled only with a special flag in the registration + string. When this flag is not specified the current behavior of + binfmt_misc is kept + + - This is the only 'right' way for an interpreter to know the correct + AT_SECURE value for the interpreted binary + + + From: Chris Wright + + This patchset looks OK, except for one problem. It installs the fd (which + could've been unreadable) without unsharing the ->files. So someone can use + this to read unreadable yet executable files. Here's a patch which fixes + that up. I added one bit that's commented out because I'm not positive if a + final steal_locks() is needed. + + I did a fair amount of rearranging to simplify the error conditions + relative to the fd_install(), and unshare_files(). + + From: Chris Wright + + I found that the intel patchset (and mine as well) leaked i_writecount on + the original executed file. In addition, I verified that the steal_locks() + bit is indeed needed. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Clean up asm/pgalloc.h include + + This patch cleans up needless includes of asm/pgalloc.h from the fs/ + kernel/ and mm/ subtrees. Compile tested on multiple ARM platforms, and + x86, this patch appears safe. + + This patch is part of a larger patch aiming towards getting the include of + asm/pgtable.h out of linux/mm.h, so that asm/pgtable.h can sanely get at + things like mm_struct and friends. + + I suggest testing in -mm for a while to ensure there aren't any hidden arch + issues. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Clean up asm/pgalloc.h include + + This patch cleans up needless includes of asm/pgalloc.h from the drivers/ + subtree. drivers/char/mem.c has been compile tested; the others have not, + since they are for non-x86 and non-ARM architectures. + + This patch is part of a larger patch aiming towards getting the include of + asm/pgtable.h out of linux/mm.h, so that asm/pgtable.h can sanely get at + things like mm_struct and friends. + + I suggest testing in -mm for a while to ensure there aren't any hidden arch + issues. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Clean up asm/pgalloc.h include 3 + + This patch cleans up needless includes of asm/pgalloc.h from the arch/i386/ + subtree. Compile tested on x86_pc SMP. + + [I also tried VISWS + SMP without PM doesn't build in smpboot.c, + though I don't believe its caused by this patch. With PM, fails + to link complaining maxcpus is undefined. Therefore, I presume + VISWS + SMP is an invalid configuration.] + + This patch is part of a larger patch aiming towards getting the include of + asm/pgtable.h out of linux/mm.h, so that asm/pgtable.h can sanely get at + things like mm_struct and friends. + + I suggest testing in -mm for a while to ensure there aren't any hidden arch + issues. + + The outstanding list of files for other architectures can be found + at http://www.arm.linux.org.uk/misc/pgalloc.txt + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: uninline __pte_free_tlb() + + The pgalloc.h changes broke ppc64: + + In file included from include/asm-generic/tlb.h:18, + from include/asm/tlb.h:24, + from arch/ppc64/mm/hash_utils.c:48: + include/asm/pgalloc.h: In function `__pte_free_tlb': + include/asm/pgalloc.h:110: dereferencing pointer to incomplete type + include/asm/pgalloc.h:111: dereferencing pointer to incomplete type + + Uninlining __pte_free_tlb() fixes that. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] reiserfs: block allocator optimizations + + From: + From: + + The current reiserfs allocator pretty much allocates things sequentially + from the start of the disk, it works very nicely for desktop loads but + once you've got more then one proc doing io data files can fragment badly. + + One obvious solution is something like ext2's bitmap groups, which puts + file data into different areas of the disk based on which subdirectory + they are in. The problem with bitmap groups is that if you've got a + group of subdirectories their contents will be spread out all over the + disk, leading to lots of seeks during a sequential read. + + This allocator patch uses the packing locality to determine which bitmap + group to allocate from, but when you create a file it looks in the bitmaps + to see how 'full' that packing locality already is. If it hasn't been + heavily used yet, the packing locality is inherited from the parent + directory putting files in new subdirs close to the parent subdir, + otherwise it is the inode number of the parent directory putting new + files far away from the parent subdir. + + The end result is fewer bitmap groups for the same working set. For + example, one test data set created by 20 procs running in parallel has + 6822 subdirs. And with vanilla reiserfs that would mean 6822 + packing localities. This patch turns that into 26 packing localities. + + This makes sequential reads of big directory trees more efficient, but + it also makes the btree more efficient in general. Things end up sorted + better because groups of subdirs end up with similar keys in the btree, + instead of being spread out all over. + + The bitmap grouping code tries to use the start of each bitmap group + for metadata, and offsets the data slightly. The data and metadata + are still close together, but not completely intermixed like they are + in the default allocator. The end result is that leaf nodes tend to be + close to each other, making metadata readahead more effective. + + The old block allocator had the ability to enforce a minimum + allocation size, but did not use it. It now tries to do a pass looking + for larger allocation chunks before falling back to the old behaviour + of taking any blocks it can find. + + The patch changes the defaults to: + + mount -o alloc=skip_busy:dirid_groups:packing_groups + + You can get back the old behaviour with mount -o alloc=skip_busy + + mount -o alloc=dirid_groups will turn on the bitmap groups + mount -o alloc=packing_groups turns on the packing locality reduction code + mount -o alloc=skip_busy:dirid_groups turns on both dirid_groups and + skip_busy + + Finally the patch adds a mount -o alloc=oid_groups, which puts files into + bitmap groups based on a hash of their objectid. This would be used for + databases or other situations where you have a limited number of very + large files. + + This command will tell you how many packing localities are actually in + use: + + debugreiserfs -d /dev/xxx | grep '^|.*SD' | sed 's/^.....//' | awk '{print $1}' | sort -u | wc -l + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] reiserfs: block allocator should not inherit "packing locality 1" + + reiserfsck --rebuild-tree expects the only key with a packing locality of 1 to + be for the root directory (key [1 2]). The new block allocator inherited that + packing locality down to subdirectories, which triggers failures in reiserfsck + --rebuild-tree + + reiserfsck in readonly check mode doesn't complain about this, thanks to Jeff + Mahoney for finding it. + + The fix is to never inherit packing locality #1 + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] reiserfs: remove debugging warning from block allocator + + Remove debugging warning from the reiserfs block allocator code + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] reiserfs: btree readahead + + Walking the btree can trigger a number of single block synchronous reads. + This patch does btree readahead during operations that are likely to be long + and sequential. So far, that only includes directory reads and truncates, but + it can make both much faster. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] reiserfs data logging support + + Add data=journal support for reiserfs + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] PATCH: Further aacraid work + + I've been going through Mark's changes with a fine toothcomb and this merges + most of them. Its tested on 64bit SMP hardware and seems to be fine. There + are a couple of Mark's changes I've left out for now but there isnt really + an easy way to break down the changes further. + + This fixes a whole host of problems including random hangs under high load + + Signed-off-by: Alan Cox + + Original contribution under GPL from Adaptec, updates checking by Red Hat + + Signed-off-by: James Bottomley + + + [PATCH] Fixes for idr code + + * On a 32-bit architecture, the idr code will cease to work if you add + more than 2^20 entries. You will not be able to find many of the + entries. The problem is that the IDR code uses 5-bit chunks of the + number and the lower portion used by IDR is 24 bits, so you have one bit + that leaks over into the comparisons that should not be there. The + solution is to mask off that bit before doing IDR processing. This + actually causes the POSIX timer code to crash if you create that many + timers. I have included an idr_test.tar.gz file that demonstrates this + with and without the fix, in case you need more evidence :). + + * When the IDR fills up, it returns -1. However, there was no way to + check for this condition. This patch adds the ability to check for the + idr being full and fixes all the users. It also fixes a problem in + fs/super.c where the idr code wasn't checking for -1. + + * There was a race condition creating POSIX timers. The timer was added + to a task struct for another process then the data for the timer was + filled out. The other task could use/destroy time timer as soon as it is + in the task's queue and the lock is released. This moves settup up the + timer data to before the timer is enqueued or (for some data) into the + lock. + + * Change things so that the caller doesn't need to run idr_full() to find + out the reason for an idr_get_new() failure. + + Just return -ENOSPC if the tree was full, or -EAGAIN if the caller needs + to re-run idr_pre_get() and try again. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] idr: remove counter bits from id's + + idr_get_new() currently returns an incrementing counter in the top 8 bits of + the counter. Which means that most users have to mask it off again, and we + only have a 24-bit range. + + So remove that counter. Also: + + - Remove the BITS_PER_INT define due to namespace collision risk. + + - Make MAX_ID_SHIFT 31, so counters have a 0 to 2G-1 range. + + - Why is MAX_ID_SHIFT using sizeof(int) and not sizeof(long)? If it's for + consistency across 32- and 64-bit machines, why not just make it "31"? + + - Does this still hold true with the counter removed? + + /* We can only use half the bits in the top level because there are + only four possible bits in the top level (5 bits * 4 levels = 25 + bits, but you only use 24 bits in the id). */ + + If not, what needs to change? + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] IDR fixups + + There were definately some problems in there. I've made some changes and + tested with a lot of bounds. I don't have a machine with enough memory to + fill it up (it would take ~16GB on a 64-bit machine), but I use the "above" + code to simulate a lot of situations. + + The problems were: + + * IDR_FULL was not the right value + * idr_get_new_above() was not defined in the headers or documented. + * idr_alloc() bug-ed if there was a race and not enough memory was + allocated. It should have returned NULL. + * id will overflow when you go past the end. + * There was a "(id >= (1 << (layers*IDR_BITS)))" comparison, but at + the top layer it would overflow the id and be zero. + * The allocation should return ENOSPC for an "above" value with + nothing above it, but it returned EAGAIN. + + I have not tested on 64-bits (as I don't have a 64-bit machine). + + I've included the files, a diff from the previous version, and my test + programs. + + For the test programs, idr_test will just attempt to allocate + elements, check them, free them, and check them again. + + idr_test2 will allocate element with between + them. + + idr_test3 just tests some bounds and tries all values with just a few in + the idr. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] i2c fixups for idr API change + + Fix up the i2c code which uses the IDR library. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] RLIM: add rlimit entry for controlling queued signals + + The following patches introduce per user rlimits for both queued signals and + POSIX message queues. The changes touch all the arches resource.h files as + well as init_task.c to get the rlimit defaults setup. + + Both require caching the user_struct to avoid problems with setuid(). + + The signal changes makes some small changes to send_signal() to pass along the + task being signalled to get proper accounting for signals initiated in + interrupt. Thanks to Marcelo for getting this one going. + + + This patch: + + Add an rlimit entry to control the maximum number of pending signals a user + may have. This is essentially just the resource.h changes. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] RLIM: add sigpending field to user_struct + + Add sigpending field to user_struct, and make sure it's properly initialized. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] RLIM: add simple get_uid() helper + + Add simple helper function to grab a reference to a user_struct. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] RLIM: add rlimit entry for POSIX mqueue allocation + + Add an rlimit entry to control the maximum number of bytes a user can allocate + to a POSIX mqueue. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] RLIM: add mq_bytes to user_struct + + Add mq_bytes field to user_struct, and make sure it's properly initialized. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] RLIM: add mq_attr_ok() helper + + Add helper function mq_attr_ok() to do mq_attr sanity checking, and do some + extra overlow checking. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] RLIM: enforce rlimits for POSIX mqueue allocation + + Add a user_struct to the mq_inode_info structure. Charge the maximum number + of bytes that could be allocated to a mqueue to the user who creates the + mqueue. This is checked against the per user rlimit. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] RLIM: adjust default mqueue sizes + + Lower default sizes for POSIX mqueue allocation now that rlimits are in place. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] HPET driver + + The driver supports the High Precision Event Timer. The driver has adopted + a similar API to the Real Time Clock driver. It can support any number of + HPET devices and the maximum number of timers per HPET device. For further + information look at the documentation in the patch. + + Thanks to Venki at Intel for testing the driver on X86 hardware with HPET. + + HPET documentation is available at http://www.intel.com/design/chipsets/datashts/252516.htm + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] SCSI Flexible timout intfrastructure + + The object of this infrastructure is to give HBAs early warning that + error handling is about to happen and also provide them with the + opportunity to do something about it. + + It introduces the extra template callback: + + eh_timed_out() + + which scsi_times_out() will call if it is populated to notify the LLD + that an outstanding command took a timeout. + + There are three possible returns: + + EH_HANDLED: I've fixed the problem, please complete the command for me + (as soon as the timer fires, scsi_done will do nothing, so the timer + itself will call a special version of scsi_done that doesn't check the + timer). + + EH_NOT_HANDLED: Invoke error recovery as normal + + EH_RESET_TIMER: The command will complete, reset the timer to its + original value and start it ticking again. + + Signed-off-by: James Bottomley + Based on work by Christoph Hellwig and Luben Tuikov + + + [PATCH] Remove PC9800 support + + PC9800 sub-arch is incomplete, hackish (at least in IDE), maintainers don't + reply to emails and haven't touched it in awhile. Can't even config it to + try to build it without other patches to the kernel tree. + + bk-rm-script: + + #! /bin/sh + bk rm -r ./arch/i386/mach-pc9800 + bk rm -r ./arch/i386/boot98 + bk rm ./drivers/char/lp_old98.c + bk rm ./drivers/serial/serial98.c + bk rm ./drivers/scsi/scsi_pc98.c + bk rm ./drivers/scsi/pc980155.c + bk rm ./drivers/scsi/pc980155.h + bk rm ./drivers/block/floppy98.c + bk rm ./drivers/input/keyboard/98kbd.c + bk rm ./drivers/input/serio/98kbd-io.c + bk rm ./drivers/input/misc/98spkr.c + bk rm ./drivers/input/mouse/98busmouse.c + bk rm ./drivers/ide/legacy/pc9800.c + bk rm ./drivers/ide/legacy/hd98.c + bk rm -r ./include/asm-i386/mach-pc9800 + bk rm ./include/asm-i386/pc9800_sca.h + bk rm ./include/asm-i386/pc9800.h + bk rm ./fs/partitions/nec98.c + bk rm ./fs/partitions/nec98.h + bk rm ./sound/isa/cs423x/pc98.c + bk rm ./sound/isa/cs423x/pc9801_118_magic.h + bk rm ./sound/isa/cs423x/sound_pc9800.h + + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] more PC9800 removal + + Removes more PC9800 code. + + Requires: + + bk rm drivers/char/upd4990a.c + bk rm drivers/net/ne2k_cbus.c + bk rm drivers/net/ne2k_cbus.h + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] pc9800: merge std_resources.c back into setup.c + + std_resources.{c,h} was only split off due to pc9800 wanting to override it. + With it gone, it might as well be merged back in. Doesn't change any code. + It was compiled and booted. + + This time this also actually doesn't break compilation of any of the + subarches. That's to say, any further. I guess it might have been my .config + (my regular PC config, with just the subarch switched through menuconfig) or + O=, but only ELAN actually compiled. Voyager and VISWS bombed out at the + final link and NUMAQ much sooner (with "physnode_map undeclared" during + compilation of numaq.c). + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Ext3: Retry allocation after transaction commit (v2) + + Here is a reworked version of my patch to ext3 to retry certain filesystem + operations after an ENOSPC error. The ext3_should_retry_alloc() function will + not wait on the currently running transaction if there is a currently active + handle; hence this should avoid deadlocks in the Lustre use case. The patch + is versus BK-recent. + + I've also included a simple, reliable test case which demonstrates the problem + this patch is intended to fix. (Note that BK-recent is not sufficient to + address this test case, and waiting on the commiting transaction in + ext3_new_block is also not sufficient. Been there, tried that, didn't work. + We need to do the full-bore retry from the top level. The + ext3_should_retry_alloc() will only wait on the committing transaction if + there is an active handle; hence Lustre will probably also need to use + ext3_should_retry_alloc() if it wants to reliably avoid this particular + problem.) + + #!/bin/sh + # + # + TEST_DIR=/tmp + IMAGE=$TEST_DIR/retry.img + MNTPT=$TEST_DIR/retry.mnt + TEST_SRC=/usr/projects/e2fsprogs/e2fsprogs/build + MKE2FS_OPTS="" + IMAGE_SIZE=8192 + + umount $MNTPT + dd if=/dev/zero of=$IMAGE bs=4k count=$IMAGE_SIZE + mke2fs -j -F $MKE2FS_OPTS $IMAGE + + function test_log () + { + echo $* + logger -p local4.notice $* + } + + mkdir -p $MNTPT + mount -o loop -t ext3 $IMAGE $MNTPT + test_log Retry test: BEGIN + for i in `seq 1 3` + do + test_log "Retry test: Loop $i" + echo 2 > /proc/sys/fs/jbd-debug + while ! mkdir -p $MNTPT/foo/bar + do + test_log "Retry test: mkdir failed" + sleep 1 + done + echo 0 > /proc/sys/fs/jbd-debug + cp -r $TEST_SRC $MNTPT/foo/bar 2> /dev/null + rm -rf $MNTPT/* + done + umount $MNTPT + test_log "Retry test: END" + + + akpm@osdl.org + + Rework the code to make it a formal JBD API entry point. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Use first-fit for pty allocation + + (With Andrew Morton). + + The current dynamic pty allocation scheme has a few problems: + + - pty numbers grow to be very large, causing wtmp file bloat. + + - Seems to break libc5 and some old applications + + So change it to do first-fit. An IDR tree is used to provide a + logarithmic-time search. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] small tweaks to standard resource stuff + + Various small tweaks. Compiled and booted. + + 1. add IORESOURCE_BUSY | IORESOURCE_MEM also for the kernel code and + data resources. I don't believe this actually matters one bit, but + they're hooked into a BUSY/MEM parent ("System RAM") and marking + them busy seems to make sense. + + 2. delete the .start = 1M default for the kernel code resource. This + isn't actually a change; it's set to virt_to_phys(_text) in + setup_arch() overriding any default anyways. + + 3. s/vram_resource/video_ram_resource/. Lines up much nicer with + video_rom_resource... + + 4. s/checksum/romchecksum/. setup.c is a fairly large file, and + "checksum" pollutes the namespace. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] same small resource tweaks, x86_64 version + + The same small tweaks for x86_64. Just to keep the two in sync. One + additional wrinkle: vram_resource was exported to e820.c, which didn't + actually use it. Undo that. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] getgroups16() fix + + sys_getgroups16 (or rather groups16_to_user()) returns large gids + truncated. Needs to be fixed, one way or another. Don't know why the + other similar casts are still there. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Check return status of register calls in i82365 + + i82365 calls driver_register and platform_device_register without checking + their return values. This patch fixes that. + + It also runs platform_device_register() prior to isa_probe() so we don't have + to undo ise_probe()'s effects if platform_device_register() ends up failing. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] invalidate_inodes2(): mark pages not uptodate + + Andrea Arcangeli points out that invalidate_inode_pages2() is + supposed to mark mapped-into-pagetable pages as not uptodate so that next time + someone faults the page in we will go get a new version from backing store. + + The callers are the direct-io code and the NFS "something changed on the + server" code. In both these cases we do need to go and re-read the page. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Fix read() vs truncate race + + do_generic_mapping_read() + { + isize1 = i_size_read(); + ... + readpage + copy_to_user up to isize1; + } + + readpage() + { + isize2 = i_size_read(); + ... + read blocks + ... + zero-fill all blocks past isize2 + } + + If a second thread runs truncate and shrinks i_size, so isize1 and isize2 are + different, the read can return up to a page of zero-fill that shouldn't really + exist. + + The trick is to read isize1 after doing the readpage. I realised this is the + right way to do it without having to change the readpage API. + + The patch should not cost any cycles when reading from pagecache. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] io_apic.c code consolidation + + This cleans up io_apic.c a bit -- I do not really like 4 copies of same + code. + + Ingo said: + + yeah, agreed - i checked & test it, it's ok. I made a small + modification (see the patch below) to uninline the __modify_IO_APIC_irq() + function - shaving 0.5K off the kernel's size. + + Signed-off-by: Ingo Molnar + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] x86: remove APIC_LOCKUP_DEBUG + + the patch below gets rid of APIC_LOCKUP_DEBUG. It has been in the kernel + for more than 3 years and the message was only reported once during that + period of time - and even in that case it was a side-effect of a really bad + crash. The lockup workaround works, the debugging code can be moved out. + + Signed-off-by: Ingo Molnar + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] x86: remove io_apic_sync + + The patch below gets rid of io_apic_sync(). + + io_apic_sync() was introduced in 2.1.104 and it was originally done for + masking and unmasking as well. Later the unmasking use got removed but the + masking use lingered around. I dont think it was ever justified to do it + and clearly since the lack of io_apic_sync() didnt break some of the other + writes we do to the IO-APIC registers, it must be unnecessary in the + masking case too. + + Signed-off-by: Ingo Molnar + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ahc1542 !CONFIG_MCA build fix + + The old 1542 scsi driver is both ISA and MCA. The MCA portions are disabled + when !CONFIG_MCA through the typical wrapper scheme (a la pci.h and + !CONFIG_PCI). However... the driver unconditionally includes linux/mca.h + which in turn unconditionally includes asm/mca.h. + + This breaks drivers on platforms with ISA but not MCA, like alpha. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Validate PM-Timer rate at boot time + + Add a check to the PM-Timer initialization code. It validates the PM-Timer + rate against PIT channel 2 and rejects the PM-Timer if its rate is not + withing 5% of the expected number. + + Rationale: + + The PMTMR timers of certain (older) mainboards are running at invalid + rates, often much faster than the rate expected by the PM-Timer code. This + causes the system clock to run much too fast. See also + http://bugme.osdl.org/show_bug.cgi?id=2375 + + Possible workarounds are disabling the PM-Timer in the kernel config or + disabling the PM-Timer at boot time through the "clock=tsc" parameter. + However, we believe it is more user friendly to automatically validate the + PM-Timer rate at boot time before using it as the system time source. + + Tested by me (with broken timer) and John Stultz (with good timer) and + believed to be ok. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix 3c59x.c to allow 3c905c 100bT-FD + + Fix the 3c905C 10/100 transceiver initialisation woes. + + (This was reverted from 2.6.7-rcX, but the bug reporter said the failure + turned out to be unrepeatable). + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] make the 3c59x/3c90x driver somewhat more reliable + + The existing driver violates basic PCI rules in several places making it + unusable for basic things like DHCP in Fedora Core. This patch removes all + the situations I can find where it writes to the device while in D3 state + and breaks stuff. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] BSD accounting format rework + + BSD accounting format rework: + + Use all explicit and implicit padding in struct acct to + + - correctly report 32 bit uid/gid, + - correctly report jobs (e.g., daemons) running longer than 497 days, + - increase the precision of ac_etime from 2^-13 to 2^-20 + (i.e., from ~6 hours to ~1 min. after a year) + - store the current AHZ value. + - allow cross-platform processing of the accounting file + (limited for m68k which has a different size struct acct). + - introduce versioning for smooth transition to incompatible formats in + the future. Currently the following version numbers are defined: + 0: old format (until 2.6.7) with 16 bit uid/gid + 1: extended variant (binary compatible to v0 on M68K) + 2: extended variant (binary compatible to v0 on everything except M68K) + 3: a new binary incompatible format (64 bytes) + 4: new binary incompatible format (128 bytes). + layout of its first 64 bytes is the same as for v3. + 5: marks second half of new binary incompatible format (128 bytes) + (layout is not yet defined) + + All this is accomplished without breaking binary compatibility. 32 bit + uid/gid support is compatible with the patch previously floating around and + used e.g. by Red Hat. + + This patch also introduces a config option for a new, binary incompatible + "version 3" format that + + - is uniform across and properly aligned on all platforms + - stores pid and ppid + - uses AHZ==100 on all platforms (allows to report longer times) + + Much of the compatibility glue goes away when v1/v2 support is removed from + the kernel. Such a patch is at + + http://www.physik3.uni-rostock.de/tim/kernel/2.7/acct-cleanup-04.patch + + and might be applied in the 2.7 timeframe. + + The new v3 format is source compatible with current GNU acct tools (6.3.5). + However, current GNU acct tools can be compiled for only one format. As there + is no way to pass the kernel configuration to userspace, with my patch it will + still only support the old v2 format. Only if v1/v2 support is removed from + the kernel, recompiling GNU acct tools will yield v3 support. + + A preliminary take at the corresponding work on cross-platform userspace tools + (GNU acct package) is at + + http://www.physik3.uni-rostock.de/tim/kernel/utils/acct/ + + This version of the package is able to read any of the v0/v2/v3 formats, + regardless of byte-order (untested), even within the same file. + Cross-platform compatibility with m68k (v1 format) is not yet implemented, but + native use on m68k should work (untested). pid and ppid are currently only + shown by the dump-acct utility. + + Thanks to Arthur Corliss, Albert Cahalan and Ragnar Kjørstad for their + comments, and to Albert Cahalan for the u64->IEEE float conversion code. + + Signed-off-by: Tim Schmielau + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] iso9660: fix handling of inodes beyond 4GB + + This is my fourth attempt to patch the isofs code. It is similar to the last + posting except this one implements the NFS get_parent() method which has + always been missing. + + The original problem I set out to addresses is that the current iso9660 file + system cannot reach inodes located beyond the 4GB barrier. This is caused by + using the inode number as the byte offset of the inode data. Being 32-bits + wide, the inode number is unable to reach inode data that does not reside on + the first 4GB of the file system. + + This causes real problems with "growisofs" + + http://fy.chalmers.se/~appro/linux/DVD+RW/#isofs4gb + + and my pet project "shunt" + + http://www.serice.net/shunt/ + + This patch switches the isofs code from iget() to iget5_locked() which allows + extra data to be passed into isofs_read_inode() so that inode data anywhere on + the disk can be reached. + + The inode number scheme was also changed. Continuing to use the byte offset + would have resulted in non-unique inodes in many common situations, but + because the inode number no longer plays any role in reading the meta-data off + the disk, I was free to set the inode number to some unique characteristic of + the file. I have chosen to use the block offset which is also 32-bits wide. + + Lastly, the pre-patch code uses the default export_operations to handle + accessing the file system through NFS. The problem with this is that the + default NFS operations assume that iget() works which is no longer the case + because of the necessity of switching to iget5_locked(). So, I had to + implement the NFS operations too. As a bonus, I went ahead and implemented + the NFS get_parent() method which has always been missing. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] iso9660: NFS fix + + Make all inode numbers unique for images less than 128GB in size. Required + for knfsd. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] SCSI whitelist changes + + The BLIST_REPORTLUN2 blacklist item has exactly the behavior that + the MYLEX DACARMRB (and SGI TP9100, which is really a 2Gb upgrade + to the DACARMRB) need. + + These devices use a PQ of 1 instead of 3 for unconfigured luns, + which means that every RAID has 32 luns, many or most of which + are just phantoms. + + However, it does support Report Luns, and it returns the correct + data. + + Signed-off-by: James Bottomley + + + [PATCH] sisfb update 1.7.10 + + attached is an update for the sisfb driver to version 1.7.10. + + This update includes + + - fixes for pure 64bit and 32/64bit mixed systems (add ioctl conversion; + fix variable sizes, etc; REQUIRED for current X.org/XFree86 on 64bit + systems, even if pure 64bit), + + - fixes for 301C video bridge, (scales TV output correctly now) + + - fixes for 1600x1200 and 1400x1050 LCD panels, + + - many fixes for 661/741/760 (amongst others, proper LFB support for the + 760 and corrections for SiS' new BIOS data layout; would lead to display + corruption with old driver) + + - add support for many modes for LCD which were unsupported previously, + + - add support for HiVision and YPbPr HDTV + + - "vga=" statement now honoured properly (sisfb will set the same mode as + the kernel did by default) + + - use LCD native resolution mode if no mode is given + + - a major clean up of main driver code, + + - radical removal of duplicate (or nearly duplicate) code, + + - switched to 2.6 module_param macros, + + - enhanced communication with the X driver, + + - added eventual POSTing of SiS300/305 card for non-x86 archs, + + - added ability to relocate the image on the TV screen using a userland + tool, + + - added Documentation/fb/sisfb.txt (why the heck was this missing?!) + + - small fix for SiS DRM driver (match 32/64bit fixes mentioned above) + (cast the data passed to sis_free as u32) + + - make driver re-entrant by avoiding static structures and variables. + + As usual, heavily tested. The mode switching code is even lab-tested by + SiS (although 100% written by me). Please apply asap (especially since + 64bit systems were not properly supported previously; as mentioned, current + X.org/XFree86 needs this update for proper communication with the + framebuffer driver on 64bit systems. X crashes on such systems with the + old driver). + + Signed-off-by: Thomas Winischhofer + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] 3c59x: support for ATI Radeon 9100 IGP + + The following patch adds support for the 3Com networking core found in the + ATI Radeon 9100 IGP southbridge used on boards like Asus P4R800-VM. + + The main point of this patch is using HAS_MII instead of HAS_NWAY for the + definition of the board. All the previous trials since the end of last + year used HAS_NWAY which disables the Tx part of the transceiver; using + HAS_NWAY was the way all 3Com Cyclone and Tornado chips worked, as they had + the transceiver integrated. The ATI solution has an external transceiver + and I had to physically see the different chip on the board (the board was + provided by ATI) to finally understand that it needs the HAS_MII + definition... I'm still waiting for some docs from ATI to clarify if this + is the correct way of handling this chip and if there are any differences + w.r.t EEPROM handling, but as it appears to work and was also confirmed by + other testers, I don't want to keep owners of such boards away from their + networks :-) + + The textual identification was a bit hard to decide; it's called + "3c920B-EMB-WNM" in the Windows .INF file that Asus provides for their + boards. As this name was already used for PCI ID 9210, I added the + paranthesis which specifies where this chip is found. + + The Scyld driver defines FEATURE_TORNADO to include HAS_NWAY. This board + would then probably need to not be defined with FEATURE_TORNADO, but the + same as in this patch. + + I would like to publicly thank Tyson Vickers for both ideas and patience + during the last few weeks. He managed to get the driver working by + randomly setting driver parameters :-) But then he contacted me and worked + with me towards the solution. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] dm-io: device-mapper i/o library for kcopyd + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Device-mapper: kcopyd + + Add kcopyd - a daemon for copying regions of block devices around in an + efficient manner. Multiple destinations can be specified for a copy. + Designed to perform well both with many small chunks or few large chunks. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] dm: kcopyd: remove superfluous INIT_LIST_HEADs + + Remove superfluous kcopyd INIT_LIST_HEAD. + + From: Alasdair Kergon + Signed-off-by: Kevin Corry + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] dm: kcopyd: No need to lock pages + + No need to lock kcopyd pages. + + From: Alasdair Kergon + Signed-off-by: Kevin Corry + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] kcopyd commentary + + We're also working on some general documentation which will go in + Documentation/device-mapper and will include more detailed information + about the core driver and the other sub-modules. We'll try to submit those + patches in the near future. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Device-mapper: snapshots + + Add snapshot target + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] dm: Fix error cleanup in dm_create_persistent() + + dm-exception-store.c: Fix error cleanup in dm_create_persistent(). + This was originally found by chrisw during code review. + + From: Dave Olien + Signed-off-by: Kevin Corry + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Device-mapper: mirroring + + Add mirror target. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Device-mapper: dm-zero + + Add dm-zero target + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] dm: dm-zero version + + Add missing dm-zero version number. + + From: Alasdair Kergon + Signed-off-by: Kevin Corry + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Device-mapper: dm-zero flushing fix + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] dm: Documentation + + Device-Mapper documentation. + + Signed-off-by: Kevin Corry + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] dm: Create/destroy kcopyd on demand. + + Create/destroy kcopyd on demand. + + This changes kcopyd to initialize its mempool and workqueue only when a + client specifically needs to use it. + + Signed-off-by: Kevin Corry + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] dm: Use structure assignments instead of memcpy + + Use structure assignments instead of memcpy's. + [Suggested by akpm during kcopyd review.] + + Signed-off-by: Kevin Corry + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] dm: dm-io: Error handling + + dm-io: Proper error handling when someone is trying to read from multiple + regions. + + Signed-off-by: Kevin Corry + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] dm: dm-raid1.c: Make delayed_bios a bio_list + + dm-raid1.c: Make struct region::delayed_bios a bio_list instead of a bio*. + This will ensure the queued bios are kept in the proper order. + + Signed-off-by: Kevin Corry + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] dm: dm-raid1.c: Use list_for_each_entry_safe + + dm-raid1.c: In rh_exit(), use list_for_each_entry_safe instead of + list_for_each_safe. + + Signed-off-by: Kevin Corry + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] msi TARGET_CPUS fix + + Somehow the change in TARGET_CPUS generated this error in UP environment. + Patch below will fix it. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] x86_64 numa cpumask build fix + + arch/x86_64/mm/numa.c: In function `numa_initmem_init': + arch/x86_64/mm/numa.c:185: error: incompatible types in assignment + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] i386 uninline some bitops + + Uninline the non-leaf bit search functions. Saves 9 kbytes from my vmlinux. + + And gratuitously s/__inline__/inline/ + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] APIC enumeration fixes + + The following patch appears sound according to an audit to ensure that all + of the codepaths where it was introduced were called after the APIC + fixmappings were set up. + + This patch introduces get_physical_broadcast(), which checks the version ID + of the local APIC to determine whether it's a serial APIC or xAPIC, and + returns the correct physical broadcast ID. It replaces all uses of + APIC_BROADCAST_ID and IO_APIC_MAX_ID with this in order to ensure. It also + changes the checks during MP table parsing so the APIC ID is checked in + tandem with the version number. + + I'm holding out for some kind of testing to get an idea of whether this + covers the cases or introduces regressions, or whatever. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] apic: fix kicking of non-present cpus + + The following patch repairs kicking of non-present cpus by making + cpu_present_to_apicid() bounds-check its argument. It also corrects the + same issue on NUMA-Q by correctly passing the generated artificial APIC ID + instead of the raw value discovered in the MP table. + + A miscellaneous compilefix for CONFIG_ACPI_BOOT is also included for + completeness. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] apic: remove marking of non-present physids in phys_cpu_present_map + + Marking invalid APIC ID's in phys_cpu_present_map was intended to generate + "collisions" between APIC ID's in order to assist the ordinary bounds + checking against the broadcast physical APIC ID. However, this is bounds + checked everywhere it's necessary, and it's also not even possible to + properly bounds-check everywhere. So this patch removes that marking of + non-present physical APIC ID's. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] apic: make mach_default compile again + + While sweeping the APIC code two points were missed. The first is getting + the definition of BAD_APICID available to + include/asm-i386/mach-default/mach_apic.h by #including the right header, + and the second is UP local APIC without UP IO-APIC linking in + get_broadcast_physid(). + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Use numa policy API for boot time policy + + Suggested by Manfred Spraul. + + __get_free_pages had a hack to do node interleaving allocation at boot + time. This patch sets an interleave process policy using the NUMA API for + init and the idle threads instead. Before entering the user space init the + policy is reset to default again. Result is the same. + + Advantage is less code and removing of a check from a fast path. + + Removes more code than it adds. + + I verified that the memory distribution after boot is roughly the same. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] memory allocation checks in eth1394_update() + + Adds memory allocation checks in eth1394_update(). + + Signed-off-by: Yury Umanets + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] memory allocation checks in mtdblock_open() + + Fixes memory allocation check in mtdblock_open() + + Signed-off-by: Yury Umanets + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] memory allocation checks in cs46xx_dsp_proc_register_scb_desc() + + Adds memory allocation checks in cs46xx_dsp_proc_register_scb_desc() + + Signed-off-by: Yury Umanets + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] don't create cpu/online sysfs file + + This file provides ability for caller of register_cpu() to either create a + control file, or not. This can be handy if a particular platform decides + that certain CPU's are not removable. Hence would like to not create a + control file. + + Signed-off-by: Dave Hansen + Signed-off-by: Ashok Raj + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] checksatck.pl fixes + + - "\<" and "\>" can be safely replaced with "<" and ">" + + - "$var =~ /^string$/" is better written "$var eq 'string'" + + - $i is better written without the double quotes + + - it's not safe to use for without "my"ing the iteration variable + + - "print foreach @array" is better written "print @array" + + - declare variables + + - ".*" is useless at the end of a regexp + + - "$a[@a] = $foo" is a rather obfuscated syntax for "push @a, $foo"... + let's not opencoding language basic operators... + + - ignoring return value from a regexp is very bad: this can results in + working on previous value of $1, $2, ... + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sys_getdents64 needs compat wrapper + + Due to different structure alignment rules in the ABI between ia32 and + ia64, certain members of the dirent structure are not guaranteed to be 8 + byte aligned on ia64. This requires a compat wrapper around these 32 bit + system calls. Other architectures may or may not have the problem, + depending on the alignment rules. + + This was observed by running /emul/ia32-linux/bin/ls on 2.6.6 which produces + kernel mode unaligned faults. + + Original patch by: Arnd Bergmann + Signed-off-by: Gordon Jin + Signed-off-by: Arun Sharma + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] remap_file_pages() speedup + + Avoid taking down_write(mmap_sem) unless we really need it. + + Seems that the only reason we're taking it for writing is to protect + vma->vm_flags. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] cciss ioctl32 update + + This patch provides a conversion routine for 32-bit user space apps that + call into a 64-bit kernel on x86_64 architectures. This is required for + the HP Array Configuration utility and the HP management agents. Without + this patch the apps will not function. + + The 2 ioctls affected are the cciss pass thru ioctls. Caveat: it spits out + 2 warnings during compilation. I've tried everything I can think of to + clean them up, but... If anyone has any helpful suggestions I'm all ears. + + Code by Stephen Cameron + Tested by Stephen Cameron & Mike Miller + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix cdrom mt rainier probe + + Mt rainier probe must be deferred to media load time, since it requires a + valid media (the drive may present a different capability based on what + media is loaded). This fixes that for ide-cd and sr. + + Signed-Off-By: Jens Axboe + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] blk: move threshold unplugging + + The 'unplug on queued exceeding unplug threshold' logic only works for file + system requests currently, since it's in __make_request(). Move it where + it belongs, in elv_add_request(). This way it works for queued block sg + requests as well. + + Signed-Off-By: Jens Axboe + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Fix memory leak in swsusp + + This fixes 2 memory leaks in swsusp: during relocating pagedir, eaten pages + were not properly freed in error path and even regular freeing path was + freeing one page too little. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] omdisk memory leak fix + + Fix a couple of memory leaks in the pmdisk driver. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] remove unnecessary memsets from swsusp and pmdisk + + Here's the patch that removes the memset calls from both pmdisk and swsusp. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] swsusp: remove copy_pagedir + + It can be replaced by a simple memcpy. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Decrease stack usage in ncpfs's ioctl + + It decreases stack consumption in one of ncpfs's paths from 3000 to 2200 + bytes (and stack portion in ncpfs ioctl code from 1336 to 452 bytes). + + - some code used large structure (with embeded 256 bytes for filename) + while it never passed filename around. Use something smaller in + ncp_conn_logged_in. Decrease 616 => 300. + + - gcc-3.3 is very bad when it comes to parallel blocks in ioctl. Split + some branches from large switch to separate functions. ncp_ioctl now + uses 152 bytes of stack (instead of 720) and biggest child 64. + + Signed-off-by: Petr Vandrovec + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Make update_one_process() static + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] drivers/char/ipmi/ipmi_devintf.c: user/kernel pointer typo + + Judging from context, I think there's a misplaced "&" in this code that can + cause stack overflows and other nasty problems. Perhaps it's left over + from when msgdata was an array instead of a pointer? + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] epoll: replace the file lookup hash with rbtrees + + The epoll allocation for the fd lookup hash used to allocate up to 1MB + (depending on the "hint" size passed to epoll_create()) with + __get_free_pages(0), and this might lead to a "malicious" user to do + something like: + + for (i = 0; i < 1024; i++) + epoll_create(BIG-NUM); + + You can replace "malicious user" with IBM-ltp test suite, and the meaning + does not change. The above code might exhaust memory badly, even before + the file creation limit is topped. Also, the allocation was independent + from the number of fds pushed into the epoll fd hash. Using an rb-tree + ther will be not pre-allocation of the hash, and the size of the memory + used will be proportional to the number of fds pushed into the epoll fd. + The patch also removes 100 lines of code, that is never a bad thing ;) + + Signed-off-by: Davide Libenzi + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Shift+PgUp if nr of scrolled lines is < 4 + + Using the vga console driver, if the number of the lines scrolled out is + less than four, then Shift+PageUp doesn't work. + + The bug is closely related to the 'margin' feature of scrolling, which + means that if less than four lines should remain unvisible in the direction + we are scrolling to, then we scroll a little bit more just to see those few + lines. Kind of two small magnets at the borders of the buffer. + + This bug was also reported with maybe a less clear description by Stepan + Koltsov (cc'ed just for fun) back in 2001 and he got no answer. I found it + at http://seclists.org/lists/linux-kernel/2001/Nov/0080.html + + His patch simply disables margin support and hence everythings becomes + okay, but you lose a nice feature. + + Here's a patch that retains margin support and fixes the bug. Works for + me, tested for a week. No guarantee. As I don't fully understand the code + (see also my previous mail) I'm not 100% sure that I'm doing the right + thing, so I'd prefer if someone would take a closer look at it. + + At least 2.4 and 2.6 are affected, maybe older ones too. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] istallion printk fix + + istallion: Remove duplicate "%d" in printk(); + + Signed-off-by: Randy Dunlap + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] lower priority of "too many keys" msg in atkbd.c + + From: "Jon Thackray" + + * Lowered priority of "too many keys" message in drivers/input/keyboard/atkbd.c + This fixes Debian BTS #239036. + http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=239036 + + + The keyboard under 2.6.4 seems to be behaving strangely, reporting unknown + key codes and too many keys pressed, even when no keys have been pressed. + The keyboard is connected via an 8 way KVM switch, but was working quite + acceptably under 2.4.25 with no such messages. Trying 2.6.3 is not an + option as it doesn't support the hardware properly, as previously reported. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] unregister driver if probing fails in sb_card.c + + * Unregister driver if probing fails in sound/oss/sb_card.c + This fixes Debian BTS #218845. + http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=218845 + + From: Robin Gerard + To: submit@bugs.debian.org + Subject: no sound with kernel-image-2.6.0-test9-1-386 + Message-ID: <20031103004939.GA2071@mauritius> + + I downlaoded the kernel-image-2.6.0-test9-1-386_2.6.0-test9-1_i386.deb + and I installed it successfully. Everything works fine, except the sound. + (I run also the kernel-image-2.4.20 and the sound is ok with this kernel) + My sound card is a sb. + + First I launched modconf but no module was displayed. + + I did: modprobe sb + and I got: + + sb: Init: Done + sb: Init: Starting Probe... + kobject_register failed for OSS SndBlstr (-17) + Call Trace: + [] kobject_register+0x3a/0x40 + [] bus_add_driver+0x30/0x64 + [] driver_register+0x2d/0x34 + [] preempt_schedule+0x2a/0x48 + [] pnp_register_driver+0x28/0x58 + [] pnp_register_card_driver+0x5e/0x98 + [] sb_init+0x63/0xb5 [sb] + [] sys_init_module+0xe8/0x1f0 + [] syscall_call+0x7/0xb + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix duplicate environment variables passed to init + + * Fixed argument processing bug in init/main.c (Eric Delaunay) + This fixes Debian BTS #58566. + http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=58566 + + From: Eric Delaunay + Message-Id: <200002201918.UAA02327@jazz.pontchartrain.fr> + Subject: pb in handling parameters on kernel command line + To: submit@bugs.debian.org (debian bug tracking system) + + Hello, I found some bugs in kernel command line parser. AFAIK, they are not + Debian nor sparc specific but I'm not subscribed to linux-kernel mailing list + and since I'm involved with boot-floppies (mainly for sparc), I think I'm right + to report it here. Feel free to forward it upstream (I checked the latest + 2.3.46 sources and it seems these bugs are still there). + + These bugs are not release critical. The latter just not gives the user a + chance to overwrite TERM env var at boot time. It could be just + inconvenient for serial console boot, and in this case, our busybox' init is + already enforcing TERM=vt102. + Nevertheless if it could not be fixed before the release, I could even write a + workaround in busybox' init (it's just a matter of rewriting getenv()). + + At last, it does not affect sysvinit package because serial console tty is + controlled by a getty process which is reading terminal settings on its command + line (take a look in inittab for T0 entries, if any). + + Ok, here is my modest contribution to kernel hacking. I don't know much about + kernel internals but it seems that argument parsing is a bit broken. + + One trivial patch for command line like "init=/bin/sh console=prom" where + console=prom is replaced by lot of spaces in previous call to setup_arch() on + sparc, therefore the line parsed by parse_options() is really + "init=/bin/sh " and a lot of null args are pushed into argv_init. + + The other patch is for command line like "TERM=vt100" where both default & user + TERM entries are pushed into the env array. + Taking a look into /proc/1/environ, it shows up: + HOME=/ + TERM=linux + TERM=vt100 + + It appears that ash (maybe other shells too) is giving the latter entry but + glibc getenv() is giving the former. It is therefore impossible to get entry + from the user in a C program like busybox' init (used in Debian boot-floppies). + + I guess getenv() is not written to support duplicate entries, therefore the + kernel should avoid such construct. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix handling of '/' embedded in filenames in isofs + + * Fix slashes in broken Acorn ISO9660 images in fs/isofs/dir.c (Darren Salt) + This fixes Debian BTS #141660. + http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=141660 + + From: Darren Salt + Message-ID: <4B238BA09A%linux@youmustbejoking.demon.co.uk> + To: submit@bugs.debian.org + Subject: Handle '/' in filenames in broken ISO9660 images + + [Also applicable to 2.2.x] + + There has been for some time a problem with certain CD-ROMs whose images + were generated using a particular tool on Acorn RISC OS. The problem is + that in certain catalogue entries, the extension separator character '/' + (RISC OS uses '.' and '/' the other way round) was not replaced with '.'; + thus Linux cannot properly parse this without this patch, thinking that it + is a directory separator. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix isofs ignoring noexec and mode mount options + + * Removed period check for executables in fs/isofs/inode.c + This fixes Debian BTS #162190 + http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=162190 + + From: Jan Gregor + To: Debian Bug Tracking System + Subject: kernel-source-2.4.18: kernel ignores noexec and mode option in cdrom case + Message-ID: <20020924162129.A328@pisidlo> + + In /etc/fstab i have following line: + /dev/cdrom /cdrom iso9660 gid=100,noauto,ro,noexec,mode=0444,user 0 0 + + I found on one CD that some files have exec bit set. From brief view + those files has no extension (filename.ext). + + My drive is asus-1610a (ATAPI writer) connected throught scsi-emulation. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ext3: htree readdir fix + + I've observed that ext3_htree_fill_tree() doesn't ignore empty records + (de->inode == 0). test case is very simple: turn htree on, create several + hundreds of files, remove them and look at strace ls: + + [root@victim tests]# ls -a /test/1 + . .. + + [root@victim tests]# strace ls /test/1/ + .... + getdents64(3, /* 18 entries */, 4096) = 432 + getdents64(3, /* 0 entries */, 4096) = 0 + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Fix raid1 read_balancing code. + + The meaning of mddev->in_sync changed subtly a while ago, and raid1 wasn't + changed to match. This results in raid1 read_balancing not working + properly. This patch corrects the relevant test. + + Signed-off-by: Neil Brown + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] mull'ify multiplication with HZ in __const_udelay() + + John Stultz mentioned on lkml ( http://lkml.org/lkml/2004/6/5/15 ) that + calls to udelay() don't delay long enough, causing trouble e.g. in the USB + subsystem. The following patches address this issue. + + Move the multiplication of (loops_per_jiffy * xloops) with HZ into the + "mull" asm operation. This increases the accuracy of the delay functions + largely: + + n usec delay on a system with loops_per_jiffy = 1500000 : + + n before after + 1 1000 ticks 1499 ticks + 10 14000 ticks 14999 ticks + + n usec delay on a system with loops_per_jiffy = 100000 : + + n before after + 1 0 ticks 99 ticks + 10 0 ticks 999 ticks + 100 9000 ticks 9999 ticks + + As noted by Kurt Garloff, it's necessary to adjust for large + loops_per_jiffies, as the multiplication of it with HZ fails for 4GHz or + larger. So, John Stultz suggested multiplying xloops with 4 first, and + multiplying with (HZ/4). + + Signed-off-by: Dominik Brodowski + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] round up in __udelay() + + Round up in __udelay(): 2**32 / 100000 is 4294.97, so it's more intuitive + to round up, and it causes more predictable results: + + n usec delay on a 1500000 BogoMIPS system: + + n before -mull after + 1 1000 ticks 1499 ticks 1500 ticks + 10 14000 ticks 14999 ticks 15000 ticks + + n usec delay on a 100000 BogoMIPS system: + + n before -mull after + 1 0 ticks 99 ticks 100 ticks + 10 0 ticks 999 ticks 1000 ticks + 100 9000 ticks 9999 ticks 10000 ticks + + While it can be argued that some time is also spent in the delay functions, + it's better to spend _at least_ the specified time sleeping, in my humble + opinion. And the overhead of a specific ->delay() implementation should be + substracted in the specific ->delay() implementation. + + Signed-off-by: Dominik Brodowski + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] add 1 in __const_udelay() + + The "mull" instruction in __const_udelay() cuts off the lower 32 bits -- + so, it is "rounding down". This is both an issue for small ndelay()s for + _all_ values for loops_per_jiffy and for certain {n,u}delay()s for many + loops_per_jiffy values. + + Assuming + + LPJ = 1501115 + + udelay(87) + + results in + + 130597 loops to be spent. + + However, 1000 * 130597 / 1501115 is 86.999997 us, so we're actually + _rounding down_. 1000 * 130598 / 1501115 is 87.000662841, which would be + the technically correct thing to do. Of course, for the TSC case this + won't matter as the maths take some time, so the actual delay is + + 1000 * __udelay(x) / lpj + __OVERHEAD(x) + + Anybody worried about both the additional overhead and the fact that the + overhead takes some time to run should add a check + + if (unlikely(xloops < OVERHEAD)) + return; + xloops -= OVERHEAD; + + to the delay() routines in arch/i386/kernel/timers/*.c and determine + what the OVERHEAD is. + + Signed-off-by: Dominik Brodowski + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Add security_file_permission() to AIO paths. + + Currently, there are no LSM hooks in the AIO codepaths, which means that + LSM based access controls are not revalidated upon AIO read and write + operations. The patch below adds the security_file_permission() LSM hook + prior to the VFS aio_read()/aio_write() calls. + + Signed-off-by: James Morris + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] update Marcelo CREDITS info + + Update my CREDITS information. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Fix sock_orphan race. + + The patch below fixes a race between sock_orphan() and + selinux_socket_sock_rcv_skb() which can lead to a null pointer deref oops + under heavy load. The sk_callback_lock is used in the patch to synchronize + access to the incoming socket's inode security state. + + This patch has been under test in the Fedora kernel for over a month + without incident. + + Author: Stephen Smalley + Signed-off-by: James Morris + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix standalone inclusion of asm-i386/dma-mapping.h + + Without this a usb-storage patch I sent fails on x86 because dma-mapping.h + uses struct device and various VM stuff without proper includes. It's fine + on ppc at least. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] s390: lost dirty bits + + The SetPageUptodate function is called for pages that are already up to + date. The arch_set_page_uptodate function of s390 may not clear the dirty + bit in that case otherwise a dirty bit which is set between the start of an + i/o for a writeback and a following call to SetPageUptodate is lost. + + Signed-off-by: Martin Schwidefsky + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] handle partial DIO write + + The fsx-linux hole fill failure problem was caused by + generic_file_aio_write_nolock() not handling the partial DIO write + correctly. Here's a patch lets DIO do the partial write, and the fallback + to buffered is done (correctly) for what is left. This fixes the hole + filling without retrying the entire i/o. This patch also applies to + 2.6.7-rc3 with some offset. + + I tested this (on ext3) with + fsx-linux -l 500000 -r 4096 -t 4096 -w 4096 -Z -N 10000 junk -R -W + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fb accel capabilities + + Baseline patch to make framebuffer/fbcon interaction more sane by basing the + fbcon heuristics on capabilities advertized by underlying framebuffer via the + fb_info.flags field. + + This patch updates fbcon, fb.h, and skeletonfb.c. It does *not* yet update + the drivers themselves. They should compile and work, but their hinting is + not correct yet, meaning most fb drivers will be slow until I set the flags to + the right hinting driver-by-driver + + Signed-off-by: David Eger + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fbcon: prefer pan when available + + Improve heuristics to favor panning over copyarea() thanks to pseudocode + from Antonino Daplas + + Signed-off-by: David Eger + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Updates to rivafb driver + + The patch updates rivafb to the following: + + 1. Fixed cursor corruption and simplified cursor code. + + 2. Maximized var->yres_virtual on initial mode setting. Scrolling, + therefore, defaults to y-panning which is significantly faster. + + 3. Restricted var->xres_virtual and var->yres_virtual to 0x7fff + (hardware limitation?). Otherwise, var->yres_virtual > 0x7fff + panning + will hang the GPU. + + 4. Added I2C/DDC support. This feature enables independent mode setup + to rivafb. 'stty rows n cols n' should now work correctly. This is a + configurable option. + + 5. Various/minor fixes to drawing code. + + Signed-off-by: Antonino Daplas + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] More updates to rivafb driver + + 1. pass info->monspecs.modedb and info->monspecs.modedb_len to + fb_find_mode() instead of NULL, 0 since its contents are specific to the + attached display. Anyway, if info->monspecs.modedb == NULL, + fb_find_mode() will use the default database. + + 2. Added best fit algo to fb_find_mode(). + + 3. Use snprintf instead of sprintf. + + Signed-off-by: Antonino Daplas + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] asiliantfb init fix + + asiliantfb seems to have only been partially merged (the fbmem.c bits in + particular seem to have been missed entirely). This adds them back in, + though they do seem to be present in the fbdev tree, at least they were the + last time I looked. + + These are the last bit of outstanding changes I have in the LinuxSH + tree for asiliantfb, so it would be nice to get this out of the way. + + Signed-off-by: Paul Mundt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix radeonfb panning and make it play nice with copyarea() + + radeonfb: fix panning corruption on a large virtual screen, Make panning + and copyarea() play nicely with each other. + + Signed-off-by: David Eger + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix warning in fbmem.c + + Fix a const/non-const warning. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] rivafb: fb accel capabilities + + Here's the fb accel capabilities patch for rivafb. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix simple_strtoul base 16 handling + + I know it's simple_strtoul, but is it meant to be that simple? Fix up for + both simple_strtoul and simple_strtoull. + + simple_strtoul(0x401b, NULL, 0) = 0x401b + simple_strtoul(0X401b, NULL, 0) = 0x0 + simple_strtoul(0x401b, NULL, 16) = 0x0 + simple_strtoul(0X401b, NULL, 16) = 0x0 + + simple_strtoull(0x401b, NULL, 0) = 0x401b + simple_strtoull(0X401b, NULL, 0) = 0x0 + simple_strtoull(0x401b, NULL, 16) = 0x0 + simple_strtoull(0X401b, NULL, 16) = 0x0 + + Signed-off-by: Chris Wright + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] SELinux: Fine-grained Netlink support - SELinux headers update + + This patch regenerates the SELinux module headers to reflect new class and + access vectors definitions. The size of the diff is misleading; much of it is + simply a change in the ordering of the automatically generated definitions. + The corresponding generation script has been changed to ensure a stable order + in the future. Please apply. + + Author: Stephen Smalley + Cc: David S. Miller + Signed-off-by: Stephen Smalley + Signed-off-by: James Morris + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] SELinux: Fine-grained Netlink support - move security_netlink_send() hook + + This patch moves the security_netlink_send() LSM hook after the user copy, so + that LSM modules can safely examine skb payload content. For SELinux, we need + to look at the Netlink message type. + + Cc: David S. Miller + Signed-off-by: James Morris + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] SELinux: Fine-grained Netlink support - add sk to netlink_send hook + + Modifies the LSM netlink_send() hook so that it takes a struct sock parameter. + SELinux will use this parameter to lookup the class of socket, which was + assigned during socket security initialization. + + Cc: David S. Miller + Signed-off-by: James Morris + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] SELinux: Fine-grained Netlink support - SELinux changes + + This patch contains SELinux changes which add support for extended Netlink + socket classes and the associated permissions nlmsg_read and nlmsg_write. + + Cc: David S. Miller + Signed-off-by: James Morris + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] IPMI base patch to fix channel handling and add polling + + This patch fixes some problems with handling of channel detection in the + driver. Some systems that are IPMI 1.5 do not implement the channel query + command. Also, the interface has to be fully up before the command is + ready. + + This patch also adds a polling interface; this is required for situations + where interrupts are not running, but the system must still issue IPMI + commands, like when taking a crash dump. + + It also updates the driver version to v32. + + Signed-off-by: Corey Minyard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Hugetlb page bug fix for i386 in PAE mode + + Hit a bug check when unmap a hugetlb vma in PAE mode on i386 (and x86-64). + + Bad page state at free_hot_cold_page (in process 'a.out', page c165cc40) + flags:0x20000000 mapping:f75e1d00 mapped:0 count:0 + Backtrace: + Call Trace: + [] bad_page+0x79/0x9e + [] free_hot_cold_page+0x71/0xfa + [] unmap_hugepage_range+0xa3/0xbf + [] unmap_vmas+0xac/0x252 + [] default_wake_function+0x0/0xc + [] unmap_region+0xd8/0x145 + [] do_munmap+0xfc/0x14d + [] sys_shmdt+0xa5/0x126 + [] sys_ipc+0x23c/0x27f + [] sys_write+0x38/0x59 + [] syscall_call+0x7/0xb + + It turns out there is a bug in hugetlb_prefault(): with 3 level page table, + huge_pte_alloc() might return a pmd that points to a PTE page. It happens + if the virtual address for hugetlb mmap is recycled from previously used + normal page mmap. free_pgtables() might not scrub the pmd entry on munmap + and hugetlb_prefault skips on any pmd presence regardless what type it is. + Patch to fix the bug. + + Signed-off-by: Ken Chen + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] remove blank line in show_trace() + + Delete a blank line for more error reporting on-screen. + + Signed-off-by: Randy Dunlap + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] remove EXPORT_SYMBOL(kallsyms_lookup) + + Distros have started to ship kernels with this patch, as it seems that some + unnamed binary module authors are already abusing this function (as well as + some open source modules, like the openib code.) I could not find any valid + reason why this symbol should be exported, so here's a patch against 2.6.7 + that removes it. + + Signed-off-by: Greg Kroah-Hartman + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] contify some scheduler functions + + Several scheduler macros only read from the task struct, mark them const. + It may help the compiler generate better code. + + Signed-off-by: Keith Owens + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] H8/300: ptrace fix + + - Kconfig typo fix + - PTRACE_PEEKUSER read process info support + - exr restore fix + - ptrace register offset fix + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] H8/300: io.h cleanup + + - optimize byteswap + - add noswap io mode + - cleanup var type + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] cmpci oops on rmmod + fix + + The cmpci driver included in Linux 2.6.7 causes an oops on rmmod, I believe + cm_remove should be marked __devexit rather than __devinit. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + Fix kill_pg_info(): return success if _any_ signal succeeded. + + + [PATCH] RLIM: pass task_struct in send_signal() + + Update send_signal() api to allow passing the task receiving the signal. This + is necessary to ensure signals generated out of process context can be charged + to the correct user. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] RLIM: enforce rlimits on queued signals + + Add a user_struct pointer to the sigqueue structure. Charge sigqueue + allocation and destruction to the user_struct rather than a global pool. This + per user rlimit accounting obsoletes the global queued_signals accouting. + + The patch as charges the sigqueue struct allocation to the queue that it's + pending on (the receiver of the signal). So the owner of the queue is charged + for whoever writes to it (much like quota for a 777 file). + + The patch started out charging the task which allocated the sigqueue struct. + In most cases, these are always the same user (permission for sending a + signal), so those cases are moot. In the cases where it isn't the same user, + it's a privileged user sending a signal to another user. + + It seems wrong to charge the allocation to the privleged user, when the other + user could block receipt as long as it feels. The flipside is, someone else + can fill your queue (expectation is that someone else is privileged). I think + it's right the way it is. The change to revert is very small. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] RLIM: remove unused queued_signals global accounting + + Remove unused queued_signals global accounting. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + This removes the files orphaned by the earlier PC9800 removal + + + [ARM PATCH] 1930/1: Allocate correct number of pseudo palette entries in pxafb + + Patch from Ian Campbell + + The pxafb driver incorrectly allocates 17 u32's for a 16 entry + pseudo palette. + + + Remove old stale header files that aren't referenced anywhere. + + Noted by Alexey Dobriyan. + + + [ARM PATCH] 1934/2: Consolidate code to set CKEN on PXA + + Patch from Ian Campbell + + I've seen comments several times that various PXA drivers + update CKEN in an unsafe manner. This patch consolidates + this code into a single function pxa_set_cken() and updates + all the in tree drivers to use it. + + + [PATCH] cfq sysfs support + + This makes the CFQ tunables available in sysfs, like AS and deadline. + + Signed-off-by: Jens Axboe + Signed-off-by: Linus Torvalds + + + [PATCH] cfq allocation race + + It's possible under unlucky circumstances for this race to trigger. I + described it with a comment in the code. + + Signed-Off-By: Jens Axboe + Signed-off-by: Linus Torvalds + + + [PATCH] cfq direct io alias problem + + This is a fix for when we encounter an alias during insert. When that + happens we move the request to dispatch, but it may happen that this + request is also the ->last_merge hint. So we may attempt to merge with + this later, when it's either in progress or already freed. Rearrange the + logic a bit so we clear the merge hint there as well. It looks more + complex than it is, the only real code change is the addition of a + cfq_remove_merge_hints() in cfq_dispatch_sort(). + + Signed-off-by: Linus Torvalds + + + [PATCH] USB: dummy_hcd shouldn't reject SET-ADDRESS requests + + This patch for the dummy_hcd driver prevents it from rejecting SET-ADDRESS + requests when the address is already set. The USB 2.0 spec states that if + a device is in the ADDRESS state, it should accept and start using the new + address. Behavior in the CONFIGURED state is undefined, but since + dummy_hcd doesn't keep track of the difference between the two states we + might as well accept the new address in any case. + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [ARM PATCH] 1932/1: fix comment about cache handling syscall + + Patch from Nicolas Pitre + + Let's make it coherent with what the actual code is doing and has + always done, even in 2.4. Nobody complained about this so let's + just fix the comment. The most natural usage pattern for this is + a base address and a size so it's more efficient to have an exclusive + end address anyway. + + + [ARM PATCH] 1931/1: Allow device address translation in dma-mapping, version 3 + + Patch from Tony Lindgren + + Allows translation of shared memory addresses for devices using + dma-mapping. In some cases the device DMA address is different + from the ARM DMA address, for example with some USB OHCI + controllers. + + For more background information, please see the ARM Linux mailing + list thread "OHCI controller". + + + USB: mark pwc driver broken again, as it still is :( + + + [ARM] Remove TBOX. + + This platform is no longer maintained, and its maintainer says that + the hardware is obsolete and out of circulation. + + + [ARM] Remove NexusPCI/FTVPCI platform. + + This platform is no longer maintained, and its maintainer says that + the hardware is obsolete and out of circulation. + + + [BRIDGE]: Kill sysfs hotplug avoidance hacks. + + The whole effort to avoid hotplug was misguided. If it is really a problem + (which it doesn't appear to be) then it can more easily be addressed by smarter + hotplug scripts in user space. + + This patch gets rid of the whole subsystem hack for bridge kobjects. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [PKT_SCHED]: Delay scheduler enqueue always succeeds. + + If underlying fifo enqueue fails, return the status not 0. + Same patch should apply to both 2.6 and 2.4 + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [PATCH] sparse: i387 math-emu annotation + + arch/i386/math-emu/* annotated. + + + [PATCH] sparse: rt_sigsuspend/sigaltstack sanitized + + rt_sigsuspend() and sigaltstack() prototype changed; instead of + playing games with casts of argument address to struct pt_regs * and + digging through it, we declare them as + + int (struct pt_regs regs) + + instead. + + + [PATCH] sparse: vm86.c annotated + + vm86.c annotated; vm86old(2) and vm86(2) switched to explicit + + int (struct pt_regs regs) + + format. + + + [PATCH] sparse: ixj annotated + + drivers/telephony (aka ixj.c) annotated, IXJ_CADENCE split into kernel + and userland variants, ioctl structures got __user on pointers. + + + [PATCH] sparse: drivers/char/watchdog annotation + + Trivial annotations in drivers/char/watchdog/* + + + [PATCH] sparse: drivers/input annotations + + Trivial annotations in drivers/input + + + [PATCH] sparse: ide-tape annotation + + + [PATCH] sparse: ibmasmfs annotations + + Trivial annotations + couple of missing (void) in prototypes + + + [PATCH] Couple of sysfs patches + + On Wed, Jun 16, 2004 at 05:51:03PM -0500, Dmitry Torokhov wrote: + > What about freeing the resources? Can it be put in platform_device_unregister + > or is it release handler task? I'd put it in unregister because when I call + > unregister I expect device be half-dead and release as much resources as it + > can. + + + Here's the updated patch - to be applied on top of the + platform_get_resource() patch sent previously. + + Signed-off-by: Greg Kroah-Hartman + + + [PKT_SCHED]: Delay scheduler should retry if requeue fails. + + If delay scheduler decides not to send the packet right away, it requeues + it. If the requeue fails, it should go and look again rather than waking + up prematurely. + + Same patch should apply to both 2.6 and 2.4 + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [PATCH] crapectomy - last users of kernel_scsi_ioctl() gone + + Last 3 users of kernel_scsi_ioctl() eliminated; two of them used to read + partition table by issuing a READ6 via ioctl (instead of just calling + scsi_bios_ptable() as every other ->biosparam() instance does). + + The last one was doing a very quaint access to fields of scsi_device by + issuing SCSI_IOCLT_GET_LUN and then shuffling bits in the result. Down + with that insanity... + + + [PATCH] sparse: drivers/message/fusion annotations and fixes + + Sigh... First of all, LSI folks have very quaint idea of existing + platforms and word sizes on those. Their definitions of U32 and S32 + should really be reserved for posterity (preferably chiseled into the + rock they have between the ears), but kernel is the wrong place for + that. Fixed. + + mptctl_do_mpt_command() was always called on userland pointers; + kernel/userland argument removed along with dead code, function + annotated, callers updated. + + The rest is trivial annotations in mptctl.c and in its ioctl structures + - nothing fancy there. + + + sparse: fix up fusion/mptctl.c after merge + + + [PKT_SCHED]: Do not check netif_queue_stopped() in dequeue ops, races with driver. + + Based upon a patch from Stephen Hemminger. + Signed-off-by: David S. Miller + + + [PKT_SCHED]: Add loss option to network delay scheduler. + + This enhances the network simulation scheduler to do simple random loss. + + The loss parameter is a simple 32 bit value such that 0 means no loss, and + 0xffffffff is always drop. I have a new version of the tc command which takes + care of conversion from percent to this value. + + Same patch for 2.4 and 2.6 + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [IPV6]: Handle user asking for any device in mcast calls. + + + [IRDA]: Remove usage of isa_virt_to_bus() + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [IPV6]: Fix autoconf description in ip-sysctl.txt. + + + [NET]: Fix eql.c failed dev_get_by_name() return value check. + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [PATCH] sparse: binfmt_aout annotation + + + [PATCH] sparse: mwave annotation + + + [PATCH] sparse: nfs partial annotation + + + [PATCH] sparse: drivers/video partial annotation + + misc annotation in drivers/video/* (nowhere near complete) + + + [PATCH] sparse: drivers/video/kyro annotation + + + [PATCH] sparse: drivers/video/matrox annotation + + + [PATCH] sparse: udf cleanups + + removed bogus externs from declarations in fs/udf/* + + + [PATCH] sparse: applicom annotation + + + [PATCH] sparse: amd64 bits + + - added define of __x86_64__ to sparse arguments on amd64 + - switched amd64 uaccess.h to __chk_user_ptr() + + + [PATCH] sparse: ipmi annotation + + + [PATCH] sparse: cyclades annotation + + + [PATCH] sparse: synclinkmp annotation + + + [PATCH] sparse: autofs annotation + + + [PATCH] sparse: drivers/video/aty annotation + + + [PATCH] sparse: drivers/video/sis annotation + + + [PATCH] ipr abort hang fix + + The following patch fixes a hang that occurs when an abort + is issued by the midlayer. The hang is the result of overriding + a field in the union of the ipr_cmd struct. It is fixed by moving + this pointer outside of the union, since it is not mutually exclusive + with the other fields in the union. + + Signed-off-by: James Bottomley + + + [PATCH] ipr only tcq cancel all + + Some SCSI-IDE cdrom drives take up to 15 seconds to respond following + an abort being issued to them. This patch changes ipr to only send + a cancel all to a device as part of request sense processing when + the device is running tagged command queueing. + + Signed-off-by: James Bottomley + + + [PATCH] ipr bump version to 2.0.10 + + Signed-off-by: James Bottomley + + + [PATCH] sparse: kernel/module.c sparse fix + + Add __user annotation for !CONFIG_MODULE_UNLOAD case. + + From: Mika Kukkonen + Signed-off-by: Randy Dunlap + + + [PATCH] sparse: lib/string.c sparse fix + + A classic.. + + lib/string.c:165:19: warning: assignment expression in conditional + + From: Mika Kukkonen + Signed-off-by: Randy Dunlap + + + Do not send junk in bcc area of oplock break SMB Lock request, and always let oplock break release + through even if requests are ahead of it waiting for responses to complete. + + Signed-off-by: Steve French (sfrench@us.ibm.com) + + + check better for free files on writepage retry + + Signed-off-by: Steve French (sfrench@us.ibm.com) + + + [PATCH] ia64: fix ia32 partial-page map support for overlapping mmaps + + - Handle the overlapping mmaps in the MAP_FIXED case + - Handle unmaps correctly i.e. call __ia32_delete_pp_range() + - There are now three clear entry points into the pp manipulation code + - ia32_set_pp + - ia32_unset_pp + - ia32_compare_pp + - Rename internal functions to __ia32_*pp_* + - Grab mmap_sem just once at the main entry point + + Signed-off-by: Gordon Jin + Signed-off-by: Arun Sharma + Signed-off-by: David Mosberger + + + [PATCH] ia64: move move_irq() from iosapic.c to irq.c + + This patch moves move_irq() from ioaspic.c to irq.c to make this common + for ia64 subarches. + + Signed-off-by: Ashok Raj + Signed-off-by: David Mosberger + + + [PATCH] ia64: perfmon stack consumption fix + + This patch moves the pfm_ovfl_arg_t structure from the kernel stack + into the pfm_context_t structure. This minimizes kernel stack space + consumption. + + Signed-off-by: Stephane Eranian + Signed-off-by: David Mosberger + + + [PATCH] ia64: fix free_huge_page() call in hugetlb_prefault() + + In base kernel 2.6.7, there is bug in function hugetlb_prefault(). The + call to free_huge_page() is incorrect and should be replaced with a call + to page_cache_release(). + + Signed-off-by: David Mosberger + + + [PATCH] mptctl.c build fix + + drivers/message/fusion/mptctl.c:89:24: asm/compat.h: No such file or directory + + Signed-off-by: Andrew Morton + + + [PATCH] HPFS fixes for 2.6.7 kernel + + This contains hpfs fixes from my source ported to 2.6.7 kernel: + + updates: + - allocator fragments files less + - OS/2 Warp Server filesystem can be mounted read/only + - added reschedule points so that it doesn't hog CPU + + bug fixes: + - filesystem error message when syncing or fsyncing deleted file (or when + system just writes it on its own) + - filesystem error on extremly fragmented files + - corrupted disk structures could possibly corrupt memory + + + [PCMCIA] Add Cirrus PD6729 PCMCIA bridge support. + + Patch from Komuro, cleaned up by Russell King. + + + [NET]: Fix econet build bustage. + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [NET]: Fix some userland header bustage. + + + [IPV6]: Export necessary xfrm6_tunnel functions. + + + [PCMCIA] 02-validatemem + + Move validate_mem() so we don't recurse. We call this function from + the DS_GET_FIRST_TUPLE and DS_VALIDATE_CIS calls, which are the the + first two functions which may be called by cardmgr or cardctl which + require CIS access. + + + [PCMCIA] 03-memwin + + Eliminate win->base and win->size elements from window_t. + window_t contains struct pccard_mem_map, which contains a + copy of these (sys_start, sys_stop) in a slightly different + form. + + + [PATCH] natsemi updates + + - support for external phys, both fibre and twisted pair, added: + * remove the "phy" parameter from mdio_{read,write}: the + function accesses the current phy. + * new functions to access external phys: miiport_{read,write} + * scan for external phys on _probe. + * ethtool support for switching between internal + and external phys. + * introduce an init_phy_fixup helper: a few settings must be + reapplied after reenabling the internal phy. + - move register_netdev to the end of _probe. The current position + could cause races with hotplug. + - do not wait for autonegotiation completed after initialization. + - use pci_name() instead of dev->name until register_netdev has + initialized dev->name. + - read the BMSR register in the link beat interrupt twice: + The link status field is latched, without reading twice a link up + event will be missed (and only noticed a few seconds later in the + media timer) + - restart the autonegotiation after modifying the capabilities. + + + [wireless airo] Clean initialization of Mini-PCI cards even from suspend + + + [PATCH] Re: linux-2.6.7 Equalizer Load-balancer. eql.c. local non-privileged DoS + + Vitaly V. Bursov wrote: + > + > there are multiple vulns in drivers/net/eql.c + > + > if there is no such device, dev_get_by_name returns NULL and everything dies. + > Exploiting this is trivial. + + Thanks for the report. This patch should fix them. + + Signed-off-by: Herbert Xu + + Cheers, + -- + Visit Openswan at http://www.openswan.org/ + Email: Herbert Xu ~{PmV>HI~} + Home Page: http://gondor.apana.org.au/~herbert/ + PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt + -- + ===== drivers/net/eql.c 1.13 vs edited ===== + + + [PATCH] H8/300: smc9194 driver + + From: Yoshinori Sato + + - H8/300 target support + - fixed irq support + - high address (>0xffff) i/o fix + + Signed-off-by: Andrew Morton + + + [PATCH] convert sk fddi driver to ANSI C + + Sparse does not handle K&R at all, and I think I saw Linus saying that + he has no intention of adding it to sparse while ago. So here is a blob + of patch to convert drivers/net/skfp/* from K&R to ANSI-C. Compile + tested with "make allmodconfig" on x86, as I obviously don't have the + HW. + + Mika + + Signed-off-by: Stephen Hemminger + + + [PATCH] e1000 management reset fix + + * Resetting the adapter blew away management settings. So we save the + important bits before performing a reset. + + + [PATCH] sunhme patch + + Without this patch, insmod-ing the sunhme module crashes on my fc2 + box. + + -- JF + + + [PATCH] hamachi DMA + + Let's get this thing not using bus_to_virt() anymore, + as follows. + + Signed-off-by: David S. Miller + + ===== drivers/net/hamachi.c 1.35 vs edited ===== + + + [PATCH] pcnet32: discard oversize rx packets + + This patch will discard received frames that are larger than one buffer. + This has been tested on ia32 and ppc64 systems. + + Please also apply to 2.4.7 (with offset of -3), tested ia32. + + Signed-off by: brazilnut@us.ibm.com + + + [PATCH] pcnet32: recover after rx hang. + + This patch fixes a receive hang that occasionally occurs after a Tx + FIFO underrun. The receive dma remains in a hung state sometimes. The + transmit operations continue to occur, but no receive activity. + + This was reproduced on several ppc64 systems and the fix has been verified + there. The patch has been tested as well on an ia32 system, which did + not experience the hang because it did not have fifo underruns, which is + a preqrequisite for the hang. The memory barriers decreased the frequency + of occurrence. The final change to reset the chip instead of just stopping + it eliminated the last hangs. + + Please also apply against 2.4.7 (with offset of -1), tested ia32. + + Signed-off by: brazilnut@us.ibm.com + + + [PATCH] pcnet32: cleanup IRQ limitation. + + Cleanup pcnet32 IRQ handling based on suggestions from Ralf Baechle + , and Brian Murphy + + Tested by myself and Brian Murphy. + + Please also apply to 2.4.27-pre6. + + Signed-off-by: Don Fry + + + [PATCH] orinoco.c rate limit lost information frame message + + Rate limit a (apparently) harmless warning in orinoco.c + + (My laptop remained connected with active X applications running over + ssh while this message was hitting every second, since I patched my + driver to include this the problem hasn't recurred.) + + Signed-Off-By: Ryan Anderson + + + [PATCH] sis900-fix-phy-transceiver-detection.patch + + From: Daniele Venzano + + Fix PHY transceiver detection code to fall back to known PHY and not to the + last detected. + + The code checks every transceiver detected for link status and type, but fails + when ghost transceivers are detected, deciding to use the last one detected. + + With this patch the driver should choose the correct transceiver even when + some ghosts are detected by checking for the type of the tranceiver it is + going to use. + + + [PATCH] sk98lin pci id + + + [PATCH] Use netdev_priv in sgiseeq + + The combined allocation of of receive and transmit rings and driver data + so far made the use of netdev_priv impossible. Split the allocation + and use netdev_priv to access the non-ring driver_private data. + + Signed-off-by: Ralf Baechle + + + [PATCH] Reformat + + Pure microcosmetic. + + Signed-off-by: Ralf Baechle + + + [PATCH] Cosmetic cleanups to sb1250-mac.c + + Signed-off-by: Ralf Baechle + + + [PATCH] hdlcdrv needs to stop queueing + + We better stop the queue in the close call. + + Signed-off-by: Ralf Baechle + + + [ECONET]: Fix some warnings. + + + [NET]: Fix warning in farsync WAN driver. + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [NET] generalise tcp_add_data, skb_split and tcp_copy_to_page + + Signed-off-by: Arnaldo Carvalho de Melo + + + Do not kill cifsd thread until last smb session on tcp session is + SMBulogged off. Fixes umounting bug (pointed out by Nick Millington) + when multiple mounts with different userids are mounted to the same + server from the client. + + Signed-off-by: Steve French (sfrench@us.ibm.com) + + + [PATCH] final hosts.h usage removal + + the patch below finishes off the removal of the obsolete hosts.h usage, and + now that the users are gone, it's safe to turn on the warning to + prevent accidental future use... Please apply + + Signed-off-by: James Bottomley + + + [PATCH] switch scsi core and sd to headers + + Signed-off-by: James Bottomley + + + [Bluetooth] Fix connection creation error handling + + This patch fixes the problem that ACL connections are removed from + the kernel connection hash when a hci_create_connection returns a + command status other than 0x00. + + Signed-off-by: Marcel Holtmann + + + [Bluetooth] Fix config change for firmware loading + + The switching between firmware loading and running state is done via + different configurations. To get this right the USB toggle and halted + bits must be reset to zero after it. + + Signed-off-by: Marcel Holtmann + + + ncr53c8xx updates + + From: Matthew Wilcox + + - remove all of the PCI chips (8xx series) leaving only 720 + - pull out stand alone initialisation code (driver becomes a chip only + driver for NCR Q720 and Zalon) + - remove most vestiges of PCI support (chip driver should be bus neutral) + - tidy up typedefs + - remove simulated intfly (may need putting back for 770) + + Signed-off-by: James Bottomley + + + Make ncr53c8xx respect clustering + + From: Joel Soete + + This patch makes the ncr driver capable of accepting segments which + are larger than the block size. It has been tested against IOMMU + merging on parisc. + + Signed-off-by: James Bottomley + + + [PATCH] fix amd64 boot breakage + + This fixes a bug that prevent my amd64 box from booting; + numa_default_policy was __init however it's called like this in + init/main.c: + + free_initmem(); + unlock_kernel(); + system_state = SYSTEM_RUNNING; + numa_default_policy(); + + + eg after free_initmem(). This resulted in it being reused/freed and that + gives a nasty oops. + + + Follow 2.4.x semantics for in-kernel signal sending. + + + [PATCH] FAT: don't use "utf8" charset and NLS_DEFAULT + + Recently, some distributors have set "utf8" to NLS_DEFAULT, therefore, + FAT uses the "iocharset=utf8" as default. But, since "iocharset=utf8" + doesn't provide the function (lower <-> upper conversion) which FAT + needs, so FAT can't provide suitable behavior. + + This patch does: + + - doesn't recognize "utf8" as "iocharset" + - doesn't use NLS_DEFAULT as default "iocharset" + - instead of NLS_DEFAULT, adds FAT_DEFAULT_CODEPAGE and + FAT_DEFAULT_IOCHARSET + + NOTE: the following looks like buggy, so it's not recommended + + "codepage=437,iocharset=iso8859-1,utf8" + + however, some utf8 file name can handle. (in this case, it uses the + table of iso8859-1 for lower <-> upper conversion) + + + Sign-off-by: Jesse Barnes + Sign-off-by: OGAWA Hirofumi + Sign-off-by: Linus Torvalds + + + [PATCH] m68k: IFPSP060 update + + IFPSP060: Make sure that the destination address of a misaligned cas access is + properly mapped in, so the kernel won't oops in the emulation handler (from + Roman Zippel). + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Linus Torvalds + + + [PATCH] m68k: handle new gcc's + + M68k: Fixes for when compiling with modern gcc (from Roman Zippel): + - Avoid warning 'use of memory input without lvalue in asm operand 0 is + deprecated' of newer gcc + - Replace some '%/' with offical '%%' to escape a '%' + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Linus Torvalds + + + [PATCH] m68k: new gcc optimizations + + M68k compiler updates from Roman Zippel: + - Fix various lvalue warnings from newer gcc + - Remove unnecessary volatile declarations + - Change some constraints from "a" to "m" to generate slightly better code + - Use "o" constraint for bitfield instructions + - Use generic bitmap functions for some of the ext2/minix bitmap functions + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Linus Torvalds + + + [PATCH] m68k: bus error handling + + M68k: Allow to catch a bus error via the exception mechanism (from Roman + Zippel) + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Linus Torvalds + + + [PATCH] m68k: use set_page_count() + + M68k: From 2.6.7-rc1 on, it's no longer allowed to access page->count directly + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Linus Torvalds + + + [PATCH] affs remount fixes + + AFFS: Fix oops on write after remount (from Roman Zippel): + - Allocate/free bitmap as necessary + - Remove last uses of SF_READONLY + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Linus Torvalds + + + [PATCH] m68k: Mac Sonic Ethernet + + Mac Sonic Ethernet: Kill duplicate `MODULE_LICENSE("GPL");' (already defined in + included sonic.c) which causes a compile failure + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Linus Torvalds + + + [PATCH] m68k: sparse infrastructure + + M68k: Make sparse work + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Linus Torvalds + + + [PATCH] m68k: Mac IOP fix + + Mac IOP: Fix copy-and-paste bug (found by OPERA, reported by Zhenmin Li, + confirmed by Brad Boyer) + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Linus Torvalds + + + [PATCH] m68k: atomic op fixups + + M68k: Add missing atomic operations (from Roman Zippel and me) and replace + `__inline__' by `inline' while we're at it. + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Linus Torvalds + + + [PATCH] m68k: I/O abstraction updates + + M68k I/O abstraction updates: + - Make I/O ports and addresses `unsigned long' + - Add casts to make operations warning-compatible with other archs + - Add {in,out}[wl]_p() and {in,out}l(), which are needed for some drivers + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Linus Torvalds + + + [SPARC64]: Check _TIF_SYSCALL_SUCCESS before syscall return value. + + We might have to clear the flag, and if we do not + then subsequent syscalls can get confused. + + Bug easily triggered by suspending emacs in a pty + and then resuming, select() returns due to a pending + signal but because _TIF_SYSCALL_SUCCESS is erroneously + set by a previous syscall -514 ends up slipping into + userspace. Oops. + + + [PCMCIA] 04-memres + + Make find_mem_region() return a struct resource. We preserve + pccard_mem_map's sys_start and sys_stop elements for the moment + since socket drivers are relying on this information for setting + up their windows. + + + [PCMCIA] 05-nonbusy + + When allocating memory and IO resources, do not mark them busy. + This allows drivers themselves to claim and mark the regions busy, + as they are supposed to. + + + [NET]: Fix module refcounting of TC actions. + + + [NET] move skb_can_coalesce to skbuff.h + + This one also removes the duplicate can_coalesce in tcp.c and makes it + use skb_can_coalesce. + + Signed-off-by: Arnaldo Carvalho de Melo + + + [NET] move tcp_memory_free to sk_stream_memory_free + + Signed-off-by: Arnaldo Carvalho de Melo + + + [NET]: Lockless loopback patch (version 2). + + + [SPARC64]: bug.h needs compiler.h + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [PATCH] ppc64 CONFIG_ALTIVEC=n build fix + + With CONFIG_ALTIVEC=n, flush_altivec_to_thread() has no implementation. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: eeh.h warning-fix + + In file included from include/asm/io.h:365, + from drivers/video/kyro/STG4000Reg.h:23, + from drivers/video/kyro/STG4000Ramdac.c:16: + include/asm/eeh.h:58: warning: `struct device_node' declared inside parameter list + include/asm/eeh.h:58: warning: its scope is only this definition or declaration, which is probably not what you want + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] export DMI check functions + + This patch creates and exports 2 functions which can be used by the rest of + kernel code to perform DMI data checks: + + - dmi_check_system() function checks system DMI data against given blacklist + table and on each match runs corresponding callback function; + + - dmi_get_system_info() function returns DMI data value. Useful for people + wanting more complex DMI data check than simple string match. + + Also filling unused match entries with NO_MATCH made optional, but existing + NO_MATCH occurences are left intact, so people are free to continue dmi_scan.c + patching without massive reject problems. + + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] use new DMI API for HP Pavilion + + Example code for the new DMI APU - port HP Pavilion irq workaround to new + DMI probing. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] pcmcia: enable read prefetch on o2micro bridges to fix HDSP + + enable read prefetching on O2micro bridges. It fixes the problems + seen with the RME Hammerfall DSP. + Thanks to Eric Still from O2micro for the input. + + Cc: Russell King + Signed-off-by: Daniel Ritz + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Permit inode & dentry hash tables to be allocated > MAX_ORDER size + + Here's a patch to allocate memory for big system hash tables with the + bootmem allocator rather than with main page allocator. + + It is needed for three reasons: + + (1) So that the size can be bigger than MAX_ORDER. IBM have done some + testing on their big PPC64 systems (64GB of RAM) with linux-2.4 and found + that they get better performance if the sizes of the inode cache hash, + dentry cache hash, buffer head hash and page cache hash are increased + beyond MAX_ORDER (order 11). + + Now the main allocator can't allocate anything larger than MAX_ORDER, but + the bootmem allocator can. + + In 2.6 it appears that only the inode and dentry hashes remain of those + four, but there are other hash tables that could use this service. + + (2) Changing MAX_ORDER appears to have a number of effects beyond just + limiting the maximum size that can be allocated in one go. + + (3) Should someone want a hash table in which each bucket isn't a power of + two in size, memory will be wasted as the chunk of memory allocated will + be a power of two in size (to hold a power of two number of buckets). + + On the other hand, using the bootmem allocator means the allocation + will only take up sufficient pages to hold it, rather than the next power + of two up. + + Admittedly, this point doesn't apply to the dentry and inode hashes, + but it might to another hash table that might want to use this service. + + + I've coelesced the meat of the inode and dentry allocation routines into + one such routine in mm/page_alloc.c that the the respective initialisation + functions now call before mem_init() is called. + + This routine gets it's approximation of memory size by counting up the + ZONE_NORMAL and ZONE_DMA pages (and ZONE_HIGHMEM if requested) in all the + nodes passed to the main allocator by paging_init() (or wherever the arch + does it). It does not use max_low_pfn as that doesn't seem to be available + on all archs, and it doesn't use num_physpages since that includes highmem + pages not available to the kernel for allocating data structures upon - + which may not be appropriate when calculating hash table size. + + On the off chance that the size of each hash bucket may not be exactly a + power of two, the routine will only allocate as many pages as is necessary + to ensure that the number of buckets is exactly a power of two, rather than + allocating the smallest power-of-two sized chunk of memory that will hold + the same array of buckets. + + The maximum size of any single hash table is given by + MAX_SYS_HASH_TABLE_ORDER, as is now defined in linux/mmzone.h. + + Signed-off-by: Paul Mackerras + Signed-off-by: David Howells + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] O_NOATIME support + + This patch adds support for the O_NOATIME open flag (GNU extension): + + int O_NOATIME Macro + If this bit is set, read will not update the access time of the file. + See File Times. This is used by programs that do backups, so that + backing a file up does not count as reading it. Only the owner of the + file or the superuser may use this bit. + + It is useful if you want to do something with the file atime (for instance, + moving files that have not been accessed in a while to somewhere else, or + something like Debian's popularity-contest) but you also want to read all + files periodically (for instance, tripwire or debsums). + + Currently, the program that reads all files periodically has to use utimes, + which can race with the atime update: + + A B + open + fstat + read + open + read + close + close + utimes + + And the file still has the old atime, instead of the new one from when B + did the read from it. This problem does not happen if A uses O_NOATIME + instead of utimes to preserve the atime. + + This patch adds the O_NOATIME constant for all architectures, but it would + also be possible to add it one architecture at a time by defining it to 0 + when not defined in asm-*. + + Based on patch by Marek Michalkiewicz at + http://www.uwsg.iu.edu/hypermail/linux/kernel/9811.2/0118.html + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppp_synctty.c receive/write_wakeup fix + + Allow receive and write_wakeup callbacks to be called at hard interrupt + context and/or with interrupts disabled (removes softirq warning). + + This mirrors changes by Paul Mackerras to ppp_async.c for the same purpose. + Patch has been previously posted for comments and has been tested with + success by multiple persons. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] airo.c broke + + But Al fixed it again. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] jfs build fix + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] swapoff: activate pages + + People like to use swapoff/swapon as a way of restoring their VM to a + predictable "preconditional" state. + + Problem is, swapoff leaves mapped anon/pagecache pages on the inactive list, + so they immediately get swapped out again when swapspace becomes available. + + Let's move these pages onto the active list to the VM has to again decide + whether to swap them out. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Add ovcamchip driver + + This patch adds a new driver for the OmniVision OV6xx0 and OV7xx0 series of + CMOS image sensors. It is currently used by the w9968cf USB webcam driver, + which is already in mainline 2.6. Up until now it had to be compiled + outside the kernel tree, which is clearly suboptimal. + + It is also used by version 2 of the ov511 USB webcam driver, which will be + merged in the near future. That will reduce some code duplication, since + the existing ov511 has much of this code built-in. + + This was previously submitted to Linux-USB-Devel, and I have fixed the + concerns that came up at that time. + + Developer's Certificate of Origin 1.0 + + By making a contribution to this project, I certify that: + + (a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + + (b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + + (c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + + Signed-off-by: Mark McClelland + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Uninline machine_specific_memory_setup() + + Cleanup arch/i386/kernel/setup.c a little bit by: + + * un-inlining machine_specific_memory_setup() (it's implementations are + pretty big to be inlined anyway) + + * remove setup_memory_region() by moving the code inside setup_arch() + + I would also recommend BK-renaming all four files + (include/asm-i386/*/setup_arch_post.h) to ".c" and moving them into + arch/i386/*/, but that obviously is not needed in anyway. But IMHO they + are clearly ".c" files, not ".h" files. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] add wait_event_interruptible_exclusive() macro + + This patch defines a macro that does exactly what + wait_event_interruptible() does except that it adds the current task to the + wait queue as an exclusive task (i.e., sets the WQ_FLAG_EXCLUSIVE flag) + rather than as a non-exclusive task as wait_event_interruptible() does. + + This allows one to do a wake_up_nr() to wake up a specific number of tasks. + I'm in the process of submitting a patch to linux-ia64 that requires this + capability. (Its subject line is "[PATCH 3/4] SGI Altix cross partition + functionality".) + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] iommu max segment size + + This patch is from James, I've changed it slightly only. + + The problem is that some IOMMU implementations have a maximum limit to the + size of the number of contiguously mappable pages (admittedly, this limit + is mostly in the resource management algorithms rather than the IOMMUs + themselves). + + This patch adds this concept to the bio layer via the parameter + + BIO_VMERGE_MAX_SIZE + + which architectures can define in asm/io.h (if undefined, we assume it to + be infinite, which is current behaviour). + + While adding this, I noticed several places where bio was making incorrect + assumptions about virtual mergeability (none of which was a bug: bio was + overestimating rather than underestimating). + + - The worst offender was bio_add_page(), which seemed never to check for + virtual mergeability + + - I also fixed blk_hw_contig_segments() not to check the QUEUE_CLUSTER + flag, and not to check the phys segment boundary. + + In order to track the hw segment size across bios, I had to introduce two + extra bio parameters: bi_hw_front_size and bi_hw_back_size which store the + sizes of the front and back hw contiguous segments (and which will be equal + if there's only one hw segment). When the bio is merged into a request, + these fields are updated with the total hw contig size so they can always + be used to assess if the merger would violate the BIO_VMERGE_MAX_SIZE + parameter. + + Signed-Off-By: Jens Axboe + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] v4l: v4l2 API updates + + This patch has some minor updates to v4l2 API: + + * A new pixel format (V4L2_PIX_FMT_SBGGR8). + + * Adds some #defines for tv norms for convenience. + + * Allow to specify the video source to capture from on a per-frame basis. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] v4l: update video-buf for per-frame input switching. + + This patch updates the video-buf module to support the per-frame input + switching added by the v4l2 API patch. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] v4l: video-buf magic numbers + + This patch adds some magic IDs and checks for them to the data structs of the + video-buf module. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] v4l: video-buf fixes. + + This patch has some minor bugfixes for the video-buf module. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] v4l: msp3400 cleanup. + + This patch has some cleanups for the msp3400 module: Balance is used directly + now instead of maintaining the state as left/right volume and calculate the + balance from that. The msp3400 did that only for historical reasons and it + isn't needed any more ... + + Credits for that go to Perry Gilfillan. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] v4l: ir-common update + + Some minor changes for the ir-common module: Update for the RC5 keytable and + increase the IR_KEYTAB_SIZE #define. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] v4l: tuner + tda9887 updates + + This is a big update for the tuner and tda9887 modules which are used for TV + card tuning. + + The tda9887 module is basically completely rewritten and understands all the + config bits now instead of having just some fixed config presets. Some of + these config bits can be changed by insmod options now. + + The other big change is that both modules allow to use the V4L2 API for + inter-module communication (i.e. when bttv/saa7134/... pass through the + tuning ioctls to the modules). That allows to specify the TV norm more + precisely (not just PAL but PAL-I, PAL-BG, ...), which is needed in some cases + to make TV audio work correctly. Using the old v4l1 API is still possible so + this shouldn't break any users of these two modules. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] v4l: bttv driver update + + This is a update of the bttv driver. Changes: + + * some card-specific fixes + new cards. + + * separate buffer switching for video frames and vbi data, that should make + bttv less sensitive to high irq latencies. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] v4l: IR input driver update. + + This patch updates the ir-kbd-gpio and ir-kbd-i2c drivers. Nothing major, + just some keytable fixes and support for more hardware. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] saa7134 driver update + + This is an update for the saa7134 driver. Changes: + + + * add support for more TV cards, as usual ;) + + * add support for image cropping. + + * use v4l2 API to talk to the tuner chips (thus it depends on the + tuner/tda9887 patch). + + * fixes for the audio carrier scan. + + * make transport stream packet size configurable. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] v4l: cx88 driver update + + This is a update for the cx88 tv card driver. Changes: + + * finally make it build with gcc 2.95 ;) + + * add new tv cards. + + * plenty of fixes for the TV sound code. + + * use v4l2 API for communication with tuner + tda9887 + + * misc other minor stuff. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] v4l: radio-zoltrix fix. + + From: Paul Focke + + I recently upgraded from 2.4 to kernel 2.6 & noticed that the zoltrix radio + driver was not working. Seems like a little typo. I tested this on my system + and it's working fine now. I doubt there are any other linux users in the + world who still use this card ;-) + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix isdn to not assume mem*io return values + + These are defined like the normal ISO C mem* routines although x86 happens + to return void by accident. Fix isdn to not assume a return value. + + Sent to the isdn list, but as usual I didn't get any reply. + + The patch is from the Debian kernel package and really old. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] export sys_ioctl to modules + + Small patch to export sys_ioctl if CONFIG_COMPAT is set. This allows + platforms to implement 32 bit compatibility ioctl handlers in modules. + + Submitted-by: Jesse Barnes + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] mprotect propagate anon_vma + + When mprotect shifts the boundary between vmas (merging the reprotected + area into the vma before or the vma after), make sure that the expanding + vma has anon_vma if the shrinking vma had, to cover anon pages imported. + Thanks to Andrea for alerting us to this oversight. + + Cc: + Signed-off-by: Hugh Dickins + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sparse annotation for sys_quotactl() + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix possible stack corruption during reiserfs_file_write + + With preallocation turned on, reiserfs_allocate_blocks_for_region wasn't + sending a large enough array to hold all the blocks it was asking the block + allocator to find. This can result in stack corruption. + + The fix is to kmalloc an array to hold the blocks, making sure to allocate + something large enough. + + There was also a recent optimization to force the allocator to find a free + region large enough to hold the entire preallocation size. This was + sometimes causing more blocks to be allocated then had been requested, + which would also overflow the array. Something more elegant is required + here, until then just disable the optimization. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] NUMA API updates + + This patch three issues in NUMA API + + - When 1 was passed to set_mempolicy or mbind as maxnodes argument + get_nodes could corrupt the stack and cause a crash. Fix that. + + - Remove the restriction to do interleaving only for order 0. Together + with the patch that went in previously to use interleaving policy at boot + time this should give back the original behaviour of distributing the big + hash tables. + + - Fix some bad white space in comments + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] isp16 check_region() removal + + Convert check_region to request_region and clean up some parentheses in + return statements for drivers/cdrom/isp16.c. + + Signed-off-by: Jesper Juhl + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] deadline I/O scheduler documentation + + Document the deadline scheduler and its tunables. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [NET] generalise wait_for_tcp_connect + + This will be used by the poor cousins, look, for instance, at + x25_wait_for_connection_establishment :-) + + Signed-off-by: Arnaldo Carvalho de Melo + + + [NET] introduce sk_stream_wait_close, from tcp code + + Will be used by the poor cousins. + + Signed-off-by: Arnaldo Carvalho de Melo + + + [NET] generalise wait_for_tcp_memory + + Renaming it to sk_stream_wait_memory + + Signed-off-by: Arnaldo Carvalho de Melo + + + [PATCH] move as documentation + + Move the anticipatory scheduler documentation into Documentation/block. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] CREDITS update + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] NLS support for ASCII + + I created an ASCII NSL module manually based on the ISO-8859-1 NLS module. + + This might be of use for people who do not want any charset conversion to + take place. fs modules like vfat for example then could be forced to + display any non-ASCII character in the uni_xlate escaped form. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] mips: remove old junk + + Remove old, unused initialization stuff. + + Signed-off-by: Ralf Baechle + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] DS1286 cleanups + + Remove #ifdef'ed hooks for the DS1286 driver through the kernel. While + cleaning make it work as a module also and add back the core of the driver + got lost when drivers/sgi/ was shredded. + + Signed-off-by: Ralf Baechle + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Cobalt LCD Driver update + + Mostly reformatting to get the sometimes random formatting style of the LCD + driver to something Linux compliant. Use module_init/exit for module + initialization and cleanup. + + Signed-off-by: Ralf Baechle + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Add M48T35 RTC driver + + Add M48T35 RTC driver for the SGI IP27 aka Origin 200, Origin 2000 and + Onyx 2. + + Signed-off-by: Ralf Baechle + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] jfs warning fix + + On ppc64, s64 is `long'. + + In file included from fs/jfs/jfs_xtree.h:25, + from fs/jfs/jfs_incore.h:26, + from fs/jfs/super.c:29: + fs/jfs/jfs_btree.h: In function `BT_STACK_DUMP': + fs/jfs/jfs_btree.h:151: warning: long long unsigned int format, s64 arg (arg 2) + + Cc: Dave Kleikamp + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] lindent rwsem + + Lindent rwsem.c and rwsem-spinlock.c and fix a few things by hand. Also + added a couple of comments for the memory barriers. Added the __sched + annotation that was left out of rwsem-spinlock.c. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Fix warning in tdfxfb.c + + drivers/video/tdfxfb.c:1104: warning: initialization discards qualifiers from pointer target type + + Signed-off-by: Jesper Juhl + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Fix idr.h comment + + Fix path in header file. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] wanxl firware build fix + + allmodconfig and allyesconfig are currently failing because they select + wanxl firmware rebuild, and that requires an m68k assembler toolchain. + + Add a new generic option to the "Generic Driver Options" menu. The option + is defaul equals y and prevents us from building firmware unless really + needed. + + Firmware is usually provided in separate filer '_shipped', and there is no + need to rebuild them unless strictly required. First user is WanXL - which + otherwise required a m68k tool-set to compile. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Avoid rebuild of IKCFG when using O= + + When using a separate output directory the in-kernel config wiere rebuild + each time the kernel was compiled. Fix this by specifying correct path to + Makefile in the prerequisite to the ikconfig.h file. + + Signed-off-by: Sam Ravnborg + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] kbuild: add deb-pkg target + + To prepare kbuild for more kernel packaging formats move all packaging support + to scripts/package. + + In top-level Makefile introduce generic support for all package formats using + target names *-pkg. Included the old rpm target for backward compatibility. + + A new variable KBUILD_IMAGE is used to specify what kernel image will be part + of the final package, and is to be set by the arch specific makefile. + KBUILD_IMAGE may be overridden from command line or environment. KBUILD_IMAGE + will see wider usage later, mainly when installing kernel images. + + Introducing KBUILD_IMAGE allowed arch specific details to be deleted from the + mkspec and builddeb scripts. + + While in the process added the deb packet format. Script is From: Wichert + Akkerman + + To create a RPM packet use 'make rpm-pkg'. + To create a deb packet use 'make deb-pkg'. + Both targets are included in 'make help' + + Signed-off-by: Sam Ravnborg + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] only clear ->last_merge when appropriate + + Make sure we only clear q->last_merge hint, if it matches the request + currently passed in. + + Signed-off-by: Jens Axboe + Signed-off-by: Linus Torvalds + + + [PCMCIA] 06-ide + + IDE releases the PCMCIA resource to work around the need to have + two conflicting subsystems (IDE and PCMCIA) claim resources. + Since PCMCIA no longer marks its resouces busy, this work around + must be removed. + + + NTFS: Use atomic kmap instead of kmap() in fs/ntfs/aops.c::ntfs_read{page,_block}(). + + Signed-off-by: Anton Altaparmakov + + + NTFS: Use case sensitive attribute lookups instead of case insensitive ones. + + Signed-off-by: Anton Altaparmakov + + + NTFS: Lock all page cache pages belonging to mst protected attributes while + accessing them to ensure we never see corrupt data while the page is + under writeout. + + Signed-off-by: Anton Altaparmakov + + + NTFS: Add framework for generic ntfs collation (fs/ntfs/collation.[hc]). + We have ntfs_is_collation_rule_supported() to check if the collation + rule you want to use is supported and ntfs_collation() which actually + collates two data items. We currently only support COLLATION_BINARY + and COLLATION_NTOFS_ULONG but support for other collation rules will + be added as the need arises. + + Signed-off-by: Anton Altaparmakov + + + NTFS: Add a new type, ntfs_index_context, to allow retrieval of an index + entry using the corresponding index key. To get an index context, + use ntfs_index_ctx_get() and to release it, use ntfs_index_ctx_put(). + This also adds a new slab cache for the index contexts. To lookup a + key in an index inode, use ntfs_index_lookup(). After modifying an + index entry, call ntfs_index_entry_flush_dcache_page() followed by + ntfs_index_entry_mark_dirty() to ensure the changes are written out + to disk. For details see fs/ntfs/index.[hc]. Note, at present, if + an index entry is in the index allocation attribute rather than the + index root attribute it will not be written out (you will get a + warning message about discarded changes instead). + + Signed-off-by: Anton Altaparmakov + + + Add support for MPC8560 CPU and WindRiver PowerQUICC III SBC8560 + + Signed-off-by: Kumar Gala + + + NTFS: Load the quota file ($Quota) and check if quota tracking is enabled + and if so, mark the quotas out of date. This causes windows to + rescan the volume on boot and update all quota entries. + + Signed-off-by: Anton Altaparmakov + + + Update CPM UART driver according to feedback from Dan Malek. + Patch from Pantelis Antoniou + + + [PATCH] avoiding obsolete scsi APIs in dc395 + + replace obsolete typedefs and scsi_to_pci_dma_dir, use proper includes + and re-order includes correctly. + + Signed-off-by: James Bottomley + + + [NET] generalise tcp_set_owner_r and tcp_rfree + + Will be used by the poor cousins + + Signed-off-by: Arnaldo Carvalho de Melo + + + [NET]: Fix dev_queue_xmit build with older gcc. + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [NET]: Loopback, allocate per-cpu stats statically and fix cpu refcounting. + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [PPC32] Add SysRq-G support to our KGDB stub. + From David Woodhouse . + + + Rename 'carmel' block driver to 'sx8'. + + Requested by Promise. The hardware isn't widely deployed yet, + with almost all users being early evaluators, so this should be OK. + + + [ACPI] fix double timer interrupt mapping (Hans-Frieder Vogt) + caused by errant fix for OSDL 2835 + + + [NET]: In sungem driver, keep track of rx buffer alloc size based upon MTU. + + + [PATCH] wd7000 updates + + Avoid old APIs and fix a bad bug were the irq handler argument was + derefenced as struct Scsi_Host * instead of Adpater * which made the + driver instantly crash on SMP. + + Signed-off-by: James Bottomley + + + [NETFILTER]: Fix non-existant config option for IP_NF_ASSERT, fix some broken assertions + + Signed-off-by: Patrick McHardy + Signed-off-by: Harald Welte + Signed-off-by: David S. Miller + + + [NETFILTER]: complain about brokeness on SMP for pid, sid and command matching in ipt_owner + + Signed-off-by: Patrick McHardy + Signed-off-by: Harald Welte + Signed-off-by: David S. Miller + + + [NETFILTER]: Change permissions of /proc/net/ip_conntrack to 0440 + + Signed-off-by: Patrick McHardy + Signed-off-by: Harald Welte + Signed-off-by: David S. Miller + + + [NETFILTER]: skip internal targets in iptables proc listing + + Signed-off-by: Patrick McHardy + Signed-off-by: Harald Welte + Signed-off-by: David S. Miller + + + [PATCH] wd33c93 update + + avoid obsolete APIs + + Signed-off-by: James Bottomley + + + [NETFILTER]: Fix inverted matching in ipt_helper + + Signed-off-by: Patrick McHardy + Signed-off-by: Harald Welte + Signed-off-by: David S. Miller + + + [NETFILTER]: 'any' matching in ipt_helper + + Signed-off-by: Patrick McHardy + Signed-off-by: Harald Welte + Signed-off-by: David S. Miller + + + [NETFILTER]: Don't reroute on nfmark change in mangle table when routing by nfmark is not enabled + + Signed-off-by: Patrick McHardy + Signed-off-by: Harald Welte + Signed-off-by: David S. Miller + + + [NETFILTER]: Fix expectation eviction order + + Signed-off-by: Patrick McHardy + Signed-off-by: Harald Welte + Signed-off-by: David S. Miller + + + [NETFILTER]: Fix offset calculation in amanda conntrack helper + + Signed-off-by: Patrick McHardy + Signed-off-by: Harald Welte + Signed-off-by: David S. Miller + + + [NETFILTER]: Relax hook check in ipt_CLASSIFY + + Signed-off-by: Patrick McHardy + Signed-off-by: Harald Welte + Signed-off-by: David S. Miller + + + [NETFILTER]: Add new function 'nf_reset' to reset netfilter related skb-fields + + Signed-off-by: Patrick McHardy + Signed-off-by: Harald Welte + Signed-off-by: David S. Miller + + + [NETFILTER]: Add addrtype match + + Signed-off-by: Patrick McHardy + Signed-off-by: Harald Welte + Signed-off-by: David S. Miller + + + [NETFILTER]: Add realm match + + Signed-off-by: Patrick McHardy + Signed-off-by: Harald Welte + Signed-off-by: David S. Miller + + + [NETFILTER]: ip_table_raw C99 initialization + + Signed-off-by: Patrick McHardy + Signed-off-by: Harald Welte + Signed-off-by: David S. Miller + + + [PATCH] avoid obsolete APIs in sr + + Signed-off-by: James Bottomley + + + [PATCH] avoid obsolete APIs in fdomain + + Signed-off-by: James Bottomley + + + [PATCH] avoid obsolete APIs in atp870u + + + minor cleanups + + Signed-off-by: James Bottomley + + + [PATCH] aacraid 32bit app ioctl compat patch (Updated) + + Allows 32 bit apps to use ioctls in a 64 bit kernel. + + Signed-off-by Mark Haverkamp + Signed-off-by: James Bottomley + + + [PKT_SCHED]: C99'ify act_police_ops. + + + merge fixups. + + + [PATCH] tmscsim: init / exit cleanup + + On Sun, 23 May 2004, Christoph Hellwig wrote: + > these leaks. Maybe also merge dc390_init and dc390_init_one? + > + > Similarly I think DC390_release should be merged into dc390_remove_one. + + Attached. Also fixed some __init / __devinit and __exit / __devexit + attributes. Although, would be good to have something like + + #ifdef CONFIG_HOTPLUG_PCI + #define __pcidevinit + #define __pcidevinitdata + #define __pcidevexit + #define __pcidevexitdata + #else + #define __pcidevinit __init + #define __pcidevinitdata __initdata + #define __pcidevexit __exit + #define __pcidevexitdata __exitdata + #endif + + Signed-off-by: James Bottomley + + + [ACPI] re-factor previous mpparse IRQ override fix (Linus Torvalds) + Reflect that only the dstirq depends on the dstapic. + + + [PATCH] tmscsim: host_lock use in LLD + + While reviewing tmscsim, I noticed something, I didn't quite like / + understand. The driver takes the host_lock (with irqsave) at the entry to + the ISR, and releases it at the exit. And inside the ISR there are + potentially long busy-waits... Like + + int ctr = 6000000; /* only try for about a second */ + while( --ctr && !((dstate = DC390_read8 (DMA_Status)) & + DMA_XFER_DONE) && pSRB->SGToBeXferLen ); + + The attached patch is attempting to fix those places. Not sure if this is + a proper fix though. In my understanding, after looking through the code, + the host_lock is used to protect host-specific data and host-registers. + The ->queuecommand is already called with it help, so, one just, + basically, have to protect other contexts - interrupt, timer,... So, looks + mostly right. + + Signed-off-by: James Bottomley + + + [NET] generalise tcp_error, renaming it to sk_stream_error + + Signed-off-by: Arnaldo Carvalho de Melo + + + [PATCH] ibmtr missing include + + + [PATCH] sparse: ncpfs/ioctl.c annotation + + + [PATCH] sparse: zlib stray extern removal + + + [PATCH] sparse: efivars.c initializer fix + + + [PATCH] sparse: drivers/net/wan annotation + + + [PATCH] sparse: raw1394 annotation + + + [PATCH] sparse: sock_fprog sanitized + + sock_fprog instances that had kernel pointer in ->filter (both of them - + in ppp_generic and isdn_ppp) replaced with explicit pairs len + kernel + pointer. Copying of userland sock_fprog (with its __user ->filter) + cleaned up and sanitized. + + Trivial annotation done in the rest of ->ioctl() in ppp_generic and + isdn_ppp. + + + [PATCH] sparse: quota annotation + + + [PATCH] sparse: hd.c annotation + + + [PATCH] sparse: the rest of ieee1394 annotation + + + [NET] generalise tcp_free_skb, renaming it to sk_stream_free_skb + + Will be used by the poor cousins + + Signed-of-by: Arnaldo Carvalho de Melo + + + [PATCH] 2.6.7-mm1: drivers/scsi/hosts.h -> scsi/scsi_host.h + + On Sun, Jun 20, 2004 at 05:46:32PM -0700, Andrew Morton wrote: + >... + > All 226 patches: + >... + > bk-libata.patch + >... + + drivers/scsi/hosts.h is obsolete, use scsi/scsi_host.h. + + Please apply + Adrian + + + [NET] generalise tcp_moderate_sndbuf + + Renaming it to sk_stream_moderate_sndbuf, further patches will move + all the tcp memory pressure handling support into net/core/stream.c + to make them usable by the poor cousins, starting with LLC. + + Signed-off-by: Arnaldo Carvalho de Melo + + + [libata] move some code around + + Split ata_eng_timeout into the main part (ata_qc_timeout) + and the part called by the SCSI layer (ata_eng_timeout). + + Zero behavior changes. + + + Fix up permissions of some files that were not readable + by "other". The normal permissions for the kernel tree + should be -rw-r--r--. + + + [libata] fix build error, minor cleanups + + + [libata ata_piix] combined mode bug fix; improved ICH6 support + + + [NET] move send_head from tcp private area to struct sock + + The poor cousins also need this, LLC will be the first to use it. + + Signed-off-by: Arnaldo Carvalho de Melo + + + NTFS: Forgot the set_page_writeback()/end_page_writeback() in the mst + protected writepage case. + + Signed-off-by: Anton Altaparmakov + + + [ARM] Move cpu_switch_mm() and cpu_get_pgd() to asm/proc-fns.h + + + [PATCH] [1/18] qla2xxx: Add wmb() to critical paths + + Add memory barriers to ensure that all load operations have + completed before the (MMIO) write to the ISP's registers. + + Signed-off-by: Andrew Vasquez + Signed-off-by: James Bottomley + + + [PATCH] [2/18] qla2xxx: Correct residual counts + + Problem reported/corrected by Tony Battersby [tonyb@cybernetics.com]: + + o The qla2xxx driver calculates data transfer residuals + for some but not all circumstances. The patch below + adds data transfer residual calculations for the + remaining cases. + + o Interrogate the proper cmnd[] array when determining + the transfer direction. + + Signed-off-by: Andrew Vasquez + Signed-off-by: James Bottomley + + + [PATCH] qla2xxx: remove unnecessary command direction determination + + On Tuesday, June 22, 2004 12:07 AM, Arjan van de Ven wrote: + > On Tue, 2004-06-22 at 07:49, Andrew Vasquez wrote: + > + > > diff -Nru a/drivers/scsi/qla2xxx/qla_iocb.c + > b/drivers/scsi/qla2xxx/qla_iocb.c + > > --- a/drivers/scsi/qla2xxx/qla_iocb.c 2004-06-21 15:36:37 -07:00 + > > +++ b/drivers/scsi/qla2xxx/qla_iocb.c 2004-06-21 15:36:37 -07:00 @@ + > > -43,7 +43,7 @@ else if (cmd->sc_data_direction == + > > DMA_FROM_DEVICE) cflags = CF_READ; else { + > > - switch (cmd->data_cmnd[0]) { + > > + switch (cmd->cmnd[0]) { + > > case WRITE_6: + > > case WRITE_10: + > > case WRITE_12: + > + > this sounds wrong. + > + + Yes, it is _wrong_! This code is baggage left behind from earlier + drivers when we were 'asked' to work around certain applications' + inability to properly construct commands. + + > Is there any reason qlogic drivers can't use/trust the midlayer + > instead of doing qla2x00_get_cmd_direction() to reverse engineer to + > direction ?? + + Sure. Especially considering an earlier thread: + + http://marc.theaimsgroup.com/?t=108727983000002&r=1&w=2 + + Signed-off-by: James Bottomley + + + [PATCH] [3/18] qla2xxx: PCI DMA mappings rework + + Restructure qla2x00_start_scsi() so that PCI mappings are + done after we've verified command list and request queue + resource availability. + + Signed-off-by: Andrew Vasquez + Signed-off-by: James Bottomley + + + [PATCH] [4/18] qla2xxx: ISR RISC paused fixes + + Problem reported/corrected by Michael Reed [mdr@sgi.com]: + + We have a 2312 that puts the 8.00.00b12-k qla2xxx driver + into an infinite loop with a solid interrupt, 0x8008, + hcsr = 0x7430, risc status register 0x40008110, + immediately after enabling parity on the board. + + It looks as though the early out test in + qla_isr.c:qla2x00_intr_handler() against stat is broken. + HSR_RISC_PAUSED is set. Also, there's a stale mailbox + completion flagged (stat&0xff) which will short circuit + the default case in the switch if it got that far. + + Signed-off-by: Andrew Vasquez + Signed-off-by: James Bottomley + + + [PATCH] [5/18] qla2xxx: Add module parameter permissions + + Add permissions to the driver's module_params. + + Signed-off-by: Andrew Vasquez + Signed-off-by: James Bottomley + + + [PATCH] [6/18] qla2xxx: Initialization fixes + + Small initialization fixes: + + o 'point-to-point preferred, else loop' is not a safe + connection mode setting for ISP2200 boards. Use + 'loop preferred, else point-to-point.' + + o Add modules parameter to enable ZIO -- Support mode + 5 only. + + o No point in doing a PRLI (process login) to the SNS + port. + + o Fix problem where the driver would incorrectly skip + ports with the same domain and area of the HBA. + + Signed-off-by: Andrew Vasquez + Signed-off-by: James Bottomley + + + [PATCH] [7/18] qla2xxx: Tape command handling fixes + + Fix several tape handling issue: + + 1) When the firmware receives the LOGO from the device, any + active exchanges will be returned with a completion status + of 0x29 -- this will cause the port to be marked as lost and + request made to the DPC routine to begin a relogin attempt. + The problem is, since we've never actually logged out of the + device and cannot do so in interrupt context, we must be + sure to perform the logout before the qla2x00_fabric_login() + in the RELOGIN_NEEDED code. + + 2) Sets the Get Port Database options to ZERO when issuing + the call to qla2x00_get_port_database(). This consolidates + actuall login handling in the place it should be, in the + previous qla2x00_fabric_login() call rather than depending + on any 'hidden' behaviour of the firmware. If a device did + a LOGO after the login, then any subsequent exachanges will + be returned with an 0x29 completion status and the + RELOGIN_NEEDED code will handle the login. + + 3) Finally, if the master and slave state do not indicate a + logged-in state from the Get Port Database call, then one + cannot depend on the information returned from the firmware + -- the firmware typically wipes out the PCB information for + a given loopID when logged out. So, return immediately with + a failed status. + + Signed-off-by: Andrew Vasquez + Signed-off-by: James Bottomley + + + [PATCH] [8/18] qla2xxx: Remove dead code + + Remove several unused failover variables and functions from + the embedded driver. + + Signed-off-by: Andrew Vasquez + Signed-off-by: James Bottomley + + + [PATCH] [9/18] qla2xxx: Tape command handling fixes + + Address several outstanding problem within the various + eh_*() functions: + + o Fixup nested spinlock usage in error-hanlding + functions. + + o Set the Loop down timer during abort isp if loop + was already down for the driver to detect cable + is unplugged at min time. + + Signed-off-by: Andrew Vasquez + Signed-off-by: James Bottomley + + + [PATCH] [10/18] qla2xxx: Additional tape handling fixes + + Issue a big-hammer after link-down-timeout expires in order + properly return tape commands to the mid-layer. + + Signed-off-by: Andrew Vasquez + Signed-off-by: James Bottomley + + + [ARM] Correct MMCI clock rate on Integrator/CP. + + + [PATCH] [11/18] qla2xxx: Misc. fixes + + Small fixes: + + o Remove incorrect and unused ISP2100 #define + SS_RESIDUAL_LEN_VALID. + + o Fix problem where an incorrect status would be returned + for qla2x00_configure_fabric() if the driver was unable to + log into a fabric's SNS. + + o Check for the additional WAIT_FOR_AL_PA state in + qla2x00_fw_ready() since switch vendors may push NOS/OLS + primitives during a 'port disabled' state. + + Signed-off-by: Andrew Vasquez + Signed-off-by: James Bottomley + + + [PATCH] [12/18] qla2xxx: Extend firmware dump support + + Add firmware dump support for ISPs with memory chips larger than + 128KB (512/1024KB). + + Signed-off-by: Andrew Vasquez + Signed-off-by: James Bottomley + + + [PATCH] Fix sparse warning in fs/devfs/base.c + + From: Mika Kukkonen + Signed-off-by: Randy Dunlap + Signed-off-by: Linus Torvalds + + + [PATCH] Fix sparse warning in fs/proc/base.c + + From: Mika Kukkonen + Signed-off-by: Randy Dunlap + Signed-off-by: Linus Torvalds + + + [PATCH] Fix sparse warning in drivers/block/ll_rw_blk.c + + From: Mika Kukkonen + Signed-off-by: Randy Dunlap + Signed-off-by: Linus Torvalds + + + [PATCH] sparse: make sys_quotactl() prototype match function + + Al missed this one in his sparse fixes + + Signed-off-by: Randy Dunlap + Signed-off-by: Linus Torvalds + + + [PATCH] [13/18] qla2xxx: Remove TRUE/FALSE usage + + Christoph Hellwig : + + o Remove TRUE/FALSE #define usage within the driver. + + Signed-off-by: Andrew Vasquez + Signed-off-by: James Bottomley + + + PATCH [14/18] qla2xxx: Use proper include files + + From: Andrew Vasquez + + Use the standard include/scsi/* headers rather than those in + drivers/scsi/. Slightly modified variant from initial patch sent by + Christoph Hellwig . + + Signed-off-by: Andrew Vasquez + Signed-off-by: James Bottomley + (fixed rejections) + + + [PATCH] [15/18] qla2xxx: SRB handling cleanup and fixes + + Cleanup qla2x00_eh_wait_on_command() srb_t handling. + + Signed-off-by: Andrew Vasquez + Signed-off-by: James Bottomley + + + PATCH [16/18] qla2xxx: 23xx/63xx firmware updates + + From: Andrew Vasquez + + Resync with latest released firmware -- 3.02.30. + + Signed-off-by: Andrew Vasquez + Signed-off-by: James Bottomley + + + [PATCH] [17/18] qla2xxx: Bus reset handler fixes + + Fix incorrect return-code check in bus-reset error handler. + + Signed-off-by: Andrew Vasquez + Signed-off-by: James Bottomley + + + [PATCH] [18/18] qla2xxx: Update driver version + + Update version number to 8.00.00b14-k. + + Signed-off-by: Andrew Vasquez + Signed-off-by: James Bottomley + + + [PATCH] USB: sparse fixups for devio.c + + + [PATCH] I2C: Drop out-of-date code in w83781d and w83627hf + + Here is a simple patch which drops some out-of-date code in the w83781d + and w83627hf i2c chip drivers. These bits are left over from the times + when chip drivers were setting default limits at init. + + + Signed-off-by: Jean Delvare + Signed-off-by: Greg Kroah-Hartman + + + [patch-kj] kernel_thread() audit drivers/scsi/aacraid/rx.c + + + Fix C99'ism that breaks older gcc's. + + Also clean it all up - use get_cpu()/put_cpu() instead of + playing games by hand with preemption. + + + [patch-kj] kernel_thread() audit drivers/scsi/aacraid/rkt.c + + From: maximilian attems + + Cleaned up code for error handing. Added checks to unmap memory, + release IRQ's, and freeing up dev->queue. + + Signed-off-by: MJK + Signed-off-by: Maximilian Attems + Signed-off-by: James Bottomley + (fixed up rejects by hand) + + + [PATCH] kernel_thread() audit drivers/scsi/aacraid/sa.c + + Cleaned up code for error handing. Added checks to unmap memory, + release IRQ's, and freeing up dev->queue. + + Signed-off-by: MJK + Signed-off-by: Maximilian Attems + Signed-off-by: James Bottomley + + + [blk carmel] s/carmel/sx8/ in the driver itself + + + sparse: clean up warning in swapfile.c + + + [PATCH] HSV100 is verified as supporting REPORT LUNs + + Signed-off-by: James Bottomley + + + [NET] Move sndmsg_page and sndmsg_off to struct sock + + Yeah, the poor cousins will use this as well :-) + + + [IPSEC]: In ESP, do not put scatterlist array on stack. + + Put it in per-esp data instead. Noticed by Linus. + + Signed-off-by: David S. Miller + + + [NET]: In loopback, make get_stats() get correct per-cpu stats. + + Signed-off-by: Arthur Kepner + Signed-off-by: David S. Miller + + + [PPC32] Change how we handle DP memory on MPC8xx. + We now have a 'remote heap' implemented (see comments in + arch/ppc/lib/rheap.c) which manages this memory. + From Pantelis Antoniou . + Signed-off-by: Tom Rini + + + [NET] rename struct inet_protocol to net_protocol + + The poor cousins will also have registration routines, etc. + + Signed-off-by: Arnaldo Carvalho de Melo + + + [PPC32] Update CPM2 (MPC82xx/MPC85xx) code to use rheap for DP memory + Originally from: Rune Torgersen + Signed-off-by: Tom Rini + + + [NET] remove fill_page_desc, its just a copy of skb_fill_page_desc + + Also remove an unused inet_opt variable from ipv6 code. + + Signed-off-by: Arnaldo Carvalho de Melo + + + [PATCH] raw.c cleanups + + - pass the raw_config_request by reference, not by value. + + - fix whitespace drainbamage + + Signed-off-by: Andrew Morton + Signed-off-by: Greg Kroah-Hartman + + + [ARM PATCH] 1913/1: lh7a40x #3 (1/2) serial + + Patch from Marc Singer + + Serial console and port driver for the LH7a40x CPUs. The only change + made since the last patch was to change the PORT_ID (again). This + patch superceeds two serial driver patches. + + + + [ARM PATCH] 1933/1: Convert PXA serial driver to device model and implement suspend and resume + + Patch from Ian Campbell + + Patch 1848/1 removed the hack for preserving FFUART over sleep. + + This patch adds back that support in the correct place by converting + the PXA serial driver to use the driver model and hooking up the + suspend and resume methods. + + + [ARM PATCH] 1935/1: Fix bug in sa1111 driver + + Patch from John Lenz + + The __sa1111_probe function is declared __init, and it is called from + the sa1111_probe function, which is not declared __init. + + Signed-off-by: John Lenz + + + [PATCH] PCI: Fix MSI-X setup + + msix_capability_init() puts the offset of the MSI-X capability into + pos, then uses pos as a loop index to clear the MSI-X vector table, + and then tries to use pos as the offset again, which results in + writing the MSI-X enable bit off into space. + + This patch fixes that by adding a new loop index variable and using + that to clear the vector table. + + Signed-off-by: Roland Dreier + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] PCI: remove duplicate in pci_ids.h + + Get rid of duplicate entry, one is in the middle of the file with duplicate + at the end + + Signed-off-by: Stephen Hemminger + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] PCI: fix out of order entry in pci_ids.h + + The last entry in pci_ids.h is out of order, someone wasn't reading the comment + to keep it sorted. + + Signed-off-by: Stephen Hemminger + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] PCI: add id's for sk98 driver + + Redoing the sk98 driver to correct pci model. These are (most of) the entries + it uses. + + + Signed-off-by: Greg Kroah-Hartman + + + [ARM PATCH] 1936/1: Update collie fb entries to use new style initializers + + Patch from John Lenz + + Switches the collie framebuffer mach_info structure to use + the new initializers. + + Signed-off-by: John Lenz + + + [ARM PATCH] 1939/1: SA1100 watchdog driver also works on PXA2xx + + Patch from Ian Campbell + + The SA1100 watchdog driver also works fine on the PXA2xx. Tested on + a PXA255 based platform. + + + [NET]: rtentry->rt_dev is __user. + + The device entry in the route ioctl's needs annotation. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [IPV4]: ip_rt_ioctl argument is user pointer. + + The function ip_rt_ioctl expects a pointer to a user route structure, so define + it that way and cast as appropriate. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [BRIDGE]: Turn off debug message in bridge ioctl. + + Trivial patch to turn off a debug message. It seems some SNMP daemons just + periodically trying to look at MII state. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [ARM PATCH] 1940/1: asm-arm/checksum.h - missing include + + Patch from David Vrabel + + Missing include (cf. include/asm-i386/checksum.h) in include/asm-arm/checksum.h. + + + [libata sata_sil] Re-fix mod15write bug + + Certain early SATA drives have problems with write requests whose + length satisfy the equation "sectors % 15 == 1", on the SiI 3112. + Other drives, and other SiI controllers, are not affected. + + The fix for this problem is to avoid such requests, in one of three + ways, for the affect drive+controller combos: + 1) Limit all writes to 15 sectors + 2) Use block layer features to avoid creating requests whose + length satisfies the above equation. + 3) When a request satisfies the above equation, split the request + into two writes, neither of which satisfies the equation. + + I chose fix #1, the most simple to implement. After discussion with + Silicon Image and others regarding the impact of this fix, I have + decided to remain with fix #1, and will not be implementing a + "better fix". This means that the affected SATA drives will see + decreased performance, but set of affected drives is small and will + never grow larger. + + Further, the complexity of implementing solution #2 or + solution #3 is rather large. + + When implementing lba48 'large request' support, I unintentionally + broke the fix for these affected drives. Kudos to Ricky Beam for + noticing this. + + This change restores the fix, by adding a flag ATA_DFLAG_LOCK_SECTORS + to indicate that the max_sectors value set by the low-level driver + should never be changed. + + + [NET] Generalise tcp memory pressure handling + + Signed-off-by: Arnaldo Carvalho de Melo + + + [PATCH] ppc32: Cleanups & warning fixes of traps.c + + This cleans up arch/ppc/kernel/traps.c and vecemu.c to use the same + formatting style for all functions, and fixes 2 warnings in the altivec + floating point emulation code. No functional change. + + Signed-off-by: Benjamin Herrenschmidt + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32: oprofile support + + This adds basic oprofile support to ppc32. Originally from Anton + Blanchard, I just re-diffed it against current kernels. + + Signed-off-by: Anton Blanchard + Signed-off-by: Benjamin Herrenschmidt + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32: Support for new Apple laptop models + + This adds support for newer Apple laptop models. It adds the basic + identification for the new motherboards and the cpufreq support for + models using the new 7447A CPU from Motorola. + + This is mostly the work of John Steele Scott with + some bits from Sebastian Henschel and some rework by + myself. Please apply, + + Signed-off-by: John Steele Scott + Signed-off-by: Sebastian Henschel + Signed-off-by: Benjamin Herrenschmidt + Signed-off-by: Linus Torvalds + + + [PATCH] radeonfb: Fix panel detection on some laptops + + The code in radeonfb looking for the BIOS image currently uses the BIOS + ROM if any, and falls back to the RAM image if not found. This is + unfortunatly not correct for a bunch of laptops where the real panel + data are only present in the RAM image. + + This works around this problem by preferring the RAM image on mobility + chipsets. This is definitely not the best workaround, we need some arch + support for linking the RAM image to the PCI ID (preferrably by having + the arch snapshot it during boot, isolating us completely from the + details of where this image is in memory). I'll see how we can get such + an improvement later. + + Signed-off-by: Benjamin Herrenschmidt + Signed-off-by: Linus Torvalds + + + [PATCH] Handle altivec assist exception properly + + This is the PPC64 counterpart of the PPC32 Altivec assist exception + handler that went in recently. + + On PPC64 machines with Altivec (i.e. machines that use the PPC970 chip, + such as the G5 powermac), the altivec floating-point instructions can + operate in two modes: one where denormalized inputs or outputs are + truncated to zero, and one where they aren't. In the latter mode the + processor can take an exception when it encounters denormalized + floating-point inputs or outputs rather than dealing with them in + hardware. + + This patch adds code to deal properly with the exception, by emulating + the instruction that caused the exception. Previously the kernel just + switched the altivec unit into the truncate-to-zero mode, which works + but is a bit gross. Fortunately there are only a limited set of altivec + instructions which can generate the assist exception, so we don't have + to emulate the whole altivec instruction set. + + Note that Altivec is Motorola's name for the PowerPC vector/SIMD + instructions; IBM calls the same thing VMX, and currently only IBM makes + 64-bit PowerPC CPU chips. Nevertheless, I have used the term Altivec in + the PPC64 code for consistency with the PPC32 code. + + Signed-off-by: Paul Mackerras + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32: Support for new Apple laptop models + + This adds sound support for some of the newer PowerBooks. It appears + that this chip supports the AWACS sample rates, but has a snapper-style + mixer. Tested and works on my PowerBook5,4. + + Signed-off-by: Jesse Barnes + Signed-off-by: Linus Torvalds + + + WindRiver PowerQUICC III platform support cleanup. + + Respond to maintainer feedback -- remove unneeded setup for + the FEC port which doesn't exist; small cosmetic changes. + + Signed-off-by: Kumar Gala + + + [NETFILTER]: Fix iptable_raw.c build with older gcc. + + + [ARM] Fix Integrator/CP timer support. + + + [PATCH] bug in V-link handling (arch/i386/pci/irq.c) + + Via southbridges use register 0x3c of the on-board devices (USB and + AC97) to control interrupt routing for those. In drivers/pci/quirks.c we + set it correctly (dev->irq & 15). However, in pirq_enable_irq() where the + second half of that stuff lives, we forget to apply the mask. + + That's what causes problems with ioapic on via motherboards in 2.6. + One-liner below ACKed by Alan, verified on via-based boxen here, obviously + doesn't affect non-via ones (we only set interrupt_line_quirk for via + chipsets). + + + [ARM] Fix platform device registration. + + Since the platform device registration is now merged into the driver + model, remove it from the ARM specific code. + + + [NET] Generalise tcp_{writequeue_purge,rmem_schedule,alloc_{pskb,page}} + + Only new requirement was to add a max_header field to struct sock sk_prot + member. + + Signed-off-by: Arnaldo Carvalho de Melo + + + [ARM PATCH] 1943/1: OMAP compile fix + + Patch from Tony Lindgren + + This patch fixes OMAP compile after the ARM timer changes + in cset 1.1821.5.3 and dma-mapping device address translation + in cset 1.1821.5.3. + + + [PATCH] USB: Add logical connect-change notices to the hub driver + + This patch implements the missing functionality necessary to get device + resets working fully. It adds a bit-array of ports with logical + connect-changes pending to the hub structure, so that the hub driver can + recognize that these ports should be treated as though they had + disconnected and re-connected. This is how we will handle devices that + "morph" (i.e., change their descriptors) following a reset, as might + happen with a firmware upload. + + There is also a lot of additional kerneldoc and a few small changes to + some log messages. An important restriction is that usb_reset_device() + will refuse to work if the device is suspended. Trying to reset a + suspended device leads to several problems, not least of which is that the + device's parent hub might be suspended as well. + + With this patch the device reset code is pretty much complete. However it + won't always work correctly until the device locking is straightened out. + That's coming up next. + + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Fail pending URBs in dummy_hcd upon disconnect + + This patch fixes another bug in the dummy_hcd driver. When a gadget + driver unregisters (simulating a device disconnect), dummy_hcd stops the + timer that it uses for processing outstanding URBs. Unfortunately this + means that those URBs will never be given back. The patch lets the timer + continue running; when it expires all the remaining URBs will fail so the + timer won't be reinitialized. + + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: patches to acm driver + + - races with urb->current, union header evaluation, DMA handling + + Signed-off-By: Oliver Neukum + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: another error check in acm + + I overlooked that setting control lines in open can fail. + + - check for error doing control transfers + + Signed-Off-By: Oliver Neukum + Signed-off-by: Vojtech Pavlik + Signed-off-by: Greg Kroah-Hartman + + + [ARM] Fix EBSA110 timer functions. + + Unfortunately this broke in Deepak's merge. Fix it. + + + [ARM] Fix Footbridge timer functions. + + + [ARM] Fix acornfb build error. + + + [PATCH] PCI: (one more) PCI quirk for SMBus bridge on Asus P4 boards + + my board has one of those "clever" bioses that hide the smbus. this tiny + patch adds it to the Bad Guy List (TM). + + + Signed-off-by: Greg Kroah-Hartman + + + [NETFILTER]: Use correct size_t printk format string in ipt_addrtype.c + + + [ATM]: In proc_mpc_read, make length ssize_t. + + + [NET] make the struct proto entries related to memory pressure be pointers + + This is needed because tcpv6_prot has to point to the same place tcp_prot points, + as they share the same accounting variables. + + This fixes a bug noticed by David Miller when using the ipv6_mapped functionality, + thanks David! + + Signed-off-by: Arnaldo Carvalho de Melo + Signed-off-by: David S. Miller + + + [PATCH] Allow i386 to reenable interrupts on lock contention + + From: Zwane Mwaikambo + + Following up on Keith's code, I adapted the i386 code to allow enabling + interrupts during contested locks depending on previous interrupt + enable status. Obviously there will be a text increase (only for non + CONFIG_SPINLINE case), although it doesn't seem so bad, there will be an + increased exit latency when we attempt a lock acquisition after spinning + due to the extra instructions. How much this will affect performance I'm + not sure yet as I haven't had time to micro bench. + + text data bss dec hex filename + 2628024 921731 0 3549755 362a3b vmlinux-after + 2621369 921731 0 3543100 36103c vmlinux-before + 2618313 919222 0 3537535 35fa7f vmlinux-spinline + + The code has been stress tested on a 16x NUMAQ (courtesy OSDL). + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] jbd needs to wait for locked buffers + + From: Chris Mason + + jbd needs to wait for any io to complete on the buffer before changing the + end_io function. Using set_buffer_locked means that it can change the + end_io function while the page is in the middle of writeback, and the + writeback bit on the page will never get cleared. + + Since we set the buffer dirty earlier on, if the page was previously dirty, + pdflush or memory pressure might trigger a writepage call, which will race + with jbd's set_buffer_locked. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Move saved_command_line to init/main.c + + From: Rusty Russell + + Currently every arch declares its own char saved_command_line[]. Make sure + every arch defines COMMAND_LINE_SIZE in asm/setup.h, and declare + saved_command_line in linux/init.h (init/main.c contains the definition). + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] rcu lock update: Add per-cpu batch counter + + From: Manfred Spraul + + Below is the one of my patches from my rcu lock update. Jack Steiner tested + the first one on a 512p and it resolved the rcu cache line trashing. All were + tested on osdl with STP. + + Step one for reducing cacheline trashing within rcupdate.c: + + The current code uses the rcu_cpu_mask bitmap both for keeping track of the + cpus that haven't gone through a quiescent state and for checking if a cpu + should look for quiescent states. The bitmap is frequently changed and the + check is done by polling - together this causes cache line trashing. + + If it's cheaper to access a (mostly) read-only cacheline than a cacheline that + is frequently dirtied, then it's possible to reduce the trashing by splitting + the rcu_cpu_mask bitmap into two cachelines: + + The patch adds a generation counter and moves it into a separate cacheline. + This allows to removes all accesses to rcu_cpumask (in the read-write + cacheline) from rcu_pending and at least 50% of the accesses from + rcu_check_quiescent_state. rcu_pending and all but one call per cpu to + rcu_check_quiescent_state access the read-only cacheline. Probably not enough + for 512p, but it's a start, just for 128 byte more memory use, without slowing + down rcu grace periods. Obviously the read-only cacheline is not really + read-only: it's written once per grace period to indicate that a new grace + period is running. + + Tests on an 8-way Pentium III with reaim showed some improvement: + + oprofile hits: + Reference: http://khack.osdl.org/stp/293075/ + Hits % + 23741 0.0994 rcu_pending + 19057 0.0798 rcu_check_quiescent_state + 6530 0.0273 rcu_check_callbacks + + Patched: http://khack.osdl.org/stp/293076/ + 8291 0.0579 rcu_pending + 5475 0.0382 rcu_check_quiescent_state + 3604 0.0252 rcu_check_callbacks + + The total runtime differs between both runs, thus the % number must + be compared: Around 50% faster. I've uninlined rcu_pending for the + test. + + Tested with reaim and kernbench. + + Description: + + - per-cpu quiescbatch and qs_pending fields introduced: quiescbatch contains + the number of the last quiescent period that the cpu has seen and qs_pending + is set if the cpu has not yet reported the quiescent state for the current + period. With these two fields a cpu can test if it should report a + quiescent state without having to look at the frequently written + rcu_cpu_mask bitmap. + + - curbatch split into two fields: rcu_ctrlblk.batch.completed and + rcu_ctrlblk.batch.cur. This makes it possible to figure out if a grace + period is running (completed != cur) without accessing the rcu_cpu_mask + bitmap. + + - rcu_ctrlblk.maxbatch removed and replaced with a true/false next_pending + flag: next_pending=1 means that another grace period should be started + immediately after the end of the current period. Previously, this was + achieved by maxbatch: curbatch==maxbatch means don't start, curbatch!= + maxbatch means start. A flag improves the readability: The only possible + values for maxbatch were curbatch and curbatch+1. + + - rcu_ctrlblk split into two cachelines for better performance. + + - common code from rcu_offline_cpu and rcu_check_quiescent_state merged into + cpu_quiet. + + - rcu_offline_cpu: replace spin_lock_irq with spin_lock_bh, there are no + accesses from irq context (and there are accesses to the spinlock with + enabled interrupts from tasklet context). + + - rcu_restart_cpu introduced, s390 should call it after changing nohz: + Theoretically the global batch counter could wrap around and end up at + RCU_quiescbatch(cpu). Then the cpu would not look for a quiescent state and + rcu would lock up. + + Signed-off-by: Manfred Spraul + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] rcu lock update: Use a sequence lock for starting batches + + From: Manfred Spraul + + Step two for reducing cacheline trashing within rcupdate.c: + + rcu_process_callbacks always acquires rcu_ctrlblk.state.mutex and calls + rcu_start_batch, even if the batch is already running or already scheduled to + run. + + This can be avoided with a sequence lock: A sequence lock allows to read the + current batch number and next_pending atomically. If next_pending is already + set, then there is no need to acquire the global mutex. + + This means that for each grace period, there will be + + - one write access to the rcu_ctrlblk.batch cacheline + + - lots of read accesses to rcu_ctrlblk.batch (3-10*cpus_online()). Behavior + similar to the jiffies cacheline, shouldn't be a problem. + + - cpus_online()+1 write accesses to rcu_ctrlblk.state, all of them starting + with spin_lock(&rcu_ctrlblk.state.mutex). + + For large enough cpus_online() this will be a problem, but all except two + of the spin_lock calls only protect the rcu_cpu_mask bitmap, thus a + hierarchical bitmap would allow to split the write accesses to multiple + cachelines. + + Tested on an 8-way with reaim. Unfortunately it probably won't help with Jack + Steiner's 'ls' test since in this test only one cpu generates rcu entries. + + Signed-off-by: Manfred Spraul + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] rcu lock update: Code move & cleanup + + From: Manfred Spraul + + Step three for reducing cacheline trashing within rcupdate.c: + + Cleanup and code move from to kernel/rcupdate.c: Remove + internal details from the header file. + + Signed-off-by: Manfred Spraul + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] reduce rcu_head size - core + + From: Dipankar Sarma + + This reduces the RCU head size by using a singly linked to maintain them. + The ordering of the callbacks is still maintained as before by using a tail + pointer for the next list. + + Signed-Off-By : Dipankar Sarma + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] rcu: avoid passing an argument to the callback function + + From: Dipankar Sarma + + This patch changes the call_rcu() API and avoids passing an argument to the + callback function as suggested by Rusty. Instead, it is assumed that the + user has embedded the rcu head into a structure that is useful in the + callback and the rcu_head pointer is passed to the callback. The callback + can use container_of() to get the pointer to its structure and work with + it. Together with the rcu-singly-link patch, it reduces the rcu_head size + by 50%. Considering that we use these in things like struct dentry and + struct dst_entry, this is good savings in space. + + An example : + + struct my_struct { + struct rcu_head rcu; + int x; + int y; + }; + + void my_rcu_callback(struct rcu_head *head) + { + struct my_struct *p = container_of(head, struct my_struct, rcu); + free(p); + } + + void my_delete(struct my_struct *p) + { + ... + call_rcu(&p->rcu, my_rcu_callback); + ... + } + + Signed-Off-By: Dipankar Sarma + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] cpumask: make cpu_present_map real even on non-smp + + From: Paul Jackson + + This patch makes cpu_present_map a real map for all configurations, instead of + a constant for non-SMP. It also moves the definition of cpu_present_map out + of kernel/cpu.c into kernel/sched.c, because cpu.c isn't compiled into non-SMP + kernels. + + The pattern is that each of the possible, present and online cpu maps are + actual kernel global cpumask_t variables, for all configurations. They are + documented in include/linux/cpumask.h. Some of the UP (NR_CPUS=1) code + cheats, and hardcodes the assumption that the single bit position of these + maps is always set, as an optimization. + + Signed-off-by: Paul Jackson + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] cpumask: bitmap cleanup preparation for cpumask overhaul + + From: Paul Jackson + + Document the bitmap bit model and handling of unused bits. + + Tighten up bitmap so it does not generate nonzero bits in the unused tail if + it is not given any on input. + + Add intersects, subset, xor and andnot operators. Change bitmap_complement to + take two operands. + + Add a couple of missing 'const' qualifiers on bitops test_bit and bitmap_equal + args. + + Signed-off-by: Paul Jackson + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] cpumask: bitmap inlining and optimizations + + From: Paul Jackson + + These bitmap improvements make it a suitable basis for fully supporting + cpumask_t and nodemask_t. Inline macros with compile-time checks enable + generating tight code on both small and large systems (large meaning cpumask_t + requires more than one unsigned long's worth of bits). + + The existing bitmap_ macros in lib/bitmap.c are renamed to __bitmap_, + and wrappers for each bitmap_ are exposed in include/linux/bitmap.h + + This patch _includes_ Bill Irwins rewrite of the bitmap_shift operators to not + require a fixed length intermediate bitmap. + + Improved comments list each available operator for easy browsing. + + Signed-off-by: Paul Jackson + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] cpumask: rewrite cpumask.h - single bitmap based implementation + + From: Paul Jackson + + Major rewrite of cpumask to use a single implementation, as a struct-wrapped + bitmap. + + This patch leaves some 26 include/asm-*/cpumask*.h header files orphaned - to + be removed next patch. + + Some nine cpumask macros for const variants and to coerce and promote between + an unsigned long and a cpumask are obsolete. Simple emulation wrappers are + provided in this patch for these obsolete macros, which can be removed once + each of the 3 archs (i386, ppc64, x86_64) using them are recoded in follow-on + patches to not need them. + + The CPU_MASK_ALL macro now avoids leaving possible garbage one bits in any + unused portion of the high word. + + An inproved comment lists all available operators, for convenient browsing. + + From: Mikael Pettersson + + 2.6.7-rc3-mm1 changed CPU_MASK_NONE into something that isn't a valid + rvalue (it only works inside struct initializers). This caused compile-time + errors in perfctr in UP x86 builds. + + From: Arnd Bergmann + + cpumask-5-10-rewrite-cpumaskh-single-bitmap-based from 2.6.7-rc3-mm1 + causes include2/asm/smp.h:54:1: warning: "cpu_online" redefined + + Signed-off-by: Paul Jackson + Signed-off-by: Mikael Pettersson + Signed-off-by: Arnd Bergmann + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] cpumask: remove 26 no longer used cpumask*.h files + + From: Paul Jackson + + With the cpumask rewrite in the previous patch, these various + include/asm-*/cpumask*.h headers are no longer used. + + Signed-off-by: Paul Jackson + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] cpumask: remove obsolete cpumask macro uses - i386 arch + + From: Paul Jackson + + Remove by recoding i386 uses of the obsolete cpumask const, coerce and promote + macros. + + Signed-off-by: Paul Jackson + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] cpumask: remove obsolete cpumask macro uses - other archs + + From: Paul Jackson + + Remove by recoding other uses of the obsolete cpumask const, coerce and + promote macros. + + Signed-off-by: Paul Jackson + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] x86_64: cpu_online fix + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: cpu_online fix + + include/asm/smp.h:55:1: warning: "cpu_possible" redefined + include/asm/smp.h:54:1: warning: "cpu_online" redefined + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] cpumask: Remove no longer used obsolete macro emulation + + From: Paul Jackson + + Now that the emulation of the obsolete cpumask macros is no longer needed, + remove it from cpumask.h + + Signed-off-by: Paul Jackson + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] cpumask: optimize various uses of new cpumasks + + From: Paul Jackson + + Make use of for_each_cpu_mask() macro to simplify and optimize a couple of + sparc64 per-CPU loops. + + Optimize a bit of cpumask code for asm-i386/mach-es7000 + + Convert physids_complement() to use both args in the files + include/asm-i386/mpspec.h, include/asm-x86_64/mpspec.h. + + Remove cpumask hack from asm-x86_64/topology.h routine pcibus_to_cpumask(). + + Clarify and slightly optimize several cpumask manipulations in kernel/sched.c + + Signed-off-by: Paul Jackson + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] cpumask: comment, spacing tweaks + + From: Paul Jackson + + Tweak cpumask.h comments, spacing: + + - Add comments for cpu_present_map macros: num_present_cpus() and + cpu_present() + + - Remove comments for obsolete macros: cpu_set_online(), + cpu_set_offline() + + - Reorder a few comment lines, to match the code and confuse readers of + this patch + + - Tabify one chunk of code + + Signed-off-by: Paul Jackson + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] clean up cpumask_t temporaries + + From: Rusty Russell + + Paul Jackson's cpumask tour-de-force allows us to get rid of those stupid + temporaries which we used to hold CPU_MASK_ALL to hand them to functions. + This used to break NR_CPUS > BITS_PER_LONG. + + Signed-off-by: Rusty Russell + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] alpha: cpumask fixups + + From: William Lee Irwin III + + The cpumask patches broke alpha's build, even without the irqaction + patch, largely centering around cpu_possible_map. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] make irqaction use a cpu mask + + From: William Lee Irwin III + + The following patch makes irqaction's ->mask a cpumask as it was intended + to be and wraps up the rest of the sweep. Only struct irqaction is + usefully greppable, so there may be some assignments to ->mask missing + still. This removes more code than it adds. + + From: William Lee Irwin III + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Fix and Reenable MSI Support on x86_64 + + From: long + + MSI support for x86_64 is currently disabled in the kernel 2.6.x. Below is + the patch, which provides a fix and reenable it. + + In addition, the patch provides a info message during kernel boot if + configuring vector-base indexing. + + Cc: Andi Kleen + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] vmscan.c: shuffle things around + + Move all the data structure declarations, macros and variable definitions to + less surprising places. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] vmscan.c scan rate fixes + + We've been futzing with the scan rates of the inactive and active lists far + too much, and it's still not right (Anton reports interrupt-off times of over + a second). + + - We have this logic in there from 2.4.early (at least) which tries to keep + the inactive list 1/3rd the size of the active list. Or something. + + I really cannot see any logic behind this, so toss it out and change the + arithmetic in there so that all pages on both lists have equal scan rates. + + - Chunk the work up so we never hold interrupts off for more that 32 pages + worth of scanning. + + - Make the per-zone scan-count accumulators unsigned long rather than + atomic_t. + + Mainly because atomic_t's could conceivably overflow, but also because + access to these counters is racy-by-design anyway. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] vmscan.c: dont reclaim too many pages + + The shrink_zone() logic can, under some circumstances, cause far too many + pages to be reclaimed. Say, we're scanning at high priority and suddenly hit + a large number of reclaimable pages on the LRU. + + Change things so we bale out when SWAP_CLUSTER_MAX pages have been reclaimed. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] vm: vfs shrinkage tuning + + Some people want the dentry and inode caches shrink harder, others want them + shrunk more reluctantly. + + The patch adds /proc/sys/vm/vfs_cache_pressure, which tunes the vfs cache + versus pagecache scanning pressure. + + - at vfs_cache_pressure=0 we don't shrink dcache and icache at all. + + - at vfs_cache_pressure=100 there is no change in behaviour. + + - at vfs_cache_pressure > 100 we reclaim dentries and inodes harder. + + + The number of megabytes of slab left after a slocate.cron on my 256MB test + box: + + vfs_cache_pressure=100000 33480 + vfs_cache_pressure=10000 61996 + vfs_cache_pressure=1000 104056 + vfs_cache_pressure=200 166340 + vfs_cache_pressure=100 190200 + vfs_cache_pressure=50 206168 + + Of course, this just left more directory and inode pagecache behind instead of + vfs cache. Interestingly, on this machine the entire slocate run fits into + pagecache, but not into VFS caches. + + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] dnotify.c: use inode->i_lock in place of dn_lock + + From: "Adam J. Richter" + + Replace the use of a global spinlock with the per-inode ->i_lock. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Use fancy wakeups in wait.h + + Use the more SMP-friendly prepare_to_wait()/finish_wait() in wait_event() and + friends. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] tweak the buddy allocator for better I/O merging + + From: William Lee Irwin III + + Based on Arjan van de Ven's idea, with guidance and testing from James + Bottomley. + + The physical ordering of pages delivered to the IO subsystem is strongly + related to the order in which fragments are subdivided from larger blocks + of memory tracked by the page allocator. + + Consider a single MAX_ORDER block of memory in isolation acted on by a + sequence of order 0 allocations in an otherwise empty buddy system. + Subdividing the block beginning at the highest addresses will yield all the + pages of the block in reverse, and subdividing the block begining at the + lowest addresses will yield all the pages of the block in physical address + order. + + Empirical tests demonstrate this ordering is preserved, and that changing + the order of subdivision so that the lowest page is split off first + resolves the sglist merging difficulties encountered by driver authors at + Adaptec and others in James Bottomley's testing. + + James found that before this patch, there were 40 merges out of about 32K + segments. Afterward, there were 24007 merges out of 19513 segments, for a + merge rate of about 55%. Merges of 128 segments, the maximum allowed, were + observed afterward, where beforehand they never occurred. It also improves + dbench on my workstation and works fine there. + + Signed-off-by: William Lee Irwin III + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] hwcache align kmalloc caches + + From: Manfred Spraul + + Reversing the patches that made all caches hw cacheline aligned had an + unintended side effect on the kmalloc caches: Before they had the + SLAB_HWCACHE_ALIGN flag set, now it's clear. This breaks one sgi driver - + it expects aligned caches. Additionally I think it's the right thing to + do: It costs virtually nothing (the caches are power-of-two sized) and + could reduce false sharing. + + Additionally, the patch adds back the documentation for the + SLAB_HWCACHE_ALIGN flag. + + Signed-Off: Manfred Spraul + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] reduce function inlining in slab.c + + From: Manfred Spraul + + slab.c contains too many inline functions: + + - some functions that are not performance critical were inlined. Waste + of text size. + + - The debug code relies on __builtin_return_address(0) to keep track of + the callers. According to rmk, gcc didn't inline some functions as + expected and that resulted in useless debug output. This was probably + caused by the large debug-only inline functions. + + The attached patche removes most inline functions: + + - the empty on release/huge on debug inline functions were replaced with + empty macros on release/normal functions on debug. + + - spurious inline statements were removed. + + The code is down to 6 inline functions: three one-liners for struct + abstractions, one for a might_sleep_if test and two for the performance + critical __cache_alloc / __cache_free functions. + + Note: If an embedded arch wants to save a few bytes by uninlining + __cache_{free,alloc}: The right way to do that is to fold the functions + into kmem_cache_xy and then replace kmalloc with + kmem_cache_alloc(kmem_find_general_cachep(),). + + Signed-Off: Manfred Spraul + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] abs() fixes + + OK, the pending abs() disaster has hit: + + drivers/usb/class/audio.c:404: warning: static declaration of 'abs' follows non-static declaration + + This is due to the declaration in kernel.h. AFAIK there's not even a matching + definition for that. + + The patch implements abs() as a macro in kernel.h and kills off various + private implementations. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Support NetMOS based PCI cards providing serial and parallel ports + + From: Christoph Lameter + + Attached a patch to support a variety of PCI based serial and parallel port + I/O ports (typically labeled 222N-2 or 9835). + + I think this should go into 2.6.0 since it has been out there for a long + time and is just some additional driver support that somehow fell through + the cracks in 2.4.X. Tim Waugh submitted it in the 2.4.X series. + + See also http://winterwolf.co.uk/pciio + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] help text for FB_RIVA_I2C + + From: "Antonino A. Daplas" + + Signed-off-by: Antonino Daplas + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] nr_pagecache can go negative + + We use per-cpu counters for the system-wide pagecache accounting. The + counters spill into the global nr_pagecache atomic_t when they underflow or + overflow. + + Hence it is possible, under weird circumstances, for nr_pagecache to go + negative. Anton says he has hit this. + + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Make nr_swap_pages a long + + From: Anton Blanchard + + ../include/linux/swap.h:extern int nr_swap_pages; /* XXX: shouldn't this be ulong? --hch */ + + Sounds like it should be too me. Some of the code checks for nr_swap_pages + < 0 so I made it a long instead. I had to fix up the ppc64 show_mem() (Im + guessing there will be other trivial changes required in other 64bit archs, + I can find and fix those if you want). + + I also noticed that the ppc64 show_mem() used ints to store page counts. + We can overflow that, so make them unsigned long. + + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] make total_swap_pages a long + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] mips: SGI A2 audio rewrite and 2.6 fixes + + From: Ralf Baechle + + Fix HAL2 audio driver for the SGI A2 audio subsystem and rewrite large + parts of it to finally work. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Dell laptop lockup fix for ALSA + + From: Alan Cox + + OSS avoids the Dell lockup by not hitting the problem register (which + apparently breaks resume on a Sony laptop). ALSA keeps a flag and uses pci + subvendor info to clear it for problem Dell laptops. Unfortunately there + is at least one other Dell laptop which is affected. This adds its sub + id's + + [Patch from Dan Williams @ Red Hat slightly reformatted by me] + + Signed-off-by: Alan Cox + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] MIPS Update + + From: Ralf Baechle + + MIPS update: + + - Further conversion of MIPS kernel configuration to reverse dependencies. + - Support for the PMC-Sierra Yosemite evaluation board. + - Merge arch/mips/mm-32 and arch/mips/mm-32 into arch/mips/mm. + - Partial support for the R8000 now that I finally have clearance for the + documentation previously covered by NDA. + - Make distclean fixes. + - Regenerate default configuration files against latest Kconfig files. + - Fix handling of data bus errors in modules. + - Make R4000 bug probing more bullet proof. + - Rewrite semaphore code folloing the PPC implementation to no longer + manipulate 2 32-bit quantities atomically using 64-bit instructions. + Occasionally this did cause problems due to struct semaphore not having + sufficient alignment. + - Make sys_pipe() code bullet proof against gcc 3.5 over-optimization. + - Fix possibly exploitable bug in IRIX compatibility statvfs(2). + - Make sched_clock() an outline function. + - Support for the MIPS 24K and 25K processors. + - Make functions static that aren't needed anywhere else. + - Factor out some more generic MIPS SMP code. + - Factor out common part of the GT-64240 code. + - Ocelot C now uses the generic MV-64340 interrupt handler code. + - Factor out common board support code + - More cleanup and bug fixes for the NEC VR41xx code. + - Start cleanup of hazard handling as required for MIPS32/64 V2 processors. + - Enforce minimal kmalloc alignment of 8 byte so 64-bit registers can be + stored into fields without exceptions. + - Speeling and warning fixes. + + Signed-off-by: Ralf Baechle + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Indydog update + + From: Ralf Baechle + + Forward port of the 2.4 driver with changes required for 2.6. + + Signed-off-by: Ralf Baechle + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix linker trouble with CONFIG_FB_RIVA_I2C=y and modular I2C + + From: Adrian Bunk + + > This version causes linker trouble with + > CONFIG_I2C=m + > CONFIG_I2C_ALGOBIT=m + > CONFIG_FB_RIVA_I2C=y + > + > CC init/version.o + > LD init/built-in.o + > LD .tmp_vmlinux1 + > drivers/built-in.o(.text+0xda101): In function `riva_setup_i2c_bus': + > : undefined reference to `i2c_bit_add_bus' + > drivers/built-in.o(.text+0xda218): In function `riva_delete_i2c_busses': + > : undefined reference to `i2c_bit_del_bus' + > drivers/built-in.o(.text+0xda237): In function `riva_delete_i2c_busses': + > : undefined reference to `i2c_bit_del_bus' + > drivers/built-in.o(.text+0xda2c9): In function `riva_do_probe_i2c_edid': + > : undefined reference to `i2c_transfer' + > make: *** [.tmp_vmlinux1] Error 1 + >... + + The problem is: + FB_RIVA=y + FB_RIVA_I2C=y + I2C=m + I2C_ALGOBIT=m + + The patch below fixes this. + + Besides this, it contains: + - help text by Antonino A. Daplas + - converted spaces to tabs + - it was forgotten that FB_RIVA_I2C requires I2C_ALGOBIT + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Fix early CPU vendor detection for non intel cpus + + From: Andi Kleen + + Early CPU detect can only work after the various sub CPU drivers have + registered their devices. + + Currently the vendor would be always 0, which is Intel. + + This prevents Athlons from being recognized as buggy PPros and fixes some + other workarounds for non Intel CPUs too. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] OProfile: allow normal user to trigger sample dumps + + From: John Levon + + In 2.4, OProfile allowed normal users to trigger sample dumps (useful under + low sample load). The patch below, by Will Cohen, allows this for 2.6 too. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] SubmittingDrivers fix + + From: Jesper Juhl + + Here's a small patch that lists X.Org as well as XFree86 in + Documentation/SubmittingDrivers in the section talking about video drivers. + + Signed-off-by: Jesper Juhl + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Core fbcon fixes + + From: "Antonino A. Daplas" + + This patch fixes the following bugs/regressions for fbcon: + + 1. Initialize and update global arrays used by fbcon during + initialization and and by set_con2fbmap code. + + 2. Fixed screen corruption (white rectangle) at initial mode setting + plaguing cards with VGA cores and with VGA console enabled. (vga16fb, + however, still shows remnants of previous text if boot logo is enabled) + + 3. Improved fbcon_startup/fbcon_init code. + + 4. Fixed set_con2fbmap code -- should support multiple devices mapped to + + Signed-off-by: Antonino A. Daplas + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fbdev: video mode change notify (fbset) + + From: "Antonino A. Daplas" + + This patch allows fbset to change the video mode and the console window + size via the notifier call chain. It will only notify fbcon of mode + changes from user space. Changes coming from upstream will be ignored. + + The code will only update the current console. + + Signed-off-by: Antonino Daplas + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: fix POWER3 NUMA init + + From: Anton Blanchard + + We were passing in the hole size as kB not pages to free_area_init which + made the VM misbehave. This only hit on POWER3 because POWER4 and newer + places IO above all memory and so doesnt have a hole. + + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Add PPC85xx MAINTAINERS entry + + From: Kumar Gala + + Added myself to the MAINTAINERS file for 85xx. Added an entry into the + CREDITS file for me. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] (o)profile Documentation/basic_profiling.txt updates + + From: bert hubert + + Signed-off-by: bert hubert + Signed-off-by: John Levon + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] SELinux: Extend and revise calls to secondary module + + From: Stephen Smalley + + This patch extends the set of calls to the secondary security module by + SELinux as well as revising a few existing calls to support other security + modules and to more cleanly stack with the capability module. Please + apply. + + Signed-off-by: Stephen Smalley + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix allocate_pgdat comments + + From: "Martin J. Bligh" + + From: Andy Whitcroft + + The comments for i386 allocate_pgdat indicate that the routine should be + modified to place the pgdat into node local memory. However, this has + already been done as the pgdat is placed at node_remap_start_vaddr. This + patch updates the comments to reflect this reality. + + Signed-off-by: Andy Whitcroft + Signed-off-by: Martin J. Bligh + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] drivers/media/video/tda9840.c: honour return code of i2c_add_driver() + + From: Michael Hunold + + i2c_add_driver() may actually fail, but my driver returns 0 regardless. + Thanks to Arthur Othieno for this obviously correct + patch. + + Signed-off-by: Michael Hunold + Signed-off-by: Arthur Othieno + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] zap_pte_range speedup + + From: Hugh Dickins + + zap_pte_range is wasting time marking anon pages accessed: its original + !PageSwapCache test should have been reinstated when page_mapping was + changed to return swapper_space; or more simply, just check !PageAnon. + + Signed-off-by: Hugh Dickins + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] h8300: delete obsolute header + + From: Yoshinori Sato + + - delete obsolute(unused) header file + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] cirrusfb: major update + + From: David Eger + + This patch brings the cirrusfb driver up to date with 2.6. cirrusfb has + suffered bit rot like you wouldn't believe (last updated... 2.3.x era?). + The driver will now compile again, and you can change to a high resolution + text mode with stty. Known defects: doesn't play nice with X, nor fbset. + + C = Cosmetic change + L = Logical change + A = API change + W = register Writing change + + (1-CA) fb_info and cirrusfb_info: + - mostly cosmetic, but a lot less confusing, and no more nasty casting. + + It used to be stylish to embed struct fb_info_gen (now struct fb_info) + as the first member of struct clgenfb_info (now struct cirrusfb_info), + and then you'd cast to the deisred struct. + Now we pass the size of our data structure to framebuffer_alloc(), + and we make fb_info and cirrusfb_info reference each other with + pointers (as in radeonfb). + + In the old code, there two declarations were common: + + clgenfb_info *fb_info; + clgenfb_info *info; + + since there's also a 'struct fb_info' now, I found this really confusing, + and unified usage as: + + cirrusfb_info *cinfo; + fb_info *info; + + This accounts for a lot of the search and replace cosmetic upgrade. + + (2-A) All of the FB knowledge of FB internals is gone in 2.6 + + (3-LW) revised maxclock numbers (cirrusfb_board_info_rec.maxclock[5]) + + In my quest to get fbset to work, I borrowed some maxclock data + from the X.Org tree for various chipsets. It didn't really seem + to help. oh well. + + (3-LA) upgraded PCI registration + + Instead of doing PCI walking from the driver, we hand off a + pci_device_id table to the PCI subsystem and just get called when + it finds a relevant board. + + (4-L) striking lots of __init and __initdata specifiers + + I was running into some things not working when I moved the call to + init_vgachip() from the driver registration to set_par(). I thought + perhaps this was due to some things being marked __init accidentally + so I axed said annotations. Turns out it was something else. See 5. + + (5-LA) delayed chip initialization, nasty double-set_par() pseudo-bug + + Tony says that the fb drivers shouldn't do any chipset initialization + until they get a set_par() call. This way, fb modules can be safely + unloaded if no one gets around to using them, and the vga_con -> fbcon + hand off is smoother, as fbcon can still grab the back-scroll data from + vga_con... + + In any case, moving the calls to init_vgachip() and fbgen_do_set_var() + from driver initialization to set_par() revealed that the cirrus + register-writing function needs to be called twice for a mode change to + work. I don't understand why. + + (6-LA) split clgen_decode_var() into the bits that check the var and the + bits that actually generate register information (par/regs) to write + + Adding modedb hooks here might actually fix fbset, i think... + + (7-LW) No longer write the palette in init_vgachip() nor in set_par(). + Someone else (fbcon?) seems to be making its own calls to setcolreg() + for us. + + (8-LW) setcolreg() -- while removing all of the console cruft, I had + to try to reconstitute the palette code. I think I got this right, + but I could be off -- the penguin boots in the correct colors at least ;-) + + (9-L) pan_display() - we don't do wrap, silly. that's only on the amiga. + + (10-L) pan+BLT - to make pan play nicely with copyarea()/fillrect() + I had to add a couple of calls to cirrusfb_WaitBLT() to make sure + the engine is idle. + + (11-LW) cirrusfb_blank() - I upgraded the switch here to use the new + VESA_* blanking mode constants. I think I translated the right + logic for the right blanking levels. + + + Signed-off-by: David Eger + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] update ikconfig help text + + From: "Randy.Dunlap" + + Some elements of ikconfig have been removed, but the help text wasn't + updated to reflect those changes. + + Signed-off-by: Randy Dunlap + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] update ikconfig generator script + + From: "Randy.Dunlap" + + http://bugme.osdl.org/show_bug.cgi?id=2701 + + Current script has problems with some shells and utilities. Remove use of + 'echo' in the script. + + From: Roman Zippel + Signed-off-by: Randy Dunlap + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] hugetlb.c: use safe iterator + + From: "Chen, Kenneth W" + + With list poisoning on by default from linux-2.6.7, it's easier than ever to + trigger the bug in try_to_free_low(). It ought to use the safe version of + list iterater. + + Signed-off-by: Ken Chen + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] swsusp minor docs updates + + From: Pavel Machek + + I shot myself in the foot with swsusp, so I guess documenting that + particular trap is right thing to do (tm). Somehow two copies of "radeon + hint" crept in; fix that, too. + + Signed-off-by: Pavel Machek + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Prepare for SMP suspend + + From: Pavel Machek + + Its very bad idea to freeze migration threads, as it crashes machine upon + next call to "schedule()". In refrigerator, I had one "wake_up_process()" + too many. This fixes it. + + Signed-off-by: Pavel Machek + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] swsusp: shuffle cpu.c to make it usable for smp suspend + + From: Pavel Machek + + This moves fix_processor_context() so that additional prototype is not + needed, and adds context * to processor state saving functions, so that + they can be used on SMP. It should be done this way from the beggining. + + Signed-off-by: Pavel Machek + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] consolidate in-kernel configuration + + From: Andy Whitcroft + + Being able to recover the configuration from a kernel is very useful and it + would be nice to default this option to Yes. Currently, to have the config + available both from the image (using extract-ikconfig) and via /proc we + keep two copies of the original .config in the kernel. One in plain text + and one gzip compressed. This is not optimal. + + This patch removes the plain text version of the configuration and updates + the extraction tools to locate and use the gzip'd version of the file. + This has the added bonus of providing us with the exact same results in + both cases, the original .config; including the comments. + + Signed-off-by: Andy Whitcroft + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sparse: fixes for "assignment expression in conditional" in fs/* + + From: Mika Kukkonen + + Fix various sparse "assignment expression in conditional" warnings in fs/ + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] hugetlb.c - fix try_to_free_low() + + From: "Chen, Kenneth W" + + Turn on CONFIG_HIGHMEM and CONFIG_HUGETLBFS. Try to config the hugetlb + pool: + + [root@quokka]# echo 100 > /proc/sys/vm/nr_hugepages + [root@quokka]# grep HugePage /proc/meminfo + HugePages_Total: 100 + HugePages_Free: 100 + + [root@quokka]# echo 20 > /proc/sys/vm/nr_hugepages + [root@quokka]# grep HugePage /proc/meminfo + HugePages_Total: 0 + HugePages_Free: 0 + + [root@quokka]# echo 100 > /proc/sys/vm/nr_hugepages + [root@quokka]# grep HugePage /proc/meminfo + HugePages_Total: 100 + HugePages_Free: 100 + + [root@quokka]# echo 0 > /proc/sys/vm/nr_hugepages + [root@quokka]# grep HugePage /proc/meminfo + HugePages_Total: 31 + HugePages_Free: 31 + + The argument "count" passed to try_to_free_low() is the config parameter + for desired hugetlb page pool size. But the implementation took that input + argument as number of pages to free. It also decrement the config + parameter as well. All give random behavior depend on how many hugetlb + pages are in normal/highmem zone. + + A two line fix in try_to_free_low() would be: + + - if (!--count) + - return 0; + + if (count >= nr_huge_pages) + + return count; + + But more appropriately, that function shouldn't return anything. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] oom killer: ignore free swapspace + + From: William Lee Irwin III + + During stress testing at Oracle to determine the maximum number of clients + 2.6 can service, it was discovered that the failure mode of excessive + numbers of clients was kernel deadlock. The following patch removes the + check if (nr_swap_pages > 0) from out_of_memory() as this heuristic fails + to detect memory exhaustion due to pinned allocations, directly causing the + aforementioned deadlock. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sh: SH-3 On-Chip ADC support + + From: Paul Mundt + + This adds support for the SH-3's on-chip ADC (which is needed by things like + the touchscreen, etc.). + + Signed-off-by: Andriy Skulysh + Signed-off-by: Paul Mundt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sh: dma-mapping updates. + + From: Paul Mundt + + This updates the sh dma-mapping code, as well as doing some cleanup in the + consistent API. We also add a consistent_{alloc,free} to the machvec for + platforms that need special handling. + + Signed-off-by: Paul Mundt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sh: DMA driver updates. + + From: Paul Mundt + + This updates the SuperH DMA driver, as well as cleaning up the registration + interface. + + We also drop the use of bitfields in dma-sh since things like the SH4-202, + 7751R, 7760, etc. all have a completely different set of register + definitions. + + Signed-off-by: Paul Mundt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sh: early printk() cleanup. + + From: Paul Mundt + + sh was using its own CONFIG_SH_EARLY_PRINTK, this is no longer necessary as we + can easily work with the generic CONFIG_EARLY_PRINTK. + + Signed-off-by: Paul Mundt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sh: fixmap support. + + From: Paul Mundt + + This adds fixmap support for sh. + + Signed-off-by: Paul Mundt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sh: Renesas HS7751RVoIP board support. + + From: Paul Mundt + + This adds support for the Renesas Technology Sales HS7751RVoIP board. + + Signed-off-by: Paul Mundt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sh: IDE cleanup. + + From: Paul Mundt + + This does a bit of IDE cleanup (in preparation for the SuperH generic IDE host + driver). This also adds SuperH to the list of platforms that are interested + in CONFIG_IDE_MAX_HWIFS. + + Signed-off-by: Paul Mundt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sh: ptep_get_and_clear() compile fix. + + From: Paul Mundt + + This fixes up a compile error occuring with ptep_get_and_clear() existing in + pgalloc.h. We move it to a somewhat more sensible location instead, and take + this opportunity to make some cleanups for use of generic code in the SH-3 + case, etc. + + Signed-off-by: Paul Mundt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sh: sh-sci updates. + + From: Paul Mundt + + This adds support for the SH7300 as well as the SH5-101/103 processors as well + as specific board support for the RTS7751R2D. + + In addition to this, the sh early printk code is gutted so that we use the + generic CONFIG_EARLY_PRINTK interfaces instead. + + Signed-off-by: Hiroshi DOYU + Signed-off-by: Paul Mundt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sh: SolutionEngine 7300 board support. + + From: Paul Mundt + + This adds support for the SH7300 solution engine board (a forward port of the + 2.4 code). + + Signed-off-by: Hiroshi DOYU + Signed-off-by: Paul Mundt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sh: Renesas RTS7751R2D board support. + + From: Paul Mundt + + This adds support for the Renesas Technology Sales RTS7751R2D board. + + Signed-off-by: Paul Mundt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sh: PCI updates + + From: Paul Mundt + + This updates the pci-auto code, as well as adding ops and fixups for the + RTS7751R2D board. + + Signed-off-by: Paul Mundt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sh: SH7705/SH7300 subtype support, ST40 updates. + + From: Paul Mundt + + This adds support for the SH7705 and SH7300 subtypes and also updates some + ST40-specific FRQCR handling code. + + Signed-off-by: Alex Bennee + Signed-off-by: Hiroshi DOYU + Signed-off-by: Paul Mundt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sh: VoyagerGX companion chip support. + + From: Paul Mundt + + This adds support for the SM501/VoyagerGX companion chip, used by the + RTS7751R2D. + + Signed-off-by: Paul Mundt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sh: merge. + + From: Paul Mundt + + This merges the remaining sh changes, random bug fixes, added syscalls, cache + fixups, etc. Nothing really eventful. + + Signed-off-by: Paul Mundt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sh: Consolidate SystemH with other Renesas boards. + + From: Paul Mundt + + Nothing really interesting here, with the addition of several other Renesas + boards, we just move the systemh directory to the renesas one to fit in + better with the directory structure. + + Signed-off-by: Paul Mundt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] md: Fix up handling for read error in raid1. + + From: NeilBrown + + There is severe bit-rot in this code, which is to say that it doesn't work + at all: an io error during read will do bad things. It should work better + with this patch. + + Signed-off-by: Neil Brown + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] md: XOR template selection redo + + From: NeilBrown + + From: Josh Litherland + + The XOR routine selection process is often confusing as it often doesn't + choose the routine that measures the fastest, as sometime one routine is + known to have better cache performance. + + This patch avoids the comparison when there is a known best choice, and + makes the report more meaningful. + + Signed-off-by: Neil Brown + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] kswapd warning fix + + mm/vmscan.c: In function `kswapd': + mm/vmscan.c:1139: warning: no return statement in function returning non-void + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] balanced_irq warning fix + + arch/i386/kernel/io_apic.c: In function `balanced_irq': + arch/i386/kernel/io_apic.c:582: warning: no return statement in function returning non-void + + and clean things up a bit + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix broken alpha build ptrace.c error + + From: Darren Williams + + include/asm/checksum.h:75: warning: `struct in6_addr' declared inside parameter list include/asm/checksum.h:75 + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix x86-64 ptrace access to 32-bit vsyscall page + + When I made get_user_pages support looking up a pte for the "gate" area, I + assumed it would be part of the kernel's fixed mappings. On x86-64 running + a 32-bit task, the 32-bit vsyscall DSO page still has no vma but has its + pte allocated in the user mm in the normal fashion. This patch makes it + use the generic page-table lookup calls rather than the shortcuts. + With this, ptrace on x86-64 can access a 32-bit process's vsyscall page. + + The behavior on x86 is unchanged. + + Signed-off-by: Roland McGrath + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: clean up prom.c and related files + + Somebody back in the mists of time decided that call_prom and rtas_call + should return longs even though both of those bits of firmware run in + 32-bit mode and produce a 32-bit result. To make life more interesting, + the 32-bit result gets zero-extended to 64 bits, which makes checking + for a -1 return value more complicated than it should be. + + This patch changes call_prom and rtas_call to return an int, and makes + the corresponding changes to use ints for the variables used to hold + those return values. + + While I was doing this I finally got annoyed enough with the strings of + prom_print() and prom_print_hex() calls that we do to write a simple + prom_printf. I deliberately didn't use snprintf because the execution + environment is weird at this point - we aren't running at the address we + are linked at just yet - and I didn't want to inflict that on any code + outside this file. I also did a prom_debug() macro, which eliminated a + few ifdefs. + + There are also a bunch of other minor cleanups. This patch makes very + few algorithmic changes but does get rid of a lot of casts. :) + + I have been running with this patch for a couple of weeks, and Anton has + tested it too. + + Signed-off-by: Paul Mackerras + Signed-off-by: Linus Torvalds + + + [PATCH] Better memset + + Anton noticed in some traces that we were spending an awfully long time + doing a memset. The ppc64 memset is basically unchanged from the ppc32 + version, and it only does 4-byte stores and doesn't unroll the loop. + Here's a memset that performs a bit better. + + I have been using it for 3 weeks now, and Anton has tested it on a + variety of machines, without problems. + + Signed-off-by: Paul Mackerras + Signed-off-by: Linus Torvalds + + + [PATCH] Clean up head.S whitespace + + The whitespace in arch/ppc64/kernel/head.S is a bit all over the place. + This patch fixes it up. This patch changes nothing other than + whitespace. + + Signed-off-by: Paul Mackerras + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: Fix booting on LPAR machines with more than 1 CPU + + The exception rewrite contains a small bug that prevents bring up of CPUs + on logically partitioned machines. + + The kernel is trying to zero the backlink on the new stack while running + with relocation disabled, which potentially cause it to try to access an + address outside of the region allowed in real mode. This seem to be a + leftover from previous code as we also zero the backlink later after + turning off the MMU. + + This patch removes the offending bit. + + + [PATCH] revert partition nonsense + + Updating my source to 2.6.7 I see that you applied some + nonsense garbage patch. Please undo. + + [ Note by Linus: the fact that DOS_EXTENDED_PARTITION is 5, and we're + iterating over slots 1-4 in the partition table, are two totally + unrelated things. Using the symbolic constant does indeed not make + any sense at all here, as Andries so eloquently points out. ] + + + [PATCH] make DVD ioctls that can legitimately fail quiet + + DVD_LU_SEND_{AGID,TITLE_KEY} can be legitimately rejected; in that case + we should not spew into logs. + + + [PATCH] sparse: trivial drivers/net/* annotations + + + [PATCH] sparse: trivial drivers/char/* annotation and format fixes + + - trivial annotation in several places in drivers/mtd + - a bunch of debugging printks switched from %x to %llx (they get 64bit + values) + - in doc200[01].c fixed type of (unused) last argument in their + doc_read_ecc(). + + + [PATCH] sparse: trivial annotations in drivers/char/* + + + [PATCH] isdn_writebuf_stub() sanitized + + isdn_writebuf_stub() was always called for userland pointers. + + Killed the argument telling whether it's kernel or userland pointer, + killed dead code, updated callers. + + + [PATCH] sparse: trivial drivers/isdn/* annotations + + + [PATCH] sparse: i2o fixed + + Fixes for direct dereferencing of userland pointers in i2o_config.c + + + [PATCH] sparse: trivial i2o annotations + + + [PATCH] sparse: scsi ->ioctl() annotation + + Low-level drivers' ->ioctl() gets a userland pointer from scsi_ioctl(); + prototype annotated, so is scsi_debug instance. + + + [PATCH] ide: remove redundant hwgroup->handler checks from ide-taskfile.c + + Remove checks for hwgroup->handler == NULL from task_[in,mulin,out]_intr() + (CONFIG_IDE_TASKFILE_IO=n versions). These functions can be called only from + ide_intr() or ide_timer_expiry() and both set hwgroup->handler to NULL first. + + Signed-off-by: Bartlomiej Zolnierkiewicz + Signed-off-by: Linus Torvalds + + + [PATCH] ide: end request fix for CONFIG_IDE_TASKFILE_IO=y PIO handlers + + ide_end_drive_cmd() should only be called for "flagged" taskfiles + which have separate PIO handlers so use driver->end_request() instead. + + Signed-off-by: Bartlomiej Zolnierkiewicz + Signed-off-by: Linus Torvalds + + + [PATCH] ide: PIO-in drive busy fix (CONFIG_IDE_TASKFILE_IO=y) + + If the drive times out the final status check we should fail the request + instead of setting another handler for the next IRQ. + + Signed-off-by: Bartlomiej Zolnierkiewicz + Signed-off-by: Linus Torvalds + + + [PATCH] ide: check drive->mult_count in flagged_taskfile() + + Check drive->mult_count in flagged_taskfile() and fail request early + if necessary so there is no need to do it later in the PIO handlers. + + Signed-off-by: Bartlomiej Zolnierkiewicz + Signed-off-by: Linus Torvalds + + + [PATCH] ide: last IRQ fix for task_mulout_intr() (CONFIG_IDE_TASKFILE_IO=n) + + We should wait for the last IRQ after all data is sent. + + Signed-off-by: Bartlomiej Zolnierkiewicz + Signed-off-by: Linus Torvalds + + + [PATCH] ide: remove DTF() debugging printks from ide-taskfile.c + + They are off by default and conflict with the future changes. + + Signed-off-by: Bartlomiej Zolnierkiewicz + Signed-off-by: Linus Torvalds + + + [PATCH] ide: add task_multi_sectors() to ide-taskfile.c + + Move common code from task_mulin_intr() and task_mulout_intr() + (CONFIG_IDE_TASKFILE_IO=y) to a task_multi_sectors() helper. + + Signed-off-by: Bartlomiej Zolnierkiewicz + Signed-off-by: Linus Torvalds + + + [PATCH] ide: split task_sectors() and task_multi_sectors() + + - split __task_sectors() out of task_sectors() + - add bio and buffer versions of task[_multi]_sectors() + - use task_bio_sectors() instead of task_sectors() in pdc4030.c + - move task[_buffer]_sectors() to ide-taskfile.c + - uninline task[_multi]_sectors() + + Signed-off-by: Bartlomiej Zolnierkiewicz + Signed-off-by: Linus Torvalds + + + [PATCH] ide: don't clear rq->errors for REQ_DRIVE_TASKFILE requests + + REQ_DRIVE_TASKFILE requests aren't retried so don't clear rq->errors + in CONFIG_IDE_TASKFILE_IO=n PIO handlers and in CONFIG_IDE_TASKFILE_IO=y + PIO handlers clear rq->errors only for fs requests, flagged_* PIO + handlers were already okay. + + Signed-off-by: Bartlomiej Zolnierkiewicz + Signed-off-by: Linus Torvalds + + + [PATCH] ide: use task_buffer[_multi]_sectors() in ide-taskfile.c + + - update rq counters directly in task_buffer_sectors() + - use task_buffer[_multi]_sectors() in taskfile PIO + handlers (CONFIG_IDE_TASKFILE_IO=n and flagged ones) so: + (a) rq->hard_cur_sectors is used for rq mapping + (b) in case of error valid rq->sector is reported + (c) we can s/rq->current_nr_sectors/rq->nr_sectors/ later + - uninline task_buffer_sectors() + - remove not needed !rq->bio code from ide_[un]map_buffer() + (it is used only for fs requests which are always bio based) + - remove no longer needed task_rq_offset() + + Signed-off-by: Bartlomiej Zolnierkiewicz + Signed-off-by: Linus Torvalds + + + [PATCH] ide: PIO-out setup fixes (CONFIG_IDE_TASKFILE_IO=n) + + - setup hwgroup->handler/timer in ->prehandler() (after checking + drive status) and in do_rw_taskfile() only send a command + - make pre_task_mulout_intr() transfer first data block itself + instead of calling ->handler() so we don't have to play tricks + with hwgroup->handler/timer in task_mulout_intr() + + Signed-off-by: Bartlomiej Zolnierkiewicz + Signed-off-by: Linus Torvalds + + + [PATCH] ide: reduce > 3kb call path in ide-cs + + - Reduce large stack usage in ide_config() by using kmalloc(), down + from 0x4a4 bytes to 0x64 bytes (x86-32). + - Little whitespace cleanup. + - Move function comment block to immediately above the function. + + Module loaded and unloaded, otherwise not tested (no hardware). + + Signed-off-by: Randy Dunlap + Signed-off-by: Bartlomiej Zolnierkiewicz + Signed-off-by: Linus Torvalds + + + [PATCH] ide: hpt36x/37x tuning fix + + From: Jonas Thornblad + + There is a problem in the hpt366.c driver where the function + ide_config_drive_speed(drive, speed) is called without using the correct + speed variable. The speed variable should use the value returned by + hpt3xx_ratefilter which decides the speed after checking against the bad + drives list. + + I believe the following patch fixes the problem. + + Slightly reworked by me - Bart. + + Signed-off-by: Bartlomiej Zolnierkiewicz + Signed-off-by: Linus Torvalds + + + [PATCH] ide: check_region removal - trm290.c + + Signed-off-by: Jesper Juhl + Signed-off-by: Bartlomiej Zolnierkiewicz + Signed-off-by: Linus Torvalds + + + [PATCH] symlink 1/9: infrastructure and explanation + + This patch-kit gets past the limit on nested symlinks, without + incompatible API changes _and_ with killing code duplication in most of + the readlink/follow_link pairs. And no, it's not the old ->getlink() + crap - procfs et.al. are not special-cased there. + + Here's how it works: + * ->follow_link() still does what it used to do - replaces + vfsmount/dentry in the nameidata it got from caller. However, it can + also leave a pathname to be resolved by caller. + * we add an array of char * into nameidata; we always work with + nd->saved_names[current->link_count]. nd_set_link() sets it, + nd_get_link() returns it. + * callers of ->follow_link() (all two of them) check if ->follow_link() + had left us something to do. If it had (return value was zero and + nd_get_link() is non-NULL), they do __vfs_follow_link() on that name. + Then they call a new method (->put_link()) that frees whatever has to + be freed, etc. + + Note that absolute majority of symlinks have "resolve a pathname" as + part of their ->follow_link(); they can do something else and some don't + do that at all, but having that pathname resolution is very, very + common. + + With that change we allow them to shift pathname resolution part to + caller. They don't have to - it's perfectly OK to do all work in + ->follow_link(). However, leaving the pathname resolution to caller + will + a) exclude foo_follow_link() stack frame from the picture + b) kill 2 stack frames - all callers are in fs/namei.c + and they can use inlined variant of vfs_follow_link(). + + That reduction of stack use is enough to push the limit on nested + symlinks from 5 to 8 (actually, even beyond that, but since 8 is common + for other Unices it will do fine). + + For those who have "pure" ->follow_link() (i.e. "find a string that + would be symlink contents and say nd_set_link(nd, string)") we also get + a common helper implementing ->readlink() - it just calls + ->follow_link() on a dummy nameidata, calls vfs_readlink() on result of + nd_get_link() and does ->put_link(). Using (or not using) it is up to + filesystem; it's a helper that can be used as a ->readlink() for many + filesystems, not a reimplementation of sys_readlink(). However, that's + _MANY_ filesystems - practically all of them. + + Note that we don't put any crap like "if this is a normal symlink, do + this; otherwise call ->follow_link() and let it do its magic" into + callers - all symlinks are handled the same way. Which was the main + problem with getlink proposal back then. + + That covers almost everything; the only cases left are nfs, ncpfs and + cifs. Those will go later - we are backwards compatible, so it's not a + problem. + + First patch: infrastructure - helpers allowing ->follow_link() to leave + a pathname to be traversed by caller + corresponding code in callers. + + + [PATCH] symlink 2/9: ext2 conversion and helper functions + + ext2 conversion (helper functions for that one will be actually + used a lot by other filesystems, so to fs/namei.c they go) + + + [PATCH] symlink 3/9: trivial filesystems + + trivial cases - ones where we have no need to clean up after pathname + traversal (link body embedded into inode, etc.). + + Plugged leak in devfs_follow_link(), while we are at it. + + + [PATCH] symlink 4/9: simple filesystems + + cases that can simply reuse ext2 helpers (page_follow_link_light() and + page_put_link()). + + + [PATCH] symlink 5/9: smbfs + + smbfs - switched from on-stack allocation of buffer for link body (!) to + __getname()/putname(); switched to new scheme. + + + [PATCH] symlink 6/9: xfs + + xfs switched to new scheme; leaks plugged. + + + [PATCH] symlink 7/9: shmfs + + shm switched (it almost belongs to SL3, but it does some extra stuff + after the link traversal). + + + [PATCH] symlink 8/9: befs + + befs switched; leaks plugged. + + + [PATCH] symlink 9/9: jff2 + + jffs2 switched; leaks plugged. + + + [PATCH] USB: EHCI IRQ tweaks + + Various tweaks to EHCI IRQ handling, these may affact some systems. + + - Delays enabling IRQs until the root hub is more fully set up, so + any "resume detect" IRQs can be handled properly. (Craig Nadler) + + - Power down ports on driver shutdown. (Craig Nadler) + + - Remove some duplicate irq-sharing logic that somehow crept in; check + only once, and return IRQ_NONE to detect IRQ storms better (db) + + - Minor comment fix re integrated TTs. (db) + + From: Craig Nadler + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: usb ethernet gadget build fixes on PXA + + Build fixes for ethernet gadget on PXA. + + From: Frank Neuber + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: hid-tmff fix + + This fixes a long-standing bug in the hid-tmff driver that + causes it to not work at all. + + + Signed-off-by: Greg Kroah-Hartman + + + qla2xxx: Remove qla_os.h + + From: Andrew Vasquez + + Instead make all files do the proper includes. + Signed-off-by: James Bottomley + + + [PATCH] USB: Use 64-bit IO addresses in UHCI driver + + Thanks to Ludovic Aubry for this patch. It changes some local variables + used by the UHCI driver to store IO addresses from unsigned int to + unsigned long. This is vitally necessary on 64-bit platforms. + + + + + From: Ludovic Aubry + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Imiprove usb_device tracking in dummy_hcd + + A tricky problem the dummy_hcd driver has to solve is keeping track of the + usb_device structure that corresponds to a registered gadget. Right now + that's not done very robustly. This patch stores the address of the + structure when a new URB is submitted and also acquires a reference to + make sure that completing the final URB won't deallocate the structure + before dummy_hcd is through with it. + + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Add mb() during initialization of UHCI controller + + In a recent thread it was mentioned that some architectures, such as PPC, + do not guarantee relative ordering between different varieties of + processor/device data transfers. This patch adds an mb() instruction to + the UHCI driver, to insure that the data structures in memory (cached by + the CPU and accessed by DMA) are fully flushed before the controller is + started (by regular bus IO). + + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: usb gadget drivers should be stricter about ZLPs + + Some USB device controllers make it easy to handle all the various ways + hosts interpret the USB spec about when control-IN transfers need to send + a ZLP ... they can just send one if the host asks, or start the status + stage whenever the host thinks it's time. Other controllers make it hard + to be forgiving in those cases. + + This patch updates all the gadget drivers to explicitly set the req->zero + flag to reflect whether the USB spec says a ZLP "must" be sent by the + device. "Forgiving" drivers won't notice the change, but the others need + to see this information passed down from the gadget driver. + + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: GFP_KERNEL in irq + + you are using GFP_KERNEL in irq. That's illegal. GFP_ATOMIC must + be used. + + Signed-Off-By: Oliver Neukum + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: kaweth not handling ESHUTDOWN + + kaweth fails to cleanly shut down operations upon shutdown of the + controller. + + + Signed-Off-By: Oliver Neukum + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: gadgetfs AIO support + + This patch adds AIO support to gadgetfs, letting user mode programs use + "libaio" to manage USB I/O concurrency with the same API as they may + already be using for disk files. In particular, it's practical to + stream isochronous data to/from userspace using this API, by keeping + an endpoint's I/O queue from emptying. + + Each AIO "iocb" in userspace corresponds directly to one "usb_request" + (and one kiocb) in the kernel. Their lifecycles, including cancelation, + overlap completely. That's much of why the patch is so small (surprised + the heck out of me!); that, and using copy_{to,from}_user() rather than + trying fancy dma mapping tricks to attain zerocopy nirvana. + + The kernel AIO module forgot to export kick_iocb(), so this adds the + missing declaration ... needed when using gadgetfs as a module. + + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: shut-up kaweth usb/net driver + + The kaweth usb ethernet driver is pretty noisy. It generates over 40 lines + during a modprobe. The following patch reduces the prints generated by + this driver. + + Signed-off-by: Andrew Morton + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Patch to signal underflow in usb-storage driver + + This patch causes the usb-storage driver to return an error indication + (DID_ERROR together with SUGGEST_RETRY) when the amount transferred by a + SCSI command is smaller than the "underflow" amount. Some devices, like + the iRiver H100 series, occasionally transfer 0 bytes with GOOD status. + This change will make the sd driver aware that something unexpected has + happened so it can retry the command. + + + + Signed-off-by: Alan Stern + Signed-off-by: Matthew Dharm + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: PWC 9.0.1 + + Attached you will find patches that will bring the PWC driver in the kernel + up to version 9.0.1 from 8.12 (9.0 wasn't accepted at first). Patches are + against 2.4.26 and 2.6.7. The main difference with 9.0 is that the + video_relase() routine is now hopefully in line with kernel requirements. + I've also added one more ioctl() call, upon request. + + I'm also slightly in the dark on the status of the PWC in the 2.6 kernel; + I've seen two patches: the first was a bad one, since it would crash your + kernel when you unplug the cam. I've seen a second patch to reverse the + first one, but I don't know if that went in. Either way, you might get a + conflict in pwc-if.c in and about the pwc_video_release() routine; this + patch was generated against the clean 2.6.7 kernel source. Should you need + or want to fix it manually, this patch should remove the + pwc_video_release() in the 2.6 kernel. + + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: enable the pwc driver to be able to be built again. + + + Make bitops/cpumask functions be "const" where appropriate. + + + [NET]: Fix warning in tr.c + + A few things popped up when using current gcc cvs. + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [NET]: Fix warning in fc.c + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [NETFILTER]: ip_fw_compat_masq.c needs net/ip.h for IP_OFFSET. + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [PKT_SCHED]: Fix pkt_sched.h warnings. + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [PKT_SCHED]: Fix typo in config help text, noticed by Geert. + + + [PATCH] symlink: fix missing 'depth' initialization + + Now we always care about one part of nameidata --- ->depth. And we need + to make sure it's always initialized. + + generic_readlink() was missing that part. + + + [ARM PATCH] 1942/1: basic LCD support for the PXA270/Mainstone board + + Patch from Nicolas Pitre + + This is only basic support so the LCD pannel becomes usable + on Mainstone. No PXA270 specific capabilities were added. + The Mainstone defconfig also updated to enable LCD by default. + + + [PATCH] x86: fix up cpumask breakage + + We can't do + + &some_inline_function(); + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [AGPGART] Fix silly logic bug in AGPx8 ->x4 fallback code. + Spotted by Rainer Klier + + Signed-off-by: Dave Jones + + + [NET] move already shared functions from inet to core + + inet_recvmsg, inet_setsockopt, inet_getsockopt and inet_sock_release are + already shared with ipv6 and sctp, will be used as well by the poor cousins, + so reflect this properly renaming them to sock_common_NAME and move them to + net/core/sock.c + + Signed-off-by: Arnaldo Carvalho de Melo + Signed-off-by: David S. Miller + + + [NET] share tcp_v4_destroy_sock with tcpv6 + + tcp_v6_destroy_sock just extends tcp_v4_destroy_sock, so reuse the + tcp_v4_destroy_sock instead of cut'n'pasting it into tcpv6. + + Signed-off-by: Arnaldo Carvalho de Melo + Signed-off-by: David S. Miller + + + Do not loop in cifsd demultiplex thread when someone sigkills it. + On unmount of second user on same tcp session, make sure that we + do not kill cifsd prematurely. + + Signed-off-by: Steve French (sfrench@us.ibm.com) + + + [SPARC64]: Make find_next_bit take a const pointer. + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [SPARC64]: Make ___arch_swapXp() take a const pointer. + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [SPARC64]: Update defconfig. + + + [IPSEC]: Check encap_type at config time. + + The following patch moves the udp->encap_type check from the per-packet + hot-path into udp_setsockopt(). + + As a consequence, this allows user space to detect whether the kernel + actually supports the encap type that they're requesting. Pity no one + did this before the NON-IKE patch was applied. As it is there is no + easy way to detect whether NON-IKE support is present. + + Signed-off-by: Herbert Xu + + Signed-off-by: David S. Miller + + + [IPSEC]: Check encap_type at config time, in user API code. + + Here is the patch to check encap_type at the earliest possible + opportunity in xfrm_user/af_key. + + This will allow us to assume in esp4 that the encap_type from x->encap + is always valid. + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [PATCH] isofs fixes + + This fixes two things. + + On the one hand we have the old "cruft" mount option, that sometimes was + enabled automatically, for ridiculously large files or CDROMs. But what + was ridiculous ten years ago, no longer is. So, only decide that + something is cruft when the user said so. + + On the other hand, sometimes we get negative sizes. That is caused by + assignments inode->i_size = isonum_733(), where the latter was declared + integer. I made it unsigned int, as the standard also does. + + (Someone with problems replied: + >> Could you test the below? + > Ok I did, the patch seems to work great! Thanks! + ) + + + [PATCH] ide: idle disk on resume + + From: Jens Axboe + + I need this patch to survive suspend on my powerbook, if the drive is + sleeping when suspend is entered. Otherwise it freezes on resume when it + tries to read from the drive. + + Acked by Ben. + + Signed-off-by: Bartlomiej Zolnierkiewicz + Signed-off-by: Linus Torvalds + + + [PATCH] ide: limit max_sectors to 256 for PDC20265 + + PDC20265 seems to not like large LBA48 requests. + + Thanks to Adolfo Gonzalez Blazquez for help in debugging this problem. + + Signed-off-by: Bartlomiej Zolnierkiewicz + Signed-off-by: Linus Torvalds + + + [PATCH] v850: guard declaration of handle_IRQ_event with #ifdef !__ASSEMBLY__ + + Signed-off-by: Miles Bader + Signed-off-by: Linus Torvalds + + + [PATCH] v850: add missing end-of-line backslash to vmlinux.lds.S + + Signed-off-by: Miles Bader + Signed-off-by: Linus Torvalds + + + [PATCH] v850: add find_next_bit + + [Since many archs use the same implementation of find_next_bit, it might + be nice to have `generic_find_next_bit' or something.] + + Signed-off-by: Miles Bader + Signed-off-by: Linus Torvalds + + + [PATCH] v850: remove bogus __ARCH_WANT_ macro defs + + Signed-off-by: Miles Bader + Signed-off-by: Linus Torvalds + + + [PATCH] make CONFIG_SYSVIPC depend on CONFIG_MMU + + The sysv-ipc code uses mm/shmem.o, which in turn uses VM stuff and is + only compiled on MMU systems. + + Signed-off-by: Miles Bader + Signed-off-by: Linus Torvalds + + + [PATCH] ia64: early console registration + + Allow consoles to register early if they're capable of early output. + If one of them registers successfully, set CPU 0 online so that + printk() will actually call the console drivers. + + Signed-off-by: Jesse Barnes + Signed-off-by: David Mosberger + + + [PATCH] ia64: Fixups for the SN2 Block Transfer Engine + + The attached patch contains some cleanups to the bte code and introduces + the ability to excercise bte interfaces on other nodes. This is an SGI + Altix specific piece of hardware. + + Signed-off by: Robin Holt + Signed-off by: Jesse Barnes + Signed-off-by: David Mosberger + + + [PATCH] ia64: make SN2 use 16MB granules, too + + Altix needs to use 16MB granules to prevent attribute aliasing in low + memory space. This patch makes the kernel configuration system + enforce that requirement. + + Signed-off-by: Jesse Barnes + Signed-off-by: David Mosberger + + + [PATCH] ia64: minor IOSAPIC cleanup + + Introduce iosapic_{read,write,eoi} to hide the IOSAPIC REG_SELECT + stuff. i386 and x86_64 already do this for io_apic_{read,write}. + + Signed-off-by: Bjorn Helgaas + Signed-off-by: David Mosberger + + + [PATCH] ia64: another sn2_defconfig update + + This update fixes the FAT default NLS options and trims some others. + + Signed-off-by: Jesse Barnes + Signed-off-by: David Mosberger + + + [PATCH] ia64: trashing bootmem on non-NUMA boxes + + call_pernode_memory() is rounding memory regions to page boundaries, + but in the non-NUMA case, it's incorrectly passing the rounded start and + the original length. Any reserved memory regions sitting beyond a + memory region that isn't nicely aligned is potentially at risk for + getting freed and trashed. This is a fairly nasty bug that can bite in + very hard to find ways. In my case, the EFI memory map was getting + overwritten, causing the ACPI methods to access chipset registers + cachable instead of uncachable. It could potentially be causing some of + the random hangs and strange behavior we're seeing lately. + + Signed-off-by: Alex Williamson + Signed-off-by: David Mosberger + + + [PCMCIA] Fix bogus align value + + 0 is not a valid alignment value for allocate_resource() + + + [ARM] Fix SA1100 build after timer changes. + + + [PATCH] More advansys fixes + + - fix PCI wide "use_sg > 0" problem introduced in lk 2.6.7-bk2 + - fix ISA oops (present in all versions of the lk 2.6 series to date) + - bump version to "3.3K" and add comments + - fix compilation error when ADVANSYS_DEBUG defined + + Signed-off-by: James Bottomley + + + advansys: add warning and convert #includes + + The DMA conversion of the advansys driver is still + broken. Add a #warning to the driver and a comment + above it explaining what needs to be done. + + Mark the driver as BROKEN because of the warning + + Also remove the #include "scsi.h" + + Signed-off-by: James Bottomley + + + [PATCH] ppc32: fix compilation + + PPC has an out of line and exported abs() that gives lots of nice and + wierd compilation erorrs. Also kill the duplicate cpu_online() in + asm-ppc/smp.h. + + + [PATCH] MPT Fusion driver 3.01.09 update + + On Mon, Jun 21, 2004 at 12:16:08PM -0400, Moore, Eric Dean wrote: + > We are pleased to announce the MPT Fusion release candidate for lk 2.6 + + I've worked with Eric offline to resolve the issue we had and get some + more changes in, but he has left for his vacation today. He send me + a patch though and left it to me whether we'd merged it despite only + moderate testing. Given 2.6.7 was just done and he'll certainly be + back before 2.6.8 I'd go for it. Below is the patch rediffed against + scsi-misc-2.6: + + Signed-off-by: James Bottomley + + + [IPSEC]: Fix alen calcs in non-IKE encapsulation. + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [IPSEC]: Remove run-time encap_type checks in esp4. + + This allows us to remove all the per-packet checks on x->encap->encap_type. + I've left the check in esp_input just in case someone adds a non-ESP encap + type in future. + + However, printing a warning and then continuing is definitely wrong. + So expect a follow-up patch to drop the packet when encap_type is + unknown in esp_input. + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [IPSEC]: Drop bogus NAT-T printks in esp_input. + + Here is the patch to drop the packet if encap_type is unknown. + I've also removed the other two bogus printk's as they cannot + occur (printing a message is the last thing you want to do even + if they did occur :). + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [PKT_SCHED]: In tca_action_flush, don't pass NULL netlink callback into ops->walk(). + + Signed-off-by: Jamal Hadi Salim + Signed-off-by: David S. Miller + + + [IPSEC]: Move common code out of udp_encap_rcv(). + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [PATCH] fdomain screwup + + | From: Andrew Morton + | To: linux-scsi@vger.kernel.org + | Subject: fdomain screwup + | + | - fdomain_setup() is marked __init, but is called from non-__init + | fdomain_16x0_detect() + | + | - fdomain_setup() is declared in drivers/scsi/pcmcia/fdomain_stub.c as + | taking two arguments, but is implemented in fdomain_setup() taking a + | single argument. + | + | Please, never ever ever put extern function declarations in .c files. + | Put it in a header file which is visible to the definition and to all + | callsites. + | + | - fdomain_setup() is declared static, hence the linkage fails. + | + | - fdomain_16x0_bus_reset() is implemented in drivers/scsi/fdomain.c but + | has static scope, so the call from drivers/scsi/pcmcia/fdomain_stub.c + | doesn't work. + + [I didn't find this to be the case, so I didn't fix it.] + + | - fdomain_16x0_bus_reset() has an extern declaration in + | drivers/scsi/pcmcia/fdomain_stub.c. This should be moved to a header + | file which is visible to etc... + + Builds and loads. No hardware to test. + + Signed-off-by: Randy Dunlap + Signed-off-by: James Bottomley + + + [PATCH] fix aic7xxx probing + + aic7xxx probing routines are still wrong on eisa. + + Fix eisa by incrementing found if it returns successfully + Also make all the various incarnations of the pci probing routine + consistently return the number of found cards (or 1 for the later + generic device model probing). + + Signed-off-by: James Bottomley + + + [ATM]: fix sparse checker warnings (by Stephen Hemminger ) + + + Fix up fdomain after mismerge + + Signed-off-by: James Bottomley + + + [PATCH] mptbase.c build fix + + drivers/message/fusion/mptbase.c: In function `procmpt_summary_read': + drivers/message/fusion/mptbase.c:5160: parse error before `int' + + Signed-off-by: Andrew Morton + Signed-off-by: James Bottomley + + + ncr53c8xx turn on clustering + + Since the driver now supports multiple virtual segments + in an iommu situation, it can also support clustering + for non-iommu systems. + + Signed-off-by: James Bottomley + + + [PATCH] some tmscsim consolidation + + On Sun, Jun 06, 2004 at 02:41:56PM +0200, Christoph Hellwig wrote: + > I've looked through my old tmscsim patch queue and found this one: + > + > - merge dc390_initDCB into dc390_slave_alloc + > - merge DC390_release and dc390_shutdown into dc390_remove_one, + > use del_timer_sync to make sure the timer is really deleted on + > removal, adjust locking accordingly + > - some tiny related cleanups + + Okay, here's a resend vs current scsi-misc-2.6 that has your three + outstanding merged. Additionally I've also killed dc390_freeDCBs() + as all dcbs are removed in ->slave_destroy. + + Signed-off-by: James Bottomley + + + [PATCH] kill obsolete typedefs and wrappers from tmscsim + + Signed-off-by: James Bottomley + + + [PATCH] PATCH: (as333) BLIST flag for non-lockable devices + + On Wed, 23 Jun 2004, Mike Anderson wrote: + > Since SCSI already has the device list it would seem like we would + > possibly add a new flag like was done for mode sense. As this is not a + > transport issue I would assume we would not want to add flags in + > usb/storage, but handle it in the mid-layer as a SCSI protocol + > non-compliance. + + Here is a patch that implements this suggestion. It's rather similar to + the one that Javier Marcet wrote back in January, in + + http://marc.theaimsgroup.com/?l=linux-usb-users&m=107345268526718&w=2 + + Signed-off-by: Alan Stern + Signed-off-by: James Bottomley + + + [PATCH] Add PCDP console detection support + + Add support for the EFI/DIG PCDP console discovery table (see + http://www.dig64.org/specifications/DIG64_HCDPv20_042804.pdf). + + This moves the code from drivers/serial/8250_hcdp.[ch] to + drivers/firmware/pcdp.[ch], since it's no longer 8250-specific. It also + obsoletes CONFIG_SERIAL_8250_HCDP, replacing it with CONFIG_EFI_PCDP (which + defaults to Y for ia64). + + In a nutshell, HCDP tells us "these UARTs are available for use as a + console," and it's up to the user to explicitly specify the console device. + The kernel can guess in some cases, but not all. + + The PCDP (aka HCDP v2) tells us what we really want to know, namely, "this + UART or VGA device is the console device." (It also has provision for + support for new device types.) + + Signed-off-by: Bjorn Helgaas + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: COMMAND_LINE_SIZE fix + + In file included from arch/ppc64/kernel/setup.c:37: + include/asm/machdep.h:116: `COMMAND_LINE_SIZE' undeclared here (not in a function) + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: fix oprofile on 970 + + - Use 970/970FX instead of GPUL + - Add POWER5 and 970FX to systemcfg.h + - Create new cpu feature CPU_FTR_MMCRA_SIHV and use it + + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: udbg should use snprintf + + Use vsnprintf/snprintf in udbg.c + + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: another udbg fix + + udbg_read would lock up if ppc_md.udbg_putc didnt exist. Just return 0 and + dont lock up instead. + + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: udbg fix + + Some udbg.c cleanups: + + - remove some old comments + - clean up formatting + - remove unused udbg_puthex and udbg_printSP + + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: remove a stale comment in rtas.c + + rtas.c doesn't call reloc_offset + + remove comment from rtas.c and extern function declaration + + Signed-off-by: Anton Blanchard + Signed-off-by: Milton Miller + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: fix usage of cpumask_t on iSeries + + This fixes a bit of iSeries code that hadn't been changed to reflect that + cpumask_t is now a struct and not an integer type. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] __alloc_bootmem_node should not panic when it fails + + __alloc_bootmem_node currently panics if it cant satisfy an allocation for + a particular node. Thats rather antisocial, we should at the very least + return NULL and allow the caller to proceed (eg try another node). + + A quick look at alloc_bootmem_node usage suggests we should fall back to + allocating from other nodes if it fails (as arch/alpha/kernel/pci_iommu.c + and arch/x86_64/kernel/setup64.c do). + + The following patch does that. We fall back to the regular __alloc_bootmem + when __alloc_bootmem_node fails, which means all other nodes are checked + for available memory. + + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] larger IO bitmaps + + The previous discussion was started here: + http://www.uwsg.iu.edu/hypermail/linux/kernel/0211.0/0477.html but in 2.4 + times this was kind of problematic. + + Now, with the lazy bitmap allocation and per-CPU TSS, this will really not + drain any resources I think. 8K TSS increase and 8K per process *that does + ioperm()* - I think it is not very bad. + + The reasons why I need that, are described in the URL above. Basically this + will allow to use full-screen VESA under dosemu (without LFB though), and this + may be also helpfull for the XFree project and some other projects: + + http://www.uwsg.iu.edu/hypermail/linux/kernel/9807.1/1079.html + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] NX (No eXecute) support for x86 + + we'd like to announce the availability of the following kernel patch: + + http://redhat.com/~mingo/nx-patches/nx-2.6.7-rc2-bk2-AE + + which makes use of the 'NX' x86 feature pioneered in AMD64 CPUs and for + which support has also been announced by Intel. (other x86 CPU vendors, + Transmeta and VIA announced support as well. Windows support for NX has + also been announced by Microsoft, for their next service pack.) The NX + feature is also being marketed as 'Enhanced Virus Protection'. This + patch makes sure Linux has full support for this hardware feature on x86 + too. + + What does this patch do? The pagetable format of current x86 CPUs does + not have an 'execute' bit. This means that even if an application maps a + memory area without PROT_EXEC, the CPU will still allow code to be + executed in this memory. This property is often abused by exploits when + they manage to inject hostile code into this memory, for example via a + buffer overflow. + + The NX feature changes this and adds a 'dont execute' bit to the PAE + pagetable format. But since the flag defaults to zero (for compatibility + reasons), all pages are executable by default and the kernel has to be + taught to make use of this bit. + + If the NX feature is supported by the CPU then the patched kernel turns + on NX and it will enforce userspace executability constraints such as a + no-exec stack and no-exec mmap and data areas. This means less chance + for stack overflows and buffer-overflows to cause exploits. + + furthermore, the patch also implements 'NX protection' for kernelspace + code: only the kernel code and modules are executable - so even + kernel-space overflows are harder (in some cases, impossible) to + exploit. Here is how kernel code that tries to execute off the stack is + stopped: + + kernel tried to access NX-protected page - exploit attempt? (uid: 500) + Unable to handle kernel paging request at virtual address f78d0f40 + printing eip: + ... + + The patch is based on a prototype NX patch written for 2.4 by Intel - + special thanks go to Suresh Siddha and Jun Nakajima @ Intel. The + existing NX support in the 64-bit x86_64 kernels has been written by + Andi Kleen and this patch is modeled after his code. + + Arjan van de Ven has also provided lots of feedback and he has + integrated the patch into the Fedora Core 2 kernel. Test rpms are + available for download at: + + http://redhat.com/~arjanv/2.6/RPMS.kernel/ + + the kernel-2.6.6-1.411 rpms have the NX patch applied. + + here's a quickstart to recompile the vanilla kernel from source with the + NX patch: + + http://redhat.com/~mingo/nx-patches/QuickStart-NX.txt + + update: + + - make the heap non-executable on PT_GNU_STACK binaries. + + - make all data mmap()s (and the heap) executable on !PT_GNU_STACK + (legacy) binaries. This has no effect on non-NX CPUs, but should be + much more compatible on NX CPUs. The only effect it has it has on + non-NX CPUs is the extra 'x' bit displayed in /proc/PID/maps. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sysfs: fill_read_buffer() fix + + This BUG_ON() triggers for `count = -EFOO' due to PAGE_SIZE being unsigned. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Remove smbfs server->rcls/err + + This is a small cleanup requested by Urban, use the rcls/err in smb_request + as opposed to smb_sb_info. + + Signed-off-by: Zwane Mwaikambo + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] kallsyms: exclude kallsyms-generated symbols + + Exclude symbols added by kallsyms itself, so .tmp_kallsyms[12].S have + the same list of symbols. + + Signed-off-by: Keith Owens + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] kallsyms: verify that System.map is stable + + Verify that linking kallsyms into vmlinux generates a stable System.map, + instead of assuming that it is stable. + + Add CONFIG_KALLSYMS_EXTRA_PASS as a temporary workaround for unstable maps, + so users can proceed while waiting for kallsyms to be fixed. + + Signed-off-by: Keith Owens + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] kbuild: distclean srctree fix + + I just find a bug that ``make distclean'' cannot remove the editor backup + files and the like when using build directory. That is because the find + command is improperly searching the build directory instead of the + $(srctree) it should. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] make __free_pages_bulk more comprehensible + + I find __free_pages_bulk very hard to understand ... (I was trying to mod + it for the non MAX_ORDER aligned zones, and cleaned it up first). This + should make it much more comprehensible to mortal man ... I benchmarked + the changes on the big 16x and it's no slower (actually it's about 0.5% + faster, but that's within experimental error). + + I moved the creation of mask into __free_pages_bulk from the caller - it + seems to really belong inside there. Then instead of doing wierd limbo + dances with mask, I made it use order instead where it's more intuitive. + Personally I find this makes the whole thing a damned sight easier to + understand. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Fix race between CONFIG_DEBUG_SLABALLOC and modules + + store_stackinfo() does an unlocked module list walk during normal runtime + which opens up a race with the module load/unload code. This can be + triggered by simply unloading and loading a module in a loop with + CONFIG_DEBUG_PAGEALLOC resulting in store_stackinfo() tripping over bad + list pointers. + + kernel_text_address doesn't take any locks, because during an OOPS we don't + want to deadlock. Rename that to __kernel_text_address, and make + kernel_text_address take the lock. + + Signed-off-by: Zwane Mwaikambo + Signed-off-by: Rusty Russell (modified) + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] dmi_scan: port Acer laptop irq routing workaround to new DMI probing + + This patch moves PCI IRQ routing workaround for Acer TravelMate 360 laptop to + arch/i386/pci/irq.c and makes acer_tm360_irqrouting variable static. It also + fixes VisWs build error caused by this workaround code. + + Signed-off-by: Andrey Panin + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] dmi_scan: port PnP BIOS driver to new DMI probing + + This patch ports PnP BIOS driver to new DMI probing API. + + Signed-off-by: Andrey Panin + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] dmi_scan: port sonypi driver to new DMI probing + + This patch ports sonypi driver to new DMI probing API and removes + is_sony_vaio_laptop global variable. + + Signed-off-by: Andrey Panin + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] dmi_scan: port PIIX4 SMBUS driver to new DMI probing + + This patch ports sonypi driver to new DMI probing API and removes + is_unsafe_smbus global variable. + + Signed-off-by: Andrey Panin + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] dmi_scan: port powernow-k7 driver to new DMI probing + + This patch ports powernow-k7 driver to new DMI probing API. + + Signed-off-by: Andrey Panin + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] dmi_scan: remove unused ASUS K7V-RM DMI quirk + + BROKEN_ACPI_Sx flag doesn't seem to be used anywhere in the kernel, so ASUS + K7V-RM can be removed. + + Signed-off-by: Andrey Panin + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] dmi_scan: port APM BIOS driver to new DMI probing + + This patch ports APM BIOS driver to new DMI probing API. + + Signed-off-by: Andrey Panin + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] hpet fixes + + I eliminated the request_irq brain damage, chopped off procfs support + (didn't care for it too much in the first place and it was adopted from + rtc.c), made the check for FMODE_WRITE in hpet_open and responded to a few + other suggestions. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] per node huge page stats in sysfs + + It adds per node huge page stats in sysfs. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] knfsd: mark NFS/TCP server not EXPERIMENTAL + + From: Greg Banks + + NFS/TCP has been used widely for a long time now, and is now enabled by many + distros and typically recommended for lossy or congested networks. This patch + removes the EXPERIMENTAL tag, updates the help text, and changes arch + defconfigs to set it by default (note that several already did so). + + Signed-off-by: Neil Brown + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] knfsd: simplify nfsd4 name encoding. + + Use opaque xdr encoding routines from xdr.c instead of rolling our own. + + Signed-off-by: J. Bruce Fields + Signed-off-by: Neil Brown + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] knfsd: simplify nfsd4_release_lockowner + + Simplify nfsd4_release_lockowner a bit, factor out code that we need for + another patch. + + Signed-off-by: J. Bruce Fields + Signed-off-by: Neil Brown + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] knfsd: delete an obsolete comment from nfsd rpc code + + Signed-off-by: J. Bruce Fields + Signed-off-by: Neil Brown + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] knfsd: reduce stack usage in nfsd4 + + nfsd4_proc_compound is using over a thousand bytes of stack. + + This is partly because it declares two local svc_fh's, partly because of a big + switch statement which calls a bunch of functions which may be inlined. + + Signed-off-by: J. Bruce Fields + Signed-off-by: Neil Brown + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] knfsd: nfsd4 lockowner fixes + + Insist that the first time a client presents a new lockowner, the seqid should + be 0. (RFC 3530 section 8.1.5) + + Also, return an error if the client presents a previously-used lockowner as if + it were new. + + From: Andy Adamson + Signed-off-by: J. Bruce Fields + Signed-off-by: Neil Brown + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] knfsd: parse nsfd4 callback information + + Preparation for delegations: parse callback information provided in + setclientid request. + + From: Andy Adamson + Signed-off-by: J. Bruce Fields + Signed-off-by: Neil Brown + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] knfsd: improve cleaning up of nfsd4 requests + + Currently nfs4_arg->to_free keeps a list of void ptrs on which kfree is called + when freeing the nfs4_arg. This allows us to do cleanup on e.g. xdr decode + failures. To allow more complicated objects to be freed (in particular, + acls), we add a "void (*release)(void *)" to allow us to request something + other than kfree be called when freeing. + + Signed-off-by: J. Bruce Fields + Signed-off-by: Neil Brown + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] knfsd: allow user to set NFSv4 lease time. + + Allow the lease to be set from /proc/fs/nfs/nfsv4leasetime. + + To comply with rfc3530, this appears as a server reboot from the point of view + of the client, which must reclaim state with the grace period. + + From: Andy Adamson + Signed-off-by: J. Bruce Fields + Signed-off-by: Neil Brown + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] i386: uninline memmove + + Using current gcc CVS I hit a piece of code in which the compiler was emitting + a memmove() call. The kernel link failed. + + Uninline it. + + Also, move the memcpy and memset exports into memcpy.c. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] SELinux: fix build with CONFIG_SECURITY_NETWORK=n + + SELinux should just drop out the socket and netfilter hooks when that is + disabled. + + The problem was introduced because of the fine-grained netlink patches, + which made the selinux_netlink_send/recv hook functions depend on + CONFIG_SECURITY_NETWORK but the netlink_send/recv hooks themselves are not + dependent on it. + + Need to move selinux_netlink_send/recv back out of the conditional block, + and provide a static inline stub for selinux_nlmsg_perm if + CONFIG_SECURITY_NETWORK is not defined. + + Signed-off-by: Stephen Smalley + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] tidy up the identify_cpu() output + + Here's a patch to line up the "CPU: After * identify, caps:" messages + produced by printk's in arch/i386/kernel/cpu/common.c + + Signed-off-by: Jesper Juhl + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Permit root to choose vfat policy to UTF8 + + Right now the kernel detects the sysadmin trying to set the iocharset of + vfat to UTF8 and prevents this with an error. While I can see that this is + not recommended, enforcing this is policy that probably doesn't belong in + the kernel. The patch below makes this situation a warning and a + recommendation instead of a strong blockage. + + https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=126641 + + is an example of a sysadmin disliking this policy enforcement. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] crc: add common CRC16 module + + Currently we have 8 copies of CRC16 calculation table in different device + drivers, this patch creates common crc16.c module to replace them. + + Signed-off-by: Andrey Panin + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] crc: use it in async PPP driver + + This patch makes async PPP driver use common crc16 code. + + Signed-off-by: Andrey Panin + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] crc: use it in IRDA drivers + + This patch makes IRDA subsystem use common crc16 code. + + Signed-off-by: Andrey Panin + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] crc: use it in ISDN drivers + + This patch makes various ISDN drivers use common crc16 code. + + Signed-off-by: Andrey Panin + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] crc: use it in AX.25 drivers + + This patch makes AX.25 drivers use common crc16 code. + + Signed-off-by: Andrey Panin + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Fix direct I/O into hugetlb page + + Hit a kernel oops on 2.6.7 kernel when doing direct I/O to hugetlb page. + + The destructor of compound page was moved into page->mapping since 2.6.6. + It got interfered with set_page_dirty() for hugetlb page: an O_DIRECT read + into first tail page of the compound page will fool set_page_dirty() to + deference page->mapping->a_ops and then kernel oops. Patch to fix the + oops. We do just like what bio_set_pages_dirty() does. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix NUMA boundaray between ZONE_NORMAL and HIGHMEM + + From: Andy Whitcroft + + This patch eliminates the false hole which can form between ZONE_NORMAL and + ZONE_HIGHMEM. This is most easily seen when 4g/4g split is enabled, but + it's always broken, and we just happen not to hit it most of the time. + Basically, the patch changes the allocation of the numa remaps regions (the + source of the holes) such that they officially fall within VMALLOC space, + where they belong. + + Tested in -mjb for a couple of months, and again against 2.6.7-mm1. + + Signed-off-by: Andy Whitcroft + Signed-off-by: Martin J. Bligh + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] missing semicolon in 2.6.7 VIODASD driver + + There appears to be a missing semicolon in the VIODASD driver in 2.6.7. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppp_generic.c get_filter made conditional + + Add #ifdef CONFIG_PPP_FILTER around get_filter implementation which is only + used when this option is enabled. This prevents compiler warning (unused + function) when CONFIG_PPP_FILTER is not defined. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] laptop-mode documentation update + + The laptop mode docs don't say that no kernel configuration changes are + needed to use laptop mode. That's caused some people to look for the + option. This patch makes the doc explicitly mention the lack of an option. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] inodes_stat.nr_unused fix + + __sync_single_inode() is forgetting to increment inodes_stat.nr_unused when + moving a previously-dirty inode onto the inode_unused list. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Laptop mode control script improvements + + From: Herve Eychenne + + Clean up the script. This also makes it two times faster. (Thanks to + Herve Eychenne.) + + - moved variable definitions to the top, for easier configuration + - the script contains bashisms, so make it /bin/bash + - use sed -e'...' -e '...' instead of sed | sed + - avoid subshells: () changed to {} + - various other minor optimizations and improvements + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] swsusp.S: meaningful assembly labels + + This introduces meaningfull labels instead of .L1234, meaning code is + readable, kills alignment where unneccessary, and kills TLB flush that was + only pure paranoia (and slows it down a lot on emulated systems). + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] drivers/char/ipmi/ipmi_si_intf.c warnings + + drivers/char/ipmi/ipmi_si_intf.c: In function `acpi_gpe_irq_setup': + drivers/char/ipmi/ipmi_si_intf.c:1173: warning: passing arg 4 of `acpi_install_gpe_handler' from incompatible pointer type + drivers/char/ipmi/ipmi_si_intf.c: In function `acpi_gpe_irq_cleanup': + drivers/char/ipmi/ipmi_si_intf.c:1193: warning: passing arg 3 of `acpi_remove_gpe_handler' from incompatible pointer type + + Signed-off-by: Luiz Capitulino + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] anon_vma list locking bug + + Vladimir Saveliev reported anon_vma_unlink list_del BUG (LKML 24 June). + His testing is still in progress, but we believe it comes from a nasty + locking deficiency I introduced in 2.6.7's anon_vma_prepare. + + Andrea's original anon_vma_prepare was fine, it needed no anon_vma lock + because it was always linking a freshly allocated structure; but my + find_mergeable enhancement let it adopt a neighbouring anon_vma, which of + course needs locking against a racing linkage from another mm - which the + earlier adjust_vma fix seems to have made more likely. + + Does anon_vma->lock nest inside or outside page_table_lock? Inside, but + that's not obvious without a lock ordering list: instead of listing the + order here, update the list in filemap.c; but a separate patch because + that's less urgent and more likely to get wrong or provoke controversy. + + (Could do it with anon_vma lock after dropping page_table_lock, but a long + comment explaining why some code is safe suggests it's not.) + + Signed-off-by: Hugh Dickins + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] cpufreq_delayed_get() inlining fix + + Here's a patch to reorder timer_tsc.c so gcc 3.4 does not fail to inline + and thus fix the warning "arch/i386/kernel/timers/timer_tsc.c:30: warning: + inlining failed in call to 'cpufreq_delayed_get': function body not + available" + + Signed-off-by: Jesper Juhl + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] lock ordering comment update + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ext3: direct-io transaction extending fix + + ext3_direct_io_get_blocks() is misinterpreting the return value from + ext3_journal_extend(), and is consequently running out of buffer credits and + going BUG on tremendously large direct-io writes. Fix that up. + + Also, I note that the really large direct-io writes can hold a transaction + open for the entire duration, which can be minutes. This violates ext3's + attempt to commit data at regular intervals. Fix that up by looking at the + transaction state: if it's T_LOCKED, shut off the current handle so the + pending commit can complete. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ARM COMMAND_LINE_SIZE build fix + + Rework the declaration, sizing and memcpying of saved_command_line[] so + that ARM doesn't need to implement unwelcome header file nestings. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Don't hold i_sem on swapfiles + + We permanently hold the i_sem of swapfiles so that nobody can addidentally + ftruncate them, causing subsequent filesystem destruction. + + Problem is, it's fairly easy for things like backup applications to get + stuck onthe swapfile, sleeping until someone does a swapoff. + + So take all that out again and add a new S_SWAPFILE inode flag. Test that + in the truncate path and refuse to truncate an in-use swapfile. + + Synchronisation between swapon and truncate is via i_sem. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ext2_setattr retval fix + + ext2_setattr() drops the inode_setattr() return value on the floor. This is + very bad - I/O errors during truncate are lost. + + The patch changes ext2_setattr() so that we no longer call ext2_acl_chmod() if + inode_setattr(), which is what ext3 does. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] reiserfs_setattr retval fix + + reiserfs() is also dropping inode_setattr() retvals on the floor. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] jfs_setattr() fix + + jfs is dropping inode_setattr()'s return value. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] cifs_setattr() retval fix + + CIFS is failing to propagate the inode_setattr() return value. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ncpfs_setattr() retval fix + + ncpfs is failing to propagate the inode_setattr return value. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] affs_setattr() retval fix + + affs is failing to propagate the inode_setattr() return value. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] PPC64 iSeries fails to boot + + Jeremy Katz of Red Hat reported that his iSeries machine would not boot + with 2.6.7 based kernels. + + It appears that with the inclusion of Paul Mackerras' patch "Optimize + exception/syscall entry/exit" a small previous patch got reverted. Here + is that patch again. The lack of this patch does not stop all iSeries + machines booting, but it does stop some. + + Signed-off-by: Stephen Rothwell + Signed-off-by: Linus Torvalds + + + [SPARC64]: No longer set WANT_PAGE_VIRTUAL. + + Also uninline pfn_to_page and page_to_pfn. + Struct page is now 8 bytes smaller. + + + Fix cifs xid transaction counts to be more consistent. Start using __set_page_dirty_no_buffers. + + Signed-off-by: Steve French (sfrench@us.ibm.com) + + + [NET]: Kill spurious ifndef in net/ip.h + + Signed-off-by: Adrian Bunk + Signed-off-by: David S. Miller + + + [NET]: Fix SO_{RCV,SND}TIMEO getsockopt handling. + + A microsecond is 1 millionth of a second not + 1 thousandth of a second. + + Noticed by Markus Mottl + + Signed-off-by: David S. Miller + + + [PATCH] ppc32: command_line_size build fix + + We need setup.h for COMMAND_LINE_SIZE. + + Signed-off-by: Joseph Fannin + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ia32: fix deadlocks when oopsing while mmap_sem is held + + If a fault in the kernel leads to an unexpected protection fault whilst in + a code path which holds mmap_sem we will deadlock in do_page_fault() while + trying to classify the fault. By carefully testing the source of the fault + we can detect and OOPS on the vast majority of these, greatly enhancing + diagnosis of such bugs. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] x86 stack dump fixes + + - Fix the !CONFIG_FRAME_POINTER && !CONFIG_KALLSYMS output formatting. + + - Make print_context_stack() static + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Fix smbfs readdir oops + + This has been reported a couple of times and is consistently causing some + folks grief, so Urban, would you mind terribly if i send this patch to at + least clear current bug reports. If there is additional stuff you want + ontop of this let me know and i can send a follow up patch. + + The bug is that at times we haven't completed setting up the smb_ops so we + have a temporary 'null' ops in place until the connection is completely up. + With this setup it's possible to hit ->readdir() whilst the null ops are + still in place, so we put the process to sleep until the connection setup + is complete and then call the real ->readdir(). + + This patch addresses the bugzilla report at + http://bugzilla.kernel.org/show_bug.cgi?id=1671 + + Signed-off-by: Zwane Mwaikambo + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] radeonfb accel capabilities + + Here's the accel capabilities patch for radeonfb. It updates radeonfb to + advertise its acceleration capabilities via fbinfo.flags. I've tested this + on my box, and it gives me a nice fast console. + + defect: "$ fbset -accel 0" doesn't work for radeonfb -- disabling accel + will only work from the kernel command line :-/ + + Cc: Benjamin Herrenschmidt + Signed-off-by: David Eger + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] vc locking + + Like a few other drivers the vc driver is doing unlocked careless + references to file offsets. Its got kind of 2.2 locking that hasnt been + updated in the lseek function so someone at least tried. + + Fortunately we have a real lock for this and can just make lseek use that + too. + + The 'assume 64bit load is atomic' bug seems to be very widely spread + + akpm@osdl.org: + + Move declarations to vt_kern.h + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix GFP zone modifier interators + + For each node there are a defined list of MAX_NR_ZONES zones. These are + selected as a result of the __GFP_DMA and __GFP_HIGHMEM zone modifier flags + being passed to the memory allocator as part of the GFP mask. Each node + has a set of zone lists, node_zonelists, which defines the list and order + of zones to scan for each flag combination. When initialising these lists + we iterate over modifier combinations 0 .. MAX_NR_ZONES. However, this is + only correct when there are at most ZONES_SHIFT flags. If another flag is + introduced zonelists for it would not be initialised. + + This patch introduces GFP_ZONETYPES (based on GFP_ZONEMASK) as a bound for + the number of modifier combinations. + + Signed-off-by: Andy Whitcroft + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Remove include/asm-*/init.h + + There's no reason to keep files that + a) nobody #include's + b) produce #error + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] minor CAP_DAC_OVERRIDE fix + + CAP_DAC_OVERRIDE fails to give search permission in a directory with + mode 0. + + Patch acked by Chris Wright + Signed-off-by: Andries Brouwer + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + ppc64: fix silly typo ("1" vs "i"). + + + [ARM] Update ARM kernel install script + + - fix up for kbuild changes + - run users own kernel install script if present + + + [AIO]: kiocb->private is too large for kiocb's on-stack. + + sizeof(struct kiocb) is dangerously large for a structure commonly + allocated on-stack. This patch converts the 24*sizeof(long) field, + ->private, to a void pointer for use by file_operations entrypoints. + A ->dtor() method is added to the kiocb in order to support the release + of dynamically allocated structures referred to by ->private. + + The sole in-tree users of ->private are async network read/write, + which are not, in fact, async, and so need not handle preallocated + ->private as they would need to if ->ki_retry were ever used. The sole + truly async operations are direct IO pread()/pwrite() which do not + now use ->ki_retry(). All they would need to do in that case is to + check for ->private already being allocated for async kiocbs. + + This rips 88B off the stack on 32-bit in the common case. + + Signed-off-by: William Lee Irwin III + Signed-off-by: David S. Miller + + + [DECNET]: Fix signed bug in net/decnet/dn_nsp_in.c:dn_nsp_linkservice() + + char can be either signed or unsigned, depending on the target system. + + Signed-off-by: Olaf Hering + Signed-off-by: David S. Miller + + + [NET]: Fix typos in pktgen docs. + + + [PATCH] nfs oops fix + + Al's current changes to struct nameidata broke nfsroot for my discless + clients (oops in nfs_fill_super). The patch below fixes this problem + for me. + + Cc: Trond Myklebust + Cc: + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] remove extraneous security_inode_setattr call in hugetlbfs + + remove extraneous security_inode_setattr call in hugetlbfs, it's already + done by VFS. + + Signed-off-by: Chris Wright + Signed-off-by: Linus Torvalds + + + [PATCH] move prototype for __get_vm_area() to a sane location + + There are currently two files besides mm/vmalloc.c that make use of that + function: + + - arch/sh/kernel/cpu/sh4/sq.c + which defined its own prototype locally risking not being in sync with + the real function, and + + - arch/arm/kernel/module.c which has no prototype at all and cause + build warnings. + + This fixes those issues + + + hash cifs inodes + + Signed-off-by: Steve French (sfrench@us.ibm.com) + + + [NETLINK]: Fix NLMSG_OK/RTA_OK length checking. + + Verify at least a full header is there before derefencing + length struct member. + + + USB: provide support for the HX version of pl2303 chips + + Thanks to Gordon Elam for the information needed + to do this. + + Signed-off-by: Greg Kroah-Hartman + + + merge /proc/fs/cifs/SimultaneousOps into /proc/fs/cifs/Stats + + Signed-off-by: Steve French (sfrench@us.ibm.com) + + + [ARM] Move ZTEXTADDR/ZBSSADDR initialisation to compressed/Makefile + + Since this is where these two variables are used, it makes sense to + have them in that makefile. Also, consolidate "targets" + initialisation, fixes a missing FORCE dependency for the uImage rule, + and remove more FTVPCI code. + + + [ARM] arch/arm/boot variable name consistency. + + For clarity and consistency, use the same name for makefile and + linker symbols. + + + [ARM] Fix install/zinstall to work with separated source/build trees. + + + [ARM] Convert bootp to use kbuild infrastructure. + + + [ARM] Kernel boot decompressor updates + + - use 'Image' target for kernel image to be compressed rather than + duplicating its generation. + - use .incbin-based generation of ELF objects from binary data rather + than 'ld'-based generation. + + + [ARM] Prevent static data in misc.o + + Static data causes GOTOFF relocations to be used, which won't work + because we want to relocate the .data section separately from the + .text section. Therefore, force all data to be nonstatic. + + + [ARM] EBSA110 I/O and decompressor fixes. + + This fixes the buggy decompressor assembly, and fixes PCMCIA IO + to use the correct byte lane when accessing certain PCMCIA cards. + + + [ARM] arch/arm/Makefile cleanups + + Clean up bzImage target, remove a couple of obsolete testing targets, + and add better bootpImage help text. + + + [ARM] Move ISA_DMA_THRESHOLD to asm/memory.h + + This allows machine classes to override ISA_DMA_THRESHOLD as + necessary. + + + [ARM] Move arch_adjust_zones to asm/memory.h + + This places arch_adjust_zones along side ISA_DMA_THRESHOLD. These + two are related, but having them in separate files means its not + obvious that they are. + + ISA_DMA_THRESHOLD is a DMA mask which must be defined such that it + matches the memory handed out by GFP_DMA, which in turn is controlled + by arch_adjust_zones. + + + [PATCH] ppc64: fix memset + + This fixes a bug in the ppc64 memset where the code that gets the + destination address aligned (or is supposed to) was looking at the + bottom 3 bits of the count rather than the destination address. The + result of this was that the kernel wouldn't boot on POWER3 machines. + The patch also removes an unnecessary duplicate instruction. + + Signed-off-by: Paul Mackerras + Signed-off-by: Linus Torvalds + + + [PATCH] sparse: fix ugly include/linux/efi.h typedef + + efi.h declares a function type, and then uses that as an argument to + another function, and expects the compiler to magically demote the + function to a function pointer. + + Even a gcc person (rth) was surprised that this was legal, and it + doesn't match any other use of a function pointer in the kernel, and + sparse doesn't like the implicit type-conversion. + + So make the type sane in the first place, instead of depending on + a very weird corner case of the C language. + + + [PATCH] Remove NOOP code from fs/buffer.c::drop_buffers() + + I noticed that fs/buffer.c::drop_buffers() contains some code that + AFAICS doesn't actually do anything other than waste cpu cycles so here + is patch to remove it... The local variable was_uptodate is being + messed with but it is not being read anywhere so it seems entirely + pointless. + + I assume this must be a remainder from old code which mucked around with + the page uptodateness but which has since been (re-)moved. + + Signed-off-by: Anton Altaparmakov + Signed-off-by: Linus Torvalds + + + [PATCH] USB Storage: unusual_devs.h addition + + took me a while to get my external usb drive running under linux-2.6.6, + appears to need the appended fix. according to the header in unusual_devs.h + one should send them to you, so here you go. + + the funny thing is that it works fine unter linux-2.6.0-test11 on different + hardware, but then i'm out of my depth concerning what might have been + changed in the usb driver in the meantime. i don't really follow the + changes. i didn't find any real documentation about what these flags do, + only a couple of "my usb drive worked with 2.4 but doesn't work any more + with 2.6" messages on the web, and some of them pointed to unusual_devs.h. i + do not claim to know what i've done with this fix, but i'd like to see it + officially included. :-) + + + T: Bus=04 Lev=01 Prnt=01 Port=02 Cnt=01 Dev#= 2 Spd=480 MxCh= 0 + D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1 + P: Vendor=0402 ProdID=5621 Rev= 1.03 + S: Product=USB 2.0 Storage Device + S: SerialNumber=00042222200000113608 + C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr= 0mA + I: If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage + E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms + E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms + + + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: PL2303 module, new IDs + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: pwc-uncompress.h + + For some reason, gcc-2.95.4 dies horridly on those asmlinkage + declarations. + + I was unable to work out _why_ those functions have asmlinkage, as there + seem to be no instances of them - nobody calls + pwc_register_decompressor(). + What's up with that? + + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Fix pegasus_set_multicast lockup in drivers/usb/net/pegasus.c + + I strongly recommend that this patch be applied. + + Without this patch, running tcpdump on an SMP machine with the + pegasus adapter locks up 9 times out of 10. This is what happens: + + CPU0 CPU1 + pegasus_start_xmit + netif_stop_queue + pegasus_set_multicast + netif_stop_queue + netif_wake_queue + + Which crashes if another packet is sent to pegasus_start_xmit before + the first one is finished. + + If there are other drivers doing this, please fix them too. + + PS I submitted this to Petkan years ago but he probably lost it. + + + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB Storage: Unusual_devs.h update + + On Sat, 26 Jun 2004, Edward C. Bailey wrote: + + > Hello, + > + > I was downloading some pictures from my Digital Wallet to my Fedora + > Core 2 system at the same time I happened to be watching + > /var/log/messages. Here's what I saw: + > + > Jun 26 12:16:02 raptor kernel: usb 1-1.2: new full speed USB device using address 6 + > Jun 26 12:16:02 raptor kernel: usb-storage: This device (097a,0001,0001 S 06 P 01) has unneeded SubClass and Protocol entries in unusual_devs.h + > Jun 26 12:16:02 raptor kernel: Please send a copy of this message to + > + > Given that Minds@Work are out of business, you might not care about this + > information, but I thought I'd pass it on, just in case you do... :-) + + What the heck, we'll use it anyway. Thanks for sending this in. + + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [ARM] Reliably update SIZEOF_MACHINE_DESC + + Generate SIZEOF_MACHINE_DESC using asm-offsets method rather than + relying on people updating the definition in asm/mach/arch.h + + + [ARM] MMC mclk is no longer used, so remove it. + + + [ARM] Miscellaneous fixes + + - Remove 'arc' machine name from Makefile + - clk_set_rate() should return non-zero atm. + - proc-sa1100.S doesn't need asm/ptrace.h + - update mach-types + - kill line of spaces in clock.h + + + [PATCH] ia64: define cpu_logical_id() always + + Define cpu_logical_id() even when !SMP. I added uses of this in some + iosapic printk's, which broke the UP build. + + Signed-off-by: David Mosberger + + + [PATCH] ia64: fix a couple of comment typos + + + Signed-off-by: David Mosberger + + + [PATCH] ia64: Don't use -mtune=merced for gcc 3.4 + + Gcc 3.4 has a new DFA scheduler for ia64. Unfortunately, it is not + well tested for Itanium 1. When I tried to use gcc 3.4 to compile + 2.6 kernel configured for Merced, gcc failed in many places: + + http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15598 + http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15653 + http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15655 + http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16130 + http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16142 + http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16143 + + Some of them have been fixed. But I am afraid many more remain. I don't + know how many Itanium 1 machines left in production use. If people want + to optimize kernel for Itanium 1, they can stick with the older gccs. + Or they should upgrade their machines. I think the gcc developer's time + should be better spent on somewhere else. I have been using this patch + for a while, kernel seems to work OK. + + Signed-off-by: David Mosberger + + + [PATCH] ia64: change ia64_switch_mode_{phys,virt}() to preserve bsp/sp + + Change ia64_switch_mode_phys() and ia64_switch_mode_virt() to preserve + the virtual sp/bsp and update the call-sites accordingly. This avoids + problems with the init_task pointer which lives in region 5 now. + + Signed-off-by: David Mosberger + + + [NETFILTER]: Fix IP_NF_TARGET_NOTRACK config deps. + + + [NET]: Two tc action fixes. + + Another patchlet after turning on preempt and rerunning tests. + - against dev.c is a genuine bug - i wish preempt would have + given a more sane hint. Strange on how its a non issue when preempt is + off. + - against act_api.c is just an annoyance. I removed the kmod because it + will only make sense to list actions if policies exist for that action. + And if policies exist, the module would be loaded. + + Signed-off-by: Jamal Hadi Salim + Signed-off-by: David S. Miller + + + [PATCH] ia64: Clean up needlessly large stack frames in PAL-call stubs + + The code allocated all 96 stacked registers, for no apparent reason. + + Also, fix ia64_pal_call_static() to switch RSE to enforced-lazy, LE + mode before the PAL-call. + + Signed-off-by: David Mosberger + + + [PKT_SCHED]: Packet scheduler exports. + + The packet scheduling code has some ugly define's which were to deal with + configuration possibilities and the old style module exports. With the current + 2.6 method, this is unnecessary. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + USB: fix bug where removing usb-serial modules or usb serial devices could oops + + This fixes the issue where the Generic driver would bind to all usb-serial + devices, so the disconnect would not properly go to the real driver that + controlled the device. This was very bad when unloading the module with + the device still connected. + + Signed-off-by: Greg Kroah-Hartman + + + sparse: fix pointer/integer confusion + + I don't think we're in K&R any more, Toto. + + If you want a NULL pointer, use NULL. Don't use an integer. + + Most of the users really didn't seem to know the proper type. + + + [PATCH] ia64: fix incorrect initialization of ar.k4 for BP + + The patch to move the current pointer for init_task from region 7 to + region 5 inadvertendly caused ar.k4 (CURRENT_STACK) to be initialized + improperly for the bootstrap processor. Fix this by initializing it + to -1. + + Signed-off-by: David Mosberger + + + [PKT_SCHED]: Bad TDIFF_SAFE in csz. + + This code in the csz scheduler, is just plain broken. The TDIFF_SAFE + effectively expands to: + unsigned long delay = now - q->t_c; + if (delay > 0) { + delay = 0; + goto do_reset; + } + if (delay >> q->delta_log) + + So delay is always 0! I assume that what was originally intended + is the to keep delay bounded to 1<delta_log. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [PKT_SCHED]: Eliminate guard from TDIFF_SAFE. + + The last argument in the PSCHED_TDIFF_SAFE is no longer used; + only usage eliminated by previous patch. It gets rid of a bad macro + usage. + + Also, can use the standard min_t macro which also eliminates the + macro problem of double evaluation of bound. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [PKT_SCHED]: Use get_jiffies_64() + + The packet scheduler simulates 64 bit jiffies on 32 bit platforms by running + a timer keeping a mark and and offset. Since there is no locking and this is + racy and doesn't handle jiffie wrap real well. + + We can use get_jiffies_64 on 2.6 do get what is needed. + The downside is the overhead of a function call, and a cache miss in + get_jiffies_64. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [PATCH] ia64: update early printk for new console driver + + The Altix console driver has been replaced in Andrew's tree by a new + one that uses the serial core API. Update the early_console_setup + routine to use the new config option so that it's ready when the + driver hits Linus' tree. This will also fix a build bug since the old + driver hasn't been updated. + + Signed-off-by: Jesse Barnes + Signed-off-by: David Mosberger + + + Cset exclude: dtor_core@ameritech.net|ChangeSet|20040629212548|46753 + + + [AGPGART] Fix sparse NULL pointer warnings. + + Signed-off-by: Dave Jones + + + [PATCH] ia64: fix reloc-out-of-range error on module loading + + I'm hitting this problem because the module I want to load was + compiled with -g, so the filesize is absolutely huge. kernel/module.c + does a vmalloc() to inhale the entire file, and then two calls to + module_alloc() (which calls vmalloc() on ia64) to load the 'init' and + 'core' sections. The 'init' is small and slips into a gap early in the + vmalloc playspace, while the 'core' area is allocated after the huge + area that was allocated for the inhaled copy of the whole file. + + I made a one coding change to Jean-Marc's version, adding a check to + see whether the init/core sections are close enough together for the + PCREL21B to reach (they almost always are). + + I've kept the test that there are no jumps from core to init (though + the message that is printed is almost as unhelpful as the one that you + get when you statically link a module into the kernel that has calls + to the discarded .exit section :-) + + This patch stalled out before on the question of whether a PLT was + overkill for a section-to-section branch, and whether it would be + better to use relaxation techniques to extend the range. Doing that + might be more elegant in some way, but it needs a whole heap of extra + code (to count how many relaxed branches need to be added and + allocated them as needed). This seems a lot of extra code that is + only ever going to be exercised by maniacs like me with 49MB .ko + files. + + I fixed up the comments to be a little more heplful. + + Signed-off-by: + Signed-off-by: David Mosberger + + + [BRIDGE]: Fix message age in bridge STP config packets. + + This is a revised version of Kishore's patch to set message age appropriately + in STP configuration packets. + + Signed-off-by: Kishore A K + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + ia64: Fix UP-build breakage caused by early_console_setup() patch. + + + [PATCH] ia64: Quiet corrected errors (CMC/CPE) + + Trivial patch to quiet messages about corrected errors. + + Signed-off-by: Hidetoshi Seto + Signed-off-by: David Mosberger + + + [PATCH] x86_64 .init.setup alignment fix + + We're now putting 24-byte structures into .init.setup via __setup. But + x86_64's compiler is emitting a `.align 16' in there, so they end up on + 32-byte boundaries and do_early_param()'s pointer arithmetic goes wrong. + + Fix that up by forcing the compiler to align these structures to sizeof(long). + + Cc: Andi Kleen + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: fix deadlocks when oopsing while mmap_sem is held + + If a fault in the kernel leads to an unexpected protection fault whilst in + a code path which holds mmap_sem we will deadlock in do_page_fault() while + trying to classify the fault. By carefully testing the source of the fault + we can detect and OOPS on the vast majority of these, greatly enhancing + diagnosis of such bugs. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] binfmt misc fd passing via ELF aux vector + + The proposed patch uses the aux-vector to pass the fd of the open misc + binary to the interpreter, instead of using argv[1] for that purpose. + + Previous patch - open_nonreadable_binaries, offered the option of + binfmt_misc opening the binary on behalf of the interpreter. In case + binfmt_misc is requested to do that it would pass the file-descriptor of + the open binary to the interpreter as its second argument (argv[1]). This + method of passing the file descriptor was suspected to be problematic, + since it changes the command line that users expect to see when using tools + such as 'ps' and 'top'. + + The proposed patch changes the method of passing the fd of the open binary + to the translator. Instead of passing it as an argument, binfmt_misc will + request the ELF loader to pass it as a new element in the aux-vector that + it prepares on the stack for ELF interpreter. With this patch, argv[1] + will hold the full path to the binary regardless of whether it opened it or + not. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Translate Japanese comments in arch/v850 + + Convert the Japanese comments in arch/v850. + + I am not exactly 100% sure I translated it correctly since I have no idea + what exactly was that NEC v850 evaluation board, but should be OK (say 95% + sure). + + Acked by Miles Bader + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Provide console_device() + + [This patch series has also been separately sent to the architecture + maintainers] + + Add console_device() to return the console tty driver structure and the + index. Acquire the console lock while scanning the list of console drivers + to protect us against console driver list manipulations. + + Signed-off-by: Russell King + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Provide console_suspend() and console_resume() + + Add console_stop() and console_start() methods so the serial drivers + can disable console output before suspending a port, and re-enable output + afterwards. + + We also add locking to ensure that we synchronise with any in-progress + printk. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] watchdog: indydog.c update + + (04/06/27 1.1770) + [WATCHDOG] indydog.c-patch-20040627 + + * Fix: since we use the new module_param's: make sure that + linux/moduleparam.h stays included + * in the release code we can just use indydog_stop(); + + The ChangeSets can also be looked at on: + http://linux-watchdog.bkbits.net:8080/linux-2.6-watchdog + + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fbcon: fix display artifacts + + Fixed display artifacts present in the space reserved for the boot logo. + Use attributes of the background erase character instead of hardcoding the + color to zero. + + Signed-off-by: Antonino A. Daplas + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix to microcode driver for the old CPUs. + + Here is a patch against Linux 2.6.7 which fixes the sigmatch() macro to + work for the relatively old processors as well, which have 'pf == 0' + (processor flags as read from MSR 0x17), For example, the processors + failing without this patch are Pentium II 300 MHz (Klamath) with + family/model/stepping 6/3/4 and 6/3/3. + + The patch also contains minor cosmetic changes (to make source code more + uniform). + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] CREDITS update + + Luiz has ~40 patches to his name, go he gets a banana. + + Signed-off-by: Luiz Capitulino + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] PCDP console detection support fixes + + Check for ioremap failure and use correct UPIO_{MEM,PORT} constants. + + Signed-off-by: Bjorn Helgaas + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: vio infrastructure modifications + + The intention here is to have no effect on pSeries except: + + 1) vio_register_device is renamed to vio_register_device_node to better + reflect is purpose and to allow me to introduce + vio_register_device_iseries. + + 2) I have introduced the name and type fields in struct vio_dev to make + these two fields independent of subarchitecture. + + Signed-off-by: Stephen Rothwell + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: iseries_veth integration + + Signed-off-by: Stephen Rothwell + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: viodasd integration + + Signed-off-by: Stephen Rothwell + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: viocd integration + + Signed-off-by: Stephen Rothwell + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: viotape integration + + Signed-off-by: Stephen Rothwell + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] hpet fixes + + Some hpet clean up and a fix to the RTC request_irq issue. + + Signed-off-by: Bob Picco + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sh64 support + + This patch adds sh64 support. + + This is a bit overdue, as this was on the should-fix list, though we + weren't done debugging and finishing off the port until just recently (I + did a port against 2.5.68 but it wasn't in any shape to be merged). + + sh64 is already in 2.4 and has been for quite awhile, so this is mostly + just a forward port of that code to 2.6 with appropriate bug fixes, etc. + along the way. There isn't much in the way of new features that have been + added to the port yet, though I have added rough hugetlb and oprofile + support. + + This patch doesn't really touch any common code, with the exception of an + ifdef or two for keyboard support and an ifdef in fb.h to omit sh64 from + the __raw_xxx() wrapping that sh does. + + The only other common driver changes were to sh-sci for serial support, but + those bits were already merged with the latest batch of sh-sci updates. + + Beyond that, the port is completely isolated. + + Signed-off-by: Richard Curnow + Signed-off-by: Paul Mundt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sh64: Fix syscall table alignment + + If the syscall table is in the text section, the movi that loads its + address into a register will at link time have its immediates resolved as + though it's an SHmedia symbol, i.e. the LSB will be 1. This is then + misaligned as a base address for loading the address to jump to. + + This could be fixed either by moving the table back to the .data section + (as done here), or by masking off the LSB after loading the table address + into a register. + + Signed-off-by: Richard Curnow + Signed-off-by: Paul Mundt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] kyrofb: Fix modedb usage when built as a module. + + Since James confirmed that this doesn't need to be module specific, we get + rid of the #ifndef MODULE checks for both the modedb and the modedb lookup. + + Additionally we also switch from memset_io() to fb_memset(). + + Signed-off-by: Paul Mundt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sh/sh64: MAINTAINERS update. + + This updates MAINTAINERS for sh/sh64 to match up with the 2.4 entries. + + I've also removed NIIBE-san as an active sh maintainer, since he hasn't + been involved or submitted any code since 2002/06/26. + + Signed-off-by: Paul Mundt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] cirrusfb: minor fixes + + - fix unbalanced invocation of pci_enable_device(); + + - leaks plugged in cirrusfb_zorro_setup(); + + - move framebuffer_release() into cirrusfb_{pci/zorro}_unmap() to balance + cirrusfb_{pci/zorro}_setup(); + + - make cirrusfb_{pci/zorro}_setup() return adequate error codes when + something fails; + + - cirrusfb_zorro_unmap: iounmap() now take as argument values previously + returned by ioremap(). + + Signed-off-by: Francois Romieu + Signed-off-by: David Eger + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] signed bug in drivers/video/console/fbcon.c con2fb_map[] + + drivers/video/console/fbcon.c:310: warning: comparison is always true due + to limited range of data type + + char can be either signed or unsigned, depending on the target system. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] EDD: store mbr_signature on first 16 int13 devices + + Currently, the x86/x86_64 real-mode kernel setup code reads and stores the + mbr_signature (4 bytes in the MBR at offset 440 decimal) for BIOS int13h + device 80h only. This is useful, but not as useful as if we stored such + signatures for all int13h devices. Think OS installer wanting to set up md + software RAID across several BIOS disks. + + Patch below against 2.6.7 allows the storing of the mbr_signature for the + first 16 BIOS int13h devices, and exports them via + /sys/firmware/edd/int13_dev8x/mbr_signature as before. + + This also merges the three EXPORT_SYMBOLs that setup.c exported for edd.c's + use into one. + + Signed-off-by: Matt Domsch + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Combined patch for remaining trivial sparse warnings in allnoconfig build + + Well, one of these (fs/block_dev.c) is little non-trivial, but i felt + throwing that away would be a shame (and I did add comments ;-). + + Also almost all of these have been submitted earlier through other + channels, but have not been picked up (the only controversial is again the + fs/block_dev.c patch, where Linus felt a better job would be done with + __ffs(), but I could not convince myself that is does the same thing as + original code). + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] dma_get_required_mask() + + This patch implements dma_get_required_mask() which may be used by drivers + to probe the optimal DMA descriptor type they should be implementing on the + platform. + + I've also tested it this time with the sym_2 driver...making it chose the + correct descriptors for the platform. (although I don't have a 64 bit + platform with >4GB memory, so I only confirmed it selects the 32 bit + descriptors all the time...) + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Add m68k support to checkstack + + Add m68k support to checkstack.pl + + Regular expression combination by Andres Schwab + + Signed-off-by: + Signed-off-by: Jörn Engel + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] small fixes to checkstack + + - fix documentation + - use $(src) in Makefile (fixes cross-compilation) + + Both spottet by Geert Uytterhoeven + + Signed-off-by: Jörn Engel + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Add to + + references __user which is defined in . + + Signed-off-by: Tom Rini + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix page->count discrepancy for zero page + + While writing some analysis tools for memory hot-remove, we came across a + single page which had a ->count that always increased, without bound. It + ended up always being the zero page, and it was caused by a leaked + reference in some do_wp_page() code that ends up avoiding PG_reserved + pages. + + Basically what happens is that page_cache_release()/put_page() ignore + PG_reserved pages, while page_cache_get()/get_page() go ahead and take the + reference. So, each time there's a COW fault on the zero-page, you get a + leaked page->count increment. + + It's pretty rare to have a COW fault on anything that's PG_reserved, in + fact, I can't think of anything else that this applies to other than the + zero page. + + In any case, it the bug doesn't cause any real problems, but it is a bit of + an annoyance and is obviously incorrect. We've been running with this + patch for about 3 months now, and haven't run into any problems with it. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Fix Alpha compilation + + When using gcc 3.3.3 on alpha, the current BK head doesn't compile. + + - there's an external declaration for abs() in the same scope as a macro + definition in arch/alpha/time.c + + - The compiler is picky about `const' declarations, which breaks on + bitops.h. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] radeonfb: 16bpp copyarea() fix + + radeonfb: fix 16bpp copyarea() bug + + It turns out the bug was due to my mis-copying a certain set of flags from + the x.org tree. + + Signed-off-by: David Eger + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] kill mm_struct.used_hugetlb + + mm_struct.used_hugetlb used to eliminate costly find_vma() from + follow_page(). Now it is used only in ia64 version of follow_huge_addr(). + I know nothing about ia64, but this REGION_NUMBER() looks simple enough to + kill used_hugetlb. + + There is debug version (commented out) of follow_huge_addr() in i386 which + looks at used_hugetlb, but it can work without this check. + + Signed-off-by: Oleg Nesterov + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + sparse: get rid of more integer/pointer confusion + + Use NULL, not 0, where appropriate. + + + [CRYPTO]: Add TEA and XTEA algorithms. + + The following is a patch against 2.6.7 (should apply cleanly to 2.6.5 or + above). It implements the Tiny Encryption Algorithm (TEA) and the + Xtended TEA (XTEA) algorithms. TEA goes back to 1994 and is a good + algorithm espically for memory constrained systems. It is similar in + concept to the IDEA crypto. It does NOT have any patent restrictions + and has been put in the public domain by Wheeler and Needham. Tea is used + in quite a few products such as filesafe and even Microsoft's Xbox. + + Signed-off-by: Aaron Grothe + Signed-off-by: James Morris + Signed-off-by: David S. Miller + + + [AGPGART] K8T800 Pro support in amd64 driver. + + Signed-off-by: Kris Kersey + Signed-off-by: Dave Jones + + + Driver Core: remove extra space in Kconfig file. + + Signed-off-by: Greg Kroah-Hartman + + + [ARM PATCH] 1947/1: Remove unused async_struct in OMAP pm.h + + Patch from Tony Lindgren + + Removes some dead code as noted by Russell King. + + + [ARM PATCH] 1948/1: Mainstone compile fix + + Patch from Nicolas Pitre + + ... and a comment fix in bonus + + + [ARM PATCH] 1949/1: warning fix + + Patch from Nicolas Pitre + + Missing prototype. + + + JFS: Error path released metadata page it shouldn't have + + Signed-off-by: Dave Kleikamp + + + [NETFILTER]: Fix opt[] to be array of u_int8_t in tcp_find_option(). + + + [IPV4]: Bootp packet extension area is variable length. + + 1) Remove the magic 300 constant + 2) Allow b->exten area to be zero or more + variable bytes in length. + + Signed-off-by: David S. Miller + + + [PATCH] sparse: NULL vs 0 - arch/i386/* + + + [PATCH] sparse: NULL vs 0 - drivers/acpi/* + + + [PATCH] sparse: NULL vs 0 - drivers/char/* + + + [PATCH] sparse: NULL vs 0 - rest of drivers + + + [PATCH] sparse: NULL vs 0 - drivers/usb + + + [PATCH] sparse: NULL vs 0 - filesystems + + + [PATCH] sparse: NULL vs 0 - net/* + + + [PATCH] sparse: NULL vs 0 - sound/* + + + [PATCH] sparse: NULL vs 0 - the rest of it + + + [XFS] Don't dereference buffer after pagebuf_iostrategy() + + SGI Modid: xfs-linux:xfs-kern:174326a + Signed-off-by: Nathan Scott + + + [PATCH] prism54 cleanup functions + + 2004-06-28 Margit Schubert-While + + * Clean up function definitions (missing static, extraneous inline) + + + [PATCH] prism54 missing error check + + 2004-06-28 Margit Schubert-While + + * Missing error check after dev_alloc_skb + + + [PATCH] prism54 fix unlikely + + 2004-06-28 Margit Schubert-While + + * Fix a thinko by me + + + [PATCH] prism54 device list cleanup + + 2004-06-28 Margit Schubert-While + + * Clean up the device table + + + [PATCH] prism54 remove prog reg poke + + 2004-06-28 Margit Schubert-While + + * Don't poke around in the timeout registers + + + [PATCH] prism54 use set_pci_mwi() + + 2004-06-28 Margit Schubert-While + + * Use set_pci_mwi() + + + [PATCH] pcnet32: acknowledge all interrupts early. + + A recent change I made broke pcnet32 in a way that allowed real hardware + to work, but broke VMWare. This patch acknowledges all interrupts early + in the pcnet32_interrupt while loop. Without this patch on real hardware + the first transmit operation would clear the 'init' interrupt, but in + VMWare it would rain interrupts. Keith Moore did more testing for me + on VMWare and I did a better job testing on hardware. Petr Vandrovec + correctly pointed out the source of the problem on lkml. + + This patch is not needed for 2.4.27-rc1 unless my patch labeled + "pcnet32: recover after rx hang" is applied (which it has not). + + signed-off-by: Don Fry + + + [PATCH] pcnet32: Add HomePNA parameter for 79C978. + + This patch adds a module parameter to select HomePNA mode of operation for + the 79C978 version of the pcnet32. Tested ia32 and ppc64. + + signed-off-by: Patrick Simmons + signed-off-by: Don Fry + + + [PATCH] pcnet32: correctly program bcr32. + + The pcnet32 driver was not correctly enabling MII autonegotiation after + booting when ppc firmware forced the speed/duplex mode of the chip. + After several conversations with AMD this patch corrects the problem. + + I have tested this on hardware I have available (ia32 and ppc64) but I + would like wider audience testing of this patch. + + Signed-off-by: Don Fry + + + [PATCH] pcnet32: change to use module_param + + Change the pcnet32 driver to use module_param and module_param_array. + + + [PATCH] net/at1700.c depends on MCA_LEGACY + + From: "Luiz Fernando N. Capitulino" + + drivers/net/at1700.c does not compile without CONFIG_MCA_LEGACY set. + + As CONFIG_MCA_LEGACY depends on CONFIG_MCA, we can use only + CONFIG_MCA_LEGACY, insteed of "MCA && MCA_LEGACY". + + Signed-off-by: Luiz Capitulino + Signed-off-by: Andrew Morton + + + [SPARC64]: Document reserved and soft2 bits in PTE. + + + [PATCH] net/ne2.c needs MCA_LEGACY + + From: "Luiz Fernando N. Capitulino" + + drivers/net/ne2.c does not compile without CONFIG_MCA_LEGACY set. + + As CONFIG_MCA_LEGACY depends on CONFIG_MCA, we can use only + CONFIG_MCA_LEGACY, insteed of "MCA && MCA_LEGACY". + + Signed-off-by: Luiz Capitulino + Signed-off-by: Andrew Morton + + + [PATCH] (1/3) skfp - cleanup is_XXX functions + + This started out from sparse warnings about calling with fddi_broadcast + that is declared const. This fixes that and gets rid of some of the namespace + pollution of this driver by moving the predicate function is_individual, is_broadcast, ... + as inline's in the one file that uses them. + + Signed-off-by: Stephen Hemminger + + + [PATCH] (2/3) skfp -- sparse __user annotation + + Add __user annotation to the device specific ioctl. + + + [PATCH] [sparse] get rid of warnings about #if DEBUG + + Several drivers use '#if DEBUG' which is a warning under the sparse checker. + + Signed-off-by: Stephen Hemminger + + + [PATCH] get rid of __OPTIMIZE__ requirement in net drivers + + Several network drivers have checks that they are only built with -O. + This breaks checking with sparse and other tools, and seems like a holdover from + when drivers were built out of tree and the kernel build system was less stable. + This patch gets rid of these. + + Signed-off-by: Stephen Hemminger + + + [PATCH] PCMCIA net device unplugging ordering fix + + This is a rather old patch which re-orders the teardown of PCMCIA + network devices. Current device drivers remove the IO mappings, + interrupts, and free any PCMCIA windows before they unregister + themselves from the network layer. + + This patch ensures that we first unregister from the network layer + before performing any teardown of resources or windows. + + Note: the only card which has been tested in this patch is pcnet_cs. + + + [PATCH] Patch 1/2 enable smc91x enet driver for use by PPC + + Hi, + + Patch 1 of 2 to enable the smc91x driver to be used by the IBM Redwood5 + and Redwood6 boards. + + Move drivers/net/arm/smc91x.[ch] to drivers/net + + Signed-off-by: Dale Farnsworth + + + [PATCH] Patch 2/2 enable smc91x enet driver for use by PPC + + Hi, + + Patch 2 of 2 to enable the smc91x driver to be used by the IBM Redwood5 + and Redwood6 boards. + + Enable smc91x driver to support IBM Redwood5 and Redwood6 boards + + Signed-off-by: Dale Farnsworth + + + [PATCH] add new fec_8xx network driver + + + [PATCH] skfddi - fix warning + + The conversion to ANSI, caused a warning because the mulitcast code needs + a cast. dmi->dmi_addr is a u8 array, and fddi_addr is just a wrapper around a u8 array. + + Signed-off-by: Stephen Hemminger + + + [PATCH] skfddi - cleanup local and dead functions + + Cleanup the SK Fddi driver a little more. Mark some functions as static, + and eliminate (or comment out) some that are defined but never used. + + Signed-off-by: Stephen Hemminger + + + [netdrvr] add fec_8xx to Makefile + + + [netdrvr] disable certain drivers that are broken on 64-bit + + Disable Toshiba FIR IRDA driver (donauboe) and IBM Lanstreamer + token ring driver on all 64-bit platforms. Add #error to each driver + explaining the problem, causing build of driver to fail when + BITS_PER_LONG == 64. + + + [netdrvr] fix warnings found on 64-bit platforms + + Updated: 8139too, arcnet/arcnet, rrunner + + + [SPARC64]: Reserve a software PTE bit for _PAGE_EXEC. + + Based upon the PAX sparc64 patches. Credit to + PaX Team + + Also, reformat the comments here so the lines fit in + 80 columns. + + Signed-off-by: David S. Miller + + + [SPARC64]: Non-executable page support. + + Based upon the PAX patches. Credit to PaX Team + + + Signed-off-by: David S. Miller + + + [SERIAL] Remove UPF_RESOURCES + + The UPF_RESOURCES flag was added to the serial layer to cater for + the idiosyncrasies of the PCMCIA layer, where the PCMCIA core code + handles the claiming of busy resources. + + However, the PCMCIA core has progressed, and now does not claim busy + resources - IOW, it now behaves just like any other bus driver, + where resources are allocated non-busy and its up to the drivers to + mark their regions busy using request_region / request_mem_region. + + The effect of this is that the UPF_RESOURCES hack in the serial + layer is now redundant, and can now be removed - 8250 devices + should now always use request_region / request_mem_region + unconditionally. + + Signed-off-by: Russell King. + + + [ARM] asm/arch-versatile/uncompress.h does not need linux/kernel.h + + + [PATCH] enable SMP Opterons boot an NX-enabled x86 kernel + + This fixes a corner-case NX bug: the x86 SMP kernel doesnt boot on SMP + Opterons if NX is enabled [and mem=nopentium is specified], due to + kernel-space NX protection preventing the SMP trampoline from being + executable. + + Since the SMP trampoline is a rare case of 'dynamic code' executed by + the kernel (it has to be below 640K so it cannot be part of the kernel + text itself), i've added the necessary infrastructure to enable/disable + executability of specific kernel pages. + + We cannot simply disable NX via the MSR because we've got the NX bits in + the kernel pagetables, which are set up before we do the SMP bootup. + The NX bit in the pagetables is undefined if EFER.NXE is 0, so we cannot + count on NX-capable CPUs not faulting when they encounter them. + + I've tested the x86 kernel on a non-NX SMP x86 box and on an NX UP box, + on which i've also tested a simulated SMP trampoline, it all works fine. + + - add infrastructure to enable/disable executability of kernel pages + + - make the SMP trampoline page executable. + + Signed-off-by: Ingo Molnar + Signed-off-by: Linus Torvalds + + + [PATCH] Can't open CDROM device for writing + + Opening a CDROM device for writing no longer works, because cdrom_open() + returns -EROFS even if cdrom_open_write() succeeds. + + This fixes it. + + Signed-off-by: Peter Osterlund + Signed-off-by: Linus Torvalds + + + [PATCH] zombie with CLONE_THREAD and strace + + 'strace' shows a problem with a missing release_task for self-reaping + clones that have been traced. We need to defer releasing them until the + tracer is done with them, but if the tracer dies, we need to handle that + case gracefully too. + + We do that by having 'forget_original_parent()' generate a list of tasks + to release when this case happens. + + Patch based on discussions on linux-kernel, and suggestions from Roland + McGrath . + + + [PATCH] Fix sound/isa/gus/* compile error without CONFIG_PNP + + + [PATCH] dm: kcopyd.c: Remove unused include + + kcopyd.c: Remove unused #include. + + Signed-off-by: Kevin Corry + Signed-off-by: Linus Torvalds + + + [PATCH] dm: kcopyd.c: make client_add() return void + + kcopyd.c: client_add() can return void instead of an int, which will eliminate + an unnecessary error path in kcopyd_client_create(). + + Signed-off-by: Kevin Corry + Signed-off-by: Linus Torvalds + + + [PATCH] dm: dm-raid1.c: Enforce max of 9 mirrors + + dm-raid1.c: Since kcopyd can currently only handle 1 source and up to 8 + destinations, enforce a max of 9 mirrors when creating a dm-mirror device. + + Signed-off-by: Kevin Corry + Signed-off-by: Linus Torvalds + + + [PATCH] dm: dm-raid1.c: Use fixed-size arrays + + dm-raid1.c: Declare fixed-sized (instead of variable-sized) arrays on the + stack in recover() and do_write(). + + Signed-off-by: Kevin Corry + Signed-off-by: Linus Torvalds + + + [PATCH] dm: Remove 1024 devices limitation + + Remove the limitation of 1024 DM devices. + + Signed-off-by: Kevin Corry + Signed-off-by: Linus Torvalds + + + [TCP]: TCP acts like it is always out of memory. + + Current 2.6.7 tree acts as if it is alway under memory pressure because + a recent change did a s/tcp_memory_pressure/tcp_prot.memory_pressure/. + The problem is tcp_prot.memory_pressure is a pointer, so it is always non-zero! + + Rather than using *tcp_prot.memory_pressure, just go back to looking at + tcp_memory_pressure. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [ARM] Timer fixes for CLPS711x. + + + [PATCH] EDD: x86-64 build fix + + On Wed, Jun 30, 2004 at 01:22:21AM -0400, Jeff Garzik wrote: + > CC arch/x86_64/kernel/setup.o + > arch/x86_64/kernel/setup.c: In function `copy_edd': + > arch/x86_64/kernel/setup.c:415: error: `EDD_MBR_SIGNATURE' undeclared=20 + > (first use in this function) + > arch/x86_64/kernel/setup.c:415: error: (Each undeclared identifier is=20 + > reported only once + > arch/x86_64/kernel/setup.c:415: error: for each function it appears in.) + > arch/x86_64/kernel/setup.c:417: error: `EDD_MBR_SIG_NR' undeclared=20 + > (first use in this function) + > make[1]: *** [arch/x86_64/kernel/setup.o] Error 1 + > make: *** [arch/x86_64/kernel] Error 2 + + Arrgh. On i386 it's in include/asm-i386/setup.h On x86_64 it + belongs in include/asm-x86_64/bootsetup.h. + + Patch below defines EDD_MBR_SIG_NR and EDD_MBR_SIGNATURE on x86_64. + + Signed-off-by: Matt_Domsch + + + NTFS: Add a set_page_dirty address space operation for ntfs_m[fs]t_aops. + It is simply set to __set_page_dirty_nobuffers() to make sure that + running set_page_dirty() on a page containing mft/ntfs records will + not affect the dirty state of the page buffers. + + Signed-off-by: Anton Altaparmakov + + + NTFS: Add fs/ntfs/index.c::__ntfs_index_entry_mark_dirty() which sets all + buffers that are inside the ntfs record in the page dirty after which + it sets the page dirty. This allows ->writepage to only write the + dirty index records rather than having to write all the records in + the page. Modify fs/ntfs/index.h::ntfs_index_entry_mark_dirty() to + use this rather than __set_page_dirty_nobuffers(). + + Signed-off-by: Anton Altaparmakov + + + NTFS: Update __ntfs_index_entry_mark_dirty() so it makes sure that the + page has buffers. Otherwise we could end up with a dirty page + without buffers and our set_page_dirty() would not mark the buffers + dirty when they are created and thus they would not be written out + and the dirty records would be lost. + + Signed-off-by: Anton Altaparmakov + + + NTFS: 2.1.15 - Implement fs/ntfs/aops.c::ntfs_write_mst_block() which + enables the writing of page cache pages belonging to mst protected + attributes like the index allocation attribute in directory indices + and other indices like $Quota/$Q, etc. This means that the quota is + now marked out of date on all volumes rather than only on ones where + the quota defaults entry is in the index root attribute of the + $Quota/$Q index. + + Signed-off-by: Anton Altaparmakov + + + [PATCH] err2-14: skge locking fix + + It can return with the lock held. + + Found by the Stanford locking checker. + + Signed-off-by: Andrew Morton + + + [PATCH] [Bug 2948] New: Atmel wireless driver Oopses + + + [TG3]: Fibre PHY fixes from Sun. + + - Support HW autoneg on 5704. + - On serdes, no MII reg ioctl support. + + + [TG3]: Update driver version and reldate. + + + [PATCH] ppc64: remove RTAS arguments from PACA + + This patch removes the RTAS arguments structure on ppc64 from the PACA. + The args have to be in the RMO, but since we have a global spinlock for + RTAS anyway, there's no reason to have a separate copy of the args per-CPU. + This patch replaces the PACA field with a single instance in the global + rtas structure. + + The one exception is for the rtas_stop_self() call, which can't take the + lock, because it never returns. But it has a fixed set of arguments, so we + can use another global instance which is initialized at boot. + + This lets us remove rtas.h from paca.h, which substantially reduces overall + #include hairiness (because paca.h is now, as it wants to be, a nice + low-level structure-defining header which relies on very little and can + safely be included almost anywhere). Although it does add some noise to + the patch, because a bunch of places relied on the indirect inclusion of + rtas.h, or even more indirect inclusions (see the hunks applying to eeh.h + and current.h!). + + Cc: Paul Mackerras + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: PACA cleanup + + Cleanup the PPC64 PACA structure. It was previously a big mess of + unecessary fields, overengineered cache layout and uninformative comments. + This is essentially a rewrite of include/asm-pp64/paca.h with associated + changes elsewhere. The patch: + + - Removes unused PACA fields + + - Removes uneeded #includes + + - Uses gcc attributes instead of explicit padding to get the desired + cacheline layout, also rethinks the layout and comments accordingly. + + - Better comments where asm or firmware dependencies apply non-obvious + layout constraints. + + - Splits up the pointless STAB structure, letting us move its elements + independently. + + - Uses offsetof instead of hardcoded offset in spinlocks. + + - Eradicates xStudlyCaps identifiers + + - Replaces PACA guard page with an explicitly defined emergency stack + (removing more than NR_CPUS pages from the initialized data segment). + + Cc: Paul Mackerras + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: janitor log_rtas_error() call arguments + + This patch from Linas Vepstas (rediffed by me) fixes the confusing argument + aliasing of the log_rtas_error() subroutine. + + This patch makes no functional changes, it just cleans up some strange + usage. + + The rtas_args used to communicate with firmware are always taken from the + paca struct, so as to keep the args at a fixed, low-memory location. But + the log_rtas_error() routine also took an rtas_args pointer, which it + assumed was aliased to the paca struct. This aliasing is both + un-neccessary, and confusing; this patch eliminates this confusion. + + Signed-off-by: Linas Vepstas + Signed-off-by: Paul Mackerras + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: Janitor rtas_call() return variables + + Recently I changed the return value of rtas_call() from an unsigned long to + an int. That patch missed a few places where we declare a variable to + store the result from rtas_call(). This new patch changes those places to + use an int variable instead of a long or unsigned long variable. Linas + Vepstas pointed this out. + + Signed-off-by: Paul Mackerras + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32: OCP for MP10x + + Attached is the latest version of Adrian Cox's OCP patch for + MPC107/8240/8245. This unifies some openpic setup code, and ensures that + the OCP devices are only added to the bus on chip variants which have them. + + All interested parties seem happy, and this patch is necessary to provide a + unified I2C driver for 85xx and 107/824x. + + Signed-off-by: Adrian Cox + Signed-off-by: Tom Rini + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32: PPC44x defconfig update and fixes + + Update PPC44x defconfigs and some fixes. + + Signed-off-by: Matt Porter + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32: PPC4xx preempt fix + + PPC4xx preempt fixes. Based on previous Classic PPC patch. + + Signed-off-by: Tom Rini + Signed-off-by: Matt Porter + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32: Fix dual UICs in 4xx PIC support + + Fixes a case where we were not correctly acking the base cascade controller + on PPC4xx. Patch from Pavel Bartusek + + Signed-off-by: Matt Porter + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] swsusp: preparation for smp support & fix device suspending + + It fixes levels for calling driver model, puts devices into sleep before + powering down (so that emergency parking does not happen), and actually + introduces SMP support, but its disabled for now. Plus noone should try to + freeze_processes() when thats not implemented, we now BUG()s -- we do not + want Heisenbugs. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] produce a warning on unchecked inode_setattr use + + The patch below uses the new-in-gcc-3.4 option to generate a warning on + unchecked results of marked functions, and applies this to the + inode_setattr function (which based on recent bk commits HAS to be checked + for it's return value for correct operation). A warning looks like this: + + fs/ext2/inode.c:1279: warning: ignoring return value of 'inode_setattr', declared with attribute warn_unused_result + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Bugfix for CLOCK_REALTIME absolute timer + + As required by the standard, this patch adds to POSIX ABSOLUTE timers the + functionality of adjusting the timer when the clock is set so that it still + expires at the specified time (provided that time has not passed, in which + case the timer expires immeadiatly). + + The standard is, IMNSOHO, a bit vague on just how repeating timers are to + be handled so I made some choices: + + 1) If an absolute timer is to expire every N intervals, we assume that + the expiries should happen at those specified times after clock setting. + I.e. we adjust the repeat timer as well as the initial timer. (The + other option would be to treat the repeating timers as relative and not + to adjust them.) + + 2) If a clock set moves the the clock prior to the initial expiry time + AND that time has already passed and been signaled, the current repeat + timer is adjusted, i.e. we DO NOT go back to the initial time and + repeat that. (The other option is to treat this case as a new request + with the initial timer parameters (which by this time we have lost).) + + 3) If time is advanced such that it appears that several expiries have + been missed, the overrun count will reflect the misses. (The other + option is to not reflect this in the overrun.) At the same time, nothing + is done to acknowledge, to the user, that we are repeating expiries when + the clock is retarded. + + Signed-off-by: George Anzinger + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sparse: define max kernel symbol length and clean up errors in kernel/kallsyms.c + + CHECK kernel/kallsyms.c + kernel/kallsyms.c:136:7: warning: bad constant expression + kernel/kallsyms.c:136:7: warning: bad constant expression + kernel/kallsyms.c:136:7: warning: bad constant expression + kernel/kallsyms.c:143:22: warning: bad constant expression + kernel/kallsyms.c:143:22: warning: bad constant expression + kernel/kallsyms.c:143:22: warning: bad constant expression + + Now the cause of sparse warnings is that it does not handle runtime array + dimensioning (which I take it is a sparse problem), but in this particular + case it _might_ make sense to change the runtime allocation to compile + time, as the upper size of the array is known, because the code in + kernel/kallsyms.c clearly uses 127 (or 128) as "magic constant" for kernel + symbol (array) length, and in the other hand in include/linux/module.h + there is: #define MODULE_NAME_LEN (64 - sizeof(unsigned long)) + + The only concern is that the array become quite big (the original comment + of it being "pretty small" no longer applies ...). One way to help that + would be to use buffer[] also in place of namebuf[], but that would be + little tricky as the format string should be before the symbol name ... + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sparse: fix sparse warnings in kernel/power/* + + CHECK kernel/power/swsusp.c + kernel/power/swsusp.c:320:15: warning: expected lvalue for member dereference + kernel/power/swsusp.c:337:15: warning: expected lvalue for member dereference + kernel/power/swsusp.c:359:14: warning: expected lvalue for member dereference + kernel/power/swsusp.c:925:12: warning: assignment expression in conditional + [...] + CHECK kernel/power/pmdisk.c + kernel/power/pmdisk.c:795:12: warning: assignment expression in conditional + + Trivial sparse fixes for two files under kernel/power. Patch attached. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sparse: fix sparse in drivers/pnp/pnpbios/* + + CHECK drivers/pnp/pnpbios/core.c + include/linux/pnpbios.h:144:5: warning: undefined preprocessor identifier 'needed' + CC drivers/pnp/pnpbios/core.o + CHECK drivers/pnp/pnpbios/bioscalls.c + include/linux/pnpbios.h:144:5: warning: undefined preprocessor identifier 'needed' + drivers/pnp/pnpbios/bioscalls.c:346:5: warning: undefined preprocessor identifier 'needed' + drivers/pnp/pnpbios/bioscalls.c:361:5: warning: undefined preprocessor identifier 'needed' + drivers/pnp/pnpbios/bioscalls.c:388:5: warning: undefined preprocessor identifier 'needed' + drivers/pnp/pnpbios/bioscalls.c:427:5: warning: undefined preprocessor identifier 'needed' + drivers/pnp/pnpbios/bioscalls.c:509:5: warning: undefined preprocessor identifier 'needed' + CC drivers/pnp/pnpbios/bioscalls.o + CHECK drivers/pnp/pnpbios/rsparser.c + include/linux/pnpbios.h:144:5: warning: undefined preprocessor identifier 'needed' + CC drivers/pnp/pnpbios/rsparser.o + CHECK drivers/pnp/pnpbios/proc.c + include/linux/pnpbios.h:144:5: warning: undefined preprocessor identifier 'needed' + + The fix is trivial, sparse wants the preprocessor symbol to be defined + before use. There was a similar fix accepted by Linus couple weeks ago. + Patch attached. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] convert private ABS() to kernel's abs() + + Convert private ABS() defines and callers to use abs() from linux/kernel.h. + Builds successfully. stv0299, riva, & sstfb modules load. + + Signed-off-by: Randy Dunlap + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Rivafb fixes + + The patch below fixes the following to rivafb: + + 1 Seems that nVidia hardware has a limit on clipping coordinates that is + also dependent on the color depth of the framebuffer. + + 2.From Pawel Goleniowski : Fix for wrong colors at 16bpp + (RGB565). The fix has been submitted several times in lkml and this list + but was never applied. + + 3 Search all I2C/DDC busses for the EDID block instead of just the first + bus. + + 4 Updated request_mem_region/release_mem_region to + pci_request_regions/pci_release_regions. + + Signed-off-by: Antonino Daplas + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Mode Switch in fbcon_blank() + + As we've discussed in another thread, below is a diff that will do a set_par() + as late as possible when there is KD_TEXT<->KD_GRAPHICS switch. The set_par() + will be forced in fbcon_resize() instead. + + Not sure if this has repercussions with the other drivers, but this patch + fixed the X nv driver hanging when switching to the console. (I believe the + crash is actually caused by an early set_par() -- while in fbcon_blank. + Removing the set_par in fbcon_blank fixed the hang but caused cursor sprite + and display corruption). + + Signed-off-by: Antonino Daplas + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Another batch of fbcon fixes + + - Update display->vrows when fbset changes certain fields in var (such as + color depth) but without changing the display resolution. This might + produce concommitant changes in other fields such as and especially + var->yres_virtual. + + - Clear the FBINFO_MISC_MODECHANGEUSER flag _before_ issuing a + notifier_call_chain(). Clearing it after the notifier_call_chain() will + cause fbcon to go into an infinite loop. + + - Sanitized failure path of set_con2fb_map(). + + Signed-off-by: Antonino Daplas + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] pcdp.c needs io.h + + Include for ioremap() declaration. + + Signed-off-by: Bjorn Helgaas + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] es7000 subarch update for target_cpus() + + This is ES7000 sub arch update. The tiny patch below fixes a bug that + results in boot problem on all ES7000 partitions with numbers higher than + 0. Currently, target_cpus() returns incorrect cpumask value since it + indexes bits by the logical APIC ID, not by CPU number. The patch affects + only ES7000 sub arch. It was tested extensively on the system with + multiple partitions. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] asiliantfb fix + + The init function is writing somewhere using a physical address instead of + a virtual address. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] 64 bit bug in radix-tree lookup. + + The radix tree functions __lookup and __lookup_tag uses (1 << shift) in + their index calculations. On 64 bit systems the shift can be bigger than + 32. The shift of an integer by more than 32 bits evaluates to zero which + causes the lookup to fail. + + Signed-off-by: Martin Schwidefsky + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] s390: core changes + + From: Arnd Bergmann + From: Christian Bornträger + From: Michael Holzheu + From: Martin Schwidefsky + + s390 core changes: + - Fix cpu_idle loop if /proc/sys/kernel/hz_timer is set. + - Store correct trap indication on 64 bit for call to do_debugger_trap + in the single stepped svc code. + - Avoid the use of alloca in the debug feature. + - Remove extraneous includes of linux/version.h. + - Regenerate default configuration. + - Mention eServer z890 in Kconfig help text. + - Prevent gcc 3.4 from removing statically defined per cpu variables. + + Signed-off-by: Martin Schwidefsky + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] s390: comon i/o layer + + From: Utz Bacher + From: Cornelia Huck + + Common i/o layer changes: + - Consolidate store channel subsystem characteristics from its three + users (css, cmf and qdio) to a single location. + - Always use new stipd format and move creation of global path group + to channel subsystem init function. Add dummy init_IRQ to setup.c + and remove requestirq.c. + - Remove bogus CHPID_LONGS define. + - Add more magic to catch chpids coming online again without generating + machine checks. + - Fix check for unsolicited interrupts. Deferred cc=1 indicates a + solicited interrupt. + - Fix progress indication in qdio summary bytes to avoid loosing interrupts. + - Rename console_device to console_devno to avoid naming conflict. + + Signed-off-by: Martin Schwidefsky + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] s390: dasd driver changes + + From: Horst Hummel + From: Carsten Otte + From: Stefan Weinhuber + + dasd device driver changes: + - Fix calculation of number of idal words needed for a channel program. + - Fix race in i/o termination after request timeout. + - Fix race in state change interrupt handling. + - Fix call to BLKPG ioctl in dasd_destroy_partitions. + - Integrate irb into dasd request to avoid kmalloc in the interrupt handler. + - Store build clock for error recovery requests. + - Remove unused cpu variable from dasd_ext_handler. + + Signed-off-by: Martin Schwidefsky + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] s390: sclp console driver + + From: Peter Oberparleiter + + sclp console driver changes: + - Correct handling of busy and not operational states. + + Signed-off-by: Martin Schwidefsky + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] s390: network driver changes + + From: Ursula Braun-Krahl + From: Frank Pavlic + From: Thomas Spatzier + From: Peter Tiedemann + + s390 network driver changes: + - ctc: replace snprintf by strlcpy. + - lcs: change info text for lcs cards from "OSA2 card" to "OSA LCS card". + - lcs: fix alignment of lcs_cmd structure to get multicast pings working. + - lcs: first call in_dev_put then register multicast addresses. + - netiucv: remove unused device timer and unused flags field. + - netiucv: include interrupt type in pathid mismatch message. + - qeth: don't start a new kernel thread for every new ip address. + - qeth: fix IP assist command sequence numbers. + + Signed-off-by: Martin Schwidefsky + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] s390: zfcp host adapter + + From: Heiko Carstens + From: Andreas Herrmann + From: Maxim Shchetynin + + zfcp host adapter changes: + - Exploit FC transport class and autoselect SCSI_FC_ATTRS for zfcp. + - Fix acl download to zfcp controller. + - Change message loglevels to make zfcp less noisy. + - Don't wait for SBAL to finish for command aborts after a timeout + and for logical unit or target resets. + - Force reopen of port if link test failed. + - Fix race between qdio_shutdown and do_QDIO. + + Signed-off-by: Martin Schwidefsky + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Telephony Driver ISAPNP fix + + I recently got an ISA Phonejack card and quickly found it wouldn't work + with a stock 2.6.7 kernel. + + So found this bug in the ISAPNP part of the code, throughout the code it + use it's own data structure to reference it's base IO address, in the + ISAPNP code this was not being populated with any value hence it can't talk + to the card and so the driver fails. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] mips: kconfig spelling fixes + + Signed-off-by: Ralf Baechle + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] mips: update config symbols + + CONFIG_DECSTATION is now CONFIG_MACH_DECSTATION ... + + Signed-off-by: Ralf Baechle + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] mips: MIPS updates + + - Remove support for NEC Eagle which is a system that was produced in + almost zero numbers. + - Sort out the MV-64340 code a little more. + - Fix computation of interrupts masks for the upper 32 interrupts of the + MV-64340. + - Gas was producing bad break codes for MIPS32/MIPS64 processors for a while. + Add a workaround to the kernel trap handler. + - Rewrite RM7000 cache code in a way where it's hopefully easier to read. + - Handle 64-bit pointers right for the BCM1250. + - Try to share code for GT-64240 and MV-64340. + - Fix RM9000 definition of _CACHE_CACHABLE_NONCOHERENT. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] mips: MAINTAINERS updates + + Update my email address. Add Manish Lachwani as maintainer for the MV-64340 + driver which has already been accepted by Jeff Garzik. + + Signed-off-by: Ralf Baechle + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] mips: MIPS needs a 32-bit ioaddr_t + + Signed-off-by: Ralf Baechle + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] mips: delete IRIX emul misc minors + + Remove the last leftovers of the compatibility code for running the IRIX X + server. + + Signed-off-by: Ralf Baechle + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] vm86: set IOPL to 3 on pushf + + The attached patch fixes the pushf under v86 to always set the IOPL field + to 3, as the Intel CPUs do. + + It was in 2.4 for year, but somehow missed 2.6. It comes from here + (although now a bit shorter): + + http://lkml.org/lkml/2003/5/25/81 + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Remaining sparse warnings in allnoconfig + + Attached is a smallish patch for couple trivial sparse warnings in + allnoconfig build and more importantly an "excuses" text file explaining + why the rest have not been fixed. + + Basically all of them (with the exception of the one in Andrews tree) need + some serious re-engineering. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] [err1-10] journal_extend() locking fix + + From the new Stanford locking checker + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] [err1-25] snd_ctl_read() locking fix + + From the new Stanford locking checker + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sonypi driver update (PM and DMI VGN-) + + This updates the sonypi driver by: + * fixing the power management handling, using the new device + model PM scheme. + + * adds "VGN-" as a DMI search pattern for a Sony Vaio laptop. + + Florian Lohoff reported the power management issue and tested the + patch. + + Many users reported the DMI name issue, including Till Busch who + made a patch for dmi_scan.c. + + Signed-off-by: Stelian Pop + Signed-off-by: Linus Torvalds + + + [PATCH] meye driver update (wait_ms -> msleep) + + This patch, originally from Daniel Drake, replaces the meye driver + 'wait_ms()' function with calls to the kernel provided 'msleep()' + function. + + Signed-off-by: Daniel Drake + Signed-off-by: Stelian Pop + Signed-off-by: Linus Torvalds + + + [PATCH] i386 nx prefetch fix & cleanups + + - fix possible prefetch-fault loop on NX page, based on suggestions + from Jamie Lokier. + + - clean up nx feature dependencies + + - simplify detection of NX-violations when the kernel executes code + + - introduce pte_exec_kern() to simplify the NX logic + + - split the definitions out of pgtable-[23]level.h into + pgtable-[23]level-defs.h, to enable the former to use generic + pte functions from pgtable.h. + + Signed-off-by: Ingo Molnar + Signed-off-by: Linus Torvalds + + + [PATCH] PCI: export pci_scan_child_bus for the pci hotplug drivers to use + + Signed-off-by: Linda Xie lxie@us.ibm.com + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] PCI: Add some PCI Express constants to pci.h + + This patch adds some PCI Express register constants to + + For my device, setting the Max_Read_Request_Size value in the PCI + Express device control register makes a huge performance difference. + I wanted my driver code that does this to be a little more + self-documenting than: + + pci_read_config_word(mdev->pdev, cap + 8, &val); + val = (val & ~(5 << 12)) | (5 << 12); + + I went a little overboard and added all the basic device register + fields. If desired I could go even further overboard and add the + link, slot and root registers as well. + + This patch is based on Matthew Wilcox's patch for pciutils, corrected + for some PCI Express spec 1.0a changes. + + Signed-off-by: Roland Dreier + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] PCI Hotplug: rpaphp null pointer deref + + This patch fixes a null-pointer dereference when hot-plug operations + are performed on a machine that has virtual-io devices in it. + Virtual i/o devices to not have pci bridges associated with them. + It also corrects an ordering problem during hotplug remove. + + This patch was previously reviewed/tested by Linda Xie, the current + rpaphp maintainer. + + Signed-off-by: Linas Vepstas + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] PCI Hotplug: RPAPHP structure size/performance + + Please review and apply the following patch if you find it agreeable. + + This patch does not make any functional changes, but does improve + both performance and memory usage by rearranging structure elements. + + The need for these changes became appearent during a code review of + the disassembly involving this structure. The memory footprint of this + structure is made smaller by grouping the byte fields next to each other. + The access of the list_head can be simplified by making it the first element + of the structure, thus avoiding a needless add-immediate without negatively + impacting any of the other accesses. + + Signed-off-by: Linas Vepstas + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] PCI: New PCI vendor/device ID for Radisys ENP-2611 board + + Included is a patch for linux to add a PCI vendor/device ID for the + Radisys ENP-2611 board. The ENP-2611 is a 64bit/66MHz PCI board which + hosts an Intel IXP2400 network processor, has three GigE interfaces, + runs linux and generally kicks ass. + + (see http://www.radisys.com/oem_products/ds-page.cfm?productdatasheetsid=1147) + + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] check attr updates in /proc + + Any proc entry with default proc_file_inode_operations allow unauthorized + attribute updates. This is very dangerous for proc entries that rely + solely on file permissions for open/read/write. + + Signed-off-by: Chris Wright + Signed-off-by: Linus Torvalds + + + [PATCH] sparse: remaining integer zero / NULL fixes in allmodconfig & vmlinux + + This fixes the the remaining 0 to NULL things that were found with 'make + allmodconfig' and 'make C=1 vmlinux'. + + + [PATCH] fat/inode.c + + Two years ago, OGAWA Hirofumi removed some ugly code and + added a few simple tests to the FAT filesystem code, + intended to avoid recognizing non-FAT as FAT (for people who + fail to specify rootfstype=, forcing the kernel to guess). + + That worked fairly well, until this year. + + I have now seen a thread in Czech and a report from Holland that + involved the "FAT: bogus sectors-per-track value" error message. + + The patch below removes this test again. The advantage is that + some real-life FAT filesystems can be mounted again. + + The disadvantage that more non-FAT fss will be accepted as FAT. + + Ferry van Steen reports "the patch Andries + Brouwer gave me seems to work". + + Signed-off-by: Andries Brouwer + Signed-off-by: Linus Torvalds + + + logo/logo.c needs for NULL + + It's one of the rare files that has almost no includes + what-so-ever, so it actually never got NULL any other + way. + + + [PATCH] chown permission check fix for ATTR_GID + + SuSE discovered this problem with chown and ATTR_GID. Make sure user + is authorized to change the group, CAN-2004-0497. + + + [libata] add ->qc_issue hook + + This hook is used when an ATA controller wishes to use + hardware-specific methods of taskfile delivery, rather + than the standard method of bitbanging the ATA shadow + registers. + + + [libata] add ata_queued_cmd completion hook + + + [PATCH] natsemi 1: switch to netdev_priv() + + + [PATCH] natsemi 2: support packets > 1518 bytes + + + [PATCH] Gigabit Ethernet support for forcedeth + + - Lots of updates for the gigabit ethernet nic: New ring entry format, + support for RGMII phys, new pci ids. + - Silence interrupt source 0x01: it's rx error, no need to ask the end + user to report it. + - add support for vlan packets: The NvRegOffloadConfig register contains + the maximum packet size, it was set to 1518 which caused vlan to fail. + - fix bit flags for mii access: the wrong bit was polled and the mii + write implementation was just broken. + - Do not stop the rx/tx engines around mii accesses. + - reset and reinit the phy during probe. + + + [libata sata_sil] add drive to mod15write quirk list + + + [PATCH] ntfs build fix + + gcc-2.95 chokes on this. + + Cc: Anton Altaparmakov + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: remove deprecated firmware API + + From: Linas Vepstas + + This patch eliminates the usage of the deprecated ibm,fw-phb-id token for + idnetifying PCI bus heads in favor of the documented, offically supported + mechanism for obtaining this info. Please note that some versions of + firmware may return incorrect values for the ibm,fw-phb-id token. + + Signed-off-by: Linas Vepstas + Signed-off-by: Paul Mackerras + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: set ppc_md.log_error + + We have a platform-specific function pointer on ppc64 for a function to log + errors detected by the platform, but it was never getting set. This patch + sets it on pSeries (the only ppc64 platform which has an error logging + function). + + Signed-off-by: Paul Mackerras + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32: Redwood[56] support for smc91x Ethernet driver + + This patch enables the Redwood 5 and Redwood 6 platforms to use the smc91x + ethernet driver. + + Signed-off-by: Dale Farnsworth + Signed-off-by: Matt Porter + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ia32 NUMA: physnode_map entries can be negative + + Based on work from Bill Irwin + + physnode_map[] needs to be signed so that pfn_to_nid() can return negative + values used to detect invalid pfn's. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Fix minor quota race + + It fixes a possible race between quotaoff and prune_icache. The race could + lead to some forgotten pointers to quotas in inodes leading later to BUG + when invalidating quota structures. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] i386 math emu build fix + + rmk's patch found a defined-but-unimplemented symbol + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] remove unused variable in esp.c + + Signed-off-by: Adrian Bunk + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] remove unused variable in mxser.c + + Signed-off-by: Adrian Bunk + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fbcon: optimization for accel_putcs() + + I did some simple benchmarking (time cat linux-2.6.7-mm5/MAINTAINERS) + between 2.4 and 2.6 and I am not satisfied with what I see (It's claimed + that fbdev-2.6 is faster than 2.4). The reason for the claim: + + 2.4 putcs - draw small amounts of data a lot of times + 2.6 putcs - draw larger amounts of data a fewer times + + The way characters are drawn in 2.6 is optimal for accelerated drivers but + should also give a speed boost for drivers that rely on software drawing. + However the penaly incurred when preparing a large bitmap from a number of + small bitmaps is currently very high. This is because of the following + reasons: + + 1 fb_move_buf_{aligned|unaligned} uses pixmap->{out|in}buf. This is very + expensive since outbuf and inbuf methods process only a byte or 2 of data + at a time. + + 2 fb_sys_outbuf (the default method for pixmap->outbuf) uses memcpy(). + Not a good choice if moving only a few bytes. + + 3 fb_move_buf_unaligned (used for fonts such as 12x22) also involves a + lot of bit operations + a lot of calls to outbuf/inbuf which + proportionately increases the penaly. + + So, I thought of separating fb_move_buf_* to fb_iomove_buf_* and + fb_sysmove_buf_*. + + fb_iomove_buf_* - used if drivers specified outbuf and inbuf methods + fb_sysmove_buf_* - used if drivers have no outbuf or inbuf methods + + *Most, if not all drivers fall in the second category. + + Below is a table that show differences between 2.4, 2.6 and 2.6 + + abovementioned changes. To reduce the effect of panning and + fillrect/copyarea, the scrollmode is forced to redraw. + + ================================================================= + Test Hardware: P4 2G nVidia GeForce2 MX 64 + Scrollmode: redraw + + time cat linux-2.6.7-mm5/MAINTAINERS + + 1024x768-8 1024x768-16 1024x768-32 + ================================================================= + 8x16 noaccel (2.4) + real 0m5.490s real 0m8.535s real 0m15.388s + user 0m0.001s user 0m0.000s user 0m0.001s + sys 0m5.487s sys 0m8.535s sys 0m15.386s + + 8x16 noaccel (2.6) + real 0m5.166s real 0m7.195s real 0m12.177s + user 0m0.001s user 0m0.000s user 0m0.000s + sys 0m5.164s sys 0m7.192s sys 0m12.176s + + 8x16 noaccel+patch (2.6) + real 0m3.474s real 0m5.496s real 0m10.460s + user 0m0.001s user 0m0.001s user 0m0.001s + sys 0m5.492s sys 0m5.492s sys 0m10.454s + ================================================================= + 8x16 accel (2.4) + real 0m4.368s real 0m9.420s real 0m22.415s + user 0m0.001s user 0m0.001s user 0m0.001s + sys 0m4.019s sys 0m9.384s sys 0m22.312s + + 8x16 accel (2.6) + real 0m4.296s real 0m4.339s real 0m4.391s + user 0m0.001s user 0m0.001s user 0m0.000s + sys 0m4.280s sys 0m4.336s sys 0m4.389s + + 8x16 accel+patch (2.6) + real 0m2.536s real 0m2.649s real 0m2.799s + user 0m0.000s user 0m0.000s user 0m0.001s + sys 0m2.536s sys 0m2.645s sys 0m2.798s + ================================================================= + + 1024x768-8 1024x768-16 1024x768-32 + ================================================================= + 12x22 noaccel (2.4) + real 0m7.883s real 0m12.175s real 0m21.134s + user 0m0.000s user 0m0.000s user 0m0.001s + sys 0m7.882s sys 0m12.174s sys 0m21.129s + + 12x22 noaccel (2.6) + real 0m10.651s real 0m13.550s real 0m21.009s + user 0m0.001s user 0m0.001s user 0m0.000s + sys 0m10.617s sys 0m13.545s sys 0m21.008s + + 12x22 noaccel+patch (2.6) + real 0m4.794s real 0m7.718s real 0m15.173s + user 0m0.002s user 0m0.001s user 0m0.000s + sys 0m4.792s sys 0m7.715s sys 0m15.170s + ================================================================= + 12x22 accel (2.4) + real 0m3.971s real 0m9.030s real 0m21.711s + user 0m0.000s user 0m0.000s user 0m0.000s + sys 0m3.950s sys 0m8.983s sys 0m21.602s + + 12x22 accel (2.6) + real 0m9.392s real 0m9.486s real 0m9.508s + user 0m0.000s user 0m0.000s user 0m0.001s + sys 0m9.392s sys 0m9.484s sys 0m9.484s + + 12x22 accel+patch (2.6) + real 0m3.570s real 0m3.603s real 0m3.848s + user 0m0.001s user 0m0.000s user 0m0.000s + sys 0m3.567s sys 0m3.600s sys 0m3.844s + ================================================================= + + + Summary: + + 1 2.6 unaccelerated is a bit faster than 2.4 when handling 8x16 fonts, + with a higher speed differential at high color depths. + + 2 2.4 unaccelerated is a bit faster than 2.6 when handling 12x22 fonts, + with a smaller speed difference at high color depths (2.6 is actually a + bit faster than 2.4 at 32bpp). + + 3 2.4 rivafb accelerated suffers at high color depths, even becoming + slower than unaccelerated, possibly because of the 'draw few bytes many + times' method. + + 4 2.6 rivafb accelerated has similar performance at any color depth, + possibly because of 'draw lots of bytes a fewer times' method. + + 5 With the changes, there is a speed gain of ~1.7 seconds and ~5.7 + seconds with 8x16 and 12x22 fonts respectively indepependent of the color + depth or acceleration used. The speed gain is constant but significant. + + Below is a patch against 2.6.7-mm5. The effects will be very noticeable + with drivers that uses SCROLL_REDRAW, but one should still see some speed + gain even if SCROLL_YPAN/YWRAP is used. + + + Separated fb_sys_move_* into fb_iosys_move_* and fb_sysmove_* to reduce + penalty when constructing fb_image->data from character maps. In my + testcase (1024x768 SCROLL_REDRAW), I get a ~1.7 second advantage with 'time + cat MAINTAINERS' using 8x16 fonts and ~5.7 seconds with 12x22 fonts. The + speed gain is independent of acceleration or color depth. + + Signed-off-by: Antonino Daplas + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] err1-40: sysvfs locking fix + + Found by the new Stanford locking checker. + + Minimal fix for a deadlock in sysvfs: get_branch() can take + read_lock(&pointers_lock), but one caller already has a write_lock. + + Perhaps some of the "oh we raced, drop everything and try again" logic in + there can go away now, but this is enugh to fix the obvious deadlock. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] err1-2: sscape locking fix + + Fix deadlock identified by the Stanford locking checker. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] err1-14: sb_audio locking fix + + Lamely fix a straightforward deadlock in sb_audio.c. Founf by the Stanford + locking checker. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] err2-1 dvb_register_i2c_device locking fix + + Fix deadlock identified by the Stanford locking checker. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] err2-25: dvb_register_i2c_bus() locking fix + + Found by the Stanford locking checker. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] err2-27: i2o_claim_device() locking fix + + Found by the Stanford locking checker + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] err2-29: ufs_new_fragments() locking fix + + Found by the Stanford locking checker + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] dma_get_required_mask() build fix + + This new function fails to build on sparc64 due to nasty include + dependencies. + + Fix that by uninlining it - it was too big for inlining anyway. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] telephony: support devfs + + Add devfs support to telephony devices. Only tested with a single + telephony device. Devices name phone/. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] s/2.5/2.6/ in MAINTAINERS + + s/2.5/2.6/ in MAINTAINERS + + Signed-off-by: Adrian Bunk + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] apm.c warning fix + + arch/i386/kernel/apm.c: In function `suspend': + arch/i386/kernel/apm.c:1221: warning: implicit declaration of function `save_processor_state' + arch/i386/kernel/apm.c:1223: warning: implicit declaration of function `restore_processor_state' + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [libata] create, and use, ->irq_clear hook + + This is more conservative in general, and so applies to multiple + controllers. Specifically it attempts to address irq-related issues + on the Intel ICH5/6 hardware. On Intel ICH5/6, the BMDMA 'interrupt' + status bit will be set even on non-DMA commands, which software + (and I) did not expect. + + This change clears pending interrupts once upon initialization, + and then each time ata_irq_on() is called. + + + [ata] add ata_ok() inlined helper, and ATA_{DRDY,DF} bit to linux/ata.h + + + [libata] split ATA_QCFLAG_SG into ATA_QCFLAG_{SG,SINGLE} + + In part of the effort to remove SCSI specifics from the libata + internals, remove references to cmd->use_sg. cmd->use_sg + becomes ATA_QCFLAG_SG, and !cmd->use_sg becomes ATA_QCFLAG_SINGLE. + + Convenience constant ATA_QCFLAG_DMAMAP is created when the programmer + wishes to refer collectively to ATA_QCFLAG_{SG,SINGLE}. + + + [libata] create, and use aga_sg_init[_one] helpers + + Move more SCSI-specific code out of libata core. + + + [libata sata_promise] update driver to use new ->qc_issue hook + + The ->qc_issue hook was designed to allow drivers to override some + or all of the actual delivery of the taskfile to hardware. + + In the case of Promise, the hardware has its own packet format when doing + read/write DMA commands, but uses traditional ATA taskfile registers + for other types of commands. + + + [PATCH] remaining cpumask const qualifiers + + The remainder of the const qualifiers on cpumask ops. + + My cpumask overhaul missed specifying the const qualifiers + in cpumask.h. Subsequently, Linus has added some. The following + should provide the remainder of them. It also fixes one src vs dst + variable misnaming. + + Using crosstool on 2.6.7-mm5, I have built the following + arch's with the following change included: + + alpha ia64 powerpc-405 powerpc-750 sparc sparc64 x86_64 + + Signed-off-by: Paul Jackson + Signed-off-by: Linus Torvalds + + + [Bluetooth] Change inquiry_cache to hci_inquiry_cache + + This patch changes the inquiry_* functions to be either local to hci_core.c + or change name from inquiry_cache_lookup to hci_inquiry_cache_lookup to try + and reduce the potential for namespace conflicts. There could be USB or SCSI + or other code that uses an inquiry_cache. + + Signed-off-by: Stephen Hemminger + Signed-off-by: Marcel Holtmann + + + [Bluetooth] Fix deadlock in the 3Com driver + + This patch fixes the deadlock problem when bt3c_interrupt() is calling + bt3c_write_wakeup() with info->lock held. + + Signed-off-by: Marcel Holtmann + + + [Bluetooth] Fix kobject oops on firmware loading + + Allocate the memory for .kobj.k_name and make use of kobject_init() for + the fake device that is needed for firmware loading. + + Signed-off-by: Marcel Holtmann + + + [Bluetooth] Add HID protocol support + + This patch adds support for the Bluetooth HID protocol to the + Bluetooth subsystem. Currently only the boot mode is supported. + + Signed-off-by: Marcel Holtmann + + + [BK] Selectively ignore drivers/video/logo/*.c + + These are generated from drivers/video/logo/*.ppm. + + For non-BK users, this is the same as .cvsignore. + + + [BK] Ignore build-generated files Module.symvers, drivers/net/wan/wanxlfw.inc + + For non-BK users, this is similar to .cvsignore. + + + [Bluetooth] Allocate protocol number for AVDTP support + + This patch allocates the next free protocol number for the upcoming + AVDTP support. + + Signed-off-by: Marcel Holtmann + + + [PATCH] ppc32: compilation failure on ppc32 + + This fixes compilation on ppc32. + + The power/smp.o file should be linked only if both SMP and SWSUSPEND + are configured in. It used to do it even without SWSUSPEND. + + + [PATCH] swap_unplug_io_fn() nommu update + + include/linux/swap.h changed the definition for swap_unplug_io_fn() awhile + back, but mm/nommu.c was never updated to reflect the new definition. + As such, mm/nommu.c presently fails to compile. This fixes it. + + Signed-off-by: Paul Mundt + Signed-off-by: Linus Torvalds + + + typo.. + + + typo in radeon_state.c + + + whitespace cleanup in radeon.h + + + [ARM PATCH] 1950/1: SIZEOF_MACHINE_DESC requires asm/constants.h + + Patch from Nicolas Pitre + + The change as seen here: + http://linux.bkbits.net:8080/linux-2.5/diffs/arch/arm/kernel/head.S@1.19?nav=index.html|ChangeSet@-4d|cset@1.1769.3.12 + has this note: + "No need to include asm/mach/arch.h" + But it now requires asm/constants.h otherwise SIZEOF_MACHINE_DESC + is not defined. Why compilation succeeds anyways still mystify me. + + + [ARM PATCH] 1953/1: Omit id for platform devices where only one can possibly exist. + + Patch from Ian Campbell + + Now that the BK tree allows platform devices to specify an id of -1 + to get rid of the numbered suffix. + + Following discussion on the l-a-k mailing list here is patch to do + this for the pxafb, pxa2xx-udc and pxamci generic PXA2xx platform + devices and the platform devices on the Lubbock. + + + [ARM PATCH] 1938/1: Support for Collie device + + Patch from John Lenz + + Cleanup and forward port of patch 1850. + Add machine support for the Sharp Zaurus SL5500 PDA. + Does not include support for the collie serial port or + the sa1100fb_lcd_power function. + + + [PATCH] v850: Get rid of lvalue-casts in memset.c to make gcc happy + + Signed-off-by: Miles Bader + Signed-off-by: Linus Torvalds + + + [PATCH] v850: Use __volatile__ qualifier on test_bit asm statements + + Otherwise recent versions of gcc seem to optimize away some necessary tests. + + Signed-off-by: Miles Bader + Signed-off-by: Linus Torvalds + + + [PATCH] v850: Return value from no_action in irq.c + + Signed-off-by: Miles Bader + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: EEH fixes for POWER5 machines (1/2) + + From: Linas Vepstas + + This patch allows ppc64 to boot on Power5 machines. The new Power5 PCI + bridge design requires EEH (enhanced PCI error handling) to be enabled for + all PCI devices, not just some PCI devices. In addition, this patch moves + the check for PCI to ISA bridges out of perf critical code, and into + initialization code. This also avoids race conditions where the device + type might not have been set. Also, some whitespace fixes, and some + error-message-printing beautification. + + Signed-off-by: Linas Vepstas + Signed-off-by: Paul Mackerras + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: EEH fixes for POWER5 machines (2/2) + + From: Linas Vepstas + + This patch fixes the usage of the slot-error-detail log buffer for the + Power5 architecture. The size of the error buffer is variable, and the + correct size to use should have been obtained from firmware. Failure to + use the correct buffer sizes will result in hard-to-debug system lockups + deep in firmware. This patch is based on an earlier patch from Ben + Herrenschmidt, which essentially did the same thing. + + This patch also tweaks some of the subroutine documentation. + + Signed-off-by: Linas Vepstas + Signed-off-by: Paul Mackerras + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: RTAS error log locking fix + + From: Linas Vepstas + + When an RTAS call returns the "hardware error" code, we need to do another + RTAS call to find out what went wrong. Previously we weren't doing that + inside the lock that serializes RTAS calls, and thus another cpu could get + in and do another RTAS call in the meantime. This patch fixes it. This + patch also includes some minor whitespace fixes. + + Signed-off-by: Linas Vepstas + Signed-off-by: Paul Mackerras + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: gcc 3.5 fixes + + gcc 3.5 ICEd on the ppc64 version of __ptep_set_access_flags, but it does + look like we want to use *ptep here. + + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: gcc 3.5 fixes #2 + + Here are the ppc64 specific gcc 3.5 fixes. + + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: SPLPAR spinlock optimisation + + Currently our spinlocks can call into the hypervisor on dedicated processor + machines. Doing this may slow our locks down, so avoid it where possible. + + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32: biarch gcc support + + A native powerpc64-linux gcc can not compile a ppc32 kernel properly. This + patch fixes it. It was copied from ppc64. The change to vmlinux.lds.S + fixes this error: + + ld: warning: powerpc:common architecture of input file `init/built-in.o' is + incompatible with powerpc:common64 output + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: remove MachineCheck_Pseries + + rmk added a check to vmlinux for undefined symbols in -mm kernels. ppc64 + fails due to trying to export an unimplemented symbol from assembly code. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] port reboot workarounds to new DMI probing + + This patch moves reboot related workarounds out of dmi_scan.c Please + consider applying. + + Signed-off-by: Andrey Panin + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Fix sparse warnings in fs/udf/* + + CHECK fs/udf/dir.c + fs/udf/dir.c:240:13: warning: expected lvalue for member dereference + [...] + CHECK fs/udf/namei.c + fs/udf/namei.c:872:6: warning: expected lvalue for member dereference + fs/udf/namei.c:916:6: warning: expected lvalue for member dereference + fs/udf/namei.c:1189:14: warning: expected lvalue for member dereference + fs/udf/namei.c:1234:7: warning: expected lvalue for member dereference + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix up physnode_map + + At the moment, we initialise physnode_map from the various BIOS tables, + which can create problems, as holes inside an node return 1 for pfn_valid, + and yet pfn_to_nid is not correct for them. I'd hacked around this in my + tree by defaulting the mapping to 0, not -1, but that's not the correct fix + ... this is. + + I consolidated all the code back into 1 place, and use node_start_pfn[] and + node_end_pfn[] to walk over it instead - that means it matches up perfectly + with lmem_map's as we're using the same data. It also cleans up a lot of + the code. + + Tested on both NUMA-Q and x440 ... and it only affects i386 NUMA boxen. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] wavefront_fx.c build fix + + With gcc from CVS: + + sound/isa/wavefront/wavefront_fx.c:697: error: static declaration of 'page_zero' follows non-static declaration + include/sound/yss225.h:4: error: previous declaration of 'page_zero' was here + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] MTRR __initdata fix + + smp_changes_mask is used by generic_set_all() which isn't __init + + Signed-off-by: Dave Jones + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] selinux build fix + + With gcc-3.5 from CVS: + + security/selinux/avc.c:76: error: static declaration of 'avc_cache_stats' follows non-static declaration + security/selinux/include/avc.h:107: error: previous declaration of 'avc_cache_stats' was here + + Signed-off-by: Chris Wright + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] selinux space saving + + Move inline avc_cache_stats helper functions alongside the statically declared + avc_cache_stats array. + + Signed-off-by: Chris Wright + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] err1-7, err1-8: double locking fix for radeonfb + + radeonfb: the Stanford lock checker found us double-locking rinfo->reg_lock + via sequences like OUTPLL(foo, INPLL(bar) | baz ), as both OUTPLL and INPLL + grab the register lock. This should fix the problem. + + Signed-off-by: David Eger + Signed-off-by: Linus Torvalds + + + [PATCH] Fix ia64 UPF_RESOURCES pcdp.c 2.6.7-mm5 build + + It looks like someone removed UPF_RESOURCES in remove-upf_resources.patch + in parallel with someone adding drivers/firmware/pcdp.c that references + UPF_RESOURCES. + + In any event, trying to build a defconfig ia64 2.6.7-mm5 (which includes + CONFIG_SERIAL_8250=y in the .config) fails with: + + drivers/firmware/pcdp.c: In function `setup_serial_console': + drivers/firmware/pcdp.c:100: error: `UPF_RESOURCES' undeclared (first use in this function) + + Signed-off-by: Paul Jackson + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sparc32 cpumask bitop build fix + + With the following changes, I was able to compile the "sparc" (32 bit) + arch, using defconfig and crosstool. There were still plenty of warnings, + but nothing else relating to bitops or cpumasks that I noticed. This is + working with 2.6.7-mm5. + + I have no way to boot test this, but these changes seem obvious enough that + I'd recommend including them. + + Signed-off-by: Paul Jackson + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] force O_LARGEFILE in sys_swapon() and sys_swapoff() + + For 32-bit, one quickly discovers that swapon() is not given an fd already + opened with O_LARGEFILE to act upon and the forcing of O_LARGEFILE for + 64-bit is irrelevant, as the system call's argument is a path. So this + patch manually forces it for swapon() and swapoff(). + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] gcc 3.5 fixes + + gcc 3.5 is warning about static vs non static function declarations. The + following patch removes function prototypes in .h files where possible and + changes prototypes to be static elsewhere. + + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] gcc 3.5 fixes #2 + + gcc 3.5 is warning about unused static variables, add __attribute_unused__ + to the 2 places to silence it. + + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] __bdevname leak fix + + The __bdevname library function is leaking module references due to + + __bdevname + ->get_gendisk + ->kobj_lookup + ->ata_probe + ->get_disk + ->try_module_get + + What we're trying to do in there is too ambitious. Change it to just print + the major and minor. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] spurious remap_file_pages() -EINVAL + + As ->vm_private_data is used as a cursor for swapout of VM_NONLINEAR vmas, + the check for NULL ->vm_private_data or VM_RESERVED is too strict, and + should allow VM_NONLINEAR vmas with non-NULL ->vm_private_data. + + This fixes an issue on 2.6.7-mm5 where system calls to remap_file_pages() + spuriously failed while under memory pressure. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] remove allowdma0 documentation + + allowdma0 is gone in 2.6, the patch below removes the mentionings of this + option in the documentation. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] kyrofb warning fix + + drivers/video/kyro/fbdev.c: In function `kyrofb_probe': + drivers/video/kyro/fbdev.c:736: warning: passing arg 1 of `memset' makes pointer from integer without a cast + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PCMCIA] check for proper registration with device core + + Patch from Dominik Brodowski + + Fail if registration of socket with driver core failed. This is + necessary so that socket-related sysfs entries will appear always + if a socket thread is up and running. + + + [PKT_SCHED]: Pass NET_XMIT_* status properly back through classifiers. + + + [PKT_SCHED]: Rip out requeue stat addition, user ABI breaker. + + + [IPV4]: Calculate default broadcast even when using SIOCSIGNETMASK. + + While getting hands-on with netkit (www.netkit.org), a networking + simulation environment based on UML, it struck me that ifconfig wasn't + capable of calculating the proper broadcast address for a subnetted + interface. Some browsing through newsgroups and on the Debian package + site (nettools), showed that this leads to misconfigured interfaces and + a couple of bugreports on ifconfig. + + Digging a bit deeper revealed that it actually is an issue with + SIOIFNETMASK. Once you bring up an interface with SIOIFADDR, a classfull + netmask and broadcast address is set (if applicable for the type of + interface), in order to get a properly configured interface. But if you + subnet the network using SIOIFNETMASK no proper broadcast address is + set. So you always have to calculate it yourself, obviously leading to + configuration errors. + + This patch takes care of this. First of all it doesn't change + existing functionality, eg. a command like 'ifconfig eth0 192.168.1.1 + netmask 255.255.255.240 broadcast 192.168.1.0' still works. But if you + omit the broadcast address, a proper 'all ones' broadcast address for the + subnet is set. 'ifconfig eth0 192.168.1.1 netmask 255.255.255.240' gives + you 'eth0 inet addr:192.168.1.1 Bcast:192.168.1.15 Mask:255.255.255.240' + and this should solve some real life problems. + + Signed-off-by: Jaap Keuter + Signed-off-by: David S. Miller + + + [NETLINK]: Check connect address. + + + [NETLINK]: Return err in netlink_connect. + + This patch makes netlink_connect() return the value of err instead of 0. + It doesn't actually make any difference since the current implementation + of netlink_autobind() never fails. But since we went to all this trouble + to check the return status of autobind, might as well return the correct + value :) + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [NET]: Allow large MTU on dummy net device. + + It is useful for testing to allow larger MTU value to be set on + the dummy network device. The current code limits it to valid Ether mtu's. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [TG3]: Delay both before and after PCI cfg space readback after reset. + + + [TG3]: Bump driver version and reldate. + + + [ESP4]: Merge NAT-T code in esp_output(). + + + [ROSE]: rose_route locking fix + + Fix deadlock in rose_del_loopback_node(). Found by the Stanford locking + checker. + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [AX25]: ax25_ds_idletimer_expiry() locking fix. + + Fix deadlock identified by the Stanford locking checker. + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [LAPB]: lapb_unregister() locking fix. + + Fix deadlock identified by the Stanford locking checker. + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [AX25]: ax25_rt_add() locking fix. + + Fix deadlock identified by the Stanford locking checker. + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [AH4]: Harmonization of output function. + + This is another step towards the union of the tunnel mode encapsulation + between transforms. As there are significant differences between the + tunnel encapsulation of IPv4 and IPv6, I'll be dealing with IPv4 only + for now. + + This particular patch rearranges the code in ah_output to isolate the + tunnel mode encapsulation. + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [IPV6] Bring lo up before setting other interface up. + + + IPv6 was not configured appropriately without lo. + Noticed by / tested by Russell King . + + Signed-off-by: Hideaki YOSHIFUJI + Signed-off-by: David S. Miller + + + [SPARC64]: Kill silo_args bogus .globl + + + [VLAN]: Do not access released memory. + + + [IPV6]: Fix flags for ndisc dst. + + Because RTF_LOCAL is for local unicast address, + it was wrong to set RTF_LOCAL to ndisc dst. + This patch also adds some comment on other fields. + + Signed-off-by: Hideaki YOSHIFUJI + Signed-off-by: David S. Miller + + + [TCP]: Inline message. + + D: [TCP] Diet using unknown + + + [NET]: Save space for dst underflow message. + + Save space for 'dst underflow' message. + + Signed-off-by: Hideaki YOSHIFUJI + Signed-off-by: David S. Miller + + + [XFRM]: Convert XFRM_MSG_* macros to an enum. + + This way we will not forget to update XFRM_MSG_MAX in + the future. + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [PKT_SCHED]: Do not embed spinlock in tc_stats structure. + + This makes it not get sized/copied around to/from + userspace correctly. The real crux of the problem + comes from the rtnetlink attribute copying line which + read: + RTA_PUT(skb, TCA_STATS, (char*)&st->lock - (char*)st, st); + which is not necessarily sizeof(struct tc_stats) due + to alignment issues. + + + [NETFILTER]: Fix initializer of ip6table.c:initial_table + + Just because gcc accepts [index] bar as + [index] = bar is no reason to make use of + that gross construct. + + Also fully C99ify + + + [ARM] Use platform_get_resource/platform_get_irq in sa1111.c + + + JFS: Updated field isn't always written to disk during truncate + + There is a possibility that a change to header.next is not logged + or written to disk if it is the only change to an xtree leaf page. + + Signed-off-by: Dave Kleikamp + + + [ARM] Usual mach-types update. + + + [ARM PATCH] 1954/2: Make pxa platform device names more sensible + + Patch from Ian Campbell + + Update 1954/1 to use pxa2xx- as the platform device prefix + instead of pxa2xx_. This changes pxamci to pxa2xx-mci, pxa2xx_udc + to pxa2xx-udc and pxafb to pxa2xx-fb. pxa2xx-uart doesn't need changing. + + + [PATCH] ia64: Rename local move_irq to sn_move_irq + + Rename SN local function move_irq to sn_move_irq to remove conflict + with global move_irq. Needed since ashok.raj moved move_irq() from + iosapic.c to irq.c. + + Signed-off-by: Keith Owens + Signed-off-by: David Mosberger + + + [PATCH] ia64: IA-32 sigaltstack bug fix + + More code needs to be guarded by if (uss32) { ... }. Without this + patch, if (buf32..) may be checking uninitialized data and may result + in spurious ENOMEMs. + + Signed-off-by: Gordon Jin + Signed-off-by: Arun Sharma + Signed-off-by: David Mosberger + + + [PCMCIA] core socket sysfs support, export card type + + Patch from Dominik Brodowski + + Add a first socket-related sysfs entry; and to keep things ordered, + do so in a new file drivers/pcmcia/socket_sysfs.c. To keep things + easy, all files will be present all the time, even if no card is in + the socket at a specific moment -- however, accessing the file will + result in -ENODEV then, so that + + # cat /sys/class/pcmcia_socket/pcmcia_socket1/card_type + + will cause an error message like + + "cat: card_type: No such device" + + which is quite self-explanatory. + + + The attribute "card_type" will return either "16-bit" or "32-bit", + depending on whether the PCCard is a 16-bit PCMCIA card or a 32-bit + CardBus card. The result "invalid" should not happen, and if it + happens, something strange is going on. + + + [PCMCIA] card voltage + + Patch from Dominik Brodowski + + Add an attribute "card_voltage" which returns the card's voltage + requirements: + + "5.0V", "3.3V" or "X.XV". + + + [PCMCIA] card vpp / vcc + + Patch from Dominik Brodowski + + Add attributes "card_vpp" and "card_vcc" which return these voltages, + like "3.3V" + + + [PCMCIA] card insert / eject + + Patch from Dominik Brodowski + + Add two further attributes, "card_insert" and "card_eject". Reading + these files will fail; but writing _anything_ non-empty to these + files will execute an user insert/ejection request -- equivalent + to "cardctl insert", "cardctl eject". + + To ensure proper error values to userspace, transform the return + values from CS_ error codes to -E error codes. + + + [NETFILTER]: ip6t_LOG and packets with hop-by-hop options. + + Packet with IPPROTO_HOPOPTS extended header isn't logged properly by + ip6t_LOG.c. It only prints PROTO=0 and nothing more, because + IPPROTO_HOPOPTS=0 and in this file 0 is used to indicate last header. + This patch fix it by using IPPROTO_NONE to indicate last header. + + Signed-off-by: Marcel Sebek + Signed-off-by: Harald Welte + Signed-off-by: David S. Miller + + + [PKT_SCHED]: Update to network emulation QOS scheduler. + + This patch updates the network emulation packet scheduler. + * name changed from delay to netem since it does more than just delay + * Catalin's merged code to do packet reordering + * uses a socket queue's directly rather than layering on qdisc(fifo) + because this is used in performance tests. + * adds placeholder in API for future enhancements (rate and duplicate). + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [IPCOMP]: Exclude IPCOMP header from props.header_len + + This is another patch on the way towards a unified XFRM tunnel + encapsulation function. + + This patch changes the value of props.header_len for IPCOMP to + exclude the IPCOMP header. The reason is that the IPCOMP header + is added only if the packet is compressible. That is, if the + size of the compressed payload plus the size of the IPCOMP header + is less than that of the original payload. + + This means that the IPCOMP encapsulation does not impose any + overhead at all as far as the MTU is concerned. The current + code incorrectly reduces the MTU by the size of the IPCOMP + header. + + As a side-effect, this means that we don't have to move the + IP header around when IPCOMP is used. + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [PKT_SCHED]: Fix some missing qdisc_copy_stats() conversions. + + + [PKT_SCHED]: Two small netem fixes. + + - rtnetlink.h needs including + - optimize loss test so that net_random() call is not done + when no-loss is indicated + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [PATCH] ia64: Correct invalid unwind data + + ASM_UNW_PRLG_GRSAVE(n) must match the number of input registers in the + following alloc statement. Otherwise you get invalid backtraces :( + + Signed-off-by: Keith Owens + Signed-off-by: David Mosberger + + + [PKT_SCHED]: Another missed qdisc_copy_stats() conversion. + + + [PKT_SCHED]: New version of u32 classifier hashing workaround. + + This version does not change user visible structures. + + Signed-off-by: Jamal Hadi Salim + Signed-off-by: David S. Miller + + + [PKT_SCHED]: Kill CONFIG_CLS_U32_PERF2 cruft code. + + + [PKT_SCHED]: Kill fix_u32_bug ifdef tests in cls_u32.c + + + [PATCH] prism54 freq to channel incorrect for 5GHz + + 2004-07-06 Margit Schubert-While + + * The frequency to channel conversion is wrong for the 5GHz band + * Although the (known) devices don't/can't use it, + they do report it. (iwlist ethX freq) + + + [IPV4]: Set UDP accept back to sock_no_accept. + + Setting it to inet_accept causes UDP accept attempts + to OOPS. In particular, accept01 from LTP tries this. + + Signed-off-by: David S. Miller + + + [PATCH] s390: dasd driver changes + + From: Horst Hummel + + dasd device driver changes: + - Set and check the retry counter in start_IO for all requests. + + Signed-off-by: Martin Schwidefsky + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] s390: common i/o layer + + From: Arnd Bergmann + + Common i/o layer changes: + - Reorder checking and setting of the ccw device id. + + Signed-off-by: Martin Schwidefsky + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] s390: ctc driver changes + + From: Peter Tiedemann + + ctc driver changes: + - Make use of the debug feature to ease debugging. + - ctctty: use dev_alloc_name to allocate a network device name. + - ctctty: avoid deadlock of ctc_tty_close vs ctc_tty_flush_buffer. + + Signed-off-by: Martin Schwidefsky + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] s390: cpu-idle notifier + + This patch introduces a notifier chain for cpu idle. There are two events + CPU_IDLE and CPU_NOT_IDLE that are called just before the cpu goes to sleep + and right after the cpu woke up again. The notifier is used to simplify the + no-hz-timer-in-idle feature and the virtual cpu timers. In addition the + virtual cpu timer functions have been moved to arch/s390/kernel/vtime.c, which + gives a nice separation between the timer functions related to real time and + the timer functions related to virtual cpu time. + + Signed-off-by: Martin Schwidefsky + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] s390: cpu hotplug support + + From: Ursula Braun-Krahl + From: Heiko Carstens + From: Gerald Schaefer + From: Martin Schwidefsky + + Add s390 architecture support for cpu hotplug. + + Signed-off-by: Martin Schwidefsky + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fbcon mode switching fix + + Ugly workaround. When switching from KD_GRAPHICS to KD_TEXT, the event is + captured at fbcon_blank() allowing fbcon to reinitialize the hardware. + However, some hardware requires the reinitialization to be done + immediately, others require it to be done later. Others may need it to be + done immediately and later, this is the worst case. + + Signed-off-by: Antonino Daplas + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fbcon: refinements for fbcon + + 1. From Petr Vandrovec . + + Begin quote + + yesterday I finally found why 2.6.x has problems with taking + over vgacon. Problem is that take_over_console does: + + if (IS_VISIBLE) + save_screen(i); + ... + visual_init(i, 0); + ... + + so code nicely saves screen contents, and calls visual_init, + which calls fbcon's init, which in turn can issue vc_resize. And this + vc_resize will trigger read from vc->vc_origin. But vc_origin still + points to videomemory, not to the buffer where save_screen() copied + its data. + + End quote + + So updating vc->vc_origin to point to screenbuf after the previous console + deinitializes allows fbcon to correctly update the screen from the screen + buffer. This change makes the clearing of vram (using fillrect) unnecessary. + + 2. If FBINFO_MISC_MODESWITCH flag is set in info, do the set_par() in + fbcon_switch() instead of piggy-backing the set_par() on fbcon_resize(). This + preserves the current var, skipping the unnecessary fb_find_mode() step. + + Signed-off-by: Antonino Daplas + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fbcon: new scrolling mode: YPAN + REDRAW + + Added a new scrolling mode (SCROLL_PAN_REDRAW) to fbcon that should greatly + benefit unaccelerated drivers such as VESA fbdev. An increase of 3-10 times + in scrolling speed can be expected. + + Currently, fbcon has 4 different scrolling methods (1-4). Potentially, we can + have 6. This patch implements SCROLL_PAN_REDRAW (5). SCROLL_WRAP_REDRAW (6) + is still unimplemented. + + Scroll Mode Operation YPan YWrap + +++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1. SCROLL_ACCEL copyarea No No + 2. SCROLL_REDRAW imageblit No No + 3. SCROLL_PAN copyarea Yes No + 4. SCROLL_WRAP copyarea No Yes + 5. SCROLL_PAN_REDRAW imageblit Yes No + 6. SCROLL_WRAP_REDRAW imageblit No Yes + +++++++++++++++++++++++++++++++++++++++++++++++++++++ + Note 1: I've changed the nomenclature to increase clarity: + + SCROLL_ACCEL = SCROLL_MOVE + SCROLL_REDRAW = SCROLL_REDRAW + SCROLL_PAN = SCROLL_PAN_MOVE + SCROLL_WRAP = SCROLL_WRAP_MOVE + + To demonstrate the effect of each of the scrolling methods on + an unaccelerated PCI/AGP-based driver (vesafb), I used a simple + benchmark (time cat linux/MAINTAINERS - a 50K text file). The + framebuffer is set at: + + 1024x768-8bpp, 8x16 font, yres_virtual = 2*yres + + 1. SCROLL_MOVE: + real 5m50.277s + user 0m0.001s + sys 5m50.227s + + Almost 6 minutes for a 50K text file. Using soft copyarea on a + PCI-based card is just too slow (because copyarea has to + read from the framebuffer memory). + + 2. SCROLL_PAN_MOVE + scrollmode: SCROLL_PAN + real 0m8.592s + user 0m0.000s + sys 0m8.586s + + Using ypan with copyarea dramatically improves the scrolling. However, the + scrolling action is jerky (fast during the panning stages, slows down during + the copyarea stages). + + 3. SCROLL_REDRAW (this is the default scrolling mode) + real 0m3.189s + user 0m0.000s + sys 0m3.170s + + Simply eliminating the copyarea, even without ypanning, makes it faster than + SCROLL_PAN_MOvE. Plus, the scrolling action is smoother. + + So, if we combine YPanning with imageblit (PAN_REDRAW), we get this: + + 4. SCROLL_PAN_REDRAW + real 0m0.520s + user 0m0.000s + sys 0m0.518s + + That's almost 6x faster than SCROLL_REDRAW. Increasing the amount of video + RAM still increases the speed, but not very dramatically. Higher than 16 MB, + the increase is negligible. + + Using an accelerated driver, we see almost the same effect but not as + dramatically: + + 1. SCROLL_MOVE - accel + real 0m3.112s + user 0m0.000s + sys 0m3.112s + + 2. SCROLL_REDRAW - accel + real 0m2.604s + user 0m0.000s + sys 0m2.603s + + Redraw is still faster than move, but not much. + + 3. SCROLL_PAN_MOVE - accel + real 0m0.203s + user 0m0.000s + sys 0m0.202s + + 4. SCROLL_PAN_REDRAW - accel + real 0m0.326s + user 0m0.002s + sys 0m0.323s + + This is one exception. If panning is enabled, move is actually faster than + redraw. As to why, I don't know. + + So based on the above, fbcon will choose the scrolling method based on the + following preference: + + Ypan/Ywrap > accel imageblit > accel copyarea > + soft imageblit > (soft copyarea) + + Note 2: Exception: accel copyarea > accel imageblit if Pan/Wrap is enabled. + + Note 3: soft copyarea will be avoided by fbcon as much as possible unless + there is a specific override, ie., FBINFO_READS_FAST flag is set. If this + flag is set, fbcon will prefer copyarea over imageblit, accel or soft. + + As a final note, in order for fbcon to use the best scrolling method, the + low-level drivers must provide the correct hinting by setting the + FBINFO_HWACCEL_* flags. + + To vesafb users: boot vesafb like this for fastest scrolling action: + + video=vesafb:ypan,vram:16 + + Signed-off-by: Antonino Daplas + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fbdev: set capabilities flag for vesafb and vga16fb + + This patch sets the correct capabilities flag for vesafb and vga16fb to + provide fbcon with the correct hints as to the best scrolling mode. + + Signed-off-by: Antonino Daplas + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] NUMA API: fix use-after-free bug + + Move the memory policy freeing to later in exit to make sure the last + memory allocations don't use an uninitialized policy. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sparse: fix remaining three non-ANSI warnings + + CHECK fs/smbfs/smbiod.c + fs/smbfs/smbiod.c:68:25: warning: non-ANSI parameter list + CHECK drivers/isdn/tpam/tpam_crcpc.c + drivers/isdn/tpam/tpam_crcpc.c:57:15: warning: non-ANSI parameter list + CHECK drivers/scsi/aic7xxx/aic79xx_reg_print.c + drivers/scsi/aic7xxx/aic79xx_osm.h:791:19: warning: non-ANSI parameter list + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] saa5246a Videotext driver update + + From: Michael Geng + + The patch updates docs, comments + strings to also mention the SAA5281 chip + (which is compatible to the SAA5246A) as supported. + + Signed-off-by: Michael Geng + Signed-off-by: Gerd Knorr + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Remove include/{asm-i386,linux}/upd4990a.h + + From: Alexey Dobriyan + + drivers/char/upd4990a.c was removed from 2.6. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Fix memory leak in epoll + + There was a memory leak in epoll. + + The reference count (d_count) of the struct dentry of a new epoll-fd was + set to TWO. (new_inode() assigned ONE, than ep_getfd() incremented it by + dget()). There was only ONE reference to this dentry, so struct dentry and + struct inode were never freed. + + Signed-off-by: Davide Libenzi + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] snd_ctl_read() fix fix + + hm, I had a brainfart here. The recent "fix" to snd_ctl_read() actually + unfixed it. Revert that, and fix the real bug. + + Cc: Jaroslav Kysela + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + sparse: annotate signal handler and ss_sp as user pointers + + + fix oops in build_wildcard_path_from_dentry + + + [AGPGART] VIA K8T890 Host Bridge support. + + Signed-off-by: Dave Jones + + + [AGPGART] VIA VT838x [K8T800/K8M800/K8N800] support + + Signed-off-by: Dave Jones + + + [AGPGART] VIA KT880 support. + + Signed-off-by: Dave Jones + + + [AGPGART] VIA VT83xx/VT87xx/KTxxx/Px8xx support. + + Signed-off-by: Dave Jones + + + [AGPGART] VIA P4M800 support. + + Signed-off-by: Dave Jones + + + JFS: Protect active_ag with a spinlock + + Signed-off-by: Dave Kleikamp + + + JFS: prevent concurrent calls to txCommit on the imap inode + + Signed-off-by: Dave Kleikamp + + + [NETFILTER]: Fix two broken checks for options in ipt_LOG + + Signed-off-by: Patrick McHardy + Signed-off-by: Harald Welte + Signed-off-by: David S. Miller + + + [NET]: Deinline sock_i_uid, sock_i_ino + + The sock_i_uid and sock_i_ino functions are only called by + /proc type interfaces, so they don't need to be inlined. + + Also, the inline functions writeable, rcvtimeo, sndtimeo are test + for value functions that don't change their argument. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + JFS: Check for dmap corruption before using leafidx + + Signed-off-by: Dave Kleikamp + + + [IPV4]: IPMR fixes. + + - pim_protocol warning fix + + - ipmr_vif_open() and ipmr_mfc_open() allocates the memory, so it + should use seq_release_private(). + + - ipmr_mfc_seq_xxx is using it->cache, in order to control whether + unlock should be do or not, but it->cache was not initialized in + ipmr_mfc_seq_start(). So it can point the previous state if user + did seek(). This become to the cause of twice unlock. + + Signed-off-by: OGAWA Hirofumi + Signed-off-by: David S. Miller + + + [NET]: Cleanup mis-usage of seq_release_private + + These doesn't allocate memory and doesn't use seq->private. However + kfree() ignores NULL, so these are not the problem. + + This patch just cleans these up. + + Signed-off-by: OGAWA Hirofumi + Signed-off-by: David S. Miller + + + [AGPGART] Intel I915 support. + From: Alan Hourihane + Signed-off-by: Dave Jones + + + [PATCH] ia64: Fix OSDL BugMe report 2885: realtime process can't preempt low priority process in kernel + + Rearranged code to make it work. There were two problems: + + 1. The preempt flag was being tested only if code was leaving for + user space (the logic should be: test for RESCHEDULE if we're + switching to a kernel thread, test everything if switching to a + user thread) + + 2. The check of the user space flags was being repeated even if the + work had been done. + + There is one small change in semantics: when returning from a + preemption, the preemption flag will *not* be rechecked. Otherwise, I + found that it was easy to get into a livelock situation where no + forward progress was made. + + Signed-off-by: David Mosberger + + + [AGPGART] Add support for SiS 5591. + Untested, but from the looks of things (comparing with DragonFlyBSD's agp implementation) + this should work. Strangely, we added the PCI ID for this a long time ago, back + in 2.0.34 (long before agpgart driver got merged) and then we never used it. + + Signed-off-by: Dave Jones + + + [NET] convert storage for MIB from struct member to array item. + + Signed-off-by: Hideaki YOSHIFUJI + + + [PKT_SCHED]: Another missed tc_stats spinlock conversion. + + Signed-off-by: Jamal Hadi Salim + Signed-off-by: David S. Miller + + + [TCP]: Type qualifiers, such as const, are ignored on function return type. + + + [TCP]: Do not round window to MSS if window scaling. + + Signed-off-by: John Heffner + Signed-off-by: David S. Miller + + + [NET] use SNMP_MIB_ITEM for MIB description. + + Signed-off-by: Hideaki YOSHIFUJI + + + [NET] fold long comment lines. + + Signed-off-by: Hideaki YOSHIFUJI + + + [NET] use seq_puts() where appropriate. + + Signed-off-by: Hideaki YOSHIFUJI + + + ia64: Nuke two compiler warnings. + + + [ARM] IXP4xx: platform_add_device() to platform_add_devices() conversion + + Signed-off-by: Deepak Saxena + + + [ARM PATCH] 1937/1: LoCoMo common device + + Patch from John Lenz + + Cleanup and forward port of patch 1849. + This patch provides support for the SHARP LoCoMo device, + a companion chip similar to the sa1111 device. It is present + in many of the SHARP Zaurus line of PDAs. + + + Back out smc91x late collision "performance" hack. + + Apparantly, the reason for this change is that it gives "much less + NFS stalls with a SMC91C96 on a 10/100MB switch." + + Alan Cox's comments on this is: + "spec says 16 collision retries max _ever_. I bet his 'broken + switch' is a case of half v full duplex" and a recommendation to + remove it. + + Also, since the change does not limit the number of times we may + retry to send the packet, I think this code opens a potential DoS + attack against network which has a machine connected running this + code. + + + [PATCH] I2C: ADM1030 and Co sensors chips support + + Here is a patch against linux-2.6.7-mm1 kernel that adds support for + adm1030 and adm1031 sensors chips. + + It has been reviewed several times by Jean Delvare, and he thinks it is + ready for inclusion into 2.6 kernel. So here it is. + + + Signed-off-by: Alexandre d'Alton + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] I2C PPC4xx IIC driver: 0-length transactions bit-banging implementation + + IBM PPC 4xx i2c controller doesn't support 0-length transactions (e.g. used by + SMBUS_QUICK). This patch implements bit-banging emulation for such requests and + removes temporary kludge added earlier. + + Signed-off-by: Eugene Surovegin + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] I2C: Class of scx200_acb + + This is needed for the scx200_acb to accept hardware monitoring chips. + + Signed-off-by: Jean Delvare + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] I2C: Add support for LM86, MAX6657 and MAX6658 to lm90 + + This adds support for the LM86, MAX6657 and MAX6658 sensor chips to the + lm90 driver. These are less popular than the LM90 and ADM1032 but + several users have reported to use these, so I added support to the lm90 + driver. All these chips are fully compatible so that's just a matter of + accepting the new chip ids. I also slightly simplified the detection + code. + + + Signed-off-by: Jean Delvare + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] I2C: i2c/i2c-dev.c::i2c_dev_init() cleanup. + + This patch does the fallowing cleanup for + drivers/i2c/i2c-dev.c::i2c_dev_init(): + + *) in a error condition, return the error code of register_chrdev() + insted of -EIO; + *) adds missing audit for class_register(); + *) in a error condition, only prints "Driver Initialisation Failed", + insted printing the cause. (Note that the error will be printed by + the return of the error code, and the information about what function + caused the problem need to be done by a debug code). + + Only compiled, lack of hardware. + + Signed-off-by: Luiz Capitulino + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] I2C: Documentation for i2c-parport + + At least, the i2c-parport gets some documentation. I heard several + persons complaining that there was no sample electronics schema for + building their own i2c-over-parallel-port, so I did just that, with the + help of Sylvain Munaut. The documentation also includes the list of + supported adapters, and a short comparison with other drivers using the + parallel port to drive an i2c bus. At the end of the document I included + an updated version of the i2c-velleman doc file (which I then deleted). + + Signed-off-by: Jean Delvare + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] I2C: Add support for LM77 + + This patch (against the current stack) adds support for the + LM77 sensor chips made by National Semiconductor. Formerly + this was claimed by the LM75 driver but when I got hold of an + embedded board (built around the National Geode SC1100 CPU), + which was equipped with an LM77, it turned out that the two + chips are not compatible. + + It has been developed with help of, reviewed and approved + by Jean Delvare. + + + Signed-off-by: Andras Bali + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] ia64: Fix bug in ia64_atomic64_{add,sub} + + Hit this bug just yesterday. I hope the problem and fix require no + explanation. Patched kernel boots and runs just fine. + + Signed-off-by: Brent Casavant + Signed-off-by: David Mosberger + + + [IPV4]: Fix multicast socket hangs. + + If a multicast packet gets looped back, the sending + socket can hang if a local read just sits and does + not empty its receive queue. + + The problem is that when an SKB clone is freed up, + the destructor is only invoked for the head SKB when + there is a fraglist (which is created for fragmentation). + + The solution is to account the fragment list SKB lengths + in the top-level head SKB, then it all works out. + + Signed-off-by: David S. Miller + + + ia64: Define machvec_noop as "static inline" + + This way, non-GENERIC kernels can optimize away the no-op calls + while GENERIC kernels can still take the address of the function + to initialize the machvec vector. + + + [PATCH] Driver core: add platform_device_register_simple to register platform + + Add platform_device_register_simple to register platform devices + requiring minimal resource and memory management. The device + will have standard release function that just frees memory + occupied by the platform device. By having release function in + the driver core modules using such devices can be unloaded + without waiting for the last reference to the device to be + dropped. + + + Signed-off-by: Dmitry Torokhov + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] Driver core: add default driver attributes to struct bus_type + + Signed-off-by: Dmitry Torokhov + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] Driver core: kset_find_obj should increment refcount of the found object + + kset_find_obj should increment refcount of the found object so users of + the function can safely use returned object + + Signed-off-by: Dmitry Torokhov + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] Driver core: add driver_find helper to find a driver by its name + + Signed-off-by: Dmitry Torokhov + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] ia64: fix various problems in pfm_check_task_state() + + Commands not requiring the monitored task to be stopped would spin in + wait_task_inactive() forever. After call to wait_task_inactive(), + state may have changed, therefore it needs to be rechecked. + + Signed-off-by: Stephane Eranian + Signed-off-by: David Mosberger + + + JFS: jfs_dmap build fix + + fs/jfs/jfs_dmap.c: In function `dbAllocNear': + fs/jfs/jfs_dmap.c:1343: parse error before `*' + fs/jfs/jfs_dmap.c:1357: `leaf' undeclared (first use in this function) + fs/jfs/jfs_dmap.c:1357: (Each undeclared identifier is reported only once + fs/jfs/jfs_dmap.c:1357: for each function it appears in.) + + Signed-off-by: Andrew Morton + Signed-off-by: Dave Kleikamp + + + [PATCH] ia64: nointroute option needs to be parsed early + + This patch does an early parsing of kernel command line to check if + no_int_route is present. Sal_init code depends on this option to + enable/disable interrupt routing. + + Signed-off-by: Rohit Seth + Signed-off-by: David Mosberger + + + [PATCH] ia64: allow module core code calls to module init code again + + Drop the prohibition for module core code calls to module init code + (this breaks netfilter). + + Signed-off-by: + Signed-off-by: David Mosberger + + + [PATCH] ia64: add audit support + + This patch adds IA64 support to the audit infrastructure. The IA64 + audit patch complements the existing audit support for the i386, + PPC64, and x86_64 architectures. This patch is based on work by Ray + Lanza. + + Signed-off-by: Peter Martuccelli + Signed-off-by: David Mosberger + + + [Bluetooth] Respond to L2CAP info requests + + This patch adds the correct behavior when a L2CAP info request is sent + by the peer. The answer should be a L2CAP info response with the result + code set to "not supported". + + Signed-off-by: Marcel Holtmann + + + [PATCH] ia64: fix interpolation-bug in fsys_gettimeofday() + + The order of reading ar.itc is incorrect with respect to all other + variables in fsys_gettimeofday. All variables involved in time + interpolation need to be protected by the sequence lock xtime_lock for + consistency check. However, the first time that fsys_gettimeofday() + takes a time stamp, it reads the count outside the seq lock leading to + the following possible time leap into the future scenario: + + fsys_gettimeofday: + read ar.itc + + .... .... + + read_seqbegin + read all other variables (last_nsec_offset, jiffies, xtime) + do time interpolation - elapsed_cycles become a large negative + number and converting it to nsec overflows and make it a + large positive number + read_seqretry success + updates last_nsec_offset (which is several seconds into the future). + + All subsequent gettimeofday() calls will be wrong as well because + monotonic property kicks in. It only self-corrects once that future + time actually arrives. + + This patch fixes the problem (and moves one instruction to make some room). + + Signed-off-by: Ken Chen + Signed-off-by: Asit Mallick + Signed-off-by: David Mosberger + + + [Bluetooth] Don't reset the USB halted bits + + The USB halted bits are useless and so there is no need to reset them + after changing the configuration. + + Signed-off-by: Marcel Holtmann + + + [PATCH] I2C: remove Documentation for i2c-pport + + > > This also raises a question about Documentation/i2c/i2c-pport. + > > Should we keep a document about a driver which is not in the kernel + > > tree (and hasn't even been ported to 2.6 yet)? + > + > No we should not. + + Signed-off-by: Jean Delvare + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] I2C: adm1025 driver ported to 2.6 + + This is my port of the adm1025 driver to 2.6. It has been tested by a + few users and reported to work OK. + + Signed-off-by: Jean Delvare + Signed-off-by: Greg Kroah-Hartman + + + I2C: sparse cleanups for a few i2c drivers. + + + [PATCH] I2C: small ADM1030 fix + + Please find an incremental patch that applies on top of the previous one + (the one from the first message of the thread) and that adds parenthesis + to the macro as pointed out by Mark. + + + Signed-off-by: Greg Kroah-Hartman + + + [PKT_SCHED]: Remove CSZ scheduler. + + It was an experimental hack and never finished off. + + Signed-off-by: David S. Miller + + + [BRIDGE]: Support different MTU sizes. + + This patch adds support for different size MTU's to bridging. + It is useful for bridging Ethernet's with jumbo frames, etc. + + The mtu of the bridge pseudo-device is maintained as the minimum + of all the underlying ports. And when forwarding a frame through + the bridge, it will drop the frame if the outgoing port's MTU + is less than the frame size (as per 802 standard). + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + 1 Wire: add Dallas 1-wire protocol driver subsystem + + This was written and developed by Evgeniy Polyakov + with only very minor cleanups by me. + + Signed-off-by: Greg Kroah-Hartman + + + [PKT_SCHED]: Add jitter support to netem. + + This patch adds jitter if desired to the delayed packets in the + netem scheduler. I dropped the rate stuff out and reorganized so + that an underlying pfifo queue is used (next plan is to make it + have class ops). + + The jitter is given as sigma to a Gaussian normal distribution. The actual + implementation is a reduced form of the table driven stuff in NISTnet + (free). + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [CRYPTO]: Remove lazy allocation from deflate. + + Signed-off-by: James Morris + Signed-off-by: David S. Miller + + + [XFRM]: Add FLUSHSA and FLUSHPOLICY. + + This patch adds FLUSHSA and FLUSHPOLICY to xfrm_user which are + analagous to SADB_FLUSH and SADB_X_SPDFLUSH in af_key. + + This is useful in KMs on startup/shutdown so that the system is + reset to a known state. + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [IPSEC]: Fix uh->len when doing NATT with IP options. + + I just noticed that the UDP header length in esp4_output() is incorrect + when IP options are present (in transport mode). This patch fixes exactly + that. + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [CRYPTO]: Set CRYPTO_TFM_RES_BAD_KEY_LEN in twofish. + + + ia64: Fix EFI physical-mode stubs to correctly calculate physical address + + This fixes a bug in which the Ski simulator ended up getting the wrong + time, since phys_get_time() ended up storing the correct time in the + wrong place if a region-5 virtual address was passed (as would happen + for stack variables of the init-task). On real machines, this bug + likely would have caused a crash on machines which don't support + switching EFI into virtual mode. + + + ia64: Nuke a warning due to the syscall auditing patch. + + + [ARM] Remove asm/hardware.h from SMC91x ethernet driver. + + This include isn't required for ARM builds either. + + + [ARM] Fix allocation of 8390 ethernet device structure in etherh. + + + [IPSEC]: Move generic encap code into xfrm4_output + + I've finally finished merging the general encapsulation code for IPv4. + Here is the patch. + + The idea is basically to make x->type->output similar in structure to + x->type->input. That means moving the tunnel encapsulation and other + generic code out. + + They have ended up in xfrm4_output.c. + + The advantage of this is that we have exactly one copy of the tunnel + encapsulation code. So if we need to change it (e.g., set the TTL + according to the route) then it's easier and less error-prone. + + In fact, in doing so I've already noticed that the ECN wasn't being + copied correctly in everything except xfrm4_tunnel. + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [IPCOMP6]: Exclude IPCOMP header from props.header_len + + Now that the IPv4 encap stuff is out of the way, I'll be sending you + the IPv6 versions. + + Here is the one to remove the unnecessary extra space reserved for + IPCOMP. + + Signed-off-by: Herbert Xu + Signed-off-by: Yoshifuji Hideaki + Signed-off-by: David S. Miller + + + [NET]: Fix dst_underflow_bug_msg printk args. + + + [ARM] Fix two bugs in Acorn expansion card subsystem + + - Setup synchronous expansion card resource. + - Fix order of IRQ and FIQ mask/offsets. + + + [PCMCIA] Use a class interface to provide sysfs attributes. + + Patch from Dominik Brodowski + + + [PCMCIA] Clean up class device attribute registration and fix build error + + + [PATCH] quota: inode->i_flags locking fixes + + The patch fixes locking of i_flags. It removes S_QUOTA flag from i_flags + because it was almost unused and updating it on some places correctly + (under i_sem) would be tricky. Note that accessing of S_NOQUOTA flag is + serialized by dqptr_sem and so we can reliably tested without i_sem. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32: serial console autodetection + + We have something like this in our kernel since many months. It sets the + console device to what OF uses. ppc64 does the same, and it works ok. + serial is found on CHRP, ch-a is used on all powermacs. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32: CPM UART fixes + + Here is a patch to fix some bugs with the current CPM UART code, Tom Rini + has seen this and ok'd it. + + * Fixes need to config both SMC1 & SCC1 + * Fixes buffer descriptor wrapping issue in set_termios + * Fixes confusion in Kconfig regarding CPM1 vs CPM2 + + Signed-off-by: Kumar Gala + Signed-off-by: Pantelis Antoniou + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: uninline some user copy routines + + gcc 3.5 is complaining about the size of copy_from_user. It turns out it + is rather large and putting it out of line saves us about 30kB on a default + kernel build. + + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: fix unbalanced dev_get/put calls in EEH code + + This patch fixes some unbalanced usage of pci_dev_get()/pci_dev_put() calls + in the eeh code. The old code had too many calls to dev_put, which could + cause memory structs to be freed prematurely, possibly leading to bad bad + pointer derefs in certain cases. + + Signed-off-by: Linas Vepstas + Signed-off-by: Paul Mackerras + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: enable EEH on PCI host bridges + + On recent pSeries systems, EEH needs to be enabled even on PCI Host Bridges + (PHB's). If not enabled, then ordinary PCI probing (config-space + reads/writes to the bridges) will generate firmware error messages, + possibly a very large number of messages for systems with large numbers of + pci slots. + + Signed-off-by: Linas Vepstas + Signed-off-by: Paul Mackerras + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: update lparcfg to use seq_file + + From: Will Schmidt + + This patch includes updates and cleanup for the PPC64 proc/lparcfg interface. + - use seq_file's seq_printf for output + - remove redundant e2a function. (use viopath.c's instead) + - change to Kconfig to allow building as a module. + - export required symbols from LparData.c + + Pass # 2 updates.. + - Per Pauls request I've removed the vpurr references, and left + just a stub function get_purr(). + - this should apply clean to latest linus tree. (test-applied against + 2.6.7-rc3). + + Pass # 3 updates... + - Correcting my previously incorrect description of the + lparcfg_count_active_processors() function.. + This is for the cases where we have some number of virtual + processors that are different than the total number of threads + in the system. (i.e. systemcfg->processorcount isnt the desired + value for partition_active_processors) + - moved e2a function into its own file in arch/ppc64/lib. + - changed lparcfg_count_active_processors() to use a while loop + instead of a for loop. + - removed redundant of_node_put in lparcfg_count_active_processors(). + - removed unneeded parms from get-system-parameter rtas_call. + + Signed-off-by: Will Schmidt + Signed-off-by: Paul Mackerras + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] kbuild: clean up module install rules + + Consolidate rules for installing internal and external modules. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] kbuild: sort modules for modpost and modinst + + Process modules in sorted order during modpost and modules install. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] intrinsic automount and mountpoint degradation support + + Here's a patch that I worked out with Al Viro that adds support for a + filesystem (such as kAFS) to perform automounting intrinsically without the + need for a userspace daemon. It also adds support for such mountpoints to be + degraded at the filesystem's behest until they've been untouched long enough + that they'll be removed. + + I've a patch (to follow) that removes some #ifdef's from fs/afs/* thus + allowing it to make use of this facility. + + There are five pieces to this: + + (1) Any interested filesystem needs to have at least one list to which + expirable mountpoints can be added. + + Access to this list is governed by the vfsmount_lock. + + (2) When a filesystem wants to create an expirable mount, it calls + do_kern_mount() to get a handle on the filesystem it wants mounting, and + then calls do_add_mount() to mount that filesystem on the designated + mountpoint, supplying the list mentioned in (1) to which the vfsmount + will be added. + + In kAFS's case, the mountpoint is a directory with a follow_link() method + defined (fs/afs/mntpt.c). This uses the struct nameidata supplied as an + argument as a determination of where the new filesystem should be + mounted. + + (3) When something using a vfsmount finishes dealing with it, it calls + mntput(). This unmarks the vfsmount for immediate expiry. + + There are two criteria for determining if a vfsmount may be expired - it + mustn't be marked as in use for anything other than being a child of + another vfsmount, and it must have an expiry mark against it already. + + (4) The filesystem then determines the policy on expiring the mounts created + in (2). When it feels the need to, it passes the list mentioned in (1) to + mark_mounts_for_expiry() to request everything on the list be expired. + + This function examines each mount listed. If the vfsmount meets the + criteria mentioned in (3), then the vfsmount is deleted from the + namespace and disposed of as for unmounting; otherwise the vfsmount is + left untouched apart from now bearing an expiration mark if it didn't + before. + + kAFS's expiration policy is simply to invoke this process at regular + intervals for all the mounts on its list. + + (5) An expiration facility is also provided to userspace: by calling umount() + with a MNT_EXPIRE flag, it can make a request to unmount only if the + mountpoint hasn't been used since the last request and isn't in use now. + + This allows expiration to be driven by userspace instead of by the + kernel if that is desirable. + + This also means that do_umount() has to use a different version of + path_release() to everyone else... it can't call mntput() as that clears + the expiration flag, thus rendering this unachievable; so it's version of + path_release() calls _mntput(), which doesn't do the clear. + + My original idea was to give the kernel more knowledge of automounted + things. This avoids a certain problem with stat() on a mountpoint causing it + to mount (for example, do "ls -l /afs" on a machine with kAFS), but Al wanted + it done this way. + + > Why is autofs unsuitable? + + Because: + + (1) Autofs is flat; AFS requires a tree - mounts on mounts on mounts on + mounts... + + (2) AFS holds the data as to what the mountpoints are and where they go, and + these may be cross-links to subtrees beyond your control. It's also not + trivial to extract a list of mountpoints as is required for autofs. + + (3) Autofs is not namespace safe. + + (4) Ducking back to userspace to get that to do the mount is pretty tricky if + namespaces are involved. + + In fact, autofs may well want to make use of this facility. + + Signed-Off-By: David Howells + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] kAFS automount support + + Here's a patch to allow the kAFS filesystem to use the automount facility + patch presented in a previous email. + + It allows me to mount an AFS root volume on /afs and then just walk through + the directory structure causing referenced volumes to be automounted and + autoumounted. + + For instance, if I do: + + [root@andromeda root]# mount -t afs \#root.afs. /afs + [root@andromeda root]# ls /afs + asd cambridge cambridge.redhat.com grand.central.org + [root@andromeda root]# ls /afs/cambridge + afsdoc + [root@andromeda root]# ls /afs/cambridge/afsdoc/ + ChangeLog html LICENSE pdf RELNOTES-1.2.2 + + And then look in the mountpoint catalogue, I see: + + [root@andromeda root]# cat /proc/mounts + ... + #root.afs. /afs afs rw 0 0 + #root.cell. /afs/cambridge.redhat.com afs rw 0 0 + #afsdoc. /afs/cambridge.redhat.com/afsdoc afs rw 0 0 + + Then after waiting a few minutes: + + [root@andromeda root]# cat /proc/mounts + ... + #root.afs. /afs afs rw 0 0 + + Is all that remains. + + Signed-Off-By: David Howells + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Fix MCA_LEGACY dependencies + + The patch below against 2.6.7-mm5 fixes more compile errors with + MCA_LEGACY=n. + + Cc: Jeff Garzik + Cc: James Bottomley + Signed-off-by: Adrian Bunk + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Use llseek instead of f_pos= for directory seeking + + nfsd currently just sets f_pos when seeking in a directory. This bypasses + any checking and other handling that a filesystem might want to do. + + So instead, we define "vfs_llseek" to be an exported "llseek", and use + that, both to seek at the start, and the find the new position at the end. + + Thanks to + "Derrick Schommer" + "Trond Myklebust" + + Signed-off-by: Neil Brown + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] remove dead isdn pcmcia code + + The _config function called just before clear DEV_CONFIG, and + DEV_STALE_LINK isn't set anywhere else. This is a copy & paste thing found + in all old pcmcia drivers. + + The patch has been sent to the isdn list ages ago but I didn't get any + response. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] kallsyms ppc32 fix + + PPC small data area base symbols shift between kallsyms phases 1 and 2, which + makes the kallsyms data unstable. Exclude them from the kallsyms list. + + Signed-off-by: Keith Owens + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] update kernel-parameters.txt for the noexec option + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] cfq: bad allocation + + Arjan (sensibly) put a might_sleep() in mempool_alloc() and it caught a bad + cfq usage. + + Signed-off-by: Jens Axboe + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] FAT: update document + + Signed-off-by: OGAWA Hirofumi + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Use NULL instead of integer 0 in security/selinux/ + + Fixup another round of sparse warnings of the type: + warning: Using plain integer as NULL pointer + Acked by Stephen. + + From: Mika Kukkonen + Signed-off-by: Chris Wright + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] int return to unsigned in smb_proc_readdir_long() in fs/smbfs/proc.c + + CC [M] fs/smbfs/proc.o + fs/smbfs/proc.c: In function `smb_proc_readdir_long': + fs/smbfs/proc.c:2313: warning: comparison of unsigned expression < 0 is always false + fs/smbfs/proc.c:2467: warning: comparison of unsigned expression < 0 is always false + + The first one is pretty dangerous looking, as smb_proc_readdir_long() can + return several negative error values and all those are converted to + unsigned and then erronously pass the test on line 2313. Chris Wright gave + it a quick look and we did not see immediately if this can be remotely + exploited, but it looks pretty scary. + + The second warning on line 2467 is just extra so I just removed it. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] trivial: scripts_kernel-doc: ignoring embedded structs shouldn't be + + From: + + Imagine you have a code similar to + + struct foo { + union { + struct tcphdr *th; + } h; + union { + struct iphdr *iph; + } nh; + }; + + kernel-doc in it's current state will happily eat everything from first '{' to + last '}' and nobody will see parameter 'h' in documentation (look at + include/linux/skbuff.h:struct sk_buff for real world example). + + So, fix the greedy regexp. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] trivial: scripts_kernel-doc: missing bracket. + + From: + + Fix missing bracket when parameter to be documented is a pointer to function. + + int (* resume (struct usb_interface *intf); + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] trivial: little arch_i386_kernel_timers_timer_none.c fix + + fixes a cut'n'paste error... + + Signed-off-by: Rusty Trivial Russell + Signed-off-by: Adam Lackorzynski + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] trivial: RCS___IGNORE quilt backup files + + From: David Gibson + + This patch excludes the .pc directory from the same things that + SCCS/BitKeeper/.svn/CVS files are excluded from. The .pc directory is used + for backup/reference files by quilt, a patch mangling system conceptually + derived from akpm's patch scripts. Excluding the .pc directory is handy, + because otherwise old versions of files found in there tend to end up at the + front of the TAGS index. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] trivial: remove warning in ftape + + From: Chris Heath + + Here's a trivial patch that removes an unused-variable warning in ftape. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] trivial: arch_i386_kernel_scx200.c: kill duplicate #include + + From: (Arthur Othieno) + + via scripts/checkincludes.pl: + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] trivial: kill off CONFIG_PCI_CONSOLE + + (OK from maintainer Geert Uytterhoeven ) + From: a.othieno@bluewin.ch (Arthur Othieno) + + AFAICS, CONFIG_PCI_CONSOLE isn't used elsewhere: + + hubb@mars:linux-2.6.2$ grep -r PCI_CONSOLE * | grep -v defconfig + drivers/video/console/Kconfig:config PCI_CONSOLE + hubb@mars:linux-2.6.2$ + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] convert uses of ZONE_HIGHMEM to is_highmem + + As the comments in mmzone.h indicate is_highmem() is designed to reduce the + proliferation of the constant ZONE_HIGHMEM. This patch updates references + to ZONE_HIGHMEM to use is_highmem(). None appear to be on critical paths. + + Signed-off-by: Andy Whitcroft + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] smbfs compilation warning fix + + Use %Zd to eliminate a compiler warning in printk. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Remove always false check in mm/slab.c + + CC mm/slab.o + mm/slab.c: In function `kmem_cache_create': + mm/slab.c:1129: warning: comparison of unsigned expression < 0 is always false + + This comes from the fact that 'align' is size_t and so unsigned. Just to be + sure, I did + $ grep __kernel_size_t include/*/posix_types.h + and yes, every arch defines that to be unsigned. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Correct return type of hashfn() in fs/dquot.c + + CC fs/dquot.o + fs/dquot.c:208: warning: type qualifiers ignored on function return type + + Once again with extra gcc warnings enabled. Every user of the function is + expecting unsigned value, not int in first place, and I think the const is + just misplaced. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Fix misplaced 'inline' in include/linux/iso_fs.h + + CC [M] fs/isofs/namei.o + In file included from fs/isofs/namei.c:10: + include/linux/iso_fs.h:280: warning: `inline' is not at beginning of declaration + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] pagefault readaround fix + + Mika Kukkonen says: + + CC mm/filemap.o + mm/filemap.c: In function `filemap_nopage': + mm/filemap.c:1161: warning: comparison of unsigned expression < 0 is always false + + The pagefault readaround code is currently doing purely readahead. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] slab: fix get_user inside spinlock + + This little debugging __get_user is in fact happening inside a spinlock. It + was never very useful, and has caused problems for some architectures in the + past. Let's just remove it. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] alpha: print the symbol name in Oops + + Cc: Richard Henderson + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] port ACPI sleep workaround to new DMI probing + + This patch moves Toshiba ACPI sleep workaround out of dmi_scan.c + + Signed-off-by: Andrey Panin + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] DMI isn't broken anymore + + This patch removes dmi_broken global variable which is not used anymore. + + Signed-off-by: Andrey Panin + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix CRC16 misnaming + + As pointed by Thomas Sailer, crc16.c module contains CRC16-CCITT (x^16 + x^12 + + x^5 + 1) implementation, not IBM CRC16 (x^16 + x^15 + x^2 + 1) one. Looks + like we need to rename it accordingly and this patchset does exactly this. + + Signed-off-by: Andrey Panin + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] crc16 kconfig touchups + + drivers/net/hamradio/Kconfig:116:warning: 'select' used by config symbol 'BAYCOM_SER_FDX' refer to undefined symbol 'CRC16' + drivers/net/hamradio/Kconfig:136:warning: 'select' used by config symbol 'BAYCOM_SER_HDX' refer to undefined symbol 'CRC16' + drivers/net/hamradio/Kconfig:154:warning: 'select' used by config symbol 'BAYCOM_PAR' refer to undefined symbol 'CRC16' + drivers/net/hamradio/Kconfig:169:warning: 'select' used by config symbol 'BAYCOM_EPP' refer to undefined symbol 'CRC16' + net/irda/Kconfig:8:warning: 'select' used by config symbol 'IRDA' refer to undefined symbol 'CRC16' + drivers/net/Kconfig:1749:warning: 'select' used by config symbol 'VIA_VELOCITY' refer to undefined symbol 'CRC16' + drivers/net/Kconfig:2465:warning: 'select' used by config symbol 'PPP_ASYNC' refer to undefined symbol 'CRC16' + drivers/isdn/hisax/Kconfig:403:warning: 'select' used by config symbol 'HISAX_ST5481' refer to undefined symbol 'CRC16' + drivers/isdn/hisax/Kconfig:7:warning: 'select' used by config symbol 'ISDN_DRV_HISAX' refer to undefined symbol 'CRC16' + drivers/isdn/tpam/Kconfig:7:warning: 'select' used by config symbol 'ISDN_DRV_TPAM' refer to undefined symbol 'CRC16' + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] CRC16 renaming in AX25 drivers + + Signed-off-by: Andrey Panin + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] CRC16 renaming in IRDA drivers + + Signed-off-by: Andrey Panin + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] CRC16 renaming in ISDN drivers + + Signed-off-by: Andrey Panin + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] CRC16 renaming in PPP driver + + Signed-off-by: Andrey Panin + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sh64: cpumask cleanup. + + With the recent cpumask changes, some things ended up being broken on sh64. + This fixes them.. + + Signed-off-by: Paul Mundt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sh64: Fix init_task.c build. + + resource.h was falling a bit behind, so we use the asm-sh version instead. + This exposed another compile issue with init_task.c, which in turn needed + linux/mqueue.h. + + Signed-off-by: Paul Mundt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sh64: Add asm-sh64/setup.h + + With the recent changes to init/main.c, we need an asm-sh64/setup.h. This + pulls out the definitions from arch/sh64/kernel/setup.c and moves them to + setup.h instead. + + Signed-off-by: Paul Mundt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sh64: defconfig update. + + This just updates the defconfig against current BK. + + Signed-off-by: Paul Mundt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] tmpfs: scheduling-while-atomic fix + + Nick has tracked scheduling-while-atomic errors to shmem's fragile kmap + avoidance: the root error appears to lie deeper, but rework that fragility. + Plus I've been indicted for war crimes at the end of shmem_swp_entry: my + apologia scorned, so now hide the evidence. + + Signed-off-by: Hugh Dickins + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ad1889 warning fix + +   CC [M]  sound/oss/ad1889.o +           sound/oss/ad1889.c: In function `ad1889_ac97_init': +           sound/oss/ad1889.c:854: warning: comparison is always false +                                   due to limited range of data type + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] writepage fs corruption fix + + Fix a data loss bug in mpage_writepages(), triggerable under extreme memory + pressure on ext2, JFS, hfs and hfsplus: + + The bug is the marking of the bh clean despite we could still run into the + "confused" path. After that the confused path really becomes confused and it + writes nothing and fs corruption triggers silenty (the reugular writepage only + writes bh that are marked dirty, it never attempts to submit_bh anything + marked clean). The mpage-writepage code must never mark the bh clean as far + as it wants to still fallback in the regular writepage which depends on the bh + to be dirty (i.e. the "goto confused" path). This could only triggers with + memory pressure (it also needs buffer_heads_over_limit == 0, and that is + frequent under mm pressure). + + Thanks a lot to Chris for his fine debugging that localized the problem in the + writepage code. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] __block_write_full_page() comment fixups + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] mpage_writepages() i_size reading fix + + I believe reading the i_size from memory multiple times can generate fs + corruption. The "offset" and the "end_index" were not coherent. this is + writepages and it runs w/o the i_sem, so the i_size can change from under + us anytime. If a parallel write happens while writepages run, the i_size + could advance from 4095 to 4100. With the current 2.6 code that could + translate in end_index = 0 and offset = 4. That's broken because end_index + and offset could be not coherent. Either end_index=1 and offset =4, or + end_index = 0 and offset = 4095. When they lose coherency the memset can + zeroout actual data. The below patch fixes that (it's at least a + theoretical bug). + + I don't really expect this tiny race to fix the bug in practice after the + more serious bugs we covered yesterday didn't fix it (more likely the + compiler will get involved into the equation soon ;). + + This is also an optimization for 32bit archs that needs special locking to + read 64bit i_size coherenty. + + This patch also arranges for mpage_writepages() to always zero out the file's + final page between i_size and the end of the file's final block. This is a + best-effort correctness thing to deal with errant applications which write + into the mmapped page beyond the underlying file's EOF. + + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] s390: signals & exceptions + + From: Martin Schwidefsky + From: Ulrich Weigand + + s390 core changes: + - Add signo between signal frame and the signal return instruction on the + user stack for backtrace over signal handlers. + - Add hfp floating point exceptions. + - Use a single function for region, segment and page translation exceptions. + - Discard SIGTRAP for single stepped instructions if the trapping instruction + is repeated (normal memory faults) or if another signal is delivered anyway. + + Signed-off-by: Martin Schwidefsky + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] s390: cpu hotplug bugs + + [PATCH] s390: cpu hotplug bugs. + + From: Ursula Braun-Krahl + From: Martin Schwidefsky + + iucv driver changes: + - Fix iucv declare/retrieve buffer which the cpu hotplug patch has broken. + - Make smp_call_function_on call func(info) in non-smp kernels. + - Use a spinlock to get smp_get_cpu/smp_put_cpu race free. + + Signed-off-by: Martin Schwidefsky + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix (UDF_FS=y && NLS=m) compile error + + The patch below fixes Bugzilla #3030 ((UDF_FS=y && NLS=m) results in a + compile error). + + Signed-off-by: Adrian Bunk + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] remove outdated ext2 help text parts + + The patch below solves Bugzilla #3014 by removing much outdated information + from the ext2 help text. + + The help text is now very short, but few correct information is better than + outdated information - and if you think it's too short, feel free to send a + patch that adds more current information. + + Signed-off-by: Adrian Bunk + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] remove drivers/char/h8.{c,h} + + CONFIG_H8 in drivers/char/ depends in both 2.4 and 2.6 on + CONFIG_OBSOLETE which is never enabled. + + To remove this driver, the following is required additionally to the + patch below: + rm drivers/char/h8.c + rm drivers/char/h8.h + + This patch was already ACK'ed by Richard Henderson. + + Signed-off-by: Adrian Bunk + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] kill IKCONFIG_VERSION + + The patch below (already ACK'ed by Randy Dunlap) kills the unused + IKCONFIG_VERSION from kernel/configs.c . + + This patch is based on a previous patch by Anton Blanchard and an idea of + Bartlomiej Zolnierkiewicz. (I hope I haven't forgotten anyone who contributed + to this patch. ;-) ) + + Signed-off-by: Adrian Bunk + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + ppc64: export the user copy functions. + + When Anton uninlined them, he didn't remember to export them + to modules.. + + + [PATCH] sparse: removal of iovec use in mtd + + mtd, jffs and jffs2 switched from iovec to kvec + + + [PATCH] sparse: NULL noise is mtd + + 0->NULL conversions in mtd + + + [PATCH] sparse: NULL noise in jffs + + + [PATCH] sparse: NULL noise in jfs + + + Linux 2.6.8-rc1 + + + Remove obsoleted drivers/char/h8.c drivers/char/h8.h. + + + [ARM] ohci-omap does not need asm/mach-types.h + + + clean up NULL vs. 0 warnings generated by sparse tool + + + [SPARC64]: Add CMT register defines. + + + [IPV4]: Remove no longer available URL. + + This patch solves Bugzilla #2445 by removing a no longer available URL + from the help text for NET_IPIP. + + Noted by Nils Hammar . + + Signed-off-by: Adrian Bunk + Signed-off-by: David S. Miller + + + [SPARSE]: Fix warnings in net/sctp/ + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [NETFILTER]: Add timestamping to ipt_ULOG + + After Andi's timestamp optimizations we don't have any timestamps on the + packets unless someone requested them. Here's a patch for 2.6 to + explicitly timestamp the packets before we log them. + + Harald approved it some time ago, he's pretty busy so I'm sending it + instead. + + Signed-off-by: Martin Josefsson + Signed-off-by: David S. Miller + + + x86: fix stackframe ownership confusion in sys_sigaltstack() + + gcc doesn't understand that "asmlinkage" routines have the + argument stack owned by the assembly-language caller, and the + recent sparse cleanup made gcc think it owns enough stack + frame space to make a tailcall by overwriting "struct pt_regs" + that is set up by the low-level system call code. + + Hide that problem again. + + The real fix would be to tell gcc that the caller owns the + stack frame that it set up, but we don't have any such + interfaces, so for now the best we can do is to hide it. + + + [SPARC32]: Don't allow the kernel to read PAGE_NONE pages. + + + [SPARC64]: Update defconfig. + + + [PATCH] sparse: NULL noise in fs/reiserfs + + + [PATCH] sparse: misc NULL noise in fs/* + + + [PATCH] sparse: aacraid annotation + + + [PATCH] sparse: megaraid inline fixes + + inlined functions moved, a couple of heavy-weight ones (issue_scb() + and meg_cmd_done()) uninlined. + + + [PATCH] sparse: megaraid annotation + + + [PATCH] sparse: NULL noise in drivers/isdn + + + [PATCH] sparse: misc NULL noise in drivers/* + + + [PATCH] sparse: ISDN ->readstat() and ->writecmd() annotation + + ->readstat() and ->writecmd() are always getting a userland pointer; + marked argument as such, killed "user" flag, killed dead code. + + + [PATCH] sparse: blind dereference of userland pointers in divasproc + + + [PATCH] sparse: drivers/isdn/* annotation + + + [PATCH] sparse: dvb_ringbuffer_pkt_write()/dvb_ringbuffer_write() annotation + + copy_from_user() moved from dvb_ringbuffer_{write,pkt_write}() to callers; + these functions are always getting kernel pointer now. "usermem" argument + killed, code annotated. + + + [PATCH] sparse: blind dereference of userland pointers in ac7110 + + + [PATCH] sparse: drivers/media/* annotation + + + JFS: Add d_hash and d_compare operations for case-insensitive names + + JFS supports OS/2-compatibility with case-insensitive file names. + To avoid multiple dentries for these names, jfs needs to provide + the d_hash and d_compare dentry_operations. The operations are + only used when the volume was created in OS/2 or with the -O flag. + + + [PATCH] ia64: build fixes for IA64_MCA_DEBUG_INFO + + Make mca.c build again with debug enabled. + + Signed-off-by: Keith Owens + Signed-off-by: David Mosberger + + + [PATCH] ia64: Reduce TLB flushing during process migration + + This patch adds an architecture-specific callout after explicit + processor migrations. The callout allows architectures (or platforms) + to update TLB specific information (ex., cpu_vm_mask). + + Signed-off-by: Jack Steiner + Signed-off-by: David Mosberger + + + [ARM PATCH] 1958/1: make collie use INIT_MACHINE + + Patch from John Lenz + + make collie use the new INIT_MACHINE macro instead of arch_initcall. + + + [ARM PATCH] 1961/1: S3C2410 - fix for UART FIFO size calculation + + Patch from Ben Dooks + + Fixes calculation of how many bytes in the RX/TX FIFOs. + + Previous code failed to check wether the full flags + where set before returning the byte counter. This + should ensure that the serial driver behaves correctly + when the FIFO fills, and not just ignore the input + data + + + [ARM PATCH] 1962/1: S3C2410 - Rename MACH_VR1000 to Thorcom-VR1000 + + Patch from Ben Dooks + + Place correct machine name for VR1000 in machine + support file. + + + Set Type field when creating block/char/pipe e.g. via mknod. + Fixing problem mentioned by Jeremy Allison + + remove spurious warning message logged on mount with credentials file (pointed + out by Richard Hughes) + + Signed-off-by: Steve French (sfrench@us.ibm.com) + + + Set DevMajor/DevMinor when querying info on remote char/block devices + + Signed-off-by: Steve French (sfrench@us.ibm.com) + + + [PATCH] sparse: switching afs to kvec + + - afs and rxrpc switched to kvec; definition of kvec moved to uio.h (duh). + - afs/mntpt.c got missing cast added. + + at that point afs is sparse-clean and rxrpc has only one remaining warning + (setsockopt from local variable, protected by set_fs()). + + + [PATCH] sparse: VIDIOCSWIN compat_ioctl fixes + + In handling of VIDIOCSWIN for 32bit on 64bit platforms: + * switched to compat_alloc_user_space() + * fixed memory corruption in copying arguments from userland + * fixed arithmetic overflows + * added missing checks for get_user() results + and corresponding returns with -EFAULT. + + + [PATCH] sparse: usb ioctl cleanups + + usb ioctls in compat_ioctl.c switched to compat_alloc_user_space() + and cleaned up; ioctl structures annotated. + + + [PATCH] sparse: isdn compile fix for platforms with HZ > 1000 + + Division by zero is an ugly thing... We are safe wrt overflows, + since the maximal value we ever pass is 10000 - not enough to overflow + unless you've got a platform with HZ > 200000. + + + [PATCH] sparse: saa fix + + direct write to userland pointer. + + + [PATCH] sparse: compile fix for rrunner on big-endian platforms + + bitrot strikes again... + + + [PATCH] sparse: tms380tr.c fix + + tms380tr is used both by ISA and PCI drivers. Enabling/disabling + DMA is done only for ISA ones (it's protected by if (dev->dma > 0) and + PCI ones leave it 0), but it's compiled unconditionally. Which breaks + on platforms that don't have that ISA crap at all, but support PCI just + fine. Code in question placed under ifdef CONFIG_ISA. + + + [PATCH] sparse: NULL noise removal in drivers/sbus + + + [PATCH] sparse: drivers/sbus fixes + + a) vfc is not 64bit-clean, marked as such in Kconfig + b) aurora is simply broken - still uses tqueues. Marked as broken. + c) vfc does dereferencing of userland pointer, right after having + carefully copied the data to kernel space ;-) Fixed. + d) vfc ->mmap() had missed prototype change. Fixed. + e) BPP ioctls are misdeclared - they should've been _IO(...) instead + of _IOR(..., void). Too late to fix, but we can at least make them + _IOR(..., char) - same value, but doesn't try to find sizeof(void). + + + [PATCH] sparse: drivers/sbus annotation + + + [PATCH] sparse: alpha NULL noise removal + + + [PATCH] sparse: alpha sparse infrastructure + + * added usual CHECK assignment in Makefile + * switched uaccess.h to __check_uptr() + * added L on long constants (ones missed earlier) + * added __user in osf_sys.c (duh - I've added __user to cast in + the initializer, but forgot to add it in declaration) + + + [PATCH] sparse: alpha topology.h compile fix + + Missing bits of cpumask_t conversion + + + [PATCH] sparse: signal annotation + + ss_sp in struct sigaltstack made __user + ->si_addr and ->sival_ptr made __user + your ->sa_restorer and ->sa_handler changes propagated + users of these guys annotated on i386/amd64/alpha/sparc/sparc64 + + + [PATCH] sparse: arch/* NULL noise removal + + + [PATCH] sparse: ipc compat annotations and cleanups + + ipc compat code switched to compat_alloc_user_space() and annotated. + + + [PATCH] sparse: gemtek ioctl fix + + Dumb Typo(tm) - the first bug caught by 0/NULL checks (arg is + really a kernel pointer there, so memset() is actually OK - results + will be copied to userland by caller. Or would be, if we would not + oops ;-) + + + [PATCH] sparse: drivers/media NULL noise removal + + + [PATCH] sparse: drivers/net partial NULL noise removal + + + [PATCH] sparse: drivers/usb NULL noise removal + + + [PATCH] sparse: net/* NULL noise removal + + + [PATCH] sparse: assorted drivers/* NULL noise removal + + + [PATCH] sparse: more fs/* NULL noise removal + + (partially based on patch from Mika Kukkonen) + + + [PATCH] __vfs_follow_link() made inline again + + __vfs_follow_link() really should be inline; that's a special case since + we are in the middle of recursion and really want to conserve stack + space. Moved before the first use, made inline again. + + + [PATCH] compat_fillonedir() warning fix + + access_ok() expects a pointer, not unsigned long. It's not a + problem on platforms that have this guy done as a macro (or ones that + do not use fs/compat.c at all), but that's still wrong and on some + platforms that care we actually have access_ok() as inlined function. + Bogus cast removed. + + + ppc64: fix up si_addr usage + + Al's last changes mean that it is now annotated as a user + pointer, and we want to avoid warnings. + + + [PATCH] pmac_zilog: initialize port spinlock on all init paths + + pmac_zilog: initialize the serial ports' spinlocks even if console over + serial is not enabled; disable this driver by default for ppc + + This lock not being initialized was Oopsing my TiBook :-P + + Signed-off-by: David Eger + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Fix 3c59x.c uses of plain integer as NULL pointer + + This patch will fix 3Com "Vortex" and "Boomerang" ethernet driver sparse + warnings about using plain integer as NULL pointer. + + Signed-off-by: Petri T. Koistinen + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] small style fixups for the new automount code + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] #ifndef guard percpu_counter.h and blockgroup_lock.h + + Insert header guards to allow possible multiple inclusion for + include/linux/percpu_counter.h and include/linux/blockgroup_lock.h + + Signed-off-by: Adrian Bunk + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] floppy.c: remove superfluous variable initialization + + From: Kam Leo + + Signed-off-by: Adrian Bunk + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] `unknown symbol' in sound/oss/kahlua.ko needs unknown symbol udelay + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] remove struct_cpy() + + Only two architectures implement it, so afs broke the build. + + Remove struct_cpy() altogether, and use structure assignments. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] autoselect FAT_FS in config + + Signed-off-by: OGAWA Hirofumi + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix saa7146 compilation + + From: Colin Leroy + + This patch fixes a compilation error on 2.6.8-rc1. Here's the error: + drivers/media/common/saa7146_video.c:3: conflicting types for `memory' + include/asm-m68k/setup.h:365: previous declaration of `memory' make[3]: *** + [drivers/media/common/saa7146_video.o] Error 1 + + Signed-off-by: Colin Leroy + Signed-off-by: Michael Hunold + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix return codes after i2c_add_driver() in tea6415c and tea6420 + + In two of my i2c helper drivers the return value of i2c_add_driver() is + ignored. Thanks to Arthur Othieno for finding these bugs. + + Signed-off-by: Arthur Othieno + Signed-off-by: Michael Hunold + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] remove outdated Stallion contact information + + The patch below (applies against both 2.4 and 2.6) removes the bouncing + email address from all files and removes the outdated MAINTAINERS entry. + + Signed-off-by: Adrian Bunk + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix ia64 early_printk build problem + + Rename PCDP_TABLE_GUID back to HCDP_TABLE_GUID to get the file to compile + again. This change is against current 2.6 BK and is under + CONFIG_IA64_EARLY_PRINTK_UART. + + Signed-off-by: Bjorn Helgaas + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sparse: read_descriptor_t annotation + + We have a fun situation with read_descriptor_t - all its instances end + up passed to some actor; these actors use desc->buf as their private + data; there are 5 of them and they expect resp: + + struct lo_read_data * + struct svc_rqst * + struct file * + struct rpc_xprt * + char __user * + + IOW, there is no type safety whatsoever; the field is essentially untyped, + we rely on the fact that actor is chosen by the same code that sets ->buf + and expect it to put something of the right type there. + + Right now desc->buf is declared as char __user *. Moreover, the last + argument of ->sendfile() (what should be stored in ->buf) is void __user *, + even though it's actually _never_ a userland pointer. + + If nothing else, ->sendfile() should take void * instead; that alone removes + a bunch of bogus warnings. I went further and replaced desc->buf with a + union of void * and char __user *. + + + [PATCH] sparse: missing cpumask_t bits on sparc + + (no, it still doesn't fix sparc32-smp - just partial compile + fixes ;-/) + + + [PATCH] sparse: aout32 sparse fixes for compat + + this basically repeats the stuff done to fs/binfmt_aout.c for amd64 + and sparc64 aout32. + + + [PATCH] sparse: __forced added to casts in arch-specific code + + Casts from __user to address-space-agnostic in amd64 and i386 + made explicit (__force added; in these places we pass userland pointer + to arch-specific code that handles kernel and userland pointers the + same way). + csum_partial_copy_*() annotated properly + + + [PATCH] pointer-to-int done the canonical way + + Extraction of int from pointer is slightly broken in several places. + + + [PATCH] sparse: more drivers/scsi annotations + + Almost all are trivial, aacraid/linit.c annotations had caught a bug - + copy_from_user() where copy_in_user() should've been. + + + [PATCH] sparse: a couple of inline fixes in drivers'/scsi + + Usual "inline used before definition" fixes in nsp32.c and sg.c + + + [PATCH] sparse: more drivers/usb/* annotations + + + [PATCH] sparse: #if where #ifdef should've been (saa7146) + + + [PATCH] sparse: (ipv6/netfilter) initializer fix + + Missing '=' in C99 initializer + + + [PATCH] sparse: sound compat ioctls annotations + + Trivial annotations + typo fix in _snd_ioctl32_hwdep_dsp_image() + (we want to copy 32bit structure from userland, convert it to native one + and do normal ioctl on it; see the first changed line below for what's + really happening...) + + + [PATCH] mcdx irq handling cleanup + + mcdx has different IRQ numbers for all drives; irq handler needs a + pointer to structure describing the drive in question. However, instead + of passing such pointer at request_irq() time and having it passed to + mcdx_intr() for free, mcdx.c sticks the pointer in question into an + array indexed by IRQ number and has mcdx_intr() go look it up there. + + Cleaned up, array killed. + + + [PATCH] mconf.c: Honor $LINES and $COLUMNS if TIOCGWINSZ failed + + While reading code, I found this buglet. If the TIOCGWINSZ fails, + mconf.c assumes 24/80 as screen size, without honoring the LINES and + COLUMNS environment variables. This is the shorter and IMHO more + correct version. + + Signed-off-by: Jan-Benedict Glaw + Signed-off-by: Linus Torvalds + + + [PATCH] Fix 'unsigned' < 0 checks + + Using "-W" found a few places that should probably use signed + variables since they can contain (and check for) negative error + values. + + + [netdrvr pci-skeleton] refresh + + Here it is. The patch fixes all compile errors and warnings in + pci-skeleton.c. The "debug" parameter lacks corresponding variable, + so I removed it to avoid a warning on module load. Obsolete + pci_power_on() and pci_power_off() have been replaced with the new + code using pci_set_power_state(), pci_save_state() and + pci_restore_state(). The driver has been tested by compiling it as + module and as part of the kernel. + + + [PATCH] [TRIVIAL 2.6] sk98lin: kill dup include + + From: a.othieno@bluewin.ch (Arthur Othieno) + + + [netdrvr dmfe] remove ALi pci id + + It's tulip driver, and tulip driver performs better than dmfe + (yet some distro installers pick this driver to use). + + Requested by ALi. + + + [PATCH] prism54 Fix wrong type for BSSID + + 2004-07-12 Margit Schubert-While + + * The OID type for BSSID was incorrectly set to type SSID. + It should be type RAW. This lead to interesting reporting + by "iwpriv ethX g_bssid". + (Which caused garbage output and possibly an out of bound) + + * Be ultra-cautious in reporting SSID by changing the "%s" + to "%.*s" and passing the length. (Prompted by the false + type above, whereby length = 0 and a %s on a garbage field) + + + [PATCH] fix airo oops-on-removal + + From: Bill Nottingham + + airo creates /proc/driver/aironet/ on device activation. + However, the device can be renamed - then on teardown it tries to remove + the wrong directory. The removal of /proc/driver/aironet then runs afoul + of the BUG_ON() in remove_proc_entry. + + This fixes it by keeping a copy of the name of the directory it created. + + (It doesn't actually solve the problem of the stats directory still being + /proc/driver/aironet/eth0 when you rename the device to, say, 'joe'. But + that patch would be a little less trivial.) + + Signed-off-by: Andrew Morton + + + [PATCH] I2C: Remove extra inits from lm78 driver + + This patch is from the lm_sensors project CVS, from this revision: + + 1.63 (mds) remove initialization of limits by driver + + It is better to set these limits by a combination of /etc/sensors.conf + and 'sensors -s'; "mechanism not policy." Please apply. + + Signed-off-by: Mark M. Hoffman + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] I2C: Refine detection of LM75 chips + + The LM75 detection method was a bit loose so far and would accept + non-LM75-compatible chips from times to times. It should be better now. + Additionally, the help for the lm75 driver was reworked because we now + know that the LM75 and the LM77 are not compatible. + + + Signed-off-by: Jean Delvare + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] tg3 bug + + During receive processing, the tg3 card updates rx_producer (the + hardware position in the receive ring) and the opaque cookie. Due to PCI + rules the stores happen in order. However the cpu may reorder the reads. + + In these sort of cases there is usually a data dependency between + reading the index and looking up the data (since we use the index to + load the data). I think all cpus except alpha guarantee the reads + happen in order in this case. + + However in this particular case we load hw_idx, compare it to sw_idx and + then use sw_idx to locate the opaque cookie. There is no data dependency + in this case. We need a read memory barrier between the read of + rx_producer and the opaque cookie to enforce ordering. + + Thanks to Olof Johansson, Michael Chan and Broadcom for their assistance + in finding this bug. + + Signed-off-by: Anton Blanchard + + + [netdrvr tg3] bump version and reldate + + + [wireless airo] fix alignment problem (particularly on ARM) + + Bugzilla #2905 + + + [netdrvr acenic] fix RX descriptor memory ordering + + + [PATCH] libata: fix kunmap() of incorrect page, in PIO data xfer + + Obvious bug. Fixes highmem oops. + + + [PCI, libata] Fix "combined mode" PCI quirk for ICH6 + + The hardware vendor, in their infinite wisdom, make the combined + mode configuration register different between ICH5 and ICH6. + + Take this into account. + + + [PATCH] USB: add 3 Phidget device ids to the HID blacklist. + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Add usb_kill_urb() + + This patch is a slightly revised version of as277c, updated to match the + current source. The only difference from the older version is that this + makes urb->use_count into an atomic_t, to avoid the overhead of an extra + locking step each time an URB is submitted and given back. The important + features of this patch are: + + -EPERM added to Documentation/usb/error-codes.txt. + + Failure to use URB_ASYNC_UNLINK with usb_unlink_urb() is + deprecated in the documentation. + + New ->reject and ->use_count fields added to struct urb. + The reject field is protected by urb->lock, and locking is + required only in usb_kill_urb() which doesn't have to be fast. + + Single wait_queue used for all processes waiting inside + usb_kill_urb(). The wait queue is woken up only when an URB + is given back with ->reject set. + + usb_rh_status_dequeue() changed to return int. It looks like + this function should be declared static; it's not used outside + the hcd.c file. + + Prototype for unlink_urb() in struct usb_operations is changed + to include a status code argument. This is necessary so that + the different unlink paths can return -ENOENT and -ECONNRESET + as appropriate. + + Support for synchronous usb_unlink_urb() has been removed; + such calls are passed to usb_kill_urb(). + + Kerneldoc for usb_unlink_urb() is updated. + + usb_kill_urb() added to urb.c. + + hc_simple() host driver is partially updated -- it should + compile but it won't really work right. + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Make hub driver use usb_kill_urb() + + This is a rerun of as278, updated to match the current source. It changes + the hub driver, replacing calls to synchronous usb_unlink_urb() with + usb_kill_urb() and removing the machinery formerly needed to synchronize + the status URB handler with the rest of the driver. + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Don't ask for string descriptor lengths + + Okay, here's a revised patch (as332b). This tries first to ask for 255 + bytes, and if that fails then it asks for the length and the full + descriptor. Hopefully nobody will object to applying this version... + + You know, it occurs to me that the have_langid field in usb_device could + easily be eliminated. Just set string_langid to -1 during initialization + and test for whether or not it is >= 0. I'll do that some other time. + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Store pointer to usb_device in private hub structure + + This patch adds a pointer to the hub's usb_device into the usb_hub private + structure. It's a small change, and permits a small amount of + simplification in a few spots, i.e., avoid calling interface_to_usbdev(). + This doesn't really do much in itself, but it's a prerequisite for the + next patch. (A situation arises where we can't use the interface pointer + to find the usb_device because the interface might not exist.) + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: fix up the wording in the emi26 firmware file to match the other kernel firmware files. + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: more sparse cleanups (all pretty much NULL usages.) + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: fix lockup with 2.6 keyspan_pda driver + + I suggest to put the pointer to port instead of the pointer to the + pointer to port to the workqueue data. + Did that driver ever work with 2.6? + + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Trivial fix to include/linux/usb.h + + Hi Greg! + + I am compiling allmodconfig with some extra gcc warnings enabled + (-W -Wno-unused -Wno-sign-compare -Winline -Wundef) and got this one: + + CC [M] security/root_plug.o + In file included from security/root_plug.c:30: + include/linux/usb.h:358: warning: `inline' is not at beginning of declaration + + Patch is trivial: + + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Fix endianness bug in UHCI driver + + This patch fixes a byte-swapping error in the UHCI driver. It has been + present since 2.6.6 and only got tracked down just now! Thanks a lot to + Michel Roelofs for all his help and testing. + + This should be pushed through to Linus in time to appear in 2.6.8, if + possible. + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: more sparse fixups that found a real bug in the se401 driver + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: fix usbfs mount options ignored bug + + Ok here is a patch to make the mount options work. In addition to + implementing the remount function, it removes the parse_options() call + from usb_fill_super and adds a "ignore" flag around the mounting that gets + done in create_special_files. The parse_options call in usb_fill_super is + removed because it is not needed when remount is implemented. The + ignore_mount flag is needed because the simple_pin_fs function calls + remount with no mount options - i.e. it's not a real mount. So the mount + options would be cleared out. The ignore_mount flag causes the remount + function to only act on real mounts. + + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: usb/core/file.c::usb_major_init() cleanup. + + This patch does a cleanup for usb/core/file.c::usb_major_init(), which + is: + + *) in error condition, returns the error code from register_chrdev(), + insted returning -EBUSY; + + *) adds missing audit for class_register(); + + *) only calls devfs_mk_dir() if the prior calls have success. + + + Signed-off-by: Luiz Capitulino + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: Allow NULL argument in usb_unlink_urb() and usb_kill_urb() + + It makes sense for APIs involved in cleanup activities (like kfree()) to + accept NULL arguments. Doing so frees drivers from the responsibility of + checking whether each resource was actually acquired before trying to + release it. Accordingly, this patch makes usb_unlink_urb() and + usb_kill_urb() accept a NULL pointer (which used to be acceptable until I + changed it) and notes explicitly in the kerneldoc that such arguments are + permitted. + + + Signed-off-by: Alan Stern + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: usbnet:ax8817x - use interrupt URB for link detection + + This patch uses the interrupt URB on the ax8817x for link detection. + This allows the driver to notify userspace when link drops/comes back + so it can take action such as run dhclient, etc. + + I was also able to reduce the bind function by using some of the stock + mii_xxx calls as well as my own for handling initial link negotiation. + + Signed-off-by: David Hollis + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: ax8817x_unbind does not free the interrupt URB after unlinking + + ax8817x_unbind does not free the interrupt URB after unlinking. + + Noticed that the net->status already has a flag for link so my + private structure variable for link was redundant. Worked around + this and was able to kill off the unique ax8817x_get_link() function + in the process. + + Signed-off-by: David Hollis + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: usbnet, Sitecom LN-029 + + ID for another AX8817x based usb2 Ethernet adapter. + + From: Tim Chick + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: misc ohci tweaks + + Various minor OHCI tweaks; + + - Fix osdl bugid=2503 by: + * Change needlessly-scarey message (WARN_ON dumps stack) + * Tries cleaning up, as if it's just IRQ lossage. + + - Force IRQs off when shutting down a controller that was + already stopped ... just in case. + + - Allow suspending OHCI during driver initialization, to + support more aggressive power management. + + - Fix some misleading/wrong debug messages. + + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + USB: oops, revert hub patch that wasn't supposed to make it into this patch series yet. + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: usb serial gadget, add omap_udc + + This lets the serial gadget work with another controller. + + Tell serial about omap_udc. This driver still needs updating to + use the endpoint autoconfig suppport; like Gadget Zero, it + really shouldn't need _any_ hardware-specific #ifdeffery. + + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: usb gadgetfs, handle omap_udc + + Tell gadgetfs about omap_udc. + Add some missing __user annotations. + + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: usb gadget API updates + + Gadget API updates, including new features: + + - Adds several new optional calls that can be made to the + USB peripheral controller: + + * VBUS session reporting, for use mostly by external + transcievers (such as isp1301). Detection of VBUS + power is the first step in enumeration, and usually + corresponds to a device being plugged into a hub. + + * "Soft Connect" feature, wherein the D+ pullup is under + gadget driver control. This is a second step during + enumeration, which lets the hub see the new device. + (Based on a patch by Alex Sanks .) + + * Control over VBUS current draw. So for example this is + what a gadget driver uses during SET_CONFIGURATION to + say "it's OK to draw 300 mA from VBUS to recharge". + + - Basic interfaces to support device-side USB OTG. Feature + flags and descriptors are in already. + + * Reports whether the device has a Mini-AB port, so + that OTG support (desriptors etc) is required. + + * Reports OTG device feature flags for HNP. (The OTG + spec requires user interfaces to report this stuff.) + Say if this is a B-Peripheral or an A-Peripheral. + + * Says that usb_gadget_wakeup() is how to access SRP, + and usb_gadget_disconnect() is how to access HNP. + + - Minor updates/cleanups to comments (Linux 2.5-->2.6 etc) + + Currently there's no support for SRP-only OTG devices. + + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: usb gadget zero, basic OTG updates + + This patch teaches "gadget zero" enough about OTG to pass simple USBCV + tests, mostly by including OTG descriptors in each configuration. It + tests and reports OTG status, as reported by the USB controller driver. + + It also adds an option to build gadget zero to act as the designated + OTG "HNP Test Device", which exists primarily to trigger HNP. However, + it won't currently request HNP. + + Includes other minor tweaks: delete a timer on disconnect, reset + the req->zero flag, don't autoresume after disconnect. + + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: usb ethernet gadget, minor fixes + basic OTG support + + Update CDC Ethernet/RNDIS gadget driver to the latest: + + - Basics of OTG support: providing the OTG descriptor + in each configuration (as needed). No HNP yet. + + - Stop issuing partial-packet reads. There's some hardware that + only counts reads in packets, not bytes, so let's not bother. + There are still software checks to catch framing gone wild. + + - Fix a small bug that crept in with a memory leak fix: after + RNDIS requests, ep0 responses would use the RNDIS completion + handler even for non-RNDIS requests. + + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] Updates for W99[87]CF and new SN9C10[12] driver + + This single patch contains some updates and cleanups for + the W996[87]CF driver and a new experimental V4L2 driver + for SONiX SN9C10[12] PC Camera Controllers connected to various + image sensors. I have not divided the patch in two logical + sub-patches becouse of two independent changes in one common + file, KConfigure. + + More informations about the SN9C10[12] can be found below in the + documentation. The driver is marked as "EXPERIMENTAL", meaning + that there are no known bugs, but further testing is necessary + before considering it stable. This the first driver using the new + SBGGR8 video format, which has been recently added to the mainline + kernel, so there are no available user application at the moment: + this is one more reason why it should be in the kernel now. + + Changes in W996[87]CF: + - remove w9968cf_externaldef.h now that ovcamchip.h is in the kernel; + - mark user pointers with __user in a cleaner way to avoid sparse + warnings; + - use appropriate exclusive wait macro during open(); + - replace info(), err(), warn() with dev_info(), dev_err(), dev_warn(), + pr_debug(), pr_info(); + - replace usb_unlink_urb() + wait_for_completion() with usb_kill_urb(); + - fix memory offsets for buffers in the chip to be used with generic + image sensors; + - 'vppmod_load', 'debug', 'specific_debug' and 'simcams' module + parameters are now writeable by default; + - fix possible race conditions between disconnect() and open(); + - add automatic 'ovcamchip' module loading option with 'ovmod_load' + module parameter; + - get rid of deprecated intermodule communication routines and use the + correct module registration/unregistration approach; + - remove period at the end of kernel messages; + - fix several typos; + - use MODULE_VERSION() macro; + - other small internal cleanups; + - documentation updates. + + Signed-off-by: Luca Risolia + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: change all usbserial drivers to use module_param() + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: remove CONFIG_USB_SERIAL_DEBUG + + This involved reworking the usb_serial_debug_data() function too. + Based on a request from SuSE, and numerous user confusions with how + to enable this option. Now that all usb-serial drivers are using + module_param() it can be set from the boot command line if the drivers + are built into the kernel. + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: sort the order in which the usb-serial drivers get built + + all other usb drivers get built in alphabetical order, why not these? + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: fix SN9C10[12] driver for ia64 + + On Sun, Jul 11, Luca Risolia wrote: + + > This single patch contains some updates and cleanups for + > the W996[87]CF driver and a new experimental V4L2 driver + > for SONiX SN9C10[12] PC Camera Controllers connected to various + > image sensors. I have not divided the patch in two logical + > sub-patches becouse of two independent changes in one common + > file, KConfigure. Since this mailing list refused the patch, + > due to its size, I have uploaded it here, as + > Documentation/SubmittingPatches suggests: + + I need this patch for x86_64. + + + CC [M] drivers/usb/media/sn9c102_core.o + In file included from drivers/usb/media/sn9c102.h:34, + from drivers/usb/media/sn9c102_core.c:43: + include/asm/rwsem.h:55: error: redefinition of `struct rw_semaphore' + In file included from drivers/usb/media/sn9c102.h:34, + from drivers/usb/media/sn9c102_core.c:43: + include/asm/rwsem.h:79:1: warning: "__RWSEM_INITIALIZER" redefined + In file included from include/linux/rwsem.h:25, + from include/asm/semaphore.h:43, + from include/linux/sched.h:18, + from include/linux/module.h:10, + from drivers/usb/media/sn9c102_core.c:21: + include/linux/rwsem-spinlock.h:49:1: warning: this is the location of the previous definition + include/asm/rwsem.h:87: warning: static declaration for `init_rwsem' follows non-static + include/asm/rwsem.h:100: warning: `__down_read' declared inline after being called + include/asm/rwsem.h:100: warning: static declaration for `__down_read' follows non-static + include/asm/rwsem.h:122: warning: `__down_read_trylock' declared inline after being called + include/asm/rwsem.h:122: warning: static declaration for `__down_read_trylock' follows non-static + include/asm/rwsem.h:146: warning: `__down_write' declared inline after being called + include/asm/rwsem.h:146: warning: static declaration for `__down_write' follows non-static + include/asm/rwsem.h:171: warning: `__down_write_trylock' declared inline after being called + include/asm/rwsem.h:171: warning: static declaration for `__down_write_trylock' follows non-static + include/asm/rwsem.h:184: warning: `__up_read' declared inline after being called + include/asm/rwsem.h:184: warning: static declaration for `__up_read' follows non-static + include/asm/rwsem.h:208: warning: `__up_write' declared inline after being called + include/asm/rwsem.h:208: warning: static declaration for `__up_write' follows non-static + include/asm/rwsem.h:233: warning: `__downgrade_write' declared inline after being called + include/asm/rwsem.h:233: warning: static declaration for `__downgrade_write' follows non-static + make[3]: *** [drivers/usb/media/sn9c102_core.o] Error 1 + + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: unusual_devs.h update + + added another device to unusual_devs.h. Its a Sony Clie PEG-675C. Now I + can mount the memory stick. + + cat /proc/bus/usb/devices + + T: Bus=03 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 18 Spd=12 MxCh= 0 + D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=16 #Cfgs= 1 + P: Vendor=054c ProdID=0099 Rev= 1.00 + S: Manufacturer=Sony + S: Product=Sony PEG Mass Storage + C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr= 6mA + I: If#= 0 Alt= 0 #EPs= 3 Cls=08(stor.) Sub=05 Prot=00 Driver=usb-storage + E: Ad=81(I) Atr=03(Int.) MxPS= 64 Ivl=1ms + E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms + E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms + + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: usbserial/ipaq update + + However, attached I provide you a patch against 2.6.7 which should add + the ASUS A620 PDA to the ipaq Kernel module. + + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: usb/core/hcd.c::usb_init() missing audit. + + Signed-off-by: Luiz Capitulino + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: ftdi_sio debug trace for TIOCMSET + + Someone spotted that ftdi_sio outputs a debug trace for TIOCMGET, + but not for TIOCMSET, so this patch adds a debug trace for TIOCMSET + too. + + Signed off by: Ian Abbott + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: ftdi_sio VID/PID updates + + Greg, + + This patch adds various VID/PIDs to the ftdi_sio driver that I've + accumulated from the ftdi-usb-sio-devel mailing list, and one from + the 2.4 kernel sources: + + * Interbiometrics USB I/O boards VID/PIDs from 2.4 kernel (Rudolf + Gugler). + * Intrepid Control Systems ValueCAN and NeoVI VID/PIDs from Scott + Wolchok. + * Falcom Twist USB GPRS modem VID/PID from Justin Schoeman. + * Suunto Sports instrument PID from Panu Kekalainen. + + Also a few minor clean-ups: + + * Removed a stray PID macro constant FTDI_GUDEADS_889_PID. + * Copied the Inside Accesso VID/PID into the FT232BM ID table so + that the "combined" table is a proper union of the others (unless I've + missed something else). + * Added a comment that the OCT US101 is also rebadged as a SIIG Inc. + US2308. + + Signed-off-by: Ian Abbott + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: usb host side updates, mostly for suspend + + This adds some of the infrastructure needed to support some more + USB capabilities: + + - CONFIG_USB_SUSPEND, so Linux can put individual devices + into the USB "suspend" state. They can (sometimes) use + "remote wakeup" to resume the host; or they can each be + resumed by the host. + + + New usbcore device selective suspend/resume APIs + * Define them, as stubs for now + * Call them on the paths sysfs uses (renamed functions) + + HCD support + * Define root hub suspend calls; delegate them to HCDs. + * OHCI and EHCI can suspend/resume root hubs that way. + * Not called yet, until suspend/resume calls exist + + - CONFIG_USB_OTG, which depends on the selective suspend APIs + to allow devices to switch roles (host to peripheral, etc). + This patch just adds a few key flags in usb_bus, needed by + usbcore (during enumeration) and by HCD and OTG controllers + on OTG-capable boards. + + - Related bugfix: power budgeting is supposed to place a + 100mA per port (non-OTG) for bus-powered devices. + + This patch changes no behavior; later patches will do that, + and they'll be smaller because of this. + + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: W99[87]CF fix + + Signed-off-by: Luca Risolia + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: usb hub, don't check speed before reset + + Signaling (even D- vs D+ pullup) may not be stable + for a while. + + At least one OTG root hub won't reliably (<10%) report device speed until + after reset (and the OTG state transitions have quiesced for a while). + + This patch makes that not matter. + + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] USB: USB w9968cf compile error + + On Tue, Jul 13, 2004 at 06:25:59PM -0700, Andrew Morton wrote: + >... + > All 252 patches: + >... + > bk-usb.patch + >... + + This patch marks w9968cf_valid_depth as inline, although it's used + before it's defined. + + gcc 3.4 therefore correctly fails with: + + <-- snip --> + + ... + CC drivers/usb/media/w9968cf.o + drivers/usb/media/w9968cf.c: In function `w9968cf_set_picture': + drivers/usb/media/w9968cf.c:487: sorry, unimplemented: inlining failed + in call to 'w9968cf_valid_depth': function body not available + drivers/usb/media/w9968cf.c:1722: sorry, unimplemented: called from here + make[3]: *** [drivers/usb/media/w9968cf.o] Error 1 + + <-- snip --> + + + This patch moves w9968cf_valid_depth above it's first user (it also uses + two other functions to keep the ordering of functions a bit more + consistent). + + + + Signed-off-by: Adrian Bunk + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] I2C: patch quirks.c - SMBus hidden on hp laptop + + This patch unhides the SMBus on the hp nc8000 and nc6000 laptops. The + patch has been co-written by Jean Delvare and Rudolf Marek. I've only + tested this on nc8000, but it should work for the nc6000 too. + + Unfortunatley, we had to little information to fix the problem described + in the reported bug below, as is probably the same problem. But if we're + very lucky it might solve it too. + http://bugzilla.kernel.org/show_bug.cgi?id=2976 + + + Signed-off-by: Örjan Persson + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] Driver core: Fix OOPS in device_platform_unregister + + Driver core: platform_device_unregister should release resources first + and only then call device_unregister, otherwise if there + are no more references to the device it will be freed and + the fucntion will try to access freed memory. + + Signed-off-by: Dmitry Torokhov + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] Upgrade security/root_plug.c to new module parameter syntax + + Hi again, + + Still doing my compile, and got this: + + CC [M] security/root_plug.o + security/root_plug.c:39: warning: missing initializer + security/root_plug.c:39: warning: (near initialization for `__parm_vendor_id.addr') + security/root_plug.c:42: warning: missing initializer + security/root_plug.c:42: warning: (near initialization for `__parm_product_id.addr') + security/root_plug.c:48: warning: missing initializer + security/root_plug.c:48: warning: (near initialization for `__parm_debug.addr') + + Simply upgrading root_plug to use the new module parameter syntax seemed to do + the trick. I made the debug writable, the others just readable to root. + + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] add removeable sysfs block device attribute + + This patch adds a /block/*/removeable sysfs attribute. A value of 1 + indicates the media can change anytime. This is a hint for userland + to poll such devices for possible media changes, and leave all others alone. + There is currently no way to see if a connected usb-storage device is a + disk or a card reader. It will also show 1 for CD and ZIP drives. + + It was done by Patrick Mansfield a while ago. I can probably not + sigh-off his work. ;) + + + Signed-off-by: Greg Kroah-Hartman + + + [PATCH] ia64: Extend oem section types for SN mca records + + SN mca records now contain oem data for platform memory errors. + + Signed-off-by: Keith Owens + Signed-off-by: David Mosberger + + + [PATCH] ide: PIO-out fixes for ide-taskfile.c (CONFIG_IDE_TASKFILE_IO=n) + + - in task_out_intr() fix off-by-1 bug and (stat & DRQ_STAT) check, +   previously "if" was always true for rq->current_nr_sectors == 1 + - fail request if DRQ_STAT is not set and rq->current_nr_sectors != 0 + (instead of setting handler and waiting for the next IRQ) or if DRQ_STAT + is set but !rq->current_nr_sectors (in task_mulout_intr() this was OK) + - in task_mulout_intr() check also DRIVE_READY and WRERR_STAT status bits + + Signed-off-by: Bartlomiej Zolnierkiewicz + Signed-off-by: Linus Torvalds + + + [PATCH] ide: PIO-out ->prehandler() fixes (CONFIG_IDE_TASKFILE_IO=y) + + Setup handler and output first data block directly from ->prehandler() + instead of calling ->handler(). The only change in functionality is that + we no longer check DRIVE_READY status bits (there is no need to do it). + + Signed-off-by: Bartlomiej Zolnierkiewicz + Signed-off-by: Linus Torvalds + + + [PATCH] ide: PIO-out error handling fixes (CONFIG_IDE_TASKFILE_IO=y) + + We shouldn't ever get into ->handler() if drive is busy so + just call ->error() unconditionally if status check fails. + + Signed-off-by: Bartlomiej Zolnierkiewicz + Signed-off-by: Linus Torvalds + + + [PATCH] ide: remove BUSY check from task_in_intr() (CONFIG_IDE_TASKFILE_IO=n) + + We shouldn't ever get there if drive is busy and we can't start transfer + in this case. ide-disk.c:read_intr() also doesn't check for BUSY_STAT bit. + + Signed-off-by: Bartlomiej Zolnierkiewicz + Signed-off-by: Linus Torvalds + + + [PATCH] remove pre_task_out_intr() comment (CONFIG_IDE_TASKFILE_IO=n) + + disable_irq_nosync() in ide-io.c:ide_do_request() protects + pre_task_out_intr() from racing with the task_out_intr(). + + Signed-off-by: Bartlomiej Zolnierkiewicz + Signed-off-by: Linus Torvalds + + + [PATCH] ide: pre_task_mulout_intr() cleanup (CONFIG_IDE_TASKFILE_IO=n) + + drive_is_ready() reads STATUS register if CONFIG_IDEPCI_SHARE_IRQ is not + defined and ALTSTATUS register if it is defined. Therefore drive_is_ready() + in pre_task_mulout_intr() only makes sense if we can't trust STATUS register + (because we call ide_wait_stat() which reads STATUS register earlier). + + Remove this "workaround" for now as it is not present in ide-disk.c + and whole multi PIO-out code (CONFIG_IDE_TASKFILE_IO=n) was buggy before. + + Signed-off-by: Bartlomiej Zolnierkiewicz + Signed-off-by: Linus Torvalds + + + [PATCH] ide: no partial completions for PIO (CONFIG_IDE_TASKFILE_IO=y) + + Don't do partial completions but instead acknowledge already transferred + sectors with verified good status on error. This allows us to complete + "good" sectors to block layer even if bio they belong to wasn't finished + and simplifies code. + + Signed-off-by: Bartlomiej Zolnierkiewicz + Signed-off-by: Linus Torvalds + + + [PATCH] ide: merge CONFIG_IDE_TASKFILE_IO=y|n PIO handlers together + + This fixes a couple of CONFIG_IDE_TASKFILE_IO=n issues: + - check status after last sector for PIO-in transfers + - handle drive->unmask properly in PIO-out prehandlers + - use rq->[hard]_nr_sectors where appropriate + + Signed-off-by: Bartlomiej Zolnierkiewicz + Signed-off-by: Linus Torvalds + + + [PATCH] ide: use "normal" handlers for "flagged" taskfiles (ide-taskfile.c) + + This fixes following issues for PIO-in: + - shared PCI IRQs handling + - fail request if the last status is bad + and PIO-out: + - set hwgroup->handler/timer in prehandlers + - handle drive->unmask in prehandlers + - check for !rq->nr_sectors and DRQ_STAT bit set + - use drive->bad_wstat instead of BAD_W_STAT + + Signed-off-by: Bartlomiej Zolnierkiewicz + Signed-off-by: Linus Torvalds + + + [PATCH] CFQ: allocation under lock, missing memset on allocation + + This fixes two issues in the CFQ IO-scheduler: + + o Still a bad allocation under the queue lock + o We need to clear crq after mempool_alloc(), otherwise the rbtree + pointers can contain garbage if slab poisoning is enabled. This causes + crashes on front/back merges because rb_next() returns crap. + + Signed-off-by: Jens Axboe + Signed-off-by: Linus Torvalds + + + NAND flash driver updates. + + Update the core NAND code: + - support multiple chips + - support bad block tables + - improved generic ECC support and 'spare area' usage. + - 16-bit NAND + - Large-block NAND devices + - Renesas AG-AND devices + - M-Systems DiskOnChip devices + - Other new board support wrappers + + Most of the work was done by Thomas Gleixner. + + Signed-Off-By: David Woodhouse + + + JFFS2 file system update + + - Improved support for NAND flash + - More generic compression support, allowing for extra compressors + - Fix potential deadlock with kupdated + + + MTD core include and device code cleanup + + - Move user-visible bits from headers to include/mtd/ directory. + - Update old DiskOnChip drivers for newer hardware. + - Switch NFTL and INFTL support to work with new DiskOnChip/NAND code. + - New phram driver, reimplenting the ugly slram driver. + - Bug fixes in partitioning code + + + NOR flash drivers update + + - Handle cached access to flash chips on supporting platforms + - Handle arrangements of chips larger than a single bus width + - Clean up the AMD/Fujitsu chip driver + - Update board 'mapping' drivers to match + - New mapping drivers for new platforms. + + + [PATCH] ia64: fix obsolete and now misleading comment + + Signed-off-by: Josh Aas + Signed-off-by: David Mosberger + + + [ALPHA] Pass pt_regs as pointer to execve and sigprocmask syscalls. + + + [PATCH] tmpfs preempt count panic + + Just unearthed another of my warcrimes: reading a 17-page sparse file, + I mean holey file, hits the in_interrupt panic in do_exit on a current + highmem kernel (but 2.6.7 is okay). Fix mismatched preempt count from + shmem_swp_alloc's swapindex hole case by mapping an empty_zero_page. + + Signed-off-by: Hugh Dickins + Signed-off-by: Linus Torvalds + + + WindRiver SBC8560: Set all internal IRQs level-triggered. + + + Fix UART detection on WindRiver SBC8560 + + The UART is detected as a ST16650V2 but its FIFO doesn't behave nicely. + Disable autoprobe and hard-code it to be a ST16650 instead. + + + Fix UART initialisation on WindRiver SBC8560. + + The UART tristates its IRQ output when the OUT2 bit in the MCR isn't + set. For reasons not known to civilised man, the hardware engineers + stopped it from floating by pulling it _high_ instead of low, so if + anybody requests that IRQ before OUT2 is turned on, we die in an IRQ + storm. The serial8250 driver does precisely that thing, with precisely + that effect. + + ALPHA_KLUDGE_MCR was designed to fix exactly this kind of problem, so we + use it here as intended. Ideally ALPHA_KLUDGE_MCR would go away and be + replaced with something like UPF_FORCE_OUT2 and UPF_FORCE_OUT1 flags, + but now is not the time to get me started on a cleanup of everything + about serial8250 that offends me. + + + PPC openpic driver cpumask_t changes + + Fix the PPC openpic driver to use cpumask_t where appropriate. + + + ppc32: reworked cpm alloc functions + + * Unified function names between CPM1 & CPM2 + * changed rheap to use ERR_PTR + * fixed drivers to use new functions and names + + + + ppc32: reworked CPM uart driver to work for properly for all CPMs + + + [ARM] Export ixp42xx_pci_read/write so PCI driver modules load + + Originally found by Thomas Winkler + + Signed-off-by: Deepak Saxena + + + [PATCH] ppc32: Fix UART detection on WindRiver SBC8560 + + The UART is detected as a ST16650V2 but its FIFO doesn't behave nicely. + Disable autoprobe and hard-code it to be a ST16650 instead. + + + [PATCH] ppc32: Fix UART initialisation on WindRiver SBC8560. + + The UART tristates its IRQ output when the OUT2 bit in the MCR isn't + set. For reasons not known to civilised man, the hardware engineers + stopped it from floating by pulling it _high_ instead of low, so if + anybody requests that IRQ before OUT2 is turned on, we die in an IRQ + storm. The serial8250 driver does precisely that thing, with precisely + that effect. + + ALPHA_KLUDGE_MCR was designed to fix exactly this kind of problem, so we + use it here as intended. Ideally ALPHA_KLUDGE_MCR would go away and be + replaced with something like UPF_FORCE_OUT2 and UPF_FORCE_OUT1 flags, + but now is not the time to get me started on a cleanup of everything + about serial8250 that offends me. + + + [PATCH] ppc32: Fix IRQ setup on WindRiver SBC8560 + + The internal interrupts are hardcoded to be level-triggered, but we need + to make sure the OpenPIC code knows that... + + + [PATCH] ppc32: openpic driver cpumask_t changes + + This fixes the PPC openpic driver to use cpumask_t where appropriate. + + Signed-Off-By: David Howells + Signed-Off-By: Linus Torvalds + + + [Bluetooth] Add support for another ALPS module + + This patch adds the specific vendor and product id's for another + ALPS module which don't uses the USB Bluetooth class id. + + Signed-off-by: Marcel Holtmann + + + [Bluetooth] Make use of usb_kill_urb() + + Now that usb_kill_urb() is in the main kernel tree it should + be used. This patch makes the needed modifications to the USB + Bluetooth driver. + + Signed-off-by: Alan Stern + Signed-off-by: Marcel Holtmann + + + [Bluetooth] Add missing entry for the HIDP support + + This small patch adds the missing entry about the HIDP support + to the main Kconfig file of the Bluetooth subsystem. + + Signed-off-by: Marcel Holtmann + + + [Bluetooth] Use a signed integer for the RSSI value + + The RSSI value in the inquiry response with RSSI must be a signed + integer and not an unsigned one. + + Signed-off-by: Marcel Holtmann + + + Remove /proc/fs/jffs2 support. + + It wants reimplementing sanely, preferably in sysfs instead. + + + M-Systems DiskOnChip driver: fix DiskOnChip Millennium ECC support + and fix a few compiler warnings while we're at it. + + + Make obsolete NOR flash chip drivers depend on BROKEN. + + If nobody shouts soon about why the new, shiny, generic chip drivers + don't work where the old ones do, they can be removed entirely. + + + [PATCH] fix cdrom mt rainier probe + + Writing to RAM capable media was broken by the moving of write flag + detection from probe to drive open time. The media would stay + terminally RO due to the set_disk_ro() call. + + This fixes the code to do the right thing - the detection stays at open + time (which it must, since it depends on the media), and we fail with + -EROFS if the media can't be written. + + Signed-off-by: Jens Axboe + Signed-off-by: Linus Torvalds + + + [PATCH] Remove all uses of '#ifdef MODULE_PARM' from kernel + + I got sidetracked (I do that a lot ;-) and noticed that there are only + eight files in 2.6 that have code like: + + #ifdef MODULE_PARAM + MODULE_PARAM(foo, "i"); + #endif + + which I think is old cruft from 2.1.x times. Following patch removes + all those eight (six in netfilter, one net driver and one SCSI driver). + + + [PATCH] mmap PROT_NONE fix for NX patch + + This works around the current PROT_NONE problem from elf binaries that + do not have the PT_GNU_STACK so that the do not have execute permission. + + The problem was that setting "def_flags" to include the VM_EXEC bit for + compatibility reasons would also make PROT_NONE pages executable, which + is obviously not correct. + + Signed-off-by: Daniel McNeil + Signed-off-by: Linus Torvalds + + + [PATCH] remove bogus casts of pointers to unsigned int in sound/* + + + [PATCH] au88x0: use proper field of snd_kcontrol_t and don't try to store pointer in int + + The au88x0 driver tries to use the wrong private field - there are two, + one of them int and another void *. + + While it's not a problem on 32bot boxen, it breaks on 64bit ones. + + Fixed. + + + [PATCH] ic31712: when storing a bitmask in pointer field, use unsigned long + + + [PATCH] annotated sound/pci/nm256/nm256.c + + + [PATCH] NULL noise removal in sound/usb/* + + + [PATCH] mark broken stuff as such in Kconfig + + A bunch of drivers are broken on sparc64; mark them as such in Kconfig. + arlan and smctr are not 64bit-clean; again, markes as such. + + + [PATCH] misc sparse cleanups + + - missing ; between default: and } in sun4setup.c + - cast of pointer to unsigned long long instead of unsigned long in + x86_64 signal.c + - missed annotations for ioctl structure in sparc64 openpromio.h + (should've been in the same patch as the rest of drivers/sbus/* + annotations) + - 0->NULL in list.h and pmdisk.c + + + [PATCH] switch sys32_timer_create() to compat_alloc_user_space() + + switched to compat_alloc_user_space(), cleaned up. + + + [PATCH] sparse: beginning of iovec cleanups - infrastructure + + Beginning of iovec cleanups - added two helpers (kernel_{send,recv}msg) + that do sock_sendmsg/sock_recvmsg with kvec instead of iovec; basically, + they were abstracted from earlier afs patch. They take kvec/length of + kvec as separate arguments, do set_fs(), stick kvec into msghdr and call + sock_...msg(). + + The next group of patches will switch network filesystems to use of kvec + for kernel data + use of these helpers. Basically, the same thing we'd + done for afs. + + + [PATCH] sparse: iovec cleanups - smbfs + + smbfs switched to kvec and kernel_...msg() + + + [PATCH] sparse: iovec cleanups - ncpfs + + ncpfs switched to kvec and kernel_...msg() + + + [PATCH] sparse: iovec cleanups - cifs + + cifs switched to kvec and kernel_...msg() + + + [PATCH] sparse: iovec cleanups - rxrpc + + rxrpc (low-level part of afs) switched to kernel_...msg(); it already was + using kvec instead of iovec. + + + [PATCH] sparse: iovec cleanups - sunrpc, nfs and nfsd + + sunrpc, nfs and nfsd switched to use of kvec and kernel_...msg() + + + [PATCH] sparse: iovec cleanups - the rest + + the rest of iovec cleanups: nbd, dvb-net, sock.c::sock_no_sendpage(), + econet over udp and ip_vs switched to use of kvec and kernel_...msg(). + + + [PATCH] annotations and NULL noise removal in drivers/char/drm + + Massive, but trivial - drm annotated and got 0->NULL where needed. That + patch kills ~2200 lines of warnings - out of 5400 that remained at that + point. + + + It's a pointer, dummy. Use NULL, not 0. + + + ppc64: More NULL/0 confusion in prom.c + + + [PATCH] 3w-9xxx.c annotated + + + [PATCH] fbmem.c partially annotated + + partially annotated, fixed dereferencing of userland pointer (trivial, + since we'd just copied the entire structure). + + + [PATCH] hfs and hfsplus switched to use of ffs(3) instead of homegrown versions + + + [PATCH] more annotations in binfmt_aout.c + + + [PATCH] pointer-to-number cast in binfmt_elf.c done right + + + [ARM] Fix _find_next_bit_be prototype to use 'const' qualifier + + _find_next_bit_be() does not have a 'const' qualifier for the first + argument, so we get the following warning for a very large number + of files: + + In file included from include/linux/sched.h:15, + from include/linux/module.h:10, + from drivers/mtd/maps/ixp2000.c:24: + include/linux/cpumask.h: In function `__next_cpu': + include/linux/cpumask.h:216: warning: passing arg 1 of `_find_next_bit_be' + discards qualifiers from pointer target type + + Signed-off-by: Deepak Saxena + + + [PATCH] ia64: make madt parsing quieter + + We already get this info in other forms from other boot messages, so kill the + printing of the MADT entries as they're parsed. This patch significantly + reduces the amount of output from a boot of a 512p system. + + Signed-off-by: Jesse Barnes + Signed-off-by: David Mosberger + + + ia64: Nuke two compiler-warnings. + + + [PATCH] Altix serial driver updates + + Patch for our console driver. We converted the driver to use the serial + core functions. Also some changes to use sysfs/udev and a new major + number. + + Cc: Jesse Barnes + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix inode state incoherency + + This patch fixes a hard-to-trigger condition, where the inode is on the + inode_in_use list while it's state is dirty. In this state dirty pages are + not written back in sync() or from kupdate, only from direct page reclaim. + And this causes a livelock in balance_dirty_pages after a while. + + The actual sequence of events required to get into this state is: + + thread function inode state inode list + ---------------------------------------------------------------------------- + 1 __sync_single_inode (background) I_DIRTY sb->s_io + 1 do_writepages ... I_LOCKED + 2 __writeback_single_inode (sync) sleeps I_LOCKED + 1 __sync_single_inode (background) finish 0 inode_in_use + 2 __writeback_single_inode (sync) wakeup 0 + 2 __sync_single_inode (sync) 0 + 2 do_writepages ... I_LOCKED + 3 __mark_inode_dirty I_LOCKED | I_DIRTY + 2 __sync_single_inode (sync) finish I_DIRTY left on + inode_in_use + + Signed-off-by: Miklos Szeredi + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ia64: fix perfmon bug that could result in kernel hang + + This patch fixes a potential kernel hang in perfmon during + PFM_UNLOAD_CONTEXT. This commands requires that the monitored task be + stopped (except when self-monitoring). The task state tests in + check_task_state() were incorrect and an actively running task was + accepted for PFM_UNLOAD_CONTEXT. This eventually leads to a kernel + hang. + + Signed-off-by: Stephane Eranian + Signed-off-by: David Mosberger + + + [PATCH] Fix memory corruption at x86-64 SMP bootup + + This fixes a long standing corruption bug in the x86-64 code. The SMP + trampoline would corrupt page 2, which was sometimes used for other + data. This corrupted the ioport/iomem list in some cases and causes + oopses while read /proc/iomem. + + Fix is to check the correct location and don't zero it afterwards + because it gets reinitialized for the next CPU anyways. + + Thanks to Alexander Nyberg for tracking it down. + + + [PATCH] Fix i386 bootup with HIGHMEM+SLAB_DEBUG+NUMA and no real + + For some reason I booted a NUMA and SLAB_DEBUG i386 kernel on a non + NUMA 512MB machine. This caused an oops at bootup in change_page_attr. + The reason was that highmem_start_start page ended up zero and + that triggered the highmem check in change_page_attr when the + slab debug code would unmap a kernel mapping. + + Fix is straightforward: if there is no highmem set highmem_start_page + to max_low_pfn+1 + + + Clean up ptrace child exit case. + + This also fixes it for when the real parent is ignoring + SIGCHLD - noted by David Mosberger. + + + Linux 2.6.8-rc2 + + Ready for the kernel summit in Ottawa... + + + [PATCH] pmac_zilog: serial minors taken failure path fix + + I've tracked down the core issue giving me the oops wrt pmac_zilog. + + When you have two serial drivers, (e.g. 8250 and PMAC_ZILOG) they both say + + "I want to reserve X ports starting with major TTY_MAJOR and minor 64". + + By the time pmac_zilog gets there, the ports it requests are already + reserved. Unfortunately, init_pmz() doesn't check for pmz_register() + failure, and so it merrily goes on to register the half-initialized + pmac_zilog driver with the power management subsystem. + + This path provides a proper failure path. + + Also: + + Restore ppc configs now that I know people use AT Keyboards on CHRP and PReP + machines, and the zilog driver is no longer Oops'ing. + + Signed-off-by: David Eger + Signed-off-by: Linus Torvalds + + + [PATCH] NX: clean up legacy binary support + + This cleans up legacy x86 binary support by introducing a new + personality bit: READ_IMPLIES_EXEC, and implements Linus' suggestion to + add the PROT_EXEC bit on the two affected syscall entry places, + sys_mprotect() and sys_mmap(). If this bit is set then PROT_READ will + also add the PROT_EXEC bit - as expected by legacy x86 binaries. The + ELF loader will automatically set this bit when it encounters a legacy + binary. + + This approach avoids the problems the previous ->def_flags solution + caused. In particular this patch fixes the PROT_NONE problem in a + cleaner way (http://lkml.org/lkml/2004/7/12/227), and it should fix the + ia64 PROT_EXEC problem reported by David Mosberger. Also, + mprotect(PROT_READ) done by legacy binaries will do the right thing as + well. + + the details: + + - the personality bit is added to the personality mask upon exec(), + within the ELF loader, but is not cleared (see the exceptions below). + This means that if an environment that already has the bit exec()s a + new-style binary it will still get the old behavior. + + - one exception are setuid/setgid binaries: these will reset the + bit - thus local attackers cannot manually set the bit and circumvent + NX protection. Legacy setuid binaries will still get the bit through + the ELF loader. This gives us maximum flexibility in shaping + compatibility environments. + + - selinux also clears the bit when switching SIDs via exec(). + + - x86 is the only arch making use of READ_IMPLIES_EXEC currently. Other + arches will have the pre-NX-patch protection setup they always had. + + I have booted an old distro [RH 7.2] and two new PT_GNU_STACK distros + [SuSE 9.2 and FC2] on an NX-capable CPU - they work just fine and all + the mapping details are right. I've checked the PROT_NONE test-utility + as well and it works as expected. I have checked various setuid + scenarios as well involving legacy and new-style binaries. + + an improved setarch utility can be used to set the personality bit + manually: + + http://redhat.com/~mingo/nx-patches/setarch-1.4-3.tar.gz + + the new '-X' flag does it, e.g.: + + ./setarch -X linux /bin/cat /proc/self/maps + + will trigger the old protection layout even on a new distro. + + Signed-off-by: Ingo Molnar + Signed-off-by: Linus Torvalds + + + CIFS: Add missing mount option for optionally cifs perm checks when uids on server and client do not match and for optionally overriding + server setting default uid/gid of new cifs files and directories. + + Signed-off-by: Steve French (sfrench@us.ibm.com) + + + [CIFS] remove unneeded, unused prototypes. Suggested by Carl Spalletta + + Signed-off-by: Steve French (sfrench@us.ibm.com) + + + [IPV4] Look up route with appropriate protocol when we connect(). + + Signed-off-by: Hideaki YOSHIFUJI + + + [IPV6] remove rather pointless comment. + + Signed-off-by: Hideaki YOSHIFUJI + + + PPC32: Typo fix in m8xx serial driver. + + + [PATCH] ia64: update sn2_defconfig to include new console + + Now that Linus' tree has the new sn2 console driver, make sn2_defconfig enable + it by default. The device is major 204, minor 40. Note that you'll probably + have to update your elilo.conf and inittab to use the new driver, as it's + called ttySG0 rather than ttyS0. + + Signed-off-by: Jesse Barnes + Signed-off-by: David Mosberger + + + MTD: remove some kernel 2.0 and 2.2 #ifdef's + + The patch below (applies against 2.6.8-rc2) removes some #ifdef's for + kernel 2.0 and 2.2 from the MTD code. + + Signed-off-by: Adrian Bunk + Signed-off-by: David Woodhouse + + + MAINTAINERS: update MTD list + + Trying to send an email to mtd@infradead.org gives you the answer that + you should use linux-mtd@lists.infradead.org instead. + + So let's update the entry in MAINTAINERS. + + Signed-off-by: Adrian Bunk + Signed-off-by: David Woodhouse + + + Fix JFFS2_COMPRESSION_OPTIONS in Kconfig + + Hi, + It seems to me that JFFS2_COMPRESSION_OPTIONS depends on JFFS2_FS: + + Signed-off-by: David Woodhouse + + + NAND support in JFFS2 isn't experimental any more. + + + [PATCH] ia64: sn2 requires a 3.40 or better PROM + + The SGI 3.40 PROM includes a fix for the move of the init_task to + region 5, so specify that in sn_sal.h. Unfortunately, the check for + the minimum required version happens *after* the hang/MCA that is + symptomatic of the bug, so this message also acts as an announcement + of the requirement. + + Signed-off-by: Jesse Barnes + Signed-off-by: David Mosberger + + + kbuild: build binary rpm from pre-built tree + + Many times it would be nice to quickly package up a kernel tree you're + working on, without having to rebuild the whole thing again from a clean + source tree (like the current rpm-pkg target does). The patch below + adds an "binrpm-pkg" target which uses your existing (already built) + tree. + Modified by me to always do a make and use binrpm-pkg. + + Signed-off-by: Greg Edwards + Signed-off-by: Sam Ravnborg + + + kbuild: Allow `make O= {cscope,tags}` to work + + Allow `make O= {cscope,tags}` to work + + + kbuild: Rebuild .spec file when kernel version changes + + Make a dependency in scripts/package/Makefile to top-level Makefile forcing + .spec file to be generated when kernel version changes. + + Signed-off-by: Sam Ravnborg + + + [SPARC64]: Export __copy_in_user to modules. + + + [SPARC64]: Update defconfig. + + + [SPARC64]: Fix allnoconfig build, based upon a patch from Roland Dreier. + + - Make SUNOS_EMUL depend upon BINFMT_AOUT32 + - Make SOLARIS_EMUL depend upon SPARC32_COMPAT + - Add CONFIG_COMPAT guards, where necessary. + + Signed-off-by: David S. Miller + + + [SPARC64]: Handle SBUS dma allocations larger than 1MB. + + Signed-off-by: David Dillow + Signed-off-by: David S. Miller + + + [PKT_SCHED]: Make sch_netem classful. + + Simple enhancement to netem packet scheduler that makes it classful so + that the underlying pfifo default discipline can be substituted with something + else (tbf, red, ...) + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [PKT_SCHED]: Missing qdisc destroy in sch_netem. + + The underlying qdisc was not being properly destroyed, shows up as + assertion failure on device removal. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [PKT_SCHED]: Need delayed packet limit in sch_netem. + + The netem scheduler needs to limit its delayed packet queue to prevent + a application burst from chewing up too much memory. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [IPV6]: Missing sparse annotation in addrconf. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [SPARC]: Fix copy_user.S with gcc 3.3 + + Signed-off-by: Tom Callaway + Signed-off-by: David S. Miller + + + [SPARC]: Add pci_dma_mapping_error to pci.h + + Signed-off-by: Tom Callaway + Signed-off-by: David S. Miller + + + [UDP]: Return true length if user specifies MSG_TRUNC. + + + [SPARC32]: Mark William Lee Irwin III as maintainer. + + + [CRYPTO]: Fix stack overrun in crypt(). + + The stack allocation in crypt() is bogus as whether tmp_src/tmp_dst + is used is determined by factors unrelated to nbytes and + src->length/dst->length. + + Since the condition for whether tmp_src/tmp_dst are used is very + complex, let's allocate them always instead of guessing. + + This fixes a number of weird crashes including those AES crashes + that people have been seeing with the 2.4 backport + ipt_conntrack. + + Signed-off-by: Herbert Xu + Signed-off-by: James Morris + Signed-off-by: David S. Miller + + + [ATM]: use try_module_get appropriately (from Stephen Hemminger ) + + + [IPV4]: Make raw sockets behave like udp wrt. MSG_TRUNC. + + + [ATM]: Update Marko Kiiskila's email address. + + + [IPSEC]: Fix IPCOMP6 ICMP type check. + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [INET]: Create enum of ECN bits + + This patch is a preparation for an update of the ECN encap/decap + code with respect to RFC3168. + + It creates an enum of the four code-points defined by RFC3168 + and uses them throughout the inet_ecn.h file. + + The only non-trivial bit is in IP_ECN_set_ce/IP6_ECN_set_ce where + the patch uses INET_ECN_CE instead of 1. This is OK as those + functions assume that the ECT bit is already set. + + Signed-off-by: Herbert Xu + + Signed-off-by: David S. Miller + + + [TCP]: Do not overflow 16-bit window field in tcp_select_window(). + + Signed-off-by: David S. Miller + + + kbuild: Less intrusive LANG override, fixes menuconfig + + The locale override caused problems for some people with locale setiings + different from 'C'. make menuconfig was looking bad / unuseable. + This patch limit the override of locales to the part where we actually descend the kernel + doing the full build of the kernel. + The speed improvement is the same. + + make menuconfig should now be useable for all locale settings again. + Thanks to Marcel Sebek for pointing out this problem and being + paitent in testing. + + Signed-off-by: Sam Ravnborg + + + kbuild: scripts/genksyms/parse.c_shipped needs to be rebuilt + + parse.c_shipped has never been regenerated after parse.y has been modified + 4 months ago. + + Signed-off-by: Andreas Schwab + Signed-off-by: Sam Ravnborg + + + kbuild: Move modpost files to a new subdir scripts/mod + + Move modpost and support files to scripts/mod. + Directory named mod by Sam. + + From: Brian Gerst + Signed-off-by: Sam Ravnborg + + + kbuild: Fix up moving of modpost + + A few small issues to fix the moving of modpost. + A few files was missing in the commit and one change needed. + Also bk ignored the files in their new location. + + Signed-off-by: Sam Ravnborg + + + kbuild: Two simple kbuild patches + + foo1.patch: spelling correction in Makefile + foo2.patch: replace SUBDIRS with M in Documentation/kbuild/modules.txt + + From: Kornilios Kourtis + Signed-off-by: Sam Ravnborg + + + [PATCH] Missing mnt_namespace update in copy_namespace() + + copy_namespace() forgets to switch the new 'mnt_namespace' field in the + vfsmounts of the new namespace. + + + [PKT_SCHED]: Remove dead timer code. + + Signed-off-by: Patrick McHardy + Signed-off-by: David S. Miller + + + [PATCH] Asus M2N notebook hides SMBus device + + Asus also "hides" the LPC bridge on M2N notebooks. Add it to + the asus_hides_smbus PCI quirk. + + Fixes bug #2976 @ http://bugme.osdl.org/show_bug.cgi?id=2976 + + Signed-off-by: Dominik Brodowski + Signed-off-by: Linus Torvalds + + + [PATCH] clean up n_tty alloc_buf() + + Don't bother zeroing the allocated memory inside alloc_buf() in the + n_tty line discipline. alloc_buf() is static inline and is only + referenced by n_tty_open() which always clears the memory (once more). + + No bug, just a minor cleanup + + + [PKT_SCHED]: Use get_cycles() for PSCHED_CPU clock source + + Signed-off-by: Patrick McHardy + Signed-off-by: David S. Miller + + + [PATCH] is_highmem() and WANT_PAGE_VIRTUAL + + Add is_highmem_idx() and is_normal_idx() to determine whether + a zone index is a highmem or normal zone. Use this for + memmap_init_zone(). + + Signed-off-by: Andy Whitcroft + Signed-off-by: Linus Torvalds + + + Make "install_page()" able to handle truncated pages. + + This makes it much easier on the callers, no need to + worry about races with vmtruncate() and friends, since + "install_page()" will just cleanly handle that case + and tell the caller about it. + + + [SPARC64]: Uninline _raw_spin_lock too, saves ~30K in defconfig image. + + + [SCTP] Set/Get default SCTP_PEER_ADDR_PARAMS for endpoint when associd + and peer address are 0. + + Signed-off-by: Anand R. Setlur + Signed-off-by: Sridhar Samudrala + + + [SCTP] Fix data not being delivered to user in SHUTDOWN_SENT state. + + Also cleaned up sctp_sf_eat_data_6_2() and sctp_sf_eat_data_fast_4_4() + as they have a lot of common code. + + Signed-off-by: Jorge Hernandez + Signed-off-by: Sridhar Samudrala + + + [SCTP] Fix issues with handling stale cookie error over multihoming + associations. + + Signed-off-by: Jorge Hernandez + Signed-off-by: Sridhar Samudrala + + + [SCTP] Use idr_get_new_above() with a starting id of 1 to avoid returning + an associd of 0. + + Signed-off-by: Sridhar Samudrala + + + [SCTP] Fix missing '+' in the computation of sack chunk size in + sctp_sm_pull_sack(). + + Signed-off-by: Jorge Hernandez + Signed-off-by: Sridhar Samudrala + + + remove unused #include + + From: Domen Puncer + Signed-off-by: Maximilian Attems + Signed-off-by: David Woodhouse + + + [PATCH] NX: allow architectures to select legacy mode dynamically + + On some platforms, you'll want to support READ_IMPLIES_EXEC differently + depending on personality (e.g, native binary vs. x86 binary). + + This supports that (and makes the code more readable while at it) by + replacing the old architecture-specific fixed LEGACY_BINARIES macro + define with a architecture-specific "elf_read_implies_exec_binary()" + helper function. + + For now, x86 is the only user, and sets the "read implies exec" bit for + legacy apps. ia64 and x86-64 are likely to want to do their own thing. + + Acked by Ingo. + + Signed-off-by: Linus Torvalds + + + [IPSEC]: Missing unlock in policy timer. + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [AH6]: Disallow mutable bits after AH header. + + As we discussed before, mutable headers should not be allowed after + the AH header. In fact, this appears to be the intention of RFC 2402. + It is further clarified in section 3.1.1 of + + http://www.ietf.org/internet-drafts/draft-ietf-ipsec-rfc2402bis-07.txt + + This allows us to simplify the code in ah6.c. As a result, this also + fixes the following issues: + + * Dependence on skb->h in ah6_output(). + * Bogus clearing of auth_data of 2nd AH header in ipv6_clear_mutable_options(). + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [PKT_SCHED]: Make clock source configurable + + Signed-off-by: Patrick McHardy + Signed-off-by: David S. Miller + + + [PKT_SCHED]: Alpha not studly enough for SCH_CLK_CPU. + + The cycle counter it provides overflows very quickly, + on the order of 10 minutes, so it is not suitable for + this purpose. + + Signed-off-by: David S. Miller + + + [IPVS]: Convert to module_param. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [NET]: eql sparse cleanup. + + Minor 0 vs NULL cleanup + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [PATCH] ia64: Update function prototype for sn_io_addr + + Add "const" to function prototype for sn_io_addr. Cuts boot time + on simulator in half. + + Signed-off-by: Jack Steiner + Signed-off-by: David Mosberger + + + [SCTP] Mark chunks as ineligible for fast retransmit after they are + retransmitted. Also mark any chunks that could not be fit in the + PMTU sized packet as ineligible for fast retransmit. + + Signed-off-by: Sridhar Samudrala + + + [PATCH] Fix ppc64 max_pfn issue + + I noticed excessive time in the pid hash functions on a ppc64 box. It + turns out the pid hash is being sized way too small, eg on a 16GB box: + + PID hash table entries: 16 (order 4: 256 bytes) + + The reason is that the pid hash init function uses max_pfn before it was + setup on ppc64. With the following patch things are good again: + + PID hash table entries: 4096 (order 12: 65536 bytes) + + Signed-off-by: Anton Blanchard + Signed-off-by: Linus Torvalds + + + [CIFS] xattr suport part 2: add listxattr support + + Signed-off-by: Steve French (sfrench@us.ibm.com) + + + [PATCH] Fix ppc64 max_pfn issue - again + + It turns out in the non NUMA case, max_low_pfn doesnt get initialised + until init_bootmem so we need to move initialisation of max_pfn below + it. + + Signed-off-by: Anton Blanchard + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: exception path optimisations + + - We were statically predicting syscalls would be 32bit which meant every + 64bit syscall was guaranteed to be mispredicted. Just let the hardware + predict this one. + + - We shouldnt use blrl for indirect function calls, it is unlikely to be + predicted correctly and corrupts the link prediction stack. We should + use bctrl instead. + + - Statically predict a branch in the system call path, favouring calls from + userspace. + + - Remove static prediction in pagefault path, hardware prediction should do + a better job here. + + Signed-off-by: Anton Blanchard + Signed-off-by: Linus Torvalds + + + ppc64: fix more 0/NULL confusion + + + [IPV4/IPV6]: Add myself to MAINTAINERS. + + + Cset exclude: shemminger@osdl.org|ChangeSet|20040722205059|21273 + + + [AH4]: Save daddr iff options are present. + + This is a little optimisation for AH4. When I moved the tunnel code out, + I put the daddr copying code on the main path which is unnecessary since + daddr is only mutable if IP options are present. + + This patch moves the saving and restoring of daddr under the check for + the existence of IP options. + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [AH6]: Replace skb by iph in clear_mutable_options. + + This patch replaces the skb argument in ipv6_clear_mutable_options() by + an ipv6hdr. Doing so allows us to point skb->nh elsewhere when calling + this function. + + I've also thrown in some obvious clean-ups for that function. + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [NET]: Use NET_IP_ALIGN in acenic. + + Use NET_IP_ALIGN in acenic driver. Also remove the 16 byte padding, + caches can be anywhere from 16 to 256 bytes and the skb should be + cacheline aligned already. + + Signed-off-by: Anton Blanchard + Signed-off-by: David S. Miller + + + [SCTP]: Fix mis-merge. + + + [PATCH] sparse: simplify and tighten sparse typechecking + + This takes advantage of the simplified typeof semantics of sparse + address spaces, (should be enough for alpha, i386, ppc, ppc64, sparc, + sparc64, x86_64 - most of them didn't actually need anything to be done) + and couple of missing annotations that got caught by that. + + + Cset exclude: davem@nuts.davemloft.net|ChangeSet|20040723204655|22654 + + + [XFRM]: Wake up km_waitq once per gc-run instead of once per state. + + Signed-off-by: Patrick McHardy + Signed-off-by: David S. Miller + + + [IPV6]: Fix route.c gcc-3.4.x inlining error. + + Fixes the inline error when compiling net/ipv6/route.c with gcc-3.4.1 + + Signed-off-by: Con Kolivas + Signed-off-by: David S. Miller + + + [PATCH] populate nonlinear mappings unconditionally + + filemap_populate and shmem_populate must install even a linear file_pte, + in case there was a nonlinear page or file_pte already installed there: + could only happen if already VM_NONLINEAR, but no need to check that. + + Acked by Ingo and Hugh. + + Signed-off-by: Hugh Dickins + Signed-off-by: Linus Torvalds + + + [PATCH] ia64: fix bug in irq_affinity_write_proc() + + Writing 'R' or 'r' character to /proc/irq//smp_affinity + cause a kernel Oops. The following patch fixes this issue. + + Signed-off-by: Kenji Kaneshige + Signed-off-by: David Mosberger + + + ia64: Clean up arch/ia64/kernel/irq.c a bit. + + + [CIFS] xattr support part 3 add query EA support to retrieve individual xattr values + + Signed-off-by: Steve French (sfrench@us.ibm.com) + + + ia64: Oops, SN2 needs pending_irq_cpumask to be global. + + + [PATCH] size_t portability fixes + + A lot of places assumed that size_t == unsigned; on 64bit boxen that is not + true. + + Signed-off-by: Linus Torvalds + + + [PATCH] appletalk SIOCADDRT fix + + blind dereferencing of userland pointer in appletalk SIOCADDRT handling. + + Signed-off-by: Linus Torvalds + + + [PATCH] rndis fix + + blind dereferencing of userland pointers in procfs ->write() in rndis.c + + Signed-off-by: Linus Torvalds + + + [PATCH] bluetooth annotations + + Signed-off-by: Linus Torvalds + + + [PATCH] more NULL noise removal in sound/* + + Signed-off-by: Linus Torvalds + + + [PATCH] #if abuse is sound/* + + Signed-off-by: Linus Torvalds + + + [PATCH] tea575 fix + + Very confused ioctl in tea575x - it is called via video_usercopy(), but + assumes that it still has userland pointers. Fixed. + + Signed-off-by: Linus Torvalds + + + [PATCH] check_region fixes + + A couple of old ISA drivers had trivial to fix check_region() uses. + Sanitized. + + Signed-off-by: Linus Torvalds + + + [PATCH] dmasound annotation + + dmasound (core + ppc-specific parts) annotated + + Signed-off-by: Linus Torvalds + + + [PATCH] misc sound/* fixes + + a) ALSA variant of wavefront didn't compile on gcc 2.x with debugging + turned on - authors heard something about variadic macros on gcc 2.x, + but screwed it up. Fixed. + b) au88x0 relied on char being signed in non-trivial ways. On ppc it's + not true. Fixed by explicit use of s8 (which is what that code really + wants). + + Signed-off-by: Linus Torvalds + + + [PATCH] broken stuff in sound/* marked as such in Kconfig + + a) OSS is broken on sparc64 (as in "won't compile") + b) sb16_csp is broken on ppc + marked as such in Kconfig + + Signed-off-by: Linus Torvalds + + + [PATCH] security/selinux/hooks.c compile fix + + added missing #include + + Signed-off-by: Linus Torvalds + + + [PATCH] openpromfs annotation + + Signed-off-by: Linus Torvalds + + + [PATCH] more NULL noise removal in fs/* + + Signed-off-by: Linus Torvalds + + + [PATCH] bpck6 compile fix on ppc + + bpck6 was b0rken on ppc in rather amusing way - it used + typedef struct ... PPC; + which doesn't mix with having PPC (pre)defined to 1. Fixed by renaming private + typedef in question. + + Signed-off-by: Linus Torvalds + + + [PATCH] impi annotation + + drivers/char/ipmi/* annotated, structure shared between kernel and + userland (ioctls) split in two. + ACPI callback in the same code used to have wrong type - it should've been + void (...), not u32 (...). Fixed. + + Signed-off-by: Linus Torvalds + + + [PATCH] mtd fixes + + Assorted mtd fixes. + a) NULL noise removal + b) %p pointer instead of %x (int)pointer in printks + c) missed iovec->kvec replacements (basically, fixing merge problems) + d) fixed type for (unused) last argument in doc_{read,write}_ecc() + e) sanitized some comparisons. + + Signed-off-by: Linus Torvalds + + + [PATCH] NULL noise removal in drivers/net/* + + That definitely duplicates a bunch of stuff in pending patches from various + folks, but since it's all trivial 0->NULL replacements and patches are still + not submitted and/or merged... + + Signed-off-by: Linus Torvalds + + + [PATCH] #if abuse in drivers/net/* + + Signed-off-by: Linus Torvalds + + + [PATCH] solaris emulation annotated + + trivial annotations and cleanups + proper use of vfs_...stat(). + + Signed-off-by: Linus Torvalds + + + [PATCH] sparc32 emulation annotated + + annotated, a bunch of ioctls switched to compat_alloc_user_space() and + cleaned up. + + Signed-off-by: Linus Torvalds + + + [PATCH] NULL noise removal on ppc + + 0->NULL in arch/ppc and include/asm-ppc. + + [That's it for this series - there's still ~200Kb to merge, but I'd rather + take a break for a couple of hours before dealing with the rest] + + Signed-off-by: Linus Torvalds + + + [PATCH] drm/gamma_old_dma.h fix + + blind dereferencing of userland pointer + + Signed-off-by: Linus Torvalds + + + [PATCH] NULL noise removal in drivers/* + + it could be split (all chunks are obviously independent), but I don't think + that it's worth doing. + + Signed-off-by: Linus Torvalds + + + [PATCH] CONFIG_MCOUNT fix for sparc64 + + CONFIG_MCOUNT on sparc64 is currently broken; we have both mcount and _mcount + declared (and aliased to each other), but end up exporting the wrong one. As + the result, with that option all modules get unresolved symbol. + + Signed-off-by: Linus Torvalds + + + [PATCH] #if abuses in drivers/* + + Signed-off-by: Linus Torvalds + + + [PATCH] annotations for arch/ppc and include/asm-ppc + + Usual set - explicit -D=1 for sparse, __sighandler_t / __sigrestore_t + annotated, annotations in arch/ppc/kernel/*, etc. - same as for other platforms + + Signed-off-by: Linus Torvalds + + + [PATCH] cciss compat ioctl fix + + cciss compat ioctls were broken (mixing kernel and userland pointers); + fixed (and cleaned up) by switch to compat_alloc_user_space() and elimination + of set_fs(). + + Signed-off-by: Linus Torvalds + + + [PATCH] zoran switched to seq_file + + zoran procfs code switched to seq_file and cleaned up; a bunch of homegrown + procfs glue eliminated. + + Signed-off-by: Linus Torvalds + + + [PATCH] dpt_i2o annotations + + Signed-off-by: Linus Torvalds + + + [PATCH] via-velocity switched use of to if_mii() + + Either it got missed back when if_mii() was introduced, or it got merged + that way later. + + Signed-off-by: Linus Torvalds + + + [PATCH] drivers/macintosh annotations + + Signed-off-by: Linus Torvalds + + + [PATCH] pointer-to-int conversion fixes + + Assorted pointer-to-int fixes: + a) some places want to take pointer modulo alignment or extract + integer that was cast to pointer (which is legitimate), but do that via + wrong cast, triggering sparse warnings. + b) usual %x (int)ptr -> %p ptr fixes + + Signed-off-by: Linus Torvalds + + + [PATCH] ffb_context annotation + + Signed-off-by: Linus Torvalds + + + [PATCH] asm-ppc/reg.h namespace pollution fixes + + asm-ppc/reg.h defines pollutes namespace like there's no tomorrow; + among other things there are + LR + SR0...SR15 + DEC + etc. + + That breaks quite a few drivers that should otherwise work on ppc. SR... + and LR were never used by ppc code; commented out in reg.h (note that + they are just aliases for SPRN_SR... and SPRN_LR). RPA commented out and + its instances in ppc code (all four of them) replaced with SPRN_RPA. Ditto + for DEC. The rest of the offenders (DAR and PVR) are left alone for now and + #undef'ed in drivers in question. + + We probably want to rip all these guys out of reg.h and convert ppc users + to SPRN_... forms - file ends up included in alot of places and namespace + pollution like that is a Bad Thing(tm). + + Signed-off-by: Linus Torvalds + + + [PATCH] missing (void) in reiserfs on big-endian boxen + + Usual foo ? void : non-void in reiserfs; gets triggered on big-endian + platforms. + + Signed-off-by: Linus Torvalds + + + [PATCH] broken stuff marked as such in Kconfig + + a) ppc KGDB builds only on two subarch; say so in Kconfig + b) ide-pmac.c can't be a module; make it dependent on IDE=y. + c) a bunch of isdn drivers is broken on ppc; marked as such + d) oaknet is broken; marked as such (includes on files that do not + exist, etc.) + e) buslogic and cyber2000 are broken on sparc64 + f) s3trio framebuffer is broken + g) usual 8250-based serial is broken on sparc64; in principle it might + be worth supporting (there are PCI cards of that sort), for now marked as + broken (no asm/serial.h, to start with). + + Signed-off-by: Linus Torvalds + + + [PATCH] drivers/ieee1394 annotation + + Signed-off-by: Linus Torvalds + + + [PATCH] signed char fixes in drivers/* + + a couple of "replace char with explicit s8 to make sure it's really + signed" fixes. + + Signed-off-by: Linus Torvalds + + + [PATCH] inline reordering in drivers/* + + usual "shift definition of inlines before their uses" in a couple of + places in drivers/* + + Signed-off-by: Linus Torvalds + + + [PATCH] cpumask updates in open_pic.c (ppc) + + compile fixes in open_pic.c - it missed cpumask conversion in several + places. + + Signed-off-by: Linus Torvalds + + + [PATCH] wrong ifdef in ppc/kernel/setup.c (nvram) + + Wrong ifdef around ppc nvram_read_byte() - it should be + CONFIG_GENERIC_NVRAM. + + [that's it for today; there's more (fb stuff), but I'd rather make that + a separate series] + + Signed-off-by: Linus Torvalds + + + ia64: Update defconfig + + + ia64: Update for elf_read_implies_exec() macro changes in mainline tree. + + + [CIFS] xattr support part 4 add set EA support + + Signed-off-by: Steve French (sfrench@us.ibm.com) + + + [PATCH] prism54 Fix reference to uninitialized pointer + + * oid_mgt.c is calling islpci_mgt_transaction passing the address + of a pointer to the management frame. This is not being + initialized by the caller. The callee only updates this + pointer when successful. When not, boom. + + * Being ultracautious again, not only initialize in the caller, + also null out the pointer unconditionally in the callee. + + + [PATCH] prism54 Refix TRDY/RETRY_TIMEOUT + + * Reintroduce pushing 0 into the TRDY_TIMEOUT and RETRY_TIMEOUT + registers. Make this configurable with module parameter + init_pcitm. + + * We now have the ludicrous situation that some hardware setups + require this (not even pushing 0xFF helps), whilst others + don't care either way (the majority), and yet others bork + if anything is pushed into these regs. + If anybody can explain this (including Conexant :-) ), my ears + are open. + + + [PATCH] prism54 Fix initialization with older firmware + + * In the card initialization routine, we try to set the + output power. For firmware < 1.0.4.3, this leads to a + worrying "mgt_commit has failed .." in the log although + the device continues to react normally. + Fix is simple, do not try to configure output power. + (which I believe we should not be doing anyway as it is + probably against local country regulations) + + + [PATCH] prism54 Fix null pointer reference (Bug 100) + + * prism54_get/set_debug_oid are missing checks for a null pointer. + Reported in Bugzilla number 100. + + + [SPARC64]: Kill all this silly inline memcpy handling. + + GCC does this well enough. + + Signed-off-by: David S. Miller + + + [Bluetooth] Replace BCSP retransmitting message with BT_DBG + + The message "Timeout, retransmitting 1 pkts" is not an error and so + change this into a debug message. + + Signed-off-by: Marcel Holtmann + + + drivers: move STANDALONE to drivers/base/Kconfig + + Move STANDALONE from init/Kconfig to drivers/base/Kconfig . + This way, it's besides PREVENT_FIRMWARE_BUILD. + + Signed-off-by: Adrian Bunk + Signed-off-by: Sam Ravnborg + + + [Bluetooth] Replace schedule_timeout() with msleep() + + Use msleep() instead of schedule_timeout() to guarantee the task + delays at least the desired time amount. + + Signed-off-by: Nishanth Aravamudan + Signed-off-by: Marcel Holtmann + + + PPC32: Finish support for the EmbeddedPlanet RPX8260 board. + From Dan Malek and myself. + + + kbuild: Create Makefile in output directory if != kernel tree + + When building a kernel using the O= syntax to save output + files in a separate output directory now create a small Makefile in + that same dir. + This Makefile allow one to use make in the output directory without + the hassle of going back to the kernel source tree. + The O= option is added by this Makefile stub. + Please note that the Makefile silently overwrite an old one, so changes + will be lost if modified. + If there is a need to tweak a Makefile in the output directory it is recommended + to use the filename 'makefile', which GNU Make will try first. + + Signed-off-by: Sam Ravnborg + + + kbuild: Introduce source symlink in /lib/modules/.../ + + Traditionally when building a kernel the source and the + output files are mixed. + + When building a kernel using the O= syntax to save output + files in a separate directory a way is needed to locate + the kernel source. + The implemented solution is a new symlink 'source' being + added to /lib/modules/.../ + used to locate source for an installed kernel. + The original symlink build points to the directory + containing the output files. + + Please note that when the kernel is build with source and + output files mixed the two symlinks 'build' and 'source' + will point to the same directory, thus no changes + compared to before. + + Two options was considered: + a) Adding a new symlink pointing to the output files "object" + => All external modules have to specify O= to build + => External modules grepping in .config or .h files + in include/asm needs to be updated + => External modules that do grep in source code and + ordinary header files just works + + b) Let the build symlink point to the output files and introduce a new + symlink "source" pointing to the kernel source + => External module can be build without specifying O= + => External modules grepping in .config or .h files + in include/asm just works + => External modules that do grep in source code and + ordinary header files needs to be updated + + Based on the above option b) is considered the least painfull alternative. + + So to sum up: + - If a distro does not use separate output dir => no change + - If a distro uses separate output dir => + - Trivial external module just builds + - Non-trivial (build-wise) external modules are probarly broken + + Without this patch + - If a distro does not use separate output dir => no change + - If a distro uses separate output dir => + - Trivial external modules had to specify O= to build, + and the directory being pointed at was not obvious + - grep in .config or include files in asm/ required + knowledge where to locate output files + + Preferred syntax for building external modules are the following: + + make -C /lib/modules/`uname -r`/build M=`pwd` + + [Substituting 'M=...' with 'SUBDIRS=... modules' give same effect]. + + When the kernel is built using separate output directory the above + invocation of make will invoke the generated Makefile located in the output + directory - that again will invoke the Makefile located in the kernel + source tree root. + + Patch includes contributions from: + Andreas Gruenbacher + + Signed-off-by: Sam Ravnborg + + + [PATCH] x86-64 fixes + + This fixes several small but serious x86-64 bugs in 2.6.8rc2: + + - Fix array overflow in PCI bus checking (Travis Betak) + - Fix broken pci_map_sg in swiotlb (Suresh B. Siddha) + - Remove bogus bus check in IOMMU code + + Signed-off-by: Linus Torvalds + + + [SPARC32]: Remove duplicate pci_dma_mapping_error(). + + + [IPV6]: Fix gcc-341 inlining for real. + + Signed-off-by: Con Kolivas + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [SPARC]: bbc_envctrl: Replace schedule_timeout() with msleep(). + + Signed-off-by: Nishanth Aravamudan + Signed-off-by: David S. Miller + + + [SPARC]: envctrl: Replace schedule_timeout() with msleep(). + + Signed-off-by: Nishanth Aravamudan + Signed-off-by: David S. Miller + + + [ATM]: [lec] remove unnecessary inlines (from Adrian Bunk ) + + Signed-off-by: Adrian Bunk + Signed-off-by: Chas Williams + Signed-off-by: David S. Miller + + + [AH6]: Get things working again. + + Re: [AH6] Disable mutable bits after AH header + + Unfortunately I broke ah6_input() in that patch. Thanks to Miyazawa-san + for notifying me of the problem. + + In that patch I removed the nh_offset parameter to ipv6_clear_mutable_options. + That broke ah6_input() because it relies on that variable to set the nexthdr. + + The following patch fixes this by moving this work out to the caller + xfrm6_rcv() where the information is already available. It also removes + an unnecessary call to ip6_find_1stfragopt() in xfrm6_rcv() since nhoffp + already points to the nexthdr preceding the current header. + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [SPARC]: bbc_envctrl.c needs linux/delay.h + + + [IPV6] fix typoes in macro definitions. + + Signed-Off-By: Hideaki YOSHIFUJI + + + [IPV6] remove unused macro. + + + [IPV6] fix the order of icmpv6 definitions for consistency. + + Signed-off-by: Hideaki YOSHIFUJI + + + [IPV6] add missing known icmpv6 types. + + Signed-off-by: Hideaki YOSHIFUJI + + + [PATCH] SATAPI despite no data + + I see we lost this source line in the changes since 2.6.7. But if I try + SATAPI expecting no data without this source line, then my ata_piix.ko + promptly dies with such complaints as: + + kernel: irq 18: nobody cared! + + With this source line, I find I can expect no data, though I still have + to add auto sense to overcome: + + kernel: ata2: BUG: timeout without command + + + [ata] fix reversed bit definitions in linux/ata.h + + The macros ata_id_has_lba() and ata_id_has_dma() seem to have their bits + reversed. LBA support is bit 9 of word 49 in the identify page, whereas + DMA support is bit 8 of word 49 in the identify page. + + + [sound/oss i810] add MMIO DSP support + + Enclosed is a patch for the i810_audio OSS driver to support using + memory-mapped I/O for those chipsets that support it. + + o Added a family of macros -- I810_IOREADx() and I810_IOWRITEx() -- that + key off the existing card->use_mmio flag to select between using readx/writex + or inx/outx for I/O operations. + + o Converted existing inx/outx invocations to use + I810_IOREADx/I810_IOWRITEx instead. + + o Changed GET_CIV(), GET_LVI, and CIV_TO_LVI() not only to use + I810_IOREADx/I810_IOWRITEx but also to take "card" (i.e. struct i810_card) + paramter. + + o Removed check for "Pure MMIO interfaces" in i810_probe() -- replaced w/ + (relocated) check for no I/O resources available. + + + [sound/oss i810] misc small changes + + Attached is a second patch to account for (most of) Herbert Xu's + comments. + + I have left-out the part about changing state->card to a + local variable where it is used a lot. Unfortunately, that usage is + somewhat pervasive and I would prefer to make those changes in a separate + patch -- after I have had a chance to do some testing. + + If you'd prefer one patch to account for the original plus these + changes, let me know and I'll be happy to provide it. + + + # Signed-off-by: Gordon Jin + # Signed-off-by: Arun Sharma + # Signed-off-by: Tony Luck + + + [PATCH] cirrusfb: discarded in section `.exit.text' from drivers/built-in.o + + This patch fixes the error in the subject line. + + + [SPARC64]: Simplify and optimize ultra3 memory copies. + + - Use one unrolled loop instead of two + - Improve performance for well aligned + copies smaller than 256 bytes + - Use better named local label names so + that diffing between the various instances + is much easier to read + - Reverify exception handling + + Signed-off-by: David S. Miller + + + [SPARC64]: Update defconfig. + + + [PKT_SCHED]: de-inline qdiscipline locking functions + + This qdisc code has several inline functions for locking that is only + used when adding/deleting queuing disciplines; so make them functions + instead. The new qdisc_lock_tree encapsulates the locking used throughout + this code. + + Also qdisc_run() is only called from net/core/dev.c so it should be + defined there. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [NET]: Kill rtnl_exlock stubs. + + Rtnetlink has some macro's that are relics from earlier locking. + They are only used a couple of places so are easy to kill. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [NET]: Remove useless variable in rtnetlink_rcv_msg + + Signed-off-by: Patrick McHardy + Signed-off-by: David S. Miller + + + [BRIDGE]: Fix typo in br_stp.c + + Signed-off-by: Tommi Virtanen + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [NET]: Use msleep() in sungem driver. + + Signed-off-by: Nishanth Aravamudan + Signed-off-by: David S. Miller + + + [IPSEC]: xfrm_user code forgets to call xfrm_probe_algs() + + Signed-off-by: Masahide Nakmura + Signed-off-by: David S. Miller + + + [NET]: Convert ethertap to use module_param + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [NET]: Convert pktgen to use module_param + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [CIFS] xattr support for cifs filesystem part 5 of 5, add removexattr capability + + Signed-off-by: Steve French (sfrench@us.ibm.com) + + + [SPARC64]: Do not duplicate compat dirent code. + + + [CIFS] Resize cifs request buffer mempools as tcp sessions are added to avoid potential deadlocks. + + Signed-off-by: Steve French (sfrench@us.ibm.com) + + + [PATCH] fixes for rcu_offline_cpu, rcu_move_batch + + rcu_offline_cpu and rcu_move_batch have been broken since the list_head's + in struct rcu_head and struct rcu_data were replaced with singly-linked + lists: + + CC kernel/rcupdate.o + kernel/rcupdate.c: In function `rcu_move_batch': + kernel/rcupdate.c:222: warning: passing arg 2 of `list_add_tail' from + incompatible pointer type + kernel/rcupdate.c: In function `rcu_offline_cpu': + kernel/rcupdate.c:239: warning: passing arg 1 of `rcu_move_batch' from + incompatible pointer type + kernel/rcupdate.c:240: warning: passing arg 1 of `rcu_move_batch' from + incompatible pointer type + kernel/rcupdate.c:236: warning: label `unlock' defined but not used + + Kernel crashes when you try to offline a cpu, not surprisingly. + + It also looks like rcu_move_batch isn't preempt-safe so I touched that up, + and got rid of an unused label in rcu_offline_cpu. + + Signed-off-by: Nathan Lynch + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Fix UNIX98 pty indices leak + + I noticed that our PPPoE/PPtP access concentrator leaks pty devices. + When all 4096 indices are leaked, there was need to reboot it. + + The following patch fixes this problem. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sched: initialize sched domain table + + Here is a trivial patch that is required to boot the latest 2.6.7 tree + on the SGI 512p system. + + Initialize the busy_factor in the sched_domain_init table. Otherwise, + booting hangs doing excessive load balance operations. + + Signed-off-by: Jack Steiner + Signed-off-by: Ingo Molnar + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] compat_clock_getres shouldn't return -EFAULT if res == NULL + + For clock_getres(clockid_t clock_id, struct timespec *res), the specification + says "If res is NULL, the clock resolution is not returned." So this kind of + call should succeed. The current implementation returns -EFAULT. + + The patch fixes the bug in compat_clock_getres(). + + Signed-off-by: Gordon Jin + Signed-off-by: Arun Sharma + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] BIO page refcounting fix + + Hopefully fixes the free-of-a-freed-page BUG caused during CDRW writing. + + This also fixes a problem in the bouncing for io errors (it needs to free + the pages and clear the BIO_UPTODATE flag, not set it. it's already set. + passing -EIO to bio_endio() takes care of that). + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] selinux: fix clearing of new personality bit on security transitions + + This patch moves the clearing of the new personality bit from + selinux_bprm_apply_creds (called from compute_creds) to + selinux_bprm_set_security (called from prepare_binprm). This ensures that the + bit is cleared at the same point in exec processing as for setuid/setgid + binaries, prior to setting up the new image. + + Signed-off-by: Stephen Smalley + Signed-off-by: Ingo Molnar + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] install_page vs. vmtruncate + + BK is still missing one piece for Oleg's install_page/vmtruncate races. + Oleg didn't explicitly ACK this, but I think he did implicitly: Oleg? + + The previous patch to install_page, returning an error if !page_mapping + once page_table_lock is held, is not enough to guard against vmtruncate. + + When unmap_mapping_range already did this vma, but truncate_inode_pages has + not yet done this page, page->mapping will still be set, but we must now + refrain from inserting the page into the page table. + + Could check truncate_count, but that would need caller to read and pass it + down. Instead, recheck page->index against i_size, which is updated before + unmap_mapping_range. Better check page->mapping too: not really necessary, + but it's accidental that index is left when mapping is reset. + + Also, callers are expecting -EINVAL for beyond end of file, not -EAGAIN. + + Signed-off-by: Hugh Dickins + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] swapoff mmap_sem deadlock + + Updating the mm lock ordering documentation drew attention to the fact that + we were wrong to blithely add down_read(&mm->mmap_sem) to swapoff's + unuse_process, while it holds swapcache page lock: not very likely, but it + could deadlock against, say, mlock faulting a page back in from swap. + + But it looks like these days it's safe to drop and reacquire page lock if + down_read_trylock fails: the page lock is held to stop try_to_unmap + unmapping the page's ptes as fast as try_to_unuse is mapping them back in; + but the recent fix for get_user_pages works to prevent that too. + + Signed-off-by: Hugh Dickins + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] DVB major number + + The DVB merge forgot an important change - DVB is currently using + major 250, which is "local" while devices.txt (and thus FSSTND/LSB) require + it uses the officially allocated 212 major. + + Fortunately most 2.6 users don't currently use DVB and vendors ship devfs + or versions of makedev that do the right thing and generate 212 majors. + + Fix below, original author: Red Hat , OSDL certificate + of authorship included by reference. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] dvb_usercopy() fix + + Fix some breakage in dvb_usercopy() introduced by sparse cleanups in -rc2. + + Signed-off-by: Johannes Stezenbach + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] page align emergency stack + + The PPC64 ABI requires the stack to be 128 byte aligned (and that can + become important if AltiVec registers are saved there). In the kernel, + that's usually dealt with by the fact that the stack has a page + more-or-less to itself. However, the emergency stacks (used in SMP bringup + and when we detect a bad stack pointer) aren't necessarily page aligned, or + anything aligned for that matter. This patch applies the necessary + alignement constraint to them. + + Signed-off-by: David Gibson + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: remove multiple IRQ optimisation + + ppc64 has an optimisation where it loops on get_irq until there are no more + interrupts to be handled. Mark Hack notes that this optimisation hardly + ever hits and costs us a potentially expensive extra read of an interrupt + register every interrupt. + + Also make do_IRQ void, the callers never use the return value. + + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: cpu hotplug fix + + On Power4 and earlier hardware there is no need to clear the CPPR (see RPAp + 479 section 18.5.4.7.2 for what little info there is on the CPPR) when + stopping a cpu. On hardware that uses Power5 an undocumented change has + been made that requires the CPPR to be cleared if an isolate is to be done + on the stopped cpu. So the following patch lets cpu hotplug work on the + recent hardware. + + I sent this patch to the ppc64-dev list back in mid April and Suse picked + it up then for SLES9 so it has been well tested for several months. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: Fix RAS irq handlers + + On pSeries systems, the firmware tells us a list of interrupt numbers + that we should enable in order to detect various error conditions. + When we get one of these interrupts we are supposed to call the + firmware, which will work out and tell us what the error was and + possibly also fix it. + + We were not correctly parsing the property values that tell us which + interrupts need to be handled in this fashion. This patch fixes it. + It exports prom_n_intr_cells from prom.c since that is needed to do + the parsing properly. + + Signed-off-by: Paul Mackerras + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: whitespace cleanup in prom.c + + This patch, originally from Linas Vepstas, cleans up some wonky indentation + and other formatting issues in arch/ppc64/kernel/prom.c. It does not change + any actual code. + + Signed-off-by: Linas Vepstas + Signed-off-by: Paul Mackerras + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64 SMT bugfix + + This patch is fairly straightforward. maxcpus should be per SMT thread and + not per physical processor. SUSE picked this up back in May (was discussed + on ppc64 mailing list) and has had no trouble with it. + + Signed-off-by: Joel Schopp + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: HVCS driver + + * include/asm-ppc64/hvcserver.h + + New file added to wrap ppc64 architecture specific firmware calls for + use by HVCS. This file provides a struct hvcs_partner_info definition, + headers for partner info gathering and vterm connection and termination + interfaces. + + * arch/ppc64/kernel/Makefile + + Added build directive for hvcserver.o when HVCS is configured. + + * arch/ppc64/kernel/hvconsole.c + + Exported hvc_put_chars() and hvc_get_chars() for use by HVCS. + + * arch/ppc64/kernel/hvcserver.c + + Body of hvcserver module which accompanies the hvcs module and provides + ppc64 architecture firmware calls for use by HVCS. This file provides + function bodies for partner info gathering and vterm connection and + termination interfaces. + + * drivers/char/Kconfig + + Added CONFIG_HVCS option for both built-in version and module version + of hvcs. + + * drivers/char/Makefile + + Added build directive for hvcs.o when CONFIG_HVCS is configured. + + * drivers/char/hvcs.c + + This is the device driver for the IBM Hypervisor Virtual Console + Server, "hvcs". The IBM hvcs provides a tty driver interface to allow + Linux user space applications access to the system consoles of logically + partitioned operating systems, e.g. Linux, running on the same + partitioned Power5 ppc64 system. Physical hardware consoles per + partition are not practical on this hardware so system consoles are + accessed by this driver using inter-partition firmware interfaces to + virtual terminal devices. + + * Documentation/powerpc/hvcs.txt + + HVCS installation and usage documentation. + + Thanks everyone for all the help with this driver [Andrew Morton, Paul + Mackerras, Ben Herrenschmidt, Dave Hansen, Paul Mackerras, Dave Boutcher, + Hollis Blanchard, Santiago Leon, Brian King, Randy Dunlap]. + + Signed-off-by: Ryan S. Arnold + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32: Fix PPC44x early uart setup + + Fix a bug introduced in the PPC44x early uart setup from the last set of + 44x fixes. + + Signed-off-by: Matt Porter + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32: export some DMA API symbols + + Exports some DMA API symbols so module clients work. + + Signed-off-by: Matt Porter + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32: fix comment in arch/ppc/platforms/pmac_pci.c + + Typos. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32: add gcc-3.4+binutils-2.14 check + + Add a build-time check for gcc-3.4 and binutils-2.14. They don't play well + together. + + Signed-off-by: Tom Rini + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] macintosh/adb: replace schedule_timeout() with msleep() + + Use msleep() instead of schedule_timeout() to guarantee the task delays the + desired time. + + Signed-off-by: Nishanth Aravamudan + Cc: Benjamin Herrenschmidt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ide/pmac: replace schedule_timeout() with msleep() + + Use msleep() instead of schedule_timeout() to guarantee the desired delay. + + Signed-off-by: Nishanth Aravamudan + Cc: Benjamin Herrenschmidt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] macintosh/mediabay: replace schedule_timeout() with msleep() + + Use msleep() instead of schedule_timeout() to guarantee the task delays the + desired time. + + Signed-off-by: Nishanth Aravamudan + Cc: Benjamin Herrenschmidt + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] drivers/macintosh/macserial.c MIN/MAX removal + + Removes unnecessary min/max macros and changes calls to use kernel.h macros + instead. + + Signed-off-by: Maximilian Attems + Cc: + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Make get_user_pages() work again for ia64 gate area + + Changeset + + roland@redhat.com[torvalds]|ChangeSet|20040624165002|30880 + + inadvertently broke ia64 because the patch assumed that pgd_offset_k() is + just an optimization of pgd_offset(), which it is not. This patch fixes + the problem by introducing pgd_offset_gate(). On architectures on which + the gate area lives in the user's address-space, this should be aliased to + pgd_offset() and on architectures on which the gate area lives in the + kernel-mapped segment, this should be aliased to pgd_offset_k(). + + This bug was found and tracked down by Peter Chubb. + + Signed-off-by: + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Fix rivafb's NV_ARCH_, cleanup DEBUG, backlight control on ppc + + - fixes the PCI-IDs (needed to get it to work on at least the NV17) + + - cleans up the DEBUG option (similar to the new radeonfb). This also + makes it easy to replace printk by btext_printf() (on ppc) or similar to + ease debugging of the fb code when all else fails. + + - adds backlight control for Apple powerbooks + + Signed-off-by: Guido Guenther + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] hugetlbfs vm_pgoff bugs + + 1. hugetlbfs_file_mmap() must check that vm_pgoff is hugepage aligned. + + 2. hugetlb_vmtruncate_list() confuses << with >> while converting + vm_pgoff to huge page offset, and zaps wrong area. + + Signed-off-by: Oleg Nesterov + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fdomain_cs needs ISA + + drivers/scsi/pcmcia/fdomain_cs.ko needs unknown symbol isa_memcpy_fromio + drivers/scsi/pcmcia/fdomain_cs.ko needs unknown symbol isa_readb + + iirc the isa bus isn't available on ppc. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] v850: Define find_first_bit + + Signed-off-by: Miles Bader + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] radeonfb x86_64 fix + + Fix radeonfb and aty128fb on x86_64 by using the correct ifdef. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sign fix in swapfile.c + + CC mm/swapfile.o + mm/swapfile.c: In function `scan_swap_map': + mm/swapfile.c:114: warning: comparison between signed and unsigned + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Remove dead comment in mm/filemap.c + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix for buffer limit for long in sysctl.c + + Fix a bug in do_proc_doulongvec_minmax() where the the string buffer was + too short to parse a 64-bit number expressed in decimal. That was causing + problems with entries in /proc/sys using long and allowing large number + (such as -1) + + Signed-off-by: Stephane Eranian + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ipmi_msghandler module load failure fix + + On a 2.6.7 kernel, when I try to modprobe ipmi_msghandler, it fails to load + with following message: + + FATAL: Error inserting ipmi_msghandler (/lib/modules/2.6.7/kernel/drivers/char/ipmi/ipmi_msghandler.ko): Invalid module format + + And there is an error message in dmesg: + + ipmi_msghandler: init symbol 0xa000000200058080 used in module code at a000000200031b32 + + What I have been able to determine is that ipmi_msghandler.c defines + ipmi_init_msghandler() as the module_init() routine and then it also calls + ipmi_init_msghandler() diretcly from couple of other places. This does not + seem to be okay in 2.6.7 kernel. I was able to fix this by defining a new + module_init routine which in turn calls ipmi_init_msghandler(). I also + removed __init from ipmi_init_msghandler() since it gets called from + ipmi_open() on an open of the ipmi device file. So I would think we want + to keep ipmi_init_msghandler() around even after initialization. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] remove scripts/mkconfigs + + This script is no longer used after the patch to consolidate the stored + configs. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix readahead breakage for sequential after random reads + + Current readahead logic is broken when a random read pattern is followed by + a long sequential read. The cause is that on a window miss ra->next_size + is set to ra->average, but ra->average is only updated at the end of a + sequence, so window size will remain 1 until the end of the sequential + read. + + This patch fixes this by taking the current sequence length into account + (code taken from towards end of page_cache_readahead()), and also setting + ra->average to a decent value in handle_ra_miss() when sequential access is + detected. + + Signed-off-by: Miklos Szeredi + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] MAINTAINERS: update mailing list for osst + + This list has been on sourceforge for a while now, please apply this patch + to make MAINTAINERS reflect that. + + Signed-off-by: Willem Riede + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] M68k 68060 errata I14 + + M68k: gcc lately manages to generate the code sequence described in the 060 + errata I14, so use the described workaround (from Roman Zippel) + + Signed-off-by: Roman Zippel + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] M68k ifpsp060 + + 68060 Integer Support Package: Fix _060_real_lock_page(): test %d0 before + actually using it (from Roman Zippel) + + Signed-off-by: Roman Zippel + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] m68k sparse missing void + + M68k: Add missing `void' parameters (found by sparse) + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] m68k sparse #if vs. #ifdef + + M68k: Use #ifdef instead of #if (found by sparse) + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] m68k sparse void return + + M68k: Don't return anything in functions returning void (found by sparse) + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] m68k sparse extern + + M68k: Remove `extern' at function definition (found by sparse) + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] m68k sparse inline + + M68k: Define inline functions before use (found by sparse) + Affected drivers: + - Atari floppy + - Amiga A2232 serial + - Amiga Fastlane SCSI + - Mac/PowerMac Valkyrie frame buffer + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] dsp56k sparse const + + Atari dsp56k: Add missing `const' keywords (found by sparse) + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] m68k sparse floating point + + M68k: Replace floating point by integer constants (found by sparse) + Affected drivers: + - Amiga frame buffer + - ATI Mach64 frame buffer + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] dnfb sparse struct init + + Apollo Frame buffer: Fix C99 struct initializers (found by sparse) + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] amifb sparse &= + + Amiga Frame buffer: Use `&' instead of `&=' (found by sparse, present since at + least 2.0.x) + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] m68k hardirq.h + + M68k: Add missing #include + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] dmasound paths + + Dmasound was moved to sound/oss/ a while ago + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] M68k bitops + + M68k: Add `volatile' to some bitops parameters, as this is required by the + cpumask code in 2.6.8-rc1. + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] M68k checksum include + + M68k: Add missing include, showing up due to include reshuffling in 2.6.8-rc1 + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] M68k pgalloc fixup + + M68k: Fix build after surgery in 2.6.8-rc1: + - Add missing include on machines with a standard m68k MMU + - Convert __pte_free_tlb() to a macro (like it is on most other archs) on + Sun-3, to avoid include hell + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] M68k Maintainership + + M68k maintainership update: + - Transfer maintainership to Roman and me (ack'ed by Jes and Roman) + - Update main website URL + - Add Linux/m68k CVS repository website + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] depends on PCI: Multi-Tech, SyncLink, Applicom serial + + Multi-Tech, Microgate SyncLink, and Applicom serial unconditionally depend on + PCI + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] !PCI warnings: Moxa serial + + Kill warnings in MOXA Intellio and Smartio multiport serial drivers when !PCI. + Also kill warnings about unused variables in the non-modular case. + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] !PCI warnings: Specialix serial + + Kill warnings in Specialix serial driver when !PCI. + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] depends on PCI: VIA686A i2c + + VIA686A i2c unconditionally depends on PCI + + Signed-off-by: Geert Uytterhoeven + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] depends on PCI DMA API: IEEE1394 core and SBP-2 + + IEEE1394 core and SBP-2 unconditionally depend on the PCI DMA API, so mark + them broken if !PCI + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] depends on PCI: Fritz!PCI/PCIv2/PnP and HYSDN + + Fritz!PCI/PCIv2/PnP and HYSDN unconditionally depend on PCI + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] !PCI warnings: Hisax ISDN + + Kill warnings in Hisax ISDN drivers when !PCI. + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] depends on PCI: Guillemot MAXI Radio FM 2000 + + Guillemot MAXI Radio FM 2000 unconditionally depends on PCI + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] depends on PCI: Technisat Skystar2 PCI + + Technisat Skystar2 PCI unconditionally depends on PCI + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] depends on PCI DMA API: Cisco/Aironet 34X/35X/4500/4800 + + Cisco/Aironet 34X/35X/4500/4800 unconditionally depends on the PCI DMA API, so + mark it broken if !PCI + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] depends on PCI: Toshiba and VIA FIR + + Toshiba and VIA FIR unconditionally depend on PCI + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] depends on PCI: Matrox 1-wire + + Matrox 1-wire unconditionally depends on PCI + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Dallas 1-wire delay.h + + Dallas 1-wire: never include directly + + Signed-off-by: Geert Uytterhoeven + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] cirrusfb: update for amiga (zorro) + + Cirrusfb updates: + - Cirrusfb depends on Zorro or PCI + - Revive Zorro support, using new Zorro driver framework + - Merge PCI and Zorro code where possible + - Use C99 initializers + - Kill superfluous whitespace + - #undef I/O ops before redefining them on Amiga + + From: Geert Uytterhoeven + Signed-off-by: David Eger + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] page_cache_readahead unused variable + + Removal of unused variable in mm/readahead.c. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] remove faulty __init's from drivers/video/fbmem.c + + From: Geert Uytterhoeven + + These four are called from fb_show_logo, which is exported symbol, called + by fbcon_switch. + + From: Domen Puncer + Signed-off-by: Maximilian Attems + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Export all functions in lib/string.c + + Quite a few functions in lib/string.c are not exported. I ran into this + trying to use strnchr() in a module. + + This patch + - exports every function defined in lib/string.c + - adds some missing __HAVE_ARCH_xxx defines for i386 + - gets rid of the exports of functions from lib/string.c in arch/s390 + (BTW, why is s390 exporting things NOVERS?) + + Signed-off-by: Roland Dreier + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] hlist_for_each_safe cleanup + + Make code for hlist_for_each_safe use better code (same as + hlist_for_each_entry_safe). Get rid of comment about prefetch, because + that was fixed a while ago. Only current use of this is in the bridge + code, that I maintain. + + Signed-off-by: Stephen Hemminger + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] front buttons wouldn't mute ESS Maestro + + Here is a small fix to enable muting ESS Maestro sound card thanks to the + up/down buttons: when has reached the driver's minimum (! this is + something like -dB value), just mute. (It was working in OSS driver, but + not in ALSA) + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Config file for laptop mode. + + From: Dax Kelson + + Add support for a external configuration file for /sbin/laptop_mode, and + /etc/acpi/actions/battery.sh. Convert battery.sh to use CPUFreq (off by + default) instead of CPU throttling (that was off by default). + + Cleanup some formating for 80 columns. + + All changes were written by me on a plane flight from Philadelphia to Salt + Lake City on July 9th. :) + + (Note from Bart Samwel: was submitted to Linus earlier, this patch is + unchanged from that. I needed to submit this into -mm for now because my + other changes are dependent on Dax's changes.) + + Signed-off-by: Bart Samwel + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Add documentation about /proc/sys/vm/laptop_mode to various docs. + + From: Bart Samwel + + A bunch of small laptop mode updates: + + * Mention the laptop_mode and block_dump sysctls in the relevant docs, + referring to the laptop-mode.txt. Improve description of what the + laptop_mode knob means (i.e. seconds between last I/O and automatic + sync). + + * Document the most relevant config file options. + + * Change the installation instructions in the laptop mode doc to describe + the ACPI-bound version first, because this is the easiest. Explain + the non-ACPI version afterwards. Added a reference to my "packaged + version" of the scripts. + + * Move the setting of hdparm and cpu frequency out of the ACPI script + and into the core laptop mode script. Add config option DO_HD to + enable hdparm. Add config setting HD to set device to do hdparm on. + Rename Dax's CPU_MANAGE to DO_CPU, with 0/1 instead of yes/no, to + improve consistency. + + * Fix a problem where the root filesystem wouln't be remounted when + /etc/mtab listed its type as "unknown". Deduce the type of "unknown" + filesystems from /etc/fstab. + + This depends on the patch that adds config files, which was submitted + to Linus by Dax Kelson on July 10. + + Signed-off-by: Bart Samwel + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Automatically disable laptop mode when battery almost runs out. + + From: Jan Topinski + + Add support to automatically disable laptop mode when the battery almost + runs out. This prevents data loss when the battery actually runs out. + + Signed-off-by: Bart Samwel + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32: snd-powermac requires i2c + + The alsa driver for powermacs requires i2c support. + + Signed-off-by: Olaf Hering + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ext2_readdir() return value fix + + ext2_readdir() is ignoring the set error return values and always returns + 0. + + Signed-off-by: Jan Blunck + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ncpfs: setattr return value fix + + Arjan's new warning found a bug! + + fs/ncpfs/inode.c: In function `ncp_notify_change': + fs/ncpfs/inode.c:960: warning: ignoring return value of `inode_setattr', declared with attribute warn_unused_result + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Recommend 'noapic' when timer via IOAPIC fails + + We might as well recommend the user boot with the noapic kernel parameter + instead of filling poor Ingo's mailbox. + + Signed-off-by: Zwane Mwaikambo + Signed-off-by: Ingo Molnar + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] s390: core changes + + s390 core changes: + - Rework system call entry cleanup code to fix a potential asynchronous + interrupt stack overflow if the user stack pointer happens to be in + the same range as the asynchronous stack. + - Replace broken schedule_timeout call with msleep. + - Regenerate default configuration + + Signed-off-by: Martin Schwidefsky + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] s390: zfcp host adapter. + + From: Heiko Carstens + From: Maxim Shchetynin + + zfcp host adapter changes: + - Get rid of ZFCP_WAIT_EVENT_TIMEOUT macro. + - Correct an error log mesage. + + Signed-off-by: Martin Schwidefsky + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] s390: network driver changes + + From: Ursula Braun-Krahl + From: Thomas Spatzier + From: Peter Tiedemann + + network driver changes. + - iucv: add missing symbolic links between /sys/bus/iucv/drivers/netiucv + and /sys/class/net. + - iucv: make use of the debug feature. + - iucv: 0 vs. NULL cleanup, avoid build warnings. + - iucv: remove unnecessary -ENODEV check after call to iucv_declare_buffer. + - ctc: adjust debug feature log levels. + - lcs: replace broken schedule_timeout call with msleep. + - qeth: add missing link type. + - qeth: treat add_hhlen attribute as decimal value. + + Signed-off-by: Martin Schwidefsky + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] lost error code in rescan_partitions + + This fixes a path where an error from reloading the partition table could be + lost. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] trivial doc patch for partitions + + It's slightly hard to see how these variables are used; this patch adds a + short description. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Subject: PATCH: fix bogus ioctl return in mtrr + + This is fairly self explanatory - ENOIOCTLCMD is an internal code outside + of the -1 to -511 range. The correct return for an unknown ioctl is + -ENOTTY although some Linux devices return the incorrect -EINVAL result. + + Patch-By: Alan Cox + OSDL Developer Certificate of Origin 1.0 included herein by reference + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] remove boot98 + + Remove the orphaned PC9800 boot code. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] writepages drops bh on not uptodate page + + I think I understood why some ext2 fs corruption still happens even after + the last i_size fix. + + what happened I believe is that the writepages layer got a not a fully + uptodate page (in turn with bh mapped on top of it), and then right before + unlocking the page and entering the writeback mode, it freed all the bh. + Without bh a not uptodate page will trigger a full readpage from disk, that + overwrites the pagecache before the multi-bio gets submitted, generating fs + corruption. + + I believe the below patch should fix it (untested) against kernel CVS. + + The testcases developed by Kurt showed the pagecache being overwritten with + on-disk data at block offsets, and Chris as well was wondering about races + between wait_on_page_writeback and readpage. the below fix just explains + everything we've seen since not-fully-uptodate pages must have always bh on + them and the below patch enforces just that invariant, and it should fix + our pagecache-overwritten-by-disk-data problem. + + Signed-off-by: Andrea Arcangeli + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] convert ipmi_watchdog to use module option nowayout + + Convert ipmi_watchdog to also use module option `nowayout' as is done in + other watchdog drivers. + + From: Corey Minyard + + The patch is good (same style as other watchdogs), but needs to have + some documentation updated. I've tacked that on. + + Signed-off-by: Arkadiusz Miskiewicz + Signed-off-by: Corey Minyard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] mark swim3 floppy controller as removable device + + Mark the mac floppy controller driver as removable media. This prevents an + entry in /proc/partitions. Several tools will not try to access the floppy + anymore with this change. + + Signed-off-by: Olaf Hering + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] comment "ptrace_list" and "children" members + + Document the purpose of the "ptrace_list/ptrace_children" and + "children/sibling" lists. + + Signed-off-by: + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Watchdog driver for Intel IXP2000 Network Processor + + Following patch adds support for the watchdog driver embedded in Intel's + IXP2000 family of network processors. The architecture-specific bits of + IXP2000 support will be merged upstream via the ARM tree once all the + various drivers have been merged. + + Signed-off-by: Deepak Saxena + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Fix up HP copyright & license text + + Fix up HP copyrights and add licensing terms (GPL v2) for hp-agp.c and + pcdp. + + Signed-off-by: Bjorn Helgaas + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] remove dead code from copy_process() + + Don't assign to `retval' twice in a row. + + Signed-off-by: Luiz Capitulino + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] swsusp: documentation update + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [ppc] Add basic support for the Freescale MPC52xx embedded CPU and the LITE5200 platform + + Signed-off-by: Sylvain Munaut + + + [serial/ppc] Add support for MPC52xx PSCs. + + Can be used as serial port and console. Compliant with the OCP driver model. + + Signed-off-by: Sylvain Munaut + + + [CIFS] fix smb return code + + Signed-off-by: Steve French (sfrench@us.ibm.com) + + + [BRIDGE]: Propagate bridge internal MTU changes + + Need to propagate MTU changes that the bridge does to it's pseudo interface + up to others. There ends up being a double call to br_min_mtu() but that's + harmless. + + Cleans up the EXPORT_SYMBOLS including dev_change_flags which is used by vlan. + Shouldn't be basing exports on kernel config options like this. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [BRIDGE]: dev_xmit cleanup + + The br_dev_xmit function was broken in two pieces (needlessly). + Put it back together. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [BRIDGE]: linkstate handling + + This makes bridge port status reflect both the state of the interface + from software (up/down) and the carrier. It makes STP handle link failure + (cable breakage, etc). The original concept comes from a + Mark Ruijter who implemented it differently. + My way is simpler and requires no polling. + + Obviously, this link state detection will only work if the network card + handles the events properly. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [BRIDGE]: forwarding table RCU + + Convert the bridge forwarding database over to using RCU. + This avoids a read_lock and atomic_inc/dec in the fast path + of output. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [BRIDGE]: RCU fix + + Follow up to earlier RCU patch. Since now using RCU, need to use + deferred free. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [PATCH 1/8] gcc-3.5 fixes + + From: Andi Kleen + + Trivial gcc-3.5 build fixes. + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [PATCH 2/8] gcc-3.5 fixes + + From: Andi Kleen + + Trivial gcc-3.5 build fixes. + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [PATCH 3/8] gcc-3.5 fixes + + From: Andi Kleen + + Trivial gcc-3.5 build fixes. + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [PATCH 4/8] gcc-3.5 fixes + + From: Andi Kleen + + Trivial gcc-3.5 build fixes. + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [PATCH 5/8] gcc-3.5 fixes + + From: Andi Kleen + + Trivial gcc-3.5 build fixes. + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [PATCH 6/8] gcc-3.5 fixes + + From: Andi Kleen + + Trivial gcc-3.5 build fixes. + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [PATCH 7/8] gcc-3.5 fixes + + From: Andi Kleen + + Trivial gcc-3.5 build fixes. + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [PATCH 8/8] gcc-3.5 fixes + + From: Andi Kleen + + Trivial gcc-3.5 build fixes. + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [PATCH 1/1]: net/sunrpc/xprt.c gcc341 inlining fix + + From: Mikael Pettersson + + gcc-3.4.1 errors out in 2.6.8-rc1-mm1 at net/sunrpc/xprt.c: + + net/sunrpc/xprt.c: In function 'xprt_reserve': + net/sunrpc/xprt.c:84: sorry, unimplemented: inlining failed in call to 'do_xprt_reserve': function body not available + net/sunrpc/xprt.c:1307: sorry, unimplemented: called from here + make[2]: *** [net/sunrpc/xprt.o] Error 1 + make[1]: *** [net/sunrpc] Error 2 + make: *** [net] Error 2 + + do_xprt_reserve() is marked inline but used defore its function + body is available. Moving it before its only caller fixes the problem. + + Signed-off-by: Mikael Pettersson + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [PKT_SCHED]: Fix pkt_cls.h incompatabilities. + + Signed-off-by: Jamal Hadi Salim + Signed-off-by: David S. Miller + + + [NET]: Allow MD5 to be a module + + I found that recent 2.6 kernels no longer allowed me to build MD5 as + a module even though everything that used it were modules (including + ipv6 and sctp). It turns out that there were boolean options + selecting MD5 in the Kconfig files. Due to limitations in the current + kconfig implementation, this forces MD5 to be a boolean as well. + + The usual workaround in these cases is to move the selection up + to the closest tristate. This is what the following patch does. + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [NET]: Convert ROSE to use module_param. + + Switch to module_param and the hash list can be local. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [NET]: Convert netrom to use module_param. + + Convert Netrom to use module_param + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [SPARC]: sparc64 openpromio.h needs compiler.h, sync sparc32 + + + [NET]: Decrease skb->cb[] to 40 bytes. + + No control block usage, even on 64-bit, needs + the full current 48 bytes. This brings sk_buff + size down to 256 bytes on 64-bit platforms and + fixes some performance regressions due to the + addition of the input_dev member. + + Signed-off-by: David S. Miller + + + [AH6]: Rearrange routing headers + + This patch rearranges the IPv6 routing header so that the destination + addresses appear in the order as they would on the destination. This + is specified in Appendix A2 of RFC 2402. + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [IPSEC]: Move generic encap code into xfrm6_output. + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [XFRM]: Declare xfrm6_output in net/xfrm.h + + + [DMA]: Fix example code in DMA-mapping.txt + + Spotted by Jack Spaar + + Signed-off-by: David S. Miller + + + [PATCH] ppc64: hash table races fixes + + This fixes some possible rare issues with the hash code beeing called + with interrupts enabled from update_mmu_cache, and fixes some races in + the iSeries low level htab code by adding an array of spinlocks + + This is actually an old patch already present in SLES kernel and that + got "missed" somewhat in the main tree, adapted to recent changes. + + Signed-off-by: Benjamin Herrenschmidt + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: fix memcpy_to/from_io + + The ppc64 implementation of memcpy_to/from_io was bogus (used memcpy + which uses cache hints and thus is broken on non cacheable IO space). + + This re-implements them with some simple/gross C code doing 32 bits + accesses when aligned and bytes accesses when not. + + Signed-off-by: Benjamin Herrenschmidt + Signed-off-by: Linus Torvalds + + + [PATCH] con_font_op split + + Preparations for cleanups: con_font_op() is turned into a switch calling + con_font_{get,set,default,copy} depending on the operation required; + method ->con_font_op() also split, with NULL resulting in -ENOSYS on + operation in question. + + Code that used to be in con_font_op() got slightly cleaned up after move + into new helpers (we are beginning to untangle the mess; there will be + more cleanups in the next patches). + + Methods are currently using exact same arguments as old ->con_font_op(). + That will change in subsequent patches, method by method (right now there's + a hell of a scary field reuse between them, making impossible to do any + static checks and practically begging for bugs). + + Signed-off-by: Al Viro + Signed-off-by: Linus Torvalds + + + [PATCH] con_font_default sanitized + + ->con_font_default() sanitized. We copy font name (if any) from userland + in the caller and pass it explicitly. We are also beginning to get rid + of console_font_op in method arguments. + + Signed-off-by: Al Viro + Signed-off-by: Linus Torvalds + + + [PATCH] con_font_copy sanitized + + ->con_font_copy() sanitized. We extract the number of console to copy the + font from in the caller (it's taken from the field of console_font_op that + is normally used for font height - messy even for an ioctl, but that animal + used to be passed all the way down into console drivers). + + With decoding done in con_font_copy(), we simply pass source console number + into the method. + + Signed-off-by: Al Viro + Signed-off-by: Linus Torvalds + + + [PATCH] con_set_font sanitized + + con_font_set() sanitized. We are passing console_font and flags into + the method in separate arguments and we are not messing with + console_font_op->data anymore - it's a userland pointer (to be annotated + several patches later in the series, due to another abuse of console_font_op + that needs to be fixed first), while console_font->data is kernel one + and they don't mix anymore. + + We also do a sanity check (font width > 0) in the caller instead of + method instances, since we are already checking for width <= 32 and + height <= 32 there; doesn't make sense leaving that one in method + instances. + + Signed-off-by: Al Viro + Signed-off-by: Linus Torvalds + + + [PATCH] fbcon_do_set_font() sanitized + + fbcon internal cleanup. Instead of passing console_font_op into + fbcon_do_set_font() we pass width/height directly. Amusing (but harmless) + bug fixed there: + if (!w > 32) { + bogus code that fortunately never got triggered + } + Fixed by removal of the junk in question (and yes, it's verifiable junk - + it would not do anything even if we replaced the check with intended + !(w > 32)). + + Signed-off-by: Al Viro + Signed-off-by: Linus Torvalds + + + [PATCH] con_get_font sanitized + + ->con_font_get() sanitized. We pass console_font * to method instead of + console_font_op * and do not mess with mixing ->data in these guys. + + Signed-off-by: Al Viro + Signed-off-by: Linus Torvalds + + + [PATCH] console_font_op annotated + + ->vc_font switched to console_font (from console_font_op, of all things!) + console_font_op annotated (->data is finally makred __user). + + Signed-off-by: Al Viro + Signed-off-by: Linus Torvalds + + + [PATCH] fb_cursor() fixes + + Massive leaks fixed in fb_cursor(). + + Signed-off-by: Al Viro + Signed-off-by: Linus Torvalds + + + [PATCH] cmap annotations + + fb_set_cmap() and fb_copy_cmap() split into kernel and userland versions. + fb_cmap, fb_image and fb_cursor split and annotated. + fixed bug in sbuslib.c that used to call "userland" version of fb_set_cmap() + when kernel one was need (RGB data was already copied into kernel space). + + Signed-off-by: Al Viro + Signed-off-by: Linus Torvalds + + + sn_console.c: + move sn_debug_printf to only compile for DEBUG + early printk needs to handle missing carriage returns + Signed-off-by: Pat Gefre + Signed-off-by: Tony Luck + + + [SPARC64]: Update defconfig. + + + bte_error.c: + bte.c: + After working with the chip designer some more, we have determined one + more hardware register we were supposed to write to ensure the SHUB + chip was ready for future transfers. This patch fixes that. This also + allowed us to eliminate a udelay which was working around the problem. + + During retesting, we uncovered a race condition where transfer status + was changed by a different cpu after we were expecting one value which + cascaded to additional problems. This patch uses a local variable to + also eliminate that race. + + Signed-off-by: Robin Holt + Signed-off-by: Tony Luck + + + [NET]: Kill NET_FASTROUTE, does nothing and suffers from major bitrot. + + Based up suggestion/changes from Jeff Garzik. + + Signed-off-by: David S. Miller + + + [CIFS] remove sparse pointer warning + + Signed-off-by: Steve French (sfrench@us.ibm.com) + + + [PATCH] inline fixes in net/* + + * in ipv6/route.c: made ipv6_advmss() inlined again (and moved it up) + * in sunrpc/xprt.c: inlining fix: moved do_xprt_reserve() up + + Signed-off-by: Al Viro + Signed-off-by: Linus Torvalds + + + [PATCH] annotations in drivers/video + + Signed-off-by: Al Viro + Signed-off-by: Linus Torvalds + + + [PATCH] sparse: ftape + + ftape got annotations and NULL noise removals. + Propagated the dependency on alpha/i386/amd64 to Kconfig (it's already + enforced by #error) + + Signed-off-by: Al Viro + Signed-off-by: Linus Torvalds + + + [PATCH] sparse: istallion + + istallion annotated, cleaned up, a bunch of useless verify_area() + removed. + + Signed-off-by: Al Viro + Signed-off-by: Linus Torvalds + + + [PATCH] sparse: stallion + + stallion annotated, cleaned up, a bunch of useless verify_area() + removed. + + Signed-off-by: Al Viro + Signed-off-by: Linus Torvalds + + + [PATCH] sparse: drivers/char/* + + the rest of BROKEN_ON_SMP drivers in drivers/char sparsified. + + Signed-off-by: Al Viro + Signed-off-by: Linus Torvalds + + + [PATCH] NULL noise removal in skfp + + Signed-off-by: Al Viro + Signed-off-by: Linus Torvalds + + + [PATCH] #if abuses + + Signed-off-by: Al Viro + Signed-off-by: Linus Torvalds + + + [PATCH] ARM initial annotations + + Usual set of initial annotations for a platform. + + Signed-off-by: Al Viro + Signed-off-by: Linus Torvalds + + + [PATCH] sparse: more in isdn + + annotations and NULL noise removals in drivres/isdn (more BROKEN_ON_SMP + stuff) + + Signed-off-by: Al Viro + Signed-off-by: Linus Torvalds + + + [PATCH] sparse: more in drivers/net + + drivers/net BROKEN_ON_SMP annotations and NULL noise removals. + + Signed-off-by: Al Viro + Signed-off-by: Linus Torvalds + + + [PATCH] size_t portability fixes + + more size_t fixes (%d -> %zd) + + Signed-off-by: Al Viro + Signed-off-by: Linus Torvalds + + + [PATCH] signed char portability fix + + code using atm_cirange fields assumes that they are signed; make that + explicit by s/char/signed char/. + + Signed-off-by: Al Viro + Signed-off-by: Linus Torvalds + + + [PATCH] sparse: misc cleanups + + all sorts of minor stuff - basically, all chunks are independent here, + but IMO that one is not worth splitting. Contains: + * pmac_cpufreq.c: declaration in the middle of a block. + * sys_ia32.c: couple of trivial annotations. + * ipmi_si_intf.c: should be using asm/irq.h instead of linux/irq.h + * synclink_cs.c: assignment-in-conditional with nobody ever looking + at the variable we are assigning to afterwards; variable removed. + * sbni.c: s/__volatile/__volatile__ + * matroxfb_base.h: got rid of ((u32 *)p)++ + * asm-ppc/checksum.h and asm-sparc64/floppy.h: NULL noise removal + * amd64 compat.h: missing L in long constant. + * mtd-abi.h: annotated ioctl structure + * sysctl.c: corrected annotations in extern + + Signed-off-by: Al Viro + Signed-off-by: Linus Torvalds + + + [Bluetooth] Send HCI_Reset for ISSC USB dongles + + For the USB dongles from ISSC the first command must be a HCI_Reset, + because otherwise the inquiry procedures won't work. + + Signed-off-by: Marcel Holtmann + + + [Bluetooth] Fix resetting to default filters + + The problem is that after a successful connection between the Windows + Bluetooth stack and the Linux Bluez stack, no packets from the device + ever reach the PC running Windows XP Service Pack 2. That is, a ping + from the PC never receives a response, and a ping from BlueZ never + reaches the PC. Linux packet statistics show that the PC packets are + received, but all return traffic seems to be routed over the loopback + interface. + + Immediately after creating the BNEP connection with BlueZ, the Windows + Bluetooth stack sends a BNEP_FILTER_NET_TYPE_SET_MSG with an effective + length of zero. BlueZ interprets this message to mean that no filter + ranges should be allowed. The code zeros the first entry in the filter + list, which is than interpreted as meaning that no ranges of acceptable + packets are available. This interpretation is wrong and leads to all + packets being rejected by BNEP. + + The Bluetooth BNEP specification clearly states the following: + + The length (in octets) of this message is 4+4*N, where N is the number + of disjoint ranges of Networking protocol types that form the complete + set. Note that N=0 (empty set) denotes a reset to default filters (if + any) supported by the remote device. + + Signed-off-by: Marcel Holtmann + + + [PATCH] ppc32: fix compilation with binutils-2.15 + + Currently, ppc32 will not always compile with binutils-2.15. The issue + is that binutils has become even more strict about which opcodes can be + used with which CPU flags. The problem is that we have a number of + cases where we compile with altivec instructions (with runtime checks to + make sure we can actually run them) in code that's not altivec specific. + + The fix for this is to always pass in -maltivec on CONFIG_6xx. To do + this cleanly, we split our AFLAGS definition up into + aflags-$(CONFIG_FOO). + + Signed-off-by: Tom Rini + Signed-off-by: Linus Torvalds + + + [PATCH] slab memory shrinking balancing fix + + The logic in shrink_slab tries to balance the proportion of slab which it + scans against the proportion of pagecache which the caller scanned. Problem + is that with a large number of highmem LRU pages and a small number of lowmem + LRU pages, the amount of pagecache scanning appears to be very small, so we + don't push slab hard enough. + + The patch changes things so that for, say, a GFP_KERNEL allocation attempt we + only consider ZONE_NORMAL and ZONE_DMA when calculating "what proportion of + the LRU did the caller just scan". + + This will have the effect of shrinking slab harder in response to GFP_KERNEL + allocations than for GFP_HIGHMEM allocations. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] PATCH: Fix HPT366 crash and support HPT372N + + On a board containing the HPT372N IDE controller the 2.6.x series kernels will + misbehave. If the HPT372N is set up with the newer PCI identifier it is + ignored. If it is set up with the HPT372 identifier then the kernel crashes + on boot. + + This patch is a forward port of my 2.4 driver fixes that have been in 2.4 + for a year but somehow escaped 2.6. Ronny Buchmann caught a couple + of merge details I missed and those are fixed in this diff too. + + As well as adding 372N support this also fixes the unknown revision case + to avoid crashes should any future 37x variants with weird class_rev's appear + + Signed-off-by: Alan Cox + Signed-off-by: Linus Torvalds + + + [CIFS] Update readme and todo lists for cifs vfs + + Signed-off-by: Steve French (sfrench@us.ibm.com) + + + [CRYPTO]: Add i586 optimized AES + + Below is an updated version of patch from Fruhwirth which integrates the + Gladman AES code into the crypto API. + + I've tried to ensure that this is done as simply as possible: the user + gets the asm version by default if it's suitable. + + I've also now added the alternate GPL licensing provided by Brian Gladman, + and licensed the code as GPL. + + Signed-off-by: James Morris + Signed-off-by: David S. Miller + + + [IPSEC]: Fix SPI generation by netlink_get_spi() + + The issue is that two successive calls to netlink_get_spi is returning + the same SA. Since netlink_get_spi is meant to be a creation operation + this is incorrect. + + The netlink_get_spi operation is modelled off the PFKEY SADB_GETSPI + command which is specified in RFC 2367. The purpose of SADB_GETSPI + is to create a new larval SA that can then be filled in by SADB_UPDATE. + + Its semantics does not allow two SADB_GETSPI calls to return the same + SA, even if there is no SADB_UPDATE call in between. + + The reason the second netlink_get_spi is returning the same SA is + because in find_acq(), the code is looking at all larval states as + opposed to only larval states with an SPI of zero. + + Since the only other caller of find_acq() -- xfrm_state_add() intentionally + ignores all return values with a non-zero SPI, it is safe to not look at + SAs with non-zero SPIs at all in find_acq(). + + The following patch does exactly that. + + In fact, the find_acq() call in xfrm_state_add() is a remnant from + the days when we had xfrm_state_replace() instead of xfrm_state_add() + and xfrm_state_update(). It can now be safely removed. + + I'll post a separate patch for that. + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [IPSEC]: Remove redundant check in xfrm_state_add() + + This is the patch referred to in the netlink_get_spi thread. + + I was actually wrong about the reason for this patch though. Firstly + it's the SPI check that is redundant and not the find_acq() call. + And it's redundant because of the find_acq() patch, not because + of the fact that this is in xfrm_state_add(). + + Now that find_acq() only returns SAs with SPIs, we don't need to + check this in xfrm_state_add() anymore. + + We do still need the call though to clean up leftover larval states. + + Another side-effect of the change is that we can move the existence + check above find_acq() since find_acq() will never return any SAs + matching the SPI we're trying to add (It doesn't need to because if + an SA with a matching SPI existed, it would've been returned by + state_lookup() already). + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [IPSEC]: xfrm_alloc_spi always succeeds on non-trivial range + + xfrm_alloc_spi will always succeed if minspi < maxspi, even if + minspi + 1 == maxspi. If the range is already occupied this + will obviously lead to breakage. + + Of course this is very unlikely to occur in reality due to the + size of the range. Although with IPCOMP it might actually happen + on a very large server. + + The fix is obivous. + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [PF_KEY]: spirange should be in host byte order. + + I'm looking through the xfrm_alloc_spi stuff and noticed that the + netlink alloc_spi function takes the range in host order while the + PFKEY alloc_spi function takes them in network order. + + First I thought that I stuffed up since I was the one who changed + the code in the netlink interface to take them in host order :) + + But reading RFC 2367 seems to indicate otherwise. It says that all + fields are host order unless specified otherwise. And the spirange + fields are not specified to be network order at all. + + Looking at the existing PFKEY users: + + User Space + ---------- + Openswan - Doesn't use PFKEY for this. + Racoon - Puts zeros in there so it doesn't care. However its test-pfkey + program stores things in host order. + ISAKMPD - Stores things in host order. + + So the conclusion is that we can and should change our PFKEY + implementation to use host order for these fields. + + This patch does exactly that. + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [IPSEC]: Fix UDP decap code. + + The missing break causes the packet to be tested against + both encapsulation types, one will always fail. + + Signed-off-by: bert hubert + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [PATCH] ethtool_get_regs copy right number of bytes to user + + If regs.len is smaller than reglen it's possible to copy more bytes out + than the user asked for. + + Signed-off-by: Chris Wright + + + [NET]: Update NET_SCH_NETEM Kconfig help text. + + Signed-off-by: Adrian Bunk + Signed-off-by: David S. Miller + + + [NETFILTER]: Fix compilation of ip_nat_snmp_basic.c + + Please sumbit before 2.6.8-final, this just moves some code in order to + make gcc happy. + + Thanks! + + Signed-off-by: Adrian Bunk + Signed-off-by: Harald Welte + Signed-off-by: David S. Miller + + + [PATCH] ppc32: Workaround new MPC745x CPU erratas + + The latest versions of Motorola erratas for the MPC745x CPUs (and 744x) + adds a couple of nasty ones for which we really want workarounds in the + kernel. One is to disable the BTIC branch target cache on some revs + (too bad for performances...) and the other one is to force cacheable + memory pages to always be marked as SMP coherent even on UP systems (I + didn't measure significant perfs impact with this one). + + Signed-off-by: Benjamin Herrenschmidt + Signed-off-by: Linus Torvalds + + + [PATCH] sched: use for_each_cpu + + The per cpu schedule counters need to be summed up over all possible cpus. + When testing hotplug cpu remove I saw the sum of the online cpu count for + nr_uninterruptible go negative which made the load average go nuts. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Fix BSD accounting cross-platform compatibility + + BSD accounting cross-platform compatibility is a new feature of 2.6.8 and + thus not crucial, but it'd be nice not to have kernels writing wrong file + formats out in the wild. + + The endianness detection logic I wanted to suppose for userspace turned out + to be bogus. So just do it the simple way and store endianness info + together with the version number. + + Signed-off-by: Tim Schmielau + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: __make_room() warning fix + + arch/ppc64/kernel/prom.c: In function `__make_room': + arch/ppc64/kernel/prom.c:1415: warning: unused variable `offset' + + Signed-off-by: Dave Hansen + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: fix off-by-one in mem_init() + + lmb_end_of_DRAM() returns the address of the end of RAM, not the starting + address of the last page. We've been accessing mem_map[] out of bounds for + quite a while. But, it's just a read, so it's probably never caused a real + problem. + + But, during my port of CONFIG_NONLINEAR to ppc64, I have a check to make + sure that all __va() calls are given with valid physical addresses. This + code tripped that check. + + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: struct pci_controller cleanup + + The patch below removes the unused member "pci_io_offset" from struct + pci_controller. If there are no problems, please apply. + + Signed-off-by: John Rose + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: ISA device tree node refcount fix + + Moves a misplaced of_node_put(). In the existing code, the node in + question is used just after its refcount is decremented. + + Signed-off-by: John Rose + Signed-off-by: Paul Mackerras + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: fix RAS irq handlers + + Both arch/ppc64/kernel/ras.c and arch/ppc64/kernel/rtasd.c have a spinlock + variable declared static called "log_lock". Since the code in these files + interact quit a lot, having two different locks with identical names is + manifestly confusing. This patch renames both locks to something a little + clearer. In the case of ras.c it also renames the buffer protected by the + lock to a more usefullly greppable name. + + Signed-off-by: David Gibson + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: fix hotplug irq migration code + + In migrate_irqs_away we werent converting a virtual irq to a real one. We + ended up passing the wrong irq numbers to the hypervisor and migration of + affinitised irqs on cpu hot unplug didnt work. + + Also clarify the rtas_stop_self printk. + + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: Fix cpu_up race + + Patch below fixes a cpu_up race in PPC64. + + Signed-off-by: Srivatsa Vaddagiri + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: improve SLB reload + + Rewrite/cleanup of the SLB management code. This removes nearly all the + SLB related code from arch/ppc64/kernel/stab.c and puts a rewritten version + in arch/ppc64/mm, where it better belongs. The main SLB miss path is in + assembler and the other routines have been cleaned up and streamlined. + + Notable changes: + + - Ugly bitfields no longer used for generating SLB entries. + + - slb_allocate() (the main SLB miss routine) is now in assembler, and all + the data it uses is stored in the PACA. + + - The mm context is now copied into the PACA at context switch time, to + avoid looking up the thread struct on SLB miss. + + - An SLB miss will now never (directly) result in a call to + do_page_fault. If we get a miss on a totally bogus address the handler + will now put in an SLB referencing VSID 0. This will never have any + pages, so we'll get the (fatal) page fault shortly afterwards. This + simplifies the SLB entry and exit paths. + + - The round-robin pointer in the PACA now references the last-used + instead of next-to-use SLB slot, which simplifies the asm for updating it + slightly. + + - Unify do_slb_bolted with the general SLB miss path. There is now one + SLB miss handler, in assembler, and called with only the low-level + exception prolog (EXCEPTION_PROLOG_[PI]SERIES rather than + EXCEPTION_PROLOG_COMMON) and minimal extra save/restore logic. + + - Streamlines the exception entry/exit path of the SLB miss handler to + shave a few cycles off. The most significant change is that the RI bit + is left off throughout the whole handler, which avoids an extra mtmsrd to + turn it back off on the exit path. + + Signed-off-by: David Gibson + Signed-off-by: Paul Mackerras + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: remove #include processor.h from div64.S + + This patch removes a redundant #include of processor.h from + arch/ppc64/boot/div64.S. I came across this because, at least with the + binutils versions I have currently installed, the 32-bit assembler used for + the bootstrap code objects to the // comments that recently went into + processor.h. + + Signed-off-by: David Gibson + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32: Support for MPC8560 CPU and boards + + The following patch adds completes the CPU support for the MPC8560 PowerPC. + Additionally, it adds support for the MPC8560 ADS reference board and + fixes up some build issues with the SBC8560 board. + + Signed-off-by: Kumar Gala + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32: support for MPC8555 CPU and board + + The following patch adds completes the CPU support for the MPC8555 PowerPC. + Additionally, it adds support for the MPC8555 CDS reference board. This + is another PowerPC in the Freescale MPC85xx family. + + * Add support for MPC8555 CPU and reference board + + Signed-off-by: Kumar Gala + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] oom-killer: call show_free_areas + + Change the oom-killer so that it spits a sysrq-m output into the logs, and + shows the gfp_mask of the failing allocation attempt. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Fix menuconfig partial inability to show help texts. + + Fix menuconfig inability to show help texts when there is menu item with + letter "H" highlighted on the screen. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] quieten down per-zone memory stats + + On a system with a lot of nodes, 4 lines of output per node is a lot to + have to sit through as the system comes up, especially if you're on the + other end of a slow serial link. The information is valuable though, so + keep it around for the system logger. This patch makes the printks for the + memory stats use KERN_DEBUG instead of the default loglevel. + + Signed-off-by: Jesse Barnes + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] MSI: stop using dev->bus->ops directly in msi.c + + First half of the MSI rewrite: pure cleanup. Use proper + pci_read_config_xxx() and pci_write_config_xxx() functions instead of + accessing raw dev->bus->ops. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] MSI: MSI/MSI-X API updates + + Second half of MSI rewrite: fix the API and update documentation. Split + enabling MSI and MSI-X to separate pci_enable_msi()/pci_disable_msi() and + pci_enable_msix()/pci_disable_msix() functions. free_irq() no longer has + the side effect of freeing interrupt vectors (so a device driver can do + multiple request_irq()/free_irq() cycles on the same MSI/MSI_X vector). + + From: Tom L. Nguyen + Signed-off-by: Roland Dreier + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] rename CONFIG_PCI_USE_VECTOR to CONFIG_PCI_MSI + + The "vector" terminology is architecture-dependent. The PCI MSI interface + actually deals with Linux IRQ numbers (i.e., things you can pass to + request_irq()), and we shouldn't confuse things by calling them "vectors" just + because we're using MSI rather than an IOSAPIC. + + Signed-off-by: Bjorn Helgaas + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] MAINTAINERS update + + Maciej has moved. + + Signed-off-by: Maciej W. Rozycki + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fdomain_cs ISA fix + + Revert the recent fdomain_cs config dependency "fix" and fix the linkage + error with ifdeffery instead. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] modular swim3 + + ACKed by the pmac folks a while ago. Also moves the Kconfig entry to where + it belongs. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Fix modular anscd + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] PPC8xx Maintainer patch + + Tom is looking after PPC8xx and the PPC boot code. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] DVB: "errno" undefined + + Actually, the problem has its origin in my removal of all in-kernel + syscalls (except execve, which is non-trivial) earlier this year. This + change was blindly reverted by the maintainer, while at the same time the + local errno variable was removed. See also + http://linux.bkbits.net:8080/linux-2.5/hist/drivers/media/dvb/frontends/tda= + 1004x.c + + This patch is the one that was already merged earlier. I'm now also + removing the definitions for the kernel syscalls on i386 to make it harder + to reintroduce them again. This was already done for ppc64, the others + should probably follow. + + Signed-off-by: Arnd Bergmann + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Documentation fix for NMI watchdog + + Sync nmi_watchdog.txt with reality on x86-64. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] HPET copyrights, cleanup + + This patch + - adds copyright and license info + - changes sense of mmap config option (setting option enables mmap + instead of disabling it, to avoid the double negative) + - removes an #ifdef CONFIG_IA64 now that acpi_register_gsi() + is generic. + + Signed-off-by: Bjorn Helgaas + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] remove outdated reference to Documentation/arm/SA1100/PCMCIA + + This file does not exist in 2.6. + + Signed-off-by: Adrian Bunk + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Canonically reference files in Documentation/ code comments part + + Below is a patch by Hans Ulrich Niedermann + to change all references in comments to + files in Documentation/ to start with Documentation/ + + Signed-off-by: Adrian Bunk + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] Remove symbol_is() + + Remove the unused symbol_is() macro. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] nsf4 oops fixes + + Here are some oops I found in error paths in the mounting pathes while + debugging something else... I sent it out a while ago, but it didn't seem + to get any traction.... + + The nfs_fill_super() fix is obvious and in nfs4_fill_super(), the + server->client ptr needs to be set before the cl_idmap check, since + rpc_shutdown_client() needs it when the check fails. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] fix cdrom cdda rip single frame dma fall back + + There's a stupid error in the fall back logic, it fails to increment the + user pointer so the wave file is corrupt. We should also clear + last_sense just to be sure. + + Signed-off-by: Jens Axboe + Signed-off-by: Linus Torvalds + + + [PATCH] ISDN Eicon driver: use msleep() + + Author: Armin Schindler, Nishanth Aravamudan + + Use kernel provided msleep() instead of own sleep + implementation. + + Signed-off-by: Linus Torvalds + + + [PATCH] Off-by-one error for SIGXCPU / RLIMIT_CPU checking + + There is a lonstanding off-by-one error that results from an incorrect + comparison when checking whether a process has consumed CPU time in + excess of its RLIMIT_CPU limits. + + This means, for example, that if we use setrlimit() to set the soft CPU + limit (rlim_cur) to 5 seconds and the hard limit (rlim_max) to 10 seconds, + then the process only receives a SIGXCPU signal after consuming 6 seconds + of CPU time, and, if it continues consuming CPU after handling that + signal, only receives SIGKILL after consuming 11 seconds of CPU time. + + The fix is trivial. + + Signed-off-by: Linus Torvalds + + + [BRIDGE]: Build fix for gcc-2.95.x + + gcc-2.95.c does not support anonymous unions. + + Signed-off-by: Andrew Morton + Signed-off-by: David S. Miller + + + [IPV6]: Trivial fix for ipv6_addr_hash() + + ipv6_addr_hash doesn't do what it's comment says. The comment was + probably what was intended, not that it'll make much difference in + practice. + + Signed-off-by: Ralph Loader + Signed-off-by: Yoshifuji Hideaki + Signed-off-by: David S. Miller + + + [IPSEC]: Remove unnecessary inet_ecn.h inclusions + + This is a couple of clean-ups stemming from the xfrm_output change. + + I should've removed the inet_ecn.h inclusions in that change as the + ECN code has been moved to xfrm[46]_output.c. This patch does exactly + that. + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [IPSEC]: Move xfrm[46]_tunnel_check_size into xfrm[46]_output.c + + This patch moves xfrm[46]_tunnel_check_size() into xfrm[46]_output.c + where it can be made static since it's only used there. + + While moving the icmp.h inclusions over I also discovered that the + tunnel files are missing an inclusion of net/protocol.h. So I've + added them as well. + + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [TCP]: BIC tcp congestion calculation timestamp + + Small change to bictcp based on the BIC 1.1 patches for web100. + Keep track of last time congestion was computed, and recompute + if cwnd changes or every 1/32 of a second. + + Also changes the initialization location for the parameters. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [NET]: Add skb_iter functions. + + There's no convenient function to walk the data of an skbuff; provide + one. Netfilter extensions in particular can use this to examine + packet contents without needing an entire copy. + + I originally wrote an 'skb_walk(skb, fn, data)' function, but open + iterators are easier to use for complex cases. + + Signed-off-by: Rusty Russell + Signed-off-by: David S. Miller + + + [PATCH] ppc32: fix e500 SPE saving of context + + Fix the fact that we were not the signal processing engine status and + control register (SPEFSCR) on giveup_spe. Causes problems when the kernel + tries to read or modify the SPEFSCR. + + Signed-off-by: Kumar Gala + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] bio_copy_user() cleanups and fixes + + blk_rq_map_user() is a bit of a hack currently, since it drops back to + kmalloc() if bio_map_user() fails. This is unfortunate since it means we + do no real segment or size checking (and the request segment counts contain + crap, already found one bug in a scsi lld). It's also pretty nasty for > + PAGE_SIZE requests, as we attempt to do higher order page allocations. + Even worse still, ide-cd will drop back to PIO for non-sg/bio requests. + All in all, very suboptimal. + + This patch adds bio_copy_user() which simply sets up a bio with kernel + pages and copies data as needed for reads and writes. It also changes + bio_map_user() to return an error pointer like bio_copy_user(), so we can + return something sane to the user instead of always -ENOMEM. + + Signed-off-by: Jens Axboe + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32: Fix problem with spurrious edge interrupts on old + + On old powermacs, it's possible that we get a stale edge interrupt when + doing request_irq(), that typically happens with the DBDMA controller + interrupts when the device was used by the firmware for booting. + + I just tracked down a nasty memory corruption problem where that was + causing the bmac driver to try to process packets before the driver + internal data structures were properly initialized. + + While I agree that the driver should (and will) be made more robust to + such things, Paulus and I decided that it makes little sense to keep + track of an "old" edge interrupt that happens before a driver does + request_irq. (On those powermacs, those are only the DBDMA interrupts + anyway, and none of the DBDMA users will care). + + This patch implements a "startup" handler for the old Apple PIC that + will "ack" pending edge interrupts before unmasking, thus preventing + those stale interrupts to be delivered. + + It also "fixes" the ppc32 irq core to call the startup() callback when + available instead of just calling enable(). + + Signed-off-by: Benjamin Herrenschmidt + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: Start the FCU in therm_pm72.c + + Some G5 recent powermacs start with the fan control unit (FCU) disabled, + by the firmware, causing the thermal control driver to break. We have to + enable it before starting the feedback loops that set the fan speeds. + This patch adds the code to start the FCU. + + Signed-off-by: Paul Mackerras + Signed-off-by: Benjamin Herrenschmidt + Signed-off-by: Linus Torvalds + + + Linux 2.6.8-rc3 + + + [PKT_SCHED]: netem limit not returned correctly + + Minor leftover from earlier code. Netem scheduler is not reporting + correct limit (ie for 'tc qdisc ls') because it is returning devices limit + not it's own. + + Should apply to 2.4 as well (with fuzz) + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + machvec.h: + irq.c: + Fix IRQ type in platform irq_to_vector functions. Should be + "unsigned int", but some places were "u8". + + Signed-off-by: Bjorn Helgaas + Signed-off-by: Tony Luck + + + cyclone.h, cyclone.c, acpi.c, Kconfig: + Make cyclone_setup() take no args, rather than an ignored "char *" + and return void. Fix typos and whitespace. + + Signed-off-by: Bjorn Helgaas + Signed-off-by: Tony Luck + + + sba_iommu.c: + REO/Grande defect AR2305 can cause TLB fetch timeouts if entries + are purged while in use. Round up IOVA allocations to power-of-two + boundaries to prevent this. This is originally due to Alex Williamson. + + Signed-off-by: Bjorn Helgaas + Signed-off-by: Tony Luck + + + sgi_io_init.c: + Mark per_hub_init as __init and remove an unnecessary extern declaration of it + in sgi_io_init.c. This has the effect of killing a warning in the compile of + that file. + + Signed-off-by: Jesse Barnes + Signed-off-by: Tony Luck + + + [PKT_SCHED]: Fix locking in __qdisc_destroy rcu-callback + + Signed-off-by: Patrick McHardy + Signed-off-by: David S. Miller + + + [PKT_SCHED]: Refcount qdisc->dev for __qdisc_destroy rcu-callback + + Signed-off-by: Patrick McHardy + Signed-off-by: David S. Miller + + + [PKT_SCHED]: remove unneccessary checks for qdisc->dev + + Signed-off-by: Patrick McHardy + Signed-off-by: David S. Miller + + + [PKT_SCHED]: Remove useless noop_qdisc assignments in destroy functions + + Signed-off-by: Patrick McHardy + Signed-off-by: David S. Miller + + + [BRIDGE]: rmmod device while bridge is down fails + + The changes to bridge notifier to handle link state changes introduced + a bug. The case of device unregistering while bridge is down was no + longer being handled. Add comment so maintainer doesn't forget. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + Set up CMC/CPE polling *before* enabling CMCI/CPEI interrupts to avoid + situation where a flood of errors prevents boot. + + Signed-off-by: Hidetoshi Seto + Signed-off-by: Tony Luck + + + Provide comand line keyword "nomca" to turn off mca processing in kernel. + Initial patch by Jesse Barnes, fixed by Ken Chen, rescued from + obscurity by Sourav Sen. + + Signed-off-by: Tony Luck + +<[alex.williamson@hp.com> + Using CONFIG_IA64_HP_ZX1 on an sx1000 system setup w/ multiple NUMA + nodes (configured for cell local memory) currently crashes because + MAX_NUMNODES defaults to 1. The patch below sets up things to make this + work. + + Signed-off-by: Alex Williamson + Signed-off-by: Tony Luck + + + generic_defconfig update. I just ran 'make oldconfig' against the existing + one and turned on a few new options (some of which Altix needs). + + Signed-off-by: Jesse Barnes + Signed-off-by: Tony Luck + + + [PKT_SCHED]: Use double-linked list for dev->qdisc_list + + Signed-off-by: Patrick McHardy + Signed-off-by: David S. Miller + + + [PKT_SCHED]: Fix q_idx calculation in tc_dump_qdisc. + + Signed-off-by: Patrick McHardy + Signed-off-by: David S. Miller + + + [PKT_SCHED]: Cache align qdisc data. + + This patch has qdisc code use the same interface as the + netdevice code to cache align the object private data. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [PKT_SCHED]: Move sch_atm over to qdisc_priv(). + + Signed-off-by: David S. Miller + + + Cset exclude: davem@nuts.davemloft.net|ChangeSet|20040804202342|60209 + + + [PATCH] Drop asm i586 AES code. + + This patch reverts the i586 AES module. A new one should be ready soon. + + Signed-off-by: James Morris + Signed-off-by: Linus Torvalds + + + [PATCH] md multipathing fixes + + I tried to get multipathing failover running and failed. It seems to be + that there are two bugs in multipath.c : + + - If a path/request fails mp_bh->path doesn't get updated to the new + path. Thus multipath_end_request will access a NULL pointer if a + redirected request returns. + + - After fixing this I experienced several other errors. First of all in + bio->bi_flags the BIO_UPTODATE flag is not set when redirecting a + request. + + Causing the md driver to think that every redirected request failed + when it returns. Since that alone didn't fix the problems, I simply + copied the master_bio again and it looks like everything seems to work. + + Cc: + Cc: Jens Axboe + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] multipath readahead fix + + For requests marked read-ahead, it can legitimately fail without it being a + path problem. So don't fail a path just because this happens (can be the + atomic request allocation going nuts, for instance), or all paths will + quickly go away. + + Cc: + Signed-off-by: Jens Axboe + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [ARM PATCH] 1964/1: Wrong cache block operations checking + + Patch from Catalin Marinas + + The "err" is rotated in the blockops_check() function and all the error bits are cleared, the subsequent conditions being always true. + + + [ARM PATCH] 1965/1: gas only generates the c and f field bits for the "msr [cs]psr, rN" instruction + + Patch from Catalin Marinas + + Gas translates the "msr [cs]psr, rN" instruction to "msr [cs]psr_cf, rN". This may cause problems on the ARMv6 architecture where the A and E bits can leak into the SVC mode from the USR mode via the exception handlers. The reverse can happen when returning to user mode. The patch adds _cxsf to all the msr instruction without the field specifier. + + + [ARM PATCH] 1966/1: S3C2410 - Fix for serial driver compile error + + Patch from Ben Dooks + + Remove compile error with gcc-3.4 and empty part of case statememnt + + + [ARM PATCH] 1968/1: S3C2410 - GPIO updates and access functions + + Patch from Ben Dooks + + Added more definitions for GPIO registers + + New functions for modifying pin configuration and + bit-status (see include/asm-arm/arch-s3c2410/hardware.h) + + + [ARM PATCH] 1971/1: BAST - default configuraiton update + + Patch from Ben Dooks + + Patch for default configuration + + + [ARM PATCH] 1972/1: IPAQ H1940 - fix serial clock base + + Patch from Ben Dooks + + Fixed clock base for the H1940 + + thanks to Gerald Schneider + for fixing this. + + + [ARM PATCH] 1974/1: add INITTIME macro to collie machine structure + + Patch from John Lenz + + Add INITTIME macro to collie machine structure. + + + [PATCH] simple_read_buffer() helper function + + A number of drivers or special virtual devices really just want their + "read()" function to populate user space from some internal buffer. + + This adds such a helper function - "simple_read_from_buffer()" - and + converts several ->read() instances to use it. + + Signed-off-by: Linus Torvalds + + + [PATCH] fix /proc printing of TASK_DEAD state + + I just stumbled across this patch that's been sitting in my tree for ages. + + I thought I'd sent this in before. It's a trivial fix for the printing + of task state in /proc and sysrq dumps and such, so that TASK_DEAD shows + up correctly. This state is pretty much only ever there to be seen when + there are exit/reaping bugs, but it's not like that hasn't come up. + + Signed-off-by: Roland McGrath + Signed-off-by: Linus Torvalds + + + [PATCH] imm.c oops fix + + Fix bug #3125: + + This should fix the problem; however, we will need to repeat that for all + PIO SCSI drivers (another immediate victim is ppa.c). + + We should start looking for sane solution; I _really_ don't like the kludge + with using ->slave_alloc() for fixups after scsi_alloc_queue(). + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32: Fix 'mktree' on 64bit hosts + + The following patch changes some 'unsigned long's into 'uint32_t's in + mktree (a program that runs on the host to frob the kernel image for + some firmwares). Without it, the program is not correct when run + on/compiled on a 64bit host. + + Signed-off-by: Dan Zink + Signed-off-by: Tom Rini + Signed-off-by: Linus Torvalds + + + Fix shrink_dcache_anon() LRU list accesses. + + It would potentially remove dentries from the LRU list + without re-initializing the d_lru fields, causing later + accesses to that dentry to do bad things to the LRU list. + + + [PATCH] ppc64: Fix rtas file mess + + This does the seq_file conversion + annotation + cleanup + race fixes + for arch/ppc64/kernel/rtas-proc.c. + + How the fuck did that file manage to get anywhere near the tree, anyway? + Take a look at guy's "implementation" of sprintf(buf, "%04d", num), for + example: + + + /* construct the sensor number like 0003 */ + /* fill with zeros */ + n = sprintf(tmp, "%d", s.token); + len = strlen(tmp); + while (strlen(tmp) < 4) + n += sprintf (tmp+n, "0"); + + /* invert the string */ + while (tmp[i]) { + if (i + + And it's full of that level of lusing ;-/ + + + [PATCH] ppc: seq_file conversion for ppc_htab + + This converts the 32-bit ppc htab code to use the seq_file interfaces. + + Less code means fewer bugs.. + + + [PATCH] Fix ppc htab seq_file conversion + + *grrrrrrrr* + + Wrong diff sent. Sorry - normally the tree I'm working in is cp -rl'ed + from the -current, but right now it's a big mess. + + This is the incremental fix. + + + Make the new simple_read_from_buffer() take a const src + buffer without complaints. + + + [ARM PATCH] 1986/1: bootpImage/ARM: add ability to run from non-zero address + + Patch from Kevin Hilman + + The following patch allows the bootpImage to be loaded and executed + from a non-zero address. On OMAP platforms for example, the physical + address for SDRAM is 0x10000000 and not zero. + + + [ARM PATCH] 1988/1: S3C2410 - defconfig update to include all boards + + Patch from Ben Dooks + + Updated default configuration file to include all the + boards possible with this architecture + + + [ARM PATCH] 1989/1: S3C2410 - rename owner of VR1000 board and update help + + Patch from Ben Dooks + + Rename to Thorcom, and added extra lines to help + + + [ARM PATCH] 1990/1: S3C2410 - fix mis-spelled time initialisation calls + + Patch from Ben Dooks + + Fixed mis-spelled time initialisation calls and + a bad prototype in the time header + + Fixes for patch 1962/1 + + + [SERIAL] replace schedule_timeout() with msleep() + + Patch from: Nishanth Aravamudan + + Use msleep() instead of schedule_timeout() to + guarantee the task delays for the desired time. + + Signed-off-by: Nishanth Aravamudan + Signed-off-by: Russell King + + + [PATCH] Re-implemented i586 asm AES + + This code is a rework of the original Gladman AES code, and does not + include any supposed BSD licensed work by Jari Ruusu. + + Linus converted the Intel asm to Gas format, and made some minor + alterations. + + Fruhwirth's glue module has also been retained, although I rebased the + table generation and key scheduling back to Gladman's code. I've tested + this code with some standard FIPS test vectors, and large FTP transfers + over IPSec (both locally and over the wire to a system running the + generic AES implementation). + + Signed-off-by: James Morris + Signed-off-by: Linus Torvalds + + + [FB] replace schedule_timeout() with msleep() + + Patch from: Nishanth Aravamudan + + Use msleep() instead of schedule_timeout() to + guarantee the task delays for the desired time. + + Signed-off-by: Nishanth Aravamudan + Signed-off-by: Russell King + + + [ARM] Remove unnecessary CONFIG_CPU_32 preprocessor conditional. + + We're only 32-bit ARMs, so testing this symbol in 32-bit only code + is unnecessary. + + + [PATCH] Remove ppc32 proc_rtas.c + + This patch removes proc_rtas.c and error_log.[ch] from + arch/ppc/platforms. It turns out that the code in error_log.[ch] is + completely unused, and the code in proc_rtas.c is buggy, almost + impossible to understand, and rarely used. + + Signed-off-by: Paul Mackerras + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32: Fix building of certain CPU types + + The following corrects how we pass CPU flags to gas. Previous, AFLAGS + was incorrectly assumed to be pased directly to $(AS), which is not the + case. + + Concept ack'd by Sam Ravnborg. + + Signed-off-by: Tom Rini + Signed-off-by: Linus Torvalds + + + [NET]: Move sndmsg_page destruction back into TCP for now. + + Signed-off-by: David S. Miller + + + [SPARC64]: Eliminate costly sdivx from gettimeofday. + + Also use non-irq read seqlocking on xtime_lock. + + Signed-off-by: David S. Miller + + + [SPARC64]: Implement tlb flush batching just like ppc64. + + Signed-off-by: David S. Miller + + + Add infrastructure for the VFS layer to mark files seekable. + + We use a FMODE_LSEEK flag to match the existing read/write + bits. This allows us to check for seekability on a VFS level + for lseek/pread/pwrite, and cleans things up. + + Update some sites that used the numeric constants to use + the symbolic values instead. + + + [PATCH] kbuild: Remove LANG preset in top-level Makefile + + In the top-level Makefile a number of locale related environment + variables were preset to give a small speed up when building the kernel. + + Unfortunately this had the bad sideeffect that the variable + CFLAGS_vmlinux.lds.o lost the exported vaule in some setups (obviously + not mine). This smells like a make issue - but the best solution is + simply to drop presetting the locale related variables. + + Signed-off-by: Sam Ravnborg + Signed-off-by: Linus Torvalds + + + [PATCH] Restore PPP filtering + + Karsten Keil's patch entitled "[ISDN]: Fix kernel PPP/IPPP active/passiv + filter code" that went in back in April was an attempt to solve a real + problem - namely that the libpcap maintainers have removed useful + functionality that pppd was using - but his fix broke existing pppd + binaries and IMO didn't end up actually solving the problem. + + This patch reverts the change to ppp_generic.c so that existing pppd + binaries work again. I am going to have to work out a proper fix, which + may involve further changes to ppp_generic.c, but I will make sure existing + pppd binaries still work. + + Signed-off-by: Paul Mackerras + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] jbd: journal_head unmapping race fix + + Fix a race identified by Chris Mason + + journal_unmap_buffer -> __dispose_buffers has the j_list_lock and the + jbd_lock_bh_state held. + + journal_get_write_access calls journal_put_journal_head, which takes + jbd_lock_bh_journal_head(bh) and doesn't seem to have any other locks held. + + Since journal_unmap_buffers trusts the buffer_jbd bit to see if we need to + call __dispose_buffer, and nobody seems to test buffer_jbd after taking + jbd_lock_bh_journal_head. The kernel dereferences a null jh pointer in + __journal_remove_journal_head. + + + The patch fixes this by using journal_grab_journal_head() in + journal_unmap_buffer(). It ensures that we either grab and pin the + journal_head if the bh has one, or we bale out if the bh doesn't have a + journal_head. + + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sparc32: turbosparc flush warnings + + FLUSH_BEGIN() is a nop at the moment, so the mm variable for its argument + trips a warning. Pass vma->vm_mm directly instead. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sparc32: sparc32 init_idle() + + An analysis of the code determined that AP initialization called init_idle() + no less than three times, 2 out of the three with incorrect numbers of + arguments. This patch removes the superfluous calls. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sparc32: sun4d cpu_present_map is a cpumask_t + + cpu_present_map is a cpumask_t. Sweep arch/sparc/kernel/sun4d_smp.c so that + it is treated as such. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sparc32: smp_processor_id() BITFIXUP fixes + + The SMP initialization functions try to do btfixups on the wrong symbols for + smp_processor_id(), which is now implemented in terms of + current_thread_info()->cpu. hard_smp_processor_id() etc. are now in use + where smp_processor_id() was once used. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sparc32: reinstate smp_reschedule_irq() + + smp_reschedule_irq() mysteriously vanished sometime after 2.4. This patch + reinstates it so that the kernel will link properly and so cpus will set + TIF_NEED_RESCHED when it's asked of them. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sparc32: remove references to start_secondary() + + Remove leftover references to now-unused start_secondary() + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sparc32: define cache_decay_ticks + + cache_decay_ticks needs to be defined in order for the kernel to link. This + placeholder is inaccurate, however, other, more grave SMP issues need to be + addressed first. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sparc32: remove unused variable in dvma.c + + This variable is unused and causes noisy compiles. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sparc32: sun4 does not support SMP + + The sun4 port does not support SMP. Disable it via Kconfig. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sparc32: make CONFIG_SMP depend on CONFIG_BROKEN + + SMP support is in need of a great deal of work to port it from 2.2 and 2.4. + Add a dependency on BROKEN in the Kconfig to warn the unwary. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] sparc32: gcc-3.3 macro parenthesization fix for memcpy.S + + From: Art Haas + + The 1.3->1.4 changes to the arch/sparc/lib/copy_user.S file added parenthesis + to a number of macros within that file. The BK changlog associated with this + change indicate the change was to make the file work with gcc-3.3. + + When looking at the changes made, I see that similar macros exist in memcpy.S + as well, so would a patch adding parens to that file be worthwhile? Also, + just what was the problem with gcc-3.3 that was resolved by adding the + parenthesis? Macro mis-expansion I'm guessing. + + Signed-off-by: Art Haas + Signed-off-by: William Irwin + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] s390: core changes. + + From: Martin Schwidefsky + + s390 core changes: + - Add 32 bit compat code for ptrace requests PTRACE_GETEVENTMSG, + PTRACE_GETSIGINFO and PTRACE_SETSIGINFO. + - Make non-smp kernel compile. + - Regenerate default configuration. + + Signed-off-by: Martin Schwidefsky + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] s390: common i/o layer changes. + + common i/o layer changes: + - Set state of a disconnected device to offline before calling + ccw_device_online, otherwise the device doesn't come up again. + - Check for channel end when trying to find out if basic sense + was successful. + - Fix error handling in new_channel_path. + + Signed-off-by: Martin Schwidefsky + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] s390: msleep vs. schedule_timeout. + + Use msleep() instead of schedule_timeout() to guarantee the task + delays for the desired time. + + Signed-off-by: Nishanth Aravamudan + Signed-off-by: Martin Schwidefsky + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] s390: ctc driver changes. + + Prefix debug feature variables with ctc to avoid name space problems. + + Signed-off-by: Martin Schwidefsky + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] s390: zfcp host adapater. + + From: Heiko Carstens + From: Andreas Herrmann + + zfcp host adapater change: + - Fix call to close_physical_port to prevent devices going offline + after error recovery. + - Fix return value of sysfs port_remove attribute store function. + - Replace reboot notifier with device driver shutdown function. + + Signed-off-by: Martin Schwidefsky + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] s390: qeth performance. + + qeth network driver performance improvements. The ping time on the + HiperSockets interface drops from 250 usecs to 50 usecs and the 1 bytes + request/response test improves from 70000 to 110000 transactions. + + Signed-off-by: Martin Schwidefsky + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: fix free_irq() + + Fix ppc64 free_irq. + + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: pci_dn cleanups + + This patch just cleans up arch/ppc64/kernel/pci_dn.c a bit, including: + - remove it from the iSeries build completely + - small changes to Makefile + - remove the "post" parameter from traverse_pci_devices as + noone used it + - make traverse_all_pci_devices static + - remove CONFIG_PPC_PSERIES tests as we no longer build for iSeries + - some reformatting (closer to "standard") + - remove some of pointer casts + + This has been built (with default config) on pSeries and pmac and built and + run on iSeries. + + Signed-off-by: Stephen Rothwell + Signed-off-by: Paul Mackerras + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: 32-bit ptrace geteventmsg fix + + Here's a fix for the 32-bit PTRACE_GETEVENTMSG ptrace call that handles the + passing of a 32-bit user address. Please apply, thanks. + + Signed-off-by: John Engel + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: various XICS fixes + + - Remove unused includes. + - Be consistent about printing irq numbers, avoid a mix of decimal and + hexadecimal. + - Remove prototypes from xics.c, they should be in xics.h. + - Remove infinite loop on failure, and instead use panic. Panic has a chance to + log the error message on the LED panel and reboot the box, a while(1) loop + does not. + - xics isnt compiled for iseries any more, so no need for the + CONFIG_PPC_PSERIES hack. + + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: fix PCI allocation warning + + Print the correct domain when a PCI resource allocation fails. + + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: avoid speculative execution after rfid + + Due to speculative execution, a CPU may execute some instructions after the + rfid. This makes profiles confusing, since profiling ticks could end up in + those instructions following the rfid that are never executed. + + Add a branch to self after each rfid to avoid this. + + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: set SMT thread priority to medium for all exceptions + + We need to set the thread priority to medium when entering all exceptions. + We may have been executing in low priority (eg the idle loop), but + definitely do not want to remain in that priority for the duration of the + exception (eg a device interrupt). + + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: fix chrp_progress mismerge + + Due to a mismerge, some code in chrp_progress appears twice. While here, + clean up some formatting issues. + + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: suppress 'store_purr' unused warning + + Some new sysfs macros declare a store_purr() function that never gets used, + which makes a compiler warning happen. Suppress the warning with the used + attribute. + + Signed-off-by: Dave Hansen + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: move SPINLINE out of global menu + + This somehow ended up out in the global Kconfig menu. Move it back inside + debugging where it belongs. + + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc64: suppress unused var warning in get_irq_server() + + When normal IRQ balancing is used, the following warnings appear: + + arch/ppc64/kernel/xics.c: In function `get_irq_server': + arch/ppc64/kernel/xics.c:242: warning: unused variable `cpumask' + arch/ppc64/kernel/xics.c:243: warning: unused variable `tmp' + + Simply move the variables inside the #ifdef + + Signed-off-by: Anton Blanchard + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32: clean up PPC44x mmu_mapin_ram() + + Remove some old cruft in the kernel lowmem mapping code and save some + memory in the process. + + Signed-off-by: Matt Porter + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32: fix ebony uart clock + + This patch corrects the Ebony board's uart clock value to the rate of the + external Epson SG-615P clock source. Now good to 115Kbps. + + Signed-off-by: Geoff Levand for CELF + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32: remove pci-dma.c + + Remove pci-dma.c. It is cruft left over from the DMA API changes. + + Signed-off-by: Matt Porter + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] ppc32: add PPC4xx DMA engine library + + Adds a cleaned up version of the PPC4xx DMA engine library. Converted to + new DCR access method and DMA API. + + Signed-off-by: Matt Porter + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + Add pread/pwrite support bits to match the lseek bit. + + This also removes the ESPIPE logic from pipes and seq_files, + since the VFS layer now supports it. + + + [SPARC64]: Need flush_tlb_pending() in switch_to(). + + Signed-off-by: David S. Miller + + + [SPARC64]: Kill TLB rtrap debug code. + + + [SPARC64]: Update defconfig. + + + Add "nonseekable_open()" helper functions for nonseekable + file descriptors. + + + Teach sendfile() to honour non-seekable source files. + + Remove the test from the socket code, now that it's no + longer necessary. + + + Mark tty's as being non-seekable, and remove the now + unnecessary tests at read/write time. + + + Character device tape drivers are non-lseekable. + + You can seek the tape, but you do it with the magic tape + control ioctl's, not with lseek/pread/pwrite. + + + Mark the sunrpc cache control file nonseekable, and + remove the run-time tests for it. + + + The seq_file code already disabled pread/pwrite access, + no need for the mtrr code to check any more. + + + Fix up a couple of drivers - notable sg - for nonseekability. + + + [PATCH] Teach sscanf about 'hh' and 'll' + + Adds support for 'hh' (store number in char *) and 'll' (proper C99 for + long long) modifiers to sscanf(). + + + [PATCH] mpoa patch done right + + - conversion to seq_file, overflow fixes + - qos_parse sanitized (3 sscanf calls instead of insane manual parsing) + leaks plugged + code cleaned up + + We still have serious races, but they are general problem in atm code - it + has no locking whatsoever for any of the lists (mpcs, qos_head, per-client + lists). + + + Make sysctl pass the pos pointer around properly. + + Nobody ever fixed the big FIXME in sysctl - but we really need + to pass around the proper "loff_t *" to all the sysctl functions + if we want them to be well-behaved wrt the file pointer position. + + This is all preparation for making direct f_pos accesses go + away. + + + [ARM] Fix sparse warnings in nwfpe. + + This fixes sparse warnings in fpa11_cpdt (coprocessor data transfer) + instruction emulation. Note that pointers need to be cast to unsigned + long not unsigned int, so convert user registers to be unsigned long + type. + + + [ARM] Eliminate io.c sparse warnings/ gcc 3.4 errors. + + arch/arm/kernel/io.c:15:5: warning: generating address of non-lvalue + arch/arm/kernel/io.c:15:5: warning: loading unknown expression + arch/arm/kernel/io.c:29:5: warning: generating address of non-lvalue + arch/arm/kernel/io.c:29:5: warning: loading unknown expression + + + [ARM] Fix sparse warnings in ds1620.c + + drivers/char/ds1620.c:230:19: warning: incorrect type in argument 1 (different address spaces) + drivers/char/ds1620.c:230:19: expected void [noderef] *to + drivers/char/ds1620.c:230:19: got char *buf + drivers/char/ds1620.c:230:19: warning: incorrect type in initializer (different address spaces) + drivers/char/ds1620.c:230:19: expected void [noderef] *to + drivers/char/ds1620.c:230:19: got char *buf + ... + drivers/char/ds1620.c:383:52: warning: Using plain integer as NULL pointer + + + [ARM] Fix nwbutton sparse warnings + + drivers/char/nwbutton.c:177:24: warning: incorrect type in argument 1 (different address spaces)/home/rmk/bk/linux-2.6-rmk/drivers/char/nwbutton.c:177:24: expected void [noderef] *to + drivers/char/nwbutton.c:177:24: got char *buffer + drivers/char/nwbutton.c:177:24: warning: incorrect type in initializer (different address spaces) + drivers/char/nwbutton.c:177:24: expected void [noderef] *to + drivers/char/nwbutton.c:177:24: got char *buffer + drivers/char/nwbutton.c:189:11: warning: incorrect type in initializer (incompatible argument 2 (different address spaces)) + drivers/char/nwbutton.c:189:11: expected int [usertype] ( *read )( ... ) + drivers/char/nwbutton.c:189:11: got int ( static [addressable] [toplevel] * )( ... ) + + + [ARM] Fix nwflash sparse warnings + + + [ARM] Fix wdt977 sparse warnings + + drivers/char/watchdog/wdt977.c:291:9: warning: incorrect type in initializer (different address spaces) + drivers/char/watchdog/wdt977.c:291:9: expected char const [noderef] *register __p + drivers/char/watchdog/wdt977.c:291:9: got char const *buf + ... + + + Remove ESPIPE logic from drivers, letting the VFS layer handle it instead. + + This cleans up and simplifies drivers, and also allows us future + simplification in the VFS layer, since it removes knowledge about + internal VFS layer handling of "f_pos". + + + ppc64: add user annotations to rtc driver + + + [SPARC64]: Always record actual PC when kernel profiling. + + We used to play games reporting the callers + PC in certain functions such as the rwlock + and atomic_t routines. If anything, somethin + like this should be optional, not by default. + + Signed-off-by: David S. Miller + + + [SPARC64]: Make clear_user_page more leight weight. + + - Do not save/restore existing TLB entries, that is + expensive, complicated, and does not really help + performance much at all. + - Only one block store per loop iteration, doing more + does not make things run any faster. + + Signed-off-by: David S. Miller + + + init.c, pgalloc.h: + Disable pre-emption around access to pgtable_cache_size, pgd_quicklist, + and pmd_quicklist. + + Signed-off-by: Zhang Yanmin + Signed-off-by: Zou Nanhai + Signed-off-by: Tony Luck + + + [ARM] Fix two makefile problems + + - bootp.lds is a source file not a target + - vmlinux.lds doesn't need to depend on the top level Makefile + + + [PATCH] adjust SG reserved size automatically + + The block layer SG should have the identical behaviour as SCSI sg when + it comes to SG_SET_RESERVED_SIZE - allow caller to specify a large + amount, truncate to largest we support, and return that with + SG_GET_RESERVED_SIZE. Currently we fail with -EINVAL if the value is + too large, I think the SCSI sg behaviour is more sane to use. This + one-liner fixes it up, please apply for 2.6.8. + + Signed-off-by: Jens Axboe + Signed-off-by: Linus Torvalds + + + [PATCH] Export blk_queue_resize_tags + + Exports blk_queue_resize_tags since it is an exported interface. + + Signed-off-by: Brian King + Signed-off-by: Jens Axboe + Signed-off-by: Linus Torvalds + + + [PATCH] allow broken apps to include kernel header + + Include compiler.h from sg.h as it uses the __user notation, and change + the types in scsi.h to use user exportable types. + + Signed-off-by: Jens Axboe + Signed-off-by: Linus Torvalds + + + [PATCH] HPT IDE update + + This part got missed in the earlier merge, not sure where it escaped. + + + [SPARC64]: Fix up copy_page just like clear_page. + + - Do not save/restore existing TLB entries, that is + expensive, complicated, and does not really help + performance much at all. + - Only one unrolled loop for cheetah copy code. + - For spitfire, use %asi register for block commit + handling so we do not need two copies of the code. + + Signed-off-by: David S. Miller + + + [PATCH] [ppc64] Fix SLB castout issue + + The SLB rewrite removed a fix for a hard to hit bug, but the SFS guys + managed to hit it straight away. We need to check both r1 and PACAKSAVE + or else we could cast our kernel segment out when on the irq or softirq + stack. + + Signed-off-by: Linus Torvalds + + + [SPARC64]: Remove memcpy Ultra3 PCACHE patching trick. + + It could never be enabled safely, so just toss + the code. + + Signed-off-by: David S. Miller + + + [SPARC64]: Use saner local label names in Ultra3 copies. + + This makes the kernel profiles look much more + meaningful. + + Signed-off-by: David S. Miller + + + Fix up sound driver proc-reading interfaces. + + The old ones were not only hard to use, they were in fact + impossible or a low-level sound driver to get right, since + the core sound code didn't even export all the necessary + information. + + Add the file offset to the /proc read interfaces, and make + them simpler to use. The core now does a offset updates, and + sanity-checks the values so that the low-level drivers don't + need to worry. + + + [SPARC64]: More entropy in add_timer_randomness. + + Based upon a patch from Richard Mortimer. + + Signed-off-by: David S. Miller + + + [VLAN]: Propagate ethtool/mii ioctls to the real device. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [VLAN]: Mirror real devices carrier and hotplug state. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [VLAN]: Use RCU for group operations. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [VLAN]: Fix device refcount bug. + + If you rmmod a network device that is in a vlan, the system hangs waiting + for the refcount to go to zero, because it is -1. The problem is that the + vlan notifier does an extra dev_put in NETDEV_UNREGISTER case of notifier. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [PATCH] knfsd: fix some signed ints that should be unsigned + + Signed-off-by: Neil Brown + Signed-off-by: Linus Torvalds + + + [IPSEC]: Add missing flow_cache_genid update to xfrm_policy_delete() + + Signed-off-by: Eugene Surovegin + Signed-off-by: Herbert Xu + Signed-off-by: David S. Miller + + + [BRIDGE]: Fix problems with filtering and defragmentation. + + Dave, this patch from Bart De Schuymer fixes problems + when using filtering and defragmentation. The bridge needs to enforce the + MTU restriction after going through the filtering chain not before, because + the incoming filter may have reassembled an IP packet, that then needs to + be fragmented on the output chain. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + + + [NET]: Kill stray NET_FASTROUTE references. + + Signed-off-by: Pawel Sikora + Signed-off-by: David S. Miller + + + [CRYPTO]: Add Khazad algorithm. + + Signed-off-by: Aaron Grothe + Signed-off-by: James Morris + Signed-off-by: David S. Miller + + + [PKT_SCHED]: Fix borrowing fairness in htb. + + + [PATCH] boolean typo in DVB + + This looks like what was intended here.. + + Signed-off-by: Dave Jones + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PATCH] dvb: missing includes + + Although the current DVB stuff compiles fine, for correctness the following + patch adds the necessary include for __user annotations. + + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + + + [PKT_SCHED]: Disable local bh's when grabbing qdisc_tree_lock in tc_dump_tfilter. + + I missed this one when fixing locking in __qdisc_destroy. + + Signed-off-by: Patrick McHardy + Signed-off-by: David S. Miller + + + Revert FAT NLS changes. + + It's causing massive user confusion, and breaks installers by + mounting the filesystem read-only. + + Cset exclude: hirofumi@mail.parknet.co.jp[torvalds]|ChangeSet|20040802210150|02337 + + + mips: fix up some straggling sysctl functions + + + Fix up drivers that access file->f_pos directly. + + Use the proper "pointer to pos" that is passed down instead. + + + read/write: pass down a copy of f_pos, not f_pos itself. + + This allows the VFS layer to the update rather than the + low-level drivers. + + + Linux 2.6.8-rc4 + + + [SPARC64]: Fix spitfire bugs in tlb flush and copy_page changes. + + - VISEntry clobbers %g3, so have to do %asi stuff + after we invoke it. + - Need to or in 0x10 to TLB flush addresses when + flushing in secondary context + - Context register restore using wrong address register + - Spitfire not so tolerant of membar in delay slot. + + Signed-off-by: David S. Miller + + + Fix use-after-free bug in MTD partitioning code. + + Define callback wrapper function mtd_erase_callback() to handle + partition offsets during the callback, rather than attempting to + fix them up in the freed erase_info structure after the callback + has already happened. + + + Cosmetic MTD changes -- update email address and idents. + + + M-Systems DiskOnChip driver update. + + - Add Millennium Plus support. + - Add advanced probe configuration options + - Fix abuse of buffer space in scan for Media Header. + + + Restore physmap configure-time settings according to user requests. + Patch from Jun Sun. + + Signed-Off-By: David Woodhouse + + + RedBoot flash partitioning: use vmalloc for buffer. + + + [PATCH] export kblockd_schedule_work() + + This is used by some IBM vscsi driver. It was using schedule_work(), but + should be using the block layer queue. + + Signed-off-by: Jens Axboe + Signed-off-by: Linus Torvalds + + + [PATCH] via-rhine: Really call rhine_power_init() + + Without this patch, mainline via-rhine cannot wake the chip if some other + driver puts it to D3. The problem has hit quite a few people already. + + This is a fix for the heisenbug with via-rhine refusing to work + sometimes. Patch "[9/9] Restructure reset code" contained a change made + necessary by patch [8/9]. Mainline merged [8/9] for 2.6.8 and is still + missing the fix, while -mm got it with [9/9]. + + Jesper Juhl provided crucial test data when no one else was able to + reproduce the symptoms. + + Signed-off-by: Roger Luethi + Signed-off-by: Linus Torvalds + + + Export new mtd_erase_callback() function. + + + [PATCH] 4kstacks: fix compile with gcc 2.95 + + Investigation of why the build is failing due to bogus detection of + undefined symbols: We're getting this warning: + + arch/i386/kernel/irq.c + {standard input}: Assembler messages: + {standard input}:3565: Warning: setting incorrect section type for + .bss.page_aligned + + Which comes from this code in the 4k stacks code: + + static char softirq_stack[NR_CPUS * THREAD_SIZE] __attribute__((__aligned__(THREAD_SIZE), __section__(".bss.page_aligned"))); + static char hardirq_stack[NR_CPUS * THREAD_SIZE] __attribute__((__aligned__(THREAD_SIZE), __section__(".bss.page_aligned"))); + + Removing the __section__() fixes it, as does moving to gcc 3.2 or 3.3, + but gcc 2.95 and 3.0 still exhibit the problem. It seems the 4k stack + developers like newer compilers than I do :) + + The gcc 2.95 section declaration looks like this: + .section .bss.page_aligned,"aw",@progbits + while the 3.1 section looks like this: + .section .bss.page_aligned,"aw",@nobits + + It's definitely a bug that's been fixed: + http://sources.redhat.com/ml/binutils/2002-10/msg00507.html + + I've been told that I can fix it with a carefully crafted assembly file and + maybe a change to the linker script, but all that it buys us is a little + space in the uncompressed kernel image. Plus, the warning will still be + there at compile-time. + + I say, put them back in plain old BSS. + + Signed-off-by: Andrew Morton + Signed-off-by: Adrian Bunk + Signed-off-by: Linus Torvalds + + + [libata sata_nv] support for hardware, bug fixes + + + [libata] unmap MMIO region _after_ last possible usage + + + [PATCH] prism54 Clarification to Viro's patch + + * It seems that Viro patched prism54 with the following patch set : + http://www.kernel.org/pub/linux/kernel/v2.6/testing/cset/ + cset-viro@www.linux.org.uk[torvalds]|ChangeSet|20040727040034|54764.txt + + * I do not see any indication in any mailing list of this. + It would be nice if we could be informed of such changes :-) + + * (Changes committed to our CVS) + + + [PATCH] prism54 URGENT - Fix IRQ handling + + * We are handing back HANDLED even though the IRQ is not for us. + We also change device state. + This is plainly wrong. + AFAICT we also need to take the spin lock early. + Tested/running on UP/SMP for about a week now. + (Discovered on one of my lappies that had the X driver on the same IRQ) + (Proposed on Prism54 Devel with no objections) + + + [PATCH] prism54 Fix memory leaks + + * Change the "version" OID to what it should be. + * Fix memory leaks - mgt_get_request always returns + * allocated memory for non-int OIDS (with an exception - + * keep reading). If the caller checks the return and itself + * returns, then it must free memory. + * However, it is possible to return from mgt_get_request + * early (!priv->mib). In this case, weird things can happen + * in isl_ioctl. Quick fix, at least to force an oops, is + * to set the union value to NULL. The real fix is to + * recode all mgt_get_request calls in isl_ioctl. + + + [PATCH] prism54 Fix supported rates reporting + + * We are not correctly reporting supported bit rates. + * Fix it. + + + [PATCH] Atmel wireless bigendian fix. + + The following patch adds a couple of missing byteswaps and allows the + Atmel wireless driver to work in WEP mode on big-endian CPUs. (tested + on powerPC). + + + [PATCH] bk-netdev-axnet_cs-fix + + Signed-off-by: Andrew Morton + + + [PATCH] wrong mac address with netgear FA311 ethernet card + + From: Mathieu LESNIAK + + + This patch corrects a problem with Netgear FA311 + ethernet card (a cheap one). Without it, the MAC address is byte swapped + ie : + HWaddr 02:00:07:E3:E9:F5 + instead of : + HWaddr 00:02:E3:07:F5:E9 + + (the correct MAC address vendor code for Netgear/LiteOn is 00:02:E3) + + + Signed-off-by: Andrew Morton + + + [PATCH] bk-netdev-hp-plus-fix + + Signed-off-by: Andrew Morton + + + Fix MTD partitioning modular build. + + + [SPARC64]: Kill swapper_space test in arch/sparc64/mm/tlb.c + + It is bogus, plus it breaks the build with + CONFIG_SWAP disabled. + + Based upon a patch from Ben Collins (bcollins@debian.org) + + Signed-off-by: David S. Miller + + + [SPARC64]: Change TIF_BLKCOMMIT into a fault code. + + Eliminates costly atomic bitops in do_sparc64_fault. + + Signed-off-by: David S. Miller + + + [SPARC64]: Update defconfig. + + + [PATCH] Fix unsigned underflow in xdr decoding. + + With 'len' being unsigned now, we must make sure it never tries + to go negative... + + Thanks: griffon26@kfk4ever.com (Maurice van der Pot) + + Signed-off-by: Neil Brown + Signed-off-by: Linus Torvalds + + + [PATCH] Remove CONFIG_SERIAL_8250_MANY_PORTS from Ebony / Ocotea + + CONFIG_SERIAL_8250_MANY_PORTS should not be set for these boards, as + they only have 2 serial ports. + + Signed-off-by: Tom Rini + Signed-off-by: Linus Torvalds + + + [PCMCIA] pd6729: add MODULE_DESCRIPTION and MODULE_AUTHOR, fix comment style + + + [ARM PATCH] 2012/1: Use -malignment-traps instead of -mshort-load-bytes if gcc supports it + + Patch from Catalin Marinas + + This patch replaces the -mshort-load-bytes option with $(call + check_gcc,-malignment-traps,-mshort-load-bytes) in the CFLAGS + setting in arch/arm/Makefile. + + + [PATCH] setup queue before elevator_init() + + We must setup the queue before calling elevator_init(), otherwise the + elevator cannot use the queue members. This really hurts cfq since it + checks ->nr_requests, which is zero at that time. + + Signed-off-by: Linus Torvalds + + + Be a bit more anal about allowing SCSI commands to be sent. + + Normal users shouldn't have access to the raw device anyway + unless they are in the trusted "disk" group, but let's require + RAWIO capabilities. That's what the original SCSI interfaces + did anyhoo. + + We probably _should_ just require write access, but that will + need more of a code change to pass down the file descriptor. + + + [SPARC64]: Fix non-SMP build. + + Signed-off-by: David S. Miller + + + [ARM PATCH] 2001/1: lh7a40x IDE cleanup + + Patch from Marc Singer + + This patch aligns the lh7a40x port with the updated structure of IDE + drivers. It also removes an unused FIQ handler. This patch is made + in order to get the lh7a40x port to build. + + + + [ARM PATCH] 2002/1: lh7a40x Timer fixup + + Patch from Marc Singer + + The work already done to rectify the timer code initialization missed + a necessary change. This patch adds a timer initialization function + to the LPD7A400 machine type. It also makes a small correction to the + kernel configuration that is out of step with the machine specific + Kconfig. + + + + + Pass done file pointer to block device ioctl's + + They'll need it for permission checking. + + + Allow non-root users certain raw commands if they are deemed safe. + + We allow more commands if the disk was opened read-write. + + + [PATCH] ppc32: Fix warning on CONFIG_PPC32 && CONFIG_6xx + + In the *ppos cleanups, proc_dol2crvec was updated, but the prototype + found at the top of kernel/sysctl.h was not, generating warning. This + corrects the prototype to match the code. + + (I'm gonna take a stab at moving these into arch/ppc shortly) + + Signed-off-by: Tom Rini + Signed-off-by: Linus Torvalds + + + [PATCH] Remove fcntl f_op + + The newly introduced ->fcntl file_operation is badly thought out, + not to mention undocumented. This patch replaces it with two better + defined operations -- check_flags and dir_notify. Any other fcntl()s + that filesystems are interested in can have their own properly typed + f_op method when they need it. + + Signed-off-by: Linus Torvalds + + + [PATCH] PA-RISC update + + - __PAGE_OFFSET is 0x10000000 (Randolph Chung) + - PA8800 support (Grant Grundler) + - debuglocks (Thibaut Varene) + - PDC chassis disabling (Thibaut Varene) + - Distinguish between Dinos in request_irq (Thibaut Varene) + - Document interrupt registers (Randolph Chung) + - Revamp CONFIG_DISCONTIGMEM support (Randolph Chung) + - Remove STI console warning and special casing (Randolph Chung) + - n4000 defconfig (Randolph Chung) + - iosapic fixes (Bjorn Helgaas) + - Fix a bug in entry.S where pa_dbit_lock was being trashed (Randolph Chung) + - SMP support (Randolph Chung, Grant Grundler, James Bottomley) + - Clear the pte in the fault handler (Joel Soete) + - Change _exit prototype (Carlos O'Donell) + - Better unwinding support (Randolph Chung) + - GCC 3.4 fixes (Carlos O'Donell, Randolph Chung) + + + [PATCH] cdrom: MO-drive open write fix + + This trivial fix allows mounting MO-drives readwrite. + + Acked by Jens. + + Signed-off-by: Linus Torvalds + + + [PATCH] lasi_82596 update + + Update lasi 82596 driver: + - Fix boot messages (Helge Deller) + - Whitespace and __FILE__ usage (Joel Soete) + - 64-bit compile warning fixes (James Bottomley) + + + Linux 2.6.8 + --- linux-source-2.6.8.1-2.6.8.1.orig/debian/README.Debian +++ linux-source-2.6.8.1-2.6.8.1/debian/README.Debian @@ -0,0 +1,78 @@ +kernel-source for DEBIAN +------------------------ + +Patches +------- +Debian applies various changes to the kernel source. These are split up +into small patches addressing individual problems. Each of the patch files +contains a description and mentions the author. The patches can be found +at http://svn.debian.org/viewcvs/kernel/tags/kernel/source/${version}. + +Rebuilding Adaptec AIC7xxx/79xx firmware +---------------------------------------- +You can rebuild the firmware for the Adaptec AIC7xxx/79xx SCSI Adapters. To +do so you need to set AIC7XXX_BUILD_FIRMWARE/AIC79XX_BUILD_FIRMWARE config +options. Note that this requires to have the development packages for +berkelydb (libdb4.2-dev) installed. + +PS/2 Mice +--------- +If your PS/2 mouse does not work, make sure that the modules psmouse and +mousedev are loaded. + +AMD 768 erratum 10 +------------------ +If you have a motherboard with the AMD 768 chipset, and you are experiencing +IDE errors or lock ups, then you should either connect a PS/2 mouse to the +system or disable APIC. Refer to the following link for details: + +http://lists.insecure.org/lists/linux-kernel/2002/Sep/5966.html + +mem= on 2.4.19 and later +------------------------ +mem=xxxM can no longer be used to enlarge the RAM that the kernel uses. +You must specify the exact memory map. For example, Compaq Proliant users +can specify mem=48M@16M if they 64M of memory. + +80386 compatibility +------------------- +DRM modules will not work on true 80386 processors. These drivers all assume +that cmpxchg is available. + +IDE bswap option +---------------- +The bswap option is obsolete and may disappear in future. For the moment +it does work provided that you disable dma with the nodma option. + +Additional Drivers +------------------ +* SCSI Media Changer + http://bytesex.org/patches/ +* Amiga Smart Filesystem driver + http://march.home.staszic.waw.pl/asfs/ + +Non-free bits removed +--------------------- +* Keyspan firmware, driver disabled + . drivers/usb/serial/ksyspan_{mpr,usa*}_fw.h +* Emagic EMI 2|6 usb audio interface firmware loader + . drivers/usb/misc/emi62_fw_*.h + +Firmware removed +---------------- +* SMC Token Ring firmware, driver disabled: + . drivers/net/tokenring/smctr_firmware.h +* ACENIC firwmare, driver disabled: + . drivers/net/acenic_firmware.h +* DGRS firmware, driver disabled: + . drivers/net/dgrs_firmware.c +* DAB firmware, driver disabled: + . drivers/usb/media/dabfirmware.h +* QLA2XXX firmware, driver disabled: + . drivers/scsi/qla2xxx/*_fw.c +* TIGON3 firmware: + . drivers/net/tg3.c +* Unused firmware: + . sound/oss/724hwmcode.h + . sound/oss/Hwmcode.h + --- linux-source-2.6.8.1-2.6.8.1.orig/debian/README.NMU +++ linux-source-2.6.8.1-2.6.8.1/debian/README.NMU @@ -0,0 +1,49 @@ +The Debian-specific patches to the kernel source are now created with +the help of dpatch. However, the kernel-patch-debian package still +contains monolithic patches between the various Debian revisions (say, +2.6.7-1, 2.6.7-2, 2.6.7-3) of an upstream release. They are generated +during the build by the monolith target in debian/rules. + +Please follow those steps to create a new revision: + +1. Copy the last debian/patches/00list- file, incrementing the + number by one. + +2. If you are adding patches, put them into debian/patches in dpatch + format. You can refer to the other dpatch files for examples. Add + the name of the dpatch file to the 00list- file you just + created. + +3. If you are changing a patch, please do not change the dpatch file. + Create a copy, edit the copy, and put its name into the latest + 00list-file. + +4. Add a changelog entry and build the package. + +Example: + + Let's say the kernel-patch package is at revision -3, and currently + consists of the foo, bar-2 and baz patches. So the directory + debian/patches looks like this: + + 00list-1 00list-2 00list-3 + bar.dpatch bar-2.dpatch baz.dpatch foo.dpatch + + and the 00list-files contain the following lines: + + 00list-1: foo baz + 00list-2: foo bar baz + 00list-3: foo bar-2 baz + + Now you may need to make another change to the bar patch, and add + the qux patch. So you add qux.dpatch, add the new bar patch as + bar-3.dpatch, and create the following new list: + + 00list-4: foo bar-3 baz qux + + In the end, the debian/patches directory contains: + + 00list-1 00list-2 00list-3 00list-4 + bar.dpatch bar-2.dpatch bar-3.dpatch baz.dpatch foo.dpatch qux.dpatch + + Easy, huh? --- linux-source-2.6.8.1-2.6.8.1.orig/debian/apply +++ linux-source-2.6.8.1-2.6.8.1/debian/apply @@ -0,0 +1,35 @@ +#!/bin/sh +# $Id: apply,v 1.1 2003/12/21 05:37:17 herbert Exp $ + +set -e + +if ! [ -d Documentation ] || ! [ -d kernel ]; then + echo 'Not in kernel top level directory. Exiting' >&2 + exit 1 +fi + +stem=@stem@ +version=@version@ +upstream=${version%-*} +home=/usr/src/$stem-patches/all/$upstream/debian + +if [ -f version.Debian ]; then + current=$(cat version.Debian) +else + echo "No version.Debian file, assuming pristine Linux $upstream" >&2 + current=$upstream +fi + +intended=${1:-$version} + +patches=$($home/list-patches $current $intended $home/list) +reverse=-R +for i in $patches; do + if [ $i = / ]; then + reverse= + continue + fi + bzcat $home/$i.bz2 | patch -s -p1 $reverse +done + +echo $intended > version.Debian --- linux-source-2.6.8.1-2.6.8.1.orig/debian/bin/touch +++ linux-source-2.6.8.1-2.6.8.1/debian/bin/touch @@ -0,0 +1,18 @@ +#!/bin/sh + +set -e + +if [ -z "${1##-*}" ] && [ "$1" != -- ]; then + exec touch.orig "$@" +fi + +trap 'rm -f $TMP' EXIT +TMP=$(tempfile) + +# Create the files if they don't exist. +touch.orig -a "$@" + +tar -P --remove-files -cf $TMP "$@" +tar xfP $TMP +rm -f $TMP +exec touch.orig "$@" --- linux-source-2.6.8.1-2.6.8.1.orig/debian/config/amd64/amd64-generic +++ linux-source-2.6.8.1-2.6.8.1/debian/config/amd64/amd64-generic @@ -0,0 +1,2512 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_X86_64=y +CONFIG_64BIT=y +CONFIG_X86=y +CONFIG_MMU=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +CONFIG_X86_CMPXCHG=y +CONFIG_EARLY_PRINTK=y +CONFIG_HPET_TIMER=y +# CONFIG_HPET_EMULATE_RTC is not set +CONFIG_GENERIC_ISA_DMA=y + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +CONFIG_CLEAN_COMPILE=y +CONFIG_BROKEN_ON_SMP=y + +# +# General setup +# +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_BSD_PROCESS_ACCT=y +# CONFIG_BSD_PROCESS_ACCT_V3 is not set +CONFIG_SYSCTL=y +# CONFIG_AUDIT is not set +CONFIG_LOG_BUF_SHIFT=14 +CONFIG_HOTPLUG=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_EMBEDDED=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_OBSOLETE_MODPARM=y +CONFIG_MODVERSIONS=y +CONFIG_KMOD=y + +# +# Processor type and features +# +# CONFIG_MK8 is not set +# CONFIG_MPSC is not set +CONFIG_GENERIC_CPU=y +CONFIG_X86_L1_CACHE_BYTES=128 +CONFIG_X86_L1_CACHE_SHIFT=7 +CONFIG_X86_TSC=y +CONFIG_X86_GOOD_APIC=y +CONFIG_MICROCODE=m +CONFIG_X86_MSR=m +CONFIG_X86_CPUID=m +CONFIG_X86_IO_APIC=y +CONFIG_X86_LOCAL_APIC=y +CONFIG_MTRR=y +# CONFIG_SMP is not set +# CONFIG_PREEMPT is not set +CONFIG_GART_IOMMU=y +CONFIG_SWIOTLB=y +CONFIG_X86_MCE=y + +# +# Power management options +# +CONFIG_PM=y +# CONFIG_SOFTWARE_SUSPEND is not set + +# +# ACPI (Advanced Configuration and Power Interface) Support +# +CONFIG_ACPI=y +CONFIG_ACPI_BOOT=y +CONFIG_ACPI_INTERPRETER=y +CONFIG_ACPI_SLEEP=y +CONFIG_ACPI_SLEEP_PROC_FS=y +CONFIG_ACPI_AC=m +CONFIG_ACPI_BATTERY=m +CONFIG_ACPI_BUTTON=m +CONFIG_ACPI_FAN=m +CONFIG_ACPI_PROCESSOR=m +CONFIG_ACPI_THERMAL=m +CONFIG_ACPI_ASUS=m +CONFIG_ACPI_TOSHIBA=m +# CONFIG_ACPI_DEBUG is not set +CONFIG_ACPI_BUS=y +CONFIG_ACPI_EC=y +CONFIG_ACPI_POWER=y +CONFIG_ACPI_PCI=y +CONFIG_ACPI_SYSTEM=y + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_PROC_INTF=m +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=m +CONFIG_CPU_FREQ_GOV_USERSPACE=m +# CONFIG_CPU_FREQ_24_API is not set +CONFIG_CPU_FREQ_TABLE=m + +# +# CPUFreq processor drivers +# +CONFIG_X86_POWERNOW_K8=m + +# +# Bus options (PCI etc.) +# +CONFIG_PCI=y +CONFIG_PCI_DIRECT=y +CONFIG_PCI_MMCONFIG=y +# CONFIG_PCI_MSI is not set +CONFIG_PCI_LEGACY_PROC=y +CONFIG_PCI_NAMES=y + +# +# PCMCIA/CardBus support +# +CONFIG_PCMCIA=m +# CONFIG_PCMCIA_DEBUG is not set +CONFIG_YENTA=m +CONFIG_CARDBUS=y +CONFIG_PD6729=m +CONFIG_I82092=m +CONFIG_TCIC=m + +# +# PCI Hotplug Support +# +CONFIG_HOTPLUG_PCI=m +CONFIG_HOTPLUG_PCI_FAKE=m +CONFIG_HOTPLUG_PCI_ACPI=m +CONFIG_HOTPLUG_PCI_CPCI=y +CONFIG_HOTPLUG_PCI_CPCI_ZT5550=m +CONFIG_HOTPLUG_PCI_CPCI_GENERIC=m +CONFIG_HOTPLUG_PCI_PCIE=m +# CONFIG_HOTPLUG_PCI_PCIE_POLL_EVENT_MODE is not set +CONFIG_HOTPLUG_PCI_SHPC=m +# CONFIG_HOTPLUG_PCI_SHPC_POLL_EVENT_MODE is not set + +# +# Executable file formats / Emulations +# +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_MISC=m +CONFIG_IA32_EMULATION=y +CONFIG_IA32_AOUT=y +CONFIG_COMPAT=y +CONFIG_SYSVIPC_COMPAT=y +CONFIG_UID16=y + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=m + +# +# Memory Technology Devices (MTD) +# +CONFIG_MTD=m +# CONFIG_MTD_DEBUG is not set +CONFIG_MTD_PARTITIONS=y +CONFIG_MTD_CONCAT=m +CONFIG_MTD_REDBOOT_PARTS=m +# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set +# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set +# CONFIG_MTD_CMDLINE_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=m +CONFIG_MTD_BLOCK=m +CONFIG_MTD_BLOCK_RO=m +CONFIG_FTL=m +CONFIG_NFTL=m +CONFIG_NFTL_RW=y +CONFIG_INFTL=m + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=m +CONFIG_MTD_JEDECPROBE=m +CONFIG_MTD_GEN_PROBE=m +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +CONFIG_MTD_CFI_INTELEXT=m +CONFIG_MTD_CFI_AMDSTD=m +CONFIG_MTD_CFI_AMDSTD_RETRY=0 +CONFIG_MTD_CFI_STAA=m +CONFIG_MTD_CFI_UTIL=m +CONFIG_MTD_RAM=m +CONFIG_MTD_ROM=m +CONFIG_MTD_ABSENT=m + +# +# Mapping drivers for chip access +# +CONFIG_MTD_COMPLEX_MAPPINGS=y +CONFIG_MTD_PHYSMAP=m +CONFIG_MTD_PHYSMAP_START=0x8000000 +CONFIG_MTD_PHYSMAP_LEN=0x4000000 +CONFIG_MTD_PHYSMAP_BANKWIDTH=2 +CONFIG_MTD_PNC2000=m +CONFIG_MTD_SC520CDP=m +CONFIG_MTD_NETSC520=m +CONFIG_MTD_SBC_GXX=m +CONFIG_MTD_ELAN_104NC=m +CONFIG_MTD_SCx200_DOCFLASH=m +# CONFIG_MTD_AMD76XROM is not set +# CONFIG_MTD_ICHXROM is not set +# CONFIG_MTD_SCB2_FLASH is not set +CONFIG_MTD_NETtel=m +CONFIG_MTD_DILNETPC=m +CONFIG_MTD_DILNETPC_BOOTSIZE=0x80000 +# CONFIG_MTD_L440GX is not set +CONFIG_MTD_PCI=m + +# +# Self-contained MTD device drivers +# +CONFIG_MTD_PMC551=m +# CONFIG_MTD_PMC551_BUGFIX is not set +# CONFIG_MTD_PMC551_DEBUG is not set +CONFIG_MTD_SLRAM=m +CONFIG_MTD_PHRAM=m +CONFIG_MTD_MTDRAM=m +CONFIG_MTDRAM_TOTAL_SIZE=4096 +CONFIG_MTDRAM_ERASE_SIZE=128 +CONFIG_MTD_BLKMTD=m + +# +# Disk-On-Chip Device Drivers +# +CONFIG_MTD_DOC2000=m +CONFIG_MTD_DOC2001=m +CONFIG_MTD_DOC2001PLUS=m +CONFIG_MTD_DOCPROBE=m +CONFIG_MTD_DOCECC=m +# CONFIG_MTD_DOCPROBE_ADVANCED is not set +CONFIG_MTD_DOCPROBE_ADDRESS=0 + +# +# NAND Flash Device Drivers +# +CONFIG_MTD_NAND=m +# CONFIG_MTD_NAND_VERIFY_WRITE is not set +CONFIG_MTD_NAND_IDS=m +CONFIG_MTD_NAND_DISKONCHIP=m +# CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set +CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0 +# CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE is not set + +# +# Parallel port support +# +CONFIG_PARPORT=m +CONFIG_PARPORT_PC=m +CONFIG_PARPORT_PC_CML1=m +CONFIG_PARPORT_SERIAL=m +CONFIG_PARPORT_PC_FIFO=y +# CONFIG_PARPORT_PC_SUPERIO is not set +CONFIG_PARPORT_PC_PCMCIA=m +# CONFIG_PARPORT_OTHER is not set +CONFIG_PARPORT_1284=y + +# +# Plug and Play support +# + +# +# Block devices +# +CONFIG_BLK_DEV_FD=m +CONFIG_PARIDE=m +CONFIG_PARIDE_PARPORT=m + +# +# Parallel IDE high-level drivers +# +CONFIG_PARIDE_PD=m +CONFIG_PARIDE_PCD=m +CONFIG_PARIDE_PF=m +CONFIG_PARIDE_PT=m +CONFIG_PARIDE_PG=m + +# +# Parallel IDE protocol modules +# +CONFIG_PARIDE_ATEN=m +CONFIG_PARIDE_BPCK=m +CONFIG_PARIDE_COMM=m +CONFIG_PARIDE_DSTR=m +CONFIG_PARIDE_FIT2=m +CONFIG_PARIDE_FIT3=m +CONFIG_PARIDE_EPAT=m +# CONFIG_PARIDE_EPATC8 is not set +CONFIG_PARIDE_EPIA=m +CONFIG_PARIDE_FRIQ=m +CONFIG_PARIDE_FRPW=m +CONFIG_PARIDE_KBIC=m +CONFIG_PARIDE_KTTI=m +CONFIG_PARIDE_ON20=m +CONFIG_PARIDE_ON26=m +CONFIG_BLK_CPQ_DA=m +CONFIG_BLK_CPQ_CISS_DA=m +CONFIG_CISS_SCSI_TAPE=y +CONFIG_BLK_DEV_DAC960=m +CONFIG_BLK_DEV_UMEM=m +CONFIG_BLK_DEV_LOOP=m +CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_SX8=m +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=65536 +CONFIG_BLK_DEV_INITRD=y +CONFIG_LBD=y + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=m +CONFIG_BLK_DEV_IDE=m + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_IDE_SATA is not set +# CONFIG_BLK_DEV_HD_IDE is not set +CONFIG_BLK_DEV_IDEDISK=m +# CONFIG_IDEDISK_MULTI_MODE is not set +CONFIG_BLK_DEV_IDECS=m +CONFIG_BLK_DEV_IDECD=m +CONFIG_BLK_DEV_IDETAPE=m +CONFIG_BLK_DEV_IDEFLOPPY=m +CONFIG_BLK_DEV_IDESCSI=m +# CONFIG_IDE_TASK_IOCTL is not set +# CONFIG_IDE_TASKFILE_IO is not set + +# +# IDE chipset support/bugfixes +# +CONFIG_IDE_GENERIC=m +CONFIG_BLK_DEV_CMD640=y +# CONFIG_BLK_DEV_CMD640_ENHANCED is not set +CONFIG_BLK_DEV_IDEPCI=y +CONFIG_IDEPCI_SHARE_IRQ=y +# CONFIG_BLK_DEV_OFFBOARD is not set +CONFIG_BLK_DEV_GENERIC=m +CONFIG_BLK_DEV_OPTI621=m +CONFIG_BLK_DEV_RZ1000=m +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +CONFIG_IDEDMA_PCI_AUTO=y +CONFIG_IDEDMA_ONLYDISK=y +CONFIG_BLK_DEV_ADMA=y +CONFIG_BLK_DEV_AEC62XX=m +CONFIG_BLK_DEV_ALI15X3=m +# CONFIG_WDC_ALI15X3 is not set +CONFIG_BLK_DEV_AMD74XX=m +CONFIG_BLK_DEV_ATIIXP=m +CONFIG_BLK_DEV_CMD64X=m +CONFIG_BLK_DEV_TRIFLEX=m +CONFIG_BLK_DEV_CY82C693=m +CONFIG_BLK_DEV_CS5520=m +CONFIG_BLK_DEV_CS5530=m +CONFIG_BLK_DEV_HPT34X=m +# CONFIG_HPT34X_AUTODMA is not set +CONFIG_BLK_DEV_HPT366=m +CONFIG_BLK_DEV_SC1200=m +CONFIG_BLK_DEV_PIIX=m +CONFIG_BLK_DEV_NS87415=m +CONFIG_BLK_DEV_PDC202XX_OLD=m +CONFIG_PDC202XX_BURST=y +CONFIG_BLK_DEV_PDC202XX_NEW=m +CONFIG_PDC202XX_FORCE=y +CONFIG_BLK_DEV_SVWKS=m +CONFIG_BLK_DEV_SIIMAGE=m +CONFIG_BLK_DEV_SIS5513=m +CONFIG_BLK_DEV_SLC90E66=m +CONFIG_BLK_DEV_TRM290=m +CONFIG_BLK_DEV_VIA82CXXX=m +# CONFIG_IDE_ARM is not set +CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_IVB is not set +CONFIG_IDEDMA_AUTO=y +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +CONFIG_SCSI=m +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +CONFIG_CHR_DEV_ST=m +CONFIG_CHR_DEV_OSST=m +CONFIG_BLK_DEV_SR=m +# CONFIG_BLK_DEV_SR_VENDOR is not set +CONFIG_CHR_DEV_SG=m +CONFIG_CHR_DEV_SCH=m + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y + +# +# SCSI Transport Attributes +# +CONFIG_SCSI_SPI_ATTRS=m +CONFIG_SCSI_FC_ATTRS=m + +# +# SCSI low-level drivers +# +CONFIG_BLK_DEV_3W_XXXX_RAID=m +CONFIG_SCSI_3W_9XXX=m +CONFIG_SCSI_ACARD=m +CONFIG_SCSI_AACRAID=m +CONFIG_SCSI_AIC7XXX=m +CONFIG_AIC7XXX_CMDS_PER_DEVICE=8 +CONFIG_AIC7XXX_RESET_DELAY_MS=15000 +# CONFIG_AIC7XXX_BUILD_FIRMWARE is not set +CONFIG_AIC7XXX_DEBUG_ENABLE=y +CONFIG_AIC7XXX_DEBUG_MASK=0 +CONFIG_AIC7XXX_REG_PRETTY_PRINT=y +CONFIG_SCSI_AIC7XXX_OLD=m +CONFIG_SCSI_AIC79XX=m +CONFIG_AIC79XX_CMDS_PER_DEVICE=32 +CONFIG_AIC79XX_RESET_DELAY_MS=15000 +# CONFIG_AIC79XX_BUILD_FIRMWARE is not set +CONFIG_AIC79XX_ENABLE_RD_STRM=y +CONFIG_AIC79XX_DEBUG_ENABLE=y +CONFIG_AIC79XX_DEBUG_MASK=0 +CONFIG_AIC79XX_REG_PRETTY_PRINT=y +CONFIG_SCSI_MEGARAID=m +CONFIG_SCSI_SATA=y +CONFIG_SCSI_SATA_SVW=m +CONFIG_SCSI_ATA_PIIX=m +CONFIG_SCSI_SATA_NV=m +CONFIG_SCSI_SATA_PROMISE=m +CONFIG_SCSI_SATA_SX4=m +CONFIG_SCSI_SATA_SIL=m +CONFIG_SCSI_SATA_SIS=m +CONFIG_SCSI_SATA_VIA=m +CONFIG_SCSI_SATA_VITESSE=m +CONFIG_SCSI_BUSLOGIC=m +# CONFIG_SCSI_OMIT_FLASHPOINT is not set +CONFIG_SCSI_DMX3191D=m +CONFIG_SCSI_EATA=m +CONFIG_SCSI_EATA_TAGGED_QUEUE=y +CONFIG_SCSI_EATA_LINKED_COMMANDS=y +CONFIG_SCSI_EATA_MAX_TAGS=16 +CONFIG_SCSI_EATA_PIO=m +CONFIG_SCSI_FUTURE_DOMAIN=m +CONFIG_SCSI_GDTH=m +CONFIG_SCSI_IPS=m +CONFIG_SCSI_INIA100=m +CONFIG_SCSI_PPA=m +CONFIG_SCSI_IMM=m +# CONFIG_SCSI_IZIP_EPP16 is not set +# CONFIG_SCSI_IZIP_SLOW_CTR is not set +CONFIG_SCSI_SYM53C8XX_2=m +CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 +CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 +CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 +# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set +CONFIG_SCSI_IPR=m +# CONFIG_SCSI_IPR_TRACE is not set +# CONFIG_SCSI_IPR_DUMP is not set +CONFIG_SCSI_QLOGIC_ISP=m +CONFIG_SCSI_QLOGIC_FC=m +CONFIG_SCSI_QLOGIC_FC_FIRMWARE=y +CONFIG_SCSI_QLOGIC_1280=m +CONFIG_SCSI_DC395x=m +CONFIG_SCSI_DC390T=m +CONFIG_SCSI_DEBUG=m + +# +# PCMCIA SCSI adapter support +# +CONFIG_PCMCIA_FDOMAIN=m +CONFIG_PCMCIA_QLOGIC=m +CONFIG_PCMCIA_SYM53C500=m + +# +# Multi-device support (RAID and LVM) +# +CONFIG_MD=y +CONFIG_BLK_DEV_MD=m +CONFIG_MD_LINEAR=m +CONFIG_MD_RAID0=m +CONFIG_MD_RAID1=m +CONFIG_MD_RAID5=m +CONFIG_MD_RAID6=m +CONFIG_MD_MULTIPATH=m +CONFIG_BLK_DEV_DM=m +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=m +CONFIG_DM_MIRROR=m +CONFIG_DM_ZERO=m + +# +# Fusion MPT device support +# +CONFIG_FUSION=m +CONFIG_FUSION_MAX_SGE=40 +CONFIG_FUSION_ISENSE=m +CONFIG_FUSION_CTL=m +CONFIG_FUSION_LAN=m + +# +# IEEE 1394 (FireWire) support +# +CONFIG_IEEE1394=m + +# +# Subsystem Options +# +# CONFIG_IEEE1394_VERBOSEDEBUG is not set +# CONFIG_IEEE1394_OUI_DB is not set +CONFIG_IEEE1394_EXTRA_CONFIG_ROMS=y +CONFIG_IEEE1394_CONFIG_ROM_IP1394=y + +# +# Device Drivers +# +CONFIG_IEEE1394_PCILYNX=m +CONFIG_IEEE1394_OHCI1394=m + +# +# Protocol Drivers +# +CONFIG_IEEE1394_VIDEO1394=m +CONFIG_IEEE1394_SBP2=m +# CONFIG_IEEE1394_SBP2_PHYS_DMA is not set +CONFIG_IEEE1394_ETH1394=m +CONFIG_IEEE1394_DV1394=m +CONFIG_IEEE1394_RAWIO=m +CONFIG_IEEE1394_CMP=m +CONFIG_IEEE1394_AMDTP=m + +# +# I2O device support +# +CONFIG_I2O=m +CONFIG_I2O_CONFIG=m +CONFIG_I2O_BLOCK=m +CONFIG_I2O_SCSI=m +CONFIG_I2O_PROC=m + +# +# Networking support +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=m +CONFIG_PACKET_MMAP=y +CONFIG_NETLINK_DEV=m +CONFIG_UNIX=m +CONFIG_NET_KEY=m +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_FWMARK=y +CONFIG_IP_ROUTE_NAT=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_TOS=y +CONFIG_IP_ROUTE_VERBOSE=y +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE=m +CONFIG_NET_IPGRE_BROADCAST=y +CONFIG_IP_MROUTE=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +# CONFIG_ARPD is not set +CONFIG_SYN_COOKIES=y +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +CONFIG_INET_IPCOMP=m + +# +# IP: Virtual Server Configuration +# +CONFIG_IP_VS=m +# CONFIG_IP_VS_DEBUG is not set +CONFIG_IP_VS_TAB_BITS=12 + +# +# IPVS transport protocol load balancing support +# +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_PROTO_ESP=y +CONFIG_IP_VS_PROTO_AH=y + +# +# IPVS scheduler +# +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_WRR=m +CONFIG_IP_VS_LC=m +CONFIG_IP_VS_WLC=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m + +# +# IPVS application helper +# +CONFIG_IP_VS_FTP=m +CONFIG_IPV6=m +CONFIG_IPV6_PRIVACY=y +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +CONFIG_INET6_IPCOMP=m +CONFIG_IPV6_TUNNEL=m +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_BRIDGE_NETFILTER=y + +# +# IP: Netfilter Configuration +# +CONFIG_IP_NF_CONNTRACK=m +CONFIG_IP_NF_FTP=m +CONFIG_IP_NF_IRC=m +CONFIG_IP_NF_TFTP=m +CONFIG_IP_NF_AMANDA=m +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_LIMIT=m +CONFIG_IP_NF_MATCH_IPRANGE=m +CONFIG_IP_NF_MATCH_MAC=m +CONFIG_IP_NF_MATCH_PKTTYPE=m +CONFIG_IP_NF_MATCH_MARK=m +CONFIG_IP_NF_MATCH_MULTIPORT=m +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_DSCP=m +CONFIG_IP_NF_MATCH_AH_ESP=m +CONFIG_IP_NF_MATCH_LENGTH=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_TCPMSS=m +CONFIG_IP_NF_MATCH_HELPER=m +CONFIG_IP_NF_MATCH_STATE=m +CONFIG_IP_NF_MATCH_CONNTRACK=m +CONFIG_IP_NF_MATCH_OWNER=m +CONFIG_IP_NF_MATCH_PHYSDEV=m +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_SAME=m +CONFIG_IP_NF_NAT_LOCAL=y +CONFIG_IP_NF_NAT_SNMP_BASIC=m +CONFIG_IP_NF_NAT_IRC=m +CONFIG_IP_NF_NAT_FTP=m +CONFIG_IP_NF_NAT_TFTP=m +CONFIG_IP_NF_NAT_AMANDA=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_DSCP=m +CONFIG_IP_NF_TARGET_MARK=m +CONFIG_IP_NF_TARGET_CLASSIFY=m +CONFIG_IP_NF_TARGET_LOG=m +CONFIG_IP_NF_TARGET_ULOG=m +CONFIG_IP_NF_TARGET_TCPMSS=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +CONFIG_IP_NF_COMPAT_IPCHAINS=m +CONFIG_IP_NF_COMPAT_IPFWADM=m +CONFIG_IP_NF_TARGET_NOTRACK=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_MATCH_ADDRTYPE=m +CONFIG_IP_NF_MATCH_REALM=m + +# +# IPv6: Netfilter Configuration +# +CONFIG_IP6_NF_QUEUE=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MATCH_LIMIT=m +CONFIG_IP6_NF_MATCH_MAC=m +CONFIG_IP6_NF_MATCH_RT=m +CONFIG_IP6_NF_MATCH_OPTS=m +CONFIG_IP6_NF_MATCH_FRAG=m +CONFIG_IP6_NF_MATCH_HL=m +CONFIG_IP6_NF_MATCH_MULTIPORT=m +CONFIG_IP6_NF_MATCH_OWNER=m +CONFIG_IP6_NF_MATCH_MARK=m +CONFIG_IP6_NF_MATCH_IPV6HEADER=m +CONFIG_IP6_NF_MATCH_AHESP=m +CONFIG_IP6_NF_MATCH_LENGTH=m +CONFIG_IP6_NF_MATCH_EUI64=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_LOG=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_TARGET_MARK=m +CONFIG_IP6_NF_RAW=m + +# +# DECnet: Netfilter Configuration +# +CONFIG_DECNET_NF_GRABULATOR=m + +# +# Bridge: Netfilter Configuration +# +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_802_3=m +CONFIG_BRIDGE_EBT_AMONG=m +CONFIG_BRIDGE_EBT_ARP=m +CONFIG_BRIDGE_EBT_IP=m +CONFIG_BRIDGE_EBT_LIMIT=m +CONFIG_BRIDGE_EBT_MARK=m +CONFIG_BRIDGE_EBT_PKTTYPE=m +CONFIG_BRIDGE_EBT_STP=m +CONFIG_BRIDGE_EBT_VLAN=m +CONFIG_BRIDGE_EBT_ARPREPLY=m +CONFIG_BRIDGE_EBT_DNAT=m +CONFIG_BRIDGE_EBT_MARK_T=m +CONFIG_BRIDGE_EBT_REDIRECT=m +CONFIG_BRIDGE_EBT_SNAT=m +CONFIG_BRIDGE_EBT_LOG=m +CONFIG_XFRM=y +CONFIG_XFRM_USER=m + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IP_SCTP=m +# CONFIG_SCTP_DBG_MSG is not set +# CONFIG_SCTP_DBG_OBJCNT is not set +# CONFIG_SCTP_HMAC_NONE is not set +# CONFIG_SCTP_HMAC_SHA1 is not set +CONFIG_SCTP_HMAC_MD5=y +CONFIG_ATM=y +CONFIG_ATM_CLIP=y +# CONFIG_ATM_CLIP_NO_ICMP is not set +CONFIG_ATM_LANE=m +CONFIG_ATM_MPOA=m +CONFIG_ATM_BR2684=m +# CONFIG_ATM_BR2684_IPFILTER is not set +CONFIG_BRIDGE=m +CONFIG_VLAN_8021Q=m +CONFIG_DECNET=m +# CONFIG_DECNET_SIOCGIFCONF is not set +# CONFIG_DECNET_ROUTER is not set +CONFIG_LLC=y +CONFIG_LLC2=m +CONFIG_IPX=m +# CONFIG_IPX_INTERN is not set +CONFIG_ATALK=m +CONFIG_DEV_APPLETALK=y +CONFIG_IPDDP=m +CONFIG_IPDDP_ENCAP=y +CONFIG_IPDDP_DECAP=y +CONFIG_X25=m +CONFIG_LAPB=m +# CONFIG_NET_DIVERT is not set +CONFIG_ECONET=m +CONFIG_ECONET_AUNUDP=y +CONFIG_ECONET_NATIVE=y +CONFIG_WAN_ROUTER=m +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_CLK_JIFFIES=y +# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set +# CONFIG_NET_SCH_CLK_CPU is not set +CONFIG_NET_SCH_CBQ=m +CONFIG_NET_SCH_HTB=m +CONFIG_NET_SCH_HFSC=m +CONFIG_NET_SCH_ATM=m +CONFIG_NET_SCH_PRIO=m +CONFIG_NET_SCH_RED=m +CONFIG_NET_SCH_SFQ=m +CONFIG_NET_SCH_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_NETEM=m +CONFIG_NET_SCH_INGRESS=m +CONFIG_NET_QOS=y +CONFIG_NET_ESTIMATOR=y +CONFIG_NET_CLS=y +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_ROUTE=y +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +# CONFIG_CLS_U32_PERF is not set +# CONFIG_NET_CLS_IND is not set +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +# CONFIG_NET_CLS_ACT is not set +CONFIG_NET_CLS_POLICE=y + +# +# Network testing +# +CONFIG_NET_PKTGEN=m +# CONFIG_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER is not set +CONFIG_HAMRADIO=y + +# +# Packet Radio protocols +# +CONFIG_AX25=m +# CONFIG_AX25_DAMA_SLAVE is not set +CONFIG_NETROM=m +CONFIG_ROSE=m + +# +# AX.25 network device drivers +# +CONFIG_MKISS=m +CONFIG_6PACK=m +CONFIG_BPQETHER=m +CONFIG_BAYCOM_SER_FDX=m +CONFIG_BAYCOM_SER_HDX=m +CONFIG_BAYCOM_PAR=m +CONFIG_YAM=m +CONFIG_IRDA=m + +# +# IrDA protocols +# +CONFIG_IRLAN=m +CONFIG_IRNET=m +CONFIG_IRCOMM=m +# CONFIG_IRDA_ULTRA is not set + +# +# IrDA options +# +CONFIG_IRDA_CACHE_LAST_LSAP=y +CONFIG_IRDA_FAST_RR=y +CONFIG_IRDA_DEBUG=y + +# +# Infrared-port device drivers +# + +# +# SIR device drivers +# +CONFIG_IRTTY_SIR=m + +# +# Dongle support +# +CONFIG_DONGLE=y +CONFIG_ESI_DONGLE=m +CONFIG_ACTISYS_DONGLE=m +CONFIG_TEKRAM_DONGLE=m +CONFIG_LITELINK_DONGLE=m +CONFIG_MA600_DONGLE=m +CONFIG_GIRBIL_DONGLE=m +CONFIG_MCP2120_DONGLE=m +CONFIG_OLD_BELKIN_DONGLE=m +CONFIG_ACT200L_DONGLE=m + +# +# Old SIR device drivers +# +CONFIG_IRPORT_SIR=m + +# +# Old Serial dongle support +# +# CONFIG_DONGLE_OLD is not set + +# +# FIR device drivers +# +CONFIG_USB_IRDA=m +CONFIG_SIGMATEL_FIR=m +CONFIG_VLSI_FIR=m +CONFIG_BT=m +CONFIG_BT_L2CAP=m +CONFIG_BT_SCO=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_CMTP=m +CONFIG_BT_HIDP=m + +# +# Bluetooth device drivers +# +CONFIG_BT_HCIUSB=m +CONFIG_BT_HCIUSB_SCO=y +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_H4=y +CONFIG_BT_HCIUART_BCSP=y +# CONFIG_BT_HCIUART_BCSP_TXCRC is not set +CONFIG_BT_HCIBCM203X=m +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIDTL1=m +CONFIG_BT_HCIBT3C=m +CONFIG_BT_HCIBLUECARD=m +CONFIG_BT_HCIBTUART=m +CONFIG_BT_HCIVHCI=m +CONFIG_NETDEVICES=y +CONFIG_DUMMY=m +CONFIG_BONDING=m +CONFIG_EQUALIZER=m +CONFIG_TUN=m +CONFIG_ETHERTAP=m + +# +# ARCnet devices +# +CONFIG_ARCNET=m +CONFIG_ARCNET_1201=m +CONFIG_ARCNET_1051=m +CONFIG_ARCNET_RAW=m +CONFIG_ARCNET_COM90xx=m +CONFIG_ARCNET_COM90xxIO=m +CONFIG_ARCNET_RIM_I=m +CONFIG_ARCNET_COM20020=m +CONFIG_ARCNET_COM20020_PCI=m + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=m +CONFIG_HAPPYMEAL=m +CONFIG_SUNGEM=m +CONFIG_NET_VENDOR_3COM=y +CONFIG_VORTEX=m +CONFIG_TYPHOON=m + +# +# Tulip family network device support +# +CONFIG_NET_TULIP=y +CONFIG_DE2104X=m +CONFIG_TULIP=m +# CONFIG_TULIP_MWI is not set +# CONFIG_TULIP_MMIO is not set +# CONFIG_TULIP_NAPI is not set +CONFIG_DE4X5=m +CONFIG_WINBOND_840=m +CONFIG_DM9102=m +CONFIG_PCMCIA_XIRCOM=m +CONFIG_PCMCIA_XIRTULIP=m +CONFIG_HP100=m +CONFIG_NET_PCI=y +CONFIG_PCNET32=m +CONFIG_AMD8111_ETH=m +# CONFIG_AMD8111E_NAPI is not set +CONFIG_ADAPTEC_STARFIRE=m +# CONFIG_ADAPTEC_STARFIRE_NAPI is not set +CONFIG_B44=m +CONFIG_FORCEDETH=m +CONFIG_EEPRO100=m +# CONFIG_EEPRO100_PIO is not set +CONFIG_E100=m +# CONFIG_E100_NAPI is not set +CONFIG_FEALNX=m +CONFIG_NATSEMI=m +CONFIG_NE2K_PCI=m +CONFIG_8139CP=m +CONFIG_8139TOO=m +# CONFIG_8139TOO_PIO is not set +CONFIG_8139TOO_TUNE_TWISTER=y +CONFIG_8139TOO_8129=y +# CONFIG_8139_OLD_RX_RESET is not set +CONFIG_SIS900=m +CONFIG_EPIC100=m +CONFIG_SUNDANCE=m +# CONFIG_SUNDANCE_MMIO is not set +CONFIG_VIA_RHINE=m +# CONFIG_VIA_RHINE_MMIO is not set +CONFIG_VIA_VELOCITY=m + +# +# Ethernet (1000 Mbit) +# +CONFIG_DL2K=m +CONFIG_E1000=m +# CONFIG_E1000_NAPI is not set +CONFIG_NS83820=m +CONFIG_HAMACHI=m +CONFIG_YELLOWFIN=m +CONFIG_R8169=m +CONFIG_SK98LIN=m +CONFIG_TIGON3=m + +# +# Ethernet (10000 Mbit) +# +CONFIG_IXGB=m +# CONFIG_IXGB_NAPI is not set +CONFIG_S2IO=m +# CONFIG_S2IO_NAPI is not set + +# +# Token Ring devices +# +CONFIG_TR=y +CONFIG_IBMOL=m +CONFIG_3C359=m +CONFIG_TMS380TR=m +CONFIG_TMSPCI=m +CONFIG_ABYSS=m + +# +# Wireless LAN (non-hamradio) +# +CONFIG_NET_RADIO=y + +# +# Obsolete Wireless cards support (pre-802.11) +# +CONFIG_STRIP=m +CONFIG_PCMCIA_WAVELAN=m +CONFIG_PCMCIA_NETWAVE=m + +# +# Wireless 802.11 Frequency Hopping cards support +# +CONFIG_PCMCIA_RAYCS=m + +# +# Wireless 802.11b ISA/PCI cards support +# +CONFIG_IEEE80211=m +# CONFIG_IEEE80211_DEBUG is not set +CONFIG_IEEE80211_CRYPT=m +CONFIG_IEEE80211_WPA=y +CONFIG_IEEE80211_CRYPT_CCMP=m +CONFIG_IEEE80211_CRYPT_TKIP=m +CONFIG_IPW2100=m +# CONFIG_IPW2100_PROMISC is not set +# CONFIG_IPW2100_LEGACY_FW_LOAD is not set +# CONFIG_IPW2100_NOWEP is not set +# CONFIG_IPW2100_DEBUG is not set +CONFIG_IPW2200=m +# CONFIG_IPW2200_NOWEP is not set +CONFIG_WLAN_NG=m +CONFIG_PRISM2=m +CONFIG_PRISM2_USB=m +CONFIG_ACX100=m +CONFIG_ADM8211=m +CONFIG_HERMES=m +CONFIG_PLX_HERMES=m +CONFIG_TMD_HERMES=m +CONFIG_PCI_HERMES=m +CONFIG_ATMEL=m +CONFIG_PCI_ATMEL=m + +# +# Wireless 802.11b Pcmcia/Cardbus cards support +# +CONFIG_PCMCIA_HERMES=m +CONFIG_AIRO_CS=m +CONFIG_PCMCIA_ATMEL=m +CONFIG_PCMCIA_WL3501=m + +# +# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support +# +CONFIG_PRISM54=m +CONFIG_NET_WIRELESS=y + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +CONFIG_PCMCIA_3C589=m +CONFIG_PCMCIA_3C574=m +CONFIG_PCMCIA_FMVJ18X=m +CONFIG_PCMCIA_PCNET=m +CONFIG_PCMCIA_NMCLAN=m +CONFIG_PCMCIA_SMC91C92=m +CONFIG_PCMCIA_XIRC2PS=m +CONFIG_PCMCIA_AXNET=m +CONFIG_ARCNET_COM20020_CS=m + +# +# Wan interfaces +# +CONFIG_WAN=y +CONFIG_DSCC4=m +CONFIG_DSCC4_PCISYNC=y +CONFIG_DSCC4_PCI_RST=y +CONFIG_LANMEDIA=m +CONFIG_SYNCLINK_SYNCPPP=m +CONFIG_HDLC=m +CONFIG_HDLC_RAW=y +CONFIG_HDLC_RAW_ETH=y +CONFIG_HDLC_CISCO=y +CONFIG_HDLC_FR=y +CONFIG_HDLC_PPP=y +CONFIG_HDLC_X25=y +CONFIG_PCI200SYN=m +CONFIG_WANXL=m +CONFIG_PC300=m +CONFIG_PC300_MLPPP=y +CONFIG_FARSYNC=m +CONFIG_DLCI=m +CONFIG_DLCI_COUNT=24 +CONFIG_DLCI_MAX=8 +CONFIG_WAN_ROUTER_DRIVERS=y +CONFIG_CYCLADES_SYNC=m +CONFIG_CYCLOMX_X25=y +CONFIG_LAPBETHER=m +CONFIG_X25_ASY=m +CONFIG_SBNI=m +# CONFIG_SBNI_MULTILINE is not set + +# +# ATM drivers +# +CONFIG_ATM_TCP=m +CONFIG_ATM_LANAI=m +CONFIG_ATM_ENI=m +# CONFIG_ATM_ENI_DEBUG is not set +# CONFIG_ATM_ENI_TUNE_BURST is not set +CONFIG_ATM_FIRESTREAM=m +CONFIG_ATM_ZATM=m +# CONFIG_ATM_ZATM_DEBUG is not set +CONFIG_ATM_IDT77252=m +# CONFIG_ATM_IDT77252_DEBUG is not set +# CONFIG_ATM_IDT77252_RCV_ALL is not set +CONFIG_ATM_IDT77252_USE_SUNI=y +CONFIG_ATM_AMBASSADOR=m +# CONFIG_ATM_AMBASSADOR_DEBUG is not set +CONFIG_ATM_HORIZON=m +# CONFIG_ATM_HORIZON_DEBUG is not set +CONFIG_ATM_FORE200E_MAYBE=m +CONFIG_ATM_FORE200E_PCA=y +CONFIG_ATM_FORE200E_PCA_DEFAULT_FW=y +# CONFIG_ATM_FORE200E_USE_TASKLET is not set +CONFIG_ATM_FORE200E_TX_RETRY=16 +CONFIG_ATM_FORE200E_DEBUG=0 +CONFIG_ATM_FORE200E=m +CONFIG_ATM_HE=m +CONFIG_ATM_HE_USE_SUNI=y +CONFIG_FDDI=y +# CONFIG_DEFXX is not set +CONFIG_SKFP=m +CONFIG_HIPPI=y +CONFIG_ROADRUNNER=m +# CONFIG_ROADRUNNER_LARGE_RINGS is not set +CONFIG_PLIP=m +CONFIG_PPP=m +CONFIG_PPP_MULTILINK=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_MPPE=m +CONFIG_PPPOE=m +CONFIG_PPPOATM=m +CONFIG_SLIP=m +CONFIG_SLIP_COMPRESSED=y +CONFIG_SLIP_SMART=y +# CONFIG_SLIP_MODE_SLIP6 is not set +CONFIG_NET_FC=y +CONFIG_SHAPER=m +# CONFIG_NETCONSOLE is not set +# CONFIG_NDISWRAPPER is not set + +# +# ISDN subsystem +# +CONFIG_ISDN=m + +# +# Old ISDN4Linux +# +CONFIG_ISDN_I4L=m +CONFIG_ISDN_PPP=y +CONFIG_ISDN_PPP_VJ=y +CONFIG_ISDN_MPP=y +CONFIG_IPPP_FILTER=y +CONFIG_ISDN_PPP_BSDCOMP=m +CONFIG_ISDN_AUDIO=y +CONFIG_ISDN_TTY_FAX=y +CONFIG_ISDN_X25=y + +# +# ISDN feature submodules +# +CONFIG_ISDN_DRV_LOOP=m + +# +# ISDN4Linux hardware drivers +# + +# +# Passive cards +# +CONFIG_ISDN_DRV_HISAX=m + +# +# D-channel protocol features +# +CONFIG_HISAX_EURO=y +CONFIG_DE_AOC=y +# CONFIG_HISAX_NO_SENDCOMPLETE is not set +# CONFIG_HISAX_NO_LLC is not set +# CONFIG_HISAX_NO_KEYPAD is not set +CONFIG_HISAX_1TR6=y +CONFIG_HISAX_NI1=y +CONFIG_HISAX_MAX_CARDS=8 + +# +# HiSax supported cards +# +CONFIG_HISAX_16_3=y +CONFIG_HISAX_TELESPCI=y +CONFIG_HISAX_S0BOX=y +CONFIG_HISAX_FRITZPCI=y +CONFIG_HISAX_AVM_A1_PCMCIA=y +CONFIG_HISAX_ELSA=y +CONFIG_HISAX_DIEHLDIVA=y +CONFIG_HISAX_SEDLBAUER=y +CONFIG_HISAX_NETJET=y +CONFIG_HISAX_NETJET_U=y +CONFIG_HISAX_NICCY=y +CONFIG_HISAX_BKM_A4T=y +CONFIG_HISAX_SCT_QUADRO=y +CONFIG_HISAX_GAZEL=y +CONFIG_HISAX_HFC_PCI=y +CONFIG_HISAX_W6692=y +CONFIG_HISAX_HFC_SX=y +CONFIG_HISAX_ENTERNOW_PCI=y +# CONFIG_HISAX_DEBUG is not set + +# +# HiSax PCMCIA card service modules +# +CONFIG_HISAX_SEDLBAUER_CS=m +CONFIG_HISAX_ELSA_CS=m +CONFIG_HISAX_AVM_A1_CS=m +CONFIG_HISAX_TELES_CS=m + +# +# HiSax sub driver modules +# +CONFIG_HISAX_ST5481=m +CONFIG_HISAX_HFCUSB=m +CONFIG_HISAX_FRITZ_PCIPNP=m +CONFIG_HISAX_HDLC=y + +# +# Active cards +# +CONFIG_ISDN_DRV_TPAM=m +CONFIG_HYSDN=m +CONFIG_HYSDN_CAPI=y + +# +# CAPI subsystem +# +CONFIG_ISDN_CAPI=m +CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON=y +CONFIG_ISDN_CAPI_MIDDLEWARE=y +CONFIG_ISDN_CAPI_CAPI20=m +CONFIG_ISDN_CAPI_CAPIFS_BOOL=y +CONFIG_ISDN_CAPI_CAPIFS=m +CONFIG_ISDN_CAPI_CAPIDRV=m + +# +# CAPI hardware drivers +# + +# +# Active AVM cards +# +CONFIG_CAPI_AVM=y +CONFIG_ISDN_DRV_AVMB1_B1PCI=m +CONFIG_ISDN_DRV_AVMB1_B1PCIV4=y +CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m +CONFIG_ISDN_DRV_AVMB1_AVM_CS=m +CONFIG_ISDN_DRV_AVMB1_T1PCI=m +CONFIG_ISDN_DRV_AVMB1_C4=m + +# +# Active Eicon DIVA Server cards +# +CONFIG_CAPI_EICON=y +CONFIG_ISDN_DIVAS=m +CONFIG_ISDN_DIVAS_BRIPCI=y +CONFIG_ISDN_DIVAS_PRIPCI=y +CONFIG_ISDN_DIVAS_DIVACAPI=m +CONFIG_ISDN_DIVAS_USERIDI=m +CONFIG_ISDN_DIVAS_MAINT=m + +# +# Modular ISDN driver +# +CONFIG_MISDN_DRV=m +# CONFIG_MISDN_MEMDEBUG is not set +CONFIG_MISDN_AVM_FRITZ=y +CONFIG_MISDN_HFCPCI=y +CONFIG_MISDN_HFCMULTI=y +CONFIG_MISDN_SPEEDFAX=y +CONFIG_MISDN_W6692=y +CONFIG_MISDN_DSP=y + +# +# Telephony Support +# +CONFIG_PHONE=m +CONFIG_PHONE_IXJ=m +CONFIG_PHONE_IXJ_PCMCIA=m + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=m +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_MOUSEDEV_PSAUX_ENABLE=y +CONFIG_INPUT_JOYDEV=m +CONFIG_INPUT_TSDEV=m +CONFIG_INPUT_TSDEV_SCREEN_X=240 +CONFIG_INPUT_TSDEV_SCREEN_Y=320 +CONFIG_INPUT_EVDEV=m +CONFIG_INPUT_EVBUG=m + +# +# Input I/O drivers +# +CONFIG_GAMEPORT=m +CONFIG_SOUND_GAMEPORT=m +CONFIG_GAMEPORT_NS558=m +CONFIG_GAMEPORT_L4=m +CONFIG_GAMEPORT_EMU10K1=m +CONFIG_GAMEPORT_VORTEX=m +CONFIG_GAMEPORT_FM801=m +CONFIG_GAMEPORT_CS461x=m +CONFIG_SERIO=y +CONFIG_SERIO_I8042=y +CONFIG_SERIO_SERPORT=m +CONFIG_SERIO_CT82C710=m +CONFIG_SERIO_PARKBD=m +CONFIG_SERIO_PCIPS2=m + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=y +CONFIG_KEYBOARD_SUNKBD=m +CONFIG_KEYBOARD_LKKBD=m +CONFIG_KEYBOARD_XTKBD=m +CONFIG_KEYBOARD_NEWTON=m +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=m +CONFIG_MOUSE_SERIAL=m +CONFIG_MOUSE_VSXXXAA=m +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_ANALOG=m +CONFIG_JOYSTICK_A3D=m +CONFIG_JOYSTICK_ADI=m +CONFIG_JOYSTICK_COBRA=m +CONFIG_JOYSTICK_GF2K=m +CONFIG_JOYSTICK_GRIP=m +CONFIG_JOYSTICK_GRIP_MP=m +CONFIG_JOYSTICK_GUILLEMOT=m +CONFIG_JOYSTICK_INTERACT=m +CONFIG_JOYSTICK_SIDEWINDER=m +CONFIG_JOYSTICK_TMDC=m +CONFIG_JOYSTICK_IFORCE=m +CONFIG_JOYSTICK_IFORCE_USB=y +CONFIG_JOYSTICK_IFORCE_232=y +CONFIG_JOYSTICK_WARRIOR=m +CONFIG_JOYSTICK_MAGELLAN=m +CONFIG_JOYSTICK_SPACEORB=m +CONFIG_JOYSTICK_SPACEBALL=m +CONFIG_JOYSTICK_STINGER=m +CONFIG_JOYSTICK_TWIDDLER=m +CONFIG_JOYSTICK_DB9=m +CONFIG_JOYSTICK_GAMECON=m +CONFIG_JOYSTICK_TURBOGRAFX=m +CONFIG_INPUT_JOYDUMP=m +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_GUNZE=m +CONFIG_INPUT_MISC=y +CONFIG_INPUT_PCSPKR=m +CONFIG_INPUT_UINPUT=m + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +CONFIG_SERIAL_NONSTANDARD=y +CONFIG_COMPUTONE=m +CONFIG_ROCKETPORT=m +CONFIG_CYCLADES=m +# CONFIG_CYZ_INTR is not set +# CONFIG_DIGIEPCA is not set +# CONFIG_DIGI is not set +CONFIG_MOXA_INTELLIO=m +CONFIG_MOXA_SMARTIO=m +# CONFIG_ISI is not set +CONFIG_SYNCLINK=m +CONFIG_SYNCLINKMP=m +CONFIG_N_HDLC=m +# CONFIG_RISCOM8 is not set +# CONFIG_SPECIALIX is not set +CONFIG_SX=m +# CONFIG_RIO is not set +CONFIG_STALDRV=y +CONFIG_STALLION=m +CONFIG_ISTALLION=m + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_CS=m +# CONFIG_SERIAL_8250_ACPI is not set +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_MANY_PORTS=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +CONFIG_SERIAL_8250_MULTIPORT=y +CONFIG_SERIAL_8250_RSA=y + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=256 +CONFIG_PRINTER=m +# CONFIG_LP_CONSOLE is not set +CONFIG_PPDEV=m +CONFIG_TIPAR=m +CONFIG_QIC02_TAPE=m +CONFIG_QIC02_DYNCONF=y + +# +# Setting runtime QIC-02 configuration is done with qic02conf +# + +# +# from the tpqic02-support package. It is available at +# + +# +# metalab.unc.edu or ftp://titus.cfw.com/pub/Linux/util/ +# + +# +# IPMI +# +CONFIG_IPMI_HANDLER=m +# CONFIG_IPMI_PANIC_EVENT is not set +CONFIG_IPMI_DEVICE_INTERFACE=m +CONFIG_IPMI_SI=m +CONFIG_IPMI_WATCHDOG=m + +# +# Watchdog Cards +# +CONFIG_WATCHDOG=y +# CONFIG_WATCHDOG_NOWAYOUT is not set + +# +# Watchdog Device Drivers +# +CONFIG_SOFT_WATCHDOG=m +CONFIG_ACQUIRE_WDT=m +CONFIG_ADVANTECH_WDT=m +CONFIG_ALIM1535_WDT=m +CONFIG_ALIM7101_WDT=m +CONFIG_SC520_WDT=m +CONFIG_EUROTECH_WDT=m +CONFIG_IB700_WDT=m +CONFIG_WAFER_WDT=m +CONFIG_I8XX_TCO=m +CONFIG_SC1200_WDT=m +CONFIG_SCx200_WDT=m +CONFIG_60XX_WDT=m +CONFIG_CPU5_WDT=m +CONFIG_W83627HF_WDT=m +CONFIG_W83877F_WDT=m +CONFIG_MACHZ_WDT=m + +# +# PCI-based Watchdog Cards +# +CONFIG_PCIPCWATCHDOG=m +CONFIG_WDTPCI=m +CONFIG_WDT_501_PCI=y + +# +# USB-based Watchdog Cards +# +CONFIG_USBPCWATCHDOG=m +CONFIG_HW_RANDOM=m +CONFIG_NVRAM=m +CONFIG_RTC=m +CONFIG_GEN_RTC=m +CONFIG_GEN_RTC_X=y +CONFIG_DTLK=m +CONFIG_R3964=m +CONFIG_APPLICOM=m + +# +# Ftape, the floppy tape device driver +# +CONFIG_FTAPE=m +CONFIG_ZFTAPE=m +CONFIG_ZFT_DFLT_BLK_SZ=10240 + +# +# The compressor will be built as a module only! +# +CONFIG_ZFT_COMPRESSOR=m +CONFIG_FT_NR_BUFFERS=3 +CONFIG_FT_PROC_FS=y +CONFIG_FT_NORMAL_DEBUG=y +# CONFIG_FT_FULL_DEBUG is not set +# CONFIG_FT_NO_TRACE is not set +# CONFIG_FT_NO_TRACE_AT_ALL is not set + +# +# Hardware configuration +# +CONFIG_FT_STD_FDC=y +# CONFIG_FT_MACH2 is not set +# CONFIG_FT_PROBE_FC10 is not set +# CONFIG_FT_ALT_FDC is not set +CONFIG_FT_FDC_THR=8 +CONFIG_FT_FDC_MAX_RATE=2000 +CONFIG_FT_ALPHA_CLOCK=0 +CONFIG_AGP=y +CONFIG_AGP_AMD64=y +CONFIG_AGP_INTEL_MCH=m +CONFIG_DRM=y +CONFIG_DRM_TDFX=m +CONFIG_DRM_GAMMA=m +CONFIG_DRM_R128=m +CONFIG_DRM_RADEON=m +CONFIG_DRM_SIS=m + +# +# PCMCIA character devices +# +CONFIG_SYNCLINK_CS=m +CONFIG_MWAVE=m +CONFIG_RAW_DRIVER=m +CONFIG_HPET=y +# CONFIG_HPET_RTC_IRQ is not set +CONFIG_HPET_MMAP=y +CONFIG_MAX_RAW_DEVS=256 +CONFIG_HANGCHECK_TIMER=m + +# +# I2C support +# +CONFIG_I2C=m +CONFIG_I2C_CHARDEV=m + +# +# I2C Algorithms +# +CONFIG_I2C_ALGOBIT=m +CONFIG_I2C_ALGOPCF=m + +# +# I2C Hardware Bus support +# +CONFIG_I2C_ALI1535=m +CONFIG_I2C_ALI1563=m +CONFIG_I2C_ALI15X3=m +CONFIG_I2C_AMD756=m +CONFIG_I2C_AMD8111=m +CONFIG_I2C_I801=m +CONFIG_I2C_I810=m +CONFIG_I2C_ISA=m +CONFIG_I2C_NFORCE2=m +CONFIG_I2C_PARPORT=m +CONFIG_I2C_PARPORT_LIGHT=m +CONFIG_I2C_PROSAVAGE=m +CONFIG_I2C_SAVAGE4=m +CONFIG_SCx200_ACB=m +CONFIG_I2C_SIS5595=m +CONFIG_I2C_SIS630=m +CONFIG_I2C_SIS96X=m +CONFIG_I2C_VIA=m +CONFIG_I2C_VIAPRO=m +CONFIG_I2C_VOODOO3=m + +# +# Hardware Sensors Chip support +# +CONFIG_I2C_SENSOR=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM1025=m +CONFIG_SENSORS_ADM1031=m +CONFIG_SENSORS_ASB100=m +CONFIG_SENSORS_DS1621=m +CONFIG_SENSORS_FSCHER=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_IT87=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM77=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_LM83=m +CONFIG_SENSORS_LM85=m +CONFIG_SENSORS_LM90=m +CONFIG_SENSORS_MAX1619=m +CONFIG_SENSORS_VIA686A=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_W83L785TS=m +CONFIG_SENSORS_W83627HF=m + +# +# Other I2C Chip support +# +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_PCF8574=m +CONFIG_SENSORS_PCF8591=m +CONFIG_SENSORS_RTC8564=m +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set + +# +# Dallas's 1-wire bus +# +CONFIG_W1=m +CONFIG_W1_MATROX=m +CONFIG_W1_THERM=m + +# +# Misc devices +# +CONFIG_IBM_ASM=m + +# +# Multimedia devices +# +CONFIG_VIDEO_DEV=m + +# +# Video For Linux +# + +# +# Video Adapters +# +CONFIG_VIDEO_BT848=m +CONFIG_VIDEO_BWQCAM=m +CONFIG_VIDEO_CQCAM=m +CONFIG_VIDEO_W9966=m +CONFIG_VIDEO_CPIA=m +CONFIG_VIDEO_CPIA_PP=m +CONFIG_VIDEO_CPIA_USB=m +CONFIG_VIDEO_SAA5246A=m +CONFIG_VIDEO_SAA5249=m +CONFIG_TUNER_3036=m +CONFIG_VIDEO_STRADIS=m +CONFIG_VIDEO_ZORAN=m +CONFIG_VIDEO_ZORAN_BUZ=m +CONFIG_VIDEO_ZORAN_DC10=m +CONFIG_VIDEO_ZORAN_DC30=m +CONFIG_VIDEO_ZORAN_LML33=m +CONFIG_VIDEO_ZORAN_LML33R10=m +CONFIG_VIDEO_SAA7134=m +CONFIG_VIDEO_MXB=m +CONFIG_VIDEO_DPC=m +CONFIG_VIDEO_HEXIUM_ORION=m +CONFIG_VIDEO_HEXIUM_GEMINI=m +CONFIG_VIDEO_CX88=m +CONFIG_VIDEO_OVCAMCHIP=m + +# +# Radio Adapters +# +CONFIG_RADIO_GEMTEK_PCI=m +CONFIG_RADIO_MAXIRADIO=m +CONFIG_RADIO_MAESTRO=m + +# +# Digital Video Broadcasting Devices +# +CONFIG_DVB=y +CONFIG_DVB_CORE=m + +# +# Supported Frontend Modules +# +CONFIG_DVB_TWINHAN_DST=m +CONFIG_DVB_STV0299=m +CONFIG_DVB_SP887X=m +CONFIG_DVB_SP887X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/sc_main.mc" +CONFIG_DVB_ALPS_TDLB7=m +CONFIG_DVB_ALPS_TDMB7=m +CONFIG_DVB_ATMEL_AT76C651=m +CONFIG_DVB_CX24110=m +CONFIG_DVB_GRUNDIG_29504_491=m +CONFIG_DVB_GRUNDIG_29504_401=m +CONFIG_DVB_MT312=m +CONFIG_DVB_VES1820=m +CONFIG_DVB_VES1X93=m +CONFIG_DVB_TDA1004X=m +CONFIG_DVB_TDA1004X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/tda1004x.bin" +CONFIG_DVB_NXT6000=m + +# +# Supported SAA7146 based PCI Adapters +# +CONFIG_DVB_AV7110=m +# CONFIG_DVB_AV7110_OSD is not set +CONFIG_DVB_BUDGET=m +CONFIG_DVB_BUDGET_CI=m +CONFIG_DVB_BUDGET_AV=m +CONFIG_DVB_BUDGET_PATCH=m + +# +# Supported USB Adapters +# +CONFIG_DVB_TTUSB_BUDGET=m +CONFIG_DVB_TTUSB_DEC=m + +# +# Supported FlexCopII (B2C2) Adapters +# +CONFIG_DVB_B2C2_SKYSTAR=m + +# +# Supported BT878 Adapters +# +CONFIG_DVB_BT8XX=m +CONFIG_VIDEO_SAA7146=m +CONFIG_VIDEO_SAA7146_VV=m +CONFIG_VIDEO_VIDEOBUF=m +CONFIG_VIDEO_TUNER=m +CONFIG_VIDEO_BUF=m +CONFIG_VIDEO_BTCX=m +CONFIG_VIDEO_IR=m + +# +# Graphics support +# +CONFIG_FB=y +CONFIG_FB_CIRRUS=m +CONFIG_FB_PM2=m +CONFIG_FB_PM2_FIFO_DISCONNECT=y +CONFIG_FB_CYBER2000=m +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +CONFIG_FB_VGA16=m +CONFIG_FB_VESA=m +CONFIG_VIDEO_SELECT=y +CONFIG_FB_HGA=m +# CONFIG_FB_HGA_ACCEL is not set +CONFIG_FB_RIVA=m +CONFIG_FB_RIVA_I2C=y +CONFIG_FB_RIVA_DEBUG=y +CONFIG_FB_MATROX=m +CONFIG_FB_MATROX_MILLENIUM=y +CONFIG_FB_MATROX_MYSTIQUE=y +CONFIG_FB_MATROX_G450=y +CONFIG_FB_MATROX_G100=y +CONFIG_FB_MATROX_I2C=m +CONFIG_FB_MATROX_MAVEN=m +CONFIG_FB_MATROX_MULTIHEAD=y +CONFIG_FB_RADEON_OLD=m +CONFIG_FB_RADEON=m +CONFIG_FB_RADEON_I2C=y +# CONFIG_FB_RADEON_DEBUG is not set +CONFIG_FB_ATY128=m +CONFIG_FB_ATY=m +CONFIG_FB_ATY_CT=y +CONFIG_FB_ATY_GX=y +CONFIG_FB_ATY_XL_INIT=y +CONFIG_FB_SIS=m +CONFIG_FB_SIS_300=y +CONFIG_FB_SIS_315=y +CONFIG_FB_NEOMAGIC=m +CONFIG_FB_KYRO=m +CONFIG_FB_3DFX=m +# CONFIG_FB_3DFX_ACCEL is not set +CONFIG_FB_VOODOO1=m +CONFIG_FB_TRIDENT=m +# CONFIG_FB_TRIDENT_ACCEL is not set +CONFIG_FB_VIRTUAL=m + +# +# Console display driver support +# +CONFIG_VGA_CONSOLE=y +CONFIG_MDA_CONSOLE=m +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=m +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y + +# +# Logo configuration +# +# CONFIG_LOGO is not set + +# +# Sound +# +CONFIG_SOUND=m + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +CONFIG_SND_HWDEP=m +CONFIG_SND_RAWMIDI=m +CONFIG_SND_SEQUENCER=m +CONFIG_SND_SEQ_DUMMY=m +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=m +CONFIG_SND_PCM_OSS=m +CONFIG_SND_SEQUENCER_OSS=y +CONFIG_SND_BIT32_EMUL=m +CONFIG_SND_RTCTIMER=m +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set + +# +# Generic devices +# +CONFIG_SND_MPU401_UART=m +CONFIG_SND_OPL3_LIB=m +CONFIG_SND_VX_LIB=m +CONFIG_SND_DUMMY=m +CONFIG_SND_VIRMIDI=m +CONFIG_SND_MTPAV=m +CONFIG_SND_SERIAL_U16550=m +CONFIG_SND_MPU401=m + +# +# PCI devices +# +CONFIG_SND_AC97_CODEC=m +CONFIG_SND_ALI5451=m +CONFIG_SND_ATIIXP=m +CONFIG_SND_AU8810=m +CONFIG_SND_AU8820=m +CONFIG_SND_AU8830=m +CONFIG_SND_AZT3328=m +CONFIG_SND_BT87X=m +CONFIG_SND_CS46XX=m +CONFIG_SND_CS46XX_NEW_DSP=y +CONFIG_SND_CS4281=m +CONFIG_SND_EMU10K1=m +CONFIG_SND_KORG1212=m +CONFIG_SND_MIXART=m +CONFIG_SND_NM256=m +CONFIG_SND_RME32=m +CONFIG_SND_RME96=m +CONFIG_SND_RME9652=m +CONFIG_SND_HDSP=m +CONFIG_SND_TRIDENT=m +CONFIG_SND_YMFPCI=m +CONFIG_SND_ALS4000=m +CONFIG_SND_CMIPCI=m +CONFIG_SND_ENS1370=m +CONFIG_SND_ENS1371=m +CONFIG_SND_ES1938=m +CONFIG_SND_ES1968=m +CONFIG_SND_MAESTRO3=m +CONFIG_SND_FM801=m +CONFIG_SND_FM801_TEA575X=m +CONFIG_SND_ICE1712=m +CONFIG_SND_ICE1724=m +CONFIG_SND_INTEL8X0=m +CONFIG_SND_INTEL8X0M=m +CONFIG_SND_SONICVIBES=m +CONFIG_SND_VIA82XX=m +CONFIG_SND_VX222=m + +# +# ALSA USB devices +# +CONFIG_SND_USB_AUDIO=m + +# +# PCMCIA devices +# + +# +# Open Sound System +# +CONFIG_SOUND_PRIME=m +CONFIG_SOUND_BT878=m +CONFIG_SOUND_CMPCI=m +# CONFIG_SOUND_CMPCI_FM is not set +# CONFIG_SOUND_CMPCI_MIDI is not set +CONFIG_SOUND_CMPCI_JOYSTICK=y +CONFIG_SOUND_EMU10K1=m +CONFIG_MIDI_EMU10K1=y +CONFIG_SOUND_FUSION=m +CONFIG_SOUND_CS4281=m +CONFIG_SOUND_ES1370=m +CONFIG_SOUND_ES1371=m +CONFIG_SOUND_ESSSOLO1=m +CONFIG_SOUND_MAESTRO=m +CONFIG_SOUND_MAESTRO3=m +CONFIG_SOUND_ICH=m +CONFIG_SOUND_SONICVIBES=m +CONFIG_SOUND_TRIDENT=m +# CONFIG_SOUND_MSNDCLAS is not set +# CONFIG_SOUND_MSNDPIN is not set +CONFIG_SOUND_VIA82CXXX=m +CONFIG_MIDI_VIA82CXXX=y +CONFIG_SOUND_OSS=m +# CONFIG_SOUND_TRACEINIT is not set +# CONFIG_SOUND_DMAP is not set +# CONFIG_SOUND_AD1816 is not set +CONFIG_SOUND_AD1889=m +CONFIG_SOUND_SGALAXY=m +CONFIG_SOUND_ADLIB=m +CONFIG_SOUND_ACI_MIXER=m +CONFIG_SOUND_CS4232=m +CONFIG_SOUND_SSCAPE=m +CONFIG_SOUND_GUS=m +CONFIG_SOUND_GUS16=y +CONFIG_SOUND_GUSMAX=y +CONFIG_SOUND_VMIDI=m +CONFIG_SOUND_TRIX=m +CONFIG_SOUND_MSS=m +CONFIG_SOUND_MPU401=m +CONFIG_SOUND_NM256=m +CONFIG_SOUND_MAD16=m +CONFIG_MAD16_OLDCARD=y +CONFIG_SOUND_PAS=m +CONFIG_SOUND_PSS=m +CONFIG_PSS_MIXER=y +CONFIG_SOUND_SB=m +# CONFIG_SOUND_AWE32_SYNTH is not set +CONFIG_SOUND_WAVEFRONT=m +CONFIG_SOUND_MAUI=m +CONFIG_SOUND_YM3812=m +CONFIG_SOUND_OPL3SA1=m +CONFIG_SOUND_OPL3SA2=m +CONFIG_SOUND_YMFPCI=m +# CONFIG_SOUND_YMFPCI_LEGACY is not set +CONFIG_SOUND_UART6850=m +CONFIG_SOUND_AEDSP16=m +CONFIG_SC6600=y +CONFIG_SC6600_JOY=y +CONFIG_SC6600_CDROM=4 +CONFIG_SC6600_CDROMBASE=0x0 +# CONFIG_AEDSP16_MSS is not set +# CONFIG_AEDSP16_SBPRO is not set +# CONFIG_AEDSP16_MPU401 is not set +CONFIG_SOUND_TVMIXER=m +CONFIG_SOUND_KAHLUA=m +CONFIG_SOUND_ALI5455=m +CONFIG_SOUND_FORTE=m +CONFIG_SOUND_RME96XX=m +CONFIG_SOUND_AD1980=m + +# +# USB support +# +CONFIG_USB=y +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +CONFIG_USB_BANDWIDTH=y +# CONFIG_USB_DYNAMIC_MINORS is not set + +# +# USB Host Controller Drivers +# +CONFIG_USB_EHCI_HCD=m +CONFIG_USB_EHCI_SPLIT_ISO=y +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_OHCI_HCD=m +CONFIG_USB_UHCI_HCD=m + +# +# USB Device Class drivers +# +CONFIG_USB_AUDIO=m + +# +# USB Bluetooth TTY can only be used with disabled Bluetooth subsystem +# +CONFIG_USB_MIDI=m +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +CONFIG_USB_STORAGE_RW_DETECT=y +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_DPCM=y +CONFIG_USB_STORAGE_HP8200e=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y + +# +# USB Human Interface Devices (HID) +# +CONFIG_USB_HID=m +CONFIG_USB_HIDINPUT=y +# CONFIG_HID_FF is not set +CONFIG_USB_HIDDEV=y + +# +# USB HID Boot Protocol drivers +# +CONFIG_USB_KBD=m +CONFIG_USB_MOUSE=m +CONFIG_USB_AIPTEK=m +CONFIG_USB_WACOM=m +CONFIG_USB_KBTAB=m +CONFIG_USB_POWERMATE=m +CONFIG_USB_MTOUCH=m +CONFIG_USB_EGALAX=m +CONFIG_USB_XPAD=m +CONFIG_USB_ATI_REMOTE=m + +# +# USB Imaging devices +# +CONFIG_USB_MDC800=m +CONFIG_USB_MICROTEK=m +CONFIG_USB_HPUSBSCSI=m + +# +# USB Multimedia devices +# +CONFIG_USB_VICAM=m +CONFIG_USB_DSBR=m +CONFIG_USB_IBMCAM=m +CONFIG_USB_KONICAWC=m +CONFIG_USB_OV511=m +CONFIG_USB_PWC=m +CONFIG_USB_SE401=m +CONFIG_USB_SN9C102=m +CONFIG_USB_STV680=m +CONFIG_USB_W9968CF=m + +# +# USB Network adaptors +# +CONFIG_USB_CATC=m +CONFIG_USB_KAWETH=m +CONFIG_USB_PEGASUS=m +CONFIG_USB_RTL8150=m +CONFIG_USB_USBNET=m + +# +# USB Host-to-Host Cables +# +CONFIG_USB_ALI_M5632=y +CONFIG_USB_AN2720=y +CONFIG_USB_BELKIN=y +CONFIG_USB_GENESYS=y +CONFIG_USB_NET1080=y +CONFIG_USB_PL2301=y + +# +# Intelligent USB Devices/Gadgets +# +CONFIG_USB_ARMLINUX=y +CONFIG_USB_EPSON2888=y +CONFIG_USB_ZAURUS=y +CONFIG_USB_CDCETHER=y + +# +# USB Network Adapters +# +CONFIG_USB_AX8817X=y + +# +# USB port drivers +# +CONFIG_USB_USS720=m + +# +# USB Serial Converter support +# +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_BELKIN=m +CONFIG_USB_SERIAL_WHITEHEAT=m +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m +CONFIG_USB_SERIAL_EMPEG=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_VISOR=m +CONFIG_USB_SERIAL_IPAQ=m +CONFIG_USB_SERIAL_IR=m +CONFIG_USB_SERIAL_EDGEPORT=m +CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_KEYSPAN_PDA=m +CONFIG_USB_SERIAL_KEYSPAN=m +CONFIG_USB_SERIAL_KLSI=m +CONFIG_USB_SERIAL_KOBIL_SCT=m +CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_SAFE=m +# CONFIG_USB_SERIAL_SAFE_PADDED is not set +CONFIG_USB_SERIAL_CYBERJACK=m +CONFIG_USB_SERIAL_XIRCOM=m +CONFIG_USB_SERIAL_OMNINET=m +CONFIG_USB_EZUSB=y + +# +# USB Miscellaneous drivers +# +CONFIG_USB_TIGL=m +CONFIG_USB_AUERSWALD=m +CONFIG_USB_RIO500=m +CONFIG_USB_LEGOTOWER=m +CONFIG_USB_LCD=m +CONFIG_USB_LED=m +CONFIG_USB_CYTHERM=m +CONFIG_USB_SPEEDTOUCH=m +CONFIG_USB_PHIDGETSERVO=m +CONFIG_USB_TEST=m +CONFIG_USB_EAGLE=m + +# +# USB Gadget Support +# +CONFIG_USB_GADGET=m +CONFIG_USB_GADGET_NET2280=y +CONFIG_USB_NET2280=m +# CONFIG_USB_GADGET_PXA2XX is not set +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_SA1100 is not set +# CONFIG_USB_GADGET_DUMMY_HCD is not set +CONFIG_USB_GADGET_DUALSPEED=y +CONFIG_USB_ZERO=m +CONFIG_USB_ETH=m +CONFIG_USB_ETH_RNDIS=y +CONFIG_USB_GADGETFS=m +CONFIG_USB_FILE_STORAGE=m +# CONFIG_USB_FILE_STORAGE_TEST is not set +CONFIG_USB_G_SERIAL=m + +# +# Firmware Drivers +# +CONFIG_EDD=m + +# +# File systems +# +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_POSIX_ACL=y +CONFIG_EXT2_FS_SECURITY=y +CONFIG_EXT3_FS=m +CONFIG_EXT3_FS_XATTR=y +CONFIG_EXT3_FS_POSIX_ACL=y +CONFIG_EXT3_FS_SECURITY=y +CONFIG_JBD=m +# CONFIG_JBD_DEBUG is not set +CONFIG_FS_MBCACHE=y +CONFIG_REISERFS_FS=m +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +# CONFIG_REISERFS_FS_XATTR is not set +CONFIG_JFS_FS=m +CONFIG_JFS_POSIX_ACL=y +# CONFIG_JFS_DEBUG is not set +CONFIG_JFS_STATISTICS=y +CONFIG_FS_POSIX_ACL=y +CONFIG_XFS_FS=m +CONFIG_XFS_RT=y +CONFIG_XFS_QUOTA=y +CONFIG_XFS_SECURITY=y +CONFIG_XFS_POSIX_ACL=y +CONFIG_MINIX_FS=m +CONFIG_ROMFS_FS=m +CONFIG_QUOTA=y +CONFIG_QFMT_V1=m +CONFIG_QFMT_V2=m +CONFIG_QUOTACTL=y +CONFIG_AUTOFS_FS=m +CONFIG_AUTOFS4_FS=m + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=m +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_ZISOFS_FS=m +CONFIG_UDF_FS=m +CONFIG_UDF_NLS=y + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +CONFIG_NTFS_FS=m +# CONFIG_NTFS_DEBUG is not set +# CONFIG_NTFS_RW is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_SYSFS=y +CONFIG_DEVFS_FS=y +# CONFIG_DEVFS_MOUNT is not set +# CONFIG_DEVFS_DEBUG is not set +CONFIG_DEVPTS_FS_XATTR=y +CONFIG_DEVPTS_FS_SECURITY=y +CONFIG_TMPFS=y +# CONFIG_HUGETLBFS is not set +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y + +# +# Miscellaneous filesystems +# +CONFIG_ADFS_FS=m +# CONFIG_ADFS_FS_RW is not set +CONFIG_AFFS_FS=m +CONFIG_ASFS_FS=m +# CONFIG_ASFS_RW is not set +CONFIG_HFS_FS=m +CONFIG_HFSPLUS_FS=m +CONFIG_BEFS_FS=m +# CONFIG_BEFS_DEBUG is not set +CONFIG_BFS_FS=m +CONFIG_EFS_FS=m +CONFIG_JFFS_FS=m +CONFIG_JFFS_FS_VERBOSE=0 +CONFIG_JFFS_PROC_FS=y +CONFIG_JFFS2_FS=m +CONFIG_JFFS2_FS_DEBUG=0 +# CONFIG_JFFS2_FS_NAND is not set +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set +CONFIG_JFFS2_ZLIB=y +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +CONFIG_CRAMFS=y +CONFIG_VXFS_FS=m +CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +# CONFIG_QNX4FS_RW is not set +CONFIG_SYSV_FS=m +CONFIG_UFS_FS=m +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=m +CONFIG_NFS_V3=y +CONFIG_NFS_V4=y +CONFIG_NFS_DIRECTIO=y +CONFIG_NFSD=m +CONFIG_NFSD_V3=y +CONFIG_NFSD_V4=y +CONFIG_NFSD_TCP=y +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=m +CONFIG_SUNRPC=m +CONFIG_SUNRPC_GSS=m +CONFIG_RPCSEC_GSS_KRB5=m +CONFIG_SMB_FS=m +# CONFIG_SMB_NLS_DEFAULT is not set +CONFIG_CIFS=m +# CONFIG_CIFS_STATS is not set +# CONFIG_CIFS_XATTR is not set +# CONFIG_CIFS_POSIX is not set +CONFIG_NCP_FS=m +# CONFIG_NCPFS_PACKET_SIGNING is not set +# CONFIG_NCPFS_IOCTL_LOCKING is not set +# CONFIG_NCPFS_STRONG is not set +CONFIG_NCPFS_NFS_NS=y +CONFIG_NCPFS_OS2_NS=y +# CONFIG_NCPFS_SMALLDOS is not set +CONFIG_NCPFS_NLS=y +CONFIG_NCPFS_EXTRAS=y +CONFIG_CODA_FS=m +# CONFIG_CODA_FS_OLD_API is not set +CONFIG_AFS_FS=m +CONFIG_RXRPC=m + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +CONFIG_ACORN_PARTITION=y +CONFIG_ACORN_PARTITION_CUMANA=y +# CONFIG_ACORN_PARTITION_EESOX is not set +CONFIG_ACORN_PARTITION_ICS=y +# CONFIG_ACORN_PARTITION_ADFS is not set +# CONFIG_ACORN_PARTITION_POWERTEC is not set +CONFIG_ACORN_PARTITION_RISCIX=y +CONFIG_OSF_PARTITION=y +CONFIG_AMIGA_PARTITION=y +CONFIG_ATARI_PARTITION=y +CONFIG_MAC_PARTITION=y +CONFIG_MSDOS_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_LDM_PARTITION=y +# CONFIG_LDM_DEBUG is not set +CONFIG_SGI_PARTITION=y +CONFIG_ULTRIX_PARTITION=y +CONFIG_SUN_PARTITION=y +# CONFIG_EFI_PARTITION is not set + +# +# Native Language Support +# +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="cp437" +CONFIG_NLS_CODEPAGE_437=m +CONFIG_NLS_CODEPAGE_737=m +CONFIG_NLS_CODEPAGE_775=m +CONFIG_NLS_CODEPAGE_850=m +CONFIG_NLS_CODEPAGE_852=m +CONFIG_NLS_CODEPAGE_855=m +CONFIG_NLS_CODEPAGE_857=m +CONFIG_NLS_CODEPAGE_860=m +CONFIG_NLS_CODEPAGE_861=m +CONFIG_NLS_CODEPAGE_862=m +CONFIG_NLS_CODEPAGE_863=m +CONFIG_NLS_CODEPAGE_864=m +CONFIG_NLS_CODEPAGE_865=m +CONFIG_NLS_CODEPAGE_866=m +CONFIG_NLS_CODEPAGE_869=m +CONFIG_NLS_CODEPAGE_936=m +CONFIG_NLS_CODEPAGE_950=m +CONFIG_NLS_CODEPAGE_932=m +CONFIG_NLS_CODEPAGE_949=m +CONFIG_NLS_CODEPAGE_874=m +CONFIG_NLS_ISO8859_8=m +CONFIG_NLS_CODEPAGE_1250=m +CONFIG_NLS_CODEPAGE_1251=m +CONFIG_NLS_ASCII=m +CONFIG_NLS_ISO8859_1=m +CONFIG_NLS_ISO8859_2=m +CONFIG_NLS_ISO8859_3=m +CONFIG_NLS_ISO8859_4=m +CONFIG_NLS_ISO8859_5=m +CONFIG_NLS_ISO8859_6=m +CONFIG_NLS_ISO8859_7=m +CONFIG_NLS_ISO8859_9=m +CONFIG_NLS_ISO8859_13=m +CONFIG_NLS_ISO8859_14=m +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_KOI8_R=m +CONFIG_NLS_KOI8_U=m +CONFIG_NLS_UTF8=m + +# +# Profiling support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=m + +# +# Kernel hacking +# +# CONFIG_DEBUG_KERNEL is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_FRAME_POINTER is not set + +# +# Security options +# +CONFIG_SECURITY=y +# CONFIG_SECURITY_NETWORK is not set +CONFIG_SECURITY_CAPABILITIES=m +CONFIG_SECURITY_ROOTPLUG=m +# CONFIG_SECURITY_SELINUX is not set + +# +# Cryptographic options +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_SHA1=m +CONFIG_CRYPTO_SHA256=m +CONFIG_CRYPTO_SHA512=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_KHAZAD=m +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_MICHAEL_MIC=m +CONFIG_CRYPTO_CRC32C=m +CONFIG_CRYPTO_TEST=m + +# +# Library routines +# +CONFIG_CRC_CCITT=m +CONFIG_CRC32=m +CONFIG_LIBCRC32C=m +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=m --- linux-source-2.6.8.1-2.6.8.1.orig/debian/config/amd64/amd64-k8 +++ linux-source-2.6.8.1-2.6.8.1/debian/config/amd64/amd64-k8 @@ -0,0 +1,2503 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_X86_64=y +CONFIG_64BIT=y +CONFIG_X86=y +CONFIG_MMU=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +CONFIG_X86_CMPXCHG=y +CONFIG_EARLY_PRINTK=y +CONFIG_HPET_TIMER=y +# CONFIG_HPET_EMULATE_RTC is not set +CONFIG_GENERIC_ISA_DMA=y + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +CONFIG_CLEAN_COMPILE=y +CONFIG_BROKEN_ON_SMP=y + +# +# General setup +# +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_BSD_PROCESS_ACCT=y +# CONFIG_BSD_PROCESS_ACCT_V3 is not set +CONFIG_SYSCTL=y +# CONFIG_AUDIT is not set +CONFIG_LOG_BUF_SHIFT=14 +CONFIG_HOTPLUG=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_EMBEDDED=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_OBSOLETE_MODPARM=y +CONFIG_MODVERSIONS=y +CONFIG_KMOD=y + +# +# Processor type and features +# +CONFIG_MK8=y +# CONFIG_MPSC is not set +# CONFIG_GENERIC_CPU is not set +CONFIG_X86_L1_CACHE_BYTES=64 +CONFIG_X86_L1_CACHE_SHIFT=6 +CONFIG_X86_TSC=y +CONFIG_X86_GOOD_APIC=y +CONFIG_MICROCODE=m +CONFIG_X86_MSR=m +CONFIG_X86_CPUID=m +CONFIG_X86_IO_APIC=y +CONFIG_X86_LOCAL_APIC=y +CONFIG_MTRR=y +# CONFIG_SMP is not set +# CONFIG_PREEMPT is not set +CONFIG_GART_IOMMU=y +CONFIG_SWIOTLB=y +CONFIG_X86_MCE=y + +# +# Power management options +# +CONFIG_PM=y +# CONFIG_SOFTWARE_SUSPEND is not set + +# +# ACPI (Advanced Configuration and Power Interface) Support +# +CONFIG_ACPI=y +CONFIG_ACPI_BOOT=y +CONFIG_ACPI_INTERPRETER=y +CONFIG_ACPI_SLEEP=y +CONFIG_ACPI_SLEEP_PROC_FS=y +CONFIG_ACPI_AC=m +CONFIG_ACPI_BATTERY=m +CONFIG_ACPI_BUTTON=m +CONFIG_ACPI_FAN=m +CONFIG_ACPI_PROCESSOR=m +CONFIG_ACPI_THERMAL=m +CONFIG_ACPI_ASUS=m +CONFIG_ACPI_TOSHIBA=m +# CONFIG_ACPI_DEBUG is not set +CONFIG_ACPI_BUS=y +CONFIG_ACPI_EC=y +CONFIG_ACPI_POWER=y +CONFIG_ACPI_PCI=y +CONFIG_ACPI_SYSTEM=y + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_PROC_INTF=m +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=m +CONFIG_CPU_FREQ_GOV_USERSPACE=m +# CONFIG_CPU_FREQ_24_API is not set +CONFIG_CPU_FREQ_TABLE=m + +# +# CPUFreq processor drivers +# +CONFIG_X86_POWERNOW_K8=m + +# +# Bus options (PCI etc.) +# +CONFIG_PCI=y +CONFIG_PCI_DIRECT=y +CONFIG_PCI_MMCONFIG=y +# CONFIG_PCI_MSI is not set +CONFIG_PCI_LEGACY_PROC=y +CONFIG_PCI_NAMES=y + +# +# PCMCIA/CardBus support +# +CONFIG_PCMCIA=m +# CONFIG_PCMCIA_DEBUG is not set +CONFIG_YENTA=m +CONFIG_CARDBUS=y +CONFIG_PD6729=m +CONFIG_I82092=m +CONFIG_TCIC=m + +# +# PCI Hotplug Support +# +# CONFIG_HOTPLUG_PCI is not set + +# +# Executable file formats / Emulations +# +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_MISC=m +CONFIG_IA32_EMULATION=y +CONFIG_IA32_AOUT=y +CONFIG_COMPAT=y +CONFIG_SYSVIPC_COMPAT=y +CONFIG_UID16=y + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=m + +# +# Memory Technology Devices (MTD) +# +CONFIG_MTD=m +# CONFIG_MTD_DEBUG is not set +CONFIG_MTD_PARTITIONS=y +CONFIG_MTD_CONCAT=m +CONFIG_MTD_REDBOOT_PARTS=m +# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set +# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set +# CONFIG_MTD_CMDLINE_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=m +CONFIG_MTD_BLOCK=m +CONFIG_MTD_BLOCK_RO=m +CONFIG_FTL=m +CONFIG_NFTL=m +CONFIG_NFTL_RW=y +CONFIG_INFTL=m + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=m +CONFIG_MTD_JEDECPROBE=m +CONFIG_MTD_GEN_PROBE=m +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +CONFIG_MTD_CFI_INTELEXT=m +CONFIG_MTD_CFI_AMDSTD=m +CONFIG_MTD_CFI_AMDSTD_RETRY=0 +CONFIG_MTD_CFI_STAA=m +CONFIG_MTD_CFI_UTIL=m +CONFIG_MTD_RAM=m +CONFIG_MTD_ROM=m +CONFIG_MTD_ABSENT=m + +# +# Mapping drivers for chip access +# +CONFIG_MTD_COMPLEX_MAPPINGS=y +CONFIG_MTD_PHYSMAP=m +CONFIG_MTD_PHYSMAP_START=0x8000000 +CONFIG_MTD_PHYSMAP_LEN=0x4000000 +CONFIG_MTD_PHYSMAP_BANKWIDTH=2 +CONFIG_MTD_PNC2000=m +CONFIG_MTD_SC520CDP=m +CONFIG_MTD_NETSC520=m +CONFIG_MTD_SBC_GXX=m +CONFIG_MTD_ELAN_104NC=m +CONFIG_MTD_SCx200_DOCFLASH=m +# CONFIG_MTD_AMD76XROM is not set +# CONFIG_MTD_ICHXROM is not set +# CONFIG_MTD_SCB2_FLASH is not set +CONFIG_MTD_NETtel=m +CONFIG_MTD_DILNETPC=m +CONFIG_MTD_DILNETPC_BOOTSIZE=0x80000 +# CONFIG_MTD_L440GX is not set +CONFIG_MTD_PCI=m + +# +# Self-contained MTD device drivers +# +CONFIG_MTD_PMC551=m +# CONFIG_MTD_PMC551_BUGFIX is not set +# CONFIG_MTD_PMC551_DEBUG is not set +CONFIG_MTD_SLRAM=m +CONFIG_MTD_PHRAM=m +CONFIG_MTD_MTDRAM=m +CONFIG_MTDRAM_TOTAL_SIZE=4096 +CONFIG_MTDRAM_ERASE_SIZE=128 +CONFIG_MTD_BLKMTD=m + +# +# Disk-On-Chip Device Drivers +# +CONFIG_MTD_DOC2000=m +CONFIG_MTD_DOC2001=m +CONFIG_MTD_DOC2001PLUS=m +CONFIG_MTD_DOCPROBE=m +CONFIG_MTD_DOCECC=m +# CONFIG_MTD_DOCPROBE_ADVANCED is not set +CONFIG_MTD_DOCPROBE_ADDRESS=0 + +# +# NAND Flash Device Drivers +# +CONFIG_MTD_NAND=m +# CONFIG_MTD_NAND_VERIFY_WRITE is not set +CONFIG_MTD_NAND_IDS=m +CONFIG_MTD_NAND_DISKONCHIP=m +# CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set +CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0 +# CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE is not set + +# +# Parallel port support +# +CONFIG_PARPORT=m +CONFIG_PARPORT_PC=m +CONFIG_PARPORT_PC_CML1=m +CONFIG_PARPORT_SERIAL=m +CONFIG_PARPORT_PC_FIFO=y +# CONFIG_PARPORT_PC_SUPERIO is not set +CONFIG_PARPORT_PC_PCMCIA=m +# CONFIG_PARPORT_OTHER is not set +CONFIG_PARPORT_1284=y + +# +# Plug and Play support +# + +# +# Block devices +# +CONFIG_BLK_DEV_FD=m +CONFIG_PARIDE=m +CONFIG_PARIDE_PARPORT=m + +# +# Parallel IDE high-level drivers +# +CONFIG_PARIDE_PD=m +CONFIG_PARIDE_PCD=m +CONFIG_PARIDE_PF=m +CONFIG_PARIDE_PT=m +CONFIG_PARIDE_PG=m + +# +# Parallel IDE protocol modules +# +CONFIG_PARIDE_ATEN=m +CONFIG_PARIDE_BPCK=m +CONFIG_PARIDE_COMM=m +CONFIG_PARIDE_DSTR=m +CONFIG_PARIDE_FIT2=m +CONFIG_PARIDE_FIT3=m +CONFIG_PARIDE_EPAT=m +# CONFIG_PARIDE_EPATC8 is not set +CONFIG_PARIDE_EPIA=m +CONFIG_PARIDE_FRIQ=m +CONFIG_PARIDE_FRPW=m +CONFIG_PARIDE_KBIC=m +CONFIG_PARIDE_KTTI=m +CONFIG_PARIDE_ON20=m +CONFIG_PARIDE_ON26=m +CONFIG_BLK_CPQ_DA=m +CONFIG_BLK_CPQ_CISS_DA=m +CONFIG_CISS_SCSI_TAPE=y +CONFIG_BLK_DEV_DAC960=m +CONFIG_BLK_DEV_UMEM=m +CONFIG_BLK_DEV_LOOP=m +CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_SX8=m +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=65536 +CONFIG_BLK_DEV_INITRD=y +CONFIG_LBD=y + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=m +CONFIG_BLK_DEV_IDE=m + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_IDE_SATA is not set +# CONFIG_BLK_DEV_HD_IDE is not set +CONFIG_BLK_DEV_IDEDISK=m +# CONFIG_IDEDISK_MULTI_MODE is not set +CONFIG_BLK_DEV_IDECS=m +CONFIG_BLK_DEV_IDECD=m +CONFIG_BLK_DEV_IDETAPE=m +CONFIG_BLK_DEV_IDEFLOPPY=m +CONFIG_BLK_DEV_IDESCSI=m +# CONFIG_IDE_TASK_IOCTL is not set +# CONFIG_IDE_TASKFILE_IO is not set + +# +# IDE chipset support/bugfixes +# +CONFIG_IDE_GENERIC=m +CONFIG_BLK_DEV_CMD640=y +# CONFIG_BLK_DEV_CMD640_ENHANCED is not set +CONFIG_BLK_DEV_IDEPCI=y +CONFIG_IDEPCI_SHARE_IRQ=y +# CONFIG_BLK_DEV_OFFBOARD is not set +CONFIG_BLK_DEV_GENERIC=m +CONFIG_BLK_DEV_OPTI621=m +CONFIG_BLK_DEV_RZ1000=m +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +CONFIG_IDEDMA_PCI_AUTO=y +CONFIG_IDEDMA_ONLYDISK=y +CONFIG_BLK_DEV_ADMA=y +CONFIG_BLK_DEV_AEC62XX=m +CONFIG_BLK_DEV_ALI15X3=m +# CONFIG_WDC_ALI15X3 is not set +CONFIG_BLK_DEV_AMD74XX=m +CONFIG_BLK_DEV_ATIIXP=m +CONFIG_BLK_DEV_CMD64X=m +CONFIG_BLK_DEV_TRIFLEX=m +CONFIG_BLK_DEV_CY82C693=m +CONFIG_BLK_DEV_CS5520=m +CONFIG_BLK_DEV_CS5530=m +CONFIG_BLK_DEV_HPT34X=m +# CONFIG_HPT34X_AUTODMA is not set +CONFIG_BLK_DEV_HPT366=m +CONFIG_BLK_DEV_SC1200=m +CONFIG_BLK_DEV_PIIX=m +CONFIG_BLK_DEV_NS87415=m +CONFIG_BLK_DEV_PDC202XX_OLD=m +CONFIG_PDC202XX_BURST=y +CONFIG_BLK_DEV_PDC202XX_NEW=m +CONFIG_PDC202XX_FORCE=y +CONFIG_BLK_DEV_SVWKS=m +CONFIG_BLK_DEV_SIIMAGE=m +CONFIG_BLK_DEV_SIS5513=m +CONFIG_BLK_DEV_SLC90E66=m +CONFIG_BLK_DEV_TRM290=m +CONFIG_BLK_DEV_VIA82CXXX=m +# CONFIG_IDE_ARM is not set +CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_IVB is not set +CONFIG_IDEDMA_AUTO=y +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +CONFIG_SCSI=m +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +CONFIG_CHR_DEV_ST=m +CONFIG_CHR_DEV_OSST=m +CONFIG_BLK_DEV_SR=m +# CONFIG_BLK_DEV_SR_VENDOR is not set +CONFIG_CHR_DEV_SG=m +CONFIG_CHR_DEV_SCH=m + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y + +# +# SCSI Transport Attributes +# +CONFIG_SCSI_SPI_ATTRS=m +CONFIG_SCSI_FC_ATTRS=m + +# +# SCSI low-level drivers +# +CONFIG_BLK_DEV_3W_XXXX_RAID=m +CONFIG_SCSI_3W_9XXX=m +CONFIG_SCSI_ACARD=m +CONFIG_SCSI_AACRAID=m +CONFIG_SCSI_AIC7XXX=m +CONFIG_AIC7XXX_CMDS_PER_DEVICE=8 +CONFIG_AIC7XXX_RESET_DELAY_MS=15000 +# CONFIG_AIC7XXX_BUILD_FIRMWARE is not set +CONFIG_AIC7XXX_DEBUG_ENABLE=y +CONFIG_AIC7XXX_DEBUG_MASK=0 +CONFIG_AIC7XXX_REG_PRETTY_PRINT=y +CONFIG_SCSI_AIC7XXX_OLD=m +CONFIG_SCSI_AIC79XX=m +CONFIG_AIC79XX_CMDS_PER_DEVICE=32 +CONFIG_AIC79XX_RESET_DELAY_MS=15000 +# CONFIG_AIC79XX_BUILD_FIRMWARE is not set +CONFIG_AIC79XX_ENABLE_RD_STRM=y +CONFIG_AIC79XX_DEBUG_ENABLE=y +CONFIG_AIC79XX_DEBUG_MASK=0 +CONFIG_AIC79XX_REG_PRETTY_PRINT=y +CONFIG_SCSI_MEGARAID=m +CONFIG_SCSI_SATA=y +CONFIG_SCSI_SATA_SVW=m +CONFIG_SCSI_ATA_PIIX=m +CONFIG_SCSI_SATA_NV=m +CONFIG_SCSI_SATA_PROMISE=m +CONFIG_SCSI_SATA_SX4=m +CONFIG_SCSI_SATA_SIL=m +CONFIG_SCSI_SATA_SIS=m +CONFIG_SCSI_SATA_VIA=m +CONFIG_SCSI_SATA_VITESSE=m +CONFIG_SCSI_BUSLOGIC=m +# CONFIG_SCSI_OMIT_FLASHPOINT is not set +CONFIG_SCSI_DMX3191D=m +CONFIG_SCSI_EATA=m +CONFIG_SCSI_EATA_TAGGED_QUEUE=y +CONFIG_SCSI_EATA_LINKED_COMMANDS=y +CONFIG_SCSI_EATA_MAX_TAGS=16 +CONFIG_SCSI_EATA_PIO=m +CONFIG_SCSI_FUTURE_DOMAIN=m +CONFIG_SCSI_GDTH=m +CONFIG_SCSI_IPS=m +CONFIG_SCSI_INIA100=m +CONFIG_SCSI_PPA=m +CONFIG_SCSI_IMM=m +# CONFIG_SCSI_IZIP_EPP16 is not set +# CONFIG_SCSI_IZIP_SLOW_CTR is not set +CONFIG_SCSI_SYM53C8XX_2=m +CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 +CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 +CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 +# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set +CONFIG_SCSI_IPR=m +# CONFIG_SCSI_IPR_TRACE is not set +# CONFIG_SCSI_IPR_DUMP is not set +CONFIG_SCSI_QLOGIC_ISP=m +CONFIG_SCSI_QLOGIC_FC=m +CONFIG_SCSI_QLOGIC_FC_FIRMWARE=y +CONFIG_SCSI_QLOGIC_1280=m +CONFIG_SCSI_DC395x=m +CONFIG_SCSI_DC390T=m +CONFIG_SCSI_DEBUG=m + +# +# PCMCIA SCSI adapter support +# +CONFIG_PCMCIA_FDOMAIN=m +CONFIG_PCMCIA_QLOGIC=m +CONFIG_PCMCIA_SYM53C500=m + +# +# Multi-device support (RAID and LVM) +# +CONFIG_MD=y +CONFIG_BLK_DEV_MD=m +CONFIG_MD_LINEAR=m +CONFIG_MD_RAID0=m +CONFIG_MD_RAID1=m +CONFIG_MD_RAID5=m +CONFIG_MD_RAID6=m +CONFIG_MD_MULTIPATH=m +CONFIG_BLK_DEV_DM=m +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=m +CONFIG_DM_MIRROR=m +CONFIG_DM_ZERO=m + +# +# Fusion MPT device support +# +CONFIG_FUSION=m +CONFIG_FUSION_MAX_SGE=40 +CONFIG_FUSION_ISENSE=m +CONFIG_FUSION_CTL=m +CONFIG_FUSION_LAN=m + +# +# IEEE 1394 (FireWire) support +# +CONFIG_IEEE1394=m + +# +# Subsystem Options +# +# CONFIG_IEEE1394_VERBOSEDEBUG is not set +CONFIG_IEEE1394_OUI_DB=y +CONFIG_IEEE1394_EXTRA_CONFIG_ROMS=y +CONFIG_IEEE1394_CONFIG_ROM_IP1394=y + +# +# Device Drivers +# +CONFIG_IEEE1394_PCILYNX=m +CONFIG_IEEE1394_OHCI1394=m + +# +# Protocol Drivers +# +CONFIG_IEEE1394_VIDEO1394=m +CONFIG_IEEE1394_SBP2=m +# CONFIG_IEEE1394_SBP2_PHYS_DMA is not set +CONFIG_IEEE1394_ETH1394=m +CONFIG_IEEE1394_DV1394=m +CONFIG_IEEE1394_RAWIO=m +CONFIG_IEEE1394_CMP=m +CONFIG_IEEE1394_AMDTP=m + +# +# I2O device support +# +CONFIG_I2O=m +CONFIG_I2O_CONFIG=m +CONFIG_I2O_BLOCK=m +CONFIG_I2O_SCSI=m +CONFIG_I2O_PROC=m + +# +# Networking support +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=m +CONFIG_PACKET_MMAP=y +CONFIG_NETLINK_DEV=m +CONFIG_UNIX=m +CONFIG_NET_KEY=m +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_FWMARK=y +CONFIG_IP_ROUTE_NAT=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_TOS=y +CONFIG_IP_ROUTE_VERBOSE=y +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE=m +CONFIG_NET_IPGRE_BROADCAST=y +CONFIG_IP_MROUTE=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +# CONFIG_ARPD is not set +CONFIG_SYN_COOKIES=y +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +CONFIG_INET_IPCOMP=m + +# +# IP: Virtual Server Configuration +# +CONFIG_IP_VS=m +# CONFIG_IP_VS_DEBUG is not set +CONFIG_IP_VS_TAB_BITS=12 + +# +# IPVS transport protocol load balancing support +# +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_PROTO_ESP=y +CONFIG_IP_VS_PROTO_AH=y + +# +# IPVS scheduler +# +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_WRR=m +CONFIG_IP_VS_LC=m +CONFIG_IP_VS_WLC=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m + +# +# IPVS application helper +# +CONFIG_IP_VS_FTP=m +CONFIG_IPV6=m +CONFIG_IPV6_PRIVACY=y +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +CONFIG_INET6_IPCOMP=m +CONFIG_IPV6_TUNNEL=m +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_BRIDGE_NETFILTER=y + +# +# IP: Netfilter Configuration +# +CONFIG_IP_NF_CONNTRACK=m +CONFIG_IP_NF_FTP=m +CONFIG_IP_NF_IRC=m +CONFIG_IP_NF_TFTP=m +CONFIG_IP_NF_AMANDA=m +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_LIMIT=m +CONFIG_IP_NF_MATCH_IPRANGE=m +CONFIG_IP_NF_MATCH_MAC=m +CONFIG_IP_NF_MATCH_PKTTYPE=m +CONFIG_IP_NF_MATCH_MARK=m +CONFIG_IP_NF_MATCH_MULTIPORT=m +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_DSCP=m +CONFIG_IP_NF_MATCH_AH_ESP=m +CONFIG_IP_NF_MATCH_LENGTH=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_TCPMSS=m +CONFIG_IP_NF_MATCH_HELPER=m +CONFIG_IP_NF_MATCH_STATE=m +CONFIG_IP_NF_MATCH_CONNTRACK=m +CONFIG_IP_NF_MATCH_OWNER=m +CONFIG_IP_NF_MATCH_PHYSDEV=m +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_SAME=m +CONFIG_IP_NF_NAT_LOCAL=y +CONFIG_IP_NF_NAT_SNMP_BASIC=m +CONFIG_IP_NF_NAT_IRC=m +CONFIG_IP_NF_NAT_FTP=m +CONFIG_IP_NF_NAT_TFTP=m +CONFIG_IP_NF_NAT_AMANDA=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_DSCP=m +CONFIG_IP_NF_TARGET_MARK=m +CONFIG_IP_NF_TARGET_CLASSIFY=m +CONFIG_IP_NF_TARGET_LOG=m +CONFIG_IP_NF_TARGET_ULOG=m +CONFIG_IP_NF_TARGET_TCPMSS=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +CONFIG_IP_NF_COMPAT_IPCHAINS=m +CONFIG_IP_NF_COMPAT_IPFWADM=m +CONFIG_IP_NF_TARGET_NOTRACK=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_MATCH_ADDRTYPE=m +CONFIG_IP_NF_MATCH_REALM=m + +# +# IPv6: Netfilter Configuration +# +CONFIG_IP6_NF_QUEUE=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MATCH_LIMIT=m +CONFIG_IP6_NF_MATCH_MAC=m +CONFIG_IP6_NF_MATCH_RT=m +CONFIG_IP6_NF_MATCH_OPTS=m +CONFIG_IP6_NF_MATCH_FRAG=m +CONFIG_IP6_NF_MATCH_HL=m +CONFIG_IP6_NF_MATCH_MULTIPORT=m +CONFIG_IP6_NF_MATCH_OWNER=m +CONFIG_IP6_NF_MATCH_MARK=m +CONFIG_IP6_NF_MATCH_IPV6HEADER=m +CONFIG_IP6_NF_MATCH_AHESP=m +CONFIG_IP6_NF_MATCH_LENGTH=m +CONFIG_IP6_NF_MATCH_EUI64=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_LOG=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_TARGET_MARK=m +CONFIG_IP6_NF_RAW=m + +# +# DECnet: Netfilter Configuration +# +CONFIG_DECNET_NF_GRABULATOR=m + +# +# Bridge: Netfilter Configuration +# +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_802_3=m +CONFIG_BRIDGE_EBT_AMONG=m +CONFIG_BRIDGE_EBT_ARP=m +CONFIG_BRIDGE_EBT_IP=m +CONFIG_BRIDGE_EBT_LIMIT=m +CONFIG_BRIDGE_EBT_MARK=m +CONFIG_BRIDGE_EBT_PKTTYPE=m +CONFIG_BRIDGE_EBT_STP=m +CONFIG_BRIDGE_EBT_VLAN=m +CONFIG_BRIDGE_EBT_ARPREPLY=m +CONFIG_BRIDGE_EBT_DNAT=m +CONFIG_BRIDGE_EBT_MARK_T=m +CONFIG_BRIDGE_EBT_REDIRECT=m +CONFIG_BRIDGE_EBT_SNAT=m +CONFIG_BRIDGE_EBT_LOG=m +CONFIG_XFRM=y +CONFIG_XFRM_USER=m + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IP_SCTP=m +# CONFIG_SCTP_DBG_MSG is not set +# CONFIG_SCTP_DBG_OBJCNT is not set +# CONFIG_SCTP_HMAC_NONE is not set +# CONFIG_SCTP_HMAC_SHA1 is not set +CONFIG_SCTP_HMAC_MD5=y +CONFIG_ATM=y +CONFIG_ATM_CLIP=y +# CONFIG_ATM_CLIP_NO_ICMP is not set +CONFIG_ATM_LANE=m +CONFIG_ATM_MPOA=m +CONFIG_ATM_BR2684=m +# CONFIG_ATM_BR2684_IPFILTER is not set +CONFIG_BRIDGE=m +CONFIG_VLAN_8021Q=m +CONFIG_DECNET=m +# CONFIG_DECNET_SIOCGIFCONF is not set +# CONFIG_DECNET_ROUTER is not set +CONFIG_LLC=y +CONFIG_LLC2=m +CONFIG_IPX=m +# CONFIG_IPX_INTERN is not set +CONFIG_ATALK=m +CONFIG_DEV_APPLETALK=y +CONFIG_IPDDP=m +CONFIG_IPDDP_ENCAP=y +CONFIG_IPDDP_DECAP=y +CONFIG_X25=m +CONFIG_LAPB=m +# CONFIG_NET_DIVERT is not set +CONFIG_ECONET=m +CONFIG_ECONET_AUNUDP=y +CONFIG_ECONET_NATIVE=y +CONFIG_WAN_ROUTER=m +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_CLK_JIFFIES=y +# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set +# CONFIG_NET_SCH_CLK_CPU is not set +CONFIG_NET_SCH_CBQ=m +CONFIG_NET_SCH_HTB=m +CONFIG_NET_SCH_HFSC=m +CONFIG_NET_SCH_ATM=m +CONFIG_NET_SCH_PRIO=m +CONFIG_NET_SCH_RED=m +CONFIG_NET_SCH_SFQ=m +CONFIG_NET_SCH_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_NETEM=m +CONFIG_NET_SCH_INGRESS=m +CONFIG_NET_QOS=y +CONFIG_NET_ESTIMATOR=y +CONFIG_NET_CLS=y +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_ROUTE=y +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +# CONFIG_CLS_U32_PERF is not set +# CONFIG_NET_CLS_IND is not set +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +# CONFIG_NET_CLS_ACT is not set +CONFIG_NET_CLS_POLICE=y + +# +# Network testing +# +CONFIG_NET_PKTGEN=m +# CONFIG_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER is not set +CONFIG_HAMRADIO=y + +# +# Packet Radio protocols +# +CONFIG_AX25=m +# CONFIG_AX25_DAMA_SLAVE is not set +CONFIG_NETROM=m +CONFIG_ROSE=m + +# +# AX.25 network device drivers +# +CONFIG_MKISS=m +CONFIG_6PACK=m +CONFIG_BPQETHER=m +CONFIG_BAYCOM_SER_FDX=m +CONFIG_BAYCOM_SER_HDX=m +CONFIG_BAYCOM_PAR=m +CONFIG_YAM=m +CONFIG_IRDA=m + +# +# IrDA protocols +# +CONFIG_IRLAN=m +CONFIG_IRNET=m +CONFIG_IRCOMM=m +# CONFIG_IRDA_ULTRA is not set + +# +# IrDA options +# +CONFIG_IRDA_CACHE_LAST_LSAP=y +CONFIG_IRDA_FAST_RR=y +CONFIG_IRDA_DEBUG=y + +# +# Infrared-port device drivers +# + +# +# SIR device drivers +# +CONFIG_IRTTY_SIR=m + +# +# Dongle support +# +CONFIG_DONGLE=y +CONFIG_ESI_DONGLE=m +CONFIG_ACTISYS_DONGLE=m +CONFIG_TEKRAM_DONGLE=m +CONFIG_LITELINK_DONGLE=m +CONFIG_MA600_DONGLE=m +CONFIG_GIRBIL_DONGLE=m +CONFIG_MCP2120_DONGLE=m +CONFIG_OLD_BELKIN_DONGLE=m +CONFIG_ACT200L_DONGLE=m + +# +# Old SIR device drivers +# +CONFIG_IRPORT_SIR=m + +# +# Old Serial dongle support +# +# CONFIG_DONGLE_OLD is not set + +# +# FIR device drivers +# +CONFIG_USB_IRDA=m +CONFIG_SIGMATEL_FIR=m +CONFIG_VLSI_FIR=m +CONFIG_BT=m +CONFIG_BT_L2CAP=m +CONFIG_BT_SCO=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_CMTP=m +CONFIG_BT_HIDP=m + +# +# Bluetooth device drivers +# +CONFIG_BT_HCIUSB=m +CONFIG_BT_HCIUSB_SCO=y +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_H4=y +CONFIG_BT_HCIUART_BCSP=y +# CONFIG_BT_HCIUART_BCSP_TXCRC is not set +CONFIG_BT_HCIBCM203X=m +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIDTL1=m +CONFIG_BT_HCIBT3C=m +CONFIG_BT_HCIBLUECARD=m +CONFIG_BT_HCIBTUART=m +CONFIG_BT_HCIVHCI=m +CONFIG_NETDEVICES=y +CONFIG_DUMMY=m +CONFIG_BONDING=m +CONFIG_EQUALIZER=m +CONFIG_TUN=m +CONFIG_ETHERTAP=m + +# +# ARCnet devices +# +CONFIG_ARCNET=m +CONFIG_ARCNET_1201=m +CONFIG_ARCNET_1051=m +CONFIG_ARCNET_RAW=m +CONFIG_ARCNET_COM90xx=m +CONFIG_ARCNET_COM90xxIO=m +CONFIG_ARCNET_RIM_I=m +CONFIG_ARCNET_COM20020=m +CONFIG_ARCNET_COM20020_PCI=m + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=m +CONFIG_HAPPYMEAL=m +CONFIG_SUNGEM=m +CONFIG_NET_VENDOR_3COM=y +CONFIG_VORTEX=m +CONFIG_TYPHOON=m + +# +# Tulip family network device support +# +CONFIG_NET_TULIP=y +CONFIG_DE2104X=m +CONFIG_TULIP=m +# CONFIG_TULIP_MWI is not set +# CONFIG_TULIP_MMIO is not set +# CONFIG_TULIP_NAPI is not set +CONFIG_DE4X5=m +CONFIG_WINBOND_840=m +CONFIG_DM9102=m +CONFIG_PCMCIA_XIRCOM=m +CONFIG_PCMCIA_XIRTULIP=m +CONFIG_HP100=m +CONFIG_NET_PCI=y +CONFIG_PCNET32=m +CONFIG_AMD8111_ETH=m +# CONFIG_AMD8111E_NAPI is not set +CONFIG_ADAPTEC_STARFIRE=m +# CONFIG_ADAPTEC_STARFIRE_NAPI is not set +CONFIG_B44=m +CONFIG_FORCEDETH=m +CONFIG_EEPRO100=m +# CONFIG_EEPRO100_PIO is not set +CONFIG_E100=m +# CONFIG_E100_NAPI is not set +CONFIG_FEALNX=m +CONFIG_NATSEMI=m +CONFIG_NE2K_PCI=m +CONFIG_8139CP=m +CONFIG_8139TOO=m +# CONFIG_8139TOO_PIO is not set +CONFIG_8139TOO_TUNE_TWISTER=y +CONFIG_8139TOO_8129=y +# CONFIG_8139_OLD_RX_RESET is not set +CONFIG_SIS900=m +CONFIG_EPIC100=m +CONFIG_SUNDANCE=m +# CONFIG_SUNDANCE_MMIO is not set +CONFIG_VIA_RHINE=m +# CONFIG_VIA_RHINE_MMIO is not set +CONFIG_VIA_VELOCITY=m + +# +# Ethernet (1000 Mbit) +# +CONFIG_DL2K=m +CONFIG_E1000=m +# CONFIG_E1000_NAPI is not set +CONFIG_NS83820=m +CONFIG_HAMACHI=m +CONFIG_YELLOWFIN=m +CONFIG_R8169=m +CONFIG_SK98LIN=m +CONFIG_TIGON3=m + +# +# Ethernet (10000 Mbit) +# +CONFIG_IXGB=m +# CONFIG_IXGB_NAPI is not set +CONFIG_S2IO=m +# CONFIG_S2IO_NAPI is not set + +# +# Token Ring devices +# +CONFIG_TR=y +CONFIG_IBMOL=m +CONFIG_3C359=m +CONFIG_TMS380TR=m +CONFIG_TMSPCI=m +CONFIG_ABYSS=m + +# +# Wireless LAN (non-hamradio) +# +CONFIG_NET_RADIO=y + +# +# Obsolete Wireless cards support (pre-802.11) +# +CONFIG_STRIP=m +CONFIG_PCMCIA_WAVELAN=m +CONFIG_PCMCIA_NETWAVE=m + +# +# Wireless 802.11 Frequency Hopping cards support +# +CONFIG_PCMCIA_RAYCS=m + +# +# Wireless 802.11b ISA/PCI cards support +# +CONFIG_IEEE80211=m +# CONFIG_IEEE80211_DEBUG is not set +CONFIG_IEEE80211_CRYPT=m +CONFIG_IEEE80211_WPA=y +CONFIG_IEEE80211_CRYPT_CCMP=m +CONFIG_IEEE80211_CRYPT_TKIP=m +CONFIG_IPW2100=m +# CONFIG_IPW2100_PROMISC is not set +# CONFIG_IPW2100_LEGACY_FW_LOAD is not set +# CONFIG_IPW2100_NOWEP is not set +# CONFIG_IPW2100_DEBUG is not set +CONFIG_IPW2200=m +# CONFIG_IPW2200_NOWEP is not set +CONFIG_WLAN_NG=m +CONFIG_PRISM2=m +CONFIG_PRISM2_USB=m +CONFIG_ACX100=m +CONFIG_ADM8211=m +CONFIG_HERMES=m +CONFIG_PLX_HERMES=m +CONFIG_TMD_HERMES=m +CONFIG_PCI_HERMES=m +CONFIG_ATMEL=m +CONFIG_PCI_ATMEL=m + +# +# Wireless 802.11b Pcmcia/Cardbus cards support +# +CONFIG_PCMCIA_HERMES=m +CONFIG_AIRO_CS=m +CONFIG_PCMCIA_ATMEL=m +CONFIG_PCMCIA_WL3501=m + +# +# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support +# +CONFIG_PRISM54=m +CONFIG_NET_WIRELESS=y + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +CONFIG_PCMCIA_3C589=m +CONFIG_PCMCIA_3C574=m +CONFIG_PCMCIA_FMVJ18X=m +CONFIG_PCMCIA_PCNET=m +CONFIG_PCMCIA_NMCLAN=m +CONFIG_PCMCIA_SMC91C92=m +CONFIG_PCMCIA_XIRC2PS=m +CONFIG_PCMCIA_AXNET=m +CONFIG_ARCNET_COM20020_CS=m + +# +# Wan interfaces +# +CONFIG_WAN=y +CONFIG_DSCC4=m +CONFIG_DSCC4_PCISYNC=y +CONFIG_DSCC4_PCI_RST=y +CONFIG_LANMEDIA=m +CONFIG_SYNCLINK_SYNCPPP=m +CONFIG_HDLC=m +CONFIG_HDLC_RAW=y +CONFIG_HDLC_RAW_ETH=y +CONFIG_HDLC_CISCO=y +CONFIG_HDLC_FR=y +CONFIG_HDLC_PPP=y +CONFIG_HDLC_X25=y +CONFIG_PCI200SYN=m +CONFIG_WANXL=m +CONFIG_PC300=m +CONFIG_PC300_MLPPP=y +CONFIG_FARSYNC=m +CONFIG_DLCI=m +CONFIG_DLCI_COUNT=24 +CONFIG_DLCI_MAX=8 +CONFIG_WAN_ROUTER_DRIVERS=y +CONFIG_CYCLADES_SYNC=m +CONFIG_CYCLOMX_X25=y +CONFIG_LAPBETHER=m +CONFIG_X25_ASY=m +CONFIG_SBNI=m +# CONFIG_SBNI_MULTILINE is not set + +# +# ATM drivers +# +CONFIG_ATM_TCP=m +CONFIG_ATM_LANAI=m +CONFIG_ATM_ENI=m +# CONFIG_ATM_ENI_DEBUG is not set +# CONFIG_ATM_ENI_TUNE_BURST is not set +CONFIG_ATM_FIRESTREAM=m +CONFIG_ATM_ZATM=m +# CONFIG_ATM_ZATM_DEBUG is not set +CONFIG_ATM_IDT77252=m +# CONFIG_ATM_IDT77252_DEBUG is not set +# CONFIG_ATM_IDT77252_RCV_ALL is not set +CONFIG_ATM_IDT77252_USE_SUNI=y +CONFIG_ATM_AMBASSADOR=m +# CONFIG_ATM_AMBASSADOR_DEBUG is not set +CONFIG_ATM_HORIZON=m +# CONFIG_ATM_HORIZON_DEBUG is not set +CONFIG_ATM_FORE200E_MAYBE=m +CONFIG_ATM_FORE200E_PCA=y +CONFIG_ATM_FORE200E_PCA_DEFAULT_FW=y +# CONFIG_ATM_FORE200E_USE_TASKLET is not set +CONFIG_ATM_FORE200E_TX_RETRY=16 +CONFIG_ATM_FORE200E_DEBUG=0 +CONFIG_ATM_FORE200E=m +CONFIG_ATM_HE=m +CONFIG_ATM_HE_USE_SUNI=y +CONFIG_FDDI=y +# CONFIG_DEFXX is not set +CONFIG_SKFP=m +CONFIG_HIPPI=y +CONFIG_ROADRUNNER=m +# CONFIG_ROADRUNNER_LARGE_RINGS is not set +CONFIG_PLIP=m +CONFIG_PPP=m +CONFIG_PPP_MULTILINK=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_MPPE=m +CONFIG_PPPOE=m +CONFIG_PPPOATM=m +CONFIG_SLIP=m +CONFIG_SLIP_COMPRESSED=y +CONFIG_SLIP_SMART=y +# CONFIG_SLIP_MODE_SLIP6 is not set +CONFIG_NET_FC=y +CONFIG_SHAPER=m +# CONFIG_NETCONSOLE is not set +# CONFIG_NDISWRAPPER is not set + +# +# ISDN subsystem +# +CONFIG_ISDN=m + +# +# Old ISDN4Linux +# +CONFIG_ISDN_I4L=m +CONFIG_ISDN_PPP=y +CONFIG_ISDN_PPP_VJ=y +CONFIG_ISDN_MPP=y +CONFIG_IPPP_FILTER=y +CONFIG_ISDN_PPP_BSDCOMP=m +CONFIG_ISDN_AUDIO=y +CONFIG_ISDN_TTY_FAX=y +CONFIG_ISDN_X25=y + +# +# ISDN feature submodules +# +CONFIG_ISDN_DRV_LOOP=m + +# +# ISDN4Linux hardware drivers +# + +# +# Passive cards +# +CONFIG_ISDN_DRV_HISAX=m + +# +# D-channel protocol features +# +CONFIG_HISAX_EURO=y +CONFIG_DE_AOC=y +# CONFIG_HISAX_NO_SENDCOMPLETE is not set +# CONFIG_HISAX_NO_LLC is not set +# CONFIG_HISAX_NO_KEYPAD is not set +CONFIG_HISAX_1TR6=y +CONFIG_HISAX_NI1=y +CONFIG_HISAX_MAX_CARDS=8 + +# +# HiSax supported cards +# +CONFIG_HISAX_16_3=y +CONFIG_HISAX_TELESPCI=y +CONFIG_HISAX_S0BOX=y +CONFIG_HISAX_FRITZPCI=y +CONFIG_HISAX_AVM_A1_PCMCIA=y +CONFIG_HISAX_ELSA=y +CONFIG_HISAX_DIEHLDIVA=y +CONFIG_HISAX_SEDLBAUER=y +CONFIG_HISAX_NETJET=y +CONFIG_HISAX_NETJET_U=y +CONFIG_HISAX_NICCY=y +CONFIG_HISAX_BKM_A4T=y +CONFIG_HISAX_SCT_QUADRO=y +CONFIG_HISAX_GAZEL=y +CONFIG_HISAX_HFC_PCI=y +CONFIG_HISAX_W6692=y +CONFIG_HISAX_HFC_SX=y +CONFIG_HISAX_ENTERNOW_PCI=y +# CONFIG_HISAX_DEBUG is not set + +# +# HiSax PCMCIA card service modules +# +CONFIG_HISAX_SEDLBAUER_CS=m +CONFIG_HISAX_ELSA_CS=m +CONFIG_HISAX_AVM_A1_CS=m +CONFIG_HISAX_TELES_CS=m + +# +# HiSax sub driver modules +# +CONFIG_HISAX_ST5481=m +CONFIG_HISAX_HFCUSB=m +CONFIG_HISAX_FRITZ_PCIPNP=m +CONFIG_HISAX_HDLC=y + +# +# Active cards +# +CONFIG_ISDN_DRV_TPAM=m +CONFIG_HYSDN=m +CONFIG_HYSDN_CAPI=y + +# +# CAPI subsystem +# +CONFIG_ISDN_CAPI=m +CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON=y +CONFIG_ISDN_CAPI_MIDDLEWARE=y +CONFIG_ISDN_CAPI_CAPI20=m +CONFIG_ISDN_CAPI_CAPIFS_BOOL=y +CONFIG_ISDN_CAPI_CAPIFS=m +CONFIG_ISDN_CAPI_CAPIDRV=m + +# +# CAPI hardware drivers +# + +# +# Active AVM cards +# +CONFIG_CAPI_AVM=y +CONFIG_ISDN_DRV_AVMB1_B1PCI=m +CONFIG_ISDN_DRV_AVMB1_B1PCIV4=y +CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m +CONFIG_ISDN_DRV_AVMB1_AVM_CS=m +CONFIG_ISDN_DRV_AVMB1_T1PCI=m +CONFIG_ISDN_DRV_AVMB1_C4=m + +# +# Active Eicon DIVA Server cards +# +CONFIG_CAPI_EICON=y +CONFIG_ISDN_DIVAS=m +CONFIG_ISDN_DIVAS_BRIPCI=y +CONFIG_ISDN_DIVAS_PRIPCI=y +CONFIG_ISDN_DIVAS_DIVACAPI=m +CONFIG_ISDN_DIVAS_USERIDI=m +CONFIG_ISDN_DIVAS_MAINT=m + +# +# Modular ISDN driver +# +CONFIG_MISDN_DRV=m +# CONFIG_MISDN_MEMDEBUG is not set +CONFIG_MISDN_AVM_FRITZ=y +CONFIG_MISDN_HFCPCI=y +CONFIG_MISDN_HFCMULTI=y +CONFIG_MISDN_SPEEDFAX=y +CONFIG_MISDN_W6692=y +CONFIG_MISDN_DSP=y + +# +# Telephony Support +# +CONFIG_PHONE=m +CONFIG_PHONE_IXJ=m +CONFIG_PHONE_IXJ_PCMCIA=m + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=m +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_MOUSEDEV_PSAUX_ENABLE=y +CONFIG_INPUT_JOYDEV=m +CONFIG_INPUT_TSDEV=m +CONFIG_INPUT_TSDEV_SCREEN_X=240 +CONFIG_INPUT_TSDEV_SCREEN_Y=320 +CONFIG_INPUT_EVDEV=m +CONFIG_INPUT_EVBUG=m + +# +# Input I/O drivers +# +CONFIG_GAMEPORT=m +CONFIG_SOUND_GAMEPORT=m +CONFIG_GAMEPORT_NS558=m +CONFIG_GAMEPORT_L4=m +CONFIG_GAMEPORT_EMU10K1=m +CONFIG_GAMEPORT_VORTEX=m +CONFIG_GAMEPORT_FM801=m +CONFIG_GAMEPORT_CS461x=m +CONFIG_SERIO=y +CONFIG_SERIO_I8042=y +CONFIG_SERIO_SERPORT=m +CONFIG_SERIO_CT82C710=m +CONFIG_SERIO_PARKBD=m +CONFIG_SERIO_PCIPS2=m + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=y +CONFIG_KEYBOARD_SUNKBD=m +# CONFIG_KEYBOARD_LKKBD is not set +CONFIG_KEYBOARD_XTKBD=m +CONFIG_KEYBOARD_NEWTON=m +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=m +CONFIG_MOUSE_SERIAL=m +# CONFIG_MOUSE_VSXXXAA is not set +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_ANALOG=m +CONFIG_JOYSTICK_A3D=m +CONFIG_JOYSTICK_ADI=m +CONFIG_JOYSTICK_COBRA=m +CONFIG_JOYSTICK_GF2K=m +CONFIG_JOYSTICK_GRIP=m +CONFIG_JOYSTICK_GRIP_MP=m +CONFIG_JOYSTICK_GUILLEMOT=m +CONFIG_JOYSTICK_INTERACT=m +CONFIG_JOYSTICK_SIDEWINDER=m +CONFIG_JOYSTICK_TMDC=m +CONFIG_JOYSTICK_IFORCE=m +CONFIG_JOYSTICK_IFORCE_USB=y +CONFIG_JOYSTICK_IFORCE_232=y +CONFIG_JOYSTICK_WARRIOR=m +CONFIG_JOYSTICK_MAGELLAN=m +CONFIG_JOYSTICK_SPACEORB=m +CONFIG_JOYSTICK_SPACEBALL=m +CONFIG_JOYSTICK_STINGER=m +CONFIG_JOYSTICK_TWIDDLER=m +CONFIG_JOYSTICK_DB9=m +CONFIG_JOYSTICK_GAMECON=m +CONFIG_JOYSTICK_TURBOGRAFX=m +CONFIG_INPUT_JOYDUMP=m +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_GUNZE=m +CONFIG_INPUT_MISC=y +CONFIG_INPUT_PCSPKR=m +CONFIG_INPUT_UINPUT=m + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +CONFIG_SERIAL_NONSTANDARD=y +CONFIG_COMPUTONE=m +CONFIG_ROCKETPORT=m +CONFIG_CYCLADES=m +# CONFIG_CYZ_INTR is not set +# CONFIG_DIGIEPCA is not set +# CONFIG_DIGI is not set +CONFIG_MOXA_INTELLIO=m +CONFIG_MOXA_SMARTIO=m +# CONFIG_ISI is not set +CONFIG_SYNCLINK=m +CONFIG_SYNCLINKMP=m +CONFIG_N_HDLC=m +# CONFIG_RISCOM8 is not set +# CONFIG_SPECIALIX is not set +CONFIG_SX=m +# CONFIG_RIO is not set +CONFIG_STALDRV=y +CONFIG_STALLION=m +CONFIG_ISTALLION=m + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_CS=m +# CONFIG_SERIAL_8250_ACPI is not set +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_MANY_PORTS=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +CONFIG_SERIAL_8250_MULTIPORT=y +CONFIG_SERIAL_8250_RSA=y + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=256 +CONFIG_PRINTER=m +# CONFIG_LP_CONSOLE is not set +CONFIG_PPDEV=m +CONFIG_TIPAR=m +CONFIG_QIC02_TAPE=m +CONFIG_QIC02_DYNCONF=y + +# +# Setting runtime QIC-02 configuration is done with qic02conf +# + +# +# from the tpqic02-support package. It is available at +# + +# +# metalab.unc.edu or ftp://titus.cfw.com/pub/Linux/util/ +# + +# +# IPMI +# +CONFIG_IPMI_HANDLER=m +# CONFIG_IPMI_PANIC_EVENT is not set +CONFIG_IPMI_DEVICE_INTERFACE=m +CONFIG_IPMI_SI=m +CONFIG_IPMI_WATCHDOG=m + +# +# Watchdog Cards +# +CONFIG_WATCHDOG=y +# CONFIG_WATCHDOG_NOWAYOUT is not set + +# +# Watchdog Device Drivers +# +CONFIG_SOFT_WATCHDOG=m +CONFIG_ACQUIRE_WDT=m +CONFIG_ADVANTECH_WDT=m +CONFIG_ALIM1535_WDT=m +CONFIG_ALIM7101_WDT=m +CONFIG_SC520_WDT=m +CONFIG_EUROTECH_WDT=m +CONFIG_IB700_WDT=m +CONFIG_WAFER_WDT=m +CONFIG_I8XX_TCO=m +CONFIG_SC1200_WDT=m +CONFIG_SCx200_WDT=m +CONFIG_60XX_WDT=m +CONFIG_CPU5_WDT=m +CONFIG_W83627HF_WDT=m +CONFIG_W83877F_WDT=m +CONFIG_MACHZ_WDT=m + +# +# PCI-based Watchdog Cards +# +CONFIG_PCIPCWATCHDOG=m +CONFIG_WDTPCI=m +CONFIG_WDT_501_PCI=y + +# +# USB-based Watchdog Cards +# +CONFIG_USBPCWATCHDOG=m +CONFIG_HW_RANDOM=m +CONFIG_NVRAM=m +CONFIG_RTC=m +CONFIG_GEN_RTC=m +CONFIG_GEN_RTC_X=y +CONFIG_DTLK=m +CONFIG_R3964=m +CONFIG_APPLICOM=m + +# +# Ftape, the floppy tape device driver +# +CONFIG_FTAPE=m +CONFIG_ZFTAPE=m +CONFIG_ZFT_DFLT_BLK_SZ=10240 + +# +# The compressor will be built as a module only! +# +CONFIG_ZFT_COMPRESSOR=m +CONFIG_FT_NR_BUFFERS=3 +CONFIG_FT_PROC_FS=y +CONFIG_FT_NORMAL_DEBUG=y +# CONFIG_FT_FULL_DEBUG is not set +# CONFIG_FT_NO_TRACE is not set +# CONFIG_FT_NO_TRACE_AT_ALL is not set + +# +# Hardware configuration +# +CONFIG_FT_STD_FDC=y +# CONFIG_FT_MACH2 is not set +# CONFIG_FT_PROBE_FC10 is not set +# CONFIG_FT_ALT_FDC is not set +CONFIG_FT_FDC_THR=8 +CONFIG_FT_FDC_MAX_RATE=2000 +CONFIG_FT_ALPHA_CLOCK=0 +CONFIG_AGP=y +CONFIG_AGP_AMD64=y +# CONFIG_AGP_INTEL_MCH is not set +CONFIG_DRM=y +CONFIG_DRM_TDFX=m +CONFIG_DRM_GAMMA=m +CONFIG_DRM_R128=m +CONFIG_DRM_RADEON=m +CONFIG_DRM_SIS=m + +# +# PCMCIA character devices +# +CONFIG_SYNCLINK_CS=m +CONFIG_MWAVE=m +CONFIG_RAW_DRIVER=m +CONFIG_HPET=y +# CONFIG_HPET_RTC_IRQ is not set +CONFIG_HPET_MMAP=y +CONFIG_MAX_RAW_DEVS=256 +CONFIG_HANGCHECK_TIMER=m + +# +# I2C support +# +CONFIG_I2C=m +CONFIG_I2C_CHARDEV=m + +# +# I2C Algorithms +# +CONFIG_I2C_ALGOBIT=m +CONFIG_I2C_ALGOPCF=m + +# +# I2C Hardware Bus support +# +CONFIG_I2C_ALI1535=m +CONFIG_I2C_ALI1563=m +CONFIG_I2C_ALI15X3=m +CONFIG_I2C_AMD756=m +CONFIG_I2C_AMD8111=m +CONFIG_I2C_I801=m +CONFIG_I2C_I810=m +CONFIG_I2C_ISA=m +CONFIG_I2C_NFORCE2=m +CONFIG_I2C_PARPORT=m +CONFIG_I2C_PARPORT_LIGHT=m +CONFIG_I2C_PROSAVAGE=m +CONFIG_I2C_SAVAGE4=m +CONFIG_SCx200_ACB=m +CONFIG_I2C_SIS5595=m +CONFIG_I2C_SIS630=m +CONFIG_I2C_SIS96X=m +CONFIG_I2C_VIA=m +CONFIG_I2C_VIAPRO=m +CONFIG_I2C_VOODOO3=m + +# +# Hardware Sensors Chip support +# +CONFIG_I2C_SENSOR=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM1025=m +CONFIG_SENSORS_ADM1031=m +CONFIG_SENSORS_ASB100=m +CONFIG_SENSORS_DS1621=m +CONFIG_SENSORS_FSCHER=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_IT87=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM77=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_LM83=m +CONFIG_SENSORS_LM85=m +CONFIG_SENSORS_LM90=m +CONFIG_SENSORS_MAX1619=m +CONFIG_SENSORS_VIA686A=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_W83L785TS=m +CONFIG_SENSORS_W83627HF=m + +# +# Other I2C Chip support +# +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_PCF8574=m +CONFIG_SENSORS_PCF8591=m +CONFIG_SENSORS_RTC8564=m +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set + +# +# Dallas's 1-wire bus +# +CONFIG_W1=m +CONFIG_W1_MATROX=m +CONFIG_W1_THERM=m + +# +# Misc devices +# +CONFIG_IBM_ASM=m + +# +# Multimedia devices +# +CONFIG_VIDEO_DEV=m + +# +# Video For Linux +# + +# +# Video Adapters +# +CONFIG_VIDEO_BT848=m +CONFIG_VIDEO_BWQCAM=m +CONFIG_VIDEO_CQCAM=m +CONFIG_VIDEO_W9966=m +CONFIG_VIDEO_CPIA=m +CONFIG_VIDEO_CPIA_PP=m +CONFIG_VIDEO_CPIA_USB=m +CONFIG_VIDEO_SAA5246A=m +CONFIG_VIDEO_SAA5249=m +CONFIG_TUNER_3036=m +CONFIG_VIDEO_STRADIS=m +CONFIG_VIDEO_ZORAN=m +CONFIG_VIDEO_ZORAN_BUZ=m +CONFIG_VIDEO_ZORAN_DC10=m +CONFIG_VIDEO_ZORAN_DC30=m +CONFIG_VIDEO_ZORAN_LML33=m +CONFIG_VIDEO_ZORAN_LML33R10=m +CONFIG_VIDEO_SAA7134=m +CONFIG_VIDEO_MXB=m +CONFIG_VIDEO_DPC=m +CONFIG_VIDEO_HEXIUM_ORION=m +CONFIG_VIDEO_HEXIUM_GEMINI=m +CONFIG_VIDEO_CX88=m +CONFIG_VIDEO_OVCAMCHIP=m + +# +# Radio Adapters +# +CONFIG_RADIO_GEMTEK_PCI=m +CONFIG_RADIO_MAXIRADIO=m +CONFIG_RADIO_MAESTRO=m + +# +# Digital Video Broadcasting Devices +# +CONFIG_DVB=y +CONFIG_DVB_CORE=m + +# +# Supported Frontend Modules +# +CONFIG_DVB_TWINHAN_DST=m +CONFIG_DVB_STV0299=m +CONFIG_DVB_SP887X=m +CONFIG_DVB_SP887X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/sc_main.mc" +CONFIG_DVB_ALPS_TDLB7=m +CONFIG_DVB_ALPS_TDMB7=m +CONFIG_DVB_ATMEL_AT76C651=m +CONFIG_DVB_CX24110=m +CONFIG_DVB_GRUNDIG_29504_491=m +CONFIG_DVB_GRUNDIG_29504_401=m +CONFIG_DVB_MT312=m +CONFIG_DVB_VES1820=m +CONFIG_DVB_VES1X93=m +CONFIG_DVB_TDA1004X=m +CONFIG_DVB_TDA1004X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/tda1004x.bin" +CONFIG_DVB_NXT6000=m + +# +# Supported SAA7146 based PCI Adapters +# +CONFIG_DVB_AV7110=m +# CONFIG_DVB_AV7110_OSD is not set +CONFIG_DVB_BUDGET=m +CONFIG_DVB_BUDGET_CI=m +CONFIG_DVB_BUDGET_AV=m +CONFIG_DVB_BUDGET_PATCH=m + +# +# Supported USB Adapters +# +CONFIG_DVB_TTUSB_BUDGET=m +CONFIG_DVB_TTUSB_DEC=m + +# +# Supported FlexCopII (B2C2) Adapters +# +CONFIG_DVB_B2C2_SKYSTAR=m + +# +# Supported BT878 Adapters +# +CONFIG_DVB_BT8XX=m +CONFIG_VIDEO_SAA7146=m +CONFIG_VIDEO_SAA7146_VV=m +CONFIG_VIDEO_VIDEOBUF=m +CONFIG_VIDEO_TUNER=m +CONFIG_VIDEO_BUF=m +CONFIG_VIDEO_BTCX=m +CONFIG_VIDEO_IR=m + +# +# Graphics support +# +CONFIG_FB=y +CONFIG_FB_CIRRUS=m +CONFIG_FB_PM2=m +CONFIG_FB_PM2_FIFO_DISCONNECT=y +CONFIG_FB_CYBER2000=m +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +CONFIG_FB_VGA16=m +CONFIG_FB_VESA=m +CONFIG_VIDEO_SELECT=y +CONFIG_FB_HGA=m +# CONFIG_FB_HGA_ACCEL is not set +CONFIG_FB_RIVA=m +CONFIG_FB_RIVA_I2C=y +CONFIG_FB_RIVA_DEBUG=y +CONFIG_FB_MATROX=m +CONFIG_FB_MATROX_MILLENIUM=y +CONFIG_FB_MATROX_MYSTIQUE=y +CONFIG_FB_MATROX_G450=y +CONFIG_FB_MATROX_G100=y +CONFIG_FB_MATROX_I2C=m +CONFIG_FB_MATROX_MAVEN=m +CONFIG_FB_MATROX_MULTIHEAD=y +CONFIG_FB_RADEON_OLD=m +CONFIG_FB_RADEON=m +CONFIG_FB_RADEON_I2C=y +# CONFIG_FB_RADEON_DEBUG is not set +CONFIG_FB_ATY128=m +CONFIG_FB_ATY=m +CONFIG_FB_ATY_CT=y +CONFIG_FB_ATY_GX=y +CONFIG_FB_ATY_XL_INIT=y +CONFIG_FB_SIS=m +CONFIG_FB_SIS_300=y +CONFIG_FB_SIS_315=y +CONFIG_FB_NEOMAGIC=m +CONFIG_FB_KYRO=m +CONFIG_FB_3DFX=m +# CONFIG_FB_3DFX_ACCEL is not set +CONFIG_FB_VOODOO1=m +CONFIG_FB_TRIDENT=m +# CONFIG_FB_TRIDENT_ACCEL is not set +CONFIG_FB_VIRTUAL=m + +# +# Console display driver support +# +CONFIG_VGA_CONSOLE=y +CONFIG_MDA_CONSOLE=m +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=m +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y + +# +# Logo configuration +# +# CONFIG_LOGO is not set + +# +# Sound +# +CONFIG_SOUND=m + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +CONFIG_SND_HWDEP=m +CONFIG_SND_RAWMIDI=m +CONFIG_SND_SEQUENCER=m +CONFIG_SND_SEQ_DUMMY=m +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=m +CONFIG_SND_PCM_OSS=m +CONFIG_SND_SEQUENCER_OSS=y +CONFIG_SND_BIT32_EMUL=m +CONFIG_SND_RTCTIMER=m +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set + +# +# Generic devices +# +CONFIG_SND_MPU401_UART=m +CONFIG_SND_OPL3_LIB=m +CONFIG_SND_VX_LIB=m +CONFIG_SND_DUMMY=m +CONFIG_SND_VIRMIDI=m +CONFIG_SND_MTPAV=m +CONFIG_SND_SERIAL_U16550=m +CONFIG_SND_MPU401=m + +# +# PCI devices +# +CONFIG_SND_AC97_CODEC=m +CONFIG_SND_ALI5451=m +CONFIG_SND_ATIIXP=m +CONFIG_SND_AU8810=m +CONFIG_SND_AU8820=m +CONFIG_SND_AU8830=m +CONFIG_SND_AZT3328=m +CONFIG_SND_BT87X=m +CONFIG_SND_CS46XX=m +CONFIG_SND_CS46XX_NEW_DSP=y +CONFIG_SND_CS4281=m +CONFIG_SND_EMU10K1=m +CONFIG_SND_KORG1212=m +CONFIG_SND_MIXART=m +CONFIG_SND_NM256=m +CONFIG_SND_RME32=m +CONFIG_SND_RME96=m +CONFIG_SND_RME9652=m +CONFIG_SND_HDSP=m +CONFIG_SND_TRIDENT=m +CONFIG_SND_YMFPCI=m +CONFIG_SND_ALS4000=m +CONFIG_SND_CMIPCI=m +CONFIG_SND_ENS1370=m +CONFIG_SND_ENS1371=m +CONFIG_SND_ES1938=m +CONFIG_SND_ES1968=m +CONFIG_SND_MAESTRO3=m +CONFIG_SND_FM801=m +CONFIG_SND_FM801_TEA575X=m +CONFIG_SND_ICE1712=m +CONFIG_SND_ICE1724=m +CONFIG_SND_INTEL8X0=m +CONFIG_SND_INTEL8X0M=m +CONFIG_SND_SONICVIBES=m +CONFIG_SND_VIA82XX=m +CONFIG_SND_VX222=m + +# +# ALSA USB devices +# +CONFIG_SND_USB_AUDIO=m + +# +# PCMCIA devices +# + +# +# Open Sound System +# +CONFIG_SOUND_PRIME=m +CONFIG_SOUND_BT878=m +CONFIG_SOUND_CMPCI=m +# CONFIG_SOUND_CMPCI_FM is not set +# CONFIG_SOUND_CMPCI_MIDI is not set +CONFIG_SOUND_CMPCI_JOYSTICK=y +CONFIG_SOUND_EMU10K1=m +CONFIG_MIDI_EMU10K1=y +CONFIG_SOUND_FUSION=m +CONFIG_SOUND_CS4281=m +CONFIG_SOUND_ES1370=m +CONFIG_SOUND_ES1371=m +CONFIG_SOUND_ESSSOLO1=m +CONFIG_SOUND_MAESTRO=m +CONFIG_SOUND_MAESTRO3=m +CONFIG_SOUND_ICH=m +CONFIG_SOUND_SONICVIBES=m +CONFIG_SOUND_TRIDENT=m +# CONFIG_SOUND_MSNDCLAS is not set +# CONFIG_SOUND_MSNDPIN is not set +CONFIG_SOUND_VIA82CXXX=m +CONFIG_MIDI_VIA82CXXX=y +CONFIG_SOUND_OSS=m +# CONFIG_SOUND_TRACEINIT is not set +# CONFIG_SOUND_DMAP is not set +# CONFIG_SOUND_AD1816 is not set +CONFIG_SOUND_AD1889=m +CONFIG_SOUND_SGALAXY=m +CONFIG_SOUND_ADLIB=m +CONFIG_SOUND_ACI_MIXER=m +CONFIG_SOUND_CS4232=m +CONFIG_SOUND_SSCAPE=m +CONFIG_SOUND_GUS=m +CONFIG_SOUND_GUS16=y +CONFIG_SOUND_GUSMAX=y +CONFIG_SOUND_VMIDI=m +CONFIG_SOUND_TRIX=m +CONFIG_SOUND_MSS=m +CONFIG_SOUND_MPU401=m +CONFIG_SOUND_NM256=m +CONFIG_SOUND_MAD16=m +CONFIG_MAD16_OLDCARD=y +CONFIG_SOUND_PAS=m +CONFIG_SOUND_PSS=m +CONFIG_PSS_MIXER=y +CONFIG_SOUND_SB=m +# CONFIG_SOUND_AWE32_SYNTH is not set +CONFIG_SOUND_WAVEFRONT=m +CONFIG_SOUND_MAUI=m +CONFIG_SOUND_YM3812=m +CONFIG_SOUND_OPL3SA1=m +CONFIG_SOUND_OPL3SA2=m +CONFIG_SOUND_YMFPCI=m +# CONFIG_SOUND_YMFPCI_LEGACY is not set +CONFIG_SOUND_UART6850=m +CONFIG_SOUND_AEDSP16=m +CONFIG_SC6600=y +CONFIG_SC6600_JOY=y +CONFIG_SC6600_CDROM=4 +CONFIG_SC6600_CDROMBASE=0x0 +# CONFIG_AEDSP16_MSS is not set +# CONFIG_AEDSP16_SBPRO is not set +# CONFIG_AEDSP16_MPU401 is not set +CONFIG_SOUND_TVMIXER=m +CONFIG_SOUND_KAHLUA=m +CONFIG_SOUND_ALI5455=m +CONFIG_SOUND_FORTE=m +CONFIG_SOUND_RME96XX=m +CONFIG_SOUND_AD1980=m + +# +# USB support +# +CONFIG_USB=y +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +CONFIG_USB_BANDWIDTH=y +# CONFIG_USB_DYNAMIC_MINORS is not set + +# +# USB Host Controller Drivers +# +CONFIG_USB_EHCI_HCD=m +CONFIG_USB_EHCI_SPLIT_ISO=y +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_OHCI_HCD=m +CONFIG_USB_UHCI_HCD=m + +# +# USB Device Class drivers +# +CONFIG_USB_AUDIO=m + +# +# USB Bluetooth TTY can only be used with disabled Bluetooth subsystem +# +CONFIG_USB_MIDI=m +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +CONFIG_USB_STORAGE_RW_DETECT=y +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_DPCM=y +CONFIG_USB_STORAGE_HP8200e=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y + +# +# USB Human Interface Devices (HID) +# +CONFIG_USB_HID=m +CONFIG_USB_HIDINPUT=y +# CONFIG_HID_FF is not set +CONFIG_USB_HIDDEV=y + +# +# USB HID Boot Protocol drivers +# +CONFIG_USB_KBD=m +CONFIG_USB_MOUSE=m +CONFIG_USB_AIPTEK=m +CONFIG_USB_WACOM=m +CONFIG_USB_KBTAB=m +CONFIG_USB_POWERMATE=m +CONFIG_USB_MTOUCH=m +CONFIG_USB_EGALAX=m +CONFIG_USB_XPAD=m +CONFIG_USB_ATI_REMOTE=m + +# +# USB Imaging devices +# +CONFIG_USB_MDC800=m +CONFIG_USB_MICROTEK=m +CONFIG_USB_HPUSBSCSI=m + +# +# USB Multimedia devices +# +CONFIG_USB_VICAM=m +CONFIG_USB_DSBR=m +CONFIG_USB_IBMCAM=m +CONFIG_USB_KONICAWC=m +CONFIG_USB_OV511=m +CONFIG_USB_PWC=m +CONFIG_USB_SE401=m +CONFIG_USB_SN9C102=m +CONFIG_USB_STV680=m +CONFIG_USB_W9968CF=m + +# +# USB Network adaptors +# +CONFIG_USB_CATC=m +CONFIG_USB_KAWETH=m +CONFIG_USB_PEGASUS=m +CONFIG_USB_RTL8150=m +CONFIG_USB_USBNET=m + +# +# USB Host-to-Host Cables +# +CONFIG_USB_ALI_M5632=y +CONFIG_USB_AN2720=y +CONFIG_USB_BELKIN=y +CONFIG_USB_GENESYS=y +CONFIG_USB_NET1080=y +CONFIG_USB_PL2301=y + +# +# Intelligent USB Devices/Gadgets +# +CONFIG_USB_ARMLINUX=y +CONFIG_USB_EPSON2888=y +CONFIG_USB_ZAURUS=y +CONFIG_USB_CDCETHER=y + +# +# USB Network Adapters +# +CONFIG_USB_AX8817X=y + +# +# USB port drivers +# +CONFIG_USB_USS720=m + +# +# USB Serial Converter support +# +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_BELKIN=m +CONFIG_USB_SERIAL_WHITEHEAT=m +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m +CONFIG_USB_SERIAL_EMPEG=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_VISOR=m +CONFIG_USB_SERIAL_IPAQ=m +CONFIG_USB_SERIAL_IR=m +CONFIG_USB_SERIAL_EDGEPORT=m +CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_KEYSPAN_PDA=m +CONFIG_USB_SERIAL_KEYSPAN=m +CONFIG_USB_SERIAL_KLSI=m +CONFIG_USB_SERIAL_KOBIL_SCT=m +CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_SAFE=m +# CONFIG_USB_SERIAL_SAFE_PADDED is not set +CONFIG_USB_SERIAL_CYBERJACK=m +CONFIG_USB_SERIAL_XIRCOM=m +CONFIG_USB_SERIAL_OMNINET=m +CONFIG_USB_EZUSB=y + +# +# USB Miscellaneous drivers +# +CONFIG_USB_TIGL=m +CONFIG_USB_AUERSWALD=m +CONFIG_USB_RIO500=m +CONFIG_USB_LEGOTOWER=m +CONFIG_USB_LCD=m +CONFIG_USB_LED=m +CONFIG_USB_CYTHERM=m +CONFIG_USB_SPEEDTOUCH=m +CONFIG_USB_PHIDGETSERVO=m +CONFIG_USB_TEST=m +CONFIG_USB_EAGLE=m + +# +# USB Gadget Support +# +CONFIG_USB_GADGET=m +CONFIG_USB_GADGET_NET2280=y +CONFIG_USB_NET2280=m +# CONFIG_USB_GADGET_PXA2XX is not set +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_SA1100 is not set +# CONFIG_USB_GADGET_DUMMY_HCD is not set +CONFIG_USB_GADGET_DUALSPEED=y +CONFIG_USB_ZERO=m +CONFIG_USB_ETH=m +CONFIG_USB_ETH_RNDIS=y +CONFIG_USB_GADGETFS=m +CONFIG_USB_FILE_STORAGE=m +# CONFIG_USB_FILE_STORAGE_TEST is not set +CONFIG_USB_G_SERIAL=m + +# +# Firmware Drivers +# +CONFIG_EDD=m + +# +# File systems +# +CONFIG_EXT2_FS=m +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_POSIX_ACL=y +CONFIG_EXT2_FS_SECURITY=y +CONFIG_EXT3_FS=m +CONFIG_EXT3_FS_XATTR=y +CONFIG_EXT3_FS_POSIX_ACL=y +CONFIG_EXT3_FS_SECURITY=y +CONFIG_JBD=m +# CONFIG_JBD_DEBUG is not set +CONFIG_FS_MBCACHE=m +CONFIG_REISERFS_FS=m +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +# CONFIG_REISERFS_FS_XATTR is not set +CONFIG_JFS_FS=m +CONFIG_JFS_POSIX_ACL=y +# CONFIG_JFS_DEBUG is not set +CONFIG_JFS_STATISTICS=y +CONFIG_FS_POSIX_ACL=y +CONFIG_XFS_FS=m +CONFIG_XFS_RT=y +CONFIG_XFS_QUOTA=y +CONFIG_XFS_SECURITY=y +CONFIG_XFS_POSIX_ACL=y +CONFIG_MINIX_FS=m +CONFIG_ROMFS_FS=m +CONFIG_QUOTA=y +CONFIG_QFMT_V1=m +CONFIG_QFMT_V2=m +CONFIG_QUOTACTL=y +CONFIG_AUTOFS_FS=m +CONFIG_AUTOFS4_FS=m + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=m +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_ZISOFS_FS=m +CONFIG_UDF_FS=m +CONFIG_UDF_NLS=y + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +CONFIG_NTFS_FS=m +# CONFIG_NTFS_DEBUG is not set +# CONFIG_NTFS_RW is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_SYSFS=y +CONFIG_DEVFS_FS=y +# CONFIG_DEVFS_MOUNT is not set +# CONFIG_DEVFS_DEBUG is not set +CONFIG_DEVPTS_FS_XATTR=y +CONFIG_DEVPTS_FS_SECURITY=y +CONFIG_TMPFS=y +# CONFIG_HUGETLBFS is not set +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y + +# +# Miscellaneous filesystems +# +CONFIG_ADFS_FS=m +# CONFIG_ADFS_FS_RW is not set +CONFIG_AFFS_FS=m +CONFIG_ASFS_FS=m +# CONFIG_ASFS_RW is not set +CONFIG_HFS_FS=m +CONFIG_HFSPLUS_FS=m +CONFIG_BEFS_FS=m +# CONFIG_BEFS_DEBUG is not set +CONFIG_BFS_FS=m +CONFIG_EFS_FS=m +CONFIG_JFFS_FS=m +CONFIG_JFFS_FS_VERBOSE=0 +CONFIG_JFFS_PROC_FS=y +CONFIG_JFFS2_FS=m +CONFIG_JFFS2_FS_DEBUG=0 +# CONFIG_JFFS2_FS_NAND is not set +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set +CONFIG_JFFS2_ZLIB=y +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +CONFIG_CRAMFS=y +CONFIG_VXFS_FS=m +CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +# CONFIG_QNX4FS_RW is not set +CONFIG_SYSV_FS=m +CONFIG_UFS_FS=m +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=m +CONFIG_NFS_V3=y +CONFIG_NFS_V4=y +CONFIG_NFS_DIRECTIO=y +CONFIG_NFSD=m +CONFIG_NFSD_V3=y +CONFIG_NFSD_V4=y +CONFIG_NFSD_TCP=y +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=m +CONFIG_SUNRPC=m +CONFIG_SUNRPC_GSS=m +CONFIG_RPCSEC_GSS_KRB5=m +CONFIG_SMB_FS=m +# CONFIG_SMB_NLS_DEFAULT is not set +CONFIG_CIFS=m +# CONFIG_CIFS_STATS is not set +# CONFIG_CIFS_XATTR is not set +# CONFIG_CIFS_POSIX is not set +CONFIG_NCP_FS=m +# CONFIG_NCPFS_PACKET_SIGNING is not set +# CONFIG_NCPFS_IOCTL_LOCKING is not set +# CONFIG_NCPFS_STRONG is not set +CONFIG_NCPFS_NFS_NS=y +CONFIG_NCPFS_OS2_NS=y +# CONFIG_NCPFS_SMALLDOS is not set +CONFIG_NCPFS_NLS=y +CONFIG_NCPFS_EXTRAS=y +CONFIG_CODA_FS=m +# CONFIG_CODA_FS_OLD_API is not set +CONFIG_AFS_FS=m +CONFIG_RXRPC=m + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +CONFIG_ACORN_PARTITION=y +CONFIG_ACORN_PARTITION_CUMANA=y +# CONFIG_ACORN_PARTITION_EESOX is not set +CONFIG_ACORN_PARTITION_ICS=y +# CONFIG_ACORN_PARTITION_ADFS is not set +# CONFIG_ACORN_PARTITION_POWERTEC is not set +CONFIG_ACORN_PARTITION_RISCIX=y +CONFIG_OSF_PARTITION=y +CONFIG_AMIGA_PARTITION=y +CONFIG_ATARI_PARTITION=y +CONFIG_MAC_PARTITION=y +CONFIG_MSDOS_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_LDM_PARTITION=y +# CONFIG_LDM_DEBUG is not set +CONFIG_SGI_PARTITION=y +CONFIG_ULTRIX_PARTITION=y +CONFIG_SUN_PARTITION=y +# CONFIG_EFI_PARTITION is not set + +# +# Native Language Support +# +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="cp437" +CONFIG_NLS_CODEPAGE_437=m +CONFIG_NLS_CODEPAGE_737=m +CONFIG_NLS_CODEPAGE_775=m +CONFIG_NLS_CODEPAGE_850=m +CONFIG_NLS_CODEPAGE_852=m +CONFIG_NLS_CODEPAGE_855=m +CONFIG_NLS_CODEPAGE_857=m +CONFIG_NLS_CODEPAGE_860=m +CONFIG_NLS_CODEPAGE_861=m +CONFIG_NLS_CODEPAGE_862=m +CONFIG_NLS_CODEPAGE_863=m +CONFIG_NLS_CODEPAGE_864=m +CONFIG_NLS_CODEPAGE_865=m +CONFIG_NLS_CODEPAGE_866=m +CONFIG_NLS_CODEPAGE_869=m +CONFIG_NLS_CODEPAGE_936=m +CONFIG_NLS_CODEPAGE_950=m +CONFIG_NLS_CODEPAGE_932=m +CONFIG_NLS_CODEPAGE_949=m +CONFIG_NLS_CODEPAGE_874=m +CONFIG_NLS_ISO8859_8=m +CONFIG_NLS_CODEPAGE_1250=m +CONFIG_NLS_CODEPAGE_1251=m +CONFIG_NLS_ASCII=m +CONFIG_NLS_ISO8859_1=m +CONFIG_NLS_ISO8859_2=m +CONFIG_NLS_ISO8859_3=m +CONFIG_NLS_ISO8859_4=m +CONFIG_NLS_ISO8859_5=m +CONFIG_NLS_ISO8859_6=m +CONFIG_NLS_ISO8859_7=m +CONFIG_NLS_ISO8859_9=m +CONFIG_NLS_ISO8859_13=m +CONFIG_NLS_ISO8859_14=m +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_KOI8_R=m +CONFIG_NLS_KOI8_U=m +CONFIG_NLS_UTF8=m + +# +# Profiling support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=m + +# +# Kernel hacking +# +# CONFIG_DEBUG_KERNEL is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_FRAME_POINTER is not set + +# +# Security options +# +CONFIG_SECURITY=y +# CONFIG_SECURITY_NETWORK is not set +CONFIG_SECURITY_CAPABILITIES=m +CONFIG_SECURITY_ROOTPLUG=m +# CONFIG_SECURITY_SELINUX is not set + +# +# Cryptographic options +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_SHA1=m +CONFIG_CRYPTO_SHA256=m +CONFIG_CRYPTO_SHA512=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_KHAZAD=m +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_MICHAEL_MIC=m +CONFIG_CRYPTO_CRC32C=m +CONFIG_CRYPTO_TEST=m + +# +# Library routines +# +CONFIG_CRC_CCITT=m +CONFIG_CRC32=m +CONFIG_LIBCRC32C=m +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=m --- linux-source-2.6.8.1-2.6.8.1.orig/debian/config/amd64/amd64-k8-smp +++ linux-source-2.6.8.1-2.6.8.1/debian/config/amd64/amd64-k8-smp @@ -0,0 +1,2456 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_X86_64=y +CONFIG_64BIT=y +CONFIG_X86=y +CONFIG_MMU=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +CONFIG_X86_CMPXCHG=y +CONFIG_EARLY_PRINTK=y +CONFIG_HPET_TIMER=y +# CONFIG_HPET_EMULATE_RTC is not set +CONFIG_GENERIC_ISA_DMA=y + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +CONFIG_CLEAN_COMPILE=y + +# +# General setup +# +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_BSD_PROCESS_ACCT=y +# CONFIG_BSD_PROCESS_ACCT_V3 is not set +CONFIG_SYSCTL=y +# CONFIG_AUDIT is not set +CONFIG_LOG_BUF_SHIFT=15 +CONFIG_HOTPLUG=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_EMBEDDED=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_OBSOLETE_MODPARM=y +CONFIG_MODVERSIONS=y +CONFIG_KMOD=y +CONFIG_STOP_MACHINE=y + +# +# Processor type and features +# +CONFIG_MK8=y +# CONFIG_MPSC is not set +# CONFIG_GENERIC_CPU is not set +CONFIG_X86_L1_CACHE_BYTES=64 +CONFIG_X86_L1_CACHE_SHIFT=6 +CONFIG_X86_TSC=y +CONFIG_X86_GOOD_APIC=y +CONFIG_MICROCODE=m +CONFIG_X86_MSR=m +CONFIG_X86_CPUID=m +CONFIG_X86_IO_APIC=y +CONFIG_X86_LOCAL_APIC=y +CONFIG_MTRR=y +CONFIG_SMP=y +# CONFIG_PREEMPT is not set +# CONFIG_SCHED_SMT is not set +CONFIG_K8_NUMA=y +CONFIG_DISCONTIGMEM=y +CONFIG_NUMA=y +CONFIG_HAVE_DEC_LOCK=y +CONFIG_NR_CPUS=8 +CONFIG_GART_IOMMU=y +CONFIG_SWIOTLB=y +CONFIG_X86_MCE=y + +# +# Power management options +# +CONFIG_PM=y +# CONFIG_SOFTWARE_SUSPEND is not set + +# +# ACPI (Advanced Configuration and Power Interface) Support +# +CONFIG_ACPI=y +CONFIG_ACPI_BOOT=y +CONFIG_ACPI_INTERPRETER=y +# CONFIG_ACPI_SLEEP is not set +CONFIG_ACPI_AC=m +CONFIG_ACPI_BATTERY=m +CONFIG_ACPI_BUTTON=m +CONFIG_ACPI_FAN=m +CONFIG_ACPI_PROCESSOR=m +CONFIG_ACPI_THERMAL=m +CONFIG_ACPI_ASUS=m +CONFIG_ACPI_TOSHIBA=m +# CONFIG_ACPI_DEBUG is not set +CONFIG_ACPI_BUS=y +CONFIG_ACPI_EC=y +CONFIG_ACPI_POWER=y +CONFIG_ACPI_PCI=y +CONFIG_ACPI_SYSTEM=y + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_PROC_INTF=m +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=m +CONFIG_CPU_FREQ_GOV_USERSPACE=m +# CONFIG_CPU_FREQ_24_API is not set +CONFIG_CPU_FREQ_TABLE=m + +# +# CPUFreq processor drivers +# +CONFIG_X86_POWERNOW_K8=m + +# +# Bus options (PCI etc.) +# +CONFIG_PCI=y +CONFIG_PCI_DIRECT=y +CONFIG_PCI_MMCONFIG=y +# CONFIG_PCI_MSI is not set +CONFIG_PCI_LEGACY_PROC=y +CONFIG_PCI_NAMES=y + +# +# PCMCIA/CardBus support +# +CONFIG_PCMCIA=m +# CONFIG_PCMCIA_DEBUG is not set +CONFIG_YENTA=m +CONFIG_CARDBUS=y +CONFIG_PD6729=m +CONFIG_I82092=m +CONFIG_TCIC=m + +# +# PCI Hotplug Support +# +# CONFIG_HOTPLUG_PCI is not set + +# +# Executable file formats / Emulations +# +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_MISC=m +CONFIG_IA32_EMULATION=y +CONFIG_IA32_AOUT=y +CONFIG_COMPAT=y +CONFIG_SYSVIPC_COMPAT=y +CONFIG_UID16=y + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=m + +# +# Memory Technology Devices (MTD) +# +CONFIG_MTD=m +# CONFIG_MTD_DEBUG is not set +CONFIG_MTD_PARTITIONS=y +CONFIG_MTD_CONCAT=m +CONFIG_MTD_REDBOOT_PARTS=m +# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set +# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set +# CONFIG_MTD_CMDLINE_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=m +CONFIG_MTD_BLOCK=m +CONFIG_MTD_BLOCK_RO=m +CONFIG_FTL=m +CONFIG_NFTL=m +CONFIG_NFTL_RW=y +CONFIG_INFTL=m + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=m +CONFIG_MTD_JEDECPROBE=m +CONFIG_MTD_GEN_PROBE=m +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +CONFIG_MTD_CFI_INTELEXT=m +CONFIG_MTD_CFI_AMDSTD=m +CONFIG_MTD_CFI_AMDSTD_RETRY=0 +CONFIG_MTD_CFI_STAA=m +CONFIG_MTD_CFI_UTIL=m +CONFIG_MTD_RAM=m +CONFIG_MTD_ROM=m +CONFIG_MTD_ABSENT=m + +# +# Mapping drivers for chip access +# +CONFIG_MTD_COMPLEX_MAPPINGS=y +CONFIG_MTD_PHYSMAP=m +CONFIG_MTD_PHYSMAP_START=0x8000000 +CONFIG_MTD_PHYSMAP_LEN=0x4000000 +CONFIG_MTD_PHYSMAP_BANKWIDTH=2 +CONFIG_MTD_PNC2000=m +CONFIG_MTD_SC520CDP=m +CONFIG_MTD_NETSC520=m +CONFIG_MTD_SBC_GXX=m +CONFIG_MTD_ELAN_104NC=m +CONFIG_MTD_SCx200_DOCFLASH=m +# CONFIG_MTD_AMD76XROM is not set +# CONFIG_MTD_ICHXROM is not set +# CONFIG_MTD_SCB2_FLASH is not set +CONFIG_MTD_NETtel=m +CONFIG_MTD_DILNETPC=m +CONFIG_MTD_DILNETPC_BOOTSIZE=0x80000 +# CONFIG_MTD_L440GX is not set +CONFIG_MTD_PCI=m + +# +# Self-contained MTD device drivers +# +CONFIG_MTD_PMC551=m +# CONFIG_MTD_PMC551_BUGFIX is not set +# CONFIG_MTD_PMC551_DEBUG is not set +CONFIG_MTD_SLRAM=m +CONFIG_MTD_PHRAM=m +CONFIG_MTD_MTDRAM=m +CONFIG_MTDRAM_TOTAL_SIZE=4096 +CONFIG_MTDRAM_ERASE_SIZE=128 +CONFIG_MTD_BLKMTD=m + +# +# Disk-On-Chip Device Drivers +# +CONFIG_MTD_DOC2000=m +CONFIG_MTD_DOC2001=m +CONFIG_MTD_DOC2001PLUS=m +CONFIG_MTD_DOCPROBE=m +CONFIG_MTD_DOCECC=m +# CONFIG_MTD_DOCPROBE_ADVANCED is not set +CONFIG_MTD_DOCPROBE_ADDRESS=0 + +# +# NAND Flash Device Drivers +# +CONFIG_MTD_NAND=m +# CONFIG_MTD_NAND_VERIFY_WRITE is not set +CONFIG_MTD_NAND_IDS=m +CONFIG_MTD_NAND_DISKONCHIP=m +# CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set +CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0 +# CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE is not set + +# +# Parallel port support +# +CONFIG_PARPORT=m +CONFIG_PARPORT_PC=m +CONFIG_PARPORT_PC_CML1=m +CONFIG_PARPORT_SERIAL=m +CONFIG_PARPORT_PC_FIFO=y +# CONFIG_PARPORT_PC_SUPERIO is not set +CONFIG_PARPORT_PC_PCMCIA=m +# CONFIG_PARPORT_OTHER is not set +CONFIG_PARPORT_1284=y + +# +# Plug and Play support +# + +# +# Block devices +# +CONFIG_BLK_DEV_FD=m +CONFIG_PARIDE=m +CONFIG_PARIDE_PARPORT=m + +# +# Parallel IDE high-level drivers +# +CONFIG_PARIDE_PD=m +CONFIG_PARIDE_PCD=m +CONFIG_PARIDE_PF=m +CONFIG_PARIDE_PT=m +CONFIG_PARIDE_PG=m + +# +# Parallel IDE protocol modules +# +CONFIG_PARIDE_ATEN=m +CONFIG_PARIDE_BPCK=m +CONFIG_PARIDE_COMM=m +CONFIG_PARIDE_DSTR=m +CONFIG_PARIDE_FIT2=m +CONFIG_PARIDE_FIT3=m +CONFIG_PARIDE_EPAT=m +# CONFIG_PARIDE_EPATC8 is not set +CONFIG_PARIDE_EPIA=m +CONFIG_PARIDE_FRIQ=m +CONFIG_PARIDE_FRPW=m +CONFIG_PARIDE_KBIC=m +CONFIG_PARIDE_KTTI=m +CONFIG_PARIDE_ON20=m +CONFIG_PARIDE_ON26=m +CONFIG_BLK_CPQ_DA=m +CONFIG_BLK_CPQ_CISS_DA=m +CONFIG_CISS_SCSI_TAPE=y +CONFIG_BLK_DEV_DAC960=m +CONFIG_BLK_DEV_UMEM=m +CONFIG_BLK_DEV_LOOP=m +CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_SX8=m +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=65536 +CONFIG_BLK_DEV_INITRD=y +CONFIG_LBD=y + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=m +CONFIG_BLK_DEV_IDE=m + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_IDE_SATA is not set +# CONFIG_BLK_DEV_HD_IDE is not set +CONFIG_BLK_DEV_IDEDISK=m +# CONFIG_IDEDISK_MULTI_MODE is not set +CONFIG_BLK_DEV_IDECS=m +CONFIG_BLK_DEV_IDECD=m +CONFIG_BLK_DEV_IDETAPE=m +CONFIG_BLK_DEV_IDEFLOPPY=m +CONFIG_BLK_DEV_IDESCSI=m +# CONFIG_IDE_TASK_IOCTL is not set +# CONFIG_IDE_TASKFILE_IO is not set + +# +# IDE chipset support/bugfixes +# +CONFIG_IDE_GENERIC=m +CONFIG_BLK_DEV_CMD640=y +# CONFIG_BLK_DEV_CMD640_ENHANCED is not set +CONFIG_BLK_DEV_IDEPCI=y +CONFIG_IDEPCI_SHARE_IRQ=y +# CONFIG_BLK_DEV_OFFBOARD is not set +CONFIG_BLK_DEV_GENERIC=m +CONFIG_BLK_DEV_OPTI621=m +CONFIG_BLK_DEV_RZ1000=m +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +CONFIG_IDEDMA_PCI_AUTO=y +CONFIG_IDEDMA_ONLYDISK=y +CONFIG_BLK_DEV_ADMA=y +CONFIG_BLK_DEV_AEC62XX=m +CONFIG_BLK_DEV_ALI15X3=m +# CONFIG_WDC_ALI15X3 is not set +CONFIG_BLK_DEV_AMD74XX=m +CONFIG_BLK_DEV_ATIIXP=m +CONFIG_BLK_DEV_CMD64X=m +CONFIG_BLK_DEV_TRIFLEX=m +CONFIG_BLK_DEV_CY82C693=m +CONFIG_BLK_DEV_CS5520=m +CONFIG_BLK_DEV_CS5530=m +CONFIG_BLK_DEV_HPT34X=m +# CONFIG_HPT34X_AUTODMA is not set +CONFIG_BLK_DEV_HPT366=m +CONFIG_BLK_DEV_SC1200=m +CONFIG_BLK_DEV_PIIX=m +CONFIG_BLK_DEV_NS87415=m +CONFIG_BLK_DEV_PDC202XX_OLD=m +CONFIG_PDC202XX_BURST=y +CONFIG_BLK_DEV_PDC202XX_NEW=m +CONFIG_PDC202XX_FORCE=y +CONFIG_BLK_DEV_SVWKS=m +CONFIG_BLK_DEV_SIIMAGE=m +CONFIG_BLK_DEV_SIS5513=m +CONFIG_BLK_DEV_SLC90E66=m +CONFIG_BLK_DEV_TRM290=m +CONFIG_BLK_DEV_VIA82CXXX=m +# CONFIG_IDE_ARM is not set +CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_IVB is not set +CONFIG_IDEDMA_AUTO=y +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +CONFIG_SCSI=m +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +CONFIG_CHR_DEV_ST=m +CONFIG_CHR_DEV_OSST=m +CONFIG_BLK_DEV_SR=m +# CONFIG_BLK_DEV_SR_VENDOR is not set +CONFIG_CHR_DEV_SG=m +CONFIG_CHR_DEV_SCH=m + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y + +# +# SCSI Transport Attributes +# +CONFIG_SCSI_SPI_ATTRS=m +CONFIG_SCSI_FC_ATTRS=m + +# +# SCSI low-level drivers +# +CONFIG_BLK_DEV_3W_XXXX_RAID=m +CONFIG_SCSI_3W_9XXX=m +CONFIG_SCSI_ACARD=m +CONFIG_SCSI_AACRAID=m +CONFIG_SCSI_AIC7XXX=m +CONFIG_AIC7XXX_CMDS_PER_DEVICE=8 +CONFIG_AIC7XXX_RESET_DELAY_MS=15000 +# CONFIG_AIC7XXX_BUILD_FIRMWARE is not set +CONFIG_AIC7XXX_DEBUG_ENABLE=y +CONFIG_AIC7XXX_DEBUG_MASK=0 +CONFIG_AIC7XXX_REG_PRETTY_PRINT=y +CONFIG_SCSI_AIC7XXX_OLD=m +CONFIG_SCSI_AIC79XX=m +CONFIG_AIC79XX_CMDS_PER_DEVICE=32 +CONFIG_AIC79XX_RESET_DELAY_MS=15000 +# CONFIG_AIC79XX_BUILD_FIRMWARE is not set +CONFIG_AIC79XX_ENABLE_RD_STRM=y +CONFIG_AIC79XX_DEBUG_ENABLE=y +CONFIG_AIC79XX_DEBUG_MASK=0 +CONFIG_AIC79XX_REG_PRETTY_PRINT=y +CONFIG_SCSI_MEGARAID=m +CONFIG_SCSI_SATA=y +CONFIG_SCSI_SATA_SVW=m +CONFIG_SCSI_ATA_PIIX=m +CONFIG_SCSI_SATA_NV=m +CONFIG_SCSI_SATA_PROMISE=m +CONFIG_SCSI_SATA_SX4=m +CONFIG_SCSI_SATA_SIL=m +CONFIG_SCSI_SATA_SIS=m +CONFIG_SCSI_SATA_VIA=m +CONFIG_SCSI_SATA_VITESSE=m +CONFIG_SCSI_BUSLOGIC=m +# CONFIG_SCSI_OMIT_FLASHPOINT is not set +CONFIG_SCSI_DMX3191D=m +CONFIG_SCSI_EATA=m +CONFIG_SCSI_EATA_TAGGED_QUEUE=y +CONFIG_SCSI_EATA_LINKED_COMMANDS=y +CONFIG_SCSI_EATA_MAX_TAGS=16 +CONFIG_SCSI_EATA_PIO=m +CONFIG_SCSI_FUTURE_DOMAIN=m +CONFIG_SCSI_GDTH=m +CONFIG_SCSI_IPS=m +CONFIG_SCSI_INIA100=m +CONFIG_SCSI_PPA=m +CONFIG_SCSI_IMM=m +# CONFIG_SCSI_IZIP_EPP16 is not set +# CONFIG_SCSI_IZIP_SLOW_CTR is not set +CONFIG_SCSI_SYM53C8XX_2=m +CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 +CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 +CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 +# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set +CONFIG_SCSI_IPR=m +# CONFIG_SCSI_IPR_TRACE is not set +# CONFIG_SCSI_IPR_DUMP is not set +CONFIG_SCSI_QLOGIC_ISP=m +CONFIG_SCSI_QLOGIC_FC=m +CONFIG_SCSI_QLOGIC_FC_FIRMWARE=y +CONFIG_SCSI_QLOGIC_1280=m +CONFIG_SCSI_DC395x=m +CONFIG_SCSI_DC390T=m +CONFIG_SCSI_DEBUG=m + +# +# PCMCIA SCSI adapter support +# +CONFIG_PCMCIA_FDOMAIN=m +CONFIG_PCMCIA_QLOGIC=m +CONFIG_PCMCIA_SYM53C500=m + +# +# Multi-device support (RAID and LVM) +# +CONFIG_MD=y +CONFIG_BLK_DEV_MD=m +CONFIG_MD_LINEAR=m +CONFIG_MD_RAID0=m +CONFIG_MD_RAID1=m +CONFIG_MD_RAID5=m +CONFIG_MD_RAID6=m +CONFIG_MD_MULTIPATH=m +CONFIG_BLK_DEV_DM=m +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=m +CONFIG_DM_MIRROR=m +CONFIG_DM_ZERO=m + +# +# Fusion MPT device support +# +CONFIG_FUSION=m +CONFIG_FUSION_MAX_SGE=40 +CONFIG_FUSION_ISENSE=m +CONFIG_FUSION_CTL=m +CONFIG_FUSION_LAN=m + +# +# IEEE 1394 (FireWire) support +# +CONFIG_IEEE1394=m + +# +# Subsystem Options +# +# CONFIG_IEEE1394_VERBOSEDEBUG is not set +CONFIG_IEEE1394_OUI_DB=y +CONFIG_IEEE1394_EXTRA_CONFIG_ROMS=y +CONFIG_IEEE1394_CONFIG_ROM_IP1394=y + +# +# Device Drivers +# +CONFIG_IEEE1394_PCILYNX=m +CONFIG_IEEE1394_OHCI1394=m + +# +# Protocol Drivers +# +CONFIG_IEEE1394_VIDEO1394=m +CONFIG_IEEE1394_SBP2=m +# CONFIG_IEEE1394_SBP2_PHYS_DMA is not set +CONFIG_IEEE1394_ETH1394=m +CONFIG_IEEE1394_DV1394=m +CONFIG_IEEE1394_RAWIO=m +CONFIG_IEEE1394_CMP=m +CONFIG_IEEE1394_AMDTP=m + +# +# I2O device support +# +CONFIG_I2O=m +CONFIG_I2O_CONFIG=m +CONFIG_I2O_BLOCK=m +CONFIG_I2O_SCSI=m +CONFIG_I2O_PROC=m + +# +# Networking support +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=m +CONFIG_PACKET_MMAP=y +CONFIG_NETLINK_DEV=m +CONFIG_UNIX=m +CONFIG_NET_KEY=m +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_FWMARK=y +CONFIG_IP_ROUTE_NAT=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_TOS=y +CONFIG_IP_ROUTE_VERBOSE=y +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE=m +CONFIG_NET_IPGRE_BROADCAST=y +CONFIG_IP_MROUTE=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +# CONFIG_ARPD is not set +CONFIG_SYN_COOKIES=y +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +CONFIG_INET_IPCOMP=m + +# +# IP: Virtual Server Configuration +# +CONFIG_IP_VS=m +# CONFIG_IP_VS_DEBUG is not set +CONFIG_IP_VS_TAB_BITS=12 + +# +# IPVS transport protocol load balancing support +# +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_PROTO_ESP=y +CONFIG_IP_VS_PROTO_AH=y + +# +# IPVS scheduler +# +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_WRR=m +CONFIG_IP_VS_LC=m +CONFIG_IP_VS_WLC=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m + +# +# IPVS application helper +# +CONFIG_IP_VS_FTP=m +CONFIG_IPV6=m +CONFIG_IPV6_PRIVACY=y +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +CONFIG_INET6_IPCOMP=m +CONFIG_IPV6_TUNNEL=m +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_BRIDGE_NETFILTER=y + +# +# IP: Netfilter Configuration +# +CONFIG_IP_NF_CONNTRACK=m +CONFIG_IP_NF_FTP=m +CONFIG_IP_NF_IRC=m +CONFIG_IP_NF_TFTP=m +CONFIG_IP_NF_AMANDA=m +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_LIMIT=m +CONFIG_IP_NF_MATCH_IPRANGE=m +CONFIG_IP_NF_MATCH_MAC=m +CONFIG_IP_NF_MATCH_PKTTYPE=m +CONFIG_IP_NF_MATCH_MARK=m +CONFIG_IP_NF_MATCH_MULTIPORT=m +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_DSCP=m +CONFIG_IP_NF_MATCH_AH_ESP=m +CONFIG_IP_NF_MATCH_LENGTH=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_TCPMSS=m +CONFIG_IP_NF_MATCH_HELPER=m +CONFIG_IP_NF_MATCH_STATE=m +CONFIG_IP_NF_MATCH_CONNTRACK=m +CONFIG_IP_NF_MATCH_OWNER=m +CONFIG_IP_NF_MATCH_PHYSDEV=m +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_SAME=m +CONFIG_IP_NF_NAT_LOCAL=y +CONFIG_IP_NF_NAT_SNMP_BASIC=m +CONFIG_IP_NF_NAT_IRC=m +CONFIG_IP_NF_NAT_FTP=m +CONFIG_IP_NF_NAT_TFTP=m +CONFIG_IP_NF_NAT_AMANDA=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_DSCP=m +CONFIG_IP_NF_TARGET_MARK=m +CONFIG_IP_NF_TARGET_CLASSIFY=m +CONFIG_IP_NF_TARGET_LOG=m +CONFIG_IP_NF_TARGET_ULOG=m +CONFIG_IP_NF_TARGET_TCPMSS=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +CONFIG_IP_NF_COMPAT_IPCHAINS=m +CONFIG_IP_NF_COMPAT_IPFWADM=m +CONFIG_IP_NF_TARGET_NOTRACK=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_MATCH_ADDRTYPE=m +CONFIG_IP_NF_MATCH_REALM=m + +# +# IPv6: Netfilter Configuration +# +CONFIG_IP6_NF_QUEUE=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MATCH_LIMIT=m +CONFIG_IP6_NF_MATCH_MAC=m +CONFIG_IP6_NF_MATCH_RT=m +CONFIG_IP6_NF_MATCH_OPTS=m +CONFIG_IP6_NF_MATCH_FRAG=m +CONFIG_IP6_NF_MATCH_HL=m +CONFIG_IP6_NF_MATCH_MULTIPORT=m +CONFIG_IP6_NF_MATCH_OWNER=m +CONFIG_IP6_NF_MATCH_MARK=m +CONFIG_IP6_NF_MATCH_IPV6HEADER=m +CONFIG_IP6_NF_MATCH_AHESP=m +CONFIG_IP6_NF_MATCH_LENGTH=m +CONFIG_IP6_NF_MATCH_EUI64=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_LOG=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_TARGET_MARK=m +CONFIG_IP6_NF_RAW=m + +# +# DECnet: Netfilter Configuration +# +CONFIG_DECNET_NF_GRABULATOR=m + +# +# Bridge: Netfilter Configuration +# +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_802_3=m +CONFIG_BRIDGE_EBT_AMONG=m +CONFIG_BRIDGE_EBT_ARP=m +CONFIG_BRIDGE_EBT_IP=m +CONFIG_BRIDGE_EBT_LIMIT=m +CONFIG_BRIDGE_EBT_MARK=m +CONFIG_BRIDGE_EBT_PKTTYPE=m +CONFIG_BRIDGE_EBT_STP=m +CONFIG_BRIDGE_EBT_VLAN=m +CONFIG_BRIDGE_EBT_ARPREPLY=m +CONFIG_BRIDGE_EBT_DNAT=m +CONFIG_BRIDGE_EBT_MARK_T=m +CONFIG_BRIDGE_EBT_REDIRECT=m +CONFIG_BRIDGE_EBT_SNAT=m +CONFIG_BRIDGE_EBT_LOG=m +CONFIG_XFRM=y +CONFIG_XFRM_USER=m + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IP_SCTP=m +# CONFIG_SCTP_DBG_MSG is not set +# CONFIG_SCTP_DBG_OBJCNT is not set +# CONFIG_SCTP_HMAC_NONE is not set +# CONFIG_SCTP_HMAC_SHA1 is not set +CONFIG_SCTP_HMAC_MD5=y +CONFIG_ATM=y +CONFIG_ATM_CLIP=y +# CONFIG_ATM_CLIP_NO_ICMP is not set +CONFIG_ATM_LANE=m +CONFIG_ATM_MPOA=m +CONFIG_ATM_BR2684=m +# CONFIG_ATM_BR2684_IPFILTER is not set +CONFIG_BRIDGE=m +CONFIG_VLAN_8021Q=m +CONFIG_DECNET=m +# CONFIG_DECNET_SIOCGIFCONF is not set +# CONFIG_DECNET_ROUTER is not set +CONFIG_LLC=y +CONFIG_LLC2=m +CONFIG_IPX=m +# CONFIG_IPX_INTERN is not set +CONFIG_ATALK=m +CONFIG_DEV_APPLETALK=y +CONFIG_IPDDP=m +CONFIG_IPDDP_ENCAP=y +CONFIG_IPDDP_DECAP=y +CONFIG_X25=m +CONFIG_LAPB=m +# CONFIG_NET_DIVERT is not set +CONFIG_ECONET=m +CONFIG_ECONET_AUNUDP=y +CONFIG_ECONET_NATIVE=y +CONFIG_WAN_ROUTER=m +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_CLK_JIFFIES=y +# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set +# CONFIG_NET_SCH_CLK_CPU is not set +CONFIG_NET_SCH_CBQ=m +CONFIG_NET_SCH_HTB=m +CONFIG_NET_SCH_HFSC=m +CONFIG_NET_SCH_ATM=m +CONFIG_NET_SCH_PRIO=m +CONFIG_NET_SCH_RED=m +CONFIG_NET_SCH_SFQ=m +CONFIG_NET_SCH_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_NETEM=m +CONFIG_NET_SCH_INGRESS=m +CONFIG_NET_QOS=y +CONFIG_NET_ESTIMATOR=y +CONFIG_NET_CLS=y +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_ROUTE=y +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +# CONFIG_CLS_U32_PERF is not set +# CONFIG_NET_CLS_IND is not set +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +# CONFIG_NET_CLS_ACT is not set +CONFIG_NET_CLS_POLICE=y + +# +# Network testing +# +CONFIG_NET_PKTGEN=m +# CONFIG_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER is not set +CONFIG_HAMRADIO=y + +# +# Packet Radio protocols +# +CONFIG_AX25=m +# CONFIG_AX25_DAMA_SLAVE is not set +CONFIG_NETROM=m +CONFIG_ROSE=m + +# +# AX.25 network device drivers +# +CONFIG_BPQETHER=m +CONFIG_BAYCOM_SER_FDX=m +CONFIG_BAYCOM_SER_HDX=m +CONFIG_BAYCOM_PAR=m +CONFIG_YAM=m +CONFIG_IRDA=m + +# +# IrDA protocols +# +CONFIG_IRLAN=m +CONFIG_IRNET=m +CONFIG_IRCOMM=m +# CONFIG_IRDA_ULTRA is not set + +# +# IrDA options +# +CONFIG_IRDA_CACHE_LAST_LSAP=y +CONFIG_IRDA_FAST_RR=y +CONFIG_IRDA_DEBUG=y + +# +# Infrared-port device drivers +# + +# +# SIR device drivers +# +CONFIG_IRTTY_SIR=m + +# +# Dongle support +# +CONFIG_DONGLE=y +CONFIG_ESI_DONGLE=m +CONFIG_ACTISYS_DONGLE=m +CONFIG_TEKRAM_DONGLE=m +CONFIG_LITELINK_DONGLE=m +CONFIG_MA600_DONGLE=m +CONFIG_GIRBIL_DONGLE=m +CONFIG_MCP2120_DONGLE=m +CONFIG_OLD_BELKIN_DONGLE=m +CONFIG_ACT200L_DONGLE=m + +# +# Old SIR device drivers +# + +# +# Old Serial dongle support +# + +# +# FIR device drivers +# +CONFIG_USB_IRDA=m +CONFIG_SIGMATEL_FIR=m +CONFIG_VLSI_FIR=m +CONFIG_BT=m +CONFIG_BT_L2CAP=m +CONFIG_BT_SCO=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_CMTP=m +CONFIG_BT_HIDP=m + +# +# Bluetooth device drivers +# +CONFIG_BT_HCIUSB=m +CONFIG_BT_HCIUSB_SCO=y +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_H4=y +CONFIG_BT_HCIUART_BCSP=y +# CONFIG_BT_HCIUART_BCSP_TXCRC is not set +CONFIG_BT_HCIBCM203X=m +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIDTL1=m +CONFIG_BT_HCIBT3C=m +CONFIG_BT_HCIBLUECARD=m +CONFIG_BT_HCIBTUART=m +CONFIG_BT_HCIVHCI=m +CONFIG_NETDEVICES=y +CONFIG_DUMMY=m +CONFIG_BONDING=m +CONFIG_EQUALIZER=m +CONFIG_TUN=m +CONFIG_ETHERTAP=m + +# +# ARCnet devices +# +CONFIG_ARCNET=m +CONFIG_ARCNET_1201=m +CONFIG_ARCNET_1051=m +CONFIG_ARCNET_RAW=m +CONFIG_ARCNET_COM90xx=m +CONFIG_ARCNET_COM90xxIO=m +CONFIG_ARCNET_RIM_I=m +CONFIG_ARCNET_COM20020=m +CONFIG_ARCNET_COM20020_PCI=m + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=m +CONFIG_HAPPYMEAL=m +CONFIG_SUNGEM=m +CONFIG_NET_VENDOR_3COM=y +CONFIG_VORTEX=m +CONFIG_TYPHOON=m + +# +# Tulip family network device support +# +CONFIG_NET_TULIP=y +CONFIG_DE2104X=m +CONFIG_TULIP=m +# CONFIG_TULIP_MWI is not set +# CONFIG_TULIP_MMIO is not set +# CONFIG_TULIP_NAPI is not set +CONFIG_DE4X5=m +CONFIG_WINBOND_840=m +CONFIG_DM9102=m +CONFIG_PCMCIA_XIRCOM=m +CONFIG_HP100=m +CONFIG_NET_PCI=y +CONFIG_PCNET32=m +CONFIG_AMD8111_ETH=m +# CONFIG_AMD8111E_NAPI is not set +CONFIG_ADAPTEC_STARFIRE=m +# CONFIG_ADAPTEC_STARFIRE_NAPI is not set +CONFIG_B44=m +CONFIG_FORCEDETH=m +CONFIG_EEPRO100=m +# CONFIG_EEPRO100_PIO is not set +CONFIG_E100=m +# CONFIG_E100_NAPI is not set +CONFIG_FEALNX=m +CONFIG_NATSEMI=m +CONFIG_NE2K_PCI=m +CONFIG_8139CP=m +CONFIG_8139TOO=m +# CONFIG_8139TOO_PIO is not set +CONFIG_8139TOO_TUNE_TWISTER=y +CONFIG_8139TOO_8129=y +# CONFIG_8139_OLD_RX_RESET is not set +CONFIG_SIS900=m +CONFIG_EPIC100=m +CONFIG_SUNDANCE=m +# CONFIG_SUNDANCE_MMIO is not set +CONFIG_VIA_RHINE=m +# CONFIG_VIA_RHINE_MMIO is not set +CONFIG_VIA_VELOCITY=m + +# +# Ethernet (1000 Mbit) +# +CONFIG_DL2K=m +CONFIG_E1000=m +# CONFIG_E1000_NAPI is not set +CONFIG_NS83820=m +CONFIG_HAMACHI=m +CONFIG_YELLOWFIN=m +CONFIG_R8169=m +CONFIG_SK98LIN=m +CONFIG_TIGON3=m + +# +# Ethernet (10000 Mbit) +# +CONFIG_IXGB=m +# CONFIG_IXGB_NAPI is not set +CONFIG_S2IO=m +# CONFIG_S2IO_NAPI is not set + +# +# Token Ring devices +# +CONFIG_TR=y +CONFIG_IBMOL=m +CONFIG_3C359=m +CONFIG_TMS380TR=m +CONFIG_TMSPCI=m +CONFIG_ABYSS=m + +# +# Wireless LAN (non-hamradio) +# +CONFIG_NET_RADIO=y + +# +# Obsolete Wireless cards support (pre-802.11) +# +CONFIG_STRIP=m +CONFIG_PCMCIA_WAVELAN=m +CONFIG_PCMCIA_NETWAVE=m + +# +# Wireless 802.11 Frequency Hopping cards support +# +CONFIG_PCMCIA_RAYCS=m + +# +# Wireless 802.11b ISA/PCI cards support +# +CONFIG_IEEE80211=m +# CONFIG_IEEE80211_DEBUG is not set +CONFIG_IEEE80211_CRYPT=m +CONFIG_IEEE80211_WPA=y +CONFIG_IEEE80211_CRYPT_CCMP=m +CONFIG_IEEE80211_CRYPT_TKIP=m +CONFIG_IPW2100=m +# CONFIG_IPW2100_PROMISC is not set +# CONFIG_IPW2100_LEGACY_FW_LOAD is not set +# CONFIG_IPW2100_NOWEP is not set +# CONFIG_IPW2100_DEBUG is not set +CONFIG_IPW2200=m +# CONFIG_IPW2200_NOWEP is not set +CONFIG_WLAN_NG=m +CONFIG_PRISM2=m +CONFIG_PRISM2_USB=m +CONFIG_ACX100=m +CONFIG_ADM8211=m +CONFIG_HERMES=m +CONFIG_PLX_HERMES=m +CONFIG_TMD_HERMES=m +CONFIG_PCI_HERMES=m +CONFIG_ATMEL=m +CONFIG_PCI_ATMEL=m + +# +# Wireless 802.11b Pcmcia/Cardbus cards support +# +CONFIG_PCMCIA_HERMES=m +CONFIG_AIRO_CS=m +CONFIG_PCMCIA_ATMEL=m +CONFIG_PCMCIA_WL3501=m + +# +# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support +# +CONFIG_PRISM54=m +CONFIG_NET_WIRELESS=y + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +CONFIG_PCMCIA_3C589=m +CONFIG_PCMCIA_3C574=m +CONFIG_PCMCIA_FMVJ18X=m +CONFIG_PCMCIA_PCNET=m +CONFIG_PCMCIA_NMCLAN=m +CONFIG_PCMCIA_SMC91C92=m +CONFIG_PCMCIA_XIRC2PS=m +CONFIG_PCMCIA_AXNET=m +CONFIG_ARCNET_COM20020_CS=m + +# +# Wan interfaces +# +CONFIG_WAN=y +CONFIG_DSCC4=m +CONFIG_DSCC4_PCISYNC=y +CONFIG_DSCC4_PCI_RST=y +CONFIG_LANMEDIA=m +CONFIG_SYNCLINK_SYNCPPP=m +CONFIG_HDLC=m +CONFIG_HDLC_RAW=y +CONFIG_HDLC_RAW_ETH=y +CONFIG_HDLC_CISCO=y +CONFIG_HDLC_FR=y +CONFIG_HDLC_PPP=y +CONFIG_HDLC_X25=y +CONFIG_PCI200SYN=m +CONFIG_WANXL=m +CONFIG_PC300=m +CONFIG_PC300_MLPPP=y +CONFIG_FARSYNC=m +CONFIG_DLCI=m +CONFIG_DLCI_COUNT=24 +CONFIG_DLCI_MAX=8 +CONFIG_WAN_ROUTER_DRIVERS=y +CONFIG_CYCLADES_SYNC=m +CONFIG_CYCLOMX_X25=y +CONFIG_LAPBETHER=m +CONFIG_X25_ASY=m +CONFIG_SBNI=m +# CONFIG_SBNI_MULTILINE is not set + +# +# ATM drivers +# +CONFIG_ATM_TCP=m +CONFIG_ATM_LANAI=m +CONFIG_ATM_ENI=m +# CONFIG_ATM_ENI_DEBUG is not set +# CONFIG_ATM_ENI_TUNE_BURST is not set +CONFIG_ATM_FIRESTREAM=m +CONFIG_ATM_ZATM=m +# CONFIG_ATM_ZATM_DEBUG is not set +CONFIG_ATM_IDT77252=m +# CONFIG_ATM_IDT77252_DEBUG is not set +# CONFIG_ATM_IDT77252_RCV_ALL is not set +CONFIG_ATM_IDT77252_USE_SUNI=y +CONFIG_ATM_AMBASSADOR=m +# CONFIG_ATM_AMBASSADOR_DEBUG is not set +CONFIG_ATM_HORIZON=m +# CONFIG_ATM_HORIZON_DEBUG is not set +CONFIG_ATM_FORE200E_MAYBE=m +CONFIG_ATM_FORE200E_PCA=y +CONFIG_ATM_FORE200E_PCA_DEFAULT_FW=y +# CONFIG_ATM_FORE200E_USE_TASKLET is not set +CONFIG_ATM_FORE200E_TX_RETRY=16 +CONFIG_ATM_FORE200E_DEBUG=0 +CONFIG_ATM_FORE200E=m +CONFIG_ATM_HE=m +CONFIG_ATM_HE_USE_SUNI=y +CONFIG_FDDI=y +# CONFIG_DEFXX is not set +CONFIG_SKFP=m +CONFIG_HIPPI=y +CONFIG_ROADRUNNER=m +# CONFIG_ROADRUNNER_LARGE_RINGS is not set +CONFIG_PLIP=m +CONFIG_PPP=m +CONFIG_PPP_MULTILINK=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_MPPE=m +CONFIG_PPPOE=m +CONFIG_PPPOATM=m +CONFIG_SLIP=m +CONFIG_SLIP_COMPRESSED=y +CONFIG_SLIP_SMART=y +# CONFIG_SLIP_MODE_SLIP6 is not set +CONFIG_NET_FC=y +CONFIG_SHAPER=m +# CONFIG_NETCONSOLE is not set +# CONFIG_NDISWRAPPER is not set + +# +# ISDN subsystem +# +CONFIG_ISDN=m + +# +# Old ISDN4Linux +# +CONFIG_ISDN_I4L=m +CONFIG_ISDN_PPP=y +CONFIG_ISDN_PPP_VJ=y +CONFIG_ISDN_MPP=y +CONFIG_IPPP_FILTER=y +CONFIG_ISDN_PPP_BSDCOMP=m +CONFIG_ISDN_AUDIO=y +CONFIG_ISDN_TTY_FAX=y +CONFIG_ISDN_X25=y + +# +# ISDN feature submodules +# + +# +# ISDN4Linux hardware drivers +# + +# +# Passive cards +# +CONFIG_ISDN_DRV_HISAX=m + +# +# D-channel protocol features +# +CONFIG_HISAX_EURO=y +CONFIG_DE_AOC=y +# CONFIG_HISAX_NO_SENDCOMPLETE is not set +# CONFIG_HISAX_NO_LLC is not set +# CONFIG_HISAX_NO_KEYPAD is not set +CONFIG_HISAX_1TR6=y +CONFIG_HISAX_NI1=y +CONFIG_HISAX_MAX_CARDS=8 + +# +# HiSax supported cards +# +CONFIG_HISAX_16_3=y +CONFIG_HISAX_TELESPCI=y +CONFIG_HISAX_S0BOX=y +CONFIG_HISAX_FRITZPCI=y +CONFIG_HISAX_AVM_A1_PCMCIA=y +CONFIG_HISAX_ELSA=y +CONFIG_HISAX_DIEHLDIVA=y +CONFIG_HISAX_SEDLBAUER=y +CONFIG_HISAX_NETJET=y +CONFIG_HISAX_NETJET_U=y +CONFIG_HISAX_NICCY=y +CONFIG_HISAX_BKM_A4T=y +CONFIG_HISAX_SCT_QUADRO=y +CONFIG_HISAX_GAZEL=y +CONFIG_HISAX_HFC_PCI=y +CONFIG_HISAX_W6692=y +CONFIG_HISAX_HFC_SX=y +CONFIG_HISAX_ENTERNOW_PCI=y +# CONFIG_HISAX_DEBUG is not set + +# +# HiSax PCMCIA card service modules +# +CONFIG_HISAX_SEDLBAUER_CS=m +CONFIG_HISAX_ELSA_CS=m +CONFIG_HISAX_AVM_A1_CS=m +CONFIG_HISAX_TELES_CS=m + +# +# HiSax sub driver modules +# +CONFIG_HISAX_ST5481=m +CONFIG_HISAX_HFCUSB=m +CONFIG_HISAX_FRITZ_PCIPNP=m +CONFIG_HISAX_HDLC=y + +# +# Active cards +# +CONFIG_ISDN_DRV_TPAM=m + +# +# CAPI subsystem +# +CONFIG_ISDN_CAPI=m +CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON=y +CONFIG_ISDN_CAPI_MIDDLEWARE=y +CONFIG_ISDN_CAPI_CAPI20=m +CONFIG_ISDN_CAPI_CAPIFS_BOOL=y +CONFIG_ISDN_CAPI_CAPIFS=m +CONFIG_ISDN_CAPI_CAPIDRV=m + +# +# CAPI hardware drivers +# + +# +# Active AVM cards +# +CONFIG_CAPI_AVM=y + +# +# Active Eicon DIVA Server cards +# +CONFIG_CAPI_EICON=y +CONFIG_ISDN_DIVAS=m +CONFIG_ISDN_DIVAS_BRIPCI=y +CONFIG_ISDN_DIVAS_PRIPCI=y +CONFIG_ISDN_DIVAS_DIVACAPI=m +CONFIG_ISDN_DIVAS_USERIDI=m +CONFIG_ISDN_DIVAS_MAINT=m + +# +# Modular ISDN driver +# +CONFIG_MISDN_DRV=m +# CONFIG_MISDN_MEMDEBUG is not set +CONFIG_MISDN_AVM_FRITZ=y +CONFIG_MISDN_HFCPCI=y +CONFIG_MISDN_HFCMULTI=y +CONFIG_MISDN_SPEEDFAX=y +CONFIG_MISDN_W6692=y +CONFIG_MISDN_DSP=y + +# +# Telephony Support +# +CONFIG_PHONE=m +CONFIG_PHONE_IXJ=m +CONFIG_PHONE_IXJ_PCMCIA=m + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=m +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_MOUSEDEV_PSAUX_ENABLE=y +CONFIG_INPUT_JOYDEV=m +CONFIG_INPUT_TSDEV=m +CONFIG_INPUT_TSDEV_SCREEN_X=240 +CONFIG_INPUT_TSDEV_SCREEN_Y=320 +CONFIG_INPUT_EVDEV=m +CONFIG_INPUT_EVBUG=m + +# +# Input I/O drivers +# +CONFIG_GAMEPORT=m +CONFIG_SOUND_GAMEPORT=m +CONFIG_GAMEPORT_NS558=m +CONFIG_GAMEPORT_L4=m +CONFIG_GAMEPORT_EMU10K1=m +CONFIG_GAMEPORT_VORTEX=m +CONFIG_GAMEPORT_FM801=m +CONFIG_GAMEPORT_CS461x=m +CONFIG_SERIO=y +CONFIG_SERIO_I8042=y +CONFIG_SERIO_SERPORT=m +CONFIG_SERIO_CT82C710=m +CONFIG_SERIO_PARKBD=m +CONFIG_SERIO_PCIPS2=m + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=y +CONFIG_KEYBOARD_SUNKBD=m +# CONFIG_KEYBOARD_LKKBD is not set +CONFIG_KEYBOARD_XTKBD=m +CONFIG_KEYBOARD_NEWTON=m +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=m +CONFIG_MOUSE_SERIAL=m +# CONFIG_MOUSE_VSXXXAA is not set +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_ANALOG=m +CONFIG_JOYSTICK_A3D=m +CONFIG_JOYSTICK_ADI=m +CONFIG_JOYSTICK_COBRA=m +CONFIG_JOYSTICK_GF2K=m +CONFIG_JOYSTICK_GRIP=m +CONFIG_JOYSTICK_GRIP_MP=m +CONFIG_JOYSTICK_GUILLEMOT=m +CONFIG_JOYSTICK_INTERACT=m +CONFIG_JOYSTICK_SIDEWINDER=m +CONFIG_JOYSTICK_TMDC=m +CONFIG_JOYSTICK_IFORCE=m +CONFIG_JOYSTICK_IFORCE_USB=y +CONFIG_JOYSTICK_IFORCE_232=y +CONFIG_JOYSTICK_WARRIOR=m +CONFIG_JOYSTICK_MAGELLAN=m +CONFIG_JOYSTICK_SPACEORB=m +CONFIG_JOYSTICK_SPACEBALL=m +CONFIG_JOYSTICK_STINGER=m +CONFIG_JOYSTICK_TWIDDLER=m +CONFIG_JOYSTICK_DB9=m +CONFIG_JOYSTICK_GAMECON=m +CONFIG_JOYSTICK_TURBOGRAFX=m +CONFIG_INPUT_JOYDUMP=m +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_GUNZE=m +CONFIG_INPUT_MISC=y +CONFIG_INPUT_PCSPKR=m +CONFIG_INPUT_UINPUT=m + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +CONFIG_SERIAL_NONSTANDARD=y +CONFIG_ROCKETPORT=m +CONFIG_CYCLADES=m +# CONFIG_CYZ_INTR is not set +CONFIG_SYNCLINK=m +CONFIG_SYNCLINKMP=m +CONFIG_N_HDLC=m +CONFIG_STALDRV=y + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_CS=m +# CONFIG_SERIAL_8250_ACPI is not set +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_MANY_PORTS=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +CONFIG_SERIAL_8250_MULTIPORT=y +CONFIG_SERIAL_8250_RSA=y + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=256 +CONFIG_PRINTER=m +# CONFIG_LP_CONSOLE is not set +CONFIG_PPDEV=m +CONFIG_TIPAR=m +CONFIG_QIC02_TAPE=m +CONFIG_QIC02_DYNCONF=y + +# +# Setting runtime QIC-02 configuration is done with qic02conf +# + +# +# from the tpqic02-support package. It is available at +# + +# +# metalab.unc.edu or ftp://titus.cfw.com/pub/Linux/util/ +# + +# +# IPMI +# +CONFIG_IPMI_HANDLER=m +# CONFIG_IPMI_PANIC_EVENT is not set +CONFIG_IPMI_DEVICE_INTERFACE=m +CONFIG_IPMI_SI=m +CONFIG_IPMI_WATCHDOG=m + +# +# Watchdog Cards +# +CONFIG_WATCHDOG=y +# CONFIG_WATCHDOG_NOWAYOUT is not set + +# +# Watchdog Device Drivers +# +CONFIG_SOFT_WATCHDOG=m +CONFIG_ACQUIRE_WDT=m +CONFIG_ADVANTECH_WDT=m +CONFIG_ALIM1535_WDT=m +CONFIG_ALIM7101_WDT=m +CONFIG_SC520_WDT=m +CONFIG_EUROTECH_WDT=m +CONFIG_IB700_WDT=m +CONFIG_WAFER_WDT=m +CONFIG_I8XX_TCO=m +CONFIG_SC1200_WDT=m +CONFIG_SCx200_WDT=m +CONFIG_60XX_WDT=m +CONFIG_CPU5_WDT=m +CONFIG_W83627HF_WDT=m +CONFIG_W83877F_WDT=m +CONFIG_MACHZ_WDT=m + +# +# PCI-based Watchdog Cards +# +CONFIG_PCIPCWATCHDOG=m +CONFIG_WDTPCI=m +CONFIG_WDT_501_PCI=y + +# +# USB-based Watchdog Cards +# +CONFIG_USBPCWATCHDOG=m +CONFIG_HW_RANDOM=m +CONFIG_NVRAM=m +CONFIG_RTC=m +CONFIG_GEN_RTC=m +CONFIG_GEN_RTC_X=y +CONFIG_DTLK=m +CONFIG_R3964=m +CONFIG_APPLICOM=m + +# +# Ftape, the floppy tape device driver +# +CONFIG_AGP=y +CONFIG_AGP_AMD64=y +# CONFIG_AGP_INTEL_MCH is not set +CONFIG_DRM=y +CONFIG_DRM_TDFX=m +CONFIG_DRM_GAMMA=m +CONFIG_DRM_R128=m +CONFIG_DRM_RADEON=m +CONFIG_DRM_SIS=m + +# +# PCMCIA character devices +# +CONFIG_SYNCLINK_CS=m +CONFIG_MWAVE=m +CONFIG_RAW_DRIVER=m +CONFIG_HPET=y +# CONFIG_HPET_RTC_IRQ is not set +CONFIG_HPET_MMAP=y +CONFIG_MAX_RAW_DEVS=256 +CONFIG_HANGCHECK_TIMER=m + +# +# I2C support +# +CONFIG_I2C=m +CONFIG_I2C_CHARDEV=m + +# +# I2C Algorithms +# +CONFIG_I2C_ALGOBIT=m +CONFIG_I2C_ALGOPCF=m + +# +# I2C Hardware Bus support +# +CONFIG_I2C_ALI1535=m +CONFIG_I2C_ALI1563=m +CONFIG_I2C_ALI15X3=m +CONFIG_I2C_AMD756=m +CONFIG_I2C_AMD8111=m +CONFIG_I2C_I801=m +CONFIG_I2C_I810=m +CONFIG_I2C_ISA=m +CONFIG_I2C_NFORCE2=m +CONFIG_I2C_PARPORT=m +CONFIG_I2C_PARPORT_LIGHT=m +CONFIG_I2C_PROSAVAGE=m +CONFIG_I2C_SAVAGE4=m +CONFIG_SCx200_ACB=m +CONFIG_I2C_SIS5595=m +CONFIG_I2C_SIS630=m +CONFIG_I2C_SIS96X=m +CONFIG_I2C_VIA=m +CONFIG_I2C_VIAPRO=m +CONFIG_I2C_VOODOO3=m + +# +# Hardware Sensors Chip support +# +CONFIG_I2C_SENSOR=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM1025=m +CONFIG_SENSORS_ADM1031=m +CONFIG_SENSORS_ASB100=m +CONFIG_SENSORS_DS1621=m +CONFIG_SENSORS_FSCHER=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_IT87=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM77=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_LM83=m +CONFIG_SENSORS_LM85=m +CONFIG_SENSORS_LM90=m +CONFIG_SENSORS_MAX1619=m +CONFIG_SENSORS_VIA686A=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_W83L785TS=m +CONFIG_SENSORS_W83627HF=m + +# +# Other I2C Chip support +# +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_PCF8574=m +CONFIG_SENSORS_PCF8591=m +CONFIG_SENSORS_RTC8564=m +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set + +# +# Dallas's 1-wire bus +# +CONFIG_W1=m +CONFIG_W1_MATROX=m +CONFIG_W1_THERM=m + +# +# Misc devices +# +CONFIG_IBM_ASM=m + +# +# Multimedia devices +# +CONFIG_VIDEO_DEV=m + +# +# Video For Linux +# + +# +# Video Adapters +# +CONFIG_VIDEO_BT848=m +CONFIG_VIDEO_BWQCAM=m +CONFIG_VIDEO_CQCAM=m +CONFIG_VIDEO_W9966=m +CONFIG_VIDEO_CPIA=m +CONFIG_VIDEO_CPIA_PP=m +CONFIG_VIDEO_CPIA_USB=m +CONFIG_VIDEO_SAA5246A=m +CONFIG_VIDEO_SAA5249=m +CONFIG_TUNER_3036=m +CONFIG_VIDEO_STRADIS=m +CONFIG_VIDEO_ZORAN=m +CONFIG_VIDEO_ZORAN_BUZ=m +CONFIG_VIDEO_ZORAN_DC10=m +CONFIG_VIDEO_ZORAN_DC30=m +CONFIG_VIDEO_ZORAN_LML33=m +CONFIG_VIDEO_ZORAN_LML33R10=m +CONFIG_VIDEO_SAA7134=m +CONFIG_VIDEO_MXB=m +CONFIG_VIDEO_DPC=m +CONFIG_VIDEO_HEXIUM_ORION=m +CONFIG_VIDEO_HEXIUM_GEMINI=m +CONFIG_VIDEO_CX88=m +CONFIG_VIDEO_OVCAMCHIP=m + +# +# Radio Adapters +# +CONFIG_RADIO_GEMTEK_PCI=m +CONFIG_RADIO_MAXIRADIO=m +CONFIG_RADIO_MAESTRO=m + +# +# Digital Video Broadcasting Devices +# +CONFIG_DVB=y +CONFIG_DVB_CORE=m + +# +# Supported Frontend Modules +# +CONFIG_DVB_TWINHAN_DST=m +CONFIG_DVB_STV0299=m +CONFIG_DVB_SP887X=m +CONFIG_DVB_SP887X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/sc_main.mc" +CONFIG_DVB_ALPS_TDLB7=m +CONFIG_DVB_ALPS_TDMB7=m +CONFIG_DVB_ATMEL_AT76C651=m +CONFIG_DVB_CX24110=m +CONFIG_DVB_GRUNDIG_29504_491=m +CONFIG_DVB_GRUNDIG_29504_401=m +CONFIG_DVB_MT312=m +CONFIG_DVB_VES1820=m +CONFIG_DVB_VES1X93=m +CONFIG_DVB_TDA1004X=m +CONFIG_DVB_TDA1004X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/tda1004x.bin" +CONFIG_DVB_NXT6000=m + +# +# Supported SAA7146 based PCI Adapters +# +CONFIG_DVB_AV7110=m +# CONFIG_DVB_AV7110_OSD is not set +CONFIG_DVB_BUDGET=m +CONFIG_DVB_BUDGET_CI=m +CONFIG_DVB_BUDGET_AV=m +CONFIG_DVB_BUDGET_PATCH=m + +# +# Supported USB Adapters +# +CONFIG_DVB_TTUSB_BUDGET=m +CONFIG_DVB_TTUSB_DEC=m + +# +# Supported FlexCopII (B2C2) Adapters +# +CONFIG_DVB_B2C2_SKYSTAR=m + +# +# Supported BT878 Adapters +# +CONFIG_DVB_BT8XX=m +CONFIG_VIDEO_SAA7146=m +CONFIG_VIDEO_SAA7146_VV=m +CONFIG_VIDEO_VIDEOBUF=m +CONFIG_VIDEO_TUNER=m +CONFIG_VIDEO_BUF=m +CONFIG_VIDEO_BTCX=m +CONFIG_VIDEO_IR=m + +# +# Graphics support +# +CONFIG_FB=y +CONFIG_FB_CIRRUS=m +CONFIG_FB_PM2=m +CONFIG_FB_PM2_FIFO_DISCONNECT=y +CONFIG_FB_CYBER2000=m +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +CONFIG_FB_VGA16=m +CONFIG_FB_VESA=m +CONFIG_VIDEO_SELECT=y +CONFIG_FB_HGA=m +# CONFIG_FB_HGA_ACCEL is not set +CONFIG_FB_RIVA=m +CONFIG_FB_RIVA_I2C=y +CONFIG_FB_RIVA_DEBUG=y +CONFIG_FB_MATROX=m +CONFIG_FB_MATROX_MILLENIUM=y +CONFIG_FB_MATROX_MYSTIQUE=y +CONFIG_FB_MATROX_G450=y +CONFIG_FB_MATROX_G100=y +CONFIG_FB_MATROX_I2C=m +CONFIG_FB_MATROX_MAVEN=m +CONFIG_FB_MATROX_MULTIHEAD=y +CONFIG_FB_RADEON_OLD=m +CONFIG_FB_RADEON=m +CONFIG_FB_RADEON_I2C=y +# CONFIG_FB_RADEON_DEBUG is not set +CONFIG_FB_ATY128=m +CONFIG_FB_ATY=m +CONFIG_FB_ATY_CT=y +CONFIG_FB_ATY_GX=y +CONFIG_FB_ATY_XL_INIT=y +CONFIG_FB_SIS=m +CONFIG_FB_SIS_300=y +CONFIG_FB_SIS_315=y +CONFIG_FB_NEOMAGIC=m +CONFIG_FB_KYRO=m +CONFIG_FB_3DFX=m +# CONFIG_FB_3DFX_ACCEL is not set +CONFIG_FB_VOODOO1=m +CONFIG_FB_TRIDENT=m +# CONFIG_FB_TRIDENT_ACCEL is not set +CONFIG_FB_VIRTUAL=m + +# +# Console display driver support +# +CONFIG_VGA_CONSOLE=y +CONFIG_MDA_CONSOLE=m +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=m +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y + +# +# Logo configuration +# +# CONFIG_LOGO is not set + +# +# Sound +# +CONFIG_SOUND=m + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +CONFIG_SND_HWDEP=m +CONFIG_SND_RAWMIDI=m +CONFIG_SND_SEQUENCER=m +CONFIG_SND_SEQ_DUMMY=m +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=m +CONFIG_SND_PCM_OSS=m +CONFIG_SND_SEQUENCER_OSS=y +CONFIG_SND_BIT32_EMUL=m +CONFIG_SND_RTCTIMER=m +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set + +# +# Generic devices +# +CONFIG_SND_MPU401_UART=m +CONFIG_SND_OPL3_LIB=m +CONFIG_SND_VX_LIB=m +CONFIG_SND_DUMMY=m +CONFIG_SND_VIRMIDI=m +CONFIG_SND_MTPAV=m +CONFIG_SND_SERIAL_U16550=m +CONFIG_SND_MPU401=m + +# +# PCI devices +# +CONFIG_SND_AC97_CODEC=m +CONFIG_SND_ALI5451=m +CONFIG_SND_ATIIXP=m +CONFIG_SND_AU8810=m +CONFIG_SND_AU8820=m +CONFIG_SND_AU8830=m +CONFIG_SND_AZT3328=m +CONFIG_SND_BT87X=m +CONFIG_SND_CS46XX=m +CONFIG_SND_CS46XX_NEW_DSP=y +CONFIG_SND_CS4281=m +CONFIG_SND_EMU10K1=m +CONFIG_SND_KORG1212=m +CONFIG_SND_MIXART=m +CONFIG_SND_NM256=m +CONFIG_SND_RME32=m +CONFIG_SND_RME96=m +CONFIG_SND_RME9652=m +CONFIG_SND_HDSP=m +CONFIG_SND_TRIDENT=m +CONFIG_SND_YMFPCI=m +CONFIG_SND_ALS4000=m +CONFIG_SND_CMIPCI=m +CONFIG_SND_ENS1370=m +CONFIG_SND_ENS1371=m +CONFIG_SND_ES1938=m +CONFIG_SND_ES1968=m +CONFIG_SND_MAESTRO3=m +CONFIG_SND_FM801=m +CONFIG_SND_FM801_TEA575X=m +CONFIG_SND_ICE1712=m +CONFIG_SND_ICE1724=m +CONFIG_SND_INTEL8X0=m +CONFIG_SND_INTEL8X0M=m +CONFIG_SND_SONICVIBES=m +CONFIG_SND_VIA82XX=m +CONFIG_SND_VX222=m + +# +# ALSA USB devices +# +CONFIG_SND_USB_AUDIO=m + +# +# PCMCIA devices +# + +# +# Open Sound System +# +CONFIG_SOUND_PRIME=m +CONFIG_SOUND_BT878=m +CONFIG_SOUND_CMPCI=m +# CONFIG_SOUND_CMPCI_FM is not set +# CONFIG_SOUND_CMPCI_MIDI is not set +CONFIG_SOUND_CMPCI_JOYSTICK=y +CONFIG_SOUND_EMU10K1=m +CONFIG_MIDI_EMU10K1=y +CONFIG_SOUND_FUSION=m +CONFIG_SOUND_CS4281=m +CONFIG_SOUND_ES1370=m +CONFIG_SOUND_ES1371=m +CONFIG_SOUND_ESSSOLO1=m +CONFIG_SOUND_MAESTRO=m +CONFIG_SOUND_MAESTRO3=m +CONFIG_SOUND_ICH=m +CONFIG_SOUND_SONICVIBES=m +CONFIG_SOUND_TRIDENT=m +# CONFIG_SOUND_MSNDCLAS is not set +# CONFIG_SOUND_MSNDPIN is not set +CONFIG_SOUND_VIA82CXXX=m +CONFIG_MIDI_VIA82CXXX=y +CONFIG_SOUND_OSS=m +# CONFIG_SOUND_TRACEINIT is not set +# CONFIG_SOUND_DMAP is not set +# CONFIG_SOUND_AD1816 is not set +CONFIG_SOUND_AD1889=m +CONFIG_SOUND_SGALAXY=m +CONFIG_SOUND_ADLIB=m +CONFIG_SOUND_ACI_MIXER=m +CONFIG_SOUND_CS4232=m +CONFIG_SOUND_SSCAPE=m +CONFIG_SOUND_GUS=m +CONFIG_SOUND_GUS16=y +CONFIG_SOUND_GUSMAX=y +CONFIG_SOUND_VMIDI=m +CONFIG_SOUND_TRIX=m +CONFIG_SOUND_MSS=m +CONFIG_SOUND_MPU401=m +CONFIG_SOUND_NM256=m +CONFIG_SOUND_MAD16=m +CONFIG_MAD16_OLDCARD=y +CONFIG_SOUND_PAS=m +CONFIG_SOUND_PSS=m +CONFIG_PSS_MIXER=y +CONFIG_SOUND_SB=m +# CONFIG_SOUND_AWE32_SYNTH is not set +CONFIG_SOUND_WAVEFRONT=m +CONFIG_SOUND_MAUI=m +CONFIG_SOUND_YM3812=m +CONFIG_SOUND_OPL3SA1=m +CONFIG_SOUND_OPL3SA2=m +CONFIG_SOUND_YMFPCI=m +# CONFIG_SOUND_YMFPCI_LEGACY is not set +CONFIG_SOUND_UART6850=m +CONFIG_SOUND_AEDSP16=m +CONFIG_SC6600=y +CONFIG_SC6600_JOY=y +CONFIG_SC6600_CDROM=4 +CONFIG_SC6600_CDROMBASE=0x0 +# CONFIG_AEDSP16_MSS is not set +# CONFIG_AEDSP16_SBPRO is not set +# CONFIG_AEDSP16_MPU401 is not set +CONFIG_SOUND_TVMIXER=m +CONFIG_SOUND_KAHLUA=m +CONFIG_SOUND_ALI5455=m +CONFIG_SOUND_FORTE=m +CONFIG_SOUND_RME96XX=m +CONFIG_SOUND_AD1980=m + +# +# USB support +# +CONFIG_USB=y +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +CONFIG_USB_BANDWIDTH=y +# CONFIG_USB_DYNAMIC_MINORS is not set + +# +# USB Host Controller Drivers +# +CONFIG_USB_EHCI_HCD=m +# CONFIG_USB_EHCI_SPLIT_ISO is not set +# CONFIG_USB_EHCI_ROOT_HUB_TT is not set +CONFIG_USB_OHCI_HCD=m +CONFIG_USB_UHCI_HCD=m + +# +# USB Device Class drivers +# +CONFIG_USB_AUDIO=m + +# +# USB Bluetooth TTY can only be used with disabled Bluetooth subsystem +# +CONFIG_USB_MIDI=m +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +CONFIG_USB_STORAGE_RW_DETECT=y +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_DPCM=y +CONFIG_USB_STORAGE_HP8200e=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y + +# +# USB Human Interface Devices (HID) +# +CONFIG_USB_HID=m +CONFIG_USB_HIDINPUT=y +# CONFIG_HID_FF is not set +CONFIG_USB_HIDDEV=y + +# +# USB HID Boot Protocol drivers +# +CONFIG_USB_KBD=m +CONFIG_USB_MOUSE=m +CONFIG_USB_AIPTEK=m +CONFIG_USB_WACOM=m +CONFIG_USB_KBTAB=m +CONFIG_USB_POWERMATE=m +CONFIG_USB_MTOUCH=m +CONFIG_USB_EGALAX=m +CONFIG_USB_XPAD=m +CONFIG_USB_ATI_REMOTE=m + +# +# USB Imaging devices +# +CONFIG_USB_MDC800=m +CONFIG_USB_MICROTEK=m +CONFIG_USB_HPUSBSCSI=m + +# +# USB Multimedia devices +# +CONFIG_USB_VICAM=m +CONFIG_USB_DSBR=m +CONFIG_USB_IBMCAM=m +CONFIG_USB_KONICAWC=m +CONFIG_USB_OV511=m +CONFIG_USB_PWC=m +CONFIG_USB_SE401=m +CONFIG_USB_SN9C102=m +CONFIG_USB_STV680=m +CONFIG_USB_W9968CF=m + +# +# USB Network adaptors +# +CONFIG_USB_CATC=m +CONFIG_USB_KAWETH=m +CONFIG_USB_PEGASUS=m +CONFIG_USB_RTL8150=m +CONFIG_USB_USBNET=m + +# +# USB Host-to-Host Cables +# +CONFIG_USB_ALI_M5632=y +CONFIG_USB_AN2720=y +CONFIG_USB_BELKIN=y +CONFIG_USB_GENESYS=y +CONFIG_USB_NET1080=y +CONFIG_USB_PL2301=y + +# +# Intelligent USB Devices/Gadgets +# +CONFIG_USB_ARMLINUX=y +CONFIG_USB_EPSON2888=y +CONFIG_USB_ZAURUS=y +CONFIG_USB_CDCETHER=y + +# +# USB Network Adapters +# +CONFIG_USB_AX8817X=y + +# +# USB port drivers +# +CONFIG_USB_USS720=m + +# +# USB Serial Converter support +# +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_BELKIN=m +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m +CONFIG_USB_SERIAL_EMPEG=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_VISOR=m +CONFIG_USB_SERIAL_IPAQ=m +CONFIG_USB_SERIAL_IR=m +CONFIG_USB_SERIAL_EDGEPORT=m +CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_KEYSPAN_PDA=m +CONFIG_USB_SERIAL_KEYSPAN=m +CONFIG_USB_SERIAL_KLSI=m +CONFIG_USB_SERIAL_KOBIL_SCT=m +CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_SAFE=m +# CONFIG_USB_SERIAL_SAFE_PADDED is not set +CONFIG_USB_SERIAL_CYBERJACK=m +CONFIG_USB_SERIAL_XIRCOM=m +CONFIG_USB_SERIAL_OMNINET=m +CONFIG_USB_EZUSB=y + +# +# USB Miscellaneous drivers +# +CONFIG_USB_TIGL=m +CONFIG_USB_AUERSWALD=m +CONFIG_USB_RIO500=m +CONFIG_USB_LEGOTOWER=m +CONFIG_USB_LCD=m +CONFIG_USB_LED=m +CONFIG_USB_CYTHERM=m +CONFIG_USB_SPEEDTOUCH=m +CONFIG_USB_PHIDGETSERVO=m +CONFIG_USB_TEST=m +CONFIG_USB_EAGLE=m + +# +# USB Gadget Support +# +CONFIG_USB_GADGET=m +CONFIG_USB_GADGET_NET2280=y +CONFIG_USB_NET2280=m +# CONFIG_USB_GADGET_PXA2XX is not set +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_SA1100 is not set +# CONFIG_USB_GADGET_DUMMY_HCD is not set +CONFIG_USB_GADGET_DUALSPEED=y +CONFIG_USB_ZERO=m +CONFIG_USB_ETH=m +CONFIG_USB_ETH_RNDIS=y +CONFIG_USB_GADGETFS=m +CONFIG_USB_FILE_STORAGE=m +# CONFIG_USB_FILE_STORAGE_TEST is not set +CONFIG_USB_G_SERIAL=m + +# +# Firmware Drivers +# +CONFIG_EDD=m + +# +# File systems +# +CONFIG_EXT2_FS=m +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_POSIX_ACL=y +CONFIG_EXT2_FS_SECURITY=y +CONFIG_EXT3_FS=m +CONFIG_EXT3_FS_XATTR=y +CONFIG_EXT3_FS_POSIX_ACL=y +CONFIG_EXT3_FS_SECURITY=y +CONFIG_JBD=m +# CONFIG_JBD_DEBUG is not set +CONFIG_FS_MBCACHE=m +CONFIG_REISERFS_FS=m +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +# CONFIG_REISERFS_FS_XATTR is not set +CONFIG_JFS_FS=m +CONFIG_JFS_POSIX_ACL=y +# CONFIG_JFS_DEBUG is not set +CONFIG_JFS_STATISTICS=y +CONFIG_FS_POSIX_ACL=y +CONFIG_XFS_FS=m +CONFIG_XFS_RT=y +CONFIG_XFS_QUOTA=y +CONFIG_XFS_SECURITY=y +CONFIG_XFS_POSIX_ACL=y +CONFIG_MINIX_FS=m +CONFIG_ROMFS_FS=m +CONFIG_QUOTA=y +CONFIG_QFMT_V1=m +CONFIG_QFMT_V2=m +CONFIG_QUOTACTL=y +CONFIG_AUTOFS_FS=m +CONFIG_AUTOFS4_FS=m + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=m +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_ZISOFS_FS=m +CONFIG_UDF_FS=m +CONFIG_UDF_NLS=y + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +CONFIG_NTFS_FS=m +# CONFIG_NTFS_DEBUG is not set +# CONFIG_NTFS_RW is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_SYSFS=y +CONFIG_DEVFS_FS=y +# CONFIG_DEVFS_MOUNT is not set +# CONFIG_DEVFS_DEBUG is not set +CONFIG_DEVPTS_FS_XATTR=y +CONFIG_DEVPTS_FS_SECURITY=y +CONFIG_TMPFS=y +# CONFIG_HUGETLBFS is not set +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y + +# +# Miscellaneous filesystems +# +CONFIG_ADFS_FS=m +# CONFIG_ADFS_FS_RW is not set +CONFIG_AFFS_FS=m +CONFIG_ASFS_FS=m +# CONFIG_ASFS_RW is not set +CONFIG_HFS_FS=m +CONFIG_HFSPLUS_FS=m +CONFIG_BEFS_FS=m +# CONFIG_BEFS_DEBUG is not set +CONFIG_BFS_FS=m +CONFIG_EFS_FS=m +CONFIG_JFFS_FS=m +CONFIG_JFFS_FS_VERBOSE=0 +CONFIG_JFFS_PROC_FS=y +CONFIG_JFFS2_FS=m +CONFIG_JFFS2_FS_DEBUG=0 +# CONFIG_JFFS2_FS_NAND is not set +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set +CONFIG_JFFS2_ZLIB=y +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +CONFIG_CRAMFS=y +CONFIG_VXFS_FS=m +CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +# CONFIG_QNX4FS_RW is not set +CONFIG_SYSV_FS=m +CONFIG_UFS_FS=m +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=m +CONFIG_NFS_V3=y +CONFIG_NFS_V4=y +CONFIG_NFS_DIRECTIO=y +CONFIG_NFSD=m +CONFIG_NFSD_V3=y +CONFIG_NFSD_V4=y +CONFIG_NFSD_TCP=y +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=m +CONFIG_SUNRPC=m +CONFIG_SUNRPC_GSS=m +CONFIG_RPCSEC_GSS_KRB5=m +CONFIG_SMB_FS=m +# CONFIG_SMB_NLS_DEFAULT is not set +CONFIG_CIFS=m +# CONFIG_CIFS_STATS is not set +# CONFIG_CIFS_XATTR is not set +# CONFIG_CIFS_POSIX is not set +CONFIG_NCP_FS=m +# CONFIG_NCPFS_PACKET_SIGNING is not set +# CONFIG_NCPFS_IOCTL_LOCKING is not set +# CONFIG_NCPFS_STRONG is not set +CONFIG_NCPFS_NFS_NS=y +CONFIG_NCPFS_OS2_NS=y +# CONFIG_NCPFS_SMALLDOS is not set +CONFIG_NCPFS_NLS=y +CONFIG_NCPFS_EXTRAS=y +CONFIG_CODA_FS=m +# CONFIG_CODA_FS_OLD_API is not set +CONFIG_AFS_FS=m +CONFIG_RXRPC=m + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +CONFIG_ACORN_PARTITION=y +CONFIG_ACORN_PARTITION_CUMANA=y +# CONFIG_ACORN_PARTITION_EESOX is not set +CONFIG_ACORN_PARTITION_ICS=y +# CONFIG_ACORN_PARTITION_ADFS is not set +# CONFIG_ACORN_PARTITION_POWERTEC is not set +CONFIG_ACORN_PARTITION_RISCIX=y +CONFIG_OSF_PARTITION=y +CONFIG_AMIGA_PARTITION=y +CONFIG_ATARI_PARTITION=y +CONFIG_MAC_PARTITION=y +CONFIG_MSDOS_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_LDM_PARTITION=y +# CONFIG_LDM_DEBUG is not set +CONFIG_SGI_PARTITION=y +CONFIG_ULTRIX_PARTITION=y +CONFIG_SUN_PARTITION=y +# CONFIG_EFI_PARTITION is not set + +# +# Native Language Support +# +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="cp437" +CONFIG_NLS_CODEPAGE_437=m +CONFIG_NLS_CODEPAGE_737=m +CONFIG_NLS_CODEPAGE_775=m +CONFIG_NLS_CODEPAGE_850=m +CONFIG_NLS_CODEPAGE_852=m +CONFIG_NLS_CODEPAGE_855=m +CONFIG_NLS_CODEPAGE_857=m +CONFIG_NLS_CODEPAGE_860=m +CONFIG_NLS_CODEPAGE_861=m +CONFIG_NLS_CODEPAGE_862=m +CONFIG_NLS_CODEPAGE_863=m +CONFIG_NLS_CODEPAGE_864=m +CONFIG_NLS_CODEPAGE_865=m +CONFIG_NLS_CODEPAGE_866=m +CONFIG_NLS_CODEPAGE_869=m +CONFIG_NLS_CODEPAGE_936=m +CONFIG_NLS_CODEPAGE_950=m +CONFIG_NLS_CODEPAGE_932=m +CONFIG_NLS_CODEPAGE_949=m +CONFIG_NLS_CODEPAGE_874=m +CONFIG_NLS_ISO8859_8=m +CONFIG_NLS_CODEPAGE_1250=m +CONFIG_NLS_CODEPAGE_1251=m +CONFIG_NLS_ASCII=m +CONFIG_NLS_ISO8859_1=m +CONFIG_NLS_ISO8859_2=m +CONFIG_NLS_ISO8859_3=m +CONFIG_NLS_ISO8859_4=m +CONFIG_NLS_ISO8859_5=m +CONFIG_NLS_ISO8859_6=m +CONFIG_NLS_ISO8859_7=m +CONFIG_NLS_ISO8859_9=m +CONFIG_NLS_ISO8859_13=m +CONFIG_NLS_ISO8859_14=m +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_KOI8_R=m +CONFIG_NLS_KOI8_U=m +CONFIG_NLS_UTF8=m + +# +# Profiling support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=m + +# +# Kernel hacking +# +# CONFIG_DEBUG_KERNEL is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_FRAME_POINTER is not set + +# +# Security options +# +CONFIG_SECURITY=y +# CONFIG_SECURITY_NETWORK is not set +CONFIG_SECURITY_CAPABILITIES=m +CONFIG_SECURITY_ROOTPLUG=m +# CONFIG_SECURITY_SELINUX is not set + +# +# Cryptographic options +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_SHA1=m +CONFIG_CRYPTO_SHA256=m +CONFIG_CRYPTO_SHA512=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_KHAZAD=m +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_MICHAEL_MIC=m +CONFIG_CRYPTO_CRC32C=m +CONFIG_CRYPTO_TEST=m + +# +# Library routines +# +CONFIG_CRC_CCITT=m +CONFIG_CRC32=m +CONFIG_LIBCRC32C=m +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=m --- linux-source-2.6.8.1-2.6.8.1.orig/debian/config/amd64/amd64-xeon +++ linux-source-2.6.8.1-2.6.8.1/debian/config/amd64/amd64-xeon @@ -0,0 +1,2444 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_X86_64=y +CONFIG_64BIT=y +CONFIG_X86=y +CONFIG_MMU=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +CONFIG_X86_CMPXCHG=y +CONFIG_EARLY_PRINTK=y +CONFIG_HPET_TIMER=y +# CONFIG_HPET_EMULATE_RTC is not set +CONFIG_GENERIC_ISA_DMA=y + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +CONFIG_CLEAN_COMPILE=y + +# +# General setup +# +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_BSD_PROCESS_ACCT=y +# CONFIG_BSD_PROCESS_ACCT_V3 is not set +CONFIG_SYSCTL=y +# CONFIG_AUDIT is not set +CONFIG_LOG_BUF_SHIFT=15 +CONFIG_HOTPLUG=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_EMBEDDED=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_OBSOLETE_MODPARM=y +CONFIG_MODVERSIONS=y +CONFIG_KMOD=y +CONFIG_STOP_MACHINE=y + +# +# Processor type and features +# +# CONFIG_MK8 is not set +CONFIG_MPSC=y +# CONFIG_GENERIC_CPU is not set +CONFIG_X86_L1_CACHE_BYTES=128 +CONFIG_X86_L1_CACHE_SHIFT=7 +CONFIG_X86_TSC=y +CONFIG_X86_GOOD_APIC=y +CONFIG_MICROCODE=m +CONFIG_X86_MSR=m +CONFIG_X86_CPUID=m +CONFIG_X86_HT=y +CONFIG_X86_HT_DISABLE=y +CONFIG_X86_IO_APIC=y +CONFIG_X86_LOCAL_APIC=y +CONFIG_MTRR=y +CONFIG_SMP=y +# CONFIG_PREEMPT is not set +CONFIG_SCHED_SMT=y +# CONFIG_K8_NUMA is not set +CONFIG_HAVE_DEC_LOCK=y +CONFIG_NR_CPUS=8 +# CONFIG_GART_IOMMU is not set +CONFIG_DUMMY_IOMMU=y +CONFIG_X86_MCE=y + +# +# Power management options +# +CONFIG_PM=y +# CONFIG_SOFTWARE_SUSPEND is not set + +# +# ACPI (Advanced Configuration and Power Interface) Support +# +CONFIG_ACPI=y +CONFIG_ACPI_BOOT=y +CONFIG_ACPI_INTERPRETER=y +CONFIG_ACPI_SLEEP=y +CONFIG_ACPI_SLEEP_PROC_FS=y +CONFIG_ACPI_AC=m +CONFIG_ACPI_BATTERY=m +CONFIG_ACPI_BUTTON=m +CONFIG_ACPI_FAN=m +CONFIG_ACPI_PROCESSOR=m +CONFIG_ACPI_THERMAL=m +CONFIG_ACPI_ASUS=m +CONFIG_ACPI_TOSHIBA=m +# CONFIG_ACPI_DEBUG is not set +CONFIG_ACPI_BUS=y +CONFIG_ACPI_EC=y +CONFIG_ACPI_POWER=y +CONFIG_ACPI_PCI=y +CONFIG_ACPI_SYSTEM=y + +# +# CPU Frequency scaling +# +# CONFIG_CPU_FREQ is not set + +# +# Bus options (PCI etc.) +# +CONFIG_PCI=y +CONFIG_PCI_DIRECT=y +CONFIG_PCI_MMCONFIG=y +# CONFIG_PCI_MSI is not set +CONFIG_PCI_LEGACY_PROC=y +CONFIG_PCI_NAMES=y + +# +# PCMCIA/CardBus support +# +CONFIG_PCMCIA=m +# CONFIG_PCMCIA_DEBUG is not set +CONFIG_YENTA=m +CONFIG_CARDBUS=y +CONFIG_PD6729=m +CONFIG_I82092=m +CONFIG_TCIC=m + +# +# PCI Hotplug Support +# +# CONFIG_HOTPLUG_PCI is not set + +# +# Executable file formats / Emulations +# +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_MISC=m +CONFIG_IA32_EMULATION=y +CONFIG_IA32_AOUT=y +CONFIG_COMPAT=y +CONFIG_SYSVIPC_COMPAT=y +CONFIG_UID16=y + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=m + +# +# Memory Technology Devices (MTD) +# +CONFIG_MTD=m +# CONFIG_MTD_DEBUG is not set +CONFIG_MTD_PARTITIONS=y +CONFIG_MTD_CONCAT=m +CONFIG_MTD_REDBOOT_PARTS=m +# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set +# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set +# CONFIG_MTD_CMDLINE_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=m +CONFIG_MTD_BLOCK=m +CONFIG_MTD_BLOCK_RO=m +CONFIG_FTL=m +CONFIG_NFTL=m +CONFIG_NFTL_RW=y +CONFIG_INFTL=m + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=m +CONFIG_MTD_JEDECPROBE=m +CONFIG_MTD_GEN_PROBE=m +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +CONFIG_MTD_CFI_INTELEXT=m +CONFIG_MTD_CFI_AMDSTD=m +CONFIG_MTD_CFI_AMDSTD_RETRY=0 +CONFIG_MTD_CFI_STAA=m +CONFIG_MTD_CFI_UTIL=m +CONFIG_MTD_RAM=m +CONFIG_MTD_ROM=m +CONFIG_MTD_ABSENT=m + +# +# Mapping drivers for chip access +# +CONFIG_MTD_COMPLEX_MAPPINGS=y +CONFIG_MTD_PHYSMAP=m +CONFIG_MTD_PHYSMAP_START=0x8000000 +CONFIG_MTD_PHYSMAP_LEN=0x4000000 +CONFIG_MTD_PHYSMAP_BANKWIDTH=2 +CONFIG_MTD_PNC2000=m +CONFIG_MTD_SC520CDP=m +CONFIG_MTD_NETSC520=m +CONFIG_MTD_SBC_GXX=m +CONFIG_MTD_ELAN_104NC=m +CONFIG_MTD_SCx200_DOCFLASH=m +# CONFIG_MTD_AMD76XROM is not set +# CONFIG_MTD_ICHXROM is not set +# CONFIG_MTD_SCB2_FLASH is not set +CONFIG_MTD_NETtel=m +CONFIG_MTD_DILNETPC=m +CONFIG_MTD_DILNETPC_BOOTSIZE=0x80000 +# CONFIG_MTD_L440GX is not set +CONFIG_MTD_PCI=m + +# +# Self-contained MTD device drivers +# +CONFIG_MTD_PMC551=m +# CONFIG_MTD_PMC551_BUGFIX is not set +# CONFIG_MTD_PMC551_DEBUG is not set +CONFIG_MTD_SLRAM=m +CONFIG_MTD_PHRAM=m +CONFIG_MTD_MTDRAM=m +CONFIG_MTDRAM_TOTAL_SIZE=4096 +CONFIG_MTDRAM_ERASE_SIZE=128 +CONFIG_MTD_BLKMTD=m + +# +# Disk-On-Chip Device Drivers +# +CONFIG_MTD_DOC2000=m +CONFIG_MTD_DOC2001=m +CONFIG_MTD_DOC2001PLUS=m +CONFIG_MTD_DOCPROBE=m +CONFIG_MTD_DOCECC=m +# CONFIG_MTD_DOCPROBE_ADVANCED is not set +CONFIG_MTD_DOCPROBE_ADDRESS=0 + +# +# NAND Flash Device Drivers +# +CONFIG_MTD_NAND=m +# CONFIG_MTD_NAND_VERIFY_WRITE is not set +CONFIG_MTD_NAND_IDS=m +CONFIG_MTD_NAND_DISKONCHIP=m +# CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set +CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0 +# CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE is not set + +# +# Parallel port support +# +CONFIG_PARPORT=m +CONFIG_PARPORT_PC=m +CONFIG_PARPORT_PC_CML1=m +CONFIG_PARPORT_SERIAL=m +CONFIG_PARPORT_PC_FIFO=y +# CONFIG_PARPORT_PC_SUPERIO is not set +CONFIG_PARPORT_PC_PCMCIA=m +# CONFIG_PARPORT_OTHER is not set +CONFIG_PARPORT_1284=y + +# +# Plug and Play support +# + +# +# Block devices +# +CONFIG_BLK_DEV_FD=m +CONFIG_PARIDE=m +CONFIG_PARIDE_PARPORT=m + +# +# Parallel IDE high-level drivers +# +CONFIG_PARIDE_PD=m +CONFIG_PARIDE_PCD=m +CONFIG_PARIDE_PF=m +CONFIG_PARIDE_PT=m +CONFIG_PARIDE_PG=m + +# +# Parallel IDE protocol modules +# +CONFIG_PARIDE_ATEN=m +CONFIG_PARIDE_BPCK=m +CONFIG_PARIDE_COMM=m +CONFIG_PARIDE_DSTR=m +CONFIG_PARIDE_FIT2=m +CONFIG_PARIDE_FIT3=m +CONFIG_PARIDE_EPAT=m +# CONFIG_PARIDE_EPATC8 is not set +CONFIG_PARIDE_EPIA=m +CONFIG_PARIDE_FRIQ=m +CONFIG_PARIDE_FRPW=m +CONFIG_PARIDE_KBIC=m +CONFIG_PARIDE_KTTI=m +CONFIG_PARIDE_ON20=m +CONFIG_PARIDE_ON26=m +CONFIG_BLK_CPQ_DA=m +CONFIG_BLK_CPQ_CISS_DA=m +CONFIG_CISS_SCSI_TAPE=y +CONFIG_BLK_DEV_DAC960=m +CONFIG_BLK_DEV_UMEM=m +CONFIG_BLK_DEV_LOOP=m +CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_SX8=m +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=65536 +CONFIG_BLK_DEV_INITRD=y +CONFIG_LBD=y + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=m +CONFIG_BLK_DEV_IDE=m + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_IDE_SATA is not set +# CONFIG_BLK_DEV_HD_IDE is not set +CONFIG_BLK_DEV_IDEDISK=m +# CONFIG_IDEDISK_MULTI_MODE is not set +CONFIG_BLK_DEV_IDECS=m +CONFIG_BLK_DEV_IDECD=m +CONFIG_BLK_DEV_IDETAPE=m +CONFIG_BLK_DEV_IDEFLOPPY=m +CONFIG_BLK_DEV_IDESCSI=m +# CONFIG_IDE_TASK_IOCTL is not set +# CONFIG_IDE_TASKFILE_IO is not set + +# +# IDE chipset support/bugfixes +# +CONFIG_IDE_GENERIC=m +CONFIG_BLK_DEV_CMD640=y +# CONFIG_BLK_DEV_CMD640_ENHANCED is not set +CONFIG_BLK_DEV_IDEPCI=y +CONFIG_IDEPCI_SHARE_IRQ=y +# CONFIG_BLK_DEV_OFFBOARD is not set +CONFIG_BLK_DEV_GENERIC=m +CONFIG_BLK_DEV_OPTI621=m +CONFIG_BLK_DEV_RZ1000=m +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +CONFIG_IDEDMA_PCI_AUTO=y +CONFIG_IDEDMA_ONLYDISK=y +CONFIG_BLK_DEV_ADMA=y +CONFIG_BLK_DEV_AEC62XX=m +CONFIG_BLK_DEV_ALI15X3=m +# CONFIG_WDC_ALI15X3 is not set +CONFIG_BLK_DEV_AMD74XX=m +CONFIG_BLK_DEV_ATIIXP=m +CONFIG_BLK_DEV_CMD64X=m +CONFIG_BLK_DEV_TRIFLEX=m +CONFIG_BLK_DEV_CY82C693=m +CONFIG_BLK_DEV_CS5520=m +CONFIG_BLK_DEV_CS5530=m +CONFIG_BLK_DEV_HPT34X=m +# CONFIG_HPT34X_AUTODMA is not set +CONFIG_BLK_DEV_HPT366=m +CONFIG_BLK_DEV_SC1200=m +CONFIG_BLK_DEV_PIIX=m +CONFIG_BLK_DEV_NS87415=m +CONFIG_BLK_DEV_PDC202XX_OLD=m +CONFIG_PDC202XX_BURST=y +CONFIG_BLK_DEV_PDC202XX_NEW=m +CONFIG_PDC202XX_FORCE=y +CONFIG_BLK_DEV_SVWKS=m +CONFIG_BLK_DEV_SIIMAGE=m +CONFIG_BLK_DEV_SIS5513=m +CONFIG_BLK_DEV_SLC90E66=m +CONFIG_BLK_DEV_TRM290=m +CONFIG_BLK_DEV_VIA82CXXX=m +# CONFIG_IDE_ARM is not set +CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_IVB is not set +CONFIG_IDEDMA_AUTO=y +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +CONFIG_SCSI=m +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +CONFIG_CHR_DEV_ST=m +CONFIG_CHR_DEV_OSST=m +CONFIG_BLK_DEV_SR=m +# CONFIG_BLK_DEV_SR_VENDOR is not set +CONFIG_CHR_DEV_SG=m +CONFIG_CHR_DEV_SCH=m + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y + +# +# SCSI Transport Attributes +# +CONFIG_SCSI_SPI_ATTRS=m +CONFIG_SCSI_FC_ATTRS=m + +# +# SCSI low-level drivers +# +CONFIG_BLK_DEV_3W_XXXX_RAID=m +CONFIG_SCSI_3W_9XXX=m +CONFIG_SCSI_ACARD=m +CONFIG_SCSI_AACRAID=m +CONFIG_SCSI_AIC7XXX=m +CONFIG_AIC7XXX_CMDS_PER_DEVICE=8 +CONFIG_AIC7XXX_RESET_DELAY_MS=15000 +# CONFIG_AIC7XXX_BUILD_FIRMWARE is not set +CONFIG_AIC7XXX_DEBUG_ENABLE=y +CONFIG_AIC7XXX_DEBUG_MASK=0 +CONFIG_AIC7XXX_REG_PRETTY_PRINT=y +CONFIG_SCSI_AIC7XXX_OLD=m +CONFIG_SCSI_AIC79XX=m +CONFIG_AIC79XX_CMDS_PER_DEVICE=32 +CONFIG_AIC79XX_RESET_DELAY_MS=15000 +# CONFIG_AIC79XX_BUILD_FIRMWARE is not set +CONFIG_AIC79XX_ENABLE_RD_STRM=y +CONFIG_AIC79XX_DEBUG_ENABLE=y +CONFIG_AIC79XX_DEBUG_MASK=0 +CONFIG_AIC79XX_REG_PRETTY_PRINT=y +CONFIG_SCSI_MEGARAID=m +CONFIG_SCSI_SATA=y +CONFIG_SCSI_SATA_SVW=m +CONFIG_SCSI_ATA_PIIX=m +CONFIG_SCSI_SATA_NV=m +CONFIG_SCSI_SATA_PROMISE=m +CONFIG_SCSI_SATA_SX4=m +CONFIG_SCSI_SATA_SIL=m +CONFIG_SCSI_SATA_SIS=m +CONFIG_SCSI_SATA_VIA=m +CONFIG_SCSI_SATA_VITESSE=m +CONFIG_SCSI_BUSLOGIC=m +# CONFIG_SCSI_OMIT_FLASHPOINT is not set +CONFIG_SCSI_DMX3191D=m +CONFIG_SCSI_EATA=m +CONFIG_SCSI_EATA_TAGGED_QUEUE=y +CONFIG_SCSI_EATA_LINKED_COMMANDS=y +CONFIG_SCSI_EATA_MAX_TAGS=16 +CONFIG_SCSI_EATA_PIO=m +CONFIG_SCSI_FUTURE_DOMAIN=m +CONFIG_SCSI_GDTH=m +CONFIG_SCSI_IPS=m +CONFIG_SCSI_INIA100=m +CONFIG_SCSI_PPA=m +CONFIG_SCSI_IMM=m +# CONFIG_SCSI_IZIP_EPP16 is not set +# CONFIG_SCSI_IZIP_SLOW_CTR is not set +CONFIG_SCSI_SYM53C8XX_2=m +CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 +CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 +CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 +# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set +CONFIG_SCSI_IPR=m +# CONFIG_SCSI_IPR_TRACE is not set +# CONFIG_SCSI_IPR_DUMP is not set +CONFIG_SCSI_QLOGIC_ISP=m +CONFIG_SCSI_QLOGIC_FC=m +CONFIG_SCSI_QLOGIC_FC_FIRMWARE=y +CONFIG_SCSI_QLOGIC_1280=m +CONFIG_SCSI_DC395x=m +CONFIG_SCSI_DC390T=m +CONFIG_SCSI_DEBUG=m + +# +# PCMCIA SCSI adapter support +# +CONFIG_PCMCIA_FDOMAIN=m +CONFIG_PCMCIA_QLOGIC=m +CONFIG_PCMCIA_SYM53C500=m + +# +# Multi-device support (RAID and LVM) +# +CONFIG_MD=y +CONFIG_BLK_DEV_MD=m +CONFIG_MD_LINEAR=m +CONFIG_MD_RAID0=m +CONFIG_MD_RAID1=m +CONFIG_MD_RAID5=m +CONFIG_MD_RAID6=m +CONFIG_MD_MULTIPATH=m +CONFIG_BLK_DEV_DM=m +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=m +CONFIG_DM_MIRROR=m +CONFIG_DM_ZERO=m + +# +# Fusion MPT device support +# +CONFIG_FUSION=m +CONFIG_FUSION_MAX_SGE=40 +CONFIG_FUSION_ISENSE=m +CONFIG_FUSION_CTL=m +CONFIG_FUSION_LAN=m + +# +# IEEE 1394 (FireWire) support +# +CONFIG_IEEE1394=m + +# +# Subsystem Options +# +# CONFIG_IEEE1394_VERBOSEDEBUG is not set +CONFIG_IEEE1394_OUI_DB=y +CONFIG_IEEE1394_EXTRA_CONFIG_ROMS=y +CONFIG_IEEE1394_CONFIG_ROM_IP1394=y + +# +# Device Drivers +# +CONFIG_IEEE1394_PCILYNX=m +CONFIG_IEEE1394_OHCI1394=m + +# +# Protocol Drivers +# +CONFIG_IEEE1394_VIDEO1394=m +CONFIG_IEEE1394_SBP2=m +# CONFIG_IEEE1394_SBP2_PHYS_DMA is not set +CONFIG_IEEE1394_ETH1394=m +CONFIG_IEEE1394_DV1394=m +CONFIG_IEEE1394_RAWIO=m +CONFIG_IEEE1394_CMP=m +CONFIG_IEEE1394_AMDTP=m + +# +# I2O device support +# +CONFIG_I2O=m +CONFIG_I2O_CONFIG=m +CONFIG_I2O_BLOCK=m +CONFIG_I2O_SCSI=m +CONFIG_I2O_PROC=m + +# +# Networking support +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=m +CONFIG_PACKET_MMAP=y +CONFIG_NETLINK_DEV=m +CONFIG_UNIX=m +CONFIG_NET_KEY=m +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_FWMARK=y +CONFIG_IP_ROUTE_NAT=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_TOS=y +CONFIG_IP_ROUTE_VERBOSE=y +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE=m +CONFIG_NET_IPGRE_BROADCAST=y +CONFIG_IP_MROUTE=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +# CONFIG_ARPD is not set +CONFIG_SYN_COOKIES=y +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +CONFIG_INET_IPCOMP=m + +# +# IP: Virtual Server Configuration +# +CONFIG_IP_VS=m +# CONFIG_IP_VS_DEBUG is not set +CONFIG_IP_VS_TAB_BITS=12 + +# +# IPVS transport protocol load balancing support +# +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_PROTO_ESP=y +CONFIG_IP_VS_PROTO_AH=y + +# +# IPVS scheduler +# +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_WRR=m +CONFIG_IP_VS_LC=m +CONFIG_IP_VS_WLC=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m + +# +# IPVS application helper +# +CONFIG_IP_VS_FTP=m +CONFIG_IPV6=m +CONFIG_IPV6_PRIVACY=y +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +CONFIG_INET6_IPCOMP=m +CONFIG_IPV6_TUNNEL=m +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_BRIDGE_NETFILTER=y + +# +# IP: Netfilter Configuration +# +CONFIG_IP_NF_CONNTRACK=m +CONFIG_IP_NF_FTP=m +CONFIG_IP_NF_IRC=m +CONFIG_IP_NF_TFTP=m +CONFIG_IP_NF_AMANDA=m +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_LIMIT=m +CONFIG_IP_NF_MATCH_IPRANGE=m +CONFIG_IP_NF_MATCH_MAC=m +CONFIG_IP_NF_MATCH_PKTTYPE=m +CONFIG_IP_NF_MATCH_MARK=m +CONFIG_IP_NF_MATCH_MULTIPORT=m +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_DSCP=m +CONFIG_IP_NF_MATCH_AH_ESP=m +CONFIG_IP_NF_MATCH_LENGTH=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_TCPMSS=m +CONFIG_IP_NF_MATCH_HELPER=m +CONFIG_IP_NF_MATCH_STATE=m +CONFIG_IP_NF_MATCH_CONNTRACK=m +CONFIG_IP_NF_MATCH_OWNER=m +CONFIG_IP_NF_MATCH_PHYSDEV=m +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_SAME=m +CONFIG_IP_NF_NAT_LOCAL=y +CONFIG_IP_NF_NAT_SNMP_BASIC=m +CONFIG_IP_NF_NAT_IRC=m +CONFIG_IP_NF_NAT_FTP=m +CONFIG_IP_NF_NAT_TFTP=m +CONFIG_IP_NF_NAT_AMANDA=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_DSCP=m +CONFIG_IP_NF_TARGET_MARK=m +CONFIG_IP_NF_TARGET_CLASSIFY=m +CONFIG_IP_NF_TARGET_LOG=m +CONFIG_IP_NF_TARGET_ULOG=m +CONFIG_IP_NF_TARGET_TCPMSS=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +CONFIG_IP_NF_COMPAT_IPCHAINS=m +CONFIG_IP_NF_COMPAT_IPFWADM=m +CONFIG_IP_NF_TARGET_NOTRACK=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_MATCH_ADDRTYPE=m +CONFIG_IP_NF_MATCH_REALM=m + +# +# IPv6: Netfilter Configuration +# +CONFIG_IP6_NF_QUEUE=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MATCH_LIMIT=m +CONFIG_IP6_NF_MATCH_MAC=m +CONFIG_IP6_NF_MATCH_RT=m +CONFIG_IP6_NF_MATCH_OPTS=m +CONFIG_IP6_NF_MATCH_FRAG=m +CONFIG_IP6_NF_MATCH_HL=m +CONFIG_IP6_NF_MATCH_MULTIPORT=m +CONFIG_IP6_NF_MATCH_OWNER=m +CONFIG_IP6_NF_MATCH_MARK=m +CONFIG_IP6_NF_MATCH_IPV6HEADER=m +CONFIG_IP6_NF_MATCH_AHESP=m +CONFIG_IP6_NF_MATCH_LENGTH=m +CONFIG_IP6_NF_MATCH_EUI64=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_LOG=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_TARGET_MARK=m +CONFIG_IP6_NF_RAW=m + +# +# DECnet: Netfilter Configuration +# +CONFIG_DECNET_NF_GRABULATOR=m + +# +# Bridge: Netfilter Configuration +# +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_802_3=m +CONFIG_BRIDGE_EBT_AMONG=m +CONFIG_BRIDGE_EBT_ARP=m +CONFIG_BRIDGE_EBT_IP=m +CONFIG_BRIDGE_EBT_LIMIT=m +CONFIG_BRIDGE_EBT_MARK=m +CONFIG_BRIDGE_EBT_PKTTYPE=m +CONFIG_BRIDGE_EBT_STP=m +CONFIG_BRIDGE_EBT_VLAN=m +CONFIG_BRIDGE_EBT_ARPREPLY=m +CONFIG_BRIDGE_EBT_DNAT=m +CONFIG_BRIDGE_EBT_MARK_T=m +CONFIG_BRIDGE_EBT_REDIRECT=m +CONFIG_BRIDGE_EBT_SNAT=m +CONFIG_BRIDGE_EBT_LOG=m +CONFIG_XFRM=y +CONFIG_XFRM_USER=m + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IP_SCTP=m +# CONFIG_SCTP_DBG_MSG is not set +# CONFIG_SCTP_DBG_OBJCNT is not set +# CONFIG_SCTP_HMAC_NONE is not set +# CONFIG_SCTP_HMAC_SHA1 is not set +CONFIG_SCTP_HMAC_MD5=y +CONFIG_ATM=y +CONFIG_ATM_CLIP=y +# CONFIG_ATM_CLIP_NO_ICMP is not set +CONFIG_ATM_LANE=m +CONFIG_ATM_MPOA=m +CONFIG_ATM_BR2684=m +# CONFIG_ATM_BR2684_IPFILTER is not set +CONFIG_BRIDGE=m +CONFIG_VLAN_8021Q=m +CONFIG_DECNET=m +# CONFIG_DECNET_SIOCGIFCONF is not set +# CONFIG_DECNET_ROUTER is not set +CONFIG_LLC=y +CONFIG_LLC2=m +CONFIG_IPX=m +# CONFIG_IPX_INTERN is not set +CONFIG_ATALK=m +CONFIG_DEV_APPLETALK=y +CONFIG_IPDDP=m +CONFIG_IPDDP_ENCAP=y +CONFIG_IPDDP_DECAP=y +CONFIG_X25=m +CONFIG_LAPB=m +# CONFIG_NET_DIVERT is not set +CONFIG_ECONET=m +CONFIG_ECONET_AUNUDP=y +CONFIG_ECONET_NATIVE=y +CONFIG_WAN_ROUTER=m +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_CLK_JIFFIES=y +# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set +# CONFIG_NET_SCH_CLK_CPU is not set +CONFIG_NET_SCH_CBQ=m +CONFIG_NET_SCH_HTB=m +CONFIG_NET_SCH_HFSC=m +CONFIG_NET_SCH_ATM=m +CONFIG_NET_SCH_PRIO=m +CONFIG_NET_SCH_RED=m +CONFIG_NET_SCH_SFQ=m +CONFIG_NET_SCH_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_NETEM=m +CONFIG_NET_SCH_INGRESS=m +CONFIG_NET_QOS=y +CONFIG_NET_ESTIMATOR=y +CONFIG_NET_CLS=y +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_ROUTE=y +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +# CONFIG_CLS_U32_PERF is not set +# CONFIG_NET_CLS_IND is not set +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +# CONFIG_NET_CLS_ACT is not set +CONFIG_NET_CLS_POLICE=y + +# +# Network testing +# +CONFIG_NET_PKTGEN=m +# CONFIG_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER is not set +CONFIG_HAMRADIO=y + +# +# Packet Radio protocols +# +CONFIG_AX25=m +# CONFIG_AX25_DAMA_SLAVE is not set +CONFIG_NETROM=m +CONFIG_ROSE=m + +# +# AX.25 network device drivers +# +CONFIG_BPQETHER=m +CONFIG_BAYCOM_SER_FDX=m +CONFIG_BAYCOM_SER_HDX=m +CONFIG_BAYCOM_PAR=m +CONFIG_YAM=m +CONFIG_IRDA=m + +# +# IrDA protocols +# +CONFIG_IRLAN=m +CONFIG_IRNET=m +CONFIG_IRCOMM=m +# CONFIG_IRDA_ULTRA is not set + +# +# IrDA options +# +CONFIG_IRDA_CACHE_LAST_LSAP=y +CONFIG_IRDA_FAST_RR=y +CONFIG_IRDA_DEBUG=y + +# +# Infrared-port device drivers +# + +# +# SIR device drivers +# +CONFIG_IRTTY_SIR=m + +# +# Dongle support +# +CONFIG_DONGLE=y +CONFIG_ESI_DONGLE=m +CONFIG_ACTISYS_DONGLE=m +CONFIG_TEKRAM_DONGLE=m +CONFIG_LITELINK_DONGLE=m +CONFIG_MA600_DONGLE=m +CONFIG_GIRBIL_DONGLE=m +CONFIG_MCP2120_DONGLE=m +CONFIG_OLD_BELKIN_DONGLE=m +CONFIG_ACT200L_DONGLE=m + +# +# Old SIR device drivers +# + +# +# Old Serial dongle support +# + +# +# FIR device drivers +# +CONFIG_USB_IRDA=m +CONFIG_SIGMATEL_FIR=m +CONFIG_VLSI_FIR=m +CONFIG_BT=m +CONFIG_BT_L2CAP=m +CONFIG_BT_SCO=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_CMTP=m +CONFIG_BT_HIDP=m + +# +# Bluetooth device drivers +# +CONFIG_BT_HCIUSB=m +CONFIG_BT_HCIUSB_SCO=y +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_H4=y +CONFIG_BT_HCIUART_BCSP=y +# CONFIG_BT_HCIUART_BCSP_TXCRC is not set +CONFIG_BT_HCIBCM203X=m +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIDTL1=m +CONFIG_BT_HCIBT3C=m +CONFIG_BT_HCIBLUECARD=m +CONFIG_BT_HCIBTUART=m +CONFIG_BT_HCIVHCI=m +CONFIG_NETDEVICES=y +CONFIG_DUMMY=m +CONFIG_BONDING=m +CONFIG_EQUALIZER=m +CONFIG_TUN=m +CONFIG_ETHERTAP=m + +# +# ARCnet devices +# +CONFIG_ARCNET=m +CONFIG_ARCNET_1201=m +CONFIG_ARCNET_1051=m +CONFIG_ARCNET_RAW=m +CONFIG_ARCNET_COM90xx=m +CONFIG_ARCNET_COM90xxIO=m +CONFIG_ARCNET_RIM_I=m +CONFIG_ARCNET_COM20020=m +CONFIG_ARCNET_COM20020_PCI=m + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=m +CONFIG_HAPPYMEAL=m +CONFIG_SUNGEM=m +CONFIG_NET_VENDOR_3COM=y +CONFIG_VORTEX=m +CONFIG_TYPHOON=m + +# +# Tulip family network device support +# +CONFIG_NET_TULIP=y +CONFIG_DE2104X=m +CONFIG_TULIP=m +# CONFIG_TULIP_MWI is not set +# CONFIG_TULIP_MMIO is not set +# CONFIG_TULIP_NAPI is not set +CONFIG_DE4X5=m +CONFIG_WINBOND_840=m +CONFIG_DM9102=m +CONFIG_PCMCIA_XIRCOM=m +CONFIG_HP100=m +CONFIG_NET_PCI=y +CONFIG_PCNET32=m +CONFIG_AMD8111_ETH=m +# CONFIG_AMD8111E_NAPI is not set +CONFIG_ADAPTEC_STARFIRE=m +# CONFIG_ADAPTEC_STARFIRE_NAPI is not set +CONFIG_B44=m +CONFIG_FORCEDETH=m +CONFIG_EEPRO100=m +# CONFIG_EEPRO100_PIO is not set +CONFIG_E100=m +# CONFIG_E100_NAPI is not set +CONFIG_FEALNX=m +CONFIG_NATSEMI=m +CONFIG_NE2K_PCI=m +CONFIG_8139CP=m +CONFIG_8139TOO=m +# CONFIG_8139TOO_PIO is not set +CONFIG_8139TOO_TUNE_TWISTER=y +CONFIG_8139TOO_8129=y +# CONFIG_8139_OLD_RX_RESET is not set +CONFIG_SIS900=m +CONFIG_EPIC100=m +CONFIG_SUNDANCE=m +# CONFIG_SUNDANCE_MMIO is not set +CONFIG_VIA_RHINE=m +# CONFIG_VIA_RHINE_MMIO is not set +CONFIG_VIA_VELOCITY=m + +# +# Ethernet (1000 Mbit) +# +CONFIG_DL2K=m +CONFIG_E1000=m +# CONFIG_E1000_NAPI is not set +CONFIG_NS83820=m +CONFIG_HAMACHI=m +CONFIG_YELLOWFIN=m +CONFIG_R8169=m +CONFIG_SK98LIN=m +CONFIG_TIGON3=m + +# +# Ethernet (10000 Mbit) +# +CONFIG_IXGB=m +# CONFIG_IXGB_NAPI is not set +CONFIG_S2IO=m +# CONFIG_S2IO_NAPI is not set + +# +# Token Ring devices +# +CONFIG_TR=y +CONFIG_IBMOL=m +CONFIG_3C359=m +CONFIG_TMS380TR=m +CONFIG_TMSPCI=m +CONFIG_ABYSS=m + +# +# Wireless LAN (non-hamradio) +# +CONFIG_NET_RADIO=y + +# +# Obsolete Wireless cards support (pre-802.11) +# +CONFIG_STRIP=m +CONFIG_PCMCIA_WAVELAN=m +CONFIG_PCMCIA_NETWAVE=m + +# +# Wireless 802.11 Frequency Hopping cards support +# +CONFIG_PCMCIA_RAYCS=m + +# +# Wireless 802.11b ISA/PCI cards support +# +CONFIG_IEEE80211=m +# CONFIG_IEEE80211_DEBUG is not set +CONFIG_IEEE80211_CRYPT=m +CONFIG_IEEE80211_WPA=y +CONFIG_IEEE80211_CRYPT_CCMP=m +CONFIG_IEEE80211_CRYPT_TKIP=m +CONFIG_IPW2100=m +# CONFIG_IPW2100_PROMISC is not set +# CONFIG_IPW2100_LEGACY_FW_LOAD is not set +# CONFIG_IPW2100_NOWEP is not set +# CONFIG_IPW2100_DEBUG is not set +CONFIG_IPW2200=m +# CONFIG_IPW2200_NOWEP is not set +CONFIG_WLAN_NG=m +CONFIG_PRISM2=m +CONFIG_PRISM2_USB=m +CONFIG_ACX100=m +CONFIG_ADM8211=m +CONFIG_HERMES=m +CONFIG_PLX_HERMES=m +CONFIG_TMD_HERMES=m +CONFIG_PCI_HERMES=m +CONFIG_ATMEL=m +CONFIG_PCI_ATMEL=m + +# +# Wireless 802.11b Pcmcia/Cardbus cards support +# +CONFIG_PCMCIA_HERMES=m +CONFIG_AIRO_CS=m +CONFIG_PCMCIA_ATMEL=m +CONFIG_PCMCIA_WL3501=m + +# +# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support +# +CONFIG_PRISM54=m +CONFIG_NET_WIRELESS=y + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +CONFIG_PCMCIA_3C589=m +CONFIG_PCMCIA_3C574=m +CONFIG_PCMCIA_FMVJ18X=m +CONFIG_PCMCIA_PCNET=m +CONFIG_PCMCIA_NMCLAN=m +CONFIG_PCMCIA_SMC91C92=m +CONFIG_PCMCIA_XIRC2PS=m +CONFIG_PCMCIA_AXNET=m +CONFIG_ARCNET_COM20020_CS=m + +# +# Wan interfaces +# +CONFIG_WAN=y +CONFIG_DSCC4=m +CONFIG_DSCC4_PCISYNC=y +CONFIG_DSCC4_PCI_RST=y +CONFIG_LANMEDIA=m +CONFIG_SYNCLINK_SYNCPPP=m +CONFIG_HDLC=m +CONFIG_HDLC_RAW=y +CONFIG_HDLC_RAW_ETH=y +CONFIG_HDLC_CISCO=y +CONFIG_HDLC_FR=y +CONFIG_HDLC_PPP=y +CONFIG_HDLC_X25=y +CONFIG_PCI200SYN=m +CONFIG_WANXL=m +CONFIG_PC300=m +CONFIG_PC300_MLPPP=y +CONFIG_FARSYNC=m +CONFIG_DLCI=m +CONFIG_DLCI_COUNT=24 +CONFIG_DLCI_MAX=8 +CONFIG_WAN_ROUTER_DRIVERS=y +CONFIG_CYCLADES_SYNC=m +CONFIG_CYCLOMX_X25=y +CONFIG_LAPBETHER=m +CONFIG_X25_ASY=m +CONFIG_SBNI=m +# CONFIG_SBNI_MULTILINE is not set + +# +# ATM drivers +# +CONFIG_ATM_TCP=m +CONFIG_ATM_LANAI=m +CONFIG_ATM_ENI=m +# CONFIG_ATM_ENI_DEBUG is not set +# CONFIG_ATM_ENI_TUNE_BURST is not set +CONFIG_ATM_FIRESTREAM=m +CONFIG_ATM_ZATM=m +# CONFIG_ATM_ZATM_DEBUG is not set +CONFIG_ATM_IDT77252=m +# CONFIG_ATM_IDT77252_DEBUG is not set +# CONFIG_ATM_IDT77252_RCV_ALL is not set +CONFIG_ATM_IDT77252_USE_SUNI=y +CONFIG_ATM_AMBASSADOR=m +# CONFIG_ATM_AMBASSADOR_DEBUG is not set +CONFIG_ATM_HORIZON=m +# CONFIG_ATM_HORIZON_DEBUG is not set +CONFIG_ATM_FORE200E_MAYBE=m +CONFIG_ATM_FORE200E_PCA=y +CONFIG_ATM_FORE200E_PCA_DEFAULT_FW=y +# CONFIG_ATM_FORE200E_USE_TASKLET is not set +CONFIG_ATM_FORE200E_TX_RETRY=16 +CONFIG_ATM_FORE200E_DEBUG=0 +CONFIG_ATM_FORE200E=m +CONFIG_ATM_HE=m +CONFIG_ATM_HE_USE_SUNI=y +CONFIG_FDDI=y +# CONFIG_DEFXX is not set +CONFIG_SKFP=m +CONFIG_HIPPI=y +CONFIG_ROADRUNNER=m +# CONFIG_ROADRUNNER_LARGE_RINGS is not set +CONFIG_PLIP=m +CONFIG_PPP=m +CONFIG_PPP_MULTILINK=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_MPPE=m +CONFIG_PPPOE=m +CONFIG_PPPOATM=m +CONFIG_SLIP=m +CONFIG_SLIP_COMPRESSED=y +CONFIG_SLIP_SMART=y +# CONFIG_SLIP_MODE_SLIP6 is not set +CONFIG_NET_FC=y +CONFIG_SHAPER=m +# CONFIG_NETCONSOLE is not set +# CONFIG_NDISWRAPPER is not set + +# +# ISDN subsystem +# +CONFIG_ISDN=m + +# +# Old ISDN4Linux +# +CONFIG_ISDN_I4L=m +CONFIG_ISDN_PPP=y +CONFIG_ISDN_PPP_VJ=y +CONFIG_ISDN_MPP=y +CONFIG_IPPP_FILTER=y +CONFIG_ISDN_PPP_BSDCOMP=m +CONFIG_ISDN_AUDIO=y +CONFIG_ISDN_TTY_FAX=y +CONFIG_ISDN_X25=y + +# +# ISDN feature submodules +# + +# +# ISDN4Linux hardware drivers +# + +# +# Passive cards +# +CONFIG_ISDN_DRV_HISAX=m + +# +# D-channel protocol features +# +CONFIG_HISAX_EURO=y +CONFIG_DE_AOC=y +# CONFIG_HISAX_NO_SENDCOMPLETE is not set +# CONFIG_HISAX_NO_LLC is not set +# CONFIG_HISAX_NO_KEYPAD is not set +CONFIG_HISAX_1TR6=y +CONFIG_HISAX_NI1=y +CONFIG_HISAX_MAX_CARDS=8 + +# +# HiSax supported cards +# +CONFIG_HISAX_16_3=y +CONFIG_HISAX_TELESPCI=y +CONFIG_HISAX_S0BOX=y +CONFIG_HISAX_FRITZPCI=y +CONFIG_HISAX_AVM_A1_PCMCIA=y +CONFIG_HISAX_ELSA=y +CONFIG_HISAX_DIEHLDIVA=y +CONFIG_HISAX_SEDLBAUER=y +CONFIG_HISAX_NETJET=y +CONFIG_HISAX_NETJET_U=y +CONFIG_HISAX_NICCY=y +CONFIG_HISAX_BKM_A4T=y +CONFIG_HISAX_SCT_QUADRO=y +CONFIG_HISAX_GAZEL=y +CONFIG_HISAX_HFC_PCI=y +CONFIG_HISAX_W6692=y +CONFIG_HISAX_HFC_SX=y +CONFIG_HISAX_ENTERNOW_PCI=y +# CONFIG_HISAX_DEBUG is not set + +# +# HiSax PCMCIA card service modules +# +CONFIG_HISAX_SEDLBAUER_CS=m +CONFIG_HISAX_ELSA_CS=m +CONFIG_HISAX_AVM_A1_CS=m +CONFIG_HISAX_TELES_CS=m + +# +# HiSax sub driver modules +# +CONFIG_HISAX_ST5481=m +CONFIG_HISAX_HFCUSB=m +CONFIG_HISAX_FRITZ_PCIPNP=m +CONFIG_HISAX_HDLC=y + +# +# Active cards +# +CONFIG_ISDN_DRV_TPAM=m + +# +# CAPI subsystem +# +CONFIG_ISDN_CAPI=m +CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON=y +CONFIG_ISDN_CAPI_MIDDLEWARE=y +CONFIG_ISDN_CAPI_CAPI20=m +CONFIG_ISDN_CAPI_CAPIFS_BOOL=y +CONFIG_ISDN_CAPI_CAPIFS=m +CONFIG_ISDN_CAPI_CAPIDRV=m + +# +# CAPI hardware drivers +# + +# +# Active AVM cards +# +CONFIG_CAPI_AVM=y + +# +# Active Eicon DIVA Server cards +# +CONFIG_CAPI_EICON=y +CONFIG_ISDN_DIVAS=m +CONFIG_ISDN_DIVAS_BRIPCI=y +CONFIG_ISDN_DIVAS_PRIPCI=y +CONFIG_ISDN_DIVAS_DIVACAPI=m +CONFIG_ISDN_DIVAS_USERIDI=m +CONFIG_ISDN_DIVAS_MAINT=m + +# +# Modular ISDN driver +# +CONFIG_MISDN_DRV=m +# CONFIG_MISDN_MEMDEBUG is not set +CONFIG_MISDN_AVM_FRITZ=y +CONFIG_MISDN_HFCPCI=y +CONFIG_MISDN_HFCMULTI=y +CONFIG_MISDN_SPEEDFAX=y +CONFIG_MISDN_W6692=y +CONFIG_MISDN_DSP=y + +# +# Telephony Support +# +CONFIG_PHONE=m +CONFIG_PHONE_IXJ=m +CONFIG_PHONE_IXJ_PCMCIA=m + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=m +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_MOUSEDEV_PSAUX_ENABLE=y +CONFIG_INPUT_JOYDEV=m +CONFIG_INPUT_TSDEV=m +CONFIG_INPUT_TSDEV_SCREEN_X=240 +CONFIG_INPUT_TSDEV_SCREEN_Y=320 +CONFIG_INPUT_EVDEV=m +CONFIG_INPUT_EVBUG=m + +# +# Input I/O drivers +# +CONFIG_GAMEPORT=m +CONFIG_SOUND_GAMEPORT=m +CONFIG_GAMEPORT_NS558=m +CONFIG_GAMEPORT_L4=m +CONFIG_GAMEPORT_EMU10K1=m +CONFIG_GAMEPORT_VORTEX=m +CONFIG_GAMEPORT_FM801=m +CONFIG_GAMEPORT_CS461x=m +CONFIG_SERIO=y +CONFIG_SERIO_I8042=y +CONFIG_SERIO_SERPORT=m +CONFIG_SERIO_CT82C710=m +CONFIG_SERIO_PARKBD=m +CONFIG_SERIO_PCIPS2=m + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=y +CONFIG_KEYBOARD_SUNKBD=m +# CONFIG_KEYBOARD_LKKBD is not set +CONFIG_KEYBOARD_XTKBD=m +CONFIG_KEYBOARD_NEWTON=m +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=m +CONFIG_MOUSE_SERIAL=m +# CONFIG_MOUSE_VSXXXAA is not set +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_ANALOG=m +CONFIG_JOYSTICK_A3D=m +CONFIG_JOYSTICK_ADI=m +CONFIG_JOYSTICK_COBRA=m +CONFIG_JOYSTICK_GF2K=m +CONFIG_JOYSTICK_GRIP=m +CONFIG_JOYSTICK_GRIP_MP=m +CONFIG_JOYSTICK_GUILLEMOT=m +CONFIG_JOYSTICK_INTERACT=m +CONFIG_JOYSTICK_SIDEWINDER=m +CONFIG_JOYSTICK_TMDC=m +CONFIG_JOYSTICK_IFORCE=m +CONFIG_JOYSTICK_IFORCE_USB=y +CONFIG_JOYSTICK_IFORCE_232=y +CONFIG_JOYSTICK_WARRIOR=m +CONFIG_JOYSTICK_MAGELLAN=m +CONFIG_JOYSTICK_SPACEORB=m +CONFIG_JOYSTICK_SPACEBALL=m +CONFIG_JOYSTICK_STINGER=m +CONFIG_JOYSTICK_TWIDDLER=m +CONFIG_JOYSTICK_DB9=m +CONFIG_JOYSTICK_GAMECON=m +CONFIG_JOYSTICK_TURBOGRAFX=m +CONFIG_INPUT_JOYDUMP=m +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_GUNZE=m +CONFIG_INPUT_MISC=y +CONFIG_INPUT_PCSPKR=m +CONFIG_INPUT_UINPUT=m + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +CONFIG_SERIAL_NONSTANDARD=y +CONFIG_ROCKETPORT=m +CONFIG_CYCLADES=m +# CONFIG_CYZ_INTR is not set +CONFIG_SYNCLINK=m +CONFIG_SYNCLINKMP=m +CONFIG_N_HDLC=m +CONFIG_STALDRV=y + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_CS=m +# CONFIG_SERIAL_8250_ACPI is not set +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_MANY_PORTS=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +CONFIG_SERIAL_8250_MULTIPORT=y +CONFIG_SERIAL_8250_RSA=y + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=256 +CONFIG_PRINTER=m +# CONFIG_LP_CONSOLE is not set +CONFIG_PPDEV=m +CONFIG_TIPAR=m +CONFIG_QIC02_TAPE=m +CONFIG_QIC02_DYNCONF=y + +# +# Setting runtime QIC-02 configuration is done with qic02conf +# + +# +# from the tpqic02-support package. It is available at +# + +# +# metalab.unc.edu or ftp://titus.cfw.com/pub/Linux/util/ +# + +# +# IPMI +# +CONFIG_IPMI_HANDLER=m +# CONFIG_IPMI_PANIC_EVENT is not set +CONFIG_IPMI_DEVICE_INTERFACE=m +CONFIG_IPMI_SI=m +CONFIG_IPMI_WATCHDOG=m + +# +# Watchdog Cards +# +CONFIG_WATCHDOG=y +# CONFIG_WATCHDOG_NOWAYOUT is not set + +# +# Watchdog Device Drivers +# +CONFIG_SOFT_WATCHDOG=m +CONFIG_ACQUIRE_WDT=m +CONFIG_ADVANTECH_WDT=m +CONFIG_ALIM1535_WDT=m +CONFIG_ALIM7101_WDT=m +CONFIG_SC520_WDT=m +CONFIG_EUROTECH_WDT=m +CONFIG_IB700_WDT=m +CONFIG_WAFER_WDT=m +CONFIG_I8XX_TCO=m +CONFIG_SC1200_WDT=m +CONFIG_SCx200_WDT=m +CONFIG_60XX_WDT=m +CONFIG_CPU5_WDT=m +CONFIG_W83627HF_WDT=m +CONFIG_W83877F_WDT=m +CONFIG_MACHZ_WDT=m + +# +# PCI-based Watchdog Cards +# +CONFIG_PCIPCWATCHDOG=m +CONFIG_WDTPCI=m +CONFIG_WDT_501_PCI=y + +# +# USB-based Watchdog Cards +# +CONFIG_USBPCWATCHDOG=m +CONFIG_HW_RANDOM=m +CONFIG_NVRAM=m +CONFIG_RTC=m +CONFIG_GEN_RTC=m +CONFIG_GEN_RTC_X=y +CONFIG_DTLK=m +CONFIG_R3964=m +CONFIG_APPLICOM=m + +# +# Ftape, the floppy tape device driver +# +CONFIG_AGP=m +# CONFIG_AGP_AMD64 is not set +CONFIG_AGP_INTEL_MCH=m +CONFIG_DRM=y +CONFIG_DRM_TDFX=m +CONFIG_DRM_GAMMA=m +CONFIG_DRM_R128=m +CONFIG_DRM_RADEON=m +CONFIG_DRM_SIS=m + +# +# PCMCIA character devices +# +CONFIG_SYNCLINK_CS=m +CONFIG_MWAVE=m +CONFIG_RAW_DRIVER=m +CONFIG_HPET=y +# CONFIG_HPET_RTC_IRQ is not set +CONFIG_HPET_MMAP=y +CONFIG_MAX_RAW_DEVS=256 +CONFIG_HANGCHECK_TIMER=m + +# +# I2C support +# +CONFIG_I2C=m +CONFIG_I2C_CHARDEV=m + +# +# I2C Algorithms +# +CONFIG_I2C_ALGOBIT=m +CONFIG_I2C_ALGOPCF=m + +# +# I2C Hardware Bus support +# +CONFIG_I2C_ALI1535=m +CONFIG_I2C_ALI1563=m +CONFIG_I2C_ALI15X3=m +CONFIG_I2C_AMD756=m +CONFIG_I2C_AMD8111=m +CONFIG_I2C_I801=m +CONFIG_I2C_I810=m +CONFIG_I2C_ISA=m +CONFIG_I2C_NFORCE2=m +CONFIG_I2C_PARPORT=m +CONFIG_I2C_PARPORT_LIGHT=m +CONFIG_I2C_PROSAVAGE=m +CONFIG_I2C_SAVAGE4=m +CONFIG_SCx200_ACB=m +CONFIG_I2C_SIS5595=m +CONFIG_I2C_SIS630=m +CONFIG_I2C_SIS96X=m +CONFIG_I2C_VIA=m +CONFIG_I2C_VIAPRO=m +CONFIG_I2C_VOODOO3=m + +# +# Hardware Sensors Chip support +# +CONFIG_I2C_SENSOR=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM1025=m +CONFIG_SENSORS_ADM1031=m +CONFIG_SENSORS_ASB100=m +CONFIG_SENSORS_DS1621=m +CONFIG_SENSORS_FSCHER=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_IT87=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM77=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_LM83=m +CONFIG_SENSORS_LM85=m +CONFIG_SENSORS_LM90=m +CONFIG_SENSORS_MAX1619=m +CONFIG_SENSORS_VIA686A=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_W83L785TS=m +CONFIG_SENSORS_W83627HF=m + +# +# Other I2C Chip support +# +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_PCF8574=m +CONFIG_SENSORS_PCF8591=m +CONFIG_SENSORS_RTC8564=m +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set + +# +# Dallas's 1-wire bus +# +CONFIG_W1=m +CONFIG_W1_MATROX=m +CONFIG_W1_THERM=m + +# +# Misc devices +# +CONFIG_IBM_ASM=m + +# +# Multimedia devices +# +CONFIG_VIDEO_DEV=m + +# +# Video For Linux +# + +# +# Video Adapters +# +CONFIG_VIDEO_BT848=m +CONFIG_VIDEO_BWQCAM=m +CONFIG_VIDEO_CQCAM=m +CONFIG_VIDEO_W9966=m +CONFIG_VIDEO_CPIA=m +CONFIG_VIDEO_CPIA_PP=m +CONFIG_VIDEO_CPIA_USB=m +CONFIG_VIDEO_SAA5246A=m +CONFIG_VIDEO_SAA5249=m +CONFIG_TUNER_3036=m +CONFIG_VIDEO_STRADIS=m +CONFIG_VIDEO_ZORAN=m +CONFIG_VIDEO_ZORAN_BUZ=m +CONFIG_VIDEO_ZORAN_DC10=m +CONFIG_VIDEO_ZORAN_DC30=m +CONFIG_VIDEO_ZORAN_LML33=m +CONFIG_VIDEO_ZORAN_LML33R10=m +CONFIG_VIDEO_SAA7134=m +CONFIG_VIDEO_MXB=m +CONFIG_VIDEO_DPC=m +CONFIG_VIDEO_HEXIUM_ORION=m +CONFIG_VIDEO_HEXIUM_GEMINI=m +CONFIG_VIDEO_CX88=m +CONFIG_VIDEO_OVCAMCHIP=m + +# +# Radio Adapters +# +CONFIG_RADIO_GEMTEK_PCI=m +CONFIG_RADIO_MAXIRADIO=m +CONFIG_RADIO_MAESTRO=m + +# +# Digital Video Broadcasting Devices +# +CONFIG_DVB=y +CONFIG_DVB_CORE=m + +# +# Supported Frontend Modules +# +CONFIG_DVB_TWINHAN_DST=m +CONFIG_DVB_STV0299=m +CONFIG_DVB_SP887X=m +CONFIG_DVB_SP887X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/sc_main.mc" +CONFIG_DVB_ALPS_TDLB7=m +CONFIG_DVB_ALPS_TDMB7=m +CONFIG_DVB_ATMEL_AT76C651=m +CONFIG_DVB_CX24110=m +CONFIG_DVB_GRUNDIG_29504_491=m +CONFIG_DVB_GRUNDIG_29504_401=m +CONFIG_DVB_MT312=m +CONFIG_DVB_VES1820=m +CONFIG_DVB_VES1X93=m +CONFIG_DVB_TDA1004X=m +CONFIG_DVB_TDA1004X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/tda1004x.bin" +CONFIG_DVB_NXT6000=m + +# +# Supported SAA7146 based PCI Adapters +# +CONFIG_DVB_AV7110=m +# CONFIG_DVB_AV7110_OSD is not set +CONFIG_DVB_BUDGET=m +CONFIG_DVB_BUDGET_CI=m +CONFIG_DVB_BUDGET_AV=m +CONFIG_DVB_BUDGET_PATCH=m + +# +# Supported USB Adapters +# +CONFIG_DVB_TTUSB_BUDGET=m +CONFIG_DVB_TTUSB_DEC=m + +# +# Supported FlexCopII (B2C2) Adapters +# +CONFIG_DVB_B2C2_SKYSTAR=m + +# +# Supported BT878 Adapters +# +CONFIG_DVB_BT8XX=m +CONFIG_VIDEO_SAA7146=m +CONFIG_VIDEO_SAA7146_VV=m +CONFIG_VIDEO_VIDEOBUF=m +CONFIG_VIDEO_TUNER=m +CONFIG_VIDEO_BUF=m +CONFIG_VIDEO_BTCX=m +CONFIG_VIDEO_IR=m + +# +# Graphics support +# +CONFIG_FB=y +CONFIG_FB_CIRRUS=m +CONFIG_FB_PM2=m +CONFIG_FB_PM2_FIFO_DISCONNECT=y +CONFIG_FB_CYBER2000=m +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +CONFIG_FB_VGA16=m +CONFIG_FB_VESA=m +CONFIG_VIDEO_SELECT=y +CONFIG_FB_HGA=m +# CONFIG_FB_HGA_ACCEL is not set +CONFIG_FB_RIVA=m +CONFIG_FB_RIVA_I2C=y +CONFIG_FB_RIVA_DEBUG=y +CONFIG_FB_MATROX=m +CONFIG_FB_MATROX_MILLENIUM=y +CONFIG_FB_MATROX_MYSTIQUE=y +CONFIG_FB_MATROX_G450=y +CONFIG_FB_MATROX_G100=y +CONFIG_FB_MATROX_I2C=m +CONFIG_FB_MATROX_MAVEN=m +CONFIG_FB_MATROX_MULTIHEAD=y +CONFIG_FB_RADEON_OLD=m +CONFIG_FB_RADEON=m +CONFIG_FB_RADEON_I2C=y +# CONFIG_FB_RADEON_DEBUG is not set +CONFIG_FB_ATY128=m +CONFIG_FB_ATY=m +CONFIG_FB_ATY_CT=y +CONFIG_FB_ATY_GX=y +CONFIG_FB_ATY_XL_INIT=y +CONFIG_FB_SIS=m +CONFIG_FB_SIS_300=y +CONFIG_FB_SIS_315=y +CONFIG_FB_NEOMAGIC=m +CONFIG_FB_KYRO=m +CONFIG_FB_3DFX=m +# CONFIG_FB_3DFX_ACCEL is not set +CONFIG_FB_VOODOO1=m +CONFIG_FB_TRIDENT=m +# CONFIG_FB_TRIDENT_ACCEL is not set +CONFIG_FB_VIRTUAL=m + +# +# Console display driver support +# +CONFIG_VGA_CONSOLE=y +CONFIG_MDA_CONSOLE=m +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=m +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y + +# +# Logo configuration +# +# CONFIG_LOGO is not set + +# +# Sound +# +CONFIG_SOUND=m + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +CONFIG_SND_HWDEP=m +CONFIG_SND_RAWMIDI=m +CONFIG_SND_SEQUENCER=m +CONFIG_SND_SEQ_DUMMY=m +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=m +CONFIG_SND_PCM_OSS=m +CONFIG_SND_SEQUENCER_OSS=y +CONFIG_SND_BIT32_EMUL=m +CONFIG_SND_RTCTIMER=m +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set + +# +# Generic devices +# +CONFIG_SND_MPU401_UART=m +CONFIG_SND_OPL3_LIB=m +CONFIG_SND_VX_LIB=m +CONFIG_SND_DUMMY=m +CONFIG_SND_VIRMIDI=m +CONFIG_SND_MTPAV=m +CONFIG_SND_SERIAL_U16550=m +CONFIG_SND_MPU401=m + +# +# PCI devices +# +CONFIG_SND_AC97_CODEC=m +CONFIG_SND_ALI5451=m +CONFIG_SND_ATIIXP=m +CONFIG_SND_AU8810=m +CONFIG_SND_AU8820=m +CONFIG_SND_AU8830=m +CONFIG_SND_AZT3328=m +CONFIG_SND_BT87X=m +CONFIG_SND_CS46XX=m +CONFIG_SND_CS46XX_NEW_DSP=y +CONFIG_SND_CS4281=m +CONFIG_SND_EMU10K1=m +CONFIG_SND_KORG1212=m +CONFIG_SND_MIXART=m +CONFIG_SND_NM256=m +CONFIG_SND_RME32=m +CONFIG_SND_RME96=m +CONFIG_SND_RME9652=m +CONFIG_SND_HDSP=m +CONFIG_SND_TRIDENT=m +CONFIG_SND_YMFPCI=m +CONFIG_SND_ALS4000=m +CONFIG_SND_CMIPCI=m +CONFIG_SND_ENS1370=m +CONFIG_SND_ENS1371=m +CONFIG_SND_ES1938=m +CONFIG_SND_ES1968=m +CONFIG_SND_MAESTRO3=m +CONFIG_SND_FM801=m +CONFIG_SND_FM801_TEA575X=m +CONFIG_SND_ICE1712=m +CONFIG_SND_ICE1724=m +CONFIG_SND_INTEL8X0=m +CONFIG_SND_INTEL8X0M=m +CONFIG_SND_SONICVIBES=m +CONFIG_SND_VIA82XX=m +CONFIG_SND_VX222=m + +# +# ALSA USB devices +# +CONFIG_SND_USB_AUDIO=m + +# +# PCMCIA devices +# + +# +# Open Sound System +# +CONFIG_SOUND_PRIME=m +CONFIG_SOUND_BT878=m +CONFIG_SOUND_CMPCI=m +# CONFIG_SOUND_CMPCI_FM is not set +# CONFIG_SOUND_CMPCI_MIDI is not set +CONFIG_SOUND_CMPCI_JOYSTICK=y +CONFIG_SOUND_EMU10K1=m +CONFIG_MIDI_EMU10K1=y +CONFIG_SOUND_FUSION=m +CONFIG_SOUND_CS4281=m +CONFIG_SOUND_ES1370=m +CONFIG_SOUND_ES1371=m +CONFIG_SOUND_ESSSOLO1=m +CONFIG_SOUND_MAESTRO=m +CONFIG_SOUND_MAESTRO3=m +CONFIG_SOUND_ICH=m +CONFIG_SOUND_SONICVIBES=m +CONFIG_SOUND_TRIDENT=m +# CONFIG_SOUND_MSNDCLAS is not set +# CONFIG_SOUND_MSNDPIN is not set +CONFIG_SOUND_VIA82CXXX=m +CONFIG_MIDI_VIA82CXXX=y +CONFIG_SOUND_OSS=m +# CONFIG_SOUND_TRACEINIT is not set +# CONFIG_SOUND_DMAP is not set +# CONFIG_SOUND_AD1816 is not set +CONFIG_SOUND_AD1889=m +CONFIG_SOUND_SGALAXY=m +CONFIG_SOUND_ADLIB=m +CONFIG_SOUND_ACI_MIXER=m +CONFIG_SOUND_CS4232=m +CONFIG_SOUND_SSCAPE=m +CONFIG_SOUND_GUS=m +CONFIG_SOUND_GUS16=y +CONFIG_SOUND_GUSMAX=y +CONFIG_SOUND_VMIDI=m +CONFIG_SOUND_TRIX=m +CONFIG_SOUND_MSS=m +CONFIG_SOUND_MPU401=m +CONFIG_SOUND_NM256=m +CONFIG_SOUND_MAD16=m +CONFIG_MAD16_OLDCARD=y +CONFIG_SOUND_PAS=m +CONFIG_SOUND_PSS=m +CONFIG_PSS_MIXER=y +CONFIG_SOUND_SB=m +# CONFIG_SOUND_AWE32_SYNTH is not set +CONFIG_SOUND_WAVEFRONT=m +CONFIG_SOUND_MAUI=m +CONFIG_SOUND_YM3812=m +CONFIG_SOUND_OPL3SA1=m +CONFIG_SOUND_OPL3SA2=m +CONFIG_SOUND_YMFPCI=m +# CONFIG_SOUND_YMFPCI_LEGACY is not set +CONFIG_SOUND_UART6850=m +CONFIG_SOUND_AEDSP16=m +CONFIG_SC6600=y +CONFIG_SC6600_JOY=y +CONFIG_SC6600_CDROM=4 +CONFIG_SC6600_CDROMBASE=0x0 +# CONFIG_AEDSP16_MSS is not set +# CONFIG_AEDSP16_SBPRO is not set +# CONFIG_AEDSP16_MPU401 is not set +CONFIG_SOUND_TVMIXER=m +CONFIG_SOUND_KAHLUA=m +CONFIG_SOUND_ALI5455=m +CONFIG_SOUND_FORTE=m +CONFIG_SOUND_RME96XX=m +CONFIG_SOUND_AD1980=m + +# +# USB support +# +CONFIG_USB=y +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +CONFIG_USB_BANDWIDTH=y +# CONFIG_USB_DYNAMIC_MINORS is not set + +# +# USB Host Controller Drivers +# +CONFIG_USB_EHCI_HCD=m +CONFIG_USB_EHCI_SPLIT_ISO=y +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_OHCI_HCD=m +CONFIG_USB_UHCI_HCD=m + +# +# USB Device Class drivers +# +CONFIG_USB_AUDIO=m + +# +# USB Bluetooth TTY can only be used with disabled Bluetooth subsystem +# +CONFIG_USB_MIDI=m +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +CONFIG_USB_STORAGE_RW_DETECT=y +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_DPCM=y +CONFIG_USB_STORAGE_HP8200e=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y + +# +# USB Human Interface Devices (HID) +# +CONFIG_USB_HID=m +CONFIG_USB_HIDINPUT=y +# CONFIG_HID_FF is not set +CONFIG_USB_HIDDEV=y + +# +# USB HID Boot Protocol drivers +# +CONFIG_USB_KBD=m +CONFIG_USB_MOUSE=m +CONFIG_USB_AIPTEK=m +CONFIG_USB_WACOM=m +CONFIG_USB_KBTAB=m +CONFIG_USB_POWERMATE=m +CONFIG_USB_MTOUCH=m +CONFIG_USB_EGALAX=m +CONFIG_USB_XPAD=m +CONFIG_USB_ATI_REMOTE=m + +# +# USB Imaging devices +# +CONFIG_USB_MDC800=m +CONFIG_USB_MICROTEK=m +CONFIG_USB_HPUSBSCSI=m + +# +# USB Multimedia devices +# +CONFIG_USB_VICAM=m +CONFIG_USB_DSBR=m +CONFIG_USB_IBMCAM=m +CONFIG_USB_KONICAWC=m +CONFIG_USB_OV511=m +CONFIG_USB_PWC=m +CONFIG_USB_SE401=m +CONFIG_USB_SN9C102=m +CONFIG_USB_STV680=m +CONFIG_USB_W9968CF=m + +# +# USB Network adaptors +# +CONFIG_USB_CATC=m +CONFIG_USB_KAWETH=m +CONFIG_USB_PEGASUS=m +CONFIG_USB_RTL8150=m +CONFIG_USB_USBNET=m + +# +# USB Host-to-Host Cables +# +CONFIG_USB_ALI_M5632=y +CONFIG_USB_AN2720=y +CONFIG_USB_BELKIN=y +CONFIG_USB_GENESYS=y +CONFIG_USB_NET1080=y +CONFIG_USB_PL2301=y + +# +# Intelligent USB Devices/Gadgets +# +CONFIG_USB_ARMLINUX=y +CONFIG_USB_EPSON2888=y +CONFIG_USB_ZAURUS=y +CONFIG_USB_CDCETHER=y + +# +# USB Network Adapters +# +CONFIG_USB_AX8817X=y + +# +# USB port drivers +# +CONFIG_USB_USS720=m + +# +# USB Serial Converter support +# +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_BELKIN=m +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m +CONFIG_USB_SERIAL_EMPEG=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_VISOR=m +CONFIG_USB_SERIAL_IPAQ=m +CONFIG_USB_SERIAL_IR=m +CONFIG_USB_SERIAL_EDGEPORT=m +CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_KEYSPAN_PDA=m +CONFIG_USB_SERIAL_KEYSPAN=m +CONFIG_USB_SERIAL_KLSI=m +CONFIG_USB_SERIAL_KOBIL_SCT=m +CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_SAFE=m +# CONFIG_USB_SERIAL_SAFE_PADDED is not set +CONFIG_USB_SERIAL_CYBERJACK=m +CONFIG_USB_SERIAL_XIRCOM=m +CONFIG_USB_SERIAL_OMNINET=m +CONFIG_USB_EZUSB=y + +# +# USB Miscellaneous drivers +# +CONFIG_USB_TIGL=m +CONFIG_USB_AUERSWALD=m +CONFIG_USB_RIO500=m +CONFIG_USB_LEGOTOWER=m +CONFIG_USB_LCD=m +CONFIG_USB_LED=m +CONFIG_USB_CYTHERM=m +CONFIG_USB_SPEEDTOUCH=m +CONFIG_USB_PHIDGETSERVO=m +CONFIG_USB_TEST=m +CONFIG_USB_EAGLE=m + +# +# USB Gadget Support +# +CONFIG_USB_GADGET=m +CONFIG_USB_GADGET_NET2280=y +CONFIG_USB_NET2280=m +# CONFIG_USB_GADGET_PXA2XX is not set +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_SA1100 is not set +# CONFIG_USB_GADGET_DUMMY_HCD is not set +CONFIG_USB_GADGET_DUALSPEED=y +CONFIG_USB_ZERO=m +CONFIG_USB_ETH=m +CONFIG_USB_ETH_RNDIS=y +CONFIG_USB_GADGETFS=m +CONFIG_USB_FILE_STORAGE=m +# CONFIG_USB_FILE_STORAGE_TEST is not set +CONFIG_USB_G_SERIAL=m + +# +# Firmware Drivers +# +CONFIG_EDD=m + +# +# File systems +# +CONFIG_EXT2_FS=m +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_POSIX_ACL=y +CONFIG_EXT2_FS_SECURITY=y +CONFIG_EXT3_FS=m +CONFIG_EXT3_FS_XATTR=y +CONFIG_EXT3_FS_POSIX_ACL=y +CONFIG_EXT3_FS_SECURITY=y +CONFIG_JBD=m +# CONFIG_JBD_DEBUG is not set +CONFIG_FS_MBCACHE=m +CONFIG_REISERFS_FS=m +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +# CONFIG_REISERFS_FS_XATTR is not set +CONFIG_JFS_FS=m +CONFIG_JFS_POSIX_ACL=y +# CONFIG_JFS_DEBUG is not set +CONFIG_JFS_STATISTICS=y +CONFIG_FS_POSIX_ACL=y +CONFIG_XFS_FS=m +CONFIG_XFS_RT=y +CONFIG_XFS_QUOTA=y +CONFIG_XFS_SECURITY=y +CONFIG_XFS_POSIX_ACL=y +CONFIG_MINIX_FS=m +CONFIG_ROMFS_FS=m +CONFIG_QUOTA=y +CONFIG_QFMT_V1=m +CONFIG_QFMT_V2=m +CONFIG_QUOTACTL=y +CONFIG_AUTOFS_FS=m +CONFIG_AUTOFS4_FS=m + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=m +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_ZISOFS_FS=m +CONFIG_UDF_FS=m +CONFIG_UDF_NLS=y + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +CONFIG_NTFS_FS=m +# CONFIG_NTFS_DEBUG is not set +# CONFIG_NTFS_RW is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_SYSFS=y +CONFIG_DEVFS_FS=y +# CONFIG_DEVFS_MOUNT is not set +# CONFIG_DEVFS_DEBUG is not set +CONFIG_DEVPTS_FS_XATTR=y +CONFIG_DEVPTS_FS_SECURITY=y +CONFIG_TMPFS=y +# CONFIG_HUGETLBFS is not set +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y + +# +# Miscellaneous filesystems +# +CONFIG_ADFS_FS=m +# CONFIG_ADFS_FS_RW is not set +CONFIG_AFFS_FS=m +CONFIG_ASFS_FS=m +# CONFIG_ASFS_RW is not set +CONFIG_HFS_FS=m +CONFIG_HFSPLUS_FS=m +CONFIG_BEFS_FS=m +# CONFIG_BEFS_DEBUG is not set +CONFIG_BFS_FS=m +CONFIG_EFS_FS=m +CONFIG_JFFS_FS=m +CONFIG_JFFS_FS_VERBOSE=0 +CONFIG_JFFS_PROC_FS=y +CONFIG_JFFS2_FS=m +CONFIG_JFFS2_FS_DEBUG=0 +# CONFIG_JFFS2_FS_NAND is not set +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set +CONFIG_JFFS2_ZLIB=y +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +CONFIG_CRAMFS=y +CONFIG_VXFS_FS=m +CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +# CONFIG_QNX4FS_RW is not set +CONFIG_SYSV_FS=m +CONFIG_UFS_FS=m +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=m +CONFIG_NFS_V3=y +CONFIG_NFS_V4=y +CONFIG_NFS_DIRECTIO=y +CONFIG_NFSD=m +CONFIG_NFSD_V3=y +CONFIG_NFSD_V4=y +CONFIG_NFSD_TCP=y +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=m +CONFIG_SUNRPC=m +CONFIG_SUNRPC_GSS=m +CONFIG_RPCSEC_GSS_KRB5=m +CONFIG_SMB_FS=m +# CONFIG_SMB_NLS_DEFAULT is not set +CONFIG_CIFS=m +# CONFIG_CIFS_STATS is not set +# CONFIG_CIFS_XATTR is not set +# CONFIG_CIFS_POSIX is not set +CONFIG_NCP_FS=m +# CONFIG_NCPFS_PACKET_SIGNING is not set +# CONFIG_NCPFS_IOCTL_LOCKING is not set +# CONFIG_NCPFS_STRONG is not set +CONFIG_NCPFS_NFS_NS=y +CONFIG_NCPFS_OS2_NS=y +# CONFIG_NCPFS_SMALLDOS is not set +CONFIG_NCPFS_NLS=y +CONFIG_NCPFS_EXTRAS=y +CONFIG_CODA_FS=m +# CONFIG_CODA_FS_OLD_API is not set +CONFIG_AFS_FS=m +CONFIG_RXRPC=m + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +CONFIG_ACORN_PARTITION=y +CONFIG_ACORN_PARTITION_CUMANA=y +# CONFIG_ACORN_PARTITION_EESOX is not set +CONFIG_ACORN_PARTITION_ICS=y +# CONFIG_ACORN_PARTITION_ADFS is not set +# CONFIG_ACORN_PARTITION_POWERTEC is not set +CONFIG_ACORN_PARTITION_RISCIX=y +CONFIG_OSF_PARTITION=y +CONFIG_AMIGA_PARTITION=y +CONFIG_ATARI_PARTITION=y +CONFIG_MAC_PARTITION=y +CONFIG_MSDOS_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_LDM_PARTITION=y +# CONFIG_LDM_DEBUG is not set +CONFIG_SGI_PARTITION=y +CONFIG_ULTRIX_PARTITION=y +CONFIG_SUN_PARTITION=y +# CONFIG_EFI_PARTITION is not set + +# +# Native Language Support +# +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="cp437" +CONFIG_NLS_CODEPAGE_437=m +CONFIG_NLS_CODEPAGE_737=m +CONFIG_NLS_CODEPAGE_775=m +CONFIG_NLS_CODEPAGE_850=m +CONFIG_NLS_CODEPAGE_852=m +CONFIG_NLS_CODEPAGE_855=m +CONFIG_NLS_CODEPAGE_857=m +CONFIG_NLS_CODEPAGE_860=m +CONFIG_NLS_CODEPAGE_861=m +CONFIG_NLS_CODEPAGE_862=m +CONFIG_NLS_CODEPAGE_863=m +CONFIG_NLS_CODEPAGE_864=m +CONFIG_NLS_CODEPAGE_865=m +CONFIG_NLS_CODEPAGE_866=m +CONFIG_NLS_CODEPAGE_869=m +CONFIG_NLS_CODEPAGE_936=m +CONFIG_NLS_CODEPAGE_950=m +CONFIG_NLS_CODEPAGE_932=m +CONFIG_NLS_CODEPAGE_949=m +CONFIG_NLS_CODEPAGE_874=m +CONFIG_NLS_ISO8859_8=m +CONFIG_NLS_CODEPAGE_1250=m +CONFIG_NLS_CODEPAGE_1251=m +CONFIG_NLS_ASCII=m +CONFIG_NLS_ISO8859_1=m +CONFIG_NLS_ISO8859_2=m +CONFIG_NLS_ISO8859_3=m +CONFIG_NLS_ISO8859_4=m +CONFIG_NLS_ISO8859_5=m +CONFIG_NLS_ISO8859_6=m +CONFIG_NLS_ISO8859_7=m +CONFIG_NLS_ISO8859_9=m +CONFIG_NLS_ISO8859_13=m +CONFIG_NLS_ISO8859_14=m +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_KOI8_R=m +CONFIG_NLS_KOI8_U=m +CONFIG_NLS_UTF8=m + +# +# Profiling support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=m + +# +# Kernel hacking +# +# CONFIG_DEBUG_KERNEL is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_FRAME_POINTER is not set + +# +# Security options +# +CONFIG_SECURITY=y +# CONFIG_SECURITY_NETWORK is not set +CONFIG_SECURITY_CAPABILITIES=m +CONFIG_SECURITY_ROOTPLUG=m +# CONFIG_SECURITY_SELINUX is not set + +# +# Cryptographic options +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_SHA1=m +CONFIG_CRYPTO_SHA256=m +CONFIG_CRYPTO_SHA512=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_KHAZAD=m +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_MICHAEL_MIC=m +CONFIG_CRYPTO_CRC32C=m +CONFIG_CRYPTO_TEST=m + +# +# Library routines +# +CONFIG_CRC_CCITT=m +CONFIG_CRC32=m +CONFIG_LIBCRC32C=m +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=m --- linux-source-2.6.8.1-2.6.8.1.orig/debian/config/i386/386 +++ linux-source-2.6.8.1-2.6.8.1/debian/config/i386/386 @@ -0,0 +1,2866 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_X86=y +CONFIG_MMU=y +CONFIG_UID16=y +CONFIG_GENERIC_ISA_DMA=y + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +# CONFIG_CLEAN_COMPILE is not set +CONFIG_BROKEN=y +CONFIG_BROKEN_ON_SMP=y + +# +# General setup +# +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_BSD_PROCESS_ACCT=y +# CONFIG_BSD_PROCESS_ACCT_V3 is not set +CONFIG_SYSCTL=y +# CONFIG_AUDIT is not set +CONFIG_LOG_BUF_SHIFT=14 +CONFIG_HOTPLUG=y +# CONFIG_IKCONFIG is not set +CONFIG_EMBEDDED=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_OBSOLETE_MODPARM=y +CONFIG_MODVERSIONS=y +CONFIG_KMOD=y + +# +# Processor type and features +# +CONFIG_X86_PC=y +# CONFIG_X86_ELAN is not set +# CONFIG_X86_VOYAGER is not set +# CONFIG_X86_NUMAQ is not set +# CONFIG_X86_SUMMIT is not set +# CONFIG_X86_BIGSMP is not set +# CONFIG_X86_VISWS is not set +# CONFIG_X86_GENERICARCH is not set +# CONFIG_X86_ES7000 is not set +CONFIG_M386=y +# CONFIG_M486 is not set +# CONFIG_M586 is not set +# CONFIG_M586TSC is not set +# CONFIG_M586MMX is not set +# CONFIG_M686 is not set +# CONFIG_MPENTIUMII is not set +# CONFIG_MPENTIUMIII is not set +# CONFIG_MPENTIUMM is not set +# CONFIG_MPENTIUM4 is not set +# CONFIG_MK6 is not set +# CONFIG_MK7 is not set +# CONFIG_MK8 is not set +# CONFIG_MCRUSOE is not set +# CONFIG_MWINCHIPC6 is not set +# CONFIG_MWINCHIP2 is not set +# CONFIG_MWINCHIP3D is not set +# CONFIG_MCYRIXIII is not set +# CONFIG_MVIAC3_2 is not set +CONFIG_X86_GENERIC=y +CONFIG_X86_L1_CACHE_SHIFT=7 +CONFIG_RWSEM_GENERIC_SPINLOCK=y +CONFIG_X86_PPRO_FENCE=y +CONFIG_X86_F00F_BUG=y +CONFIG_X86_INTEL_USERCOPY=y +CONFIG_HPET_TIMER=y +# CONFIG_SMP is not set +CONFIG_PREEMPT=y +CONFIG_X86_UP_APIC=y +CONFIG_X86_UP_IOAPIC=y +CONFIG_X86_LOCAL_APIC=y +CONFIG_X86_IO_APIC=y +# CONFIG_X86_MCE is not set +CONFIG_TOSHIBA=m +CONFIG_I8K=m +CONFIG_MICROCODE=m +CONFIG_X86_MSR=m +CONFIG_X86_CPUID=m + +# +# Firmware Drivers +# +CONFIG_EDD=m +CONFIG_NOHIGHMEM=y +# CONFIG_HIGHMEM4G is not set +# CONFIG_HIGHMEM64G is not set +CONFIG_MATH_EMULATION=y +CONFIG_MTRR=y +# CONFIG_EFI is not set +# CONFIG_REGPARM is not set + +# +# Power management options (ACPI, APM) +# +CONFIG_PM=y +# CONFIG_SOFTWARE_SUSPEND is not set +# CONFIG_PM_DISK is not set + +# +# ACPI (Advanced Configuration and Power Interface) Support +# +CONFIG_ACPI=y +CONFIG_ACPI_BOOT=y +CONFIG_ACPI_INTERPRETER=y +CONFIG_ACPI_SLEEP=y +CONFIG_ACPI_SLEEP_PROC_FS=y +CONFIG_ACPI_AC=m +CONFIG_ACPI_BATTERY=m +CONFIG_ACPI_BUTTON=m +CONFIG_ACPI_FAN=m +CONFIG_ACPI_PROCESSOR=m +CONFIG_ACPI_THERMAL=m +CONFIG_ACPI_ASUS=m +CONFIG_ACPI_TOSHIBA=m +# CONFIG_ACPI_DEBUG is not set +CONFIG_ACPI_BUS=y +CONFIG_ACPI_EC=y +CONFIG_ACPI_POWER=y +CONFIG_ACPI_PCI=y +CONFIG_ACPI_SYSTEM=y +CONFIG_X86_PM_TIMER=y + +# +# APM (Advanced Power Management) BIOS Support +# +CONFIG_APM=m +# CONFIG_APM_IGNORE_USER_SUSPEND is not set +# CONFIG_APM_DO_ENABLE is not set +# CONFIG_APM_CPU_IDLE is not set +# CONFIG_APM_DISPLAY_BLANK is not set +# CONFIG_APM_RTC_IS_GMT is not set +# CONFIG_APM_ALLOW_INTS is not set +# CONFIG_APM_REAL_MODE_POWER_OFF is not set + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_PROC_INTF=m +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=m +CONFIG_CPU_FREQ_GOV_USERSPACE=m +# CONFIG_CPU_FREQ_24_API is not set +CONFIG_CPU_FREQ_TABLE=m + +# +# CPUFreq processor drivers +# +CONFIG_X86_ACPI_CPUFREQ=m +# CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set +CONFIG_X86_POWERNOW_K6=m +CONFIG_X86_POWERNOW_K7=m +CONFIG_X86_POWERNOW_K8=m +CONFIG_X86_GX_SUSPMOD=m +CONFIG_X86_SPEEDSTEP_CENTRINO=m +CONFIG_X86_SPEEDSTEP_CENTRINO_TABLE=y +CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI=y +CONFIG_X86_SPEEDSTEP_ICH=m +CONFIG_X86_SPEEDSTEP_SMI=m +CONFIG_X86_P4_CLOCKMOD=m +CONFIG_X86_SPEEDSTEP_LIB=m +CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK=y +CONFIG_X86_LONGRUN=m +CONFIG_X86_LONGHAUL=m + +# +# Bus options (PCI, PCMCIA, EISA, MCA, ISA) +# +CONFIG_PCI=y +# CONFIG_PCI_GOBIOS is not set +# CONFIG_PCI_GOMMCONFIG is not set +# CONFIG_PCI_GODIRECT is not set +CONFIG_PCI_GOANY=y +CONFIG_PCI_BIOS=y +CONFIG_PCI_DIRECT=y +CONFIG_PCI_MMCONFIG=y +CONFIG_PCI_MSI=y +# CONFIG_PCI_LEGACY_PROC is not set +CONFIG_PCI_NAMES=y +CONFIG_ISA=y +CONFIG_EISA=y +CONFIG_EISA_VLB_PRIMING=y +CONFIG_EISA_PCI_EISA=y +CONFIG_EISA_VIRTUAL_ROOT=y +CONFIG_EISA_NAMES=y +CONFIG_MCA=y +CONFIG_MCA_LEGACY=y +# CONFIG_MCA_PROC_FS is not set +CONFIG_SCx200=m + +# +# PCMCIA/CardBus support +# +CONFIG_PCMCIA=m +# CONFIG_PCMCIA_DEBUG is not set +CONFIG_YENTA=m +CONFIG_CARDBUS=y +CONFIG_PD6729=m +CONFIG_I82092=m +CONFIG_I82365=m +CONFIG_TCIC=m +CONFIG_PCMCIA_PROBE=y + +# +# PCI Hotplug Support +# +CONFIG_HOTPLUG_PCI=m +CONFIG_HOTPLUG_PCI_FAKE=m +CONFIG_HOTPLUG_PCI_COMPAQ=m +CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM=y +CONFIG_HOTPLUG_PCI_IBM=m +CONFIG_HOTPLUG_PCI_ACPI=m +CONFIG_HOTPLUG_PCI_CPCI=y +CONFIG_HOTPLUG_PCI_CPCI_ZT5550=m +CONFIG_HOTPLUG_PCI_CPCI_GENERIC=m +CONFIG_HOTPLUG_PCI_PCIE=m +# CONFIG_HOTPLUG_PCI_PCIE_POLL_EVENT_MODE is not set +CONFIG_HOTPLUG_PCI_SHPC=m +# CONFIG_HOTPLUG_PCI_SHPC_POLL_EVENT_MODE is not set + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_AOUT=m +CONFIG_BINFMT_MISC=m + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=m +# CONFIG_DEBUG_DRIVER is not set + +# +# Memory Technology Devices (MTD) +# +CONFIG_MTD=m +# CONFIG_MTD_DEBUG is not set +CONFIG_MTD_PARTITIONS=y +CONFIG_MTD_CONCAT=m +CONFIG_MTD_REDBOOT_PARTS=m +# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set +# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set +# CONFIG_MTD_CMDLINE_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=m +CONFIG_MTD_BLOCK=m +CONFIG_MTD_BLOCK_RO=m +CONFIG_FTL=m +CONFIG_NFTL=m +CONFIG_NFTL_RW=y +CONFIG_INFTL=m + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=m +CONFIG_MTD_JEDECPROBE=m +CONFIG_MTD_GEN_PROBE=m +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +CONFIG_MTD_CFI_INTELEXT=m +CONFIG_MTD_CFI_AMDSTD=m +CONFIG_MTD_CFI_AMDSTD_RETRY=0 +CONFIG_MTD_CFI_STAA=m +CONFIG_MTD_CFI_UTIL=m +CONFIG_MTD_RAM=m +CONFIG_MTD_ROM=m +CONFIG_MTD_ABSENT=m +# CONFIG_MTD_OBSOLETE_CHIPS is not set + +# +# Mapping drivers for chip access +# +CONFIG_MTD_COMPLEX_MAPPINGS=y +CONFIG_MTD_PHYSMAP=m +CONFIG_MTD_PHYSMAP_START=0x8000000 +CONFIG_MTD_PHYSMAP_LEN=0x4000000 +CONFIG_MTD_PHYSMAP_BANKWIDTH=2 +CONFIG_MTD_PNC2000=m +CONFIG_MTD_SC520CDP=m +CONFIG_MTD_NETSC520=m +CONFIG_MTD_SBC_GXX=m +CONFIG_MTD_ELAN_104NC=m +CONFIG_MTD_SCx200_DOCFLASH=m +# CONFIG_MTD_AMD76XROM is not set +# CONFIG_MTD_ICHXROM is not set +# CONFIG_MTD_SCB2_FLASH is not set +CONFIG_MTD_NETtel=m +CONFIG_MTD_DILNETPC=m +CONFIG_MTD_DILNETPC_BOOTSIZE=0x80000 +# CONFIG_MTD_L440GX is not set +CONFIG_MTD_PCI=m +# CONFIG_MTD_PCMCIA is not set + +# +# Self-contained MTD device drivers +# +CONFIG_MTD_PMC551=m +# CONFIG_MTD_PMC551_BUGFIX is not set +# CONFIG_MTD_PMC551_DEBUG is not set +CONFIG_MTD_SLRAM=m +CONFIG_MTD_PHRAM=m +CONFIG_MTD_MTDRAM=m +CONFIG_MTDRAM_TOTAL_SIZE=4096 +CONFIG_MTDRAM_ERASE_SIZE=128 +CONFIG_MTD_BLKMTD=m + +# +# Disk-On-Chip Device Drivers +# +CONFIG_MTD_DOC2000=m +CONFIG_MTD_DOC2001=m +CONFIG_MTD_DOC2001PLUS=m +CONFIG_MTD_DOCPROBE=m +CONFIG_MTD_DOCECC=m +# CONFIG_MTD_DOCPROBE_ADVANCED is not set +CONFIG_MTD_DOCPROBE_ADDRESS=0 + +# +# NAND Flash Device Drivers +# +CONFIG_MTD_NAND=m +# CONFIG_MTD_NAND_VERIFY_WRITE is not set +CONFIG_MTD_NAND_IDS=m +CONFIG_MTD_NAND_DISKONCHIP=m +# CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set +CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0 +# CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE is not set + +# +# Parallel port support +# +CONFIG_PARPORT=m +CONFIG_PARPORT_PC=m +CONFIG_PARPORT_PC_CML1=m +CONFIG_PARPORT_SERIAL=m +CONFIG_PARPORT_PC_FIFO=y +# CONFIG_PARPORT_PC_SUPERIO is not set +CONFIG_PARPORT_PC_PCMCIA=m +# CONFIG_PARPORT_OTHER is not set +CONFIG_PARPORT_1284=y + +# +# Plug and Play support +# +CONFIG_PNP=y +# CONFIG_PNP_DEBUG is not set + +# +# Protocols +# +CONFIG_ISAPNP=y +CONFIG_PNPBIOS=y +CONFIG_PNPBIOS_PROC_FS=y + +# +# Block devices +# +CONFIG_BLK_DEV_FD=m +CONFIG_BLK_DEV_PS2=m +CONFIG_BLK_DEV_XD=m +CONFIG_PARIDE=m +CONFIG_PARIDE_PARPORT=m + +# +# Parallel IDE high-level drivers +# +CONFIG_PARIDE_PD=m +CONFIG_PARIDE_PCD=m +CONFIG_PARIDE_PF=m +CONFIG_PARIDE_PT=m +CONFIG_PARIDE_PG=m + +# +# Parallel IDE protocol modules +# +CONFIG_PARIDE_ATEN=m +CONFIG_PARIDE_BPCK=m +CONFIG_PARIDE_BPCK6=m +CONFIG_PARIDE_COMM=m +CONFIG_PARIDE_DSTR=m +CONFIG_PARIDE_FIT2=m +CONFIG_PARIDE_FIT3=m +CONFIG_PARIDE_EPAT=m +# CONFIG_PARIDE_EPATC8 is not set +CONFIG_PARIDE_EPIA=m +CONFIG_PARIDE_FRIQ=m +CONFIG_PARIDE_FRPW=m +CONFIG_PARIDE_KBIC=m +CONFIG_PARIDE_KTTI=m +CONFIG_PARIDE_ON20=m +CONFIG_PARIDE_ON26=m +CONFIG_BLK_CPQ_DA=m +CONFIG_BLK_CPQ_CISS_DA=m +CONFIG_CISS_SCSI_TAPE=y +CONFIG_BLK_DEV_DAC960=m +CONFIG_BLK_DEV_UMEM=m +CONFIG_BLK_DEV_LOOP=m +CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_SX8=m +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_BLK_DEV_INITRD=y +CONFIG_LBD=y + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=m +CONFIG_BLK_DEV_IDE=m + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_IDE_SATA is not set +# CONFIG_BLK_DEV_HD_IDE is not set +CONFIG_BLK_DEV_IDEDISK=m +# CONFIG_IDEDISK_MULTI_MODE is not set +CONFIG_BLK_DEV_IDECS=m +CONFIG_BLK_DEV_IDECD=m +CONFIG_BLK_DEV_IDETAPE=m +CONFIG_BLK_DEV_IDEFLOPPY=m +CONFIG_BLK_DEV_IDESCSI=m +# CONFIG_IDE_TASK_IOCTL is not set +CONFIG_IDE_TASKFILE_IO=y + +# +# IDE chipset support/bugfixes +# +CONFIG_IDE_GENERIC=m +CONFIG_BLK_DEV_CMD640=y +# CONFIG_BLK_DEV_CMD640_ENHANCED is not set +CONFIG_BLK_DEV_IDEPNP=m +CONFIG_BLK_DEV_IDEPCI=y +CONFIG_IDEPCI_SHARE_IRQ=y +# CONFIG_BLK_DEV_OFFBOARD is not set +CONFIG_BLK_DEV_GENERIC=m +CONFIG_BLK_DEV_OPTI621=m +CONFIG_BLK_DEV_RZ1000=m +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +CONFIG_IDEDMA_PCI_AUTO=y +# CONFIG_IDEDMA_ONLYDISK is not set +CONFIG_BLK_DEV_ADMA=y +CONFIG_BLK_DEV_AEC62XX=m +CONFIG_BLK_DEV_ALI15X3=m +# CONFIG_WDC_ALI15X3 is not set +CONFIG_BLK_DEV_AMD74XX=m +CONFIG_BLK_DEV_ATIIXP=m +CONFIG_BLK_DEV_CMD64X=m +CONFIG_BLK_DEV_TRIFLEX=m +CONFIG_BLK_DEV_CY82C693=m +CONFIG_BLK_DEV_CS5520=m +CONFIG_BLK_DEV_CS5530=m +CONFIG_BLK_DEV_HPT34X=m +# CONFIG_HPT34X_AUTODMA is not set +CONFIG_BLK_DEV_HPT366=m +CONFIG_BLK_DEV_SC1200=m +CONFIG_BLK_DEV_PIIX=m +CONFIG_BLK_DEV_NS87415=m +CONFIG_BLK_DEV_PDC202XX_OLD=m +CONFIG_PDC202XX_BURST=y +CONFIG_BLK_DEV_PDC202XX_NEW=m +CONFIG_PDC202XX_FORCE=y +CONFIG_BLK_DEV_SVWKS=m +CONFIG_BLK_DEV_SIIMAGE=m +CONFIG_BLK_DEV_SIS5513=m +CONFIG_BLK_DEV_SLC90E66=m +CONFIG_BLK_DEV_TRM290=m +CONFIG_BLK_DEV_VIA82CXXX=m +# CONFIG_IDE_ARM is not set +# CONFIG_IDE_CHIPSETS is not set +CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_IVB is not set +CONFIG_IDEDMA_AUTO=y +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +CONFIG_SCSI=m +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +CONFIG_CHR_DEV_ST=m +CONFIG_CHR_DEV_OSST=m +CONFIG_BLK_DEV_SR=m +# CONFIG_BLK_DEV_SR_VENDOR is not set +CONFIG_CHR_DEV_SG=m +CONFIG_CHR_DEV_SCH=m + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y + +# +# SCSI Transport Attributes +# +CONFIG_SCSI_SPI_ATTRS=m +CONFIG_SCSI_FC_ATTRS=m + +# +# SCSI low-level drivers +# +CONFIG_BLK_DEV_3W_XXXX_RAID=m +CONFIG_SCSI_3W_9XXX=m +CONFIG_SCSI_7000FASST=m +CONFIG_SCSI_ACARD=m +CONFIG_SCSI_AHA152X=m +CONFIG_SCSI_AHA1542=m +CONFIG_SCSI_AHA1740=m +CONFIG_SCSI_AACRAID=m +CONFIG_SCSI_AIC7XXX=m +CONFIG_AIC7XXX_CMDS_PER_DEVICE=8 +CONFIG_AIC7XXX_RESET_DELAY_MS=15000 +CONFIG_AIC7XXX_PROBE_EISA_VL=y +# CONFIG_AIC7XXX_BUILD_FIRMWARE is not set +CONFIG_AIC7XXX_DEBUG_ENABLE=y +CONFIG_AIC7XXX_DEBUG_MASK=0 +CONFIG_AIC7XXX_REG_PRETTY_PRINT=y +CONFIG_SCSI_AIC7XXX_OLD=m +CONFIG_SCSI_AIC79XX=m +CONFIG_AIC79XX_CMDS_PER_DEVICE=32 +CONFIG_AIC79XX_RESET_DELAY_MS=15000 +# CONFIG_AIC79XX_BUILD_FIRMWARE is not set +CONFIG_AIC79XX_ENABLE_RD_STRM=y +CONFIG_AIC79XX_DEBUG_ENABLE=y +CONFIG_AIC79XX_DEBUG_MASK=0 +CONFIG_AIC79XX_REG_PRETTY_PRINT=y +CONFIG_SCSI_DPT_I2O=m +CONFIG_SCSI_ADVANSYS=m +CONFIG_SCSI_IN2000=m +CONFIG_SCSI_MEGARAID=m +CONFIG_SCSI_SATA=y +CONFIG_SCSI_SATA_SVW=m +CONFIG_SCSI_ATA_PIIX=m +CONFIG_SCSI_SATA_NV=m +CONFIG_SCSI_SATA_PROMISE=m +CONFIG_SCSI_SATA_SX4=m +CONFIG_SCSI_SATA_SIL=m +CONFIG_SCSI_SATA_SIS=m +CONFIG_SCSI_SATA_VIA=m +CONFIG_SCSI_SATA_VITESSE=m +CONFIG_SCSI_BUSLOGIC=m +# CONFIG_SCSI_OMIT_FLASHPOINT is not set +# CONFIG_SCSI_CPQFCTS is not set +CONFIG_SCSI_DMX3191D=m +CONFIG_SCSI_DTC3280=m +CONFIG_SCSI_EATA=m +CONFIG_SCSI_EATA_TAGGED_QUEUE=y +CONFIG_SCSI_EATA_LINKED_COMMANDS=y +CONFIG_SCSI_EATA_MAX_TAGS=16 +CONFIG_SCSI_EATA_PIO=m +CONFIG_SCSI_FUTURE_DOMAIN=m +CONFIG_SCSI_FD_MCS=m +CONFIG_SCSI_GDTH=m +CONFIG_SCSI_GENERIC_NCR5380=m +CONFIG_SCSI_GENERIC_NCR5380_MMIO=m +CONFIG_SCSI_GENERIC_NCR53C400=y +CONFIG_SCSI_IBMMCA=m +CONFIG_IBMMCA_SCSI_ORDER_STANDARD=y +# CONFIG_IBMMCA_SCSI_DEV_RESET is not set +CONFIG_SCSI_IPS=m +# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_INIA100 is not set +CONFIG_SCSI_PPA=m +CONFIG_SCSI_IMM=m +# CONFIG_SCSI_IZIP_EPP16 is not set +# CONFIG_SCSI_IZIP_SLOW_CTR is not set +CONFIG_SCSI_NCR53C406A=m +CONFIG_SCSI_NCR_D700=m +CONFIG_53C700_IO_MAPPED=y +CONFIG_SCSI_SYM53C8XX_2=m +CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 +CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 +CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 +# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set +CONFIG_SCSI_IPR=m +# CONFIG_SCSI_IPR_TRACE is not set +# CONFIG_SCSI_IPR_DUMP is not set +CONFIG_SCSI_NCR_Q720=m +CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=8 +CONFIG_SCSI_NCR53C8XX_MAX_TAGS=4 +CONFIG_SCSI_NCR53C8XX_SYNC=5 +# CONFIG_SCSI_NCR53C8XX_PROFILE is not set +CONFIG_SCSI_MCA_53C9X=m +CONFIG_SCSI_PAS16=m +# CONFIG_SCSI_PCI2000 is not set +# CONFIG_SCSI_PCI2220I is not set +CONFIG_SCSI_PSI240I=m +CONFIG_SCSI_QLOGIC_FAS=m +CONFIG_SCSI_QLOGIC_ISP=m +CONFIG_SCSI_QLOGIC_FC=m +CONFIG_SCSI_QLOGIC_FC_FIRMWARE=y +CONFIG_SCSI_QLOGIC_1280=m +# CONFIG_SCSI_SEAGATE is not set +CONFIG_SCSI_SIM710=m +CONFIG_SCSI_SYM53C416=m +CONFIG_SCSI_DC395x=m +CONFIG_SCSI_DC390T=m +CONFIG_SCSI_T128=m +CONFIG_SCSI_U14_34F=m +CONFIG_SCSI_U14_34F_TAGGED_QUEUE=y +CONFIG_SCSI_U14_34F_LINKED_COMMANDS=y +CONFIG_SCSI_U14_34F_MAX_TAGS=8 +CONFIG_SCSI_ULTRASTOR=m +CONFIG_SCSI_NSP32=m +CONFIG_SCSI_DEBUG=m + +# +# PCMCIA SCSI adapter support +# +CONFIG_PCMCIA_AHA152X=m +CONFIG_PCMCIA_FDOMAIN=m +CONFIG_PCMCIA_NINJA_SCSI=m +CONFIG_PCMCIA_QLOGIC=m +CONFIG_PCMCIA_SYM53C500=m + +# +# Old CD-ROM drivers (not SCSI, not IDE) +# +CONFIG_CD_NO_IDESCSI=y +CONFIG_AZTCD=m +CONFIG_GSCD=m +CONFIG_SBPCD=m +CONFIG_MCD=m +CONFIG_MCD_IRQ=11 +CONFIG_MCD_BASE=0x300 +CONFIG_MCDX=m +CONFIG_OPTCD=m +CONFIG_CM206=m +CONFIG_SJCD=m +CONFIG_ISP16_CDI=m +CONFIG_CDU31A=m +CONFIG_CDU535=m + +# +# Multi-device support (RAID and LVM) +# +CONFIG_MD=y +CONFIG_BLK_DEV_MD=m +CONFIG_MD_LINEAR=m +CONFIG_MD_RAID0=m +CONFIG_MD_RAID1=m +CONFIG_MD_RAID5=m +CONFIG_MD_RAID6=m +CONFIG_MD_MULTIPATH=m +CONFIG_BLK_DEV_DM=m +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=m +CONFIG_DM_MIRROR=m +CONFIG_DM_ZERO=m + +# +# Fusion MPT device support +# +CONFIG_FUSION=m +CONFIG_FUSION_MAX_SGE=40 +CONFIG_FUSION_ISENSE=m +CONFIG_FUSION_CTL=m +CONFIG_FUSION_LAN=m + +# +# IEEE 1394 (FireWire) support +# +CONFIG_IEEE1394=m + +# +# Subsystem Options +# +# CONFIG_IEEE1394_VERBOSEDEBUG is not set +# CONFIG_IEEE1394_OUI_DB is not set +CONFIG_IEEE1394_EXTRA_CONFIG_ROMS=y +CONFIG_IEEE1394_CONFIG_ROM_IP1394=y + +# +# Device Drivers +# +CONFIG_IEEE1394_PCILYNX=m +CONFIG_IEEE1394_OHCI1394=m + +# +# Protocol Drivers +# +CONFIG_IEEE1394_VIDEO1394=m +CONFIG_IEEE1394_SBP2=m +# CONFIG_IEEE1394_SBP2_PHYS_DMA is not set +CONFIG_IEEE1394_ETH1394=m +CONFIG_IEEE1394_DV1394=m +CONFIG_IEEE1394_RAWIO=m +CONFIG_IEEE1394_CMP=m +CONFIG_IEEE1394_AMDTP=m + +# +# I2O device support +# +CONFIG_I2O=m +CONFIG_I2O_CONFIG=m +CONFIG_I2O_BLOCK=m +CONFIG_I2O_SCSI=m +CONFIG_I2O_PROC=m + +# +# Networking support +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=m +CONFIG_PACKET_MMAP=y +CONFIG_NETLINK_DEV=m +CONFIG_UNIX=m +CONFIG_NET_KEY=m +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_FWMARK=y +CONFIG_IP_ROUTE_NAT=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_TOS=y +CONFIG_IP_ROUTE_VERBOSE=y +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE=m +CONFIG_NET_IPGRE_BROADCAST=y +CONFIG_IP_MROUTE=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +# CONFIG_ARPD is not set +CONFIG_SYN_COOKIES=y +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +CONFIG_INET_IPCOMP=m + +# +# IP: Virtual Server Configuration +# +CONFIG_IP_VS=m +# CONFIG_IP_VS_DEBUG is not set +CONFIG_IP_VS_TAB_BITS=12 + +# +# IPVS transport protocol load balancing support +# +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_PROTO_ESP=y +CONFIG_IP_VS_PROTO_AH=y + +# +# IPVS scheduler +# +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_WRR=m +CONFIG_IP_VS_LC=m +CONFIG_IP_VS_WLC=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m + +# +# IPVS application helper +# +CONFIG_IP_VS_FTP=m +CONFIG_IPV6=m +CONFIG_IPV6_PRIVACY=y +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +CONFIG_INET6_IPCOMP=m +CONFIG_IPV6_TUNNEL=m +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_BRIDGE_NETFILTER=y + +# +# IP: Netfilter Configuration +# +CONFIG_IP_NF_CONNTRACK=m +CONFIG_IP_NF_FTP=m +CONFIG_IP_NF_IRC=m +CONFIG_IP_NF_TFTP=m +CONFIG_IP_NF_AMANDA=m +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_LIMIT=m +CONFIG_IP_NF_MATCH_IPRANGE=m +CONFIG_IP_NF_MATCH_MAC=m +CONFIG_IP_NF_MATCH_PKTTYPE=m +CONFIG_IP_NF_MATCH_MARK=m +CONFIG_IP_NF_MATCH_MULTIPORT=m +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_DSCP=m +CONFIG_IP_NF_MATCH_AH_ESP=m +CONFIG_IP_NF_MATCH_LENGTH=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_TCPMSS=m +CONFIG_IP_NF_MATCH_HELPER=m +CONFIG_IP_NF_MATCH_STATE=m +CONFIG_IP_NF_MATCH_CONNTRACK=m +CONFIG_IP_NF_MATCH_OWNER=m +CONFIG_IP_NF_MATCH_PHYSDEV=m +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_SAME=m +CONFIG_IP_NF_NAT_LOCAL=y +CONFIG_IP_NF_NAT_SNMP_BASIC=m +CONFIG_IP_NF_NAT_IRC=m +CONFIG_IP_NF_NAT_FTP=m +CONFIG_IP_NF_NAT_TFTP=m +CONFIG_IP_NF_NAT_AMANDA=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_DSCP=m +CONFIG_IP_NF_TARGET_MARK=m +CONFIG_IP_NF_TARGET_CLASSIFY=m +CONFIG_IP_NF_TARGET_LOG=m +CONFIG_IP_NF_TARGET_ULOG=m +CONFIG_IP_NF_TARGET_TCPMSS=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +CONFIG_IP_NF_COMPAT_IPCHAINS=m +CONFIG_IP_NF_COMPAT_IPFWADM=m +CONFIG_IP_NF_TARGET_NOTRACK=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_MATCH_ADDRTYPE=m +CONFIG_IP_NF_MATCH_REALM=m + +# +# IPv6: Netfilter Configuration +# +CONFIG_IP6_NF_QUEUE=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MATCH_LIMIT=m +CONFIG_IP6_NF_MATCH_MAC=m +CONFIG_IP6_NF_MATCH_RT=m +CONFIG_IP6_NF_MATCH_OPTS=m +CONFIG_IP6_NF_MATCH_FRAG=m +CONFIG_IP6_NF_MATCH_HL=m +CONFIG_IP6_NF_MATCH_MULTIPORT=m +CONFIG_IP6_NF_MATCH_OWNER=m +CONFIG_IP6_NF_MATCH_MARK=m +CONFIG_IP6_NF_MATCH_IPV6HEADER=m +CONFIG_IP6_NF_MATCH_AHESP=m +CONFIG_IP6_NF_MATCH_LENGTH=m +CONFIG_IP6_NF_MATCH_EUI64=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_LOG=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_TARGET_MARK=m +CONFIG_IP6_NF_RAW=m + +# +# DECnet: Netfilter Configuration +# +CONFIG_DECNET_NF_GRABULATOR=m + +# +# Bridge: Netfilter Configuration +# +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_802_3=m +CONFIG_BRIDGE_EBT_AMONG=m +CONFIG_BRIDGE_EBT_ARP=m +CONFIG_BRIDGE_EBT_IP=m +CONFIG_BRIDGE_EBT_LIMIT=m +CONFIG_BRIDGE_EBT_MARK=m +CONFIG_BRIDGE_EBT_PKTTYPE=m +CONFIG_BRIDGE_EBT_STP=m +CONFIG_BRIDGE_EBT_VLAN=m +CONFIG_BRIDGE_EBT_ARPREPLY=m +CONFIG_BRIDGE_EBT_DNAT=m +CONFIG_BRIDGE_EBT_MARK_T=m +CONFIG_BRIDGE_EBT_REDIRECT=m +CONFIG_BRIDGE_EBT_SNAT=m +CONFIG_BRIDGE_EBT_LOG=m +CONFIG_XFRM=y +CONFIG_XFRM_USER=m + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IP_SCTP=m +# CONFIG_SCTP_DBG_MSG is not set +# CONFIG_SCTP_DBG_OBJCNT is not set +# CONFIG_SCTP_HMAC_NONE is not set +# CONFIG_SCTP_HMAC_SHA1 is not set +CONFIG_SCTP_HMAC_MD5=y +CONFIG_ATM=y +CONFIG_ATM_CLIP=y +# CONFIG_ATM_CLIP_NO_ICMP is not set +CONFIG_ATM_LANE=m +CONFIG_ATM_MPOA=m +CONFIG_ATM_BR2684=m +# CONFIG_ATM_BR2684_IPFILTER is not set +CONFIG_BRIDGE=m +CONFIG_VLAN_8021Q=m +CONFIG_DECNET=m +# CONFIG_DECNET_SIOCGIFCONF is not set +# CONFIG_DECNET_ROUTER is not set +CONFIG_LLC=y +CONFIG_LLC2=m +CONFIG_IPX=m +# CONFIG_IPX_INTERN is not set +CONFIG_ATALK=m +CONFIG_DEV_APPLETALK=y +CONFIG_LTPC=m +CONFIG_COPS=m +CONFIG_COPS_DAYNA=y +CONFIG_COPS_TANGENT=y +CONFIG_IPDDP=m +CONFIG_IPDDP_ENCAP=y +CONFIG_IPDDP_DECAP=y +CONFIG_X25=m +CONFIG_LAPB=m +# CONFIG_NET_DIVERT is not set +CONFIG_ECONET=m +CONFIG_ECONET_AUNUDP=y +CONFIG_ECONET_NATIVE=y +CONFIG_WAN_ROUTER=m +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_CLK_JIFFIES=y +# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set +# CONFIG_NET_SCH_CLK_CPU is not set +CONFIG_NET_SCH_CBQ=m +CONFIG_NET_SCH_HTB=m +CONFIG_NET_SCH_HFSC=m +CONFIG_NET_SCH_ATM=m +CONFIG_NET_SCH_PRIO=m +CONFIG_NET_SCH_RED=m +CONFIG_NET_SCH_SFQ=m +CONFIG_NET_SCH_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_NETEM=m +CONFIG_NET_SCH_INGRESS=m +CONFIG_NET_QOS=y +CONFIG_NET_ESTIMATOR=y +CONFIG_NET_CLS=y +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_ROUTE=y +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +# CONFIG_CLS_U32_PERF is not set +# CONFIG_NET_CLS_IND is not set +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +# CONFIG_NET_CLS_ACT is not set +CONFIG_NET_CLS_POLICE=y + +# +# Network testing +# +CONFIG_NET_PKTGEN=m +CONFIG_NETPOLL=y +# CONFIG_NETPOLL_RX is not set +# CONFIG_NETPOLL_TRAP is not set +CONFIG_NET_POLL_CONTROLLER=y +CONFIG_HAMRADIO=y + +# +# Packet Radio protocols +# +CONFIG_AX25=m +# CONFIG_AX25_DAMA_SLAVE is not set +CONFIG_NETROM=m +CONFIG_ROSE=m + +# +# AX.25 network device drivers +# +CONFIG_MKISS=m +CONFIG_6PACK=m +CONFIG_BPQETHER=m +CONFIG_DMASCC=m +CONFIG_SCC=m +# CONFIG_SCC_DELAY is not set +# CONFIG_SCC_TRXECHO is not set +CONFIG_BAYCOM_SER_FDX=m +CONFIG_BAYCOM_SER_HDX=m +CONFIG_BAYCOM_PAR=m +CONFIG_BAYCOM_EPP=m +CONFIG_YAM=m +CONFIG_IRDA=m + +# +# IrDA protocols +# +CONFIG_IRLAN=m +CONFIG_IRNET=m +CONFIG_IRCOMM=m +# CONFIG_IRDA_ULTRA is not set + +# +# IrDA options +# +CONFIG_IRDA_CACHE_LAST_LSAP=y +CONFIG_IRDA_FAST_RR=y +CONFIG_IRDA_DEBUG=y + +# +# Infrared-port device drivers +# + +# +# SIR device drivers +# +CONFIG_IRTTY_SIR=m + +# +# Dongle support +# +CONFIG_DONGLE=y +CONFIG_ESI_DONGLE=m +CONFIG_ACTISYS_DONGLE=m +CONFIG_TEKRAM_DONGLE=m +CONFIG_LITELINK_DONGLE=m +CONFIG_MA600_DONGLE=m +CONFIG_GIRBIL_DONGLE=m +CONFIG_MCP2120_DONGLE=m +CONFIG_OLD_BELKIN_DONGLE=m +CONFIG_ACT200L_DONGLE=m + +# +# Old SIR device drivers +# +CONFIG_IRPORT_SIR=m + +# +# Old Serial dongle support +# +# CONFIG_DONGLE_OLD is not set + +# +# FIR device drivers +# +CONFIG_USB_IRDA=m +CONFIG_SIGMATEL_FIR=m +CONFIG_NSC_FIR=m +CONFIG_WINBOND_FIR=m +CONFIG_TOSHIBA_FIR=m +CONFIG_SMC_IRCC_FIR=m +CONFIG_ALI_FIR=m +CONFIG_VLSI_FIR=m +CONFIG_VIA_FIR=m +CONFIG_BT=m +CONFIG_BT_L2CAP=m +CONFIG_BT_SCO=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_CMTP=m +CONFIG_BT_HIDP=m + +# +# Bluetooth device drivers +# +CONFIG_BT_HCIUSB=m +CONFIG_BT_HCIUSB_SCO=y +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_H4=y +CONFIG_BT_HCIUART_BCSP=y +# CONFIG_BT_HCIUART_BCSP_TXCRC is not set +CONFIG_BT_HCIBCM203X=m +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIDTL1=m +CONFIG_BT_HCIBT3C=m +CONFIG_BT_HCIBLUECARD=m +CONFIG_BT_HCIBTUART=m +CONFIG_BT_HCIVHCI=m +CONFIG_NETDEVICES=y +CONFIG_DUMMY=m +CONFIG_BONDING=m +CONFIG_EQUALIZER=m +CONFIG_TUN=m +CONFIG_ETHERTAP=m +CONFIG_NET_SB1000=m + +# +# ARCnet devices +# +CONFIG_ARCNET=m +CONFIG_ARCNET_1201=m +CONFIG_ARCNET_1051=m +CONFIG_ARCNET_RAW=m +CONFIG_ARCNET_COM90xx=m +CONFIG_ARCNET_COM90xxIO=m +CONFIG_ARCNET_RIM_I=m +CONFIG_ARCNET_COM20020=m +CONFIG_ARCNET_COM20020_ISA=m +CONFIG_ARCNET_COM20020_PCI=m + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=m +CONFIG_HAPPYMEAL=m +CONFIG_SUNGEM=m +CONFIG_NET_VENDOR_3COM=y +CONFIG_EL1=m +CONFIG_EL2=m +CONFIG_ELPLUS=m +CONFIG_EL16=m +CONFIG_EL3=m +CONFIG_3C515=m +CONFIG_ELMC=m +CONFIG_ELMC_II=m +CONFIG_VORTEX=m +CONFIG_TYPHOON=m +CONFIG_LANCE=m +CONFIG_NET_VENDOR_SMC=y +CONFIG_WD80x3=m +CONFIG_ULTRAMCA=m +CONFIG_ULTRA=m +CONFIG_ULTRA32=m +CONFIG_SMC9194=m +CONFIG_NET_VENDOR_RACAL=y +CONFIG_NI5010=m +CONFIG_NI52=m +CONFIG_NI65=m + +# +# Tulip family network device support +# +CONFIG_NET_TULIP=y +CONFIG_DE2104X=m +CONFIG_TULIP=m +# CONFIG_TULIP_MWI is not set +# CONFIG_TULIP_MMIO is not set +# CONFIG_TULIP_NAPI is not set +CONFIG_DE4X5=m +CONFIG_WINBOND_840=m +CONFIG_DM9102=m +CONFIG_PCMCIA_XIRCOM=m +CONFIG_PCMCIA_XIRTULIP=m +CONFIG_AT1700=m +CONFIG_DEPCA=m +CONFIG_HP100=m +CONFIG_NET_ISA=y +CONFIG_E2100=m +CONFIG_EWRK3=m +CONFIG_EEXPRESS=m +CONFIG_EEXPRESS_PRO=m +CONFIG_HPLAN_PLUS=m +CONFIG_HPLAN=m +CONFIG_LP486E=m +CONFIG_ETH16I=m +CONFIG_NE2000=m +CONFIG_ZNET=m +CONFIG_SEEQ8005=m +# CONFIG_SKMC is not set +CONFIG_NE2_MCA=m +CONFIG_IBMLANA=m +CONFIG_NET_PCI=y +CONFIG_PCNET32=m +CONFIG_AMD8111_ETH=m +# CONFIG_AMD8111E_NAPI is not set +CONFIG_ADAPTEC_STARFIRE=m +# CONFIG_ADAPTEC_STARFIRE_NAPI is not set +CONFIG_AC3200=m +CONFIG_APRICOT=m +CONFIG_B44=m +CONFIG_FORCEDETH=m +CONFIG_CS89x0=m +CONFIG_EEPRO100=m +# CONFIG_EEPRO100_PIO is not set +CONFIG_E100=m +# CONFIG_E100_NAPI is not set +CONFIG_LNE390=m +CONFIG_FEALNX=m +CONFIG_NATSEMI=m +CONFIG_NE2K_PCI=m +CONFIG_NE3210=m +CONFIG_ES3210=m +CONFIG_8139CP=m +CONFIG_8139TOO=m +CONFIG_8139TOO_PIO=y +CONFIG_8139TOO_TUNE_TWISTER=y +CONFIG_8139TOO_8129=y +# CONFIG_8139_OLD_RX_RESET is not set +CONFIG_SIS900=m +CONFIG_EPIC100=m +CONFIG_SUNDANCE=m +# CONFIG_SUNDANCE_MMIO is not set +CONFIG_TLAN=m +CONFIG_VIA_RHINE=m +# CONFIG_VIA_RHINE_MMIO is not set +CONFIG_VIA_VELOCITY=m +CONFIG_NET_POCKET=y +CONFIG_ATP=m +CONFIG_DE600=m +CONFIG_DE620=m + +# +# Ethernet (1000 Mbit) +# +CONFIG_DL2K=m +CONFIG_E1000=m +# CONFIG_E1000_NAPI is not set +CONFIG_NS83820=m +CONFIG_HAMACHI=m +CONFIG_YELLOWFIN=m +CONFIG_R8169=m +CONFIG_SK98LIN=m +CONFIG_TIGON3=m + +# +# Ethernet (10000 Mbit) +# +CONFIG_IXGB=m +# CONFIG_IXGB_NAPI is not set +CONFIG_S2IO=m +# CONFIG_S2IO_NAPI is not set + +# +# Token Ring devices +# +CONFIG_TR=y +CONFIG_IBMTR=m +CONFIG_IBMOL=m +CONFIG_IBMLS=m +CONFIG_3C359=m +CONFIG_TMS380TR=m +CONFIG_TMSPCI=m +CONFIG_SKISA=m +CONFIG_PROTEON=m +CONFIG_ABYSS=m +CONFIG_MADGEMC=m + +# +# Wireless LAN (non-hamradio) +# +CONFIG_NET_RADIO=y + +# +# Obsolete Wireless cards support (pre-802.11) +# +CONFIG_STRIP=m +CONFIG_ARLAN=m +CONFIG_WAVELAN=m +CONFIG_PCMCIA_WAVELAN=m +CONFIG_PCMCIA_NETWAVE=m + +# +# Wireless 802.11 Frequency Hopping cards support +# +CONFIG_PCMCIA_RAYCS=m + +# +# Wireless 802.11b ISA/PCI cards support +# +CONFIG_IEEE80211=m +# CONFIG_IEEE80211_DEBUG is not set +CONFIG_IEEE80211_CRYPT=m +CONFIG_IEEE80211_WPA=y +CONFIG_IEEE80211_CRYPT_CCMP=m +CONFIG_IEEE80211_CRYPT_TKIP=m +CONFIG_IPW2100=m +CONFIG_IPW2100_PROMISC=y +# CONFIG_IPW2100_LEGACY_FW_LOAD is not set +# CONFIG_IPW2100_NOWEP is not set +# CONFIG_IPW2100_DEBUG is not set +CONFIG_IPW2200=m +# CONFIG_IPW2200_NOWEP is not set +CONFIG_WLAN_NG=m +CONFIG_PRISM2=m +CONFIG_PRISM2_USB=m +CONFIG_ACX100=m +CONFIG_ADM8211=m +CONFIG_AIRO=m +CONFIG_HERMES=m +CONFIG_PLX_HERMES=m +CONFIG_TMD_HERMES=m +CONFIG_PCI_HERMES=m +CONFIG_ATMEL=m +CONFIG_PCI_ATMEL=m + +# +# Wireless 802.11b Pcmcia/Cardbus cards support +# +CONFIG_PCMCIA_HERMES=m +CONFIG_AIRO_CS=m +CONFIG_PCMCIA_ATMEL=m +CONFIG_PCMCIA_WL3501=m + +# +# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support +# +CONFIG_PRISM54=m +CONFIG_NET_WIRELESS=y + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +CONFIG_PCMCIA_3C589=m +CONFIG_PCMCIA_3C574=m +CONFIG_PCMCIA_FMVJ18X=m +CONFIG_PCMCIA_PCNET=m +CONFIG_PCMCIA_NMCLAN=m +CONFIG_PCMCIA_SMC91C92=m +CONFIG_PCMCIA_XIRC2PS=m +CONFIG_PCMCIA_AXNET=m +CONFIG_ARCNET_COM20020_CS=m +CONFIG_PCMCIA_IBMTR=m + +# +# Wan interfaces +# +CONFIG_WAN=y +CONFIG_HOSTESS_SV11=m +CONFIG_COSA=m +CONFIG_DSCC4=m +CONFIG_DSCC4_PCISYNC=y +CONFIG_DSCC4_PCI_RST=y +CONFIG_LANMEDIA=m +CONFIG_SEALEVEL_4021=m +CONFIG_SYNCLINK_SYNCPPP=m +CONFIG_HDLC=m +CONFIG_HDLC_RAW=y +CONFIG_HDLC_RAW_ETH=y +CONFIG_HDLC_CISCO=y +CONFIG_HDLC_FR=y +CONFIG_HDLC_PPP=y +CONFIG_HDLC_X25=y +CONFIG_PCI200SYN=m +CONFIG_WANXL=m +CONFIG_PC300=m +CONFIG_PC300_MLPPP=y +CONFIG_N2=m +CONFIG_C101=m +CONFIG_FARSYNC=m +CONFIG_DLCI=m +CONFIG_DLCI_COUNT=24 +CONFIG_DLCI_MAX=8 +CONFIG_SDLA=m +CONFIG_WAN_ROUTER_DRIVERS=y +# CONFIG_VENDOR_SANGOMA is not set +CONFIG_CYCLADES_SYNC=m +CONFIG_CYCLOMX_X25=y +CONFIG_LAPBETHER=m +CONFIG_X25_ASY=m +CONFIG_SBNI=m +# CONFIG_SBNI_MULTILINE is not set + +# +# ATM drivers +# +CONFIG_ATM_TCP=m +CONFIG_ATM_LANAI=m +CONFIG_ATM_ENI=m +# CONFIG_ATM_ENI_DEBUG is not set +# CONFIG_ATM_ENI_TUNE_BURST is not set +CONFIG_ATM_FIRESTREAM=m +CONFIG_ATM_ZATM=m +# CONFIG_ATM_ZATM_DEBUG is not set +CONFIG_ATM_NICSTAR=m +# CONFIG_ATM_NICSTAR_USE_SUNI is not set +# CONFIG_ATM_NICSTAR_USE_IDT77105 is not set +CONFIG_ATM_IDT77252=m +# CONFIG_ATM_IDT77252_DEBUG is not set +# CONFIG_ATM_IDT77252_RCV_ALL is not set +CONFIG_ATM_IDT77252_USE_SUNI=y +CONFIG_ATM_AMBASSADOR=m +# CONFIG_ATM_AMBASSADOR_DEBUG is not set +CONFIG_ATM_HORIZON=m +# CONFIG_ATM_HORIZON_DEBUG is not set +CONFIG_ATM_IA=m +# CONFIG_ATM_IA_DEBUG is not set +CONFIG_ATM_FORE200E_MAYBE=m +CONFIG_ATM_FORE200E_PCA=y +CONFIG_ATM_FORE200E_PCA_DEFAULT_FW=y +# CONFIG_ATM_FORE200E_USE_TASKLET is not set +CONFIG_ATM_FORE200E_TX_RETRY=16 +CONFIG_ATM_FORE200E_DEBUG=0 +CONFIG_ATM_FORE200E=m +CONFIG_ATM_HE=m +CONFIG_ATM_HE_USE_SUNI=y +CONFIG_FDDI=y +CONFIG_DEFXX=m +CONFIG_SKFP=m +CONFIG_HIPPI=y +CONFIG_ROADRUNNER=m +# CONFIG_ROADRUNNER_LARGE_RINGS is not set +CONFIG_PLIP=m +CONFIG_PPP=m +CONFIG_PPP_MULTILINK=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_MPPE=m +CONFIG_PPPOE=m +CONFIG_PPPOATM=m +CONFIG_SLIP=m +CONFIG_SLIP_COMPRESSED=y +CONFIG_SLIP_SMART=y +CONFIG_SLIP_MODE_SLIP6=y +CONFIG_NET_FC=y +# CONFIG_IPHASE5526 is not set +CONFIG_SHAPER=m +CONFIG_NETCONSOLE=m +CONFIG_NDISWRAPPER=m + +# +# ISDN subsystem +# +CONFIG_ISDN=m + +# +# Old ISDN4Linux +# +CONFIG_ISDN_I4L=m +CONFIG_ISDN_PPP=y +CONFIG_ISDN_PPP_VJ=y +CONFIG_ISDN_MPP=y +CONFIG_IPPP_FILTER=y +CONFIG_ISDN_PPP_BSDCOMP=m +CONFIG_ISDN_AUDIO=y +CONFIG_ISDN_TTY_FAX=y +CONFIG_ISDN_X25=y + +# +# ISDN feature submodules +# +CONFIG_ISDN_DRV_LOOP=m +# CONFIG_ISDN_DIVERSION is not set + +# +# ISDN4Linux hardware drivers +# + +# +# Passive cards +# +CONFIG_ISDN_DRV_HISAX=m + +# +# D-channel protocol features +# +CONFIG_HISAX_EURO=y +CONFIG_DE_AOC=y +# CONFIG_HISAX_NO_SENDCOMPLETE is not set +# CONFIG_HISAX_NO_LLC is not set +# CONFIG_HISAX_NO_KEYPAD is not set +CONFIG_HISAX_1TR6=y +CONFIG_HISAX_NI1=y +CONFIG_HISAX_MAX_CARDS=8 + +# +# HiSax supported cards +# +CONFIG_HISAX_16_0=y +CONFIG_HISAX_16_3=y +CONFIG_HISAX_TELESPCI=y +CONFIG_HISAX_S0BOX=y +CONFIG_HISAX_AVM_A1=y +CONFIG_HISAX_FRITZPCI=y +CONFIG_HISAX_AVM_A1_PCMCIA=y +CONFIG_HISAX_ELSA=y +CONFIG_HISAX_IX1MICROR2=y +CONFIG_HISAX_DIEHLDIVA=y +CONFIG_HISAX_ASUSCOM=y +CONFIG_HISAX_TELEINT=y +CONFIG_HISAX_HFCS=y +CONFIG_HISAX_SEDLBAUER=y +CONFIG_HISAX_SPORTSTER=y +CONFIG_HISAX_MIC=y +CONFIG_HISAX_NETJET=y +CONFIG_HISAX_NETJET_U=y +CONFIG_HISAX_NICCY=y +CONFIG_HISAX_ISURF=y +CONFIG_HISAX_HSTSAPHIR=y +CONFIG_HISAX_BKM_A4T=y +CONFIG_HISAX_SCT_QUADRO=y +CONFIG_HISAX_GAZEL=y +CONFIG_HISAX_HFC_PCI=y +CONFIG_HISAX_W6692=y +CONFIG_HISAX_HFC_SX=y +CONFIG_HISAX_ENTERNOW_PCI=y +# CONFIG_HISAX_DEBUG is not set + +# +# HiSax PCMCIA card service modules +# +CONFIG_HISAX_SEDLBAUER_CS=m +CONFIG_HISAX_ELSA_CS=m +CONFIG_HISAX_AVM_A1_CS=m +CONFIG_HISAX_TELES_CS=m + +# +# HiSax sub driver modules +# +CONFIG_HISAX_ST5481=m +CONFIG_HISAX_HFCUSB=m +CONFIG_HISAX_FRITZ_PCIPNP=m +CONFIG_HISAX_HDLC=y + +# +# Active cards +# +CONFIG_ISDN_DRV_ICN=m +CONFIG_ISDN_DRV_PCBIT=m +CONFIG_ISDN_DRV_SC=m +CONFIG_ISDN_DRV_ACT2000=m +CONFIG_ISDN_DRV_TPAM=m +CONFIG_HYSDN=m +CONFIG_HYSDN_CAPI=y + +# +# CAPI subsystem +# +CONFIG_ISDN_CAPI=m +CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON=y +CONFIG_ISDN_CAPI_MIDDLEWARE=y +CONFIG_ISDN_CAPI_CAPI20=m +CONFIG_ISDN_CAPI_CAPIFS_BOOL=y +CONFIG_ISDN_CAPI_CAPIFS=m +CONFIG_ISDN_CAPI_CAPIDRV=m + +# +# CAPI hardware drivers +# + +# +# Active AVM cards +# +CONFIG_CAPI_AVM=y +CONFIG_ISDN_DRV_AVMB1_B1ISA=m +CONFIG_ISDN_DRV_AVMB1_B1PCI=m +CONFIG_ISDN_DRV_AVMB1_B1PCIV4=y +CONFIG_ISDN_DRV_AVMB1_T1ISA=m +CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m +CONFIG_ISDN_DRV_AVMB1_AVM_CS=m +CONFIG_ISDN_DRV_AVMB1_T1PCI=m +CONFIG_ISDN_DRV_AVMB1_C4=m + +# +# Active Eicon DIVA Server cards +# +CONFIG_CAPI_EICON=y +CONFIG_ISDN_DIVAS=m +CONFIG_ISDN_DIVAS_BRIPCI=y +CONFIG_ISDN_DIVAS_PRIPCI=y +CONFIG_ISDN_DIVAS_DIVACAPI=m +CONFIG_ISDN_DIVAS_USERIDI=m +CONFIG_ISDN_DIVAS_MAINT=m + +# +# Modular ISDN driver +# +CONFIG_MISDN_DRV=m +# CONFIG_MISDN_MEMDEBUG is not set +CONFIG_MISDN_AVM_FRITZ=y +CONFIG_MISDN_HFCPCI=y +CONFIG_MISDN_HFCMULTI=y +CONFIG_MISDN_SPEEDFAX=y +CONFIG_MISDN_W6692=y +CONFIG_MISDN_DSP=y + +# +# Telephony Support +# +CONFIG_PHONE=m +CONFIG_PHONE_IXJ=m +CONFIG_PHONE_IXJ_PCMCIA=m + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=m +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_MOUSEDEV_PSAUX_ENABLE=y +CONFIG_INPUT_JOYDEV=m +CONFIG_INPUT_TSDEV=m +CONFIG_INPUT_TSDEV_SCREEN_X=240 +CONFIG_INPUT_TSDEV_SCREEN_Y=320 +CONFIG_INPUT_EVDEV=m +CONFIG_INPUT_EVBUG=m + +# +# Input I/O drivers +# +CONFIG_GAMEPORT=m +CONFIG_SOUND_GAMEPORT=m +CONFIG_GAMEPORT_NS558=m +CONFIG_GAMEPORT_L4=m +CONFIG_GAMEPORT_EMU10K1=m +CONFIG_GAMEPORT_VORTEX=m +CONFIG_GAMEPORT_FM801=m +CONFIG_GAMEPORT_CS461x=m +CONFIG_SERIO=y +CONFIG_SERIO_I8042=y +CONFIG_SERIO_SERPORT=m +CONFIG_SERIO_CT82C710=m +CONFIG_SERIO_PARKBD=m +CONFIG_SERIO_PCIPS2=m + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=y +CONFIG_KEYBOARD_SUNKBD=m +CONFIG_KEYBOARD_LKKBD=m +CONFIG_KEYBOARD_XTKBD=m +CONFIG_KEYBOARD_NEWTON=m +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=m +CONFIG_MOUSE_SERIAL=m +CONFIG_MOUSE_INPORT=m +# CONFIG_MOUSE_ATIXL is not set +CONFIG_MOUSE_LOGIBM=m +CONFIG_MOUSE_PC110PAD=m +CONFIG_MOUSE_VSXXXAA=m +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_ANALOG=m +CONFIG_JOYSTICK_A3D=m +CONFIG_JOYSTICK_ADI=m +CONFIG_JOYSTICK_COBRA=m +CONFIG_JOYSTICK_GF2K=m +CONFIG_JOYSTICK_GRIP=m +CONFIG_JOYSTICK_GRIP_MP=m +CONFIG_JOYSTICK_GUILLEMOT=m +CONFIG_JOYSTICK_INTERACT=m +CONFIG_JOYSTICK_SIDEWINDER=m +CONFIG_JOYSTICK_TMDC=m +CONFIG_JOYSTICK_IFORCE=m +CONFIG_JOYSTICK_IFORCE_USB=y +CONFIG_JOYSTICK_IFORCE_232=y +CONFIG_JOYSTICK_WARRIOR=m +CONFIG_JOYSTICK_MAGELLAN=m +CONFIG_JOYSTICK_SPACEORB=m +CONFIG_JOYSTICK_SPACEBALL=m +CONFIG_JOYSTICK_STINGER=m +CONFIG_JOYSTICK_TWIDDLER=m +CONFIG_JOYSTICK_DB9=m +CONFIG_JOYSTICK_GAMECON=m +CONFIG_JOYSTICK_TURBOGRAFX=m +CONFIG_INPUT_JOYDUMP=m +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_GUNZE=m +CONFIG_INPUT_MISC=y +CONFIG_INPUT_PCSPKR=m +CONFIG_INPUT_UINPUT=m + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +CONFIG_SERIAL_NONSTANDARD=y +CONFIG_COMPUTONE=m +CONFIG_ROCKETPORT=m +CONFIG_CYCLADES=m +# CONFIG_CYZ_INTR is not set +CONFIG_DIGIEPCA=m +# CONFIG_ESPSERIAL is not set +CONFIG_MOXA_INTELLIO=m +CONFIG_MOXA_SMARTIO=m +# CONFIG_ISI is not set +CONFIG_SYNCLINK=m +CONFIG_SYNCLINKMP=m +CONFIG_N_HDLC=m +# CONFIG_RISCOM8 is not set +# CONFIG_SPECIALIX is not set +CONFIG_SX=m +CONFIG_RIO=m +CONFIG_RIO_OLDPCI=y +CONFIG_STALDRV=y +CONFIG_STALLION=m +CONFIG_ISTALLION=m + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_CS=m +# CONFIG_SERIAL_8250_ACPI is not set +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_MANY_PORTS=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +CONFIG_SERIAL_8250_MULTIPORT=y +CONFIG_SERIAL_8250_RSA=y + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=256 +CONFIG_PRINTER=m +# CONFIG_LP_CONSOLE is not set +CONFIG_PPDEV=m +CONFIG_TIPAR=m +CONFIG_QIC02_TAPE=m +CONFIG_QIC02_DYNCONF=y + +# +# Setting runtime QIC-02 configuration is done with qic02conf +# + +# +# from the tpqic02-support package. It is available at +# + +# +# metalab.unc.edu or ftp://titus.cfw.com/pub/Linux/util/ +# + +# +# IPMI +# +CONFIG_IPMI_HANDLER=m +# CONFIG_IPMI_PANIC_EVENT is not set +CONFIG_IPMI_DEVICE_INTERFACE=m +CONFIG_IPMI_SI=m +CONFIG_IPMI_WATCHDOG=m + +# +# Watchdog Cards +# +CONFIG_WATCHDOG=y +# CONFIG_WATCHDOG_NOWAYOUT is not set + +# +# Watchdog Device Drivers +# +CONFIG_SOFT_WATCHDOG=m +CONFIG_ACQUIRE_WDT=m +CONFIG_ADVANTECH_WDT=m +CONFIG_ALIM1535_WDT=m +CONFIG_ALIM7101_WDT=m +CONFIG_SC520_WDT=m +CONFIG_EUROTECH_WDT=m +CONFIG_IB700_WDT=m +CONFIG_WAFER_WDT=m +CONFIG_I8XX_TCO=m +CONFIG_SC1200_WDT=m +CONFIG_SCx200_WDT=m +CONFIG_60XX_WDT=m +CONFIG_CPU5_WDT=m +CONFIG_W83627HF_WDT=m +CONFIG_W83877F_WDT=m +CONFIG_MACHZ_WDT=m + +# +# ISA-based Watchdog Cards +# +CONFIG_PCWATCHDOG=m +CONFIG_MIXCOMWD=m +CONFIG_WDT=m +CONFIG_WDT_501=y + +# +# PCI-based Watchdog Cards +# +CONFIG_PCIPCWATCHDOG=m +CONFIG_WDTPCI=m +CONFIG_WDT_501_PCI=y + +# +# USB-based Watchdog Cards +# +CONFIG_USBPCWATCHDOG=m +CONFIG_HW_RANDOM=m +CONFIG_NVRAM=m +CONFIG_RTC=m +CONFIG_GEN_RTC=m +CONFIG_GEN_RTC_X=y +CONFIG_DTLK=m +CONFIG_R3964=m +CONFIG_APPLICOM=m +CONFIG_SONYPI=m + +# +# Ftape, the floppy tape device driver +# +CONFIG_FTAPE=m +CONFIG_ZFTAPE=m +CONFIG_ZFT_DFLT_BLK_SZ=10240 + +# +# The compressor will be built as a module only! +# +CONFIG_ZFT_COMPRESSOR=m +CONFIG_FT_NR_BUFFERS=3 +CONFIG_FT_PROC_FS=y +CONFIG_FT_NORMAL_DEBUG=y +# CONFIG_FT_FULL_DEBUG is not set +# CONFIG_FT_NO_TRACE is not set +# CONFIG_FT_NO_TRACE_AT_ALL is not set + +# +# Hardware configuration +# +CONFIG_FT_STD_FDC=y +# CONFIG_FT_MACH2 is not set +# CONFIG_FT_PROBE_FC10 is not set +# CONFIG_FT_ALT_FDC is not set +CONFIG_FT_FDC_THR=8 +CONFIG_FT_FDC_MAX_RATE=2000 +CONFIG_FT_ALPHA_CLOCK=0 +CONFIG_AGP=m +CONFIG_AGP_ALI=m +CONFIG_AGP_ATI=m +CONFIG_AGP_AMD=m +CONFIG_AGP_AMD64=m +CONFIG_AGP_INTEL=m +CONFIG_AGP_INTEL_MCH=m +CONFIG_AGP_NVIDIA=m +CONFIG_AGP_SIS=m +CONFIG_AGP_SWORKS=m +CONFIG_AGP_VIA=m +CONFIG_AGP_EFFICEON=m +CONFIG_DRM=y +CONFIG_DRM_TDFX=m +CONFIG_DRM_GAMMA=m +CONFIG_DRM_R128=m +CONFIG_DRM_RADEON=m +CONFIG_DRM_I810=m +CONFIG_DRM_I830=m +CONFIG_DRM_MGA=m +CONFIG_DRM_SIS=m + +# +# PCMCIA character devices +# +CONFIG_SYNCLINK_CS=m +CONFIG_MWAVE=m +CONFIG_SCx200_GPIO=m +CONFIG_RAW_DRIVER=m +CONFIG_HPET=y +# CONFIG_HPET_RTC_IRQ is not set +CONFIG_HPET_MMAP=y +CONFIG_MAX_RAW_DEVS=256 +CONFIG_HANGCHECK_TIMER=m + +# +# I2C support +# +CONFIG_I2C=m +CONFIG_I2C_CHARDEV=m + +# +# I2C Algorithms +# +CONFIG_I2C_ALGOBIT=m +CONFIG_I2C_ALGOPCF=m + +# +# I2C Hardware Bus support +# +CONFIG_I2C_ALI1535=m +CONFIG_I2C_ALI1563=m +CONFIG_I2C_ALI15X3=m +CONFIG_I2C_AMD756=m +CONFIG_I2C_AMD8111=m +CONFIG_I2C_ELEKTOR=m +CONFIG_I2C_I801=m +CONFIG_I2C_I810=m +CONFIG_I2C_ISA=m +CONFIG_I2C_NFORCE2=m +CONFIG_I2C_PARPORT=m +CONFIG_I2C_PARPORT_LIGHT=m +CONFIG_I2C_PIIX4=m +CONFIG_I2C_PROSAVAGE=m +CONFIG_I2C_SAVAGE4=m +CONFIG_SCx200_I2C=m +CONFIG_SCx200_I2C_SCL=12 +CONFIG_SCx200_I2C_SDA=13 +CONFIG_SCx200_ACB=m +CONFIG_I2C_SIS5595=m +CONFIG_I2C_SIS630=m +CONFIG_I2C_SIS96X=m +CONFIG_I2C_VIA=m +CONFIG_I2C_VIAPRO=m +CONFIG_I2C_VOODOO3=m + +# +# Hardware Sensors Chip support +# +CONFIG_I2C_SENSOR=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM1025=m +CONFIG_SENSORS_ADM1031=m +CONFIG_SENSORS_ASB100=m +CONFIG_SENSORS_DS1621=m +CONFIG_SENSORS_FSCHER=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_IT87=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM77=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_LM83=m +CONFIG_SENSORS_LM85=m +CONFIG_SENSORS_LM90=m +CONFIG_SENSORS_MAX1619=m +CONFIG_SENSORS_VIA686A=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_W83L785TS=m +CONFIG_SENSORS_W83627HF=m + +# +# Other I2C Chip support +# +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_PCF8574=m +CONFIG_SENSORS_PCF8591=m +CONFIG_SENSORS_RTC8564=m +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set + +# +# Dallas's 1-wire bus +# +CONFIG_W1=m +CONFIG_W1_MATROX=m +CONFIG_W1_THERM=m + +# +# Misc devices +# +CONFIG_IBM_ASM=m + +# +# Multimedia devices +# +CONFIG_VIDEO_DEV=m + +# +# Video For Linux +# + +# +# Video Adapters +# +CONFIG_VIDEO_BT848=m +CONFIG_VIDEO_PMS=m +CONFIG_VIDEO_BWQCAM=m +CONFIG_VIDEO_CQCAM=m +CONFIG_VIDEO_W9966=m +CONFIG_VIDEO_CPIA=m +CONFIG_VIDEO_CPIA_PP=m +CONFIG_VIDEO_CPIA_USB=m +CONFIG_VIDEO_SAA5246A=m +CONFIG_VIDEO_SAA5249=m +CONFIG_TUNER_3036=m +CONFIG_VIDEO_STRADIS=m +# CONFIG_VIDEO_ZORAN is not set +# CONFIG_VIDEO_ZR36120 is not set +CONFIG_VIDEO_MEYE=m +CONFIG_VIDEO_SAA7134=m +CONFIG_VIDEO_MXB=m +CONFIG_VIDEO_DPC=m +CONFIG_VIDEO_HEXIUM_ORION=m +CONFIG_VIDEO_HEXIUM_GEMINI=m +CONFIG_VIDEO_CX88=m +CONFIG_VIDEO_OVCAMCHIP=m + +# +# Radio Adapters +# +CONFIG_RADIO_CADET=m +CONFIG_RADIO_RTRACK=m +CONFIG_RADIO_RTRACK2=m +CONFIG_RADIO_AZTECH=m +CONFIG_RADIO_GEMTEK=m +CONFIG_RADIO_GEMTEK_PCI=m +CONFIG_RADIO_MAXIRADIO=m +CONFIG_RADIO_MAESTRO=m +CONFIG_RADIO_MIROPCM20=m +CONFIG_RADIO_MIROPCM20_RDS=m +CONFIG_RADIO_SF16FMI=m +CONFIG_RADIO_SF16FMR2=m +CONFIG_RADIO_TERRATEC=m +CONFIG_RADIO_TRUST=m +CONFIG_RADIO_TYPHOON=m +CONFIG_RADIO_TYPHOON_PROC_FS=y +CONFIG_RADIO_ZOLTRIX=m + +# +# Digital Video Broadcasting Devices +# +CONFIG_DVB=y +CONFIG_DVB_CORE=m + +# +# Supported Frontend Modules +# +CONFIG_DVB_TWINHAN_DST=m +CONFIG_DVB_STV0299=m +CONFIG_DVB_SP887X=m +CONFIG_DVB_SP887X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/sc_main.mc" +CONFIG_DVB_ALPS_TDLB7=m +CONFIG_DVB_ALPS_TDMB7=m +CONFIG_DVB_ATMEL_AT76C651=m +CONFIG_DVB_CX24110=m +CONFIG_DVB_GRUNDIG_29504_491=m +CONFIG_DVB_GRUNDIG_29504_401=m +CONFIG_DVB_MT312=m +CONFIG_DVB_VES1820=m +CONFIG_DVB_VES1X93=m +CONFIG_DVB_TDA1004X=m +CONFIG_DVB_TDA1004X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/tda1004x.bin" +CONFIG_DVB_NXT6000=m + +# +# Supported SAA7146 based PCI Adapters +# +CONFIG_DVB_AV7110=m +# CONFIG_DVB_AV7110_OSD is not set +CONFIG_DVB_BUDGET=m +CONFIG_DVB_BUDGET_CI=m +CONFIG_DVB_BUDGET_AV=m +CONFIG_DVB_BUDGET_PATCH=m + +# +# Supported USB Adapters +# +CONFIG_DVB_TTUSB_BUDGET=m +CONFIG_DVB_TTUSB_DEC=m + +# +# Supported FlexCopII (B2C2) Adapters +# +CONFIG_DVB_B2C2_SKYSTAR=m + +# +# Supported BT878 Adapters +# +CONFIG_DVB_BT8XX=m +CONFIG_VIDEO_SAA7146=m +CONFIG_VIDEO_SAA7146_VV=m +CONFIG_VIDEO_VIDEOBUF=m +CONFIG_VIDEO_TUNER=m +CONFIG_VIDEO_BUF=m +CONFIG_VIDEO_BTCX=m +CONFIG_VIDEO_IR=m + +# +# Graphics support +# +CONFIG_FB=y +CONFIG_FB_CIRRUS=m +CONFIG_FB_PM2=m +CONFIG_FB_PM2_FIFO_DISCONNECT=y +CONFIG_FB_CYBER2000=m +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +CONFIG_FB_VGA16=m +CONFIG_FB_VESA=m +CONFIG_VIDEO_SELECT=y +CONFIG_FB_HGA=m +# CONFIG_FB_HGA_ACCEL is not set +CONFIG_FB_RIVA=m +CONFIG_FB_RIVA_I2C=y +CONFIG_FB_RIVA_DEBUG=y +CONFIG_FB_I810=m +# CONFIG_FB_I810_GTF is not set +CONFIG_FB_MATROX=m +CONFIG_FB_MATROX_MILLENIUM=y +CONFIG_FB_MATROX_MYSTIQUE=y +CONFIG_FB_MATROX_G450=y +CONFIG_FB_MATROX_G100=y +CONFIG_FB_MATROX_I2C=m +CONFIG_FB_MATROX_MAVEN=m +CONFIG_FB_MATROX_MULTIHEAD=y +CONFIG_FB_RADEON_OLD=m +CONFIG_FB_RADEON=m +CONFIG_FB_RADEON_I2C=y +# CONFIG_FB_RADEON_DEBUG is not set +CONFIG_FB_ATY128=m +CONFIG_FB_ATY=m +CONFIG_FB_ATY_CT=y +CONFIG_FB_ATY_GX=y +CONFIG_FB_ATY_XL_INIT=y +CONFIG_FB_SIS=m +CONFIG_FB_SIS_300=y +CONFIG_FB_SIS_315=y +CONFIG_FB_NEOMAGIC=m +CONFIG_FB_KYRO=m +CONFIG_FB_3DFX=m +# CONFIG_FB_3DFX_ACCEL is not set +CONFIG_FB_VOODOO1=m +CONFIG_FB_TRIDENT=m +# CONFIG_FB_TRIDENT_ACCEL is not set +# CONFIG_FB_PM3 is not set +CONFIG_FB_VIRTUAL=m + +# +# Console display driver support +# +CONFIG_VGA_CONSOLE=y +CONFIG_MDA_CONSOLE=m +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=m +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y + +# +# Logo configuration +# +# CONFIG_LOGO is not set + +# +# Sound +# +CONFIG_SOUND=m + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +CONFIG_SND_HWDEP=m +CONFIG_SND_RAWMIDI=m +CONFIG_SND_SEQUENCER=m +CONFIG_SND_SEQ_DUMMY=m +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=m +CONFIG_SND_PCM_OSS=m +CONFIG_SND_SEQUENCER_OSS=y +CONFIG_SND_RTCTIMER=m +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set + +# +# Generic devices +# +CONFIG_SND_MPU401_UART=m +CONFIG_SND_OPL3_LIB=m +CONFIG_SND_OPL4_LIB=m +CONFIG_SND_VX_LIB=m +CONFIG_SND_DUMMY=m +CONFIG_SND_VIRMIDI=m +CONFIG_SND_MTPAV=m +CONFIG_SND_SERIAL_U16550=m +CONFIG_SND_MPU401=m + +# +# ISA devices +# +CONFIG_SND_AD1816A=m +CONFIG_SND_AD1848=m +CONFIG_SND_CS4231=m +CONFIG_SND_CS4232=m +CONFIG_SND_CS4236=m +CONFIG_SND_ES968=m +CONFIG_SND_ES1688=m +CONFIG_SND_ES18XX=m +CONFIG_SND_GUSCLASSIC=m +CONFIG_SND_GUSEXTREME=m +CONFIG_SND_GUSMAX=m +CONFIG_SND_INTERWAVE=m +CONFIG_SND_INTERWAVE_STB=m +CONFIG_SND_OPTI92X_AD1848=m +CONFIG_SND_OPTI92X_CS4231=m +CONFIG_SND_OPTI93X=m +CONFIG_SND_SB8=m +CONFIG_SND_SB16=m +CONFIG_SND_SBAWE=m +CONFIG_SND_SB16_CSP=y +CONFIG_SND_WAVEFRONT=m +CONFIG_SND_ALS100=m +CONFIG_SND_AZT2320=m +CONFIG_SND_CMI8330=m +CONFIG_SND_DT019X=m +CONFIG_SND_OPL3SA2=m +CONFIG_SND_SGALAXY=m +CONFIG_SND_SSCAPE=m + +# +# PCI devices +# +CONFIG_SND_AC97_CODEC=m +CONFIG_SND_ALI5451=m +CONFIG_SND_ATIIXP=m +CONFIG_SND_AU8810=m +CONFIG_SND_AU8820=m +CONFIG_SND_AU8830=m +CONFIG_SND_AZT3328=m +CONFIG_SND_BT87X=m +CONFIG_SND_CS46XX=m +CONFIG_SND_CS46XX_NEW_DSP=y +CONFIG_SND_CS4281=m +CONFIG_SND_EMU10K1=m +CONFIG_SND_KORG1212=m +CONFIG_SND_MIXART=m +CONFIG_SND_NM256=m +CONFIG_SND_RME32=m +CONFIG_SND_RME96=m +CONFIG_SND_RME9652=m +CONFIG_SND_HDSP=m +CONFIG_SND_TRIDENT=m +CONFIG_SND_YMFPCI=m +CONFIG_SND_ALS4000=m +CONFIG_SND_CMIPCI=m +CONFIG_SND_ENS1370=m +CONFIG_SND_ENS1371=m +CONFIG_SND_ES1938=m +CONFIG_SND_ES1968=m +CONFIG_SND_MAESTRO3=m +CONFIG_SND_FM801=m +CONFIG_SND_FM801_TEA575X=m +CONFIG_SND_ICE1712=m +CONFIG_SND_ICE1724=m +CONFIG_SND_INTEL8X0=m +CONFIG_SND_INTEL8X0M=m +CONFIG_SND_SONICVIBES=m +CONFIG_SND_VIA82XX=m +CONFIG_SND_VX222=m + +# +# ALSA USB devices +# +CONFIG_SND_USB_AUDIO=m + +# +# PCMCIA devices +# +CONFIG_SND_VXPOCKET=m +CONFIG_SND_VXP440=m +CONFIG_SND_PDAUDIOCF=m + +# +# Open Sound System +# +CONFIG_SOUND_PRIME=m +CONFIG_SOUND_BT878=m +CONFIG_SOUND_CMPCI=m +# CONFIG_SOUND_CMPCI_FM is not set +# CONFIG_SOUND_CMPCI_MIDI is not set +CONFIG_SOUND_CMPCI_JOYSTICK=y +CONFIG_SOUND_EMU10K1=m +CONFIG_MIDI_EMU10K1=y +CONFIG_SOUND_FUSION=m +CONFIG_SOUND_CS4281=m +CONFIG_SOUND_ES1370=m +CONFIG_SOUND_ES1371=m +CONFIG_SOUND_ESSSOLO1=m +CONFIG_SOUND_MAESTRO=m +CONFIG_SOUND_MAESTRO3=m +CONFIG_SOUND_ICH=m +CONFIG_SOUND_SONICVIBES=m +CONFIG_SOUND_TRIDENT=m +# CONFIG_SOUND_MSNDCLAS is not set +# CONFIG_SOUND_MSNDPIN is not set +CONFIG_SOUND_VIA82CXXX=m +CONFIG_MIDI_VIA82CXXX=y +CONFIG_SOUND_OSS=m +# CONFIG_SOUND_TRACEINIT is not set +# CONFIG_SOUND_DMAP is not set +# CONFIG_SOUND_AD1816 is not set +CONFIG_SOUND_AD1889=m +CONFIG_SOUND_SGALAXY=m +CONFIG_SOUND_ADLIB=m +CONFIG_SOUND_ACI_MIXER=m +CONFIG_SOUND_CS4232=m +CONFIG_SOUND_SSCAPE=m +CONFIG_SOUND_GUS=m +CONFIG_SOUND_GUS16=y +CONFIG_SOUND_GUSMAX=y +CONFIG_SOUND_VMIDI=m +CONFIG_SOUND_TRIX=m +CONFIG_SOUND_MSS=m +CONFIG_SOUND_MPU401=m +CONFIG_SOUND_NM256=m +CONFIG_SOUND_MAD16=m +CONFIG_MAD16_OLDCARD=y +CONFIG_SOUND_PAS=m +CONFIG_SOUND_PSS=m +CONFIG_PSS_MIXER=y +CONFIG_SOUND_SB=m +# CONFIG_SOUND_AWE32_SYNTH is not set +CONFIG_SOUND_WAVEFRONT=m +CONFIG_SOUND_MAUI=m +CONFIG_SOUND_YM3812=m +CONFIG_SOUND_OPL3SA1=m +CONFIG_SOUND_OPL3SA2=m +CONFIG_SOUND_YMFPCI=m +# CONFIG_SOUND_YMFPCI_LEGACY is not set +CONFIG_SOUND_UART6850=m +CONFIG_SOUND_AEDSP16=m +CONFIG_SC6600=y +CONFIG_SC6600_JOY=y +CONFIG_SC6600_CDROM=4 +CONFIG_SC6600_CDROMBASE=0x0 +# CONFIG_AEDSP16_MSS is not set +# CONFIG_AEDSP16_SBPRO is not set +# CONFIG_AEDSP16_MPU401 is not set +CONFIG_SOUND_TVMIXER=m +CONFIG_SOUND_KAHLUA=m +CONFIG_SOUND_ALI5455=m +CONFIG_SOUND_FORTE=m +CONFIG_SOUND_RME96XX=m +CONFIG_SOUND_AD1980=m + +# +# USB support +# +CONFIG_USB=m +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +CONFIG_USB_BANDWIDTH=y +# CONFIG_USB_DYNAMIC_MINORS is not set + +# +# USB Host Controller Drivers +# +CONFIG_USB_EHCI_HCD=m +CONFIG_USB_EHCI_SPLIT_ISO=y +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_OHCI_HCD=m +CONFIG_USB_UHCI_HCD=m + +# +# USB Device Class drivers +# +CONFIG_USB_AUDIO=m + +# +# USB Bluetooth TTY can only be used with disabled Bluetooth subsystem +# +CONFIG_USB_MIDI=m +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +CONFIG_USB_STORAGE_RW_DETECT=y +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_DPCM=y +CONFIG_USB_STORAGE_HP8200e=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y + +# +# USB Human Interface Devices (HID) +# +CONFIG_USB_HID=m +CONFIG_USB_HIDINPUT=y +# CONFIG_HID_FF is not set +CONFIG_USB_HIDDEV=y + +# +# USB HID Boot Protocol drivers +# +CONFIG_USB_KBD=m +CONFIG_USB_MOUSE=m +CONFIG_USB_AIPTEK=m +CONFIG_USB_WACOM=m +CONFIG_USB_KBTAB=m +CONFIG_USB_POWERMATE=m +CONFIG_USB_MTOUCH=m +CONFIG_USB_EGALAX=m +CONFIG_USB_XPAD=m +CONFIG_USB_ATI_REMOTE=m + +# +# USB Imaging devices +# +CONFIG_USB_MDC800=m +CONFIG_USB_MICROTEK=m +CONFIG_USB_HPUSBSCSI=m + +# +# USB Multimedia devices +# +CONFIG_USB_VICAM=m +CONFIG_USB_DSBR=m +CONFIG_USB_IBMCAM=m +CONFIG_USB_KONICAWC=m +CONFIG_USB_OV511=m +CONFIG_USB_PWC=m +CONFIG_USB_SE401=m +CONFIG_USB_SN9C102=m +CONFIG_USB_STV680=m +CONFIG_USB_W9968CF=m + +# +# USB Network adaptors +# +CONFIG_USB_CATC=m +CONFIG_USB_KAWETH=m +CONFIG_USB_PEGASUS=m +CONFIG_USB_RTL8150=m +CONFIG_USB_USBNET=m + +# +# USB Host-to-Host Cables +# +CONFIG_USB_ALI_M5632=y +CONFIG_USB_AN2720=y +CONFIG_USB_BELKIN=y +CONFIG_USB_GENESYS=y +CONFIG_USB_NET1080=y +CONFIG_USB_PL2301=y + +# +# Intelligent USB Devices/Gadgets +# +CONFIG_USB_ARMLINUX=y +CONFIG_USB_EPSON2888=y +CONFIG_USB_ZAURUS=y +CONFIG_USB_CDCETHER=y + +# +# USB Network Adapters +# +CONFIG_USB_AX8817X=y + +# +# USB port drivers +# +CONFIG_USB_USS720=m + +# +# USB Serial Converter support +# +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_BELKIN=m +CONFIG_USB_SERIAL_WHITEHEAT=m +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m +CONFIG_USB_SERIAL_EMPEG=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_VISOR=m +CONFIG_USB_SERIAL_IPAQ=m +CONFIG_USB_SERIAL_IR=m +CONFIG_USB_SERIAL_EDGEPORT=m +CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_KEYSPAN_PDA=m +CONFIG_USB_SERIAL_KEYSPAN=m +CONFIG_USB_SERIAL_KLSI=m +CONFIG_USB_SERIAL_KOBIL_SCT=m +CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_SAFE=m +# CONFIG_USB_SERIAL_SAFE_PADDED is not set +CONFIG_USB_SERIAL_CYBERJACK=m +CONFIG_USB_SERIAL_XIRCOM=m +CONFIG_USB_SERIAL_OMNINET=m +CONFIG_USB_EZUSB=y + +# +# USB Miscellaneous drivers +# +CONFIG_USB_TIGL=m +CONFIG_USB_AUERSWALD=m +CONFIG_USB_RIO500=m +CONFIG_USB_LEGOTOWER=m +CONFIG_USB_LCD=m +CONFIG_USB_LED=m +CONFIG_USB_CYTHERM=m +CONFIG_USB_SPEEDTOUCH=m +CONFIG_USB_PHIDGETSERVO=m +CONFIG_USB_TEST=m +CONFIG_USB_EAGLE=m + +# +# USB Gadget Support +# +CONFIG_USB_GADGET=m +CONFIG_USB_GADGET_NET2280=y +CONFIG_USB_NET2280=m +# CONFIG_USB_GADGET_PXA2XX is not set +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_SA1100 is not set +# CONFIG_USB_GADGET_DUMMY_HCD is not set +CONFIG_USB_GADGET_DUALSPEED=y +CONFIG_USB_ZERO=m +CONFIG_USB_ETH=m +CONFIG_USB_ETH_RNDIS=y +CONFIG_USB_GADGETFS=m +CONFIG_USB_FILE_STORAGE=m +# CONFIG_USB_FILE_STORAGE_TEST is not set +CONFIG_USB_G_SERIAL=m + +# +# File systems +# +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_POSIX_ACL=y +CONFIG_EXT2_FS_SECURITY=y +CONFIG_EXT3_FS=m +CONFIG_EXT3_FS_XATTR=y +CONFIG_EXT3_FS_POSIX_ACL=y +CONFIG_EXT3_FS_SECURITY=y +CONFIG_JBD=m +# CONFIG_JBD_DEBUG is not set +CONFIG_FS_MBCACHE=y +CONFIG_REISERFS_FS=m +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +# CONFIG_REISERFS_FS_XATTR is not set +CONFIG_JFS_FS=m +CONFIG_JFS_POSIX_ACL=y +# CONFIG_JFS_DEBUG is not set +CONFIG_JFS_STATISTICS=y +CONFIG_FS_POSIX_ACL=y +CONFIG_XFS_FS=m +CONFIG_XFS_RT=y +CONFIG_XFS_QUOTA=y +CONFIG_XFS_SECURITY=y +CONFIG_XFS_POSIX_ACL=y +CONFIG_MINIX_FS=m +CONFIG_ROMFS_FS=m +CONFIG_QUOTA=y +CONFIG_QFMT_V1=m +CONFIG_QFMT_V2=m +CONFIG_QUOTACTL=y +CONFIG_AUTOFS_FS=m +CONFIG_AUTOFS4_FS=m + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=m +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_ZISOFS_FS=m +CONFIG_UDF_FS=m +CONFIG_UDF_NLS=y + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +CONFIG_NTFS_FS=m +# CONFIG_NTFS_DEBUG is not set +# CONFIG_NTFS_RW is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_SYSFS=y +CONFIG_DEVFS_FS=y +# CONFIG_DEVFS_MOUNT is not set +# CONFIG_DEVFS_DEBUG is not set +CONFIG_DEVPTS_FS_XATTR=y +CONFIG_DEVPTS_FS_SECURITY=y +CONFIG_TMPFS=y +# CONFIG_HUGETLBFS is not set +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y + +# +# Miscellaneous filesystems +# +CONFIG_ADFS_FS=m +# CONFIG_ADFS_FS_RW is not set +CONFIG_AFFS_FS=m +CONFIG_ASFS_FS=m +# CONFIG_ASFS_RW is not set +CONFIG_HFS_FS=m +CONFIG_HFSPLUS_FS=m +CONFIG_BEFS_FS=m +# CONFIG_BEFS_DEBUG is not set +CONFIG_BFS_FS=m +CONFIG_EFS_FS=m +CONFIG_JFFS_FS=m +CONFIG_JFFS_FS_VERBOSE=0 +CONFIG_JFFS_PROC_FS=y +CONFIG_JFFS2_FS=m +CONFIG_JFFS2_FS_DEBUG=0 +# CONFIG_JFFS2_FS_NAND is not set +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set +CONFIG_JFFS2_ZLIB=y +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +CONFIG_CRAMFS=y +CONFIG_VXFS_FS=m +CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +# CONFIG_QNX4FS_RW is not set +CONFIG_SYSV_FS=m +CONFIG_UFS_FS=m +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=m +CONFIG_NFS_V3=y +CONFIG_NFS_V4=y +CONFIG_NFS_DIRECTIO=y +CONFIG_NFSD=m +CONFIG_NFSD_V3=y +CONFIG_NFSD_V4=y +CONFIG_NFSD_TCP=y +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=m +CONFIG_SUNRPC=m +CONFIG_SUNRPC_GSS=m +CONFIG_RPCSEC_GSS_KRB5=m +CONFIG_SMB_FS=m +# CONFIG_SMB_NLS_DEFAULT is not set +CONFIG_CIFS=m +# CONFIG_CIFS_STATS is not set +# CONFIG_CIFS_XATTR is not set +# CONFIG_CIFS_POSIX is not set +CONFIG_NCP_FS=m +CONFIG_NCPFS_PACKET_SIGNING=y +CONFIG_NCPFS_IOCTL_LOCKING=y +CONFIG_NCPFS_STRONG=y +CONFIG_NCPFS_NFS_NS=y +CONFIG_NCPFS_OS2_NS=y +# CONFIG_NCPFS_SMALLDOS is not set +CONFIG_NCPFS_NLS=y +CONFIG_NCPFS_EXTRAS=y +CONFIG_CODA_FS=m +# CONFIG_CODA_FS_OLD_API is not set +CONFIG_AFS_FS=m +CONFIG_RXRPC=m + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +CONFIG_ACORN_PARTITION=y +CONFIG_ACORN_PARTITION_CUMANA=y +# CONFIG_ACORN_PARTITION_EESOX is not set +CONFIG_ACORN_PARTITION_ICS=y +# CONFIG_ACORN_PARTITION_ADFS is not set +# CONFIG_ACORN_PARTITION_POWERTEC is not set +CONFIG_ACORN_PARTITION_RISCIX=y +CONFIG_OSF_PARTITION=y +CONFIG_AMIGA_PARTITION=y +CONFIG_ATARI_PARTITION=y +CONFIG_MAC_PARTITION=y +CONFIG_MSDOS_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_LDM_PARTITION=y +# CONFIG_LDM_DEBUG is not set +CONFIG_SGI_PARTITION=y +CONFIG_ULTRIX_PARTITION=y +CONFIG_SUN_PARTITION=y +# CONFIG_EFI_PARTITION is not set + +# +# Native Language Support +# +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="cp437" +CONFIG_NLS_CODEPAGE_437=m +CONFIG_NLS_CODEPAGE_737=m +CONFIG_NLS_CODEPAGE_775=m +CONFIG_NLS_CODEPAGE_850=m +CONFIG_NLS_CODEPAGE_852=m +CONFIG_NLS_CODEPAGE_855=m +CONFIG_NLS_CODEPAGE_857=m +CONFIG_NLS_CODEPAGE_860=m +CONFIG_NLS_CODEPAGE_861=m +CONFIG_NLS_CODEPAGE_862=m +CONFIG_NLS_CODEPAGE_863=m +CONFIG_NLS_CODEPAGE_864=m +CONFIG_NLS_CODEPAGE_865=m +CONFIG_NLS_CODEPAGE_866=m +CONFIG_NLS_CODEPAGE_869=m +CONFIG_NLS_CODEPAGE_936=m +CONFIG_NLS_CODEPAGE_950=m +CONFIG_NLS_CODEPAGE_932=m +CONFIG_NLS_CODEPAGE_949=m +CONFIG_NLS_CODEPAGE_874=m +CONFIG_NLS_ISO8859_8=m +CONFIG_NLS_CODEPAGE_1250=m +CONFIG_NLS_CODEPAGE_1251=m +CONFIG_NLS_ASCII=m +CONFIG_NLS_ISO8859_1=m +CONFIG_NLS_ISO8859_2=m +CONFIG_NLS_ISO8859_3=m +CONFIG_NLS_ISO8859_4=m +CONFIG_NLS_ISO8859_5=m +CONFIG_NLS_ISO8859_6=m +CONFIG_NLS_ISO8859_7=m +CONFIG_NLS_ISO8859_9=m +CONFIG_NLS_ISO8859_13=m +CONFIG_NLS_ISO8859_14=m +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_KOI8_R=m +CONFIG_NLS_KOI8_U=m +CONFIG_NLS_UTF8=m + +# +# Profiling support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=m + +# +# Kernel hacking +# +CONFIG_DEBUG_KERNEL=y +# CONFIG_EARLY_PRINTK is not set +# CONFIG_DEBUG_STACKOVERFLOW is not set +# CONFIG_DEBUG_STACK_USAGE is not set +# CONFIG_DEBUG_SLAB is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_DEBUG_INFO is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_FRAME_POINTER is not set +# CONFIG_4KSTACKS is not set +CONFIG_X86_FIND_SMP_CONFIG=y +CONFIG_X86_MPPARSE=y + +# +# Security options +# +CONFIG_SECURITY=y +# CONFIG_SECURITY_NETWORK is not set +CONFIG_SECURITY_CAPABILITIES=m +CONFIG_SECURITY_ROOTPLUG=m +# CONFIG_SECURITY_SELINUX is not set + +# +# Cryptographic options +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_SHA1=m +CONFIG_CRYPTO_SHA256=m +CONFIG_CRYPTO_SHA512=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_AES_586=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_KHAZAD=m +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_MICHAEL_MIC=m +CONFIG_CRYPTO_CRC32C=m +CONFIG_CRYPTO_TEST=m + +# +# Library routines +# +CONFIG_CRC_CCITT=m +CONFIG_CRC32=m +CONFIG_LIBCRC32C=m +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=m +CONFIG_X86_BIOS_REBOOT=y --- linux-source-2.6.8.1-2.6.8.1.orig/debian/config/i386/686 +++ linux-source-2.6.8.1-2.6.8.1/debian/config/i386/686 @@ -0,0 +1,2846 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_X86=y +CONFIG_MMU=y +CONFIG_UID16=y +CONFIG_GENERIC_ISA_DMA=y + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +# CONFIG_CLEAN_COMPILE is not set +CONFIG_BROKEN=y +CONFIG_BROKEN_ON_SMP=y + +# +# General setup +# +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_BSD_PROCESS_ACCT=y +# CONFIG_BSD_PROCESS_ACCT_V3 is not set +CONFIG_SYSCTL=y +# CONFIG_AUDIT is not set +CONFIG_LOG_BUF_SHIFT=14 +CONFIG_HOTPLUG=y +# CONFIG_IKCONFIG is not set +CONFIG_EMBEDDED=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_OBSOLETE_MODPARM=y +CONFIG_MODVERSIONS=y +CONFIG_KMOD=y + +# +# Processor type and features +# +CONFIG_X86_PC=y +# CONFIG_X86_ELAN is not set +# CONFIG_X86_VOYAGER is not set +# CONFIG_X86_NUMAQ is not set +# CONFIG_X86_SUMMIT is not set +# CONFIG_X86_BIGSMP is not set +# CONFIG_X86_VISWS is not set +# CONFIG_X86_GENERICARCH is not set +# CONFIG_X86_ES7000 is not set +# CONFIG_M386 is not set +# CONFIG_M486 is not set +# CONFIG_M586 is not set +# CONFIG_M586TSC is not set +# CONFIG_M586MMX is not set +CONFIG_M686=y +# CONFIG_MPENTIUMII is not set +# CONFIG_MPENTIUMIII is not set +# CONFIG_MPENTIUMM is not set +# CONFIG_MPENTIUM4 is not set +# CONFIG_MK6 is not set +# CONFIG_MK7 is not set +# CONFIG_MK8 is not set +# CONFIG_MCRUSOE is not set +# CONFIG_MWINCHIPC6 is not set +# CONFIG_MWINCHIP2 is not set +# CONFIG_MWINCHIP3D is not set +# CONFIG_MCYRIXIII is not set +# CONFIG_MVIAC3_2 is not set +# CONFIG_X86_GENERIC is not set +CONFIG_X86_CMPXCHG=y +CONFIG_X86_XADD=y +CONFIG_X86_L1_CACHE_SHIFT=5 +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_X86_PPRO_FENCE=y +CONFIG_X86_WP_WORKS_OK=y +CONFIG_X86_INVLPG=y +CONFIG_X86_BSWAP=y +CONFIG_X86_POPAD_OK=y +CONFIG_X86_GOOD_APIC=y +CONFIG_X86_USE_PPRO_CHECKSUM=y +CONFIG_HPET_TIMER=y +# CONFIG_SMP is not set +CONFIG_PREEMPT=y +CONFIG_X86_UP_APIC=y +CONFIG_X86_UP_IOAPIC=y +CONFIG_X86_LOCAL_APIC=y +CONFIG_X86_IO_APIC=y +CONFIG_X86_TSC=y +CONFIG_X86_MCE=y +CONFIG_X86_MCE_NONFATAL=m +CONFIG_X86_MCE_P4THERMAL=y +CONFIG_TOSHIBA=m +CONFIG_I8K=m +CONFIG_MICROCODE=m +CONFIG_X86_MSR=m +CONFIG_X86_CPUID=m + +# +# Firmware Drivers +# +CONFIG_EDD=m +# CONFIG_NOHIGHMEM is not set +CONFIG_HIGHMEM4G=y +# CONFIG_HIGHMEM64G is not set +CONFIG_HIGHMEM=y +# CONFIG_HIGHPTE is not set +# CONFIG_MATH_EMULATION is not set +CONFIG_MTRR=y +# CONFIG_EFI is not set +CONFIG_HAVE_DEC_LOCK=y +# CONFIG_REGPARM is not set + +# +# Power management options (ACPI, APM) +# +CONFIG_PM=y +# CONFIG_SOFTWARE_SUSPEND is not set +# CONFIG_PM_DISK is not set + +# +# ACPI (Advanced Configuration and Power Interface) Support +# +CONFIG_ACPI=y +CONFIG_ACPI_BOOT=y +CONFIG_ACPI_INTERPRETER=y +CONFIG_ACPI_SLEEP=y +CONFIG_ACPI_SLEEP_PROC_FS=y +CONFIG_ACPI_AC=m +CONFIG_ACPI_BATTERY=m +CONFIG_ACPI_BUTTON=m +CONFIG_ACPI_FAN=m +CONFIG_ACPI_PROCESSOR=m +CONFIG_ACPI_THERMAL=m +CONFIG_ACPI_ASUS=m +CONFIG_ACPI_TOSHIBA=m +# CONFIG_ACPI_DEBUG is not set +CONFIG_ACPI_BUS=y +CONFIG_ACPI_EC=y +CONFIG_ACPI_POWER=y +CONFIG_ACPI_PCI=y +CONFIG_ACPI_SYSTEM=y +CONFIG_X86_PM_TIMER=y + +# +# APM (Advanced Power Management) BIOS Support +# +CONFIG_APM=m +# CONFIG_APM_IGNORE_USER_SUSPEND is not set +# CONFIG_APM_DO_ENABLE is not set +# CONFIG_APM_CPU_IDLE is not set +# CONFIG_APM_DISPLAY_BLANK is not set +# CONFIG_APM_RTC_IS_GMT is not set +# CONFIG_APM_ALLOW_INTS is not set +# CONFIG_APM_REAL_MODE_POWER_OFF is not set + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_PROC_INTF=m +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=m +CONFIG_CPU_FREQ_GOV_USERSPACE=m +# CONFIG_CPU_FREQ_24_API is not set +CONFIG_CPU_FREQ_TABLE=m + +# +# CPUFreq processor drivers +# +CONFIG_X86_ACPI_CPUFREQ=m +# CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set +CONFIG_X86_POWERNOW_K6=m +CONFIG_X86_POWERNOW_K7=m +CONFIG_X86_POWERNOW_K8=m +CONFIG_X86_GX_SUSPMOD=m +CONFIG_X86_SPEEDSTEP_CENTRINO=m +CONFIG_X86_SPEEDSTEP_CENTRINO_TABLE=y +CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI=y +CONFIG_X86_SPEEDSTEP_ICH=m +CONFIG_X86_SPEEDSTEP_SMI=m +CONFIG_X86_P4_CLOCKMOD=m +CONFIG_X86_SPEEDSTEP_LIB=m +CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK=y +CONFIG_X86_LONGRUN=m +CONFIG_X86_LONGHAUL=m + +# +# Bus options (PCI, PCMCIA, EISA, MCA, ISA) +# +CONFIG_PCI=y +# CONFIG_PCI_GOBIOS is not set +# CONFIG_PCI_GOMMCONFIG is not set +# CONFIG_PCI_GODIRECT is not set +CONFIG_PCI_GOANY=y +CONFIG_PCI_BIOS=y +CONFIG_PCI_DIRECT=y +CONFIG_PCI_MMCONFIG=y +CONFIG_PCI_MSI=y +# CONFIG_PCI_LEGACY_PROC is not set +CONFIG_PCI_NAMES=y +CONFIG_ISA=y +# CONFIG_EISA is not set +# CONFIG_MCA is not set +CONFIG_SCx200=m + +# +# PCMCIA/CardBus support +# +CONFIG_PCMCIA=m +# CONFIG_PCMCIA_DEBUG is not set +CONFIG_YENTA=m +CONFIG_CARDBUS=y +CONFIG_PD6729=m +CONFIG_I82092=m +CONFIG_I82365=m +CONFIG_TCIC=m +CONFIG_PCMCIA_PROBE=y + +# +# PCI Hotplug Support +# +CONFIG_HOTPLUG_PCI=m +CONFIG_HOTPLUG_PCI_FAKE=m +CONFIG_HOTPLUG_PCI_COMPAQ=m +CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM=y +CONFIG_HOTPLUG_PCI_IBM=m +CONFIG_HOTPLUG_PCI_ACPI=m +CONFIG_HOTPLUG_PCI_CPCI=y +CONFIG_HOTPLUG_PCI_CPCI_ZT5550=m +CONFIG_HOTPLUG_PCI_CPCI_GENERIC=m +CONFIG_HOTPLUG_PCI_PCIE=m +# CONFIG_HOTPLUG_PCI_PCIE_POLL_EVENT_MODE is not set +CONFIG_HOTPLUG_PCI_SHPC=m +# CONFIG_HOTPLUG_PCI_SHPC_POLL_EVENT_MODE is not set + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_AOUT=m +CONFIG_BINFMT_MISC=m + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=m +# CONFIG_DEBUG_DRIVER is not set + +# +# Memory Technology Devices (MTD) +# +CONFIG_MTD=m +# CONFIG_MTD_DEBUG is not set +CONFIG_MTD_PARTITIONS=y +CONFIG_MTD_CONCAT=m +CONFIG_MTD_REDBOOT_PARTS=m +# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set +# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set +# CONFIG_MTD_CMDLINE_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=m +CONFIG_MTD_BLOCK=m +CONFIG_MTD_BLOCK_RO=m +CONFIG_FTL=m +CONFIG_NFTL=m +CONFIG_NFTL_RW=y +CONFIG_INFTL=m + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=m +CONFIG_MTD_JEDECPROBE=m +CONFIG_MTD_GEN_PROBE=m +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +CONFIG_MTD_CFI_INTELEXT=m +CONFIG_MTD_CFI_AMDSTD=m +CONFIG_MTD_CFI_AMDSTD_RETRY=0 +CONFIG_MTD_CFI_STAA=m +CONFIG_MTD_CFI_UTIL=m +CONFIG_MTD_RAM=m +CONFIG_MTD_ROM=m +CONFIG_MTD_ABSENT=m +# CONFIG_MTD_OBSOLETE_CHIPS is not set + +# +# Mapping drivers for chip access +# +CONFIG_MTD_COMPLEX_MAPPINGS=y +CONFIG_MTD_PHYSMAP=m +CONFIG_MTD_PHYSMAP_START=0x8000000 +CONFIG_MTD_PHYSMAP_LEN=0x4000000 +CONFIG_MTD_PHYSMAP_BANKWIDTH=2 +CONFIG_MTD_PNC2000=m +CONFIG_MTD_SC520CDP=m +CONFIG_MTD_NETSC520=m +CONFIG_MTD_SBC_GXX=m +CONFIG_MTD_ELAN_104NC=m +CONFIG_MTD_SCx200_DOCFLASH=m +# CONFIG_MTD_AMD76XROM is not set +# CONFIG_MTD_ICHXROM is not set +# CONFIG_MTD_SCB2_FLASH is not set +CONFIG_MTD_NETtel=m +CONFIG_MTD_DILNETPC=m +CONFIG_MTD_DILNETPC_BOOTSIZE=0x80000 +# CONFIG_MTD_L440GX is not set +CONFIG_MTD_PCI=m +# CONFIG_MTD_PCMCIA is not set + +# +# Self-contained MTD device drivers +# +CONFIG_MTD_PMC551=m +# CONFIG_MTD_PMC551_BUGFIX is not set +# CONFIG_MTD_PMC551_DEBUG is not set +CONFIG_MTD_SLRAM=m +CONFIG_MTD_PHRAM=m +CONFIG_MTD_MTDRAM=m +CONFIG_MTDRAM_TOTAL_SIZE=4096 +CONFIG_MTDRAM_ERASE_SIZE=128 +CONFIG_MTD_BLKMTD=m + +# +# Disk-On-Chip Device Drivers +# +CONFIG_MTD_DOC2000=m +CONFIG_MTD_DOC2001=m +CONFIG_MTD_DOC2001PLUS=m +CONFIG_MTD_DOCPROBE=m +CONFIG_MTD_DOCECC=m +# CONFIG_MTD_DOCPROBE_ADVANCED is not set +CONFIG_MTD_DOCPROBE_ADDRESS=0 + +# +# NAND Flash Device Drivers +# +CONFIG_MTD_NAND=m +# CONFIG_MTD_NAND_VERIFY_WRITE is not set +CONFIG_MTD_NAND_IDS=m +CONFIG_MTD_NAND_DISKONCHIP=m +# CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set +CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0 +# CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE is not set + +# +# Parallel port support +# +CONFIG_PARPORT=m +CONFIG_PARPORT_PC=m +CONFIG_PARPORT_PC_CML1=m +CONFIG_PARPORT_SERIAL=m +CONFIG_PARPORT_PC_FIFO=y +# CONFIG_PARPORT_PC_SUPERIO is not set +CONFIG_PARPORT_PC_PCMCIA=m +# CONFIG_PARPORT_OTHER is not set +CONFIG_PARPORT_1284=y + +# +# Plug and Play support +# +CONFIG_PNP=y +# CONFIG_PNP_DEBUG is not set + +# +# Protocols +# +CONFIG_ISAPNP=y +CONFIG_PNPBIOS=y +CONFIG_PNPBIOS_PROC_FS=y + +# +# Block devices +# +CONFIG_BLK_DEV_FD=m +CONFIG_BLK_DEV_XD=m +CONFIG_PARIDE=m +CONFIG_PARIDE_PARPORT=m + +# +# Parallel IDE high-level drivers +# +CONFIG_PARIDE_PD=m +CONFIG_PARIDE_PCD=m +CONFIG_PARIDE_PF=m +CONFIG_PARIDE_PT=m +CONFIG_PARIDE_PG=m + +# +# Parallel IDE protocol modules +# +CONFIG_PARIDE_ATEN=m +CONFIG_PARIDE_BPCK=m +CONFIG_PARIDE_BPCK6=m +CONFIG_PARIDE_COMM=m +CONFIG_PARIDE_DSTR=m +CONFIG_PARIDE_FIT2=m +CONFIG_PARIDE_FIT3=m +CONFIG_PARIDE_EPAT=m +# CONFIG_PARIDE_EPATC8 is not set +CONFIG_PARIDE_EPIA=m +CONFIG_PARIDE_FRIQ=m +CONFIG_PARIDE_FRPW=m +CONFIG_PARIDE_KBIC=m +CONFIG_PARIDE_KTTI=m +CONFIG_PARIDE_ON20=m +CONFIG_PARIDE_ON26=m +CONFIG_BLK_CPQ_DA=m +CONFIG_BLK_CPQ_CISS_DA=m +CONFIG_CISS_SCSI_TAPE=y +CONFIG_BLK_DEV_DAC960=m +CONFIG_BLK_DEV_UMEM=m +CONFIG_BLK_DEV_LOOP=m +CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_SX8=m +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_BLK_DEV_INITRD=y +CONFIG_LBD=y + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=m +CONFIG_BLK_DEV_IDE=m + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_IDE_SATA is not set +# CONFIG_BLK_DEV_HD_IDE is not set +CONFIG_BLK_DEV_IDEDISK=m +# CONFIG_IDEDISK_MULTI_MODE is not set +CONFIG_BLK_DEV_IDECS=m +CONFIG_BLK_DEV_IDECD=m +CONFIG_BLK_DEV_IDETAPE=m +CONFIG_BLK_DEV_IDEFLOPPY=m +CONFIG_BLK_DEV_IDESCSI=m +# CONFIG_IDE_TASK_IOCTL is not set +CONFIG_IDE_TASKFILE_IO=y + +# +# IDE chipset support/bugfixes +# +CONFIG_IDE_GENERIC=m +CONFIG_BLK_DEV_CMD640=y +# CONFIG_BLK_DEV_CMD640_ENHANCED is not set +CONFIG_BLK_DEV_IDEPNP=m +CONFIG_BLK_DEV_IDEPCI=y +CONFIG_IDEPCI_SHARE_IRQ=y +# CONFIG_BLK_DEV_OFFBOARD is not set +CONFIG_BLK_DEV_GENERIC=m +CONFIG_BLK_DEV_OPTI621=m +CONFIG_BLK_DEV_RZ1000=m +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +CONFIG_IDEDMA_PCI_AUTO=y +# CONFIG_IDEDMA_ONLYDISK is not set +CONFIG_BLK_DEV_ADMA=y +CONFIG_BLK_DEV_AEC62XX=m +CONFIG_BLK_DEV_ALI15X3=m +# CONFIG_WDC_ALI15X3 is not set +CONFIG_BLK_DEV_AMD74XX=m +CONFIG_BLK_DEV_ATIIXP=m +CONFIG_BLK_DEV_CMD64X=m +CONFIG_BLK_DEV_TRIFLEX=m +CONFIG_BLK_DEV_CY82C693=m +CONFIG_BLK_DEV_CS5520=m +CONFIG_BLK_DEV_CS5530=m +CONFIG_BLK_DEV_HPT34X=m +# CONFIG_HPT34X_AUTODMA is not set +CONFIG_BLK_DEV_HPT366=m +CONFIG_BLK_DEV_SC1200=m +CONFIG_BLK_DEV_PIIX=m +CONFIG_BLK_DEV_NS87415=m +CONFIG_BLK_DEV_PDC202XX_OLD=m +CONFIG_PDC202XX_BURST=y +CONFIG_BLK_DEV_PDC202XX_NEW=m +CONFIG_PDC202XX_FORCE=y +CONFIG_BLK_DEV_SVWKS=m +CONFIG_BLK_DEV_SIIMAGE=m +CONFIG_BLK_DEV_SIS5513=m +CONFIG_BLK_DEV_SLC90E66=m +CONFIG_BLK_DEV_TRM290=m +CONFIG_BLK_DEV_VIA82CXXX=m +# CONFIG_IDE_ARM is not set +# CONFIG_IDE_CHIPSETS is not set +CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_IVB is not set +CONFIG_IDEDMA_AUTO=y +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +CONFIG_SCSI=m +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +CONFIG_CHR_DEV_ST=m +CONFIG_CHR_DEV_OSST=m +CONFIG_BLK_DEV_SR=m +# CONFIG_BLK_DEV_SR_VENDOR is not set +CONFIG_CHR_DEV_SG=m +CONFIG_CHR_DEV_SCH=m + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y + +# +# SCSI Transport Attributes +# +CONFIG_SCSI_SPI_ATTRS=m +CONFIG_SCSI_FC_ATTRS=m + +# +# SCSI low-level drivers +# +CONFIG_BLK_DEV_3W_XXXX_RAID=m +CONFIG_SCSI_3W_9XXX=m +CONFIG_SCSI_7000FASST=m +CONFIG_SCSI_ACARD=m +CONFIG_SCSI_AHA152X=m +CONFIG_SCSI_AHA1542=m +CONFIG_SCSI_AACRAID=m +CONFIG_SCSI_AIC7XXX=m +CONFIG_AIC7XXX_CMDS_PER_DEVICE=8 +CONFIG_AIC7XXX_RESET_DELAY_MS=15000 +# CONFIG_AIC7XXX_BUILD_FIRMWARE is not set +CONFIG_AIC7XXX_DEBUG_ENABLE=y +CONFIG_AIC7XXX_DEBUG_MASK=0 +CONFIG_AIC7XXX_REG_PRETTY_PRINT=y +CONFIG_SCSI_AIC7XXX_OLD=m +CONFIG_SCSI_AIC79XX=m +CONFIG_AIC79XX_CMDS_PER_DEVICE=32 +CONFIG_AIC79XX_RESET_DELAY_MS=15000 +# CONFIG_AIC79XX_BUILD_FIRMWARE is not set +CONFIG_AIC79XX_ENABLE_RD_STRM=y +CONFIG_AIC79XX_DEBUG_ENABLE=y +CONFIG_AIC79XX_DEBUG_MASK=0 +CONFIG_AIC79XX_REG_PRETTY_PRINT=y +CONFIG_SCSI_DPT_I2O=m +CONFIG_SCSI_ADVANSYS=m +CONFIG_SCSI_IN2000=m +CONFIG_SCSI_MEGARAID=m +CONFIG_SCSI_SATA=y +CONFIG_SCSI_SATA_SVW=m +CONFIG_SCSI_ATA_PIIX=m +CONFIG_SCSI_SATA_NV=m +CONFIG_SCSI_SATA_PROMISE=m +CONFIG_SCSI_SATA_SX4=m +CONFIG_SCSI_SATA_SIL=m +CONFIG_SCSI_SATA_SIS=m +CONFIG_SCSI_SATA_VIA=m +CONFIG_SCSI_SATA_VITESSE=m +CONFIG_SCSI_BUSLOGIC=m +# CONFIG_SCSI_OMIT_FLASHPOINT is not set +# CONFIG_SCSI_CPQFCTS is not set +CONFIG_SCSI_DMX3191D=m +CONFIG_SCSI_DTC3280=m +CONFIG_SCSI_EATA=m +CONFIG_SCSI_EATA_TAGGED_QUEUE=y +CONFIG_SCSI_EATA_LINKED_COMMANDS=y +CONFIG_SCSI_EATA_MAX_TAGS=16 +CONFIG_SCSI_EATA_PIO=m +CONFIG_SCSI_FUTURE_DOMAIN=m +CONFIG_SCSI_GDTH=m +CONFIG_SCSI_GENERIC_NCR5380=m +CONFIG_SCSI_GENERIC_NCR5380_MMIO=m +CONFIG_SCSI_GENERIC_NCR53C400=y +CONFIG_SCSI_IPS=m +# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_INIA100 is not set +CONFIG_SCSI_PPA=m +CONFIG_SCSI_IMM=m +# CONFIG_SCSI_IZIP_EPP16 is not set +# CONFIG_SCSI_IZIP_SLOW_CTR is not set +CONFIG_SCSI_NCR53C406A=m +CONFIG_SCSI_SYM53C8XX_2=m +CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 +CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 +CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 +# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set +CONFIG_SCSI_IPR=m +# CONFIG_SCSI_IPR_TRACE is not set +# CONFIG_SCSI_IPR_DUMP is not set +CONFIG_SCSI_PAS16=m +# CONFIG_SCSI_PCI2000 is not set +# CONFIG_SCSI_PCI2220I is not set +CONFIG_SCSI_PSI240I=m +CONFIG_SCSI_QLOGIC_FAS=m +CONFIG_SCSI_QLOGIC_ISP=m +CONFIG_SCSI_QLOGIC_FC=m +CONFIG_SCSI_QLOGIC_FC_FIRMWARE=y +CONFIG_SCSI_QLOGIC_1280=m +# CONFIG_SCSI_SEAGATE is not set +CONFIG_SCSI_SYM53C416=m +CONFIG_SCSI_DC395x=m +CONFIG_SCSI_DC390T=m +CONFIG_SCSI_T128=m +CONFIG_SCSI_U14_34F=m +CONFIG_SCSI_U14_34F_TAGGED_QUEUE=y +CONFIG_SCSI_U14_34F_LINKED_COMMANDS=y +CONFIG_SCSI_U14_34F_MAX_TAGS=8 +CONFIG_SCSI_ULTRASTOR=m +CONFIG_SCSI_NSP32=m +CONFIG_SCSI_DEBUG=m + +# +# PCMCIA SCSI adapter support +# +CONFIG_PCMCIA_AHA152X=m +CONFIG_PCMCIA_FDOMAIN=m +CONFIG_PCMCIA_NINJA_SCSI=m +CONFIG_PCMCIA_QLOGIC=m +CONFIG_PCMCIA_SYM53C500=m + +# +# Old CD-ROM drivers (not SCSI, not IDE) +# +CONFIG_CD_NO_IDESCSI=y +CONFIG_AZTCD=m +CONFIG_GSCD=m +CONFIG_SBPCD=m +CONFIG_MCD=m +CONFIG_MCD_IRQ=11 +CONFIG_MCD_BASE=0x300 +CONFIG_MCDX=m +CONFIG_OPTCD=m +CONFIG_CM206=m +CONFIG_SJCD=m +CONFIG_ISP16_CDI=m +CONFIG_CDU31A=m +CONFIG_CDU535=m + +# +# Multi-device support (RAID and LVM) +# +CONFIG_MD=y +CONFIG_BLK_DEV_MD=m +CONFIG_MD_LINEAR=m +CONFIG_MD_RAID0=m +CONFIG_MD_RAID1=m +CONFIG_MD_RAID5=m +CONFIG_MD_RAID6=m +CONFIG_MD_MULTIPATH=m +CONFIG_BLK_DEV_DM=m +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=m +CONFIG_DM_MIRROR=m +CONFIG_DM_ZERO=m + +# +# Fusion MPT device support +# +CONFIG_FUSION=m +CONFIG_FUSION_MAX_SGE=40 +CONFIG_FUSION_ISENSE=m +CONFIG_FUSION_CTL=m +CONFIG_FUSION_LAN=m + +# +# IEEE 1394 (FireWire) support +# +CONFIG_IEEE1394=m + +# +# Subsystem Options +# +# CONFIG_IEEE1394_VERBOSEDEBUG is not set +# CONFIG_IEEE1394_OUI_DB is not set +CONFIG_IEEE1394_EXTRA_CONFIG_ROMS=y +CONFIG_IEEE1394_CONFIG_ROM_IP1394=y + +# +# Device Drivers +# +CONFIG_IEEE1394_PCILYNX=m +CONFIG_IEEE1394_OHCI1394=m + +# +# Protocol Drivers +# +CONFIG_IEEE1394_VIDEO1394=m +CONFIG_IEEE1394_SBP2=m +# CONFIG_IEEE1394_SBP2_PHYS_DMA is not set +CONFIG_IEEE1394_ETH1394=m +CONFIG_IEEE1394_DV1394=m +CONFIG_IEEE1394_RAWIO=m +CONFIG_IEEE1394_CMP=m +CONFIG_IEEE1394_AMDTP=m + +# +# I2O device support +# +CONFIG_I2O=m +CONFIG_I2O_CONFIG=m +CONFIG_I2O_BLOCK=m +CONFIG_I2O_SCSI=m +CONFIG_I2O_PROC=m + +# +# Networking support +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=m +CONFIG_PACKET_MMAP=y +CONFIG_NETLINK_DEV=m +CONFIG_UNIX=m +CONFIG_NET_KEY=m +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_FWMARK=y +CONFIG_IP_ROUTE_NAT=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_TOS=y +CONFIG_IP_ROUTE_VERBOSE=y +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE=m +CONFIG_NET_IPGRE_BROADCAST=y +CONFIG_IP_MROUTE=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +# CONFIG_ARPD is not set +CONFIG_SYN_COOKIES=y +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +CONFIG_INET_IPCOMP=m + +# +# IP: Virtual Server Configuration +# +CONFIG_IP_VS=m +# CONFIG_IP_VS_DEBUG is not set +CONFIG_IP_VS_TAB_BITS=12 + +# +# IPVS transport protocol load balancing support +# +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_PROTO_ESP=y +CONFIG_IP_VS_PROTO_AH=y + +# +# IPVS scheduler +# +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_WRR=m +CONFIG_IP_VS_LC=m +CONFIG_IP_VS_WLC=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m + +# +# IPVS application helper +# +CONFIG_IP_VS_FTP=m +CONFIG_IPV6=m +CONFIG_IPV6_PRIVACY=y +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +CONFIG_INET6_IPCOMP=m +CONFIG_IPV6_TUNNEL=m +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_BRIDGE_NETFILTER=y + +# +# IP: Netfilter Configuration +# +CONFIG_IP_NF_CONNTRACK=m +CONFIG_IP_NF_FTP=m +CONFIG_IP_NF_IRC=m +CONFIG_IP_NF_TFTP=m +CONFIG_IP_NF_AMANDA=m +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_LIMIT=m +CONFIG_IP_NF_MATCH_IPRANGE=m +CONFIG_IP_NF_MATCH_MAC=m +CONFIG_IP_NF_MATCH_PKTTYPE=m +CONFIG_IP_NF_MATCH_MARK=m +CONFIG_IP_NF_MATCH_MULTIPORT=m +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_DSCP=m +CONFIG_IP_NF_MATCH_AH_ESP=m +CONFIG_IP_NF_MATCH_LENGTH=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_TCPMSS=m +CONFIG_IP_NF_MATCH_HELPER=m +CONFIG_IP_NF_MATCH_STATE=m +CONFIG_IP_NF_MATCH_CONNTRACK=m +CONFIG_IP_NF_MATCH_OWNER=m +CONFIG_IP_NF_MATCH_PHYSDEV=m +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_SAME=m +CONFIG_IP_NF_NAT_LOCAL=y +CONFIG_IP_NF_NAT_SNMP_BASIC=m +CONFIG_IP_NF_NAT_IRC=m +CONFIG_IP_NF_NAT_FTP=m +CONFIG_IP_NF_NAT_TFTP=m +CONFIG_IP_NF_NAT_AMANDA=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_DSCP=m +CONFIG_IP_NF_TARGET_MARK=m +CONFIG_IP_NF_TARGET_CLASSIFY=m +CONFIG_IP_NF_TARGET_LOG=m +CONFIG_IP_NF_TARGET_ULOG=m +CONFIG_IP_NF_TARGET_TCPMSS=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +CONFIG_IP_NF_COMPAT_IPCHAINS=m +CONFIG_IP_NF_COMPAT_IPFWADM=m +CONFIG_IP_NF_TARGET_NOTRACK=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_MATCH_ADDRTYPE=m +CONFIG_IP_NF_MATCH_REALM=m + +# +# IPv6: Netfilter Configuration +# +CONFIG_IP6_NF_QUEUE=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MATCH_LIMIT=m +CONFIG_IP6_NF_MATCH_MAC=m +CONFIG_IP6_NF_MATCH_RT=m +CONFIG_IP6_NF_MATCH_OPTS=m +CONFIG_IP6_NF_MATCH_FRAG=m +CONFIG_IP6_NF_MATCH_HL=m +CONFIG_IP6_NF_MATCH_MULTIPORT=m +CONFIG_IP6_NF_MATCH_OWNER=m +CONFIG_IP6_NF_MATCH_MARK=m +CONFIG_IP6_NF_MATCH_IPV6HEADER=m +CONFIG_IP6_NF_MATCH_AHESP=m +CONFIG_IP6_NF_MATCH_LENGTH=m +CONFIG_IP6_NF_MATCH_EUI64=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_LOG=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_TARGET_MARK=m +CONFIG_IP6_NF_RAW=m + +# +# DECnet: Netfilter Configuration +# +CONFIG_DECNET_NF_GRABULATOR=m + +# +# Bridge: Netfilter Configuration +# +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_802_3=m +CONFIG_BRIDGE_EBT_AMONG=m +CONFIG_BRIDGE_EBT_ARP=m +CONFIG_BRIDGE_EBT_IP=m +CONFIG_BRIDGE_EBT_LIMIT=m +CONFIG_BRIDGE_EBT_MARK=m +CONFIG_BRIDGE_EBT_PKTTYPE=m +CONFIG_BRIDGE_EBT_STP=m +CONFIG_BRIDGE_EBT_VLAN=m +CONFIG_BRIDGE_EBT_ARPREPLY=m +CONFIG_BRIDGE_EBT_DNAT=m +CONFIG_BRIDGE_EBT_MARK_T=m +CONFIG_BRIDGE_EBT_REDIRECT=m +CONFIG_BRIDGE_EBT_SNAT=m +CONFIG_BRIDGE_EBT_LOG=m +CONFIG_XFRM=y +CONFIG_XFRM_USER=m + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IP_SCTP=m +# CONFIG_SCTP_DBG_MSG is not set +# CONFIG_SCTP_DBG_OBJCNT is not set +# CONFIG_SCTP_HMAC_NONE is not set +# CONFIG_SCTP_HMAC_SHA1 is not set +CONFIG_SCTP_HMAC_MD5=y +CONFIG_ATM=y +CONFIG_ATM_CLIP=y +# CONFIG_ATM_CLIP_NO_ICMP is not set +CONFIG_ATM_LANE=m +CONFIG_ATM_MPOA=m +CONFIG_ATM_BR2684=m +# CONFIG_ATM_BR2684_IPFILTER is not set +CONFIG_BRIDGE=m +CONFIG_VLAN_8021Q=m +CONFIG_DECNET=m +# CONFIG_DECNET_SIOCGIFCONF is not set +# CONFIG_DECNET_ROUTER is not set +CONFIG_LLC=y +CONFIG_LLC2=m +CONFIG_IPX=m +# CONFIG_IPX_INTERN is not set +CONFIG_ATALK=m +CONFIG_DEV_APPLETALK=y +CONFIG_LTPC=m +CONFIG_COPS=m +CONFIG_COPS_DAYNA=y +CONFIG_COPS_TANGENT=y +CONFIG_IPDDP=m +CONFIG_IPDDP_ENCAP=y +CONFIG_IPDDP_DECAP=y +CONFIG_X25=m +CONFIG_LAPB=m +# CONFIG_NET_DIVERT is not set +CONFIG_ECONET=m +CONFIG_ECONET_AUNUDP=y +CONFIG_ECONET_NATIVE=y +CONFIG_WAN_ROUTER=m +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_CLK_JIFFIES=y +# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set +# CONFIG_NET_SCH_CLK_CPU is not set +CONFIG_NET_SCH_CBQ=m +CONFIG_NET_SCH_HTB=m +CONFIG_NET_SCH_HFSC=m +CONFIG_NET_SCH_ATM=m +CONFIG_NET_SCH_PRIO=m +CONFIG_NET_SCH_RED=m +CONFIG_NET_SCH_SFQ=m +CONFIG_NET_SCH_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_NETEM=m +CONFIG_NET_SCH_INGRESS=m +CONFIG_NET_QOS=y +CONFIG_NET_ESTIMATOR=y +CONFIG_NET_CLS=y +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_ROUTE=y +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +# CONFIG_CLS_U32_PERF is not set +# CONFIG_NET_CLS_IND is not set +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +# CONFIG_NET_CLS_ACT is not set +CONFIG_NET_CLS_POLICE=y + +# +# Network testing +# +CONFIG_NET_PKTGEN=m +CONFIG_NETPOLL=y +# CONFIG_NETPOLL_RX is not set +# CONFIG_NETPOLL_TRAP is not set +CONFIG_NET_POLL_CONTROLLER=y +CONFIG_HAMRADIO=y + +# +# Packet Radio protocols +# +CONFIG_AX25=m +# CONFIG_AX25_DAMA_SLAVE is not set +CONFIG_NETROM=m +CONFIG_ROSE=m + +# +# AX.25 network device drivers +# +CONFIG_MKISS=m +CONFIG_6PACK=m +CONFIG_BPQETHER=m +CONFIG_DMASCC=m +CONFIG_SCC=m +# CONFIG_SCC_DELAY is not set +# CONFIG_SCC_TRXECHO is not set +CONFIG_BAYCOM_SER_FDX=m +CONFIG_BAYCOM_SER_HDX=m +CONFIG_BAYCOM_PAR=m +CONFIG_BAYCOM_EPP=m +CONFIG_YAM=m +CONFIG_IRDA=m + +# +# IrDA protocols +# +CONFIG_IRLAN=m +CONFIG_IRNET=m +CONFIG_IRCOMM=m +# CONFIG_IRDA_ULTRA is not set + +# +# IrDA options +# +CONFIG_IRDA_CACHE_LAST_LSAP=y +CONFIG_IRDA_FAST_RR=y +CONFIG_IRDA_DEBUG=y + +# +# Infrared-port device drivers +# + +# +# SIR device drivers +# +CONFIG_IRTTY_SIR=m + +# +# Dongle support +# +CONFIG_DONGLE=y +CONFIG_ESI_DONGLE=m +CONFIG_ACTISYS_DONGLE=m +CONFIG_TEKRAM_DONGLE=m +CONFIG_LITELINK_DONGLE=m +CONFIG_MA600_DONGLE=m +CONFIG_GIRBIL_DONGLE=m +CONFIG_MCP2120_DONGLE=m +CONFIG_OLD_BELKIN_DONGLE=m +CONFIG_ACT200L_DONGLE=m + +# +# Old SIR device drivers +# +CONFIG_IRPORT_SIR=m + +# +# Old Serial dongle support +# +# CONFIG_DONGLE_OLD is not set + +# +# FIR device drivers +# +CONFIG_USB_IRDA=m +CONFIG_SIGMATEL_FIR=m +CONFIG_NSC_FIR=m +CONFIG_WINBOND_FIR=m +CONFIG_TOSHIBA_FIR=m +CONFIG_SMC_IRCC_FIR=m +CONFIG_ALI_FIR=m +CONFIG_VLSI_FIR=m +CONFIG_VIA_FIR=m +CONFIG_BT=m +CONFIG_BT_L2CAP=m +CONFIG_BT_SCO=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_CMTP=m +CONFIG_BT_HIDP=m + +# +# Bluetooth device drivers +# +CONFIG_BT_HCIUSB=m +CONFIG_BT_HCIUSB_SCO=y +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_H4=y +CONFIG_BT_HCIUART_BCSP=y +# CONFIG_BT_HCIUART_BCSP_TXCRC is not set +CONFIG_BT_HCIBCM203X=m +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIDTL1=m +CONFIG_BT_HCIBT3C=m +CONFIG_BT_HCIBLUECARD=m +CONFIG_BT_HCIBTUART=m +CONFIG_BT_HCIVHCI=m +CONFIG_NETDEVICES=y +CONFIG_DUMMY=m +CONFIG_BONDING=m +CONFIG_EQUALIZER=m +CONFIG_TUN=m +CONFIG_ETHERTAP=m +CONFIG_NET_SB1000=m + +# +# ARCnet devices +# +CONFIG_ARCNET=m +CONFIG_ARCNET_1201=m +CONFIG_ARCNET_1051=m +CONFIG_ARCNET_RAW=m +CONFIG_ARCNET_COM90xx=m +CONFIG_ARCNET_COM90xxIO=m +CONFIG_ARCNET_RIM_I=m +CONFIG_ARCNET_COM20020=m +CONFIG_ARCNET_COM20020_ISA=m +CONFIG_ARCNET_COM20020_PCI=m + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=m +CONFIG_HAPPYMEAL=m +CONFIG_SUNGEM=m +CONFIG_NET_VENDOR_3COM=y +CONFIG_EL1=m +CONFIG_EL2=m +CONFIG_ELPLUS=m +CONFIG_EL16=m +CONFIG_EL3=m +CONFIG_3C515=m +CONFIG_VORTEX=m +CONFIG_TYPHOON=m +CONFIG_LANCE=m +CONFIG_NET_VENDOR_SMC=y +CONFIG_WD80x3=m +CONFIG_ULTRA=m +CONFIG_SMC9194=m +CONFIG_NET_VENDOR_RACAL=y +CONFIG_NI5010=m +CONFIG_NI52=m +CONFIG_NI65=m + +# +# Tulip family network device support +# +CONFIG_NET_TULIP=y +CONFIG_DE2104X=m +CONFIG_TULIP=m +# CONFIG_TULIP_MWI is not set +# CONFIG_TULIP_MMIO is not set +# CONFIG_TULIP_NAPI is not set +CONFIG_DE4X5=m +CONFIG_WINBOND_840=m +CONFIG_DM9102=m +CONFIG_PCMCIA_XIRCOM=m +CONFIG_PCMCIA_XIRTULIP=m +CONFIG_AT1700=m +CONFIG_DEPCA=m +CONFIG_HP100=m +CONFIG_NET_ISA=y +CONFIG_E2100=m +CONFIG_EWRK3=m +CONFIG_EEXPRESS=m +CONFIG_EEXPRESS_PRO=m +CONFIG_HPLAN_PLUS=m +CONFIG_HPLAN=m +CONFIG_LP486E=m +CONFIG_ETH16I=m +CONFIG_NE2000=m +CONFIG_ZNET=m +CONFIG_SEEQ8005=m +CONFIG_NET_PCI=y +CONFIG_PCNET32=m +CONFIG_AMD8111_ETH=m +# CONFIG_AMD8111E_NAPI is not set +CONFIG_ADAPTEC_STARFIRE=m +# CONFIG_ADAPTEC_STARFIRE_NAPI is not set +CONFIG_AC3200=m +CONFIG_APRICOT=m +CONFIG_B44=m +CONFIG_FORCEDETH=m +CONFIG_CS89x0=m +CONFIG_EEPRO100=m +# CONFIG_EEPRO100_PIO is not set +CONFIG_E100=m +# CONFIG_E100_NAPI is not set +CONFIG_FEALNX=m +CONFIG_NATSEMI=m +CONFIG_NE2K_PCI=m +CONFIG_8139CP=m +CONFIG_8139TOO=m +CONFIG_8139TOO_PIO=y +CONFIG_8139TOO_TUNE_TWISTER=y +CONFIG_8139TOO_8129=y +# CONFIG_8139_OLD_RX_RESET is not set +CONFIG_SIS900=m +CONFIG_EPIC100=m +CONFIG_SUNDANCE=m +# CONFIG_SUNDANCE_MMIO is not set +CONFIG_TLAN=m +CONFIG_VIA_RHINE=m +# CONFIG_VIA_RHINE_MMIO is not set +CONFIG_VIA_VELOCITY=m +CONFIG_NET_POCKET=y +CONFIG_ATP=m +CONFIG_DE600=m +CONFIG_DE620=m + +# +# Ethernet (1000 Mbit) +# +CONFIG_DL2K=m +CONFIG_E1000=m +# CONFIG_E1000_NAPI is not set +CONFIG_NS83820=m +CONFIG_HAMACHI=m +CONFIG_YELLOWFIN=m +CONFIG_R8169=m +CONFIG_SK98LIN=m +CONFIG_TIGON3=m + +# +# Ethernet (10000 Mbit) +# +CONFIG_IXGB=m +# CONFIG_IXGB_NAPI is not set +CONFIG_S2IO=m +# CONFIG_S2IO_NAPI is not set + +# +# Token Ring devices +# +CONFIG_TR=y +CONFIG_IBMTR=m +CONFIG_IBMOL=m +CONFIG_IBMLS=m +CONFIG_3C359=m +CONFIG_TMS380TR=m +CONFIG_TMSPCI=m +CONFIG_SKISA=m +CONFIG_PROTEON=m +CONFIG_ABYSS=m + +# +# Wireless LAN (non-hamradio) +# +CONFIG_NET_RADIO=y + +# +# Obsolete Wireless cards support (pre-802.11) +# +CONFIG_STRIP=m +CONFIG_ARLAN=m +CONFIG_WAVELAN=m +CONFIG_PCMCIA_WAVELAN=m +CONFIG_PCMCIA_NETWAVE=m + +# +# Wireless 802.11 Frequency Hopping cards support +# +CONFIG_PCMCIA_RAYCS=m + +# +# Wireless 802.11b ISA/PCI cards support +# +CONFIG_IEEE80211=m +# CONFIG_IEEE80211_DEBUG is not set +CONFIG_IEEE80211_CRYPT=m +CONFIG_IEEE80211_WPA=y +CONFIG_IEEE80211_CRYPT_CCMP=m +CONFIG_IEEE80211_CRYPT_TKIP=m +CONFIG_IPW2100=m +CONFIG_IPW2100_PROMISC=y +# CONFIG_IPW2100_LEGACY_FW_LOAD is not set +# CONFIG_IPW2100_NOWEP is not set +# CONFIG_IPW2100_DEBUG is not set +CONFIG_IPW2200=m +# CONFIG_IPW2200_NOWEP is not set +CONFIG_WLAN_NG=m +CONFIG_PRISM2=m +CONFIG_PRISM2_USB=m +CONFIG_ACX100=m +CONFIG_ADM8211=m +CONFIG_AIRO=m +CONFIG_HERMES=m +CONFIG_PLX_HERMES=m +CONFIG_TMD_HERMES=m +CONFIG_PCI_HERMES=m +CONFIG_ATMEL=m +CONFIG_PCI_ATMEL=m + +# +# Wireless 802.11b Pcmcia/Cardbus cards support +# +CONFIG_PCMCIA_HERMES=m +CONFIG_AIRO_CS=m +CONFIG_PCMCIA_ATMEL=m +CONFIG_PCMCIA_WL3501=m + +# +# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support +# +CONFIG_PRISM54=m +CONFIG_NET_WIRELESS=y + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +CONFIG_PCMCIA_3C589=m +CONFIG_PCMCIA_3C574=m +CONFIG_PCMCIA_FMVJ18X=m +CONFIG_PCMCIA_PCNET=m +CONFIG_PCMCIA_NMCLAN=m +CONFIG_PCMCIA_SMC91C92=m +CONFIG_PCMCIA_XIRC2PS=m +CONFIG_PCMCIA_AXNET=m +CONFIG_ARCNET_COM20020_CS=m +CONFIG_PCMCIA_IBMTR=m + +# +# Wan interfaces +# +CONFIG_WAN=y +CONFIG_HOSTESS_SV11=m +CONFIG_COSA=m +CONFIG_DSCC4=m +CONFIG_DSCC4_PCISYNC=y +CONFIG_DSCC4_PCI_RST=y +CONFIG_LANMEDIA=m +CONFIG_SEALEVEL_4021=m +CONFIG_SYNCLINK_SYNCPPP=m +CONFIG_HDLC=m +CONFIG_HDLC_RAW=y +CONFIG_HDLC_RAW_ETH=y +CONFIG_HDLC_CISCO=y +CONFIG_HDLC_FR=y +CONFIG_HDLC_PPP=y +CONFIG_HDLC_X25=y +CONFIG_PCI200SYN=m +CONFIG_WANXL=m +CONFIG_PC300=m +CONFIG_PC300_MLPPP=y +CONFIG_N2=m +CONFIG_C101=m +CONFIG_FARSYNC=m +CONFIG_DLCI=m +CONFIG_DLCI_COUNT=24 +CONFIG_DLCI_MAX=8 +CONFIG_SDLA=m +CONFIG_WAN_ROUTER_DRIVERS=y +# CONFIG_VENDOR_SANGOMA is not set +CONFIG_CYCLADES_SYNC=m +CONFIG_CYCLOMX_X25=y +CONFIG_LAPBETHER=m +CONFIG_X25_ASY=m +CONFIG_SBNI=m +# CONFIG_SBNI_MULTILINE is not set + +# +# ATM drivers +# +CONFIG_ATM_TCP=m +CONFIG_ATM_LANAI=m +CONFIG_ATM_ENI=m +# CONFIG_ATM_ENI_DEBUG is not set +# CONFIG_ATM_ENI_TUNE_BURST is not set +CONFIG_ATM_FIRESTREAM=m +CONFIG_ATM_ZATM=m +# CONFIG_ATM_ZATM_DEBUG is not set +CONFIG_ATM_NICSTAR=m +# CONFIG_ATM_NICSTAR_USE_SUNI is not set +# CONFIG_ATM_NICSTAR_USE_IDT77105 is not set +CONFIG_ATM_IDT77252=m +# CONFIG_ATM_IDT77252_DEBUG is not set +# CONFIG_ATM_IDT77252_RCV_ALL is not set +CONFIG_ATM_IDT77252_USE_SUNI=y +CONFIG_ATM_AMBASSADOR=m +# CONFIG_ATM_AMBASSADOR_DEBUG is not set +CONFIG_ATM_HORIZON=m +# CONFIG_ATM_HORIZON_DEBUG is not set +CONFIG_ATM_IA=m +# CONFIG_ATM_IA_DEBUG is not set +CONFIG_ATM_FORE200E_MAYBE=m +CONFIG_ATM_FORE200E_PCA=y +CONFIG_ATM_FORE200E_PCA_DEFAULT_FW=y +# CONFIG_ATM_FORE200E_USE_TASKLET is not set +CONFIG_ATM_FORE200E_TX_RETRY=16 +CONFIG_ATM_FORE200E_DEBUG=0 +CONFIG_ATM_FORE200E=m +CONFIG_ATM_HE=m +CONFIG_ATM_HE_USE_SUNI=y +CONFIG_FDDI=y +CONFIG_DEFXX=m +CONFIG_SKFP=m +CONFIG_HIPPI=y +CONFIG_ROADRUNNER=m +# CONFIG_ROADRUNNER_LARGE_RINGS is not set +CONFIG_PLIP=m +CONFIG_PPP=m +CONFIG_PPP_MULTILINK=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_MPPE=m +CONFIG_PPPOE=m +CONFIG_PPPOATM=m +CONFIG_SLIP=m +CONFIG_SLIP_COMPRESSED=y +CONFIG_SLIP_SMART=y +CONFIG_SLIP_MODE_SLIP6=y +CONFIG_NET_FC=y +# CONFIG_IPHASE5526 is not set +CONFIG_SHAPER=m +CONFIG_NETCONSOLE=m +CONFIG_NDISWRAPPER=m + +# +# ISDN subsystem +# +CONFIG_ISDN=m + +# +# Old ISDN4Linux +# +CONFIG_ISDN_I4L=m +CONFIG_ISDN_PPP=y +CONFIG_ISDN_PPP_VJ=y +CONFIG_ISDN_MPP=y +CONFIG_IPPP_FILTER=y +CONFIG_ISDN_PPP_BSDCOMP=m +CONFIG_ISDN_AUDIO=y +CONFIG_ISDN_TTY_FAX=y +CONFIG_ISDN_X25=y + +# +# ISDN feature submodules +# +CONFIG_ISDN_DRV_LOOP=m +# CONFIG_ISDN_DIVERSION is not set + +# +# ISDN4Linux hardware drivers +# + +# +# Passive cards +# +CONFIG_ISDN_DRV_HISAX=m + +# +# D-channel protocol features +# +CONFIG_HISAX_EURO=y +CONFIG_DE_AOC=y +# CONFIG_HISAX_NO_SENDCOMPLETE is not set +# CONFIG_HISAX_NO_LLC is not set +# CONFIG_HISAX_NO_KEYPAD is not set +CONFIG_HISAX_1TR6=y +CONFIG_HISAX_NI1=y +CONFIG_HISAX_MAX_CARDS=8 + +# +# HiSax supported cards +# +CONFIG_HISAX_16_0=y +CONFIG_HISAX_16_3=y +CONFIG_HISAX_TELESPCI=y +CONFIG_HISAX_S0BOX=y +CONFIG_HISAX_AVM_A1=y +CONFIG_HISAX_FRITZPCI=y +CONFIG_HISAX_AVM_A1_PCMCIA=y +CONFIG_HISAX_ELSA=y +CONFIG_HISAX_IX1MICROR2=y +CONFIG_HISAX_DIEHLDIVA=y +CONFIG_HISAX_ASUSCOM=y +CONFIG_HISAX_TELEINT=y +CONFIG_HISAX_HFCS=y +CONFIG_HISAX_SEDLBAUER=y +CONFIG_HISAX_SPORTSTER=y +CONFIG_HISAX_MIC=y +CONFIG_HISAX_NETJET=y +CONFIG_HISAX_NETJET_U=y +CONFIG_HISAX_NICCY=y +CONFIG_HISAX_ISURF=y +CONFIG_HISAX_HSTSAPHIR=y +CONFIG_HISAX_BKM_A4T=y +CONFIG_HISAX_SCT_QUADRO=y +CONFIG_HISAX_GAZEL=y +CONFIG_HISAX_HFC_PCI=y +CONFIG_HISAX_W6692=y +CONFIG_HISAX_HFC_SX=y +CONFIG_HISAX_ENTERNOW_PCI=y +# CONFIG_HISAX_DEBUG is not set + +# +# HiSax PCMCIA card service modules +# +CONFIG_HISAX_SEDLBAUER_CS=m +CONFIG_HISAX_ELSA_CS=m +CONFIG_HISAX_AVM_A1_CS=m +CONFIG_HISAX_TELES_CS=m + +# +# HiSax sub driver modules +# +CONFIG_HISAX_ST5481=m +CONFIG_HISAX_HFCUSB=m +CONFIG_HISAX_FRITZ_PCIPNP=m +CONFIG_HISAX_HDLC=y + +# +# Active cards +# +CONFIG_ISDN_DRV_ICN=m +CONFIG_ISDN_DRV_PCBIT=m +CONFIG_ISDN_DRV_SC=m +CONFIG_ISDN_DRV_ACT2000=m +CONFIG_ISDN_DRV_TPAM=m +CONFIG_HYSDN=m +CONFIG_HYSDN_CAPI=y + +# +# CAPI subsystem +# +CONFIG_ISDN_CAPI=m +CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON=y +CONFIG_ISDN_CAPI_MIDDLEWARE=y +CONFIG_ISDN_CAPI_CAPI20=m +CONFIG_ISDN_CAPI_CAPIFS_BOOL=y +CONFIG_ISDN_CAPI_CAPIFS=m +CONFIG_ISDN_CAPI_CAPIDRV=m + +# +# CAPI hardware drivers +# + +# +# Active AVM cards +# +CONFIG_CAPI_AVM=y +CONFIG_ISDN_DRV_AVMB1_B1ISA=m +CONFIG_ISDN_DRV_AVMB1_B1PCI=m +CONFIG_ISDN_DRV_AVMB1_B1PCIV4=y +CONFIG_ISDN_DRV_AVMB1_T1ISA=m +CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m +CONFIG_ISDN_DRV_AVMB1_AVM_CS=m +CONFIG_ISDN_DRV_AVMB1_T1PCI=m +CONFIG_ISDN_DRV_AVMB1_C4=m + +# +# Active Eicon DIVA Server cards +# +CONFIG_CAPI_EICON=y +CONFIG_ISDN_DIVAS=m +CONFIG_ISDN_DIVAS_BRIPCI=y +CONFIG_ISDN_DIVAS_PRIPCI=y +CONFIG_ISDN_DIVAS_DIVACAPI=m +CONFIG_ISDN_DIVAS_USERIDI=m +CONFIG_ISDN_DIVAS_MAINT=m + +# +# Modular ISDN driver +# +CONFIG_MISDN_DRV=m +# CONFIG_MISDN_MEMDEBUG is not set +CONFIG_MISDN_AVM_FRITZ=y +CONFIG_MISDN_HFCPCI=y +CONFIG_MISDN_HFCMULTI=y +CONFIG_MISDN_SPEEDFAX=y +CONFIG_MISDN_W6692=y +CONFIG_MISDN_DSP=y + +# +# Telephony Support +# +CONFIG_PHONE=m +CONFIG_PHONE_IXJ=m +CONFIG_PHONE_IXJ_PCMCIA=m + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=m +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_MOUSEDEV_PSAUX_ENABLE=y +CONFIG_INPUT_JOYDEV=m +CONFIG_INPUT_TSDEV=m +CONFIG_INPUT_TSDEV_SCREEN_X=240 +CONFIG_INPUT_TSDEV_SCREEN_Y=320 +CONFIG_INPUT_EVDEV=m +CONFIG_INPUT_EVBUG=m + +# +# Input I/O drivers +# +CONFIG_GAMEPORT=m +CONFIG_SOUND_GAMEPORT=m +CONFIG_GAMEPORT_NS558=m +CONFIG_GAMEPORT_L4=m +CONFIG_GAMEPORT_EMU10K1=m +CONFIG_GAMEPORT_VORTEX=m +CONFIG_GAMEPORT_FM801=m +CONFIG_GAMEPORT_CS461x=m +CONFIG_SERIO=y +CONFIG_SERIO_I8042=y +CONFIG_SERIO_SERPORT=m +CONFIG_SERIO_CT82C710=m +CONFIG_SERIO_PARKBD=m +CONFIG_SERIO_PCIPS2=m + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=y +CONFIG_KEYBOARD_SUNKBD=m +CONFIG_KEYBOARD_LKKBD=m +CONFIG_KEYBOARD_XTKBD=m +CONFIG_KEYBOARD_NEWTON=m +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=m +CONFIG_MOUSE_SERIAL=m +CONFIG_MOUSE_INPORT=m +# CONFIG_MOUSE_ATIXL is not set +CONFIG_MOUSE_LOGIBM=m +CONFIG_MOUSE_PC110PAD=m +CONFIG_MOUSE_VSXXXAA=m +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_ANALOG=m +CONFIG_JOYSTICK_A3D=m +CONFIG_JOYSTICK_ADI=m +CONFIG_JOYSTICK_COBRA=m +CONFIG_JOYSTICK_GF2K=m +CONFIG_JOYSTICK_GRIP=m +CONFIG_JOYSTICK_GRIP_MP=m +CONFIG_JOYSTICK_GUILLEMOT=m +CONFIG_JOYSTICK_INTERACT=m +CONFIG_JOYSTICK_SIDEWINDER=m +CONFIG_JOYSTICK_TMDC=m +CONFIG_JOYSTICK_IFORCE=m +CONFIG_JOYSTICK_IFORCE_USB=y +CONFIG_JOYSTICK_IFORCE_232=y +CONFIG_JOYSTICK_WARRIOR=m +CONFIG_JOYSTICK_MAGELLAN=m +CONFIG_JOYSTICK_SPACEORB=m +CONFIG_JOYSTICK_SPACEBALL=m +CONFIG_JOYSTICK_STINGER=m +CONFIG_JOYSTICK_TWIDDLER=m +CONFIG_JOYSTICK_DB9=m +CONFIG_JOYSTICK_GAMECON=m +CONFIG_JOYSTICK_TURBOGRAFX=m +CONFIG_INPUT_JOYDUMP=m +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_GUNZE=m +CONFIG_INPUT_MISC=y +CONFIG_INPUT_PCSPKR=m +CONFIG_INPUT_UINPUT=m + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +CONFIG_SERIAL_NONSTANDARD=y +CONFIG_COMPUTONE=m +CONFIG_ROCKETPORT=m +CONFIG_CYCLADES=m +# CONFIG_CYZ_INTR is not set +CONFIG_DIGIEPCA=m +# CONFIG_ESPSERIAL is not set +CONFIG_MOXA_INTELLIO=m +CONFIG_MOXA_SMARTIO=m +# CONFIG_ISI is not set +CONFIG_SYNCLINK=m +CONFIG_SYNCLINKMP=m +CONFIG_N_HDLC=m +# CONFIG_RISCOM8 is not set +# CONFIG_SPECIALIX is not set +CONFIG_SX=m +CONFIG_RIO=m +CONFIG_RIO_OLDPCI=y +CONFIG_STALDRV=y +CONFIG_STALLION=m +CONFIG_ISTALLION=m + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_CS=m +# CONFIG_SERIAL_8250_ACPI is not set +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_MANY_PORTS=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +CONFIG_SERIAL_8250_MULTIPORT=y +CONFIG_SERIAL_8250_RSA=y + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=256 +CONFIG_PRINTER=m +# CONFIG_LP_CONSOLE is not set +CONFIG_PPDEV=m +CONFIG_TIPAR=m +CONFIG_QIC02_TAPE=m +CONFIG_QIC02_DYNCONF=y + +# +# Setting runtime QIC-02 configuration is done with qic02conf +# + +# +# from the tpqic02-support package. It is available at +# + +# +# metalab.unc.edu or ftp://titus.cfw.com/pub/Linux/util/ +# + +# +# IPMI +# +CONFIG_IPMI_HANDLER=m +# CONFIG_IPMI_PANIC_EVENT is not set +CONFIG_IPMI_DEVICE_INTERFACE=m +CONFIG_IPMI_SI=m +CONFIG_IPMI_WATCHDOG=m + +# +# Watchdog Cards +# +CONFIG_WATCHDOG=y +# CONFIG_WATCHDOG_NOWAYOUT is not set + +# +# Watchdog Device Drivers +# +CONFIG_SOFT_WATCHDOG=m +CONFIG_ACQUIRE_WDT=m +CONFIG_ADVANTECH_WDT=m +CONFIG_ALIM1535_WDT=m +CONFIG_ALIM7101_WDT=m +CONFIG_SC520_WDT=m +CONFIG_EUROTECH_WDT=m +CONFIG_IB700_WDT=m +CONFIG_WAFER_WDT=m +CONFIG_I8XX_TCO=m +CONFIG_SC1200_WDT=m +CONFIG_SCx200_WDT=m +CONFIG_60XX_WDT=m +CONFIG_CPU5_WDT=m +CONFIG_W83627HF_WDT=m +CONFIG_W83877F_WDT=m +CONFIG_MACHZ_WDT=m + +# +# ISA-based Watchdog Cards +# +CONFIG_PCWATCHDOG=m +CONFIG_MIXCOMWD=m +CONFIG_WDT=m +CONFIG_WDT_501=y + +# +# PCI-based Watchdog Cards +# +CONFIG_PCIPCWATCHDOG=m +CONFIG_WDTPCI=m +CONFIG_WDT_501_PCI=y + +# +# USB-based Watchdog Cards +# +CONFIG_USBPCWATCHDOG=m +CONFIG_HW_RANDOM=m +CONFIG_NVRAM=m +CONFIG_RTC=m +CONFIG_GEN_RTC=m +CONFIG_GEN_RTC_X=y +CONFIG_DTLK=m +CONFIG_R3964=m +CONFIG_APPLICOM=m +CONFIG_SONYPI=m + +# +# Ftape, the floppy tape device driver +# +CONFIG_FTAPE=m +CONFIG_ZFTAPE=m +CONFIG_ZFT_DFLT_BLK_SZ=10240 + +# +# The compressor will be built as a module only! +# +CONFIG_ZFT_COMPRESSOR=m +CONFIG_FT_NR_BUFFERS=3 +CONFIG_FT_PROC_FS=y +CONFIG_FT_NORMAL_DEBUG=y +# CONFIG_FT_FULL_DEBUG is not set +# CONFIG_FT_NO_TRACE is not set +# CONFIG_FT_NO_TRACE_AT_ALL is not set + +# +# Hardware configuration +# +CONFIG_FT_STD_FDC=y +# CONFIG_FT_MACH2 is not set +# CONFIG_FT_PROBE_FC10 is not set +# CONFIG_FT_ALT_FDC is not set +CONFIG_FT_FDC_THR=8 +CONFIG_FT_FDC_MAX_RATE=2000 +CONFIG_FT_ALPHA_CLOCK=0 +CONFIG_AGP=m +CONFIG_AGP_ALI=m +CONFIG_AGP_ATI=m +CONFIG_AGP_AMD=m +CONFIG_AGP_AMD64=m +CONFIG_AGP_INTEL=m +CONFIG_AGP_INTEL_MCH=m +CONFIG_AGP_NVIDIA=m +CONFIG_AGP_SIS=m +CONFIG_AGP_SWORKS=m +CONFIG_AGP_VIA=m +CONFIG_AGP_EFFICEON=m +CONFIG_DRM=y +CONFIG_DRM_TDFX=m +CONFIG_DRM_GAMMA=m +CONFIG_DRM_R128=m +CONFIG_DRM_RADEON=m +CONFIG_DRM_I810=m +CONFIG_DRM_I830=m +CONFIG_DRM_MGA=m +CONFIG_DRM_SIS=m + +# +# PCMCIA character devices +# +CONFIG_SYNCLINK_CS=m +CONFIG_MWAVE=m +CONFIG_SCx200_GPIO=m +CONFIG_RAW_DRIVER=m +CONFIG_HPET=y +# CONFIG_HPET_RTC_IRQ is not set +CONFIG_HPET_MMAP=y +CONFIG_MAX_RAW_DEVS=256 +CONFIG_HANGCHECK_TIMER=m + +# +# I2C support +# +CONFIG_I2C=m +CONFIG_I2C_CHARDEV=m + +# +# I2C Algorithms +# +CONFIG_I2C_ALGOBIT=m +CONFIG_I2C_ALGOPCF=m + +# +# I2C Hardware Bus support +# +CONFIG_I2C_ALI1535=m +CONFIG_I2C_ALI1563=m +CONFIG_I2C_ALI15X3=m +CONFIG_I2C_AMD756=m +CONFIG_I2C_AMD8111=m +CONFIG_I2C_ELEKTOR=m +CONFIG_I2C_I801=m +CONFIG_I2C_I810=m +CONFIG_I2C_ISA=m +CONFIG_I2C_NFORCE2=m +CONFIG_I2C_PARPORT=m +CONFIG_I2C_PARPORT_LIGHT=m +CONFIG_I2C_PIIX4=m +CONFIG_I2C_PROSAVAGE=m +CONFIG_I2C_SAVAGE4=m +CONFIG_SCx200_I2C=m +CONFIG_SCx200_I2C_SCL=12 +CONFIG_SCx200_I2C_SDA=13 +CONFIG_SCx200_ACB=m +CONFIG_I2C_SIS5595=m +CONFIG_I2C_SIS630=m +CONFIG_I2C_SIS96X=m +CONFIG_I2C_VIA=m +CONFIG_I2C_VIAPRO=m +CONFIG_I2C_VOODOO3=m + +# +# Hardware Sensors Chip support +# +CONFIG_I2C_SENSOR=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM1025=m +CONFIG_SENSORS_ADM1031=m +CONFIG_SENSORS_ASB100=m +CONFIG_SENSORS_DS1621=m +CONFIG_SENSORS_FSCHER=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_IT87=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM77=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_LM83=m +CONFIG_SENSORS_LM85=m +CONFIG_SENSORS_LM90=m +CONFIG_SENSORS_MAX1619=m +CONFIG_SENSORS_VIA686A=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_W83L785TS=m +CONFIG_SENSORS_W83627HF=m + +# +# Other I2C Chip support +# +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_PCF8574=m +CONFIG_SENSORS_PCF8591=m +CONFIG_SENSORS_RTC8564=m +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set + +# +# Dallas's 1-wire bus +# +CONFIG_W1=m +CONFIG_W1_MATROX=m +CONFIG_W1_THERM=m + +# +# Misc devices +# +CONFIG_IBM_ASM=m + +# +# Multimedia devices +# +CONFIG_VIDEO_DEV=m + +# +# Video For Linux +# + +# +# Video Adapters +# +CONFIG_VIDEO_BT848=m +CONFIG_VIDEO_PMS=m +CONFIG_VIDEO_BWQCAM=m +CONFIG_VIDEO_CQCAM=m +CONFIG_VIDEO_W9966=m +CONFIG_VIDEO_CPIA=m +CONFIG_VIDEO_CPIA_PP=m +CONFIG_VIDEO_CPIA_USB=m +CONFIG_VIDEO_SAA5246A=m +CONFIG_VIDEO_SAA5249=m +CONFIG_TUNER_3036=m +CONFIG_VIDEO_STRADIS=m +# CONFIG_VIDEO_ZORAN is not set +# CONFIG_VIDEO_ZR36120 is not set +CONFIG_VIDEO_MEYE=m +CONFIG_VIDEO_SAA7134=m +CONFIG_VIDEO_MXB=m +CONFIG_VIDEO_DPC=m +CONFIG_VIDEO_HEXIUM_ORION=m +CONFIG_VIDEO_HEXIUM_GEMINI=m +CONFIG_VIDEO_CX88=m +CONFIG_VIDEO_OVCAMCHIP=m + +# +# Radio Adapters +# +CONFIG_RADIO_CADET=m +CONFIG_RADIO_RTRACK=m +CONFIG_RADIO_RTRACK2=m +CONFIG_RADIO_AZTECH=m +CONFIG_RADIO_GEMTEK=m +CONFIG_RADIO_GEMTEK_PCI=m +CONFIG_RADIO_MAXIRADIO=m +CONFIG_RADIO_MAESTRO=m +CONFIG_RADIO_MIROPCM20=m +CONFIG_RADIO_MIROPCM20_RDS=m +CONFIG_RADIO_SF16FMI=m +CONFIG_RADIO_SF16FMR2=m +CONFIG_RADIO_TERRATEC=m +CONFIG_RADIO_TRUST=m +CONFIG_RADIO_TYPHOON=m +CONFIG_RADIO_TYPHOON_PROC_FS=y +CONFIG_RADIO_ZOLTRIX=m + +# +# Digital Video Broadcasting Devices +# +CONFIG_DVB=y +CONFIG_DVB_CORE=m + +# +# Supported Frontend Modules +# +CONFIG_DVB_TWINHAN_DST=m +CONFIG_DVB_STV0299=m +CONFIG_DVB_SP887X=m +CONFIG_DVB_SP887X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/sc_main.mc" +CONFIG_DVB_ALPS_TDLB7=m +CONFIG_DVB_ALPS_TDMB7=m +CONFIG_DVB_ATMEL_AT76C651=m +CONFIG_DVB_CX24110=m +CONFIG_DVB_GRUNDIG_29504_491=m +CONFIG_DVB_GRUNDIG_29504_401=m +CONFIG_DVB_MT312=m +CONFIG_DVB_VES1820=m +CONFIG_DVB_VES1X93=m +CONFIG_DVB_TDA1004X=m +CONFIG_DVB_TDA1004X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/tda1004x.bin" +CONFIG_DVB_NXT6000=m + +# +# Supported SAA7146 based PCI Adapters +# +CONFIG_DVB_AV7110=m +# CONFIG_DVB_AV7110_OSD is not set +CONFIG_DVB_BUDGET=m +CONFIG_DVB_BUDGET_CI=m +CONFIG_DVB_BUDGET_AV=m +CONFIG_DVB_BUDGET_PATCH=m + +# +# Supported USB Adapters +# +CONFIG_DVB_TTUSB_BUDGET=m +CONFIG_DVB_TTUSB_DEC=m + +# +# Supported FlexCopII (B2C2) Adapters +# +CONFIG_DVB_B2C2_SKYSTAR=m + +# +# Supported BT878 Adapters +# +CONFIG_DVB_BT8XX=m +CONFIG_VIDEO_SAA7146=m +CONFIG_VIDEO_SAA7146_VV=m +CONFIG_VIDEO_VIDEOBUF=m +CONFIG_VIDEO_TUNER=m +CONFIG_VIDEO_BUF=m +CONFIG_VIDEO_BTCX=m +CONFIG_VIDEO_IR=m + +# +# Graphics support +# +CONFIG_FB=y +CONFIG_FB_CIRRUS=m +CONFIG_FB_PM2=m +CONFIG_FB_PM2_FIFO_DISCONNECT=y +CONFIG_FB_CYBER2000=m +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +CONFIG_FB_VGA16=m +CONFIG_FB_VESA=m +CONFIG_VIDEO_SELECT=y +CONFIG_FB_HGA=m +# CONFIG_FB_HGA_ACCEL is not set +CONFIG_FB_RIVA=m +CONFIG_FB_RIVA_I2C=y +CONFIG_FB_RIVA_DEBUG=y +CONFIG_FB_I810=m +# CONFIG_FB_I810_GTF is not set +CONFIG_FB_MATROX=m +CONFIG_FB_MATROX_MILLENIUM=y +CONFIG_FB_MATROX_MYSTIQUE=y +CONFIG_FB_MATROX_G450=y +CONFIG_FB_MATROX_G100=y +CONFIG_FB_MATROX_I2C=m +CONFIG_FB_MATROX_MAVEN=m +CONFIG_FB_MATROX_MULTIHEAD=y +CONFIG_FB_RADEON_OLD=m +CONFIG_FB_RADEON=m +CONFIG_FB_RADEON_I2C=y +# CONFIG_FB_RADEON_DEBUG is not set +CONFIG_FB_ATY128=m +CONFIG_FB_ATY=m +CONFIG_FB_ATY_CT=y +CONFIG_FB_ATY_GX=y +CONFIG_FB_ATY_XL_INIT=y +CONFIG_FB_SIS=m +CONFIG_FB_SIS_300=y +CONFIG_FB_SIS_315=y +CONFIG_FB_NEOMAGIC=m +CONFIG_FB_KYRO=m +CONFIG_FB_3DFX=m +# CONFIG_FB_3DFX_ACCEL is not set +CONFIG_FB_VOODOO1=m +CONFIG_FB_TRIDENT=m +# CONFIG_FB_TRIDENT_ACCEL is not set +# CONFIG_FB_PM3 is not set +CONFIG_FB_VIRTUAL=m + +# +# Console display driver support +# +CONFIG_VGA_CONSOLE=y +CONFIG_MDA_CONSOLE=m +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=m +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y + +# +# Logo configuration +# +# CONFIG_LOGO is not set + +# +# Sound +# +CONFIG_SOUND=m + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +CONFIG_SND_HWDEP=m +CONFIG_SND_RAWMIDI=m +CONFIG_SND_SEQUENCER=m +CONFIG_SND_SEQ_DUMMY=m +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=m +CONFIG_SND_PCM_OSS=m +CONFIG_SND_SEQUENCER_OSS=y +CONFIG_SND_RTCTIMER=m +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set + +# +# Generic devices +# +CONFIG_SND_MPU401_UART=m +CONFIG_SND_OPL3_LIB=m +CONFIG_SND_OPL4_LIB=m +CONFIG_SND_VX_LIB=m +CONFIG_SND_DUMMY=m +CONFIG_SND_VIRMIDI=m +CONFIG_SND_MTPAV=m +CONFIG_SND_SERIAL_U16550=m +CONFIG_SND_MPU401=m + +# +# ISA devices +# +CONFIG_SND_AD1816A=m +CONFIG_SND_AD1848=m +CONFIG_SND_CS4231=m +CONFIG_SND_CS4232=m +CONFIG_SND_CS4236=m +CONFIG_SND_ES968=m +CONFIG_SND_ES1688=m +CONFIG_SND_ES18XX=m +CONFIG_SND_GUSCLASSIC=m +CONFIG_SND_GUSEXTREME=m +CONFIG_SND_GUSMAX=m +CONFIG_SND_INTERWAVE=m +CONFIG_SND_INTERWAVE_STB=m +CONFIG_SND_OPTI92X_AD1848=m +CONFIG_SND_OPTI92X_CS4231=m +CONFIG_SND_OPTI93X=m +CONFIG_SND_SB8=m +CONFIG_SND_SB16=m +CONFIG_SND_SBAWE=m +CONFIG_SND_SB16_CSP=y +CONFIG_SND_WAVEFRONT=m +CONFIG_SND_ALS100=m +CONFIG_SND_AZT2320=m +CONFIG_SND_CMI8330=m +CONFIG_SND_DT019X=m +CONFIG_SND_OPL3SA2=m +CONFIG_SND_SGALAXY=m +CONFIG_SND_SSCAPE=m + +# +# PCI devices +# +CONFIG_SND_AC97_CODEC=m +CONFIG_SND_ALI5451=m +CONFIG_SND_ATIIXP=m +CONFIG_SND_AU8810=m +CONFIG_SND_AU8820=m +CONFIG_SND_AU8830=m +CONFIG_SND_AZT3328=m +CONFIG_SND_BT87X=m +CONFIG_SND_CS46XX=m +CONFIG_SND_CS46XX_NEW_DSP=y +CONFIG_SND_CS4281=m +CONFIG_SND_EMU10K1=m +CONFIG_SND_KORG1212=m +CONFIG_SND_MIXART=m +CONFIG_SND_NM256=m +CONFIG_SND_RME32=m +CONFIG_SND_RME96=m +CONFIG_SND_RME9652=m +CONFIG_SND_HDSP=m +CONFIG_SND_TRIDENT=m +CONFIG_SND_YMFPCI=m +CONFIG_SND_ALS4000=m +CONFIG_SND_CMIPCI=m +CONFIG_SND_ENS1370=m +CONFIG_SND_ENS1371=m +CONFIG_SND_ES1938=m +CONFIG_SND_ES1968=m +CONFIG_SND_MAESTRO3=m +CONFIG_SND_FM801=m +CONFIG_SND_FM801_TEA575X=m +CONFIG_SND_ICE1712=m +CONFIG_SND_ICE1724=m +CONFIG_SND_INTEL8X0=m +CONFIG_SND_INTEL8X0M=m +CONFIG_SND_SONICVIBES=m +CONFIG_SND_VIA82XX=m +CONFIG_SND_VX222=m + +# +# ALSA USB devices +# +CONFIG_SND_USB_AUDIO=m + +# +# PCMCIA devices +# +CONFIG_SND_VXPOCKET=m +CONFIG_SND_VXP440=m +CONFIG_SND_PDAUDIOCF=m + +# +# Open Sound System +# +CONFIG_SOUND_PRIME=m +CONFIG_SOUND_BT878=m +CONFIG_SOUND_CMPCI=m +# CONFIG_SOUND_CMPCI_FM is not set +# CONFIG_SOUND_CMPCI_MIDI is not set +CONFIG_SOUND_CMPCI_JOYSTICK=y +CONFIG_SOUND_EMU10K1=m +CONFIG_MIDI_EMU10K1=y +CONFIG_SOUND_FUSION=m +CONFIG_SOUND_CS4281=m +CONFIG_SOUND_ES1370=m +CONFIG_SOUND_ES1371=m +CONFIG_SOUND_ESSSOLO1=m +CONFIG_SOUND_MAESTRO=m +CONFIG_SOUND_MAESTRO3=m +CONFIG_SOUND_ICH=m +CONFIG_SOUND_SONICVIBES=m +CONFIG_SOUND_TRIDENT=m +# CONFIG_SOUND_MSNDCLAS is not set +# CONFIG_SOUND_MSNDPIN is not set +CONFIG_SOUND_VIA82CXXX=m +CONFIG_MIDI_VIA82CXXX=y +CONFIG_SOUND_OSS=m +# CONFIG_SOUND_TRACEINIT is not set +# CONFIG_SOUND_DMAP is not set +# CONFIG_SOUND_AD1816 is not set +CONFIG_SOUND_AD1889=m +CONFIG_SOUND_SGALAXY=m +CONFIG_SOUND_ADLIB=m +CONFIG_SOUND_ACI_MIXER=m +CONFIG_SOUND_CS4232=m +CONFIG_SOUND_SSCAPE=m +CONFIG_SOUND_GUS=m +CONFIG_SOUND_GUS16=y +CONFIG_SOUND_GUSMAX=y +CONFIG_SOUND_VMIDI=m +CONFIG_SOUND_TRIX=m +CONFIG_SOUND_MSS=m +CONFIG_SOUND_MPU401=m +CONFIG_SOUND_NM256=m +CONFIG_SOUND_MAD16=m +CONFIG_MAD16_OLDCARD=y +CONFIG_SOUND_PAS=m +CONFIG_SOUND_PSS=m +CONFIG_PSS_MIXER=y +CONFIG_SOUND_SB=m +# CONFIG_SOUND_AWE32_SYNTH is not set +CONFIG_SOUND_WAVEFRONT=m +CONFIG_SOUND_MAUI=m +CONFIG_SOUND_YM3812=m +CONFIG_SOUND_OPL3SA1=m +CONFIG_SOUND_OPL3SA2=m +CONFIG_SOUND_YMFPCI=m +# CONFIG_SOUND_YMFPCI_LEGACY is not set +CONFIG_SOUND_UART6850=m +CONFIG_SOUND_AEDSP16=m +CONFIG_SC6600=y +CONFIG_SC6600_JOY=y +CONFIG_SC6600_CDROM=4 +CONFIG_SC6600_CDROMBASE=0x0 +# CONFIG_AEDSP16_MSS is not set +# CONFIG_AEDSP16_SBPRO is not set +# CONFIG_AEDSP16_MPU401 is not set +CONFIG_SOUND_TVMIXER=m +CONFIG_SOUND_KAHLUA=m +CONFIG_SOUND_ALI5455=m +CONFIG_SOUND_FORTE=m +CONFIG_SOUND_RME96XX=m +CONFIG_SOUND_AD1980=m + +# +# USB support +# +CONFIG_USB=m +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +CONFIG_USB_BANDWIDTH=y +# CONFIG_USB_DYNAMIC_MINORS is not set + +# +# USB Host Controller Drivers +# +CONFIG_USB_EHCI_HCD=m +CONFIG_USB_EHCI_SPLIT_ISO=y +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_OHCI_HCD=m +CONFIG_USB_UHCI_HCD=m + +# +# USB Device Class drivers +# +CONFIG_USB_AUDIO=m + +# +# USB Bluetooth TTY can only be used with disabled Bluetooth subsystem +# +CONFIG_USB_MIDI=m +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +CONFIG_USB_STORAGE_RW_DETECT=y +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_DPCM=y +CONFIG_USB_STORAGE_HP8200e=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y + +# +# USB Human Interface Devices (HID) +# +CONFIG_USB_HID=m +CONFIG_USB_HIDINPUT=y +# CONFIG_HID_FF is not set +CONFIG_USB_HIDDEV=y + +# +# USB HID Boot Protocol drivers +# +CONFIG_USB_KBD=m +CONFIG_USB_MOUSE=m +CONFIG_USB_AIPTEK=m +CONFIG_USB_WACOM=m +CONFIG_USB_KBTAB=m +CONFIG_USB_POWERMATE=m +CONFIG_USB_MTOUCH=m +CONFIG_USB_EGALAX=m +CONFIG_USB_XPAD=m +CONFIG_USB_ATI_REMOTE=m + +# +# USB Imaging devices +# +CONFIG_USB_MDC800=m +CONFIG_USB_MICROTEK=m +CONFIG_USB_HPUSBSCSI=m + +# +# USB Multimedia devices +# +CONFIG_USB_VICAM=m +CONFIG_USB_DSBR=m +CONFIG_USB_IBMCAM=m +CONFIG_USB_KONICAWC=m +CONFIG_USB_OV511=m +CONFIG_USB_PWC=m +CONFIG_USB_SE401=m +CONFIG_USB_SN9C102=m +CONFIG_USB_STV680=m +CONFIG_USB_W9968CF=m + +# +# USB Network adaptors +# +CONFIG_USB_CATC=m +CONFIG_USB_KAWETH=m +CONFIG_USB_PEGASUS=m +CONFIG_USB_RTL8150=m +CONFIG_USB_USBNET=m + +# +# USB Host-to-Host Cables +# +CONFIG_USB_ALI_M5632=y +CONFIG_USB_AN2720=y +CONFIG_USB_BELKIN=y +CONFIG_USB_GENESYS=y +CONFIG_USB_NET1080=y +CONFIG_USB_PL2301=y + +# +# Intelligent USB Devices/Gadgets +# +CONFIG_USB_ARMLINUX=y +CONFIG_USB_EPSON2888=y +CONFIG_USB_ZAURUS=y +CONFIG_USB_CDCETHER=y + +# +# USB Network Adapters +# +CONFIG_USB_AX8817X=y + +# +# USB port drivers +# +CONFIG_USB_USS720=m + +# +# USB Serial Converter support +# +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_BELKIN=m +CONFIG_USB_SERIAL_WHITEHEAT=m +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m +CONFIG_USB_SERIAL_EMPEG=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_VISOR=m +CONFIG_USB_SERIAL_IPAQ=m +CONFIG_USB_SERIAL_IR=m +CONFIG_USB_SERIAL_EDGEPORT=m +CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_KEYSPAN_PDA=m +CONFIG_USB_SERIAL_KEYSPAN=m +CONFIG_USB_SERIAL_KLSI=m +CONFIG_USB_SERIAL_KOBIL_SCT=m +CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_SAFE=m +# CONFIG_USB_SERIAL_SAFE_PADDED is not set +CONFIG_USB_SERIAL_CYBERJACK=m +CONFIG_USB_SERIAL_XIRCOM=m +CONFIG_USB_SERIAL_OMNINET=m +CONFIG_USB_EZUSB=y + +# +# USB Miscellaneous drivers +# +CONFIG_USB_TIGL=m +CONFIG_USB_AUERSWALD=m +CONFIG_USB_RIO500=m +CONFIG_USB_LEGOTOWER=m +CONFIG_USB_LCD=m +CONFIG_USB_LED=m +CONFIG_USB_CYTHERM=m +CONFIG_USB_SPEEDTOUCH=m +CONFIG_USB_PHIDGETSERVO=m +CONFIG_USB_TEST=m +CONFIG_USB_EAGLE=m + +# +# USB Gadget Support +# +CONFIG_USB_GADGET=m +CONFIG_USB_GADGET_NET2280=y +CONFIG_USB_NET2280=m +# CONFIG_USB_GADGET_PXA2XX is not set +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_SA1100 is not set +# CONFIG_USB_GADGET_DUMMY_HCD is not set +CONFIG_USB_GADGET_DUALSPEED=y +CONFIG_USB_ZERO=m +CONFIG_USB_ETH=m +CONFIG_USB_ETH_RNDIS=y +CONFIG_USB_GADGETFS=m +CONFIG_USB_FILE_STORAGE=m +# CONFIG_USB_FILE_STORAGE_TEST is not set +CONFIG_USB_G_SERIAL=m + +# +# File systems +# +CONFIG_EXT2_FS=m +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_POSIX_ACL=y +CONFIG_EXT2_FS_SECURITY=y +CONFIG_EXT3_FS=m +CONFIG_EXT3_FS_XATTR=y +CONFIG_EXT3_FS_POSIX_ACL=y +CONFIG_EXT3_FS_SECURITY=y +CONFIG_JBD=m +# CONFIG_JBD_DEBUG is not set +CONFIG_FS_MBCACHE=m +CONFIG_REISERFS_FS=m +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +# CONFIG_REISERFS_FS_XATTR is not set +CONFIG_JFS_FS=m +CONFIG_JFS_POSIX_ACL=y +# CONFIG_JFS_DEBUG is not set +CONFIG_JFS_STATISTICS=y +CONFIG_FS_POSIX_ACL=y +CONFIG_XFS_FS=m +CONFIG_XFS_RT=y +CONFIG_XFS_QUOTA=y +CONFIG_XFS_SECURITY=y +CONFIG_XFS_POSIX_ACL=y +CONFIG_MINIX_FS=m +CONFIG_ROMFS_FS=m +CONFIG_QUOTA=y +CONFIG_QFMT_V1=m +CONFIG_QFMT_V2=m +CONFIG_QUOTACTL=y +CONFIG_AUTOFS_FS=m +CONFIG_AUTOFS4_FS=m + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=m +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_ZISOFS_FS=m +CONFIG_UDF_FS=m +CONFIG_UDF_NLS=y + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +CONFIG_NTFS_FS=m +# CONFIG_NTFS_DEBUG is not set +# CONFIG_NTFS_RW is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_SYSFS=y +CONFIG_DEVFS_FS=y +# CONFIG_DEVFS_MOUNT is not set +# CONFIG_DEVFS_DEBUG is not set +CONFIG_DEVPTS_FS_XATTR=y +CONFIG_DEVPTS_FS_SECURITY=y +CONFIG_TMPFS=y +# CONFIG_HUGETLBFS is not set +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y + +# +# Miscellaneous filesystems +# +CONFIG_ADFS_FS=m +# CONFIG_ADFS_FS_RW is not set +CONFIG_AFFS_FS=m +CONFIG_ASFS_FS=m +# CONFIG_ASFS_RW is not set +CONFIG_HFS_FS=m +CONFIG_HFSPLUS_FS=m +CONFIG_BEFS_FS=m +# CONFIG_BEFS_DEBUG is not set +CONFIG_BFS_FS=m +CONFIG_EFS_FS=m +CONFIG_JFFS_FS=m +CONFIG_JFFS_FS_VERBOSE=0 +CONFIG_JFFS_PROC_FS=y +CONFIG_JFFS2_FS=m +CONFIG_JFFS2_FS_DEBUG=0 +# CONFIG_JFFS2_FS_NAND is not set +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set +CONFIG_JFFS2_ZLIB=y +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +CONFIG_CRAMFS=y +CONFIG_VXFS_FS=m +CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +# CONFIG_QNX4FS_RW is not set +CONFIG_SYSV_FS=m +CONFIG_UFS_FS=m +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=m +CONFIG_NFS_V3=y +CONFIG_NFS_V4=y +CONFIG_NFS_DIRECTIO=y +CONFIG_NFSD=m +CONFIG_NFSD_V3=y +CONFIG_NFSD_V4=y +CONFIG_NFSD_TCP=y +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=m +CONFIG_SUNRPC=m +CONFIG_SUNRPC_GSS=m +CONFIG_RPCSEC_GSS_KRB5=m +CONFIG_SMB_FS=m +# CONFIG_SMB_NLS_DEFAULT is not set +CONFIG_CIFS=m +# CONFIG_CIFS_STATS is not set +# CONFIG_CIFS_XATTR is not set +# CONFIG_CIFS_POSIX is not set +CONFIG_NCP_FS=m +CONFIG_NCPFS_PACKET_SIGNING=y +CONFIG_NCPFS_IOCTL_LOCKING=y +CONFIG_NCPFS_STRONG=y +CONFIG_NCPFS_NFS_NS=y +CONFIG_NCPFS_OS2_NS=y +# CONFIG_NCPFS_SMALLDOS is not set +CONFIG_NCPFS_NLS=y +CONFIG_NCPFS_EXTRAS=y +CONFIG_CODA_FS=m +# CONFIG_CODA_FS_OLD_API is not set +CONFIG_AFS_FS=m +CONFIG_RXRPC=m + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +CONFIG_ACORN_PARTITION=y +CONFIG_ACORN_PARTITION_CUMANA=y +# CONFIG_ACORN_PARTITION_EESOX is not set +CONFIG_ACORN_PARTITION_ICS=y +# CONFIG_ACORN_PARTITION_ADFS is not set +# CONFIG_ACORN_PARTITION_POWERTEC is not set +CONFIG_ACORN_PARTITION_RISCIX=y +CONFIG_OSF_PARTITION=y +CONFIG_AMIGA_PARTITION=y +CONFIG_ATARI_PARTITION=y +CONFIG_MAC_PARTITION=y +CONFIG_MSDOS_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_LDM_PARTITION=y +# CONFIG_LDM_DEBUG is not set +CONFIG_SGI_PARTITION=y +CONFIG_ULTRIX_PARTITION=y +CONFIG_SUN_PARTITION=y +# CONFIG_EFI_PARTITION is not set + +# +# Native Language Support +# +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="cp437" +CONFIG_NLS_CODEPAGE_437=m +CONFIG_NLS_CODEPAGE_737=m +CONFIG_NLS_CODEPAGE_775=m +CONFIG_NLS_CODEPAGE_850=m +CONFIG_NLS_CODEPAGE_852=m +CONFIG_NLS_CODEPAGE_855=m +CONFIG_NLS_CODEPAGE_857=m +CONFIG_NLS_CODEPAGE_860=m +CONFIG_NLS_CODEPAGE_861=m +CONFIG_NLS_CODEPAGE_862=m +CONFIG_NLS_CODEPAGE_863=m +CONFIG_NLS_CODEPAGE_864=m +CONFIG_NLS_CODEPAGE_865=m +CONFIG_NLS_CODEPAGE_866=m +CONFIG_NLS_CODEPAGE_869=m +CONFIG_NLS_CODEPAGE_936=m +CONFIG_NLS_CODEPAGE_950=m +CONFIG_NLS_CODEPAGE_932=m +CONFIG_NLS_CODEPAGE_949=m +CONFIG_NLS_CODEPAGE_874=m +CONFIG_NLS_ISO8859_8=m +CONFIG_NLS_CODEPAGE_1250=m +CONFIG_NLS_CODEPAGE_1251=m +CONFIG_NLS_ASCII=m +CONFIG_NLS_ISO8859_1=m +CONFIG_NLS_ISO8859_2=m +CONFIG_NLS_ISO8859_3=m +CONFIG_NLS_ISO8859_4=m +CONFIG_NLS_ISO8859_5=m +CONFIG_NLS_ISO8859_6=m +CONFIG_NLS_ISO8859_7=m +CONFIG_NLS_ISO8859_9=m +CONFIG_NLS_ISO8859_13=m +CONFIG_NLS_ISO8859_14=m +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_KOI8_R=m +CONFIG_NLS_KOI8_U=m +CONFIG_NLS_UTF8=m + +# +# Profiling support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=m + +# +# Kernel hacking +# +CONFIG_DEBUG_KERNEL=y +# CONFIG_EARLY_PRINTK is not set +# CONFIG_DEBUG_STACKOVERFLOW is not set +# CONFIG_DEBUG_STACK_USAGE is not set +# CONFIG_DEBUG_SLAB is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_DEBUG_HIGHMEM is not set +# CONFIG_DEBUG_INFO is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_FRAME_POINTER is not set +# CONFIG_4KSTACKS is not set +CONFIG_X86_FIND_SMP_CONFIG=y +CONFIG_X86_MPPARSE=y + +# +# Security options +# +CONFIG_SECURITY=y +# CONFIG_SECURITY_NETWORK is not set +CONFIG_SECURITY_CAPABILITIES=m +CONFIG_SECURITY_ROOTPLUG=m +# CONFIG_SECURITY_SELINUX is not set + +# +# Cryptographic options +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_SHA1=m +CONFIG_CRYPTO_SHA256=m +CONFIG_CRYPTO_SHA512=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_AES_586=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_KHAZAD=m +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_MICHAEL_MIC=m +CONFIG_CRYPTO_CRC32C=m +CONFIG_CRYPTO_TEST=m + +# +# Library routines +# +CONFIG_CRC_CCITT=m +CONFIG_CRC32=m +CONFIG_LIBCRC32C=m +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=m +CONFIG_X86_BIOS_REBOOT=y --- linux-source-2.6.8.1-2.6.8.1.orig/debian/config/i386/686-smp +++ linux-source-2.6.8.1-2.6.8.1/debian/config/i386/686-smp @@ -0,0 +1,2824 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_X86=y +CONFIG_MMU=y +CONFIG_UID16=y +CONFIG_GENERIC_ISA_DMA=y + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +# CONFIG_CLEAN_COMPILE is not set +CONFIG_BROKEN=y +CONFIG_BROKEN_ON_SMP=y + +# +# General setup +# +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_BSD_PROCESS_ACCT=y +# CONFIG_BSD_PROCESS_ACCT_V3 is not set +CONFIG_SYSCTL=y +# CONFIG_AUDIT is not set +CONFIG_LOG_BUF_SHIFT=15 +CONFIG_HOTPLUG=y +# CONFIG_IKCONFIG is not set +CONFIG_EMBEDDED=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_OBSOLETE_MODPARM=y +CONFIG_MODVERSIONS=y +CONFIG_KMOD=y +CONFIG_STOP_MACHINE=y + +# +# Processor type and features +# +CONFIG_X86_PC=y +# CONFIG_X86_ELAN is not set +# CONFIG_X86_VOYAGER is not set +# CONFIG_X86_NUMAQ is not set +# CONFIG_X86_SUMMIT is not set +# CONFIG_X86_BIGSMP is not set +# CONFIG_X86_VISWS is not set +# CONFIG_X86_GENERICARCH is not set +# CONFIG_X86_ES7000 is not set +# CONFIG_M386 is not set +# CONFIG_M486 is not set +# CONFIG_M586 is not set +# CONFIG_M586TSC is not set +# CONFIG_M586MMX is not set +CONFIG_M686=y +# CONFIG_MPENTIUMII is not set +# CONFIG_MPENTIUMIII is not set +# CONFIG_MPENTIUMM is not set +# CONFIG_MPENTIUM4 is not set +# CONFIG_MK6 is not set +# CONFIG_MK7 is not set +# CONFIG_MK8 is not set +# CONFIG_MCRUSOE is not set +# CONFIG_MWINCHIPC6 is not set +# CONFIG_MWINCHIP2 is not set +# CONFIG_MWINCHIP3D is not set +# CONFIG_MCYRIXIII is not set +# CONFIG_MVIAC3_2 is not set +# CONFIG_X86_GENERIC is not set +CONFIG_X86_CMPXCHG=y +CONFIG_X86_XADD=y +CONFIG_X86_L1_CACHE_SHIFT=5 +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_X86_PPRO_FENCE=y +CONFIG_X86_WP_WORKS_OK=y +CONFIG_X86_INVLPG=y +CONFIG_X86_BSWAP=y +CONFIG_X86_POPAD_OK=y +CONFIG_X86_GOOD_APIC=y +CONFIG_X86_USE_PPRO_CHECKSUM=y +CONFIG_HPET_TIMER=y +CONFIG_SMP=y +CONFIG_NR_CPUS=8 +CONFIG_SCHED_SMT=y +CONFIG_PREEMPT=y +CONFIG_X86_LOCAL_APIC=y +CONFIG_X86_IO_APIC=y +CONFIG_X86_TSC=y +CONFIG_X86_MCE=y +CONFIG_X86_MCE_NONFATAL=m +CONFIG_X86_MCE_P4THERMAL=y +CONFIG_TOSHIBA=m +CONFIG_I8K=m +CONFIG_MICROCODE=m +CONFIG_X86_MSR=m +CONFIG_X86_CPUID=m + +# +# Firmware Drivers +# +CONFIG_EDD=m +# CONFIG_NOHIGHMEM is not set +CONFIG_HIGHMEM4G=y +# CONFIG_HIGHMEM64G is not set +CONFIG_HIGHMEM=y +# CONFIG_HIGHPTE is not set +# CONFIG_MATH_EMULATION is not set +CONFIG_MTRR=y +# CONFIG_EFI is not set +# CONFIG_IRQBALANCE is not set +CONFIG_HAVE_DEC_LOCK=y +# CONFIG_REGPARM is not set + +# +# Power management options (ACPI, APM) +# +CONFIG_PM=y +# CONFIG_SOFTWARE_SUSPEND is not set +# CONFIG_PM_DISK is not set + +# +# ACPI (Advanced Configuration and Power Interface) Support +# +CONFIG_ACPI=y +CONFIG_ACPI_BOOT=y +CONFIG_ACPI_INTERPRETER=y +CONFIG_ACPI_SLEEP=y +CONFIG_ACPI_SLEEP_PROC_FS=y +CONFIG_ACPI_AC=m +CONFIG_ACPI_BATTERY=m +CONFIG_ACPI_BUTTON=m +CONFIG_ACPI_FAN=m +CONFIG_ACPI_PROCESSOR=m +CONFIG_ACPI_THERMAL=m +CONFIG_ACPI_ASUS=m +CONFIG_ACPI_TOSHIBA=m +# CONFIG_ACPI_DEBUG is not set +CONFIG_ACPI_BUS=y +CONFIG_ACPI_EC=y +CONFIG_ACPI_POWER=y +CONFIG_ACPI_PCI=y +CONFIG_ACPI_SYSTEM=y +CONFIG_X86_PM_TIMER=y + +# +# APM (Advanced Power Management) BIOS Support +# +CONFIG_APM=m +# CONFIG_APM_IGNORE_USER_SUSPEND is not set +# CONFIG_APM_DO_ENABLE is not set +# CONFIG_APM_CPU_IDLE is not set +# CONFIG_APM_DISPLAY_BLANK is not set +# CONFIG_APM_RTC_IS_GMT is not set +# CONFIG_APM_ALLOW_INTS is not set +# CONFIG_APM_REAL_MODE_POWER_OFF is not set + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_PROC_INTF=m +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=m +CONFIG_CPU_FREQ_GOV_USERSPACE=m +# CONFIG_CPU_FREQ_24_API is not set +CONFIG_CPU_FREQ_TABLE=m + +# +# CPUFreq processor drivers +# +CONFIG_X86_ACPI_CPUFREQ=m +# CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set +CONFIG_X86_POWERNOW_K6=m +CONFIG_X86_POWERNOW_K7=m +CONFIG_X86_POWERNOW_K8=m +CONFIG_X86_GX_SUSPMOD=m +CONFIG_X86_SPEEDSTEP_CENTRINO=m +CONFIG_X86_SPEEDSTEP_CENTRINO_TABLE=y +CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI=y +CONFIG_X86_SPEEDSTEP_ICH=m +CONFIG_X86_SPEEDSTEP_SMI=m +CONFIG_X86_P4_CLOCKMOD=m +CONFIG_X86_SPEEDSTEP_LIB=m +CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK=y +CONFIG_X86_LONGRUN=m +CONFIG_X86_LONGHAUL=m + +# +# Bus options (PCI, PCMCIA, EISA, MCA, ISA) +# +CONFIG_PCI=y +# CONFIG_PCI_GOBIOS is not set +# CONFIG_PCI_GOMMCONFIG is not set +# CONFIG_PCI_GODIRECT is not set +CONFIG_PCI_GOANY=y +CONFIG_PCI_BIOS=y +CONFIG_PCI_DIRECT=y +CONFIG_PCI_MMCONFIG=y +CONFIG_PCI_MSI=y +# CONFIG_PCI_LEGACY_PROC is not set +CONFIG_PCI_NAMES=y +CONFIG_ISA=y +# CONFIG_EISA is not set +# CONFIG_MCA is not set +CONFIG_SCx200=m + +# +# PCMCIA/CardBus support +# +CONFIG_PCMCIA=m +# CONFIG_PCMCIA_DEBUG is not set +CONFIG_YENTA=m +CONFIG_CARDBUS=y +CONFIG_PD6729=m +CONFIG_I82092=m +CONFIG_I82365=m +CONFIG_TCIC=m +CONFIG_PCMCIA_PROBE=y + +# +# PCI Hotplug Support +# +CONFIG_HOTPLUG_PCI=m +CONFIG_HOTPLUG_PCI_FAKE=m +CONFIG_HOTPLUG_PCI_COMPAQ=m +# CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM is not set +CONFIG_HOTPLUG_PCI_IBM=m +CONFIG_HOTPLUG_PCI_ACPI=m +CONFIG_HOTPLUG_PCI_CPCI=y +CONFIG_HOTPLUG_PCI_CPCI_ZT5550=m +CONFIG_HOTPLUG_PCI_CPCI_GENERIC=m +CONFIG_HOTPLUG_PCI_PCIE=m +# CONFIG_HOTPLUG_PCI_PCIE_POLL_EVENT_MODE is not set +CONFIG_HOTPLUG_PCI_SHPC=m +# CONFIG_HOTPLUG_PCI_SHPC_POLL_EVENT_MODE is not set + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_AOUT=m +CONFIG_BINFMT_MISC=m + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=m +# CONFIG_DEBUG_DRIVER is not set + +# +# Memory Technology Devices (MTD) +# +CONFIG_MTD=m +# CONFIG_MTD_DEBUG is not set +CONFIG_MTD_PARTITIONS=y +CONFIG_MTD_CONCAT=m +CONFIG_MTD_REDBOOT_PARTS=m +# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set +# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set +# CONFIG_MTD_CMDLINE_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=m +CONFIG_MTD_BLOCK=m +CONFIG_MTD_BLOCK_RO=m +CONFIG_FTL=m +CONFIG_NFTL=m +CONFIG_NFTL_RW=y +CONFIG_INFTL=m + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=m +CONFIG_MTD_JEDECPROBE=m +CONFIG_MTD_GEN_PROBE=m +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +CONFIG_MTD_CFI_INTELEXT=m +CONFIG_MTD_CFI_AMDSTD=m +CONFIG_MTD_CFI_AMDSTD_RETRY=0 +CONFIG_MTD_CFI_STAA=m +CONFIG_MTD_CFI_UTIL=m +CONFIG_MTD_RAM=m +CONFIG_MTD_ROM=m +CONFIG_MTD_ABSENT=m +# CONFIG_MTD_OBSOLETE_CHIPS is not set + +# +# Mapping drivers for chip access +# +CONFIG_MTD_COMPLEX_MAPPINGS=y +CONFIG_MTD_PHYSMAP=m +CONFIG_MTD_PHYSMAP_START=0x8000000 +CONFIG_MTD_PHYSMAP_LEN=0x4000000 +CONFIG_MTD_PHYSMAP_BANKWIDTH=2 +CONFIG_MTD_PNC2000=m +CONFIG_MTD_SC520CDP=m +CONFIG_MTD_NETSC520=m +CONFIG_MTD_SBC_GXX=m +CONFIG_MTD_ELAN_104NC=m +CONFIG_MTD_SCx200_DOCFLASH=m +# CONFIG_MTD_AMD76XROM is not set +# CONFIG_MTD_ICHXROM is not set +# CONFIG_MTD_SCB2_FLASH is not set +CONFIG_MTD_NETtel=m +CONFIG_MTD_DILNETPC=m +CONFIG_MTD_DILNETPC_BOOTSIZE=0x80000 +# CONFIG_MTD_L440GX is not set +CONFIG_MTD_PCI=m +# CONFIG_MTD_PCMCIA is not set + +# +# Self-contained MTD device drivers +# +CONFIG_MTD_PMC551=m +# CONFIG_MTD_PMC551_BUGFIX is not set +# CONFIG_MTD_PMC551_DEBUG is not set +CONFIG_MTD_SLRAM=m +CONFIG_MTD_PHRAM=m +CONFIG_MTD_MTDRAM=m +CONFIG_MTDRAM_TOTAL_SIZE=4096 +CONFIG_MTDRAM_ERASE_SIZE=128 +CONFIG_MTD_BLKMTD=m + +# +# Disk-On-Chip Device Drivers +# +CONFIG_MTD_DOC2000=m +CONFIG_MTD_DOC2001=m +CONFIG_MTD_DOC2001PLUS=m +CONFIG_MTD_DOCPROBE=m +CONFIG_MTD_DOCECC=m +# CONFIG_MTD_DOCPROBE_ADVANCED is not set +CONFIG_MTD_DOCPROBE_ADDRESS=0 + +# +# NAND Flash Device Drivers +# +CONFIG_MTD_NAND=m +# CONFIG_MTD_NAND_VERIFY_WRITE is not set +CONFIG_MTD_NAND_IDS=m +CONFIG_MTD_NAND_DISKONCHIP=m +# CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set +CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0 +# CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE is not set + +# +# Parallel port support +# +CONFIG_PARPORT=m +CONFIG_PARPORT_PC=m +CONFIG_PARPORT_PC_CML1=m +CONFIG_PARPORT_SERIAL=m +CONFIG_PARPORT_PC_FIFO=y +# CONFIG_PARPORT_PC_SUPERIO is not set +CONFIG_PARPORT_PC_PCMCIA=m +# CONFIG_PARPORT_OTHER is not set +CONFIG_PARPORT_1284=y + +# +# Plug and Play support +# +CONFIG_PNP=y +# CONFIG_PNP_DEBUG is not set + +# +# Protocols +# +CONFIG_ISAPNP=y +CONFIG_PNPBIOS=y +CONFIG_PNPBIOS_PROC_FS=y + +# +# Block devices +# +CONFIG_BLK_DEV_FD=m +CONFIG_BLK_DEV_XD=m +CONFIG_PARIDE=m +CONFIG_PARIDE_PARPORT=m + +# +# Parallel IDE high-level drivers +# +CONFIG_PARIDE_PD=m +CONFIG_PARIDE_PCD=m +CONFIG_PARIDE_PF=m +CONFIG_PARIDE_PT=m +CONFIG_PARIDE_PG=m + +# +# Parallel IDE protocol modules +# +CONFIG_PARIDE_ATEN=m +CONFIG_PARIDE_BPCK=m +CONFIG_PARIDE_BPCK6=m +CONFIG_PARIDE_COMM=m +CONFIG_PARIDE_DSTR=m +CONFIG_PARIDE_FIT2=m +CONFIG_PARIDE_FIT3=m +CONFIG_PARIDE_EPAT=m +# CONFIG_PARIDE_EPATC8 is not set +CONFIG_PARIDE_EPIA=m +CONFIG_PARIDE_FRIQ=m +CONFIG_PARIDE_FRPW=m +CONFIG_PARIDE_KBIC=m +CONFIG_PARIDE_KTTI=m +CONFIG_PARIDE_ON20=m +CONFIG_PARIDE_ON26=m +CONFIG_BLK_CPQ_DA=m +CONFIG_BLK_CPQ_CISS_DA=m +CONFIG_CISS_SCSI_TAPE=y +CONFIG_BLK_DEV_DAC960=m +CONFIG_BLK_DEV_UMEM=m +CONFIG_BLK_DEV_LOOP=m +CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_SX8=m +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_BLK_DEV_INITRD=y +CONFIG_LBD=y + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=m +CONFIG_BLK_DEV_IDE=m + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_IDE_SATA is not set +# CONFIG_BLK_DEV_HD_IDE is not set +CONFIG_BLK_DEV_IDEDISK=m +# CONFIG_IDEDISK_MULTI_MODE is not set +CONFIG_BLK_DEV_IDECS=m +CONFIG_BLK_DEV_IDECD=m +CONFIG_BLK_DEV_IDETAPE=m +CONFIG_BLK_DEV_IDEFLOPPY=m +CONFIG_BLK_DEV_IDESCSI=m +# CONFIG_IDE_TASK_IOCTL is not set +CONFIG_IDE_TASKFILE_IO=y + +# +# IDE chipset support/bugfixes +# +CONFIG_IDE_GENERIC=m +CONFIG_BLK_DEV_CMD640=y +# CONFIG_BLK_DEV_CMD640_ENHANCED is not set +CONFIG_BLK_DEV_IDEPNP=m +CONFIG_BLK_DEV_IDEPCI=y +CONFIG_IDEPCI_SHARE_IRQ=y +# CONFIG_BLK_DEV_OFFBOARD is not set +CONFIG_BLK_DEV_GENERIC=m +CONFIG_BLK_DEV_OPTI621=m +CONFIG_BLK_DEV_RZ1000=m +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +CONFIG_IDEDMA_PCI_AUTO=y +# CONFIG_IDEDMA_ONLYDISK is not set +CONFIG_BLK_DEV_ADMA=y +CONFIG_BLK_DEV_AEC62XX=m +CONFIG_BLK_DEV_ALI15X3=m +# CONFIG_WDC_ALI15X3 is not set +CONFIG_BLK_DEV_AMD74XX=m +CONFIG_BLK_DEV_ATIIXP=m +CONFIG_BLK_DEV_CMD64X=m +CONFIG_BLK_DEV_TRIFLEX=m +CONFIG_BLK_DEV_CY82C693=m +CONFIG_BLK_DEV_CS5520=m +CONFIG_BLK_DEV_CS5530=m +CONFIG_BLK_DEV_HPT34X=m +# CONFIG_HPT34X_AUTODMA is not set +CONFIG_BLK_DEV_HPT366=m +CONFIG_BLK_DEV_SC1200=m +CONFIG_BLK_DEV_PIIX=m +CONFIG_BLK_DEV_NS87415=m +CONFIG_BLK_DEV_PDC202XX_OLD=m +CONFIG_PDC202XX_BURST=y +CONFIG_BLK_DEV_PDC202XX_NEW=m +CONFIG_PDC202XX_FORCE=y +CONFIG_BLK_DEV_SVWKS=m +CONFIG_BLK_DEV_SIIMAGE=m +CONFIG_BLK_DEV_SIS5513=m +CONFIG_BLK_DEV_SLC90E66=m +CONFIG_BLK_DEV_TRM290=m +CONFIG_BLK_DEV_VIA82CXXX=m +# CONFIG_IDE_ARM is not set +# CONFIG_IDE_CHIPSETS is not set +CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_IVB is not set +CONFIG_IDEDMA_AUTO=y +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +CONFIG_SCSI=m +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +CONFIG_CHR_DEV_ST=m +CONFIG_CHR_DEV_OSST=m +CONFIG_BLK_DEV_SR=m +# CONFIG_BLK_DEV_SR_VENDOR is not set +CONFIG_CHR_DEV_SG=m +CONFIG_CHR_DEV_SCH=m + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y + +# +# SCSI Transport Attributes +# +CONFIG_SCSI_SPI_ATTRS=m +CONFIG_SCSI_FC_ATTRS=m + +# +# SCSI low-level drivers +# +CONFIG_BLK_DEV_3W_XXXX_RAID=m +CONFIG_SCSI_3W_9XXX=m +CONFIG_SCSI_7000FASST=m +CONFIG_SCSI_ACARD=m +CONFIG_SCSI_AHA152X=m +CONFIG_SCSI_AHA1542=m +CONFIG_SCSI_AACRAID=m +CONFIG_SCSI_AIC7XXX=m +CONFIG_AIC7XXX_CMDS_PER_DEVICE=8 +CONFIG_AIC7XXX_RESET_DELAY_MS=15000 +# CONFIG_AIC7XXX_BUILD_FIRMWARE is not set +CONFIG_AIC7XXX_DEBUG_ENABLE=y +CONFIG_AIC7XXX_DEBUG_MASK=0 +CONFIG_AIC7XXX_REG_PRETTY_PRINT=y +CONFIG_SCSI_AIC7XXX_OLD=m +CONFIG_SCSI_AIC79XX=m +CONFIG_AIC79XX_CMDS_PER_DEVICE=32 +CONFIG_AIC79XX_RESET_DELAY_MS=15000 +# CONFIG_AIC79XX_BUILD_FIRMWARE is not set +CONFIG_AIC79XX_ENABLE_RD_STRM=y +CONFIG_AIC79XX_DEBUG_ENABLE=y +CONFIG_AIC79XX_DEBUG_MASK=0 +CONFIG_AIC79XX_REG_PRETTY_PRINT=y +CONFIG_SCSI_DPT_I2O=m +CONFIG_SCSI_ADVANSYS=m +CONFIG_SCSI_IN2000=m +CONFIG_SCSI_MEGARAID=m +CONFIG_SCSI_SATA=y +CONFIG_SCSI_SATA_SVW=m +CONFIG_SCSI_ATA_PIIX=m +CONFIG_SCSI_SATA_NV=m +CONFIG_SCSI_SATA_PROMISE=m +CONFIG_SCSI_SATA_SX4=m +CONFIG_SCSI_SATA_SIL=m +CONFIG_SCSI_SATA_SIS=m +CONFIG_SCSI_SATA_VIA=m +CONFIG_SCSI_SATA_VITESSE=m +CONFIG_SCSI_BUSLOGIC=m +# CONFIG_SCSI_OMIT_FLASHPOINT is not set +# CONFIG_SCSI_CPQFCTS is not set +CONFIG_SCSI_DMX3191D=m +CONFIG_SCSI_DTC3280=m +CONFIG_SCSI_EATA=m +CONFIG_SCSI_EATA_TAGGED_QUEUE=y +CONFIG_SCSI_EATA_LINKED_COMMANDS=y +CONFIG_SCSI_EATA_MAX_TAGS=16 +CONFIG_SCSI_EATA_PIO=m +CONFIG_SCSI_FUTURE_DOMAIN=m +CONFIG_SCSI_GDTH=m +CONFIG_SCSI_GENERIC_NCR5380=m +CONFIG_SCSI_GENERIC_NCR5380_MMIO=m +CONFIG_SCSI_GENERIC_NCR53C400=y +CONFIG_SCSI_IPS=m +# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_INIA100 is not set +CONFIG_SCSI_PPA=m +CONFIG_SCSI_IMM=m +# CONFIG_SCSI_IZIP_EPP16 is not set +# CONFIG_SCSI_IZIP_SLOW_CTR is not set +CONFIG_SCSI_NCR53C406A=m +CONFIG_SCSI_SYM53C8XX_2=m +CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 +CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 +CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 +# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set +CONFIG_SCSI_IPR=m +# CONFIG_SCSI_IPR_TRACE is not set +# CONFIG_SCSI_IPR_DUMP is not set +CONFIG_SCSI_PAS16=m +# CONFIG_SCSI_PCI2000 is not set +# CONFIG_SCSI_PCI2220I is not set +CONFIG_SCSI_PSI240I=m +CONFIG_SCSI_QLOGIC_FAS=m +CONFIG_SCSI_QLOGIC_ISP=m +CONFIG_SCSI_QLOGIC_FC=m +CONFIG_SCSI_QLOGIC_FC_FIRMWARE=y +CONFIG_SCSI_QLOGIC_1280=m +# CONFIG_SCSI_SEAGATE is not set +CONFIG_SCSI_SYM53C416=m +CONFIG_SCSI_DC395x=m +CONFIG_SCSI_DC390T=m +CONFIG_SCSI_T128=m +CONFIG_SCSI_U14_34F=m +CONFIG_SCSI_U14_34F_TAGGED_QUEUE=y +CONFIG_SCSI_U14_34F_LINKED_COMMANDS=y +CONFIG_SCSI_U14_34F_MAX_TAGS=8 +CONFIG_SCSI_ULTRASTOR=m +CONFIG_SCSI_NSP32=m +CONFIG_SCSI_DEBUG=m + +# +# PCMCIA SCSI adapter support +# +CONFIG_PCMCIA_AHA152X=m +CONFIG_PCMCIA_FDOMAIN=m +CONFIG_PCMCIA_NINJA_SCSI=m +CONFIG_PCMCIA_QLOGIC=m +CONFIG_PCMCIA_SYM53C500=m + +# +# Old CD-ROM drivers (not SCSI, not IDE) +# +CONFIG_CD_NO_IDESCSI=y +CONFIG_AZTCD=m +CONFIG_GSCD=m +# CONFIG_SBPCD is not set +CONFIG_MCD=m +CONFIG_MCD_IRQ=11 +CONFIG_MCD_BASE=0x300 +CONFIG_MCDX=m +CONFIG_OPTCD=m +# CONFIG_CM206 is not set +CONFIG_SJCD=m +CONFIG_ISP16_CDI=m +# CONFIG_CDU31A is not set +CONFIG_CDU535=m + +# +# Multi-device support (RAID and LVM) +# +CONFIG_MD=y +CONFIG_BLK_DEV_MD=m +CONFIG_MD_LINEAR=m +CONFIG_MD_RAID0=m +CONFIG_MD_RAID1=m +CONFIG_MD_RAID5=m +CONFIG_MD_RAID6=m +CONFIG_MD_MULTIPATH=m +CONFIG_BLK_DEV_DM=m +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=m +CONFIG_DM_MIRROR=m +CONFIG_DM_ZERO=m + +# +# Fusion MPT device support +# +CONFIG_FUSION=m +CONFIG_FUSION_MAX_SGE=40 +CONFIG_FUSION_ISENSE=m +CONFIG_FUSION_CTL=m +CONFIG_FUSION_LAN=m + +# +# IEEE 1394 (FireWire) support +# +CONFIG_IEEE1394=m + +# +# Subsystem Options +# +# CONFIG_IEEE1394_VERBOSEDEBUG is not set +# CONFIG_IEEE1394_OUI_DB is not set +CONFIG_IEEE1394_EXTRA_CONFIG_ROMS=y +CONFIG_IEEE1394_CONFIG_ROM_IP1394=y + +# +# Device Drivers +# +CONFIG_IEEE1394_PCILYNX=m +CONFIG_IEEE1394_OHCI1394=m + +# +# Protocol Drivers +# +CONFIG_IEEE1394_VIDEO1394=m +CONFIG_IEEE1394_SBP2=m +# CONFIG_IEEE1394_SBP2_PHYS_DMA is not set +CONFIG_IEEE1394_ETH1394=m +CONFIG_IEEE1394_DV1394=m +CONFIG_IEEE1394_RAWIO=m +CONFIG_IEEE1394_CMP=m +CONFIG_IEEE1394_AMDTP=m + +# +# I2O device support +# +CONFIG_I2O=m +CONFIG_I2O_CONFIG=m +CONFIG_I2O_BLOCK=m +CONFIG_I2O_SCSI=m +CONFIG_I2O_PROC=m + +# +# Networking support +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=m +CONFIG_PACKET_MMAP=y +CONFIG_NETLINK_DEV=m +CONFIG_UNIX=m +CONFIG_NET_KEY=m +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_FWMARK=y +CONFIG_IP_ROUTE_NAT=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_TOS=y +CONFIG_IP_ROUTE_VERBOSE=y +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE=m +CONFIG_NET_IPGRE_BROADCAST=y +CONFIG_IP_MROUTE=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +# CONFIG_ARPD is not set +CONFIG_SYN_COOKIES=y +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +CONFIG_INET_IPCOMP=m + +# +# IP: Virtual Server Configuration +# +CONFIG_IP_VS=m +# CONFIG_IP_VS_DEBUG is not set +CONFIG_IP_VS_TAB_BITS=12 + +# +# IPVS transport protocol load balancing support +# +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_PROTO_ESP=y +CONFIG_IP_VS_PROTO_AH=y + +# +# IPVS scheduler +# +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_WRR=m +CONFIG_IP_VS_LC=m +CONFIG_IP_VS_WLC=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m + +# +# IPVS application helper +# +CONFIG_IP_VS_FTP=m +CONFIG_IPV6=m +CONFIG_IPV6_PRIVACY=y +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +CONFIG_INET6_IPCOMP=m +CONFIG_IPV6_TUNNEL=m +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_BRIDGE_NETFILTER=y + +# +# IP: Netfilter Configuration +# +CONFIG_IP_NF_CONNTRACK=m +CONFIG_IP_NF_FTP=m +CONFIG_IP_NF_IRC=m +CONFIG_IP_NF_TFTP=m +CONFIG_IP_NF_AMANDA=m +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_LIMIT=m +CONFIG_IP_NF_MATCH_IPRANGE=m +CONFIG_IP_NF_MATCH_MAC=m +CONFIG_IP_NF_MATCH_PKTTYPE=m +CONFIG_IP_NF_MATCH_MARK=m +CONFIG_IP_NF_MATCH_MULTIPORT=m +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_DSCP=m +CONFIG_IP_NF_MATCH_AH_ESP=m +CONFIG_IP_NF_MATCH_LENGTH=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_TCPMSS=m +CONFIG_IP_NF_MATCH_HELPER=m +CONFIG_IP_NF_MATCH_STATE=m +CONFIG_IP_NF_MATCH_CONNTRACK=m +CONFIG_IP_NF_MATCH_OWNER=m +CONFIG_IP_NF_MATCH_PHYSDEV=m +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_SAME=m +CONFIG_IP_NF_NAT_LOCAL=y +CONFIG_IP_NF_NAT_SNMP_BASIC=m +CONFIG_IP_NF_NAT_IRC=m +CONFIG_IP_NF_NAT_FTP=m +CONFIG_IP_NF_NAT_TFTP=m +CONFIG_IP_NF_NAT_AMANDA=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_DSCP=m +CONFIG_IP_NF_TARGET_MARK=m +CONFIG_IP_NF_TARGET_CLASSIFY=m +CONFIG_IP_NF_TARGET_LOG=m +CONFIG_IP_NF_TARGET_ULOG=m +CONFIG_IP_NF_TARGET_TCPMSS=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +CONFIG_IP_NF_COMPAT_IPCHAINS=m +CONFIG_IP_NF_COMPAT_IPFWADM=m +CONFIG_IP_NF_TARGET_NOTRACK=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_MATCH_ADDRTYPE=m +CONFIG_IP_NF_MATCH_REALM=m + +# +# IPv6: Netfilter Configuration +# +CONFIG_IP6_NF_QUEUE=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MATCH_LIMIT=m +CONFIG_IP6_NF_MATCH_MAC=m +CONFIG_IP6_NF_MATCH_RT=m +CONFIG_IP6_NF_MATCH_OPTS=m +CONFIG_IP6_NF_MATCH_FRAG=m +CONFIG_IP6_NF_MATCH_HL=m +CONFIG_IP6_NF_MATCH_MULTIPORT=m +CONFIG_IP6_NF_MATCH_OWNER=m +CONFIG_IP6_NF_MATCH_MARK=m +CONFIG_IP6_NF_MATCH_IPV6HEADER=m +CONFIG_IP6_NF_MATCH_AHESP=m +CONFIG_IP6_NF_MATCH_LENGTH=m +CONFIG_IP6_NF_MATCH_EUI64=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_LOG=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_TARGET_MARK=m +CONFIG_IP6_NF_RAW=m + +# +# DECnet: Netfilter Configuration +# +CONFIG_DECNET_NF_GRABULATOR=m + +# +# Bridge: Netfilter Configuration +# +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_802_3=m +CONFIG_BRIDGE_EBT_AMONG=m +CONFIG_BRIDGE_EBT_ARP=m +CONFIG_BRIDGE_EBT_IP=m +CONFIG_BRIDGE_EBT_LIMIT=m +CONFIG_BRIDGE_EBT_MARK=m +CONFIG_BRIDGE_EBT_PKTTYPE=m +CONFIG_BRIDGE_EBT_STP=m +CONFIG_BRIDGE_EBT_VLAN=m +CONFIG_BRIDGE_EBT_ARPREPLY=m +CONFIG_BRIDGE_EBT_DNAT=m +CONFIG_BRIDGE_EBT_MARK_T=m +CONFIG_BRIDGE_EBT_REDIRECT=m +CONFIG_BRIDGE_EBT_SNAT=m +CONFIG_BRIDGE_EBT_LOG=m +CONFIG_XFRM=y +CONFIG_XFRM_USER=m + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IP_SCTP=m +# CONFIG_SCTP_DBG_MSG is not set +# CONFIG_SCTP_DBG_OBJCNT is not set +# CONFIG_SCTP_HMAC_NONE is not set +# CONFIG_SCTP_HMAC_SHA1 is not set +CONFIG_SCTP_HMAC_MD5=y +CONFIG_ATM=y +CONFIG_ATM_CLIP=y +# CONFIG_ATM_CLIP_NO_ICMP is not set +CONFIG_ATM_LANE=m +CONFIG_ATM_MPOA=m +CONFIG_ATM_BR2684=m +# CONFIG_ATM_BR2684_IPFILTER is not set +CONFIG_BRIDGE=m +CONFIG_VLAN_8021Q=m +CONFIG_DECNET=m +# CONFIG_DECNET_SIOCGIFCONF is not set +# CONFIG_DECNET_ROUTER is not set +CONFIG_LLC=y +CONFIG_LLC2=m +CONFIG_IPX=m +# CONFIG_IPX_INTERN is not set +CONFIG_ATALK=m +CONFIG_DEV_APPLETALK=y +CONFIG_LTPC=m +CONFIG_COPS=m +CONFIG_COPS_DAYNA=y +CONFIG_COPS_TANGENT=y +CONFIG_IPDDP=m +CONFIG_IPDDP_ENCAP=y +CONFIG_IPDDP_DECAP=y +CONFIG_X25=m +CONFIG_LAPB=m +# CONFIG_NET_DIVERT is not set +CONFIG_ECONET=m +CONFIG_ECONET_AUNUDP=y +CONFIG_ECONET_NATIVE=y +CONFIG_WAN_ROUTER=m +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_CLK_JIFFIES=y +# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set +# CONFIG_NET_SCH_CLK_CPU is not set +CONFIG_NET_SCH_CBQ=m +CONFIG_NET_SCH_HTB=m +CONFIG_NET_SCH_HFSC=m +CONFIG_NET_SCH_ATM=m +CONFIG_NET_SCH_PRIO=m +CONFIG_NET_SCH_RED=m +CONFIG_NET_SCH_SFQ=m +CONFIG_NET_SCH_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_NETEM=m +CONFIG_NET_SCH_INGRESS=m +CONFIG_NET_QOS=y +CONFIG_NET_ESTIMATOR=y +CONFIG_NET_CLS=y +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_ROUTE=y +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +# CONFIG_CLS_U32_PERF is not set +# CONFIG_NET_CLS_IND is not set +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +# CONFIG_NET_CLS_ACT is not set +CONFIG_NET_CLS_POLICE=y + +# +# Network testing +# +CONFIG_NET_PKTGEN=m +CONFIG_NETPOLL=y +# CONFIG_NETPOLL_RX is not set +# CONFIG_NETPOLL_TRAP is not set +CONFIG_NET_POLL_CONTROLLER=y +CONFIG_HAMRADIO=y + +# +# Packet Radio protocols +# +CONFIG_AX25=m +# CONFIG_AX25_DAMA_SLAVE is not set +CONFIG_NETROM=m +CONFIG_ROSE=m + +# +# AX.25 network device drivers +# +# CONFIG_MKISS is not set +# CONFIG_6PACK is not set +CONFIG_BPQETHER=m +# CONFIG_DMASCC is not set +CONFIG_SCC=m +# CONFIG_SCC_DELAY is not set +# CONFIG_SCC_TRXECHO is not set +CONFIG_BAYCOM_SER_FDX=m +CONFIG_BAYCOM_SER_HDX=m +CONFIG_BAYCOM_PAR=m +CONFIG_BAYCOM_EPP=m +CONFIG_YAM=m +CONFIG_IRDA=m + +# +# IrDA protocols +# +CONFIG_IRLAN=m +CONFIG_IRNET=m +CONFIG_IRCOMM=m +# CONFIG_IRDA_ULTRA is not set + +# +# IrDA options +# +CONFIG_IRDA_CACHE_LAST_LSAP=y +CONFIG_IRDA_FAST_RR=y +CONFIG_IRDA_DEBUG=y + +# +# Infrared-port device drivers +# + +# +# SIR device drivers +# +CONFIG_IRTTY_SIR=m + +# +# Dongle support +# +CONFIG_DONGLE=y +CONFIG_ESI_DONGLE=m +CONFIG_ACTISYS_DONGLE=m +CONFIG_TEKRAM_DONGLE=m +CONFIG_LITELINK_DONGLE=m +CONFIG_MA600_DONGLE=m +CONFIG_GIRBIL_DONGLE=m +CONFIG_MCP2120_DONGLE=m +CONFIG_OLD_BELKIN_DONGLE=m +CONFIG_ACT200L_DONGLE=m + +# +# Old SIR device drivers +# +# CONFIG_IRPORT_SIR is not set + +# +# Old Serial dongle support +# + +# +# FIR device drivers +# +CONFIG_USB_IRDA=m +CONFIG_SIGMATEL_FIR=m +CONFIG_NSC_FIR=m +CONFIG_WINBOND_FIR=m +CONFIG_TOSHIBA_FIR=m +CONFIG_SMC_IRCC_FIR=m +CONFIG_ALI_FIR=m +CONFIG_VLSI_FIR=m +CONFIG_VIA_FIR=m +CONFIG_BT=m +CONFIG_BT_L2CAP=m +CONFIG_BT_SCO=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_CMTP=m +CONFIG_BT_HIDP=m + +# +# Bluetooth device drivers +# +CONFIG_BT_HCIUSB=m +CONFIG_BT_HCIUSB_SCO=y +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_H4=y +CONFIG_BT_HCIUART_BCSP=y +# CONFIG_BT_HCIUART_BCSP_TXCRC is not set +CONFIG_BT_HCIBCM203X=m +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIDTL1=m +CONFIG_BT_HCIBT3C=m +CONFIG_BT_HCIBLUECARD=m +CONFIG_BT_HCIBTUART=m +CONFIG_BT_HCIVHCI=m +CONFIG_NETDEVICES=y +CONFIG_DUMMY=m +CONFIG_BONDING=m +CONFIG_EQUALIZER=m +CONFIG_TUN=m +CONFIG_ETHERTAP=m +CONFIG_NET_SB1000=m + +# +# ARCnet devices +# +CONFIG_ARCNET=m +CONFIG_ARCNET_1201=m +CONFIG_ARCNET_1051=m +CONFIG_ARCNET_RAW=m +CONFIG_ARCNET_COM90xx=m +CONFIG_ARCNET_COM90xxIO=m +CONFIG_ARCNET_RIM_I=m +CONFIG_ARCNET_COM20020=m +CONFIG_ARCNET_COM20020_ISA=m +CONFIG_ARCNET_COM20020_PCI=m + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=m +CONFIG_HAPPYMEAL=m +CONFIG_SUNGEM=m +CONFIG_NET_VENDOR_3COM=y +CONFIG_EL1=m +CONFIG_EL2=m +CONFIG_ELPLUS=m +CONFIG_EL16=m +CONFIG_EL3=m +CONFIG_3C515=m +CONFIG_VORTEX=m +CONFIG_TYPHOON=m +CONFIG_LANCE=m +CONFIG_NET_VENDOR_SMC=y +CONFIG_WD80x3=m +CONFIG_ULTRA=m +CONFIG_SMC9194=m +CONFIG_NET_VENDOR_RACAL=y +# CONFIG_NI5010 is not set +CONFIG_NI52=m +CONFIG_NI65=m + +# +# Tulip family network device support +# +CONFIG_NET_TULIP=y +CONFIG_DE2104X=m +CONFIG_TULIP=m +# CONFIG_TULIP_MWI is not set +# CONFIG_TULIP_MMIO is not set +# CONFIG_TULIP_NAPI is not set +CONFIG_DE4X5=m +CONFIG_WINBOND_840=m +CONFIG_DM9102=m +CONFIG_PCMCIA_XIRCOM=m +# CONFIG_PCMCIA_XIRTULIP is not set +CONFIG_AT1700=m +CONFIG_DEPCA=m +CONFIG_HP100=m +CONFIG_NET_ISA=y +CONFIG_E2100=m +CONFIG_EWRK3=m +CONFIG_EEXPRESS=m +CONFIG_EEXPRESS_PRO=m +CONFIG_HPLAN_PLUS=m +CONFIG_HPLAN=m +CONFIG_LP486E=m +CONFIG_ETH16I=m +CONFIG_NE2000=m +CONFIG_ZNET=m +CONFIG_SEEQ8005=m +CONFIG_NET_PCI=y +CONFIG_PCNET32=m +CONFIG_AMD8111_ETH=m +# CONFIG_AMD8111E_NAPI is not set +CONFIG_ADAPTEC_STARFIRE=m +# CONFIG_ADAPTEC_STARFIRE_NAPI is not set +CONFIG_AC3200=m +CONFIG_APRICOT=m +CONFIG_B44=m +CONFIG_FORCEDETH=m +CONFIG_CS89x0=m +CONFIG_EEPRO100=m +# CONFIG_EEPRO100_PIO is not set +CONFIG_E100=m +# CONFIG_E100_NAPI is not set +CONFIG_FEALNX=m +CONFIG_NATSEMI=m +CONFIG_NE2K_PCI=m +CONFIG_8139CP=m +CONFIG_8139TOO=m +CONFIG_8139TOO_PIO=y +CONFIG_8139TOO_TUNE_TWISTER=y +CONFIG_8139TOO_8129=y +# CONFIG_8139_OLD_RX_RESET is not set +CONFIG_SIS900=m +CONFIG_EPIC100=m +CONFIG_SUNDANCE=m +# CONFIG_SUNDANCE_MMIO is not set +CONFIG_TLAN=m +CONFIG_VIA_RHINE=m +# CONFIG_VIA_RHINE_MMIO is not set +CONFIG_VIA_VELOCITY=m +CONFIG_NET_POCKET=y +CONFIG_ATP=m +CONFIG_DE600=m +CONFIG_DE620=m + +# +# Ethernet (1000 Mbit) +# +CONFIG_DL2K=m +CONFIG_E1000=m +# CONFIG_E1000_NAPI is not set +CONFIG_NS83820=m +CONFIG_HAMACHI=m +CONFIG_YELLOWFIN=m +CONFIG_R8169=m +CONFIG_SK98LIN=m +CONFIG_TIGON3=m + +# +# Ethernet (10000 Mbit) +# +CONFIG_IXGB=m +# CONFIG_IXGB_NAPI is not set +CONFIG_S2IO=m +# CONFIG_S2IO_NAPI is not set + +# +# Token Ring devices +# +CONFIG_TR=y +CONFIG_IBMTR=m +CONFIG_IBMOL=m +CONFIG_IBMLS=m +CONFIG_3C359=m +CONFIG_TMS380TR=m +CONFIG_TMSPCI=m +CONFIG_SKISA=m +CONFIG_PROTEON=m +CONFIG_ABYSS=m + +# +# Wireless LAN (non-hamradio) +# +CONFIG_NET_RADIO=y + +# +# Obsolete Wireless cards support (pre-802.11) +# +CONFIG_STRIP=m +CONFIG_ARLAN=m +CONFIG_WAVELAN=m +CONFIG_PCMCIA_WAVELAN=m +CONFIG_PCMCIA_NETWAVE=m + +# +# Wireless 802.11 Frequency Hopping cards support +# +CONFIG_PCMCIA_RAYCS=m + +# +# Wireless 802.11b ISA/PCI cards support +# +CONFIG_IEEE80211=m +# CONFIG_IEEE80211_DEBUG is not set +CONFIG_IEEE80211_CRYPT=m +CONFIG_IEEE80211_WPA=y +CONFIG_IEEE80211_CRYPT_CCMP=m +CONFIG_IEEE80211_CRYPT_TKIP=m +CONFIG_IPW2100=m +CONFIG_IPW2100_PROMISC=y +# CONFIG_IPW2100_LEGACY_FW_LOAD is not set +# CONFIG_IPW2100_NOWEP is not set +# CONFIG_IPW2100_DEBUG is not set +CONFIG_IPW2200=m +# CONFIG_IPW2200_NOWEP is not set +CONFIG_WLAN_NG=m +CONFIG_PRISM2=m +CONFIG_PRISM2_USB=m +CONFIG_ACX100=m +CONFIG_ADM8211=m +CONFIG_AIRO=m +CONFIG_HERMES=m +CONFIG_PLX_HERMES=m +CONFIG_TMD_HERMES=m +CONFIG_PCI_HERMES=m +CONFIG_ATMEL=m +CONFIG_PCI_ATMEL=m + +# +# Wireless 802.11b Pcmcia/Cardbus cards support +# +CONFIG_PCMCIA_HERMES=m +CONFIG_AIRO_CS=m +CONFIG_PCMCIA_ATMEL=m +CONFIG_PCMCIA_WL3501=m + +# +# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support +# +CONFIG_PRISM54=m +CONFIG_NET_WIRELESS=y + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +CONFIG_PCMCIA_3C589=m +CONFIG_PCMCIA_3C574=m +CONFIG_PCMCIA_FMVJ18X=m +CONFIG_PCMCIA_PCNET=m +CONFIG_PCMCIA_NMCLAN=m +CONFIG_PCMCIA_SMC91C92=m +CONFIG_PCMCIA_XIRC2PS=m +CONFIG_PCMCIA_AXNET=m +CONFIG_ARCNET_COM20020_CS=m +CONFIG_PCMCIA_IBMTR=m + +# +# Wan interfaces +# +CONFIG_WAN=y +CONFIG_HOSTESS_SV11=m +CONFIG_COSA=m +CONFIG_DSCC4=m +CONFIG_DSCC4_PCISYNC=y +CONFIG_DSCC4_PCI_RST=y +CONFIG_LANMEDIA=m +CONFIG_SEALEVEL_4021=m +CONFIG_SYNCLINK_SYNCPPP=m +CONFIG_HDLC=m +CONFIG_HDLC_RAW=y +CONFIG_HDLC_RAW_ETH=y +CONFIG_HDLC_CISCO=y +CONFIG_HDLC_FR=y +CONFIG_HDLC_PPP=y +CONFIG_HDLC_X25=y +CONFIG_PCI200SYN=m +CONFIG_WANXL=m +CONFIG_PC300=m +CONFIG_PC300_MLPPP=y +CONFIG_N2=m +CONFIG_C101=m +CONFIG_FARSYNC=m +CONFIG_DLCI=m +CONFIG_DLCI_COUNT=24 +CONFIG_DLCI_MAX=8 +CONFIG_SDLA=m +CONFIG_WAN_ROUTER_DRIVERS=y +# CONFIG_VENDOR_SANGOMA is not set +CONFIG_CYCLADES_SYNC=m +CONFIG_CYCLOMX_X25=y +CONFIG_LAPBETHER=m +CONFIG_X25_ASY=m +CONFIG_SBNI=m +# CONFIG_SBNI_MULTILINE is not set + +# +# ATM drivers +# +CONFIG_ATM_TCP=m +CONFIG_ATM_LANAI=m +CONFIG_ATM_ENI=m +# CONFIG_ATM_ENI_DEBUG is not set +# CONFIG_ATM_ENI_TUNE_BURST is not set +CONFIG_ATM_FIRESTREAM=m +CONFIG_ATM_ZATM=m +# CONFIG_ATM_ZATM_DEBUG is not set +CONFIG_ATM_NICSTAR=m +# CONFIG_ATM_NICSTAR_USE_SUNI is not set +# CONFIG_ATM_NICSTAR_USE_IDT77105 is not set +CONFIG_ATM_IDT77252=m +# CONFIG_ATM_IDT77252_DEBUG is not set +# CONFIG_ATM_IDT77252_RCV_ALL is not set +CONFIG_ATM_IDT77252_USE_SUNI=y +CONFIG_ATM_AMBASSADOR=m +# CONFIG_ATM_AMBASSADOR_DEBUG is not set +CONFIG_ATM_HORIZON=m +# CONFIG_ATM_HORIZON_DEBUG is not set +CONFIG_ATM_IA=m +# CONFIG_ATM_IA_DEBUG is not set +CONFIG_ATM_FORE200E_MAYBE=m +CONFIG_ATM_FORE200E_PCA=y +CONFIG_ATM_FORE200E_PCA_DEFAULT_FW=y +# CONFIG_ATM_FORE200E_USE_TASKLET is not set +CONFIG_ATM_FORE200E_TX_RETRY=16 +CONFIG_ATM_FORE200E_DEBUG=0 +CONFIG_ATM_FORE200E=m +CONFIG_ATM_HE=m +CONFIG_ATM_HE_USE_SUNI=y +CONFIG_FDDI=y +CONFIG_DEFXX=m +CONFIG_SKFP=m +CONFIG_HIPPI=y +CONFIG_ROADRUNNER=m +# CONFIG_ROADRUNNER_LARGE_RINGS is not set +CONFIG_PLIP=m +CONFIG_PPP=m +CONFIG_PPP_MULTILINK=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_MPPE=m +CONFIG_PPPOE=m +CONFIG_PPPOATM=m +CONFIG_SLIP=m +CONFIG_SLIP_COMPRESSED=y +CONFIG_SLIP_SMART=y +CONFIG_SLIP_MODE_SLIP6=y +CONFIG_NET_FC=y +# CONFIG_IPHASE5526 is not set +CONFIG_SHAPER=m +CONFIG_NETCONSOLE=m +CONFIG_NDISWRAPPER=m + +# +# ISDN subsystem +# +CONFIG_ISDN=m + +# +# Old ISDN4Linux +# +CONFIG_ISDN_I4L=m +CONFIG_ISDN_PPP=y +CONFIG_ISDN_PPP_VJ=y +CONFIG_ISDN_MPP=y +CONFIG_IPPP_FILTER=y +CONFIG_ISDN_PPP_BSDCOMP=m +CONFIG_ISDN_AUDIO=y +CONFIG_ISDN_TTY_FAX=y +CONFIG_ISDN_X25=y + +# +# ISDN feature submodules +# +# CONFIG_ISDN_DRV_LOOP is not set +# CONFIG_ISDN_DIVERSION is not set + +# +# ISDN4Linux hardware drivers +# + +# +# Passive cards +# +CONFIG_ISDN_DRV_HISAX=m + +# +# D-channel protocol features +# +CONFIG_HISAX_EURO=y +CONFIG_DE_AOC=y +# CONFIG_HISAX_NO_SENDCOMPLETE is not set +# CONFIG_HISAX_NO_LLC is not set +# CONFIG_HISAX_NO_KEYPAD is not set +CONFIG_HISAX_1TR6=y +CONFIG_HISAX_NI1=y +CONFIG_HISAX_MAX_CARDS=8 + +# +# HiSax supported cards +# +CONFIG_HISAX_16_0=y +CONFIG_HISAX_16_3=y +CONFIG_HISAX_TELESPCI=y +CONFIG_HISAX_S0BOX=y +CONFIG_HISAX_AVM_A1=y +CONFIG_HISAX_FRITZPCI=y +CONFIG_HISAX_AVM_A1_PCMCIA=y +CONFIG_HISAX_ELSA=y +CONFIG_HISAX_IX1MICROR2=y +CONFIG_HISAX_DIEHLDIVA=y +CONFIG_HISAX_ASUSCOM=y +CONFIG_HISAX_TELEINT=y +CONFIG_HISAX_HFCS=y +CONFIG_HISAX_SEDLBAUER=y +CONFIG_HISAX_SPORTSTER=y +CONFIG_HISAX_MIC=y +CONFIG_HISAX_NETJET=y +CONFIG_HISAX_NETJET_U=y +CONFIG_HISAX_NICCY=y +CONFIG_HISAX_ISURF=y +CONFIG_HISAX_HSTSAPHIR=y +CONFIG_HISAX_BKM_A4T=y +CONFIG_HISAX_SCT_QUADRO=y +CONFIG_HISAX_GAZEL=y +CONFIG_HISAX_HFC_PCI=y +CONFIG_HISAX_W6692=y +CONFIG_HISAX_HFC_SX=y +CONFIG_HISAX_ENTERNOW_PCI=y +# CONFIG_HISAX_DEBUG is not set + +# +# HiSax PCMCIA card service modules +# +CONFIG_HISAX_SEDLBAUER_CS=m +CONFIG_HISAX_ELSA_CS=m +CONFIG_HISAX_AVM_A1_CS=m +CONFIG_HISAX_TELES_CS=m + +# +# HiSax sub driver modules +# +CONFIG_HISAX_ST5481=m +CONFIG_HISAX_HFCUSB=m +CONFIG_HISAX_FRITZ_PCIPNP=m +CONFIG_HISAX_HDLC=y + +# +# Active cards +# +CONFIG_ISDN_DRV_ICN=m +CONFIG_ISDN_DRV_PCBIT=m +CONFIG_ISDN_DRV_SC=m +CONFIG_ISDN_DRV_ACT2000=m +CONFIG_ISDN_DRV_TPAM=m +# CONFIG_HYSDN is not set + +# +# CAPI subsystem +# +CONFIG_ISDN_CAPI=m +CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON=y +CONFIG_ISDN_CAPI_MIDDLEWARE=y +CONFIG_ISDN_CAPI_CAPI20=m +CONFIG_ISDN_CAPI_CAPIFS_BOOL=y +CONFIG_ISDN_CAPI_CAPIFS=m +CONFIG_ISDN_CAPI_CAPIDRV=m + +# +# CAPI hardware drivers +# + +# +# Active AVM cards +# +CONFIG_CAPI_AVM=y +# CONFIG_ISDN_DRV_AVMB1_B1ISA is not set +# CONFIG_ISDN_DRV_AVMB1_B1PCI is not set +# CONFIG_ISDN_DRV_AVMB1_T1ISA is not set +# CONFIG_ISDN_DRV_AVMB1_B1PCMCIA is not set +# CONFIG_ISDN_DRV_AVMB1_T1PCI is not set +# CONFIG_ISDN_DRV_AVMB1_C4 is not set + +# +# Active Eicon DIVA Server cards +# +CONFIG_CAPI_EICON=y +CONFIG_ISDN_DIVAS=m +CONFIG_ISDN_DIVAS_BRIPCI=y +CONFIG_ISDN_DIVAS_PRIPCI=y +CONFIG_ISDN_DIVAS_DIVACAPI=m +CONFIG_ISDN_DIVAS_USERIDI=m +CONFIG_ISDN_DIVAS_MAINT=m + +# +# Modular ISDN driver +# +CONFIG_MISDN_DRV=m +# CONFIG_MISDN_MEMDEBUG is not set +CONFIG_MISDN_AVM_FRITZ=y +CONFIG_MISDN_HFCPCI=y +CONFIG_MISDN_HFCMULTI=y +CONFIG_MISDN_SPEEDFAX=y +CONFIG_MISDN_W6692=y +CONFIG_MISDN_DSP=y + +# +# Telephony Support +# +CONFIG_PHONE=m +CONFIG_PHONE_IXJ=m +CONFIG_PHONE_IXJ_PCMCIA=m + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=m +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_MOUSEDEV_PSAUX_ENABLE=y +CONFIG_INPUT_JOYDEV=m +CONFIG_INPUT_TSDEV=m +CONFIG_INPUT_TSDEV_SCREEN_X=240 +CONFIG_INPUT_TSDEV_SCREEN_Y=320 +CONFIG_INPUT_EVDEV=m +CONFIG_INPUT_EVBUG=m + +# +# Input I/O drivers +# +CONFIG_GAMEPORT=m +CONFIG_SOUND_GAMEPORT=m +CONFIG_GAMEPORT_NS558=m +CONFIG_GAMEPORT_L4=m +CONFIG_GAMEPORT_EMU10K1=m +CONFIG_GAMEPORT_VORTEX=m +CONFIG_GAMEPORT_FM801=m +CONFIG_GAMEPORT_CS461x=m +CONFIG_SERIO=y +CONFIG_SERIO_I8042=y +CONFIG_SERIO_SERPORT=m +CONFIG_SERIO_CT82C710=m +CONFIG_SERIO_PARKBD=m +CONFIG_SERIO_PCIPS2=m + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=y +CONFIG_KEYBOARD_SUNKBD=m +CONFIG_KEYBOARD_LKKBD=m +CONFIG_KEYBOARD_XTKBD=m +CONFIG_KEYBOARD_NEWTON=m +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=m +CONFIG_MOUSE_SERIAL=m +CONFIG_MOUSE_INPORT=m +# CONFIG_MOUSE_ATIXL is not set +CONFIG_MOUSE_LOGIBM=m +CONFIG_MOUSE_PC110PAD=m +CONFIG_MOUSE_VSXXXAA=m +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_ANALOG=m +CONFIG_JOYSTICK_A3D=m +CONFIG_JOYSTICK_ADI=m +CONFIG_JOYSTICK_COBRA=m +CONFIG_JOYSTICK_GF2K=m +CONFIG_JOYSTICK_GRIP=m +CONFIG_JOYSTICK_GRIP_MP=m +CONFIG_JOYSTICK_GUILLEMOT=m +CONFIG_JOYSTICK_INTERACT=m +CONFIG_JOYSTICK_SIDEWINDER=m +CONFIG_JOYSTICK_TMDC=m +CONFIG_JOYSTICK_IFORCE=m +CONFIG_JOYSTICK_IFORCE_USB=y +CONFIG_JOYSTICK_IFORCE_232=y +CONFIG_JOYSTICK_WARRIOR=m +CONFIG_JOYSTICK_MAGELLAN=m +CONFIG_JOYSTICK_SPACEORB=m +CONFIG_JOYSTICK_SPACEBALL=m +CONFIG_JOYSTICK_STINGER=m +CONFIG_JOYSTICK_TWIDDLER=m +CONFIG_JOYSTICK_DB9=m +CONFIG_JOYSTICK_GAMECON=m +CONFIG_JOYSTICK_TURBOGRAFX=m +CONFIG_INPUT_JOYDUMP=m +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_GUNZE=m +CONFIG_INPUT_MISC=y +CONFIG_INPUT_PCSPKR=m +CONFIG_INPUT_UINPUT=m + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +CONFIG_SERIAL_NONSTANDARD=y +# CONFIG_COMPUTONE is not set +CONFIG_ROCKETPORT=m +CONFIG_CYCLADES=m +# CONFIG_CYZ_INTR is not set +# CONFIG_DIGIEPCA is not set +# CONFIG_DIGI is not set +# CONFIG_ESPSERIAL is not set +# CONFIG_MOXA_INTELLIO is not set +# CONFIG_MOXA_SMARTIO is not set +# CONFIG_ISI is not set +CONFIG_SYNCLINK=m +CONFIG_SYNCLINKMP=m +CONFIG_N_HDLC=m +# CONFIG_RISCOM8 is not set +# CONFIG_SPECIALIX is not set +# CONFIG_SX is not set +# CONFIG_RIO is not set +CONFIG_STALDRV=y +# CONFIG_STALLION is not set +# CONFIG_ISTALLION is not set + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_CS=m +# CONFIG_SERIAL_8250_ACPI is not set +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_MANY_PORTS=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +CONFIG_SERIAL_8250_MULTIPORT=y +CONFIG_SERIAL_8250_RSA=y + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=256 +CONFIG_PRINTER=m +# CONFIG_LP_CONSOLE is not set +CONFIG_PPDEV=m +CONFIG_TIPAR=m +CONFIG_QIC02_TAPE=m +CONFIG_QIC02_DYNCONF=y + +# +# Setting runtime QIC-02 configuration is done with qic02conf +# + +# +# from the tpqic02-support package. It is available at +# + +# +# metalab.unc.edu or ftp://titus.cfw.com/pub/Linux/util/ +# + +# +# IPMI +# +CONFIG_IPMI_HANDLER=m +# CONFIG_IPMI_PANIC_EVENT is not set +CONFIG_IPMI_DEVICE_INTERFACE=m +CONFIG_IPMI_SI=m +CONFIG_IPMI_WATCHDOG=m + +# +# Watchdog Cards +# +CONFIG_WATCHDOG=y +# CONFIG_WATCHDOG_NOWAYOUT is not set + +# +# Watchdog Device Drivers +# +CONFIG_SOFT_WATCHDOG=m +CONFIG_ACQUIRE_WDT=m +CONFIG_ADVANTECH_WDT=m +CONFIG_ALIM1535_WDT=m +CONFIG_ALIM7101_WDT=m +CONFIG_SC520_WDT=m +CONFIG_EUROTECH_WDT=m +CONFIG_IB700_WDT=m +CONFIG_WAFER_WDT=m +CONFIG_I8XX_TCO=m +CONFIG_SC1200_WDT=m +CONFIG_SCx200_WDT=m +CONFIG_60XX_WDT=m +CONFIG_CPU5_WDT=m +CONFIG_W83627HF_WDT=m +CONFIG_W83877F_WDT=m +CONFIG_MACHZ_WDT=m + +# +# ISA-based Watchdog Cards +# +CONFIG_PCWATCHDOG=m +CONFIG_MIXCOMWD=m +CONFIG_WDT=m +CONFIG_WDT_501=y + +# +# PCI-based Watchdog Cards +# +CONFIG_PCIPCWATCHDOG=m +CONFIG_WDTPCI=m +CONFIG_WDT_501_PCI=y + +# +# USB-based Watchdog Cards +# +CONFIG_USBPCWATCHDOG=m +CONFIG_HW_RANDOM=m +CONFIG_NVRAM=m +CONFIG_RTC=m +CONFIG_GEN_RTC=m +CONFIG_GEN_RTC_X=y +CONFIG_DTLK=m +CONFIG_R3964=m +CONFIG_APPLICOM=m +CONFIG_SONYPI=m + +# +# Ftape, the floppy tape device driver +# +# CONFIG_FTAPE is not set +CONFIG_AGP=m +CONFIG_AGP_ALI=m +CONFIG_AGP_ATI=m +CONFIG_AGP_AMD=m +CONFIG_AGP_AMD64=m +CONFIG_AGP_INTEL=m +CONFIG_AGP_INTEL_MCH=m +CONFIG_AGP_NVIDIA=m +CONFIG_AGP_SIS=m +CONFIG_AGP_SWORKS=m +CONFIG_AGP_VIA=m +CONFIG_AGP_EFFICEON=m +CONFIG_DRM=y +CONFIG_DRM_TDFX=m +CONFIG_DRM_GAMMA=m +CONFIG_DRM_R128=m +CONFIG_DRM_RADEON=m +CONFIG_DRM_I810=m +CONFIG_DRM_I830=m +CONFIG_DRM_MGA=m +CONFIG_DRM_SIS=m + +# +# PCMCIA character devices +# +CONFIG_SYNCLINK_CS=m +CONFIG_MWAVE=m +CONFIG_SCx200_GPIO=m +CONFIG_RAW_DRIVER=m +CONFIG_HPET=y +# CONFIG_HPET_RTC_IRQ is not set +CONFIG_HPET_MMAP=y +CONFIG_MAX_RAW_DEVS=256 +CONFIG_HANGCHECK_TIMER=m + +# +# I2C support +# +CONFIG_I2C=m +CONFIG_I2C_CHARDEV=m + +# +# I2C Algorithms +# +CONFIG_I2C_ALGOBIT=m +CONFIG_I2C_ALGOPCF=m + +# +# I2C Hardware Bus support +# +CONFIG_I2C_ALI1535=m +CONFIG_I2C_ALI1563=m +CONFIG_I2C_ALI15X3=m +CONFIG_I2C_AMD756=m +CONFIG_I2C_AMD8111=m +# CONFIG_I2C_ELEKTOR is not set +CONFIG_I2C_I801=m +CONFIG_I2C_I810=m +CONFIG_I2C_ISA=m +CONFIG_I2C_NFORCE2=m +CONFIG_I2C_PARPORT=m +CONFIG_I2C_PARPORT_LIGHT=m +CONFIG_I2C_PIIX4=m +CONFIG_I2C_PROSAVAGE=m +CONFIG_I2C_SAVAGE4=m +CONFIG_SCx200_I2C=m +CONFIG_SCx200_I2C_SCL=12 +CONFIG_SCx200_I2C_SDA=13 +CONFIG_SCx200_ACB=m +CONFIG_I2C_SIS5595=m +CONFIG_I2C_SIS630=m +CONFIG_I2C_SIS96X=m +CONFIG_I2C_VIA=m +CONFIG_I2C_VIAPRO=m +CONFIG_I2C_VOODOO3=m + +# +# Hardware Sensors Chip support +# +CONFIG_I2C_SENSOR=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM1025=m +CONFIG_SENSORS_ADM1031=m +CONFIG_SENSORS_ASB100=m +CONFIG_SENSORS_DS1621=m +CONFIG_SENSORS_FSCHER=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_IT87=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM77=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_LM83=m +CONFIG_SENSORS_LM85=m +CONFIG_SENSORS_LM90=m +CONFIG_SENSORS_MAX1619=m +CONFIG_SENSORS_VIA686A=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_W83L785TS=m +CONFIG_SENSORS_W83627HF=m + +# +# Other I2C Chip support +# +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_PCF8574=m +CONFIG_SENSORS_PCF8591=m +CONFIG_SENSORS_RTC8564=m +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set + +# +# Dallas's 1-wire bus +# +CONFIG_W1=m +CONFIG_W1_MATROX=m +CONFIG_W1_THERM=m + +# +# Misc devices +# +CONFIG_IBM_ASM=m + +# +# Multimedia devices +# +CONFIG_VIDEO_DEV=m + +# +# Video For Linux +# + +# +# Video Adapters +# +CONFIG_VIDEO_BT848=m +CONFIG_VIDEO_PMS=m +CONFIG_VIDEO_BWQCAM=m +CONFIG_VIDEO_CQCAM=m +CONFIG_VIDEO_W9966=m +CONFIG_VIDEO_CPIA=m +CONFIG_VIDEO_CPIA_PP=m +CONFIG_VIDEO_CPIA_USB=m +CONFIG_VIDEO_SAA5246A=m +CONFIG_VIDEO_SAA5249=m +CONFIG_TUNER_3036=m +CONFIG_VIDEO_STRADIS=m +# CONFIG_VIDEO_ZORAN is not set +# CONFIG_VIDEO_ZR36120 is not set +CONFIG_VIDEO_MEYE=m +CONFIG_VIDEO_SAA7134=m +CONFIG_VIDEO_MXB=m +CONFIG_VIDEO_DPC=m +CONFIG_VIDEO_HEXIUM_ORION=m +CONFIG_VIDEO_HEXIUM_GEMINI=m +CONFIG_VIDEO_CX88=m +CONFIG_VIDEO_OVCAMCHIP=m + +# +# Radio Adapters +# +CONFIG_RADIO_CADET=m +CONFIG_RADIO_RTRACK=m +CONFIG_RADIO_RTRACK2=m +CONFIG_RADIO_AZTECH=m +CONFIG_RADIO_GEMTEK=m +CONFIG_RADIO_GEMTEK_PCI=m +CONFIG_RADIO_MAXIRADIO=m +CONFIG_RADIO_MAESTRO=m +CONFIG_RADIO_MIROPCM20=m +CONFIG_RADIO_MIROPCM20_RDS=m +CONFIG_RADIO_SF16FMI=m +CONFIG_RADIO_SF16FMR2=m +CONFIG_RADIO_TERRATEC=m +CONFIG_RADIO_TRUST=m +CONFIG_RADIO_TYPHOON=m +CONFIG_RADIO_TYPHOON_PROC_FS=y +CONFIG_RADIO_ZOLTRIX=m + +# +# Digital Video Broadcasting Devices +# +CONFIG_DVB=y +CONFIG_DVB_CORE=m + +# +# Supported Frontend Modules +# +CONFIG_DVB_TWINHAN_DST=m +CONFIG_DVB_STV0299=m +CONFIG_DVB_SP887X=m +CONFIG_DVB_SP887X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/sc_main.mc" +CONFIG_DVB_ALPS_TDLB7=m +CONFIG_DVB_ALPS_TDMB7=m +CONFIG_DVB_ATMEL_AT76C651=m +CONFIG_DVB_CX24110=m +CONFIG_DVB_GRUNDIG_29504_491=m +CONFIG_DVB_GRUNDIG_29504_401=m +CONFIG_DVB_MT312=m +CONFIG_DVB_VES1820=m +CONFIG_DVB_VES1X93=m +CONFIG_DVB_TDA1004X=m +CONFIG_DVB_TDA1004X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/tda1004x.bin" +CONFIG_DVB_NXT6000=m + +# +# Supported SAA7146 based PCI Adapters +# +CONFIG_DVB_AV7110=m +# CONFIG_DVB_AV7110_OSD is not set +CONFIG_DVB_BUDGET=m +CONFIG_DVB_BUDGET_CI=m +CONFIG_DVB_BUDGET_AV=m +CONFIG_DVB_BUDGET_PATCH=m + +# +# Supported USB Adapters +# +CONFIG_DVB_TTUSB_BUDGET=m +CONFIG_DVB_TTUSB_DEC=m + +# +# Supported FlexCopII (B2C2) Adapters +# +CONFIG_DVB_B2C2_SKYSTAR=m + +# +# Supported BT878 Adapters +# +CONFIG_DVB_BT8XX=m +CONFIG_VIDEO_SAA7146=m +CONFIG_VIDEO_SAA7146_VV=m +CONFIG_VIDEO_VIDEOBUF=m +CONFIG_VIDEO_TUNER=m +CONFIG_VIDEO_BUF=m +CONFIG_VIDEO_BTCX=m +CONFIG_VIDEO_IR=m + +# +# Graphics support +# +CONFIG_FB=y +CONFIG_FB_CIRRUS=m +CONFIG_FB_PM2=m +CONFIG_FB_PM2_FIFO_DISCONNECT=y +CONFIG_FB_CYBER2000=m +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +CONFIG_FB_VGA16=m +CONFIG_FB_VESA=m +CONFIG_VIDEO_SELECT=y +CONFIG_FB_HGA=m +# CONFIG_FB_HGA_ACCEL is not set +CONFIG_FB_RIVA=m +CONFIG_FB_RIVA_I2C=y +CONFIG_FB_RIVA_DEBUG=y +CONFIG_FB_I810=m +# CONFIG_FB_I810_GTF is not set +CONFIG_FB_MATROX=m +CONFIG_FB_MATROX_MILLENIUM=y +CONFIG_FB_MATROX_MYSTIQUE=y +CONFIG_FB_MATROX_G450=y +CONFIG_FB_MATROX_G100=y +CONFIG_FB_MATROX_I2C=m +CONFIG_FB_MATROX_MAVEN=m +CONFIG_FB_MATROX_MULTIHEAD=y +CONFIG_FB_RADEON_OLD=m +CONFIG_FB_RADEON=m +CONFIG_FB_RADEON_I2C=y +# CONFIG_FB_RADEON_DEBUG is not set +CONFIG_FB_ATY128=m +CONFIG_FB_ATY=m +CONFIG_FB_ATY_CT=y +CONFIG_FB_ATY_GX=y +CONFIG_FB_ATY_XL_INIT=y +CONFIG_FB_SIS=m +CONFIG_FB_SIS_300=y +CONFIG_FB_SIS_315=y +CONFIG_FB_NEOMAGIC=m +CONFIG_FB_KYRO=m +CONFIG_FB_3DFX=m +# CONFIG_FB_3DFX_ACCEL is not set +CONFIG_FB_VOODOO1=m +CONFIG_FB_TRIDENT=m +# CONFIG_FB_TRIDENT_ACCEL is not set +# CONFIG_FB_PM3 is not set +CONFIG_FB_VIRTUAL=m + +# +# Console display driver support +# +CONFIG_VGA_CONSOLE=y +CONFIG_MDA_CONSOLE=m +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=m +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y + +# +# Logo configuration +# +# CONFIG_LOGO is not set + +# +# Sound +# +CONFIG_SOUND=m + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +CONFIG_SND_HWDEP=m +CONFIG_SND_RAWMIDI=m +CONFIG_SND_SEQUENCER=m +CONFIG_SND_SEQ_DUMMY=m +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=m +CONFIG_SND_PCM_OSS=m +CONFIG_SND_SEQUENCER_OSS=y +CONFIG_SND_RTCTIMER=m +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set + +# +# Generic devices +# +CONFIG_SND_MPU401_UART=m +CONFIG_SND_OPL3_LIB=m +CONFIG_SND_OPL4_LIB=m +CONFIG_SND_VX_LIB=m +CONFIG_SND_DUMMY=m +CONFIG_SND_VIRMIDI=m +CONFIG_SND_MTPAV=m +CONFIG_SND_SERIAL_U16550=m +CONFIG_SND_MPU401=m + +# +# ISA devices +# +CONFIG_SND_AD1816A=m +CONFIG_SND_AD1848=m +CONFIG_SND_CS4231=m +CONFIG_SND_CS4232=m +CONFIG_SND_CS4236=m +CONFIG_SND_ES968=m +CONFIG_SND_ES1688=m +CONFIG_SND_ES18XX=m +CONFIG_SND_GUSCLASSIC=m +CONFIG_SND_GUSEXTREME=m +CONFIG_SND_GUSMAX=m +CONFIG_SND_INTERWAVE=m +CONFIG_SND_INTERWAVE_STB=m +CONFIG_SND_OPTI92X_AD1848=m +CONFIG_SND_OPTI92X_CS4231=m +CONFIG_SND_OPTI93X=m +CONFIG_SND_SB8=m +CONFIG_SND_SB16=m +CONFIG_SND_SBAWE=m +CONFIG_SND_SB16_CSP=y +CONFIG_SND_WAVEFRONT=m +CONFIG_SND_ALS100=m +CONFIG_SND_AZT2320=m +CONFIG_SND_CMI8330=m +CONFIG_SND_DT019X=m +CONFIG_SND_OPL3SA2=m +CONFIG_SND_SGALAXY=m +CONFIG_SND_SSCAPE=m + +# +# PCI devices +# +CONFIG_SND_AC97_CODEC=m +CONFIG_SND_ALI5451=m +CONFIG_SND_ATIIXP=m +CONFIG_SND_AU8810=m +CONFIG_SND_AU8820=m +CONFIG_SND_AU8830=m +CONFIG_SND_AZT3328=m +CONFIG_SND_BT87X=m +CONFIG_SND_CS46XX=m +CONFIG_SND_CS46XX_NEW_DSP=y +CONFIG_SND_CS4281=m +CONFIG_SND_EMU10K1=m +CONFIG_SND_KORG1212=m +CONFIG_SND_MIXART=m +CONFIG_SND_NM256=m +CONFIG_SND_RME32=m +CONFIG_SND_RME96=m +CONFIG_SND_RME9652=m +CONFIG_SND_HDSP=m +CONFIG_SND_TRIDENT=m +CONFIG_SND_YMFPCI=m +CONFIG_SND_ALS4000=m +CONFIG_SND_CMIPCI=m +CONFIG_SND_ENS1370=m +CONFIG_SND_ENS1371=m +CONFIG_SND_ES1938=m +CONFIG_SND_ES1968=m +CONFIG_SND_MAESTRO3=m +CONFIG_SND_FM801=m +CONFIG_SND_FM801_TEA575X=m +CONFIG_SND_ICE1712=m +CONFIG_SND_ICE1724=m +CONFIG_SND_INTEL8X0=m +CONFIG_SND_INTEL8X0M=m +CONFIG_SND_SONICVIBES=m +CONFIG_SND_VIA82XX=m +CONFIG_SND_VX222=m + +# +# ALSA USB devices +# +CONFIG_SND_USB_AUDIO=m + +# +# PCMCIA devices +# +CONFIG_SND_VXPOCKET=m +CONFIG_SND_VXP440=m +CONFIG_SND_PDAUDIOCF=m + +# +# Open Sound System +# +CONFIG_SOUND_PRIME=m +CONFIG_SOUND_BT878=m +CONFIG_SOUND_CMPCI=m +# CONFIG_SOUND_CMPCI_FM is not set +# CONFIG_SOUND_CMPCI_MIDI is not set +CONFIG_SOUND_CMPCI_JOYSTICK=y +CONFIG_SOUND_EMU10K1=m +CONFIG_MIDI_EMU10K1=y +CONFIG_SOUND_FUSION=m +CONFIG_SOUND_CS4281=m +CONFIG_SOUND_ES1370=m +CONFIG_SOUND_ES1371=m +CONFIG_SOUND_ESSSOLO1=m +CONFIG_SOUND_MAESTRO=m +CONFIG_SOUND_MAESTRO3=m +CONFIG_SOUND_ICH=m +CONFIG_SOUND_SONICVIBES=m +CONFIG_SOUND_TRIDENT=m +# CONFIG_SOUND_MSNDCLAS is not set +# CONFIG_SOUND_MSNDPIN is not set +CONFIG_SOUND_VIA82CXXX=m +CONFIG_MIDI_VIA82CXXX=y +CONFIG_SOUND_OSS=m +# CONFIG_SOUND_TRACEINIT is not set +# CONFIG_SOUND_DMAP is not set +# CONFIG_SOUND_AD1816 is not set +CONFIG_SOUND_AD1889=m +CONFIG_SOUND_SGALAXY=m +CONFIG_SOUND_ADLIB=m +CONFIG_SOUND_ACI_MIXER=m +CONFIG_SOUND_CS4232=m +CONFIG_SOUND_SSCAPE=m +CONFIG_SOUND_GUS=m +CONFIG_SOUND_GUS16=y +CONFIG_SOUND_GUSMAX=y +CONFIG_SOUND_VMIDI=m +CONFIG_SOUND_TRIX=m +CONFIG_SOUND_MSS=m +CONFIG_SOUND_MPU401=m +CONFIG_SOUND_NM256=m +CONFIG_SOUND_MAD16=m +CONFIG_MAD16_OLDCARD=y +CONFIG_SOUND_PAS=m +CONFIG_SOUND_PSS=m +CONFIG_PSS_MIXER=y +CONFIG_SOUND_SB=m +# CONFIG_SOUND_AWE32_SYNTH is not set +CONFIG_SOUND_WAVEFRONT=m +CONFIG_SOUND_MAUI=m +CONFIG_SOUND_YM3812=m +CONFIG_SOUND_OPL3SA1=m +CONFIG_SOUND_OPL3SA2=m +CONFIG_SOUND_YMFPCI=m +# CONFIG_SOUND_YMFPCI_LEGACY is not set +CONFIG_SOUND_UART6850=m +CONFIG_SOUND_AEDSP16=m +CONFIG_SC6600=y +CONFIG_SC6600_JOY=y +CONFIG_SC6600_CDROM=4 +CONFIG_SC6600_CDROMBASE=0x0 +# CONFIG_AEDSP16_MSS is not set +# CONFIG_AEDSP16_SBPRO is not set +# CONFIG_AEDSP16_MPU401 is not set +CONFIG_SOUND_TVMIXER=m +CONFIG_SOUND_KAHLUA=m +CONFIG_SOUND_ALI5455=m +CONFIG_SOUND_FORTE=m +CONFIG_SOUND_RME96XX=m +CONFIG_SOUND_AD1980=m + +# +# USB support +# +CONFIG_USB=m +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +CONFIG_USB_BANDWIDTH=y +# CONFIG_USB_DYNAMIC_MINORS is not set + +# +# USB Host Controller Drivers +# +CONFIG_USB_EHCI_HCD=m +CONFIG_USB_EHCI_SPLIT_ISO=y +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_OHCI_HCD=m +CONFIG_USB_UHCI_HCD=m + +# +# USB Device Class drivers +# +CONFIG_USB_AUDIO=m + +# +# USB Bluetooth TTY can only be used with disabled Bluetooth subsystem +# +CONFIG_USB_MIDI=m +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +CONFIG_USB_STORAGE_RW_DETECT=y +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_DPCM=y +CONFIG_USB_STORAGE_HP8200e=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y + +# +# USB Human Interface Devices (HID) +# +CONFIG_USB_HID=m +CONFIG_USB_HIDINPUT=y +# CONFIG_HID_FF is not set +CONFIG_USB_HIDDEV=y + +# +# USB HID Boot Protocol drivers +# +CONFIG_USB_KBD=m +CONFIG_USB_MOUSE=m +CONFIG_USB_AIPTEK=m +CONFIG_USB_WACOM=m +CONFIG_USB_KBTAB=m +CONFIG_USB_POWERMATE=m +CONFIG_USB_MTOUCH=m +CONFIG_USB_EGALAX=m +CONFIG_USB_XPAD=m +CONFIG_USB_ATI_REMOTE=m + +# +# USB Imaging devices +# +CONFIG_USB_MDC800=m +CONFIG_USB_MICROTEK=m +CONFIG_USB_HPUSBSCSI=m + +# +# USB Multimedia devices +# +CONFIG_USB_VICAM=m +CONFIG_USB_DSBR=m +CONFIG_USB_IBMCAM=m +CONFIG_USB_KONICAWC=m +CONFIG_USB_OV511=m +CONFIG_USB_PWC=m +CONFIG_USB_SE401=m +CONFIG_USB_SN9C102=m +CONFIG_USB_STV680=m +# CONFIG_USB_W9968CF is not set + +# +# USB Network adaptors +# +CONFIG_USB_CATC=m +CONFIG_USB_KAWETH=m +CONFIG_USB_PEGASUS=m +CONFIG_USB_RTL8150=m +CONFIG_USB_USBNET=m + +# +# USB Host-to-Host Cables +# +CONFIG_USB_ALI_M5632=y +CONFIG_USB_AN2720=y +CONFIG_USB_BELKIN=y +CONFIG_USB_GENESYS=y +CONFIG_USB_NET1080=y +CONFIG_USB_PL2301=y + +# +# Intelligent USB Devices/Gadgets +# +CONFIG_USB_ARMLINUX=y +CONFIG_USB_EPSON2888=y +CONFIG_USB_ZAURUS=y +CONFIG_USB_CDCETHER=y + +# +# USB Network Adapters +# +CONFIG_USB_AX8817X=y + +# +# USB port drivers +# +CONFIG_USB_USS720=m + +# +# USB Serial Converter support +# +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_BELKIN=m +# CONFIG_USB_SERIAL_WHITEHEAT is not set +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m +CONFIG_USB_SERIAL_EMPEG=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_VISOR=m +CONFIG_USB_SERIAL_IPAQ=m +CONFIG_USB_SERIAL_IR=m +CONFIG_USB_SERIAL_EDGEPORT=m +CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_KEYSPAN_PDA=m +CONFIG_USB_SERIAL_KEYSPAN=m +CONFIG_USB_SERIAL_KLSI=m +CONFIG_USB_SERIAL_KOBIL_SCT=m +CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_SAFE=m +# CONFIG_USB_SERIAL_SAFE_PADDED is not set +CONFIG_USB_SERIAL_CYBERJACK=m +CONFIG_USB_SERIAL_XIRCOM=m +CONFIG_USB_SERIAL_OMNINET=m +CONFIG_USB_EZUSB=y + +# +# USB Miscellaneous drivers +# +CONFIG_USB_TIGL=m +CONFIG_USB_AUERSWALD=m +CONFIG_USB_RIO500=m +CONFIG_USB_LEGOTOWER=m +CONFIG_USB_LCD=m +CONFIG_USB_LED=m +CONFIG_USB_CYTHERM=m +CONFIG_USB_SPEEDTOUCH=m +CONFIG_USB_PHIDGETSERVO=m +CONFIG_USB_TEST=m +CONFIG_USB_EAGLE=m + +# +# USB Gadget Support +# +CONFIG_USB_GADGET=m +CONFIG_USB_GADGET_NET2280=y +CONFIG_USB_NET2280=m +# CONFIG_USB_GADGET_PXA2XX is not set +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_SA1100 is not set +# CONFIG_USB_GADGET_DUMMY_HCD is not set +CONFIG_USB_GADGET_DUALSPEED=y +CONFIG_USB_ZERO=m +CONFIG_USB_ETH=m +CONFIG_USB_ETH_RNDIS=y +CONFIG_USB_GADGETFS=m +CONFIG_USB_FILE_STORAGE=m +# CONFIG_USB_FILE_STORAGE_TEST is not set +CONFIG_USB_G_SERIAL=m + +# +# File systems +# +CONFIG_EXT2_FS=m +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_POSIX_ACL=y +CONFIG_EXT2_FS_SECURITY=y +CONFIG_EXT3_FS=m +CONFIG_EXT3_FS_XATTR=y +CONFIG_EXT3_FS_POSIX_ACL=y +CONFIG_EXT3_FS_SECURITY=y +CONFIG_JBD=m +# CONFIG_JBD_DEBUG is not set +CONFIG_FS_MBCACHE=m +CONFIG_REISERFS_FS=m +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +# CONFIG_REISERFS_FS_XATTR is not set +CONFIG_JFS_FS=m +CONFIG_JFS_POSIX_ACL=y +# CONFIG_JFS_DEBUG is not set +CONFIG_JFS_STATISTICS=y +CONFIG_FS_POSIX_ACL=y +CONFIG_XFS_FS=m +CONFIG_XFS_RT=y +CONFIG_XFS_QUOTA=y +CONFIG_XFS_SECURITY=y +CONFIG_XFS_POSIX_ACL=y +CONFIG_MINIX_FS=m +CONFIG_ROMFS_FS=m +CONFIG_QUOTA=y +CONFIG_QFMT_V1=m +CONFIG_QFMT_V2=m +CONFIG_QUOTACTL=y +CONFIG_AUTOFS_FS=m +CONFIG_AUTOFS4_FS=m + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=m +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_ZISOFS_FS=m +CONFIG_UDF_FS=m +CONFIG_UDF_NLS=y + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +CONFIG_NTFS_FS=m +# CONFIG_NTFS_DEBUG is not set +# CONFIG_NTFS_RW is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_SYSFS=y +CONFIG_DEVFS_FS=y +# CONFIG_DEVFS_MOUNT is not set +# CONFIG_DEVFS_DEBUG is not set +CONFIG_DEVPTS_FS_XATTR=y +CONFIG_DEVPTS_FS_SECURITY=y +CONFIG_TMPFS=y +# CONFIG_HUGETLBFS is not set +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y + +# +# Miscellaneous filesystems +# +CONFIG_ADFS_FS=m +# CONFIG_ADFS_FS_RW is not set +CONFIG_AFFS_FS=m +CONFIG_ASFS_FS=m +# CONFIG_ASFS_RW is not set +CONFIG_HFS_FS=m +CONFIG_HFSPLUS_FS=m +CONFIG_BEFS_FS=m +# CONFIG_BEFS_DEBUG is not set +CONFIG_BFS_FS=m +CONFIG_EFS_FS=m +CONFIG_JFFS_FS=m +CONFIG_JFFS_FS_VERBOSE=0 +CONFIG_JFFS_PROC_FS=y +CONFIG_JFFS2_FS=m +CONFIG_JFFS2_FS_DEBUG=0 +# CONFIG_JFFS2_FS_NAND is not set +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set +CONFIG_JFFS2_ZLIB=y +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +CONFIG_CRAMFS=y +CONFIG_VXFS_FS=m +CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +# CONFIG_QNX4FS_RW is not set +CONFIG_SYSV_FS=m +CONFIG_UFS_FS=m +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=m +CONFIG_NFS_V3=y +CONFIG_NFS_V4=y +CONFIG_NFS_DIRECTIO=y +CONFIG_NFSD=m +CONFIG_NFSD_V3=y +CONFIG_NFSD_V4=y +CONFIG_NFSD_TCP=y +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=m +CONFIG_SUNRPC=m +CONFIG_SUNRPC_GSS=m +CONFIG_RPCSEC_GSS_KRB5=m +CONFIG_SMB_FS=m +# CONFIG_SMB_NLS_DEFAULT is not set +CONFIG_CIFS=m +# CONFIG_CIFS_STATS is not set +# CONFIG_CIFS_XATTR is not set +# CONFIG_CIFS_POSIX is not set +CONFIG_NCP_FS=m +CONFIG_NCPFS_PACKET_SIGNING=y +CONFIG_NCPFS_IOCTL_LOCKING=y +CONFIG_NCPFS_STRONG=y +CONFIG_NCPFS_NFS_NS=y +CONFIG_NCPFS_OS2_NS=y +# CONFIG_NCPFS_SMALLDOS is not set +CONFIG_NCPFS_NLS=y +CONFIG_NCPFS_EXTRAS=y +CONFIG_CODA_FS=m +# CONFIG_CODA_FS_OLD_API is not set +CONFIG_AFS_FS=m +CONFIG_RXRPC=m + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +CONFIG_ACORN_PARTITION=y +CONFIG_ACORN_PARTITION_CUMANA=y +# CONFIG_ACORN_PARTITION_EESOX is not set +CONFIG_ACORN_PARTITION_ICS=y +# CONFIG_ACORN_PARTITION_ADFS is not set +# CONFIG_ACORN_PARTITION_POWERTEC is not set +CONFIG_ACORN_PARTITION_RISCIX=y +CONFIG_OSF_PARTITION=y +CONFIG_AMIGA_PARTITION=y +CONFIG_ATARI_PARTITION=y +CONFIG_MAC_PARTITION=y +CONFIG_MSDOS_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_LDM_PARTITION=y +# CONFIG_LDM_DEBUG is not set +CONFIG_SGI_PARTITION=y +CONFIG_ULTRIX_PARTITION=y +CONFIG_SUN_PARTITION=y +# CONFIG_EFI_PARTITION is not set + +# +# Native Language Support +# +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="cp437" +CONFIG_NLS_CODEPAGE_437=m +CONFIG_NLS_CODEPAGE_737=m +CONFIG_NLS_CODEPAGE_775=m +CONFIG_NLS_CODEPAGE_850=m +CONFIG_NLS_CODEPAGE_852=m +CONFIG_NLS_CODEPAGE_855=m +CONFIG_NLS_CODEPAGE_857=m +CONFIG_NLS_CODEPAGE_860=m +CONFIG_NLS_CODEPAGE_861=m +CONFIG_NLS_CODEPAGE_862=m +CONFIG_NLS_CODEPAGE_863=m +CONFIG_NLS_CODEPAGE_864=m +CONFIG_NLS_CODEPAGE_865=m +CONFIG_NLS_CODEPAGE_866=m +CONFIG_NLS_CODEPAGE_869=m +CONFIG_NLS_CODEPAGE_936=m +CONFIG_NLS_CODEPAGE_950=m +CONFIG_NLS_CODEPAGE_932=m +CONFIG_NLS_CODEPAGE_949=m +CONFIG_NLS_CODEPAGE_874=m +CONFIG_NLS_ISO8859_8=m +CONFIG_NLS_CODEPAGE_1250=m +CONFIG_NLS_CODEPAGE_1251=m +CONFIG_NLS_ASCII=m +CONFIG_NLS_ISO8859_1=m +CONFIG_NLS_ISO8859_2=m +CONFIG_NLS_ISO8859_3=m +CONFIG_NLS_ISO8859_4=m +CONFIG_NLS_ISO8859_5=m +CONFIG_NLS_ISO8859_6=m +CONFIG_NLS_ISO8859_7=m +CONFIG_NLS_ISO8859_9=m +CONFIG_NLS_ISO8859_13=m +CONFIG_NLS_ISO8859_14=m +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_KOI8_R=m +CONFIG_NLS_KOI8_U=m +CONFIG_NLS_UTF8=m + +# +# Profiling support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=m + +# +# Kernel hacking +# +CONFIG_DEBUG_KERNEL=y +# CONFIG_EARLY_PRINTK is not set +# CONFIG_DEBUG_STACKOVERFLOW is not set +# CONFIG_DEBUG_STACK_USAGE is not set +# CONFIG_DEBUG_SLAB is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_DEBUG_HIGHMEM is not set +# CONFIG_DEBUG_INFO is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_FRAME_POINTER is not set +# CONFIG_4KSTACKS is not set +CONFIG_X86_FIND_SMP_CONFIG=y +CONFIG_X86_MPPARSE=y + +# +# Security options +# +CONFIG_SECURITY=y +# CONFIG_SECURITY_NETWORK is not set +CONFIG_SECURITY_CAPABILITIES=m +CONFIG_SECURITY_ROOTPLUG=m +# CONFIG_SECURITY_SELINUX is not set + +# +# Cryptographic options +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_SHA1=m +CONFIG_CRYPTO_SHA256=m +CONFIG_CRYPTO_SHA512=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_AES_586=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_KHAZAD=m +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_MICHAEL_MIC=m +CONFIG_CRYPTO_CRC32C=m +CONFIG_CRYPTO_TEST=m + +# +# Library routines +# +CONFIG_CRC_CCITT=m +CONFIG_CRC32=m +CONFIG_LIBCRC32C=m +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=m +CONFIG_X86_SMP=y +CONFIG_X86_HT=y +CONFIG_X86_HT_DISABLE=y +CONFIG_X86_BIOS_REBOOT=y +CONFIG_X86_TRAMPOLINE=y --- linux-source-2.6.8.1-2.6.8.1.orig/debian/config/i386/k7 +++ linux-source-2.6.8.1-2.6.8.1/debian/config/i386/k7 @@ -0,0 +1,2847 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_X86=y +CONFIG_MMU=y +CONFIG_UID16=y +CONFIG_GENERIC_ISA_DMA=y + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +# CONFIG_CLEAN_COMPILE is not set +CONFIG_BROKEN=y +CONFIG_BROKEN_ON_SMP=y + +# +# General setup +# +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_BSD_PROCESS_ACCT=y +# CONFIG_BSD_PROCESS_ACCT_V3 is not set +CONFIG_SYSCTL=y +# CONFIG_AUDIT is not set +CONFIG_LOG_BUF_SHIFT=14 +CONFIG_HOTPLUG=y +# CONFIG_IKCONFIG is not set +CONFIG_EMBEDDED=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_OBSOLETE_MODPARM=y +CONFIG_MODVERSIONS=y +CONFIG_KMOD=y + +# +# Processor type and features +# +CONFIG_X86_PC=y +# CONFIG_X86_ELAN is not set +# CONFIG_X86_VOYAGER is not set +# CONFIG_X86_NUMAQ is not set +# CONFIG_X86_SUMMIT is not set +# CONFIG_X86_BIGSMP is not set +# CONFIG_X86_VISWS is not set +# CONFIG_X86_GENERICARCH is not set +# CONFIG_X86_ES7000 is not set +# CONFIG_M386 is not set +# CONFIG_M486 is not set +# CONFIG_M586 is not set +# CONFIG_M586TSC is not set +# CONFIG_M586MMX is not set +# CONFIG_M686 is not set +# CONFIG_MPENTIUMII is not set +# CONFIG_MPENTIUMIII is not set +# CONFIG_MPENTIUMM is not set +# CONFIG_MPENTIUM4 is not set +# CONFIG_MK6 is not set +CONFIG_MK7=y +# CONFIG_MK8 is not set +# CONFIG_MCRUSOE is not set +# CONFIG_MWINCHIPC6 is not set +# CONFIG_MWINCHIP2 is not set +# CONFIG_MWINCHIP3D is not set +# CONFIG_MCYRIXIII is not set +# CONFIG_MVIAC3_2 is not set +# CONFIG_X86_GENERIC is not set +CONFIG_X86_CMPXCHG=y +CONFIG_X86_XADD=y +CONFIG_X86_L1_CACHE_SHIFT=6 +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_X86_WP_WORKS_OK=y +CONFIG_X86_INVLPG=y +CONFIG_X86_BSWAP=y +CONFIG_X86_POPAD_OK=y +CONFIG_X86_GOOD_APIC=y +CONFIG_X86_INTEL_USERCOPY=y +CONFIG_X86_USE_PPRO_CHECKSUM=y +CONFIG_X86_USE_3DNOW=y +CONFIG_HPET_TIMER=y +# CONFIG_SMP is not set +CONFIG_PREEMPT=y +CONFIG_X86_UP_APIC=y +CONFIG_X86_UP_IOAPIC=y +CONFIG_X86_LOCAL_APIC=y +CONFIG_X86_IO_APIC=y +CONFIG_X86_TSC=y +CONFIG_X86_MCE=y +CONFIG_X86_MCE_NONFATAL=m +CONFIG_X86_MCE_P4THERMAL=y +CONFIG_TOSHIBA=m +CONFIG_I8K=m +CONFIG_MICROCODE=m +CONFIG_X86_MSR=m +CONFIG_X86_CPUID=m + +# +# Firmware Drivers +# +CONFIG_EDD=m +# CONFIG_NOHIGHMEM is not set +CONFIG_HIGHMEM4G=y +# CONFIG_HIGHMEM64G is not set +CONFIG_HIGHMEM=y +# CONFIG_HIGHPTE is not set +# CONFIG_MATH_EMULATION is not set +CONFIG_MTRR=y +# CONFIG_EFI is not set +CONFIG_HAVE_DEC_LOCK=y +# CONFIG_REGPARM is not set + +# +# Power management options (ACPI, APM) +# +CONFIG_PM=y +# CONFIG_SOFTWARE_SUSPEND is not set +# CONFIG_PM_DISK is not set + +# +# ACPI (Advanced Configuration and Power Interface) Support +# +CONFIG_ACPI=y +CONFIG_ACPI_BOOT=y +CONFIG_ACPI_INTERPRETER=y +CONFIG_ACPI_SLEEP=y +CONFIG_ACPI_SLEEP_PROC_FS=y +CONFIG_ACPI_AC=m +CONFIG_ACPI_BATTERY=m +CONFIG_ACPI_BUTTON=m +CONFIG_ACPI_FAN=m +CONFIG_ACPI_PROCESSOR=m +CONFIG_ACPI_THERMAL=m +CONFIG_ACPI_ASUS=m +CONFIG_ACPI_TOSHIBA=m +# CONFIG_ACPI_DEBUG is not set +CONFIG_ACPI_BUS=y +CONFIG_ACPI_EC=y +CONFIG_ACPI_POWER=y +CONFIG_ACPI_PCI=y +CONFIG_ACPI_SYSTEM=y +CONFIG_X86_PM_TIMER=y + +# +# APM (Advanced Power Management) BIOS Support +# +CONFIG_APM=m +# CONFIG_APM_IGNORE_USER_SUSPEND is not set +# CONFIG_APM_DO_ENABLE is not set +# CONFIG_APM_CPU_IDLE is not set +# CONFIG_APM_DISPLAY_BLANK is not set +# CONFIG_APM_RTC_IS_GMT is not set +# CONFIG_APM_ALLOW_INTS is not set +# CONFIG_APM_REAL_MODE_POWER_OFF is not set + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_PROC_INTF=m +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=m +CONFIG_CPU_FREQ_GOV_USERSPACE=m +# CONFIG_CPU_FREQ_24_API is not set +CONFIG_CPU_FREQ_TABLE=m + +# +# CPUFreq processor drivers +# +CONFIG_X86_ACPI_CPUFREQ=m +# CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set +CONFIG_X86_POWERNOW_K6=m +CONFIG_X86_POWERNOW_K7=m +CONFIG_X86_POWERNOW_K8=m +CONFIG_X86_GX_SUSPMOD=m +CONFIG_X86_SPEEDSTEP_CENTRINO=m +CONFIG_X86_SPEEDSTEP_CENTRINO_TABLE=y +CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI=y +CONFIG_X86_SPEEDSTEP_ICH=m +CONFIG_X86_SPEEDSTEP_SMI=m +CONFIG_X86_P4_CLOCKMOD=m +CONFIG_X86_SPEEDSTEP_LIB=m +CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK=y +CONFIG_X86_LONGRUN=m +CONFIG_X86_LONGHAUL=m + +# +# Bus options (PCI, PCMCIA, EISA, MCA, ISA) +# +CONFIG_PCI=y +# CONFIG_PCI_GOBIOS is not set +# CONFIG_PCI_GOMMCONFIG is not set +# CONFIG_PCI_GODIRECT is not set +CONFIG_PCI_GOANY=y +CONFIG_PCI_BIOS=y +CONFIG_PCI_DIRECT=y +CONFIG_PCI_MMCONFIG=y +CONFIG_PCI_MSI=y +# CONFIG_PCI_LEGACY_PROC is not set +CONFIG_PCI_NAMES=y +CONFIG_ISA=y +# CONFIG_EISA is not set +# CONFIG_MCA is not set +CONFIG_SCx200=m + +# +# PCMCIA/CardBus support +# +CONFIG_PCMCIA=m +# CONFIG_PCMCIA_DEBUG is not set +CONFIG_YENTA=m +CONFIG_CARDBUS=y +CONFIG_PD6729=m +CONFIG_I82092=m +CONFIG_I82365=m +CONFIG_TCIC=m +CONFIG_PCMCIA_PROBE=y + +# +# PCI Hotplug Support +# +CONFIG_HOTPLUG_PCI=m +CONFIG_HOTPLUG_PCI_FAKE=m +CONFIG_HOTPLUG_PCI_COMPAQ=m +CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM=y +CONFIG_HOTPLUG_PCI_IBM=m +CONFIG_HOTPLUG_PCI_ACPI=m +CONFIG_HOTPLUG_PCI_CPCI=y +CONFIG_HOTPLUG_PCI_CPCI_ZT5550=m +CONFIG_HOTPLUG_PCI_CPCI_GENERIC=m +CONFIG_HOTPLUG_PCI_PCIE=m +# CONFIG_HOTPLUG_PCI_PCIE_POLL_EVENT_MODE is not set +CONFIG_HOTPLUG_PCI_SHPC=m +# CONFIG_HOTPLUG_PCI_SHPC_POLL_EVENT_MODE is not set + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_AOUT=m +CONFIG_BINFMT_MISC=m + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=m +# CONFIG_DEBUG_DRIVER is not set + +# +# Memory Technology Devices (MTD) +# +CONFIG_MTD=m +# CONFIG_MTD_DEBUG is not set +CONFIG_MTD_PARTITIONS=y +CONFIG_MTD_CONCAT=m +CONFIG_MTD_REDBOOT_PARTS=m +# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set +# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set +# CONFIG_MTD_CMDLINE_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=m +CONFIG_MTD_BLOCK=m +CONFIG_MTD_BLOCK_RO=m +CONFIG_FTL=m +CONFIG_NFTL=m +CONFIG_NFTL_RW=y +CONFIG_INFTL=m + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=m +CONFIG_MTD_JEDECPROBE=m +CONFIG_MTD_GEN_PROBE=m +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +CONFIG_MTD_CFI_INTELEXT=m +CONFIG_MTD_CFI_AMDSTD=m +CONFIG_MTD_CFI_AMDSTD_RETRY=0 +CONFIG_MTD_CFI_STAA=m +CONFIG_MTD_CFI_UTIL=m +CONFIG_MTD_RAM=m +CONFIG_MTD_ROM=m +CONFIG_MTD_ABSENT=m +# CONFIG_MTD_OBSOLETE_CHIPS is not set + +# +# Mapping drivers for chip access +# +CONFIG_MTD_COMPLEX_MAPPINGS=y +CONFIG_MTD_PHYSMAP=m +CONFIG_MTD_PHYSMAP_START=0x8000000 +CONFIG_MTD_PHYSMAP_LEN=0x4000000 +CONFIG_MTD_PHYSMAP_BANKWIDTH=2 +CONFIG_MTD_PNC2000=m +CONFIG_MTD_SC520CDP=m +CONFIG_MTD_NETSC520=m +CONFIG_MTD_SBC_GXX=m +CONFIG_MTD_ELAN_104NC=m +CONFIG_MTD_SCx200_DOCFLASH=m +# CONFIG_MTD_AMD76XROM is not set +# CONFIG_MTD_ICHXROM is not set +# CONFIG_MTD_SCB2_FLASH is not set +CONFIG_MTD_NETtel=m +CONFIG_MTD_DILNETPC=m +CONFIG_MTD_DILNETPC_BOOTSIZE=0x80000 +# CONFIG_MTD_L440GX is not set +CONFIG_MTD_PCI=m +# CONFIG_MTD_PCMCIA is not set + +# +# Self-contained MTD device drivers +# +CONFIG_MTD_PMC551=m +# CONFIG_MTD_PMC551_BUGFIX is not set +# CONFIG_MTD_PMC551_DEBUG is not set +CONFIG_MTD_SLRAM=m +CONFIG_MTD_PHRAM=m +CONFIG_MTD_MTDRAM=m +CONFIG_MTDRAM_TOTAL_SIZE=4096 +CONFIG_MTDRAM_ERASE_SIZE=128 +CONFIG_MTD_BLKMTD=m + +# +# Disk-On-Chip Device Drivers +# +CONFIG_MTD_DOC2000=m +CONFIG_MTD_DOC2001=m +CONFIG_MTD_DOC2001PLUS=m +CONFIG_MTD_DOCPROBE=m +CONFIG_MTD_DOCECC=m +# CONFIG_MTD_DOCPROBE_ADVANCED is not set +CONFIG_MTD_DOCPROBE_ADDRESS=0 + +# +# NAND Flash Device Drivers +# +CONFIG_MTD_NAND=m +# CONFIG_MTD_NAND_VERIFY_WRITE is not set +CONFIG_MTD_NAND_IDS=m +CONFIG_MTD_NAND_DISKONCHIP=m +# CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set +CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0 +# CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE is not set + +# +# Parallel port support +# +CONFIG_PARPORT=m +CONFIG_PARPORT_PC=m +CONFIG_PARPORT_PC_CML1=m +CONFIG_PARPORT_SERIAL=m +CONFIG_PARPORT_PC_FIFO=y +# CONFIG_PARPORT_PC_SUPERIO is not set +CONFIG_PARPORT_PC_PCMCIA=m +# CONFIG_PARPORT_OTHER is not set +CONFIG_PARPORT_1284=y + +# +# Plug and Play support +# +CONFIG_PNP=y +# CONFIG_PNP_DEBUG is not set + +# +# Protocols +# +CONFIG_ISAPNP=y +CONFIG_PNPBIOS=y +CONFIG_PNPBIOS_PROC_FS=y + +# +# Block devices +# +CONFIG_BLK_DEV_FD=m +CONFIG_BLK_DEV_XD=m +CONFIG_PARIDE=m +CONFIG_PARIDE_PARPORT=m + +# +# Parallel IDE high-level drivers +# +CONFIG_PARIDE_PD=m +CONFIG_PARIDE_PCD=m +CONFIG_PARIDE_PF=m +CONFIG_PARIDE_PT=m +CONFIG_PARIDE_PG=m + +# +# Parallel IDE protocol modules +# +CONFIG_PARIDE_ATEN=m +CONFIG_PARIDE_BPCK=m +CONFIG_PARIDE_BPCK6=m +CONFIG_PARIDE_COMM=m +CONFIG_PARIDE_DSTR=m +CONFIG_PARIDE_FIT2=m +CONFIG_PARIDE_FIT3=m +CONFIG_PARIDE_EPAT=m +# CONFIG_PARIDE_EPATC8 is not set +CONFIG_PARIDE_EPIA=m +CONFIG_PARIDE_FRIQ=m +CONFIG_PARIDE_FRPW=m +CONFIG_PARIDE_KBIC=m +CONFIG_PARIDE_KTTI=m +CONFIG_PARIDE_ON20=m +CONFIG_PARIDE_ON26=m +CONFIG_BLK_CPQ_DA=m +CONFIG_BLK_CPQ_CISS_DA=m +CONFIG_CISS_SCSI_TAPE=y +CONFIG_BLK_DEV_DAC960=m +CONFIG_BLK_DEV_UMEM=m +CONFIG_BLK_DEV_LOOP=m +CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_SX8=m +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_BLK_DEV_INITRD=y +CONFIG_LBD=y + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=m +CONFIG_BLK_DEV_IDE=m + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_IDE_SATA is not set +# CONFIG_BLK_DEV_HD_IDE is not set +CONFIG_BLK_DEV_IDEDISK=m +# CONFIG_IDEDISK_MULTI_MODE is not set +CONFIG_BLK_DEV_IDECS=m +CONFIG_BLK_DEV_IDECD=m +CONFIG_BLK_DEV_IDETAPE=m +CONFIG_BLK_DEV_IDEFLOPPY=m +CONFIG_BLK_DEV_IDESCSI=m +# CONFIG_IDE_TASK_IOCTL is not set +CONFIG_IDE_TASKFILE_IO=y + +# +# IDE chipset support/bugfixes +# +CONFIG_IDE_GENERIC=m +CONFIG_BLK_DEV_CMD640=y +# CONFIG_BLK_DEV_CMD640_ENHANCED is not set +CONFIG_BLK_DEV_IDEPNP=m +CONFIG_BLK_DEV_IDEPCI=y +CONFIG_IDEPCI_SHARE_IRQ=y +# CONFIG_BLK_DEV_OFFBOARD is not set +CONFIG_BLK_DEV_GENERIC=m +CONFIG_BLK_DEV_OPTI621=m +CONFIG_BLK_DEV_RZ1000=m +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +CONFIG_IDEDMA_PCI_AUTO=y +# CONFIG_IDEDMA_ONLYDISK is not set +CONFIG_BLK_DEV_ADMA=y +CONFIG_BLK_DEV_AEC62XX=m +CONFIG_BLK_DEV_ALI15X3=m +# CONFIG_WDC_ALI15X3 is not set +CONFIG_BLK_DEV_AMD74XX=m +CONFIG_BLK_DEV_ATIIXP=m +CONFIG_BLK_DEV_CMD64X=m +CONFIG_BLK_DEV_TRIFLEX=m +CONFIG_BLK_DEV_CY82C693=m +CONFIG_BLK_DEV_CS5520=m +CONFIG_BLK_DEV_CS5530=m +CONFIG_BLK_DEV_HPT34X=m +# CONFIG_HPT34X_AUTODMA is not set +CONFIG_BLK_DEV_HPT366=m +CONFIG_BLK_DEV_SC1200=m +CONFIG_BLK_DEV_PIIX=m +CONFIG_BLK_DEV_NS87415=m +CONFIG_BLK_DEV_PDC202XX_OLD=m +CONFIG_PDC202XX_BURST=y +CONFIG_BLK_DEV_PDC202XX_NEW=m +CONFIG_PDC202XX_FORCE=y +CONFIG_BLK_DEV_SVWKS=m +CONFIG_BLK_DEV_SIIMAGE=m +CONFIG_BLK_DEV_SIS5513=m +CONFIG_BLK_DEV_SLC90E66=m +CONFIG_BLK_DEV_TRM290=m +CONFIG_BLK_DEV_VIA82CXXX=m +# CONFIG_IDE_ARM is not set +# CONFIG_IDE_CHIPSETS is not set +CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_IVB is not set +CONFIG_IDEDMA_AUTO=y +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +CONFIG_SCSI=m +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +CONFIG_CHR_DEV_ST=m +CONFIG_CHR_DEV_OSST=m +CONFIG_BLK_DEV_SR=m +# CONFIG_BLK_DEV_SR_VENDOR is not set +CONFIG_CHR_DEV_SG=m +CONFIG_CHR_DEV_SCH=m + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y + +# +# SCSI Transport Attributes +# +CONFIG_SCSI_SPI_ATTRS=m +CONFIG_SCSI_FC_ATTRS=m + +# +# SCSI low-level drivers +# +CONFIG_BLK_DEV_3W_XXXX_RAID=m +CONFIG_SCSI_3W_9XXX=m +CONFIG_SCSI_7000FASST=m +CONFIG_SCSI_ACARD=m +CONFIG_SCSI_AHA152X=m +CONFIG_SCSI_AHA1542=m +CONFIG_SCSI_AACRAID=m +CONFIG_SCSI_AIC7XXX=m +CONFIG_AIC7XXX_CMDS_PER_DEVICE=8 +CONFIG_AIC7XXX_RESET_DELAY_MS=15000 +# CONFIG_AIC7XXX_BUILD_FIRMWARE is not set +CONFIG_AIC7XXX_DEBUG_ENABLE=y +CONFIG_AIC7XXX_DEBUG_MASK=0 +CONFIG_AIC7XXX_REG_PRETTY_PRINT=y +CONFIG_SCSI_AIC7XXX_OLD=m +CONFIG_SCSI_AIC79XX=m +CONFIG_AIC79XX_CMDS_PER_DEVICE=32 +CONFIG_AIC79XX_RESET_DELAY_MS=15000 +# CONFIG_AIC79XX_BUILD_FIRMWARE is not set +CONFIG_AIC79XX_ENABLE_RD_STRM=y +CONFIG_AIC79XX_DEBUG_ENABLE=y +CONFIG_AIC79XX_DEBUG_MASK=0 +CONFIG_AIC79XX_REG_PRETTY_PRINT=y +CONFIG_SCSI_DPT_I2O=m +CONFIG_SCSI_ADVANSYS=m +CONFIG_SCSI_IN2000=m +CONFIG_SCSI_MEGARAID=m +CONFIG_SCSI_SATA=y +CONFIG_SCSI_SATA_SVW=m +CONFIG_SCSI_ATA_PIIX=m +CONFIG_SCSI_SATA_NV=m +CONFIG_SCSI_SATA_PROMISE=m +CONFIG_SCSI_SATA_SX4=m +CONFIG_SCSI_SATA_SIL=m +CONFIG_SCSI_SATA_SIS=m +CONFIG_SCSI_SATA_VIA=m +CONFIG_SCSI_SATA_VITESSE=m +CONFIG_SCSI_BUSLOGIC=m +# CONFIG_SCSI_OMIT_FLASHPOINT is not set +# CONFIG_SCSI_CPQFCTS is not set +CONFIG_SCSI_DMX3191D=m +CONFIG_SCSI_DTC3280=m +CONFIG_SCSI_EATA=m +CONFIG_SCSI_EATA_TAGGED_QUEUE=y +CONFIG_SCSI_EATA_LINKED_COMMANDS=y +CONFIG_SCSI_EATA_MAX_TAGS=16 +CONFIG_SCSI_EATA_PIO=m +CONFIG_SCSI_FUTURE_DOMAIN=m +CONFIG_SCSI_GDTH=m +CONFIG_SCSI_GENERIC_NCR5380=m +CONFIG_SCSI_GENERIC_NCR5380_MMIO=m +CONFIG_SCSI_GENERIC_NCR53C400=y +CONFIG_SCSI_IPS=m +# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_INIA100 is not set +CONFIG_SCSI_PPA=m +CONFIG_SCSI_IMM=m +# CONFIG_SCSI_IZIP_EPP16 is not set +# CONFIG_SCSI_IZIP_SLOW_CTR is not set +CONFIG_SCSI_NCR53C406A=m +CONFIG_SCSI_SYM53C8XX_2=m +CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 +CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 +CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 +# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set +CONFIG_SCSI_IPR=m +# CONFIG_SCSI_IPR_TRACE is not set +# CONFIG_SCSI_IPR_DUMP is not set +CONFIG_SCSI_PAS16=m +# CONFIG_SCSI_PCI2000 is not set +# CONFIG_SCSI_PCI2220I is not set +CONFIG_SCSI_PSI240I=m +CONFIG_SCSI_QLOGIC_FAS=m +CONFIG_SCSI_QLOGIC_ISP=m +CONFIG_SCSI_QLOGIC_FC=m +CONFIG_SCSI_QLOGIC_FC_FIRMWARE=y +CONFIG_SCSI_QLOGIC_1280=m +# CONFIG_SCSI_SEAGATE is not set +CONFIG_SCSI_SYM53C416=m +CONFIG_SCSI_DC395x=m +CONFIG_SCSI_DC390T=m +CONFIG_SCSI_T128=m +CONFIG_SCSI_U14_34F=m +CONFIG_SCSI_U14_34F_TAGGED_QUEUE=y +CONFIG_SCSI_U14_34F_LINKED_COMMANDS=y +CONFIG_SCSI_U14_34F_MAX_TAGS=8 +CONFIG_SCSI_ULTRASTOR=m +CONFIG_SCSI_NSP32=m +CONFIG_SCSI_DEBUG=m + +# +# PCMCIA SCSI adapter support +# +CONFIG_PCMCIA_AHA152X=m +CONFIG_PCMCIA_FDOMAIN=m +CONFIG_PCMCIA_NINJA_SCSI=m +CONFIG_PCMCIA_QLOGIC=m +CONFIG_PCMCIA_SYM53C500=m + +# +# Old CD-ROM drivers (not SCSI, not IDE) +# +CONFIG_CD_NO_IDESCSI=y +CONFIG_AZTCD=m +CONFIG_GSCD=m +CONFIG_SBPCD=m +CONFIG_MCD=m +CONFIG_MCD_IRQ=11 +CONFIG_MCD_BASE=0x300 +CONFIG_MCDX=m +CONFIG_OPTCD=m +CONFIG_CM206=m +CONFIG_SJCD=m +CONFIG_ISP16_CDI=m +CONFIG_CDU31A=m +CONFIG_CDU535=m + +# +# Multi-device support (RAID and LVM) +# +CONFIG_MD=y +CONFIG_BLK_DEV_MD=m +CONFIG_MD_LINEAR=m +CONFIG_MD_RAID0=m +CONFIG_MD_RAID1=m +CONFIG_MD_RAID5=m +CONFIG_MD_RAID6=m +CONFIG_MD_MULTIPATH=m +CONFIG_BLK_DEV_DM=m +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=m +CONFIG_DM_MIRROR=m +CONFIG_DM_ZERO=m + +# +# Fusion MPT device support +# +CONFIG_FUSION=m +CONFIG_FUSION_MAX_SGE=40 +CONFIG_FUSION_ISENSE=m +CONFIG_FUSION_CTL=m +CONFIG_FUSION_LAN=m + +# +# IEEE 1394 (FireWire) support +# +CONFIG_IEEE1394=m + +# +# Subsystem Options +# +# CONFIG_IEEE1394_VERBOSEDEBUG is not set +# CONFIG_IEEE1394_OUI_DB is not set +CONFIG_IEEE1394_EXTRA_CONFIG_ROMS=y +CONFIG_IEEE1394_CONFIG_ROM_IP1394=y + +# +# Device Drivers +# +CONFIG_IEEE1394_PCILYNX=m +CONFIG_IEEE1394_OHCI1394=m + +# +# Protocol Drivers +# +CONFIG_IEEE1394_VIDEO1394=m +CONFIG_IEEE1394_SBP2=m +# CONFIG_IEEE1394_SBP2_PHYS_DMA is not set +CONFIG_IEEE1394_ETH1394=m +CONFIG_IEEE1394_DV1394=m +CONFIG_IEEE1394_RAWIO=m +CONFIG_IEEE1394_CMP=m +CONFIG_IEEE1394_AMDTP=m + +# +# I2O device support +# +CONFIG_I2O=m +CONFIG_I2O_CONFIG=m +CONFIG_I2O_BLOCK=m +CONFIG_I2O_SCSI=m +CONFIG_I2O_PROC=m + +# +# Networking support +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=m +CONFIG_PACKET_MMAP=y +CONFIG_NETLINK_DEV=m +CONFIG_UNIX=m +CONFIG_NET_KEY=m +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_FWMARK=y +CONFIG_IP_ROUTE_NAT=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_TOS=y +CONFIG_IP_ROUTE_VERBOSE=y +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE=m +CONFIG_NET_IPGRE_BROADCAST=y +CONFIG_IP_MROUTE=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +# CONFIG_ARPD is not set +CONFIG_SYN_COOKIES=y +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +CONFIG_INET_IPCOMP=m + +# +# IP: Virtual Server Configuration +# +CONFIG_IP_VS=m +# CONFIG_IP_VS_DEBUG is not set +CONFIG_IP_VS_TAB_BITS=12 + +# +# IPVS transport protocol load balancing support +# +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_PROTO_ESP=y +CONFIG_IP_VS_PROTO_AH=y + +# +# IPVS scheduler +# +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_WRR=m +CONFIG_IP_VS_LC=m +CONFIG_IP_VS_WLC=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m + +# +# IPVS application helper +# +CONFIG_IP_VS_FTP=m +CONFIG_IPV6=m +CONFIG_IPV6_PRIVACY=y +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +CONFIG_INET6_IPCOMP=m +CONFIG_IPV6_TUNNEL=m +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_BRIDGE_NETFILTER=y + +# +# IP: Netfilter Configuration +# +CONFIG_IP_NF_CONNTRACK=m +CONFIG_IP_NF_FTP=m +CONFIG_IP_NF_IRC=m +CONFIG_IP_NF_TFTP=m +CONFIG_IP_NF_AMANDA=m +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_LIMIT=m +CONFIG_IP_NF_MATCH_IPRANGE=m +CONFIG_IP_NF_MATCH_MAC=m +CONFIG_IP_NF_MATCH_PKTTYPE=m +CONFIG_IP_NF_MATCH_MARK=m +CONFIG_IP_NF_MATCH_MULTIPORT=m +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_DSCP=m +CONFIG_IP_NF_MATCH_AH_ESP=m +CONFIG_IP_NF_MATCH_LENGTH=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_TCPMSS=m +CONFIG_IP_NF_MATCH_HELPER=m +CONFIG_IP_NF_MATCH_STATE=m +CONFIG_IP_NF_MATCH_CONNTRACK=m +CONFIG_IP_NF_MATCH_OWNER=m +CONFIG_IP_NF_MATCH_PHYSDEV=m +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_SAME=m +CONFIG_IP_NF_NAT_LOCAL=y +CONFIG_IP_NF_NAT_SNMP_BASIC=m +CONFIG_IP_NF_NAT_IRC=m +CONFIG_IP_NF_NAT_FTP=m +CONFIG_IP_NF_NAT_TFTP=m +CONFIG_IP_NF_NAT_AMANDA=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_DSCP=m +CONFIG_IP_NF_TARGET_MARK=m +CONFIG_IP_NF_TARGET_CLASSIFY=m +CONFIG_IP_NF_TARGET_LOG=m +CONFIG_IP_NF_TARGET_ULOG=m +CONFIG_IP_NF_TARGET_TCPMSS=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +CONFIG_IP_NF_COMPAT_IPCHAINS=m +CONFIG_IP_NF_COMPAT_IPFWADM=m +CONFIG_IP_NF_TARGET_NOTRACK=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_MATCH_ADDRTYPE=m +CONFIG_IP_NF_MATCH_REALM=m + +# +# IPv6: Netfilter Configuration +# +CONFIG_IP6_NF_QUEUE=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MATCH_LIMIT=m +CONFIG_IP6_NF_MATCH_MAC=m +CONFIG_IP6_NF_MATCH_RT=m +CONFIG_IP6_NF_MATCH_OPTS=m +CONFIG_IP6_NF_MATCH_FRAG=m +CONFIG_IP6_NF_MATCH_HL=m +CONFIG_IP6_NF_MATCH_MULTIPORT=m +CONFIG_IP6_NF_MATCH_OWNER=m +CONFIG_IP6_NF_MATCH_MARK=m +CONFIG_IP6_NF_MATCH_IPV6HEADER=m +CONFIG_IP6_NF_MATCH_AHESP=m +CONFIG_IP6_NF_MATCH_LENGTH=m +CONFIG_IP6_NF_MATCH_EUI64=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_LOG=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_TARGET_MARK=m +CONFIG_IP6_NF_RAW=m + +# +# DECnet: Netfilter Configuration +# +CONFIG_DECNET_NF_GRABULATOR=m + +# +# Bridge: Netfilter Configuration +# +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_802_3=m +CONFIG_BRIDGE_EBT_AMONG=m +CONFIG_BRIDGE_EBT_ARP=m +CONFIG_BRIDGE_EBT_IP=m +CONFIG_BRIDGE_EBT_LIMIT=m +CONFIG_BRIDGE_EBT_MARK=m +CONFIG_BRIDGE_EBT_PKTTYPE=m +CONFIG_BRIDGE_EBT_STP=m +CONFIG_BRIDGE_EBT_VLAN=m +CONFIG_BRIDGE_EBT_ARPREPLY=m +CONFIG_BRIDGE_EBT_DNAT=m +CONFIG_BRIDGE_EBT_MARK_T=m +CONFIG_BRIDGE_EBT_REDIRECT=m +CONFIG_BRIDGE_EBT_SNAT=m +CONFIG_BRIDGE_EBT_LOG=m +CONFIG_XFRM=y +CONFIG_XFRM_USER=m + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IP_SCTP=m +# CONFIG_SCTP_DBG_MSG is not set +# CONFIG_SCTP_DBG_OBJCNT is not set +# CONFIG_SCTP_HMAC_NONE is not set +# CONFIG_SCTP_HMAC_SHA1 is not set +CONFIG_SCTP_HMAC_MD5=y +CONFIG_ATM=y +CONFIG_ATM_CLIP=y +# CONFIG_ATM_CLIP_NO_ICMP is not set +CONFIG_ATM_LANE=m +CONFIG_ATM_MPOA=m +CONFIG_ATM_BR2684=m +# CONFIG_ATM_BR2684_IPFILTER is not set +CONFIG_BRIDGE=m +CONFIG_VLAN_8021Q=m +CONFIG_DECNET=m +# CONFIG_DECNET_SIOCGIFCONF is not set +# CONFIG_DECNET_ROUTER is not set +CONFIG_LLC=y +CONFIG_LLC2=m +CONFIG_IPX=m +# CONFIG_IPX_INTERN is not set +CONFIG_ATALK=m +CONFIG_DEV_APPLETALK=y +CONFIG_LTPC=m +CONFIG_COPS=m +CONFIG_COPS_DAYNA=y +CONFIG_COPS_TANGENT=y +CONFIG_IPDDP=m +CONFIG_IPDDP_ENCAP=y +CONFIG_IPDDP_DECAP=y +CONFIG_X25=m +CONFIG_LAPB=m +# CONFIG_NET_DIVERT is not set +CONFIG_ECONET=m +CONFIG_ECONET_AUNUDP=y +CONFIG_ECONET_NATIVE=y +CONFIG_WAN_ROUTER=m +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_CLK_JIFFIES=y +# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set +# CONFIG_NET_SCH_CLK_CPU is not set +CONFIG_NET_SCH_CBQ=m +CONFIG_NET_SCH_HTB=m +CONFIG_NET_SCH_HFSC=m +CONFIG_NET_SCH_ATM=m +CONFIG_NET_SCH_PRIO=m +CONFIG_NET_SCH_RED=m +CONFIG_NET_SCH_SFQ=m +CONFIG_NET_SCH_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_NETEM=m +CONFIG_NET_SCH_INGRESS=m +CONFIG_NET_QOS=y +CONFIG_NET_ESTIMATOR=y +CONFIG_NET_CLS=y +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_ROUTE=y +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +# CONFIG_CLS_U32_PERF is not set +# CONFIG_NET_CLS_IND is not set +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +# CONFIG_NET_CLS_ACT is not set +CONFIG_NET_CLS_POLICE=y + +# +# Network testing +# +CONFIG_NET_PKTGEN=m +CONFIG_NETPOLL=y +# CONFIG_NETPOLL_RX is not set +# CONFIG_NETPOLL_TRAP is not set +CONFIG_NET_POLL_CONTROLLER=y +CONFIG_HAMRADIO=y + +# +# Packet Radio protocols +# +CONFIG_AX25=m +# CONFIG_AX25_DAMA_SLAVE is not set +CONFIG_NETROM=m +CONFIG_ROSE=m + +# +# AX.25 network device drivers +# +CONFIG_MKISS=m +CONFIG_6PACK=m +CONFIG_BPQETHER=m +CONFIG_DMASCC=m +CONFIG_SCC=m +# CONFIG_SCC_DELAY is not set +# CONFIG_SCC_TRXECHO is not set +CONFIG_BAYCOM_SER_FDX=m +CONFIG_BAYCOM_SER_HDX=m +CONFIG_BAYCOM_PAR=m +CONFIG_BAYCOM_EPP=m +CONFIG_YAM=m +CONFIG_IRDA=m + +# +# IrDA protocols +# +CONFIG_IRLAN=m +CONFIG_IRNET=m +CONFIG_IRCOMM=m +# CONFIG_IRDA_ULTRA is not set + +# +# IrDA options +# +CONFIG_IRDA_CACHE_LAST_LSAP=y +CONFIG_IRDA_FAST_RR=y +CONFIG_IRDA_DEBUG=y + +# +# Infrared-port device drivers +# + +# +# SIR device drivers +# +CONFIG_IRTTY_SIR=m + +# +# Dongle support +# +CONFIG_DONGLE=y +CONFIG_ESI_DONGLE=m +CONFIG_ACTISYS_DONGLE=m +CONFIG_TEKRAM_DONGLE=m +CONFIG_LITELINK_DONGLE=m +CONFIG_MA600_DONGLE=m +CONFIG_GIRBIL_DONGLE=m +CONFIG_MCP2120_DONGLE=m +CONFIG_OLD_BELKIN_DONGLE=m +CONFIG_ACT200L_DONGLE=m + +# +# Old SIR device drivers +# +CONFIG_IRPORT_SIR=m + +# +# Old Serial dongle support +# +# CONFIG_DONGLE_OLD is not set + +# +# FIR device drivers +# +CONFIG_USB_IRDA=m +CONFIG_SIGMATEL_FIR=m +CONFIG_NSC_FIR=m +CONFIG_WINBOND_FIR=m +CONFIG_TOSHIBA_FIR=m +CONFIG_SMC_IRCC_FIR=m +CONFIG_ALI_FIR=m +CONFIG_VLSI_FIR=m +CONFIG_VIA_FIR=m +CONFIG_BT=m +CONFIG_BT_L2CAP=m +CONFIG_BT_SCO=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_CMTP=m +CONFIG_BT_HIDP=m + +# +# Bluetooth device drivers +# +CONFIG_BT_HCIUSB=m +CONFIG_BT_HCIUSB_SCO=y +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_H4=y +CONFIG_BT_HCIUART_BCSP=y +# CONFIG_BT_HCIUART_BCSP_TXCRC is not set +CONFIG_BT_HCIBCM203X=m +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIDTL1=m +CONFIG_BT_HCIBT3C=m +CONFIG_BT_HCIBLUECARD=m +CONFIG_BT_HCIBTUART=m +CONFIG_BT_HCIVHCI=m +CONFIG_NETDEVICES=y +CONFIG_DUMMY=m +CONFIG_BONDING=m +CONFIG_EQUALIZER=m +CONFIG_TUN=m +CONFIG_ETHERTAP=m +CONFIG_NET_SB1000=m + +# +# ARCnet devices +# +CONFIG_ARCNET=m +CONFIG_ARCNET_1201=m +CONFIG_ARCNET_1051=m +CONFIG_ARCNET_RAW=m +CONFIG_ARCNET_COM90xx=m +CONFIG_ARCNET_COM90xxIO=m +CONFIG_ARCNET_RIM_I=m +CONFIG_ARCNET_COM20020=m +CONFIG_ARCNET_COM20020_ISA=m +CONFIG_ARCNET_COM20020_PCI=m + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=m +CONFIG_HAPPYMEAL=m +CONFIG_SUNGEM=m +CONFIG_NET_VENDOR_3COM=y +CONFIG_EL1=m +CONFIG_EL2=m +CONFIG_ELPLUS=m +CONFIG_EL16=m +CONFIG_EL3=m +CONFIG_3C515=m +CONFIG_VORTEX=m +CONFIG_TYPHOON=m +CONFIG_LANCE=m +CONFIG_NET_VENDOR_SMC=y +CONFIG_WD80x3=m +CONFIG_ULTRA=m +CONFIG_SMC9194=m +CONFIG_NET_VENDOR_RACAL=y +CONFIG_NI5010=m +CONFIG_NI52=m +CONFIG_NI65=m + +# +# Tulip family network device support +# +CONFIG_NET_TULIP=y +CONFIG_DE2104X=m +CONFIG_TULIP=m +# CONFIG_TULIP_MWI is not set +# CONFIG_TULIP_MMIO is not set +# CONFIG_TULIP_NAPI is not set +CONFIG_DE4X5=m +CONFIG_WINBOND_840=m +CONFIG_DM9102=m +CONFIG_PCMCIA_XIRCOM=m +CONFIG_PCMCIA_XIRTULIP=m +CONFIG_AT1700=m +CONFIG_DEPCA=m +CONFIG_HP100=m +CONFIG_NET_ISA=y +CONFIG_E2100=m +CONFIG_EWRK3=m +CONFIG_EEXPRESS=m +CONFIG_EEXPRESS_PRO=m +CONFIG_HPLAN_PLUS=m +CONFIG_HPLAN=m +CONFIG_LP486E=m +CONFIG_ETH16I=m +CONFIG_NE2000=m +CONFIG_ZNET=m +CONFIG_SEEQ8005=m +CONFIG_NET_PCI=y +CONFIG_PCNET32=m +CONFIG_AMD8111_ETH=m +# CONFIG_AMD8111E_NAPI is not set +CONFIG_ADAPTEC_STARFIRE=m +# CONFIG_ADAPTEC_STARFIRE_NAPI is not set +CONFIG_AC3200=m +CONFIG_APRICOT=m +CONFIG_B44=m +CONFIG_FORCEDETH=m +CONFIG_CS89x0=m +CONFIG_EEPRO100=m +# CONFIG_EEPRO100_PIO is not set +CONFIG_E100=m +# CONFIG_E100_NAPI is not set +CONFIG_FEALNX=m +CONFIG_NATSEMI=m +CONFIG_NE2K_PCI=m +CONFIG_8139CP=m +CONFIG_8139TOO=m +CONFIG_8139TOO_PIO=y +CONFIG_8139TOO_TUNE_TWISTER=y +CONFIG_8139TOO_8129=y +# CONFIG_8139_OLD_RX_RESET is not set +CONFIG_SIS900=m +CONFIG_EPIC100=m +CONFIG_SUNDANCE=m +# CONFIG_SUNDANCE_MMIO is not set +CONFIG_TLAN=m +CONFIG_VIA_RHINE=m +# CONFIG_VIA_RHINE_MMIO is not set +CONFIG_VIA_VELOCITY=m +CONFIG_NET_POCKET=y +CONFIG_ATP=m +CONFIG_DE600=m +CONFIG_DE620=m + +# +# Ethernet (1000 Mbit) +# +CONFIG_DL2K=m +CONFIG_E1000=m +# CONFIG_E1000_NAPI is not set +CONFIG_NS83820=m +CONFIG_HAMACHI=m +CONFIG_YELLOWFIN=m +CONFIG_R8169=m +CONFIG_SK98LIN=m +CONFIG_TIGON3=m + +# +# Ethernet (10000 Mbit) +# +CONFIG_IXGB=m +# CONFIG_IXGB_NAPI is not set +CONFIG_S2IO=m +# CONFIG_S2IO_NAPI is not set + +# +# Token Ring devices +# +CONFIG_TR=y +CONFIG_IBMTR=m +CONFIG_IBMOL=m +CONFIG_IBMLS=m +CONFIG_3C359=m +CONFIG_TMS380TR=m +CONFIG_TMSPCI=m +CONFIG_SKISA=m +CONFIG_PROTEON=m +CONFIG_ABYSS=m + +# +# Wireless LAN (non-hamradio) +# +CONFIG_NET_RADIO=y + +# +# Obsolete Wireless cards support (pre-802.11) +# +CONFIG_STRIP=m +CONFIG_ARLAN=m +CONFIG_WAVELAN=m +CONFIG_PCMCIA_WAVELAN=m +CONFIG_PCMCIA_NETWAVE=m + +# +# Wireless 802.11 Frequency Hopping cards support +# +CONFIG_PCMCIA_RAYCS=m + +# +# Wireless 802.11b ISA/PCI cards support +# +CONFIG_IEEE80211=m +# CONFIG_IEEE80211_DEBUG is not set +CONFIG_IEEE80211_CRYPT=m +CONFIG_IEEE80211_WPA=y +CONFIG_IEEE80211_CRYPT_CCMP=m +CONFIG_IEEE80211_CRYPT_TKIP=m +CONFIG_IPW2100=m +CONFIG_IPW2100_PROMISC=y +# CONFIG_IPW2100_LEGACY_FW_LOAD is not set +# CONFIG_IPW2100_NOWEP is not set +# CONFIG_IPW2100_DEBUG is not set +CONFIG_IPW2200=m +# CONFIG_IPW2200_NOWEP is not set +CONFIG_WLAN_NG=m +CONFIG_PRISM2=m +CONFIG_PRISM2_USB=m +CONFIG_ACX100=m +CONFIG_ADM8211=m +CONFIG_AIRO=m +CONFIG_HERMES=m +CONFIG_PLX_HERMES=m +CONFIG_TMD_HERMES=m +CONFIG_PCI_HERMES=m +CONFIG_ATMEL=m +CONFIG_PCI_ATMEL=m + +# +# Wireless 802.11b Pcmcia/Cardbus cards support +# +CONFIG_PCMCIA_HERMES=m +CONFIG_AIRO_CS=m +CONFIG_PCMCIA_ATMEL=m +CONFIG_PCMCIA_WL3501=m + +# +# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support +# +CONFIG_PRISM54=m +CONFIG_NET_WIRELESS=y + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +CONFIG_PCMCIA_3C589=m +CONFIG_PCMCIA_3C574=m +CONFIG_PCMCIA_FMVJ18X=m +CONFIG_PCMCIA_PCNET=m +CONFIG_PCMCIA_NMCLAN=m +CONFIG_PCMCIA_SMC91C92=m +CONFIG_PCMCIA_XIRC2PS=m +CONFIG_PCMCIA_AXNET=m +CONFIG_ARCNET_COM20020_CS=m +CONFIG_PCMCIA_IBMTR=m + +# +# Wan interfaces +# +CONFIG_WAN=y +CONFIG_HOSTESS_SV11=m +CONFIG_COSA=m +CONFIG_DSCC4=m +CONFIG_DSCC4_PCISYNC=y +CONFIG_DSCC4_PCI_RST=y +CONFIG_LANMEDIA=m +CONFIG_SEALEVEL_4021=m +CONFIG_SYNCLINK_SYNCPPP=m +CONFIG_HDLC=m +CONFIG_HDLC_RAW=y +CONFIG_HDLC_RAW_ETH=y +CONFIG_HDLC_CISCO=y +CONFIG_HDLC_FR=y +CONFIG_HDLC_PPP=y +CONFIG_HDLC_X25=y +CONFIG_PCI200SYN=m +CONFIG_WANXL=m +CONFIG_PC300=m +CONFIG_PC300_MLPPP=y +CONFIG_N2=m +CONFIG_C101=m +CONFIG_FARSYNC=m +CONFIG_DLCI=m +CONFIG_DLCI_COUNT=24 +CONFIG_DLCI_MAX=8 +CONFIG_SDLA=m +CONFIG_WAN_ROUTER_DRIVERS=y +# CONFIG_VENDOR_SANGOMA is not set +CONFIG_CYCLADES_SYNC=m +CONFIG_CYCLOMX_X25=y +CONFIG_LAPBETHER=m +CONFIG_X25_ASY=m +CONFIG_SBNI=m +# CONFIG_SBNI_MULTILINE is not set + +# +# ATM drivers +# +CONFIG_ATM_TCP=m +CONFIG_ATM_LANAI=m +CONFIG_ATM_ENI=m +# CONFIG_ATM_ENI_DEBUG is not set +# CONFIG_ATM_ENI_TUNE_BURST is not set +CONFIG_ATM_FIRESTREAM=m +CONFIG_ATM_ZATM=m +# CONFIG_ATM_ZATM_DEBUG is not set +CONFIG_ATM_NICSTAR=m +# CONFIG_ATM_NICSTAR_USE_SUNI is not set +# CONFIG_ATM_NICSTAR_USE_IDT77105 is not set +CONFIG_ATM_IDT77252=m +# CONFIG_ATM_IDT77252_DEBUG is not set +# CONFIG_ATM_IDT77252_RCV_ALL is not set +CONFIG_ATM_IDT77252_USE_SUNI=y +CONFIG_ATM_AMBASSADOR=m +# CONFIG_ATM_AMBASSADOR_DEBUG is not set +CONFIG_ATM_HORIZON=m +# CONFIG_ATM_HORIZON_DEBUG is not set +CONFIG_ATM_IA=m +# CONFIG_ATM_IA_DEBUG is not set +CONFIG_ATM_FORE200E_MAYBE=m +CONFIG_ATM_FORE200E_PCA=y +CONFIG_ATM_FORE200E_PCA_DEFAULT_FW=y +# CONFIG_ATM_FORE200E_USE_TASKLET is not set +CONFIG_ATM_FORE200E_TX_RETRY=16 +CONFIG_ATM_FORE200E_DEBUG=0 +CONFIG_ATM_FORE200E=m +CONFIG_ATM_HE=m +CONFIG_ATM_HE_USE_SUNI=y +CONFIG_FDDI=y +CONFIG_DEFXX=m +CONFIG_SKFP=m +CONFIG_HIPPI=y +CONFIG_ROADRUNNER=m +# CONFIG_ROADRUNNER_LARGE_RINGS is not set +CONFIG_PLIP=m +CONFIG_PPP=m +CONFIG_PPP_MULTILINK=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_MPPE=m +CONFIG_PPPOE=m +CONFIG_PPPOATM=m +CONFIG_SLIP=m +CONFIG_SLIP_COMPRESSED=y +CONFIG_SLIP_SMART=y +CONFIG_SLIP_MODE_SLIP6=y +CONFIG_NET_FC=y +# CONFIG_IPHASE5526 is not set +CONFIG_SHAPER=m +CONFIG_NETCONSOLE=m +CONFIG_NDISWRAPPER=m + +# +# ISDN subsystem +# +CONFIG_ISDN=m + +# +# Old ISDN4Linux +# +CONFIG_ISDN_I4L=m +CONFIG_ISDN_PPP=y +CONFIG_ISDN_PPP_VJ=y +CONFIG_ISDN_MPP=y +CONFIG_IPPP_FILTER=y +CONFIG_ISDN_PPP_BSDCOMP=m +CONFIG_ISDN_AUDIO=y +CONFIG_ISDN_TTY_FAX=y +CONFIG_ISDN_X25=y + +# +# ISDN feature submodules +# +CONFIG_ISDN_DRV_LOOP=m +# CONFIG_ISDN_DIVERSION is not set + +# +# ISDN4Linux hardware drivers +# + +# +# Passive cards +# +CONFIG_ISDN_DRV_HISAX=m + +# +# D-channel protocol features +# +CONFIG_HISAX_EURO=y +CONFIG_DE_AOC=y +# CONFIG_HISAX_NO_SENDCOMPLETE is not set +# CONFIG_HISAX_NO_LLC is not set +# CONFIG_HISAX_NO_KEYPAD is not set +CONFIG_HISAX_1TR6=y +CONFIG_HISAX_NI1=y +CONFIG_HISAX_MAX_CARDS=8 + +# +# HiSax supported cards +# +CONFIG_HISAX_16_0=y +CONFIG_HISAX_16_3=y +CONFIG_HISAX_TELESPCI=y +CONFIG_HISAX_S0BOX=y +CONFIG_HISAX_AVM_A1=y +CONFIG_HISAX_FRITZPCI=y +CONFIG_HISAX_AVM_A1_PCMCIA=y +CONFIG_HISAX_ELSA=y +CONFIG_HISAX_IX1MICROR2=y +CONFIG_HISAX_DIEHLDIVA=y +CONFIG_HISAX_ASUSCOM=y +CONFIG_HISAX_TELEINT=y +CONFIG_HISAX_HFCS=y +CONFIG_HISAX_SEDLBAUER=y +CONFIG_HISAX_SPORTSTER=y +CONFIG_HISAX_MIC=y +CONFIG_HISAX_NETJET=y +CONFIG_HISAX_NETJET_U=y +CONFIG_HISAX_NICCY=y +CONFIG_HISAX_ISURF=y +CONFIG_HISAX_HSTSAPHIR=y +CONFIG_HISAX_BKM_A4T=y +CONFIG_HISAX_SCT_QUADRO=y +CONFIG_HISAX_GAZEL=y +CONFIG_HISAX_HFC_PCI=y +CONFIG_HISAX_W6692=y +CONFIG_HISAX_HFC_SX=y +CONFIG_HISAX_ENTERNOW_PCI=y +# CONFIG_HISAX_DEBUG is not set + +# +# HiSax PCMCIA card service modules +# +CONFIG_HISAX_SEDLBAUER_CS=m +CONFIG_HISAX_ELSA_CS=m +CONFIG_HISAX_AVM_A1_CS=m +CONFIG_HISAX_TELES_CS=m + +# +# HiSax sub driver modules +# +CONFIG_HISAX_ST5481=m +CONFIG_HISAX_HFCUSB=m +CONFIG_HISAX_FRITZ_PCIPNP=m +CONFIG_HISAX_HDLC=y + +# +# Active cards +# +CONFIG_ISDN_DRV_ICN=m +CONFIG_ISDN_DRV_PCBIT=m +CONFIG_ISDN_DRV_SC=m +CONFIG_ISDN_DRV_ACT2000=m +CONFIG_ISDN_DRV_TPAM=m +CONFIG_HYSDN=m +CONFIG_HYSDN_CAPI=y + +# +# CAPI subsystem +# +CONFIG_ISDN_CAPI=m +CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON=y +CONFIG_ISDN_CAPI_MIDDLEWARE=y +CONFIG_ISDN_CAPI_CAPI20=m +CONFIG_ISDN_CAPI_CAPIFS_BOOL=y +CONFIG_ISDN_CAPI_CAPIFS=m +CONFIG_ISDN_CAPI_CAPIDRV=m + +# +# CAPI hardware drivers +# + +# +# Active AVM cards +# +CONFIG_CAPI_AVM=y +CONFIG_ISDN_DRV_AVMB1_B1ISA=m +CONFIG_ISDN_DRV_AVMB1_B1PCI=m +CONFIG_ISDN_DRV_AVMB1_B1PCIV4=y +CONFIG_ISDN_DRV_AVMB1_T1ISA=m +CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m +CONFIG_ISDN_DRV_AVMB1_AVM_CS=m +CONFIG_ISDN_DRV_AVMB1_T1PCI=m +CONFIG_ISDN_DRV_AVMB1_C4=m + +# +# Active Eicon DIVA Server cards +# +CONFIG_CAPI_EICON=y +CONFIG_ISDN_DIVAS=m +CONFIG_ISDN_DIVAS_BRIPCI=y +CONFIG_ISDN_DIVAS_PRIPCI=y +CONFIG_ISDN_DIVAS_DIVACAPI=m +CONFIG_ISDN_DIVAS_USERIDI=m +CONFIG_ISDN_DIVAS_MAINT=m + +# +# Modular ISDN driver +# +CONFIG_MISDN_DRV=m +# CONFIG_MISDN_MEMDEBUG is not set +CONFIG_MISDN_AVM_FRITZ=y +CONFIG_MISDN_HFCPCI=y +CONFIG_MISDN_HFCMULTI=y +CONFIG_MISDN_SPEEDFAX=y +CONFIG_MISDN_W6692=y +CONFIG_MISDN_DSP=y + +# +# Telephony Support +# +CONFIG_PHONE=m +CONFIG_PHONE_IXJ=m +CONFIG_PHONE_IXJ_PCMCIA=m + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=m +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_MOUSEDEV_PSAUX_ENABLE=y +CONFIG_INPUT_JOYDEV=m +CONFIG_INPUT_TSDEV=m +CONFIG_INPUT_TSDEV_SCREEN_X=240 +CONFIG_INPUT_TSDEV_SCREEN_Y=320 +CONFIG_INPUT_EVDEV=m +CONFIG_INPUT_EVBUG=m + +# +# Input I/O drivers +# +CONFIG_GAMEPORT=m +CONFIG_SOUND_GAMEPORT=m +CONFIG_GAMEPORT_NS558=m +CONFIG_GAMEPORT_L4=m +CONFIG_GAMEPORT_EMU10K1=m +CONFIG_GAMEPORT_VORTEX=m +CONFIG_GAMEPORT_FM801=m +CONFIG_GAMEPORT_CS461x=m +CONFIG_SERIO=y +CONFIG_SERIO_I8042=y +CONFIG_SERIO_SERPORT=m +CONFIG_SERIO_CT82C710=m +CONFIG_SERIO_PARKBD=m +CONFIG_SERIO_PCIPS2=m + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=y +CONFIG_KEYBOARD_SUNKBD=m +CONFIG_KEYBOARD_LKKBD=m +CONFIG_KEYBOARD_XTKBD=m +CONFIG_KEYBOARD_NEWTON=m +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=m +CONFIG_MOUSE_SERIAL=m +CONFIG_MOUSE_INPORT=m +# CONFIG_MOUSE_ATIXL is not set +CONFIG_MOUSE_LOGIBM=m +CONFIG_MOUSE_PC110PAD=m +CONFIG_MOUSE_VSXXXAA=m +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_ANALOG=m +CONFIG_JOYSTICK_A3D=m +CONFIG_JOYSTICK_ADI=m +CONFIG_JOYSTICK_COBRA=m +CONFIG_JOYSTICK_GF2K=m +CONFIG_JOYSTICK_GRIP=m +CONFIG_JOYSTICK_GRIP_MP=m +CONFIG_JOYSTICK_GUILLEMOT=m +CONFIG_JOYSTICK_INTERACT=m +CONFIG_JOYSTICK_SIDEWINDER=m +CONFIG_JOYSTICK_TMDC=m +CONFIG_JOYSTICK_IFORCE=m +CONFIG_JOYSTICK_IFORCE_USB=y +CONFIG_JOYSTICK_IFORCE_232=y +CONFIG_JOYSTICK_WARRIOR=m +CONFIG_JOYSTICK_MAGELLAN=m +CONFIG_JOYSTICK_SPACEORB=m +CONFIG_JOYSTICK_SPACEBALL=m +CONFIG_JOYSTICK_STINGER=m +CONFIG_JOYSTICK_TWIDDLER=m +CONFIG_JOYSTICK_DB9=m +CONFIG_JOYSTICK_GAMECON=m +CONFIG_JOYSTICK_TURBOGRAFX=m +CONFIG_INPUT_JOYDUMP=m +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_GUNZE=m +CONFIG_INPUT_MISC=y +CONFIG_INPUT_PCSPKR=m +CONFIG_INPUT_UINPUT=m + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +CONFIG_SERIAL_NONSTANDARD=y +CONFIG_COMPUTONE=m +CONFIG_ROCKETPORT=m +CONFIG_CYCLADES=m +# CONFIG_CYZ_INTR is not set +CONFIG_DIGIEPCA=m +# CONFIG_ESPSERIAL is not set +CONFIG_MOXA_INTELLIO=m +CONFIG_MOXA_SMARTIO=m +# CONFIG_ISI is not set +CONFIG_SYNCLINK=m +CONFIG_SYNCLINKMP=m +CONFIG_N_HDLC=m +# CONFIG_RISCOM8 is not set +# CONFIG_SPECIALIX is not set +CONFIG_SX=m +CONFIG_RIO=m +CONFIG_RIO_OLDPCI=y +CONFIG_STALDRV=y +CONFIG_STALLION=m +CONFIG_ISTALLION=m + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_CS=m +# CONFIG_SERIAL_8250_ACPI is not set +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_MANY_PORTS=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +CONFIG_SERIAL_8250_MULTIPORT=y +CONFIG_SERIAL_8250_RSA=y + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=256 +CONFIG_PRINTER=m +# CONFIG_LP_CONSOLE is not set +CONFIG_PPDEV=m +CONFIG_TIPAR=m +CONFIG_QIC02_TAPE=m +CONFIG_QIC02_DYNCONF=y + +# +# Setting runtime QIC-02 configuration is done with qic02conf +# + +# +# from the tpqic02-support package. It is available at +# + +# +# metalab.unc.edu or ftp://titus.cfw.com/pub/Linux/util/ +# + +# +# IPMI +# +CONFIG_IPMI_HANDLER=m +# CONFIG_IPMI_PANIC_EVENT is not set +CONFIG_IPMI_DEVICE_INTERFACE=m +CONFIG_IPMI_SI=m +CONFIG_IPMI_WATCHDOG=m + +# +# Watchdog Cards +# +CONFIG_WATCHDOG=y +# CONFIG_WATCHDOG_NOWAYOUT is not set + +# +# Watchdog Device Drivers +# +CONFIG_SOFT_WATCHDOG=m +CONFIG_ACQUIRE_WDT=m +CONFIG_ADVANTECH_WDT=m +CONFIG_ALIM1535_WDT=m +CONFIG_ALIM7101_WDT=m +CONFIG_SC520_WDT=m +CONFIG_EUROTECH_WDT=m +CONFIG_IB700_WDT=m +CONFIG_WAFER_WDT=m +CONFIG_I8XX_TCO=m +CONFIG_SC1200_WDT=m +CONFIG_SCx200_WDT=m +CONFIG_60XX_WDT=m +CONFIG_CPU5_WDT=m +CONFIG_W83627HF_WDT=m +CONFIG_W83877F_WDT=m +CONFIG_MACHZ_WDT=m + +# +# ISA-based Watchdog Cards +# +CONFIG_PCWATCHDOG=m +CONFIG_MIXCOMWD=m +CONFIG_WDT=m +CONFIG_WDT_501=y + +# +# PCI-based Watchdog Cards +# +CONFIG_PCIPCWATCHDOG=m +CONFIG_WDTPCI=m +CONFIG_WDT_501_PCI=y + +# +# USB-based Watchdog Cards +# +CONFIG_USBPCWATCHDOG=m +CONFIG_HW_RANDOM=m +CONFIG_NVRAM=m +CONFIG_RTC=m +CONFIG_GEN_RTC=m +CONFIG_GEN_RTC_X=y +CONFIG_DTLK=m +CONFIG_R3964=m +CONFIG_APPLICOM=m +CONFIG_SONYPI=m + +# +# Ftape, the floppy tape device driver +# +CONFIG_FTAPE=m +CONFIG_ZFTAPE=m +CONFIG_ZFT_DFLT_BLK_SZ=10240 + +# +# The compressor will be built as a module only! +# +CONFIG_ZFT_COMPRESSOR=m +CONFIG_FT_NR_BUFFERS=3 +CONFIG_FT_PROC_FS=y +CONFIG_FT_NORMAL_DEBUG=y +# CONFIG_FT_FULL_DEBUG is not set +# CONFIG_FT_NO_TRACE is not set +# CONFIG_FT_NO_TRACE_AT_ALL is not set + +# +# Hardware configuration +# +CONFIG_FT_STD_FDC=y +# CONFIG_FT_MACH2 is not set +# CONFIG_FT_PROBE_FC10 is not set +# CONFIG_FT_ALT_FDC is not set +CONFIG_FT_FDC_THR=8 +CONFIG_FT_FDC_MAX_RATE=2000 +CONFIG_FT_ALPHA_CLOCK=0 +CONFIG_AGP=m +CONFIG_AGP_ALI=m +CONFIG_AGP_ATI=m +CONFIG_AGP_AMD=m +CONFIG_AGP_AMD64=m +CONFIG_AGP_INTEL=m +CONFIG_AGP_INTEL_MCH=m +CONFIG_AGP_NVIDIA=m +CONFIG_AGP_SIS=m +CONFIG_AGP_SWORKS=m +CONFIG_AGP_VIA=m +CONFIG_AGP_EFFICEON=m +CONFIG_DRM=y +CONFIG_DRM_TDFX=m +CONFIG_DRM_GAMMA=m +CONFIG_DRM_R128=m +CONFIG_DRM_RADEON=m +CONFIG_DRM_I810=m +CONFIG_DRM_I830=m +CONFIG_DRM_MGA=m +CONFIG_DRM_SIS=m + +# +# PCMCIA character devices +# +CONFIG_SYNCLINK_CS=m +CONFIG_MWAVE=m +CONFIG_SCx200_GPIO=m +CONFIG_RAW_DRIVER=m +CONFIG_HPET=y +# CONFIG_HPET_RTC_IRQ is not set +CONFIG_HPET_MMAP=y +CONFIG_MAX_RAW_DEVS=256 +CONFIG_HANGCHECK_TIMER=m + +# +# I2C support +# +CONFIG_I2C=m +CONFIG_I2C_CHARDEV=m + +# +# I2C Algorithms +# +CONFIG_I2C_ALGOBIT=m +CONFIG_I2C_ALGOPCF=m + +# +# I2C Hardware Bus support +# +CONFIG_I2C_ALI1535=m +CONFIG_I2C_ALI1563=m +CONFIG_I2C_ALI15X3=m +CONFIG_I2C_AMD756=m +CONFIG_I2C_AMD8111=m +CONFIG_I2C_ELEKTOR=m +CONFIG_I2C_I801=m +CONFIG_I2C_I810=m +CONFIG_I2C_ISA=m +CONFIG_I2C_NFORCE2=m +CONFIG_I2C_PARPORT=m +CONFIG_I2C_PARPORT_LIGHT=m +CONFIG_I2C_PIIX4=m +CONFIG_I2C_PROSAVAGE=m +CONFIG_I2C_SAVAGE4=m +CONFIG_SCx200_I2C=m +CONFIG_SCx200_I2C_SCL=12 +CONFIG_SCx200_I2C_SDA=13 +CONFIG_SCx200_ACB=m +CONFIG_I2C_SIS5595=m +CONFIG_I2C_SIS630=m +CONFIG_I2C_SIS96X=m +CONFIG_I2C_VIA=m +CONFIG_I2C_VIAPRO=m +CONFIG_I2C_VOODOO3=m + +# +# Hardware Sensors Chip support +# +CONFIG_I2C_SENSOR=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM1025=m +CONFIG_SENSORS_ADM1031=m +CONFIG_SENSORS_ASB100=m +CONFIG_SENSORS_DS1621=m +CONFIG_SENSORS_FSCHER=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_IT87=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM77=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_LM83=m +CONFIG_SENSORS_LM85=m +CONFIG_SENSORS_LM90=m +CONFIG_SENSORS_MAX1619=m +CONFIG_SENSORS_VIA686A=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_W83L785TS=m +CONFIG_SENSORS_W83627HF=m + +# +# Other I2C Chip support +# +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_PCF8574=m +CONFIG_SENSORS_PCF8591=m +CONFIG_SENSORS_RTC8564=m +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set + +# +# Dallas's 1-wire bus +# +CONFIG_W1=m +CONFIG_W1_MATROX=m +CONFIG_W1_THERM=m + +# +# Misc devices +# +CONFIG_IBM_ASM=m + +# +# Multimedia devices +# +CONFIG_VIDEO_DEV=m + +# +# Video For Linux +# + +# +# Video Adapters +# +CONFIG_VIDEO_BT848=m +CONFIG_VIDEO_PMS=m +CONFIG_VIDEO_BWQCAM=m +CONFIG_VIDEO_CQCAM=m +CONFIG_VIDEO_W9966=m +CONFIG_VIDEO_CPIA=m +CONFIG_VIDEO_CPIA_PP=m +CONFIG_VIDEO_CPIA_USB=m +CONFIG_VIDEO_SAA5246A=m +CONFIG_VIDEO_SAA5249=m +CONFIG_TUNER_3036=m +CONFIG_VIDEO_STRADIS=m +# CONFIG_VIDEO_ZORAN is not set +# CONFIG_VIDEO_ZR36120 is not set +CONFIG_VIDEO_MEYE=m +CONFIG_VIDEO_SAA7134=m +CONFIG_VIDEO_MXB=m +CONFIG_VIDEO_DPC=m +CONFIG_VIDEO_HEXIUM_ORION=m +CONFIG_VIDEO_HEXIUM_GEMINI=m +CONFIG_VIDEO_CX88=m +CONFIG_VIDEO_OVCAMCHIP=m + +# +# Radio Adapters +# +CONFIG_RADIO_CADET=m +CONFIG_RADIO_RTRACK=m +CONFIG_RADIO_RTRACK2=m +CONFIG_RADIO_AZTECH=m +CONFIG_RADIO_GEMTEK=m +CONFIG_RADIO_GEMTEK_PCI=m +CONFIG_RADIO_MAXIRADIO=m +CONFIG_RADIO_MAESTRO=m +CONFIG_RADIO_MIROPCM20=m +CONFIG_RADIO_MIROPCM20_RDS=m +CONFIG_RADIO_SF16FMI=m +CONFIG_RADIO_SF16FMR2=m +CONFIG_RADIO_TERRATEC=m +CONFIG_RADIO_TRUST=m +CONFIG_RADIO_TYPHOON=m +CONFIG_RADIO_TYPHOON_PROC_FS=y +CONFIG_RADIO_ZOLTRIX=m + +# +# Digital Video Broadcasting Devices +# +CONFIG_DVB=y +CONFIG_DVB_CORE=m + +# +# Supported Frontend Modules +# +CONFIG_DVB_TWINHAN_DST=m +CONFIG_DVB_STV0299=m +CONFIG_DVB_SP887X=m +CONFIG_DVB_SP887X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/sc_main.mc" +CONFIG_DVB_ALPS_TDLB7=m +CONFIG_DVB_ALPS_TDMB7=m +CONFIG_DVB_ATMEL_AT76C651=m +CONFIG_DVB_CX24110=m +CONFIG_DVB_GRUNDIG_29504_491=m +CONFIG_DVB_GRUNDIG_29504_401=m +CONFIG_DVB_MT312=m +CONFIG_DVB_VES1820=m +CONFIG_DVB_VES1X93=m +CONFIG_DVB_TDA1004X=m +CONFIG_DVB_TDA1004X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/tda1004x.bin" +CONFIG_DVB_NXT6000=m + +# +# Supported SAA7146 based PCI Adapters +# +CONFIG_DVB_AV7110=m +# CONFIG_DVB_AV7110_OSD is not set +CONFIG_DVB_BUDGET=m +CONFIG_DVB_BUDGET_CI=m +CONFIG_DVB_BUDGET_AV=m +CONFIG_DVB_BUDGET_PATCH=m + +# +# Supported USB Adapters +# +CONFIG_DVB_TTUSB_BUDGET=m +CONFIG_DVB_TTUSB_DEC=m + +# +# Supported FlexCopII (B2C2) Adapters +# +CONFIG_DVB_B2C2_SKYSTAR=m + +# +# Supported BT878 Adapters +# +CONFIG_DVB_BT8XX=m +CONFIG_VIDEO_SAA7146=m +CONFIG_VIDEO_SAA7146_VV=m +CONFIG_VIDEO_VIDEOBUF=m +CONFIG_VIDEO_TUNER=m +CONFIG_VIDEO_BUF=m +CONFIG_VIDEO_BTCX=m +CONFIG_VIDEO_IR=m + +# +# Graphics support +# +CONFIG_FB=y +CONFIG_FB_CIRRUS=m +CONFIG_FB_PM2=m +CONFIG_FB_PM2_FIFO_DISCONNECT=y +CONFIG_FB_CYBER2000=m +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +CONFIG_FB_VGA16=m +CONFIG_FB_VESA=m +CONFIG_VIDEO_SELECT=y +CONFIG_FB_HGA=m +# CONFIG_FB_HGA_ACCEL is not set +CONFIG_FB_RIVA=m +CONFIG_FB_RIVA_I2C=y +CONFIG_FB_RIVA_DEBUG=y +CONFIG_FB_I810=m +# CONFIG_FB_I810_GTF is not set +CONFIG_FB_MATROX=m +CONFIG_FB_MATROX_MILLENIUM=y +CONFIG_FB_MATROX_MYSTIQUE=y +CONFIG_FB_MATROX_G450=y +CONFIG_FB_MATROX_G100=y +CONFIG_FB_MATROX_I2C=m +CONFIG_FB_MATROX_MAVEN=m +CONFIG_FB_MATROX_MULTIHEAD=y +CONFIG_FB_RADEON_OLD=m +CONFIG_FB_RADEON=m +CONFIG_FB_RADEON_I2C=y +# CONFIG_FB_RADEON_DEBUG is not set +CONFIG_FB_ATY128=m +CONFIG_FB_ATY=m +CONFIG_FB_ATY_CT=y +CONFIG_FB_ATY_GX=y +CONFIG_FB_ATY_XL_INIT=y +CONFIG_FB_SIS=m +CONFIG_FB_SIS_300=y +CONFIG_FB_SIS_315=y +CONFIG_FB_NEOMAGIC=m +CONFIG_FB_KYRO=m +CONFIG_FB_3DFX=m +# CONFIG_FB_3DFX_ACCEL is not set +CONFIG_FB_VOODOO1=m +CONFIG_FB_TRIDENT=m +# CONFIG_FB_TRIDENT_ACCEL is not set +# CONFIG_FB_PM3 is not set +CONFIG_FB_VIRTUAL=m + +# +# Console display driver support +# +CONFIG_VGA_CONSOLE=y +CONFIG_MDA_CONSOLE=m +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=m +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y + +# +# Logo configuration +# +# CONFIG_LOGO is not set + +# +# Sound +# +CONFIG_SOUND=m + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +CONFIG_SND_HWDEP=m +CONFIG_SND_RAWMIDI=m +CONFIG_SND_SEQUENCER=m +CONFIG_SND_SEQ_DUMMY=m +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=m +CONFIG_SND_PCM_OSS=m +CONFIG_SND_SEQUENCER_OSS=y +CONFIG_SND_RTCTIMER=m +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set + +# +# Generic devices +# +CONFIG_SND_MPU401_UART=m +CONFIG_SND_OPL3_LIB=m +CONFIG_SND_OPL4_LIB=m +CONFIG_SND_VX_LIB=m +CONFIG_SND_DUMMY=m +CONFIG_SND_VIRMIDI=m +CONFIG_SND_MTPAV=m +CONFIG_SND_SERIAL_U16550=m +CONFIG_SND_MPU401=m + +# +# ISA devices +# +CONFIG_SND_AD1816A=m +CONFIG_SND_AD1848=m +CONFIG_SND_CS4231=m +CONFIG_SND_CS4232=m +CONFIG_SND_CS4236=m +CONFIG_SND_ES968=m +CONFIG_SND_ES1688=m +CONFIG_SND_ES18XX=m +CONFIG_SND_GUSCLASSIC=m +CONFIG_SND_GUSEXTREME=m +CONFIG_SND_GUSMAX=m +CONFIG_SND_INTERWAVE=m +CONFIG_SND_INTERWAVE_STB=m +CONFIG_SND_OPTI92X_AD1848=m +CONFIG_SND_OPTI92X_CS4231=m +CONFIG_SND_OPTI93X=m +CONFIG_SND_SB8=m +CONFIG_SND_SB16=m +CONFIG_SND_SBAWE=m +CONFIG_SND_SB16_CSP=y +CONFIG_SND_WAVEFRONT=m +CONFIG_SND_ALS100=m +CONFIG_SND_AZT2320=m +CONFIG_SND_CMI8330=m +CONFIG_SND_DT019X=m +CONFIG_SND_OPL3SA2=m +CONFIG_SND_SGALAXY=m +CONFIG_SND_SSCAPE=m + +# +# PCI devices +# +CONFIG_SND_AC97_CODEC=m +CONFIG_SND_ALI5451=m +CONFIG_SND_ATIIXP=m +CONFIG_SND_AU8810=m +CONFIG_SND_AU8820=m +CONFIG_SND_AU8830=m +CONFIG_SND_AZT3328=m +CONFIG_SND_BT87X=m +CONFIG_SND_CS46XX=m +CONFIG_SND_CS46XX_NEW_DSP=y +CONFIG_SND_CS4281=m +CONFIG_SND_EMU10K1=m +CONFIG_SND_KORG1212=m +CONFIG_SND_MIXART=m +CONFIG_SND_NM256=m +CONFIG_SND_RME32=m +CONFIG_SND_RME96=m +CONFIG_SND_RME9652=m +CONFIG_SND_HDSP=m +CONFIG_SND_TRIDENT=m +CONFIG_SND_YMFPCI=m +CONFIG_SND_ALS4000=m +CONFIG_SND_CMIPCI=m +CONFIG_SND_ENS1370=m +CONFIG_SND_ENS1371=m +CONFIG_SND_ES1938=m +CONFIG_SND_ES1968=m +CONFIG_SND_MAESTRO3=m +CONFIG_SND_FM801=m +CONFIG_SND_FM801_TEA575X=m +CONFIG_SND_ICE1712=m +CONFIG_SND_ICE1724=m +CONFIG_SND_INTEL8X0=m +CONFIG_SND_INTEL8X0M=m +CONFIG_SND_SONICVIBES=m +CONFIG_SND_VIA82XX=m +CONFIG_SND_VX222=m + +# +# ALSA USB devices +# +CONFIG_SND_USB_AUDIO=m + +# +# PCMCIA devices +# +CONFIG_SND_VXPOCKET=m +CONFIG_SND_VXP440=m +CONFIG_SND_PDAUDIOCF=m + +# +# Open Sound System +# +CONFIG_SOUND_PRIME=m +CONFIG_SOUND_BT878=m +CONFIG_SOUND_CMPCI=m +# CONFIG_SOUND_CMPCI_FM is not set +# CONFIG_SOUND_CMPCI_MIDI is not set +CONFIG_SOUND_CMPCI_JOYSTICK=y +CONFIG_SOUND_EMU10K1=m +CONFIG_MIDI_EMU10K1=y +CONFIG_SOUND_FUSION=m +CONFIG_SOUND_CS4281=m +CONFIG_SOUND_ES1370=m +CONFIG_SOUND_ES1371=m +CONFIG_SOUND_ESSSOLO1=m +CONFIG_SOUND_MAESTRO=m +CONFIG_SOUND_MAESTRO3=m +CONFIG_SOUND_ICH=m +CONFIG_SOUND_SONICVIBES=m +CONFIG_SOUND_TRIDENT=m +# CONFIG_SOUND_MSNDCLAS is not set +# CONFIG_SOUND_MSNDPIN is not set +CONFIG_SOUND_VIA82CXXX=m +CONFIG_MIDI_VIA82CXXX=y +CONFIG_SOUND_OSS=m +# CONFIG_SOUND_TRACEINIT is not set +# CONFIG_SOUND_DMAP is not set +# CONFIG_SOUND_AD1816 is not set +CONFIG_SOUND_AD1889=m +CONFIG_SOUND_SGALAXY=m +CONFIG_SOUND_ADLIB=m +CONFIG_SOUND_ACI_MIXER=m +CONFIG_SOUND_CS4232=m +CONFIG_SOUND_SSCAPE=m +CONFIG_SOUND_GUS=m +CONFIG_SOUND_GUS16=y +CONFIG_SOUND_GUSMAX=y +CONFIG_SOUND_VMIDI=m +CONFIG_SOUND_TRIX=m +CONFIG_SOUND_MSS=m +CONFIG_SOUND_MPU401=m +CONFIG_SOUND_NM256=m +CONFIG_SOUND_MAD16=m +CONFIG_MAD16_OLDCARD=y +CONFIG_SOUND_PAS=m +CONFIG_SOUND_PSS=m +CONFIG_PSS_MIXER=y +CONFIG_SOUND_SB=m +# CONFIG_SOUND_AWE32_SYNTH is not set +CONFIG_SOUND_WAVEFRONT=m +CONFIG_SOUND_MAUI=m +CONFIG_SOUND_YM3812=m +CONFIG_SOUND_OPL3SA1=m +CONFIG_SOUND_OPL3SA2=m +CONFIG_SOUND_YMFPCI=m +# CONFIG_SOUND_YMFPCI_LEGACY is not set +CONFIG_SOUND_UART6850=m +CONFIG_SOUND_AEDSP16=m +CONFIG_SC6600=y +CONFIG_SC6600_JOY=y +CONFIG_SC6600_CDROM=4 +CONFIG_SC6600_CDROMBASE=0x0 +# CONFIG_AEDSP16_MSS is not set +# CONFIG_AEDSP16_SBPRO is not set +# CONFIG_AEDSP16_MPU401 is not set +CONFIG_SOUND_TVMIXER=m +CONFIG_SOUND_KAHLUA=m +CONFIG_SOUND_ALI5455=m +CONFIG_SOUND_FORTE=m +CONFIG_SOUND_RME96XX=m +CONFIG_SOUND_AD1980=m + +# +# USB support +# +CONFIG_USB=m +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +CONFIG_USB_BANDWIDTH=y +# CONFIG_USB_DYNAMIC_MINORS is not set + +# +# USB Host Controller Drivers +# +CONFIG_USB_EHCI_HCD=m +CONFIG_USB_EHCI_SPLIT_ISO=y +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_OHCI_HCD=m +CONFIG_USB_UHCI_HCD=m + +# +# USB Device Class drivers +# +CONFIG_USB_AUDIO=m + +# +# USB Bluetooth TTY can only be used with disabled Bluetooth subsystem +# +CONFIG_USB_MIDI=m +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +CONFIG_USB_STORAGE_RW_DETECT=y +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_DPCM=y +CONFIG_USB_STORAGE_HP8200e=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y + +# +# USB Human Interface Devices (HID) +# +CONFIG_USB_HID=m +CONFIG_USB_HIDINPUT=y +# CONFIG_HID_FF is not set +CONFIG_USB_HIDDEV=y + +# +# USB HID Boot Protocol drivers +# +CONFIG_USB_KBD=m +CONFIG_USB_MOUSE=m +CONFIG_USB_AIPTEK=m +CONFIG_USB_WACOM=m +CONFIG_USB_KBTAB=m +CONFIG_USB_POWERMATE=m +CONFIG_USB_MTOUCH=m +CONFIG_USB_EGALAX=m +CONFIG_USB_XPAD=m +CONFIG_USB_ATI_REMOTE=m + +# +# USB Imaging devices +# +CONFIG_USB_MDC800=m +CONFIG_USB_MICROTEK=m +CONFIG_USB_HPUSBSCSI=m + +# +# USB Multimedia devices +# +CONFIG_USB_VICAM=m +CONFIG_USB_DSBR=m +CONFIG_USB_IBMCAM=m +CONFIG_USB_KONICAWC=m +CONFIG_USB_OV511=m +CONFIG_USB_PWC=m +CONFIG_USB_SE401=m +CONFIG_USB_SN9C102=m +CONFIG_USB_STV680=m +CONFIG_USB_W9968CF=m + +# +# USB Network adaptors +# +CONFIG_USB_CATC=m +CONFIG_USB_KAWETH=m +CONFIG_USB_PEGASUS=m +CONFIG_USB_RTL8150=m +CONFIG_USB_USBNET=m + +# +# USB Host-to-Host Cables +# +CONFIG_USB_ALI_M5632=y +CONFIG_USB_AN2720=y +CONFIG_USB_BELKIN=y +CONFIG_USB_GENESYS=y +CONFIG_USB_NET1080=y +CONFIG_USB_PL2301=y + +# +# Intelligent USB Devices/Gadgets +# +CONFIG_USB_ARMLINUX=y +CONFIG_USB_EPSON2888=y +CONFIG_USB_ZAURUS=y +CONFIG_USB_CDCETHER=y + +# +# USB Network Adapters +# +CONFIG_USB_AX8817X=y + +# +# USB port drivers +# +CONFIG_USB_USS720=m + +# +# USB Serial Converter support +# +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_BELKIN=m +CONFIG_USB_SERIAL_WHITEHEAT=m +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m +CONFIG_USB_SERIAL_EMPEG=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_VISOR=m +CONFIG_USB_SERIAL_IPAQ=m +CONFIG_USB_SERIAL_IR=m +CONFIG_USB_SERIAL_EDGEPORT=m +CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_KEYSPAN_PDA=m +CONFIG_USB_SERIAL_KEYSPAN=m +CONFIG_USB_SERIAL_KLSI=m +CONFIG_USB_SERIAL_KOBIL_SCT=m +CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_SAFE=m +# CONFIG_USB_SERIAL_SAFE_PADDED is not set +CONFIG_USB_SERIAL_CYBERJACK=m +CONFIG_USB_SERIAL_XIRCOM=m +CONFIG_USB_SERIAL_OMNINET=m +CONFIG_USB_EZUSB=y + +# +# USB Miscellaneous drivers +# +CONFIG_USB_TIGL=m +CONFIG_USB_AUERSWALD=m +CONFIG_USB_RIO500=m +CONFIG_USB_LEGOTOWER=m +CONFIG_USB_LCD=m +CONFIG_USB_LED=m +CONFIG_USB_CYTHERM=m +CONFIG_USB_SPEEDTOUCH=m +CONFIG_USB_PHIDGETSERVO=m +CONFIG_USB_TEST=m +CONFIG_USB_EAGLE=m + +# +# USB Gadget Support +# +CONFIG_USB_GADGET=m +CONFIG_USB_GADGET_NET2280=y +CONFIG_USB_NET2280=m +# CONFIG_USB_GADGET_PXA2XX is not set +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_SA1100 is not set +# CONFIG_USB_GADGET_DUMMY_HCD is not set +CONFIG_USB_GADGET_DUALSPEED=y +CONFIG_USB_ZERO=m +CONFIG_USB_ETH=m +CONFIG_USB_ETH_RNDIS=y +CONFIG_USB_GADGETFS=m +CONFIG_USB_FILE_STORAGE=m +# CONFIG_USB_FILE_STORAGE_TEST is not set +CONFIG_USB_G_SERIAL=m + +# +# File systems +# +CONFIG_EXT2_FS=m +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_POSIX_ACL=y +CONFIG_EXT2_FS_SECURITY=y +CONFIG_EXT3_FS=m +CONFIG_EXT3_FS_XATTR=y +CONFIG_EXT3_FS_POSIX_ACL=y +CONFIG_EXT3_FS_SECURITY=y +CONFIG_JBD=m +# CONFIG_JBD_DEBUG is not set +CONFIG_FS_MBCACHE=m +CONFIG_REISERFS_FS=m +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +# CONFIG_REISERFS_FS_XATTR is not set +CONFIG_JFS_FS=m +CONFIG_JFS_POSIX_ACL=y +# CONFIG_JFS_DEBUG is not set +CONFIG_JFS_STATISTICS=y +CONFIG_FS_POSIX_ACL=y +CONFIG_XFS_FS=m +CONFIG_XFS_RT=y +CONFIG_XFS_QUOTA=y +CONFIG_XFS_SECURITY=y +CONFIG_XFS_POSIX_ACL=y +CONFIG_MINIX_FS=m +CONFIG_ROMFS_FS=m +CONFIG_QUOTA=y +CONFIG_QFMT_V1=m +CONFIG_QFMT_V2=m +CONFIG_QUOTACTL=y +CONFIG_AUTOFS_FS=m +CONFIG_AUTOFS4_FS=m + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=m +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_ZISOFS_FS=m +CONFIG_UDF_FS=m +CONFIG_UDF_NLS=y + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +CONFIG_NTFS_FS=m +# CONFIG_NTFS_DEBUG is not set +# CONFIG_NTFS_RW is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_SYSFS=y +CONFIG_DEVFS_FS=y +# CONFIG_DEVFS_MOUNT is not set +# CONFIG_DEVFS_DEBUG is not set +CONFIG_DEVPTS_FS_XATTR=y +CONFIG_DEVPTS_FS_SECURITY=y +CONFIG_TMPFS=y +# CONFIG_HUGETLBFS is not set +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y + +# +# Miscellaneous filesystems +# +CONFIG_ADFS_FS=m +# CONFIG_ADFS_FS_RW is not set +CONFIG_AFFS_FS=m +CONFIG_ASFS_FS=m +# CONFIG_ASFS_RW is not set +CONFIG_HFS_FS=m +CONFIG_HFSPLUS_FS=m +CONFIG_BEFS_FS=m +# CONFIG_BEFS_DEBUG is not set +CONFIG_BFS_FS=m +CONFIG_EFS_FS=m +CONFIG_JFFS_FS=m +CONFIG_JFFS_FS_VERBOSE=0 +CONFIG_JFFS_PROC_FS=y +CONFIG_JFFS2_FS=m +CONFIG_JFFS2_FS_DEBUG=0 +# CONFIG_JFFS2_FS_NAND is not set +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set +CONFIG_JFFS2_ZLIB=y +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +CONFIG_CRAMFS=y +CONFIG_VXFS_FS=m +CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +# CONFIG_QNX4FS_RW is not set +CONFIG_SYSV_FS=m +CONFIG_UFS_FS=m +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=m +CONFIG_NFS_V3=y +CONFIG_NFS_V4=y +CONFIG_NFS_DIRECTIO=y +CONFIG_NFSD=m +CONFIG_NFSD_V3=y +CONFIG_NFSD_V4=y +CONFIG_NFSD_TCP=y +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=m +CONFIG_SUNRPC=m +CONFIG_SUNRPC_GSS=m +CONFIG_RPCSEC_GSS_KRB5=m +CONFIG_SMB_FS=m +# CONFIG_SMB_NLS_DEFAULT is not set +CONFIG_CIFS=m +# CONFIG_CIFS_STATS is not set +# CONFIG_CIFS_XATTR is not set +# CONFIG_CIFS_POSIX is not set +CONFIG_NCP_FS=m +CONFIG_NCPFS_PACKET_SIGNING=y +CONFIG_NCPFS_IOCTL_LOCKING=y +CONFIG_NCPFS_STRONG=y +CONFIG_NCPFS_NFS_NS=y +CONFIG_NCPFS_OS2_NS=y +# CONFIG_NCPFS_SMALLDOS is not set +CONFIG_NCPFS_NLS=y +CONFIG_NCPFS_EXTRAS=y +CONFIG_CODA_FS=m +# CONFIG_CODA_FS_OLD_API is not set +CONFIG_AFS_FS=m +CONFIG_RXRPC=m + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +CONFIG_ACORN_PARTITION=y +CONFIG_ACORN_PARTITION_CUMANA=y +# CONFIG_ACORN_PARTITION_EESOX is not set +CONFIG_ACORN_PARTITION_ICS=y +# CONFIG_ACORN_PARTITION_ADFS is not set +# CONFIG_ACORN_PARTITION_POWERTEC is not set +CONFIG_ACORN_PARTITION_RISCIX=y +CONFIG_OSF_PARTITION=y +CONFIG_AMIGA_PARTITION=y +CONFIG_ATARI_PARTITION=y +CONFIG_MAC_PARTITION=y +CONFIG_MSDOS_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_LDM_PARTITION=y +# CONFIG_LDM_DEBUG is not set +CONFIG_SGI_PARTITION=y +CONFIG_ULTRIX_PARTITION=y +CONFIG_SUN_PARTITION=y +# CONFIG_EFI_PARTITION is not set + +# +# Native Language Support +# +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="cp437" +CONFIG_NLS_CODEPAGE_437=m +CONFIG_NLS_CODEPAGE_737=m +CONFIG_NLS_CODEPAGE_775=m +CONFIG_NLS_CODEPAGE_850=m +CONFIG_NLS_CODEPAGE_852=m +CONFIG_NLS_CODEPAGE_855=m +CONFIG_NLS_CODEPAGE_857=m +CONFIG_NLS_CODEPAGE_860=m +CONFIG_NLS_CODEPAGE_861=m +CONFIG_NLS_CODEPAGE_862=m +CONFIG_NLS_CODEPAGE_863=m +CONFIG_NLS_CODEPAGE_864=m +CONFIG_NLS_CODEPAGE_865=m +CONFIG_NLS_CODEPAGE_866=m +CONFIG_NLS_CODEPAGE_869=m +CONFIG_NLS_CODEPAGE_936=m +CONFIG_NLS_CODEPAGE_950=m +CONFIG_NLS_CODEPAGE_932=m +CONFIG_NLS_CODEPAGE_949=m +CONFIG_NLS_CODEPAGE_874=m +CONFIG_NLS_ISO8859_8=m +CONFIG_NLS_CODEPAGE_1250=m +CONFIG_NLS_CODEPAGE_1251=m +CONFIG_NLS_ASCII=m +CONFIG_NLS_ISO8859_1=m +CONFIG_NLS_ISO8859_2=m +CONFIG_NLS_ISO8859_3=m +CONFIG_NLS_ISO8859_4=m +CONFIG_NLS_ISO8859_5=m +CONFIG_NLS_ISO8859_6=m +CONFIG_NLS_ISO8859_7=m +CONFIG_NLS_ISO8859_9=m +CONFIG_NLS_ISO8859_13=m +CONFIG_NLS_ISO8859_14=m +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_KOI8_R=m +CONFIG_NLS_KOI8_U=m +CONFIG_NLS_UTF8=m + +# +# Profiling support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=m + +# +# Kernel hacking +# +CONFIG_DEBUG_KERNEL=y +# CONFIG_EARLY_PRINTK is not set +# CONFIG_DEBUG_STACKOVERFLOW is not set +# CONFIG_DEBUG_STACK_USAGE is not set +# CONFIG_DEBUG_SLAB is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_DEBUG_HIGHMEM is not set +# CONFIG_DEBUG_INFO is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_FRAME_POINTER is not set +# CONFIG_4KSTACKS is not set +CONFIG_X86_FIND_SMP_CONFIG=y +CONFIG_X86_MPPARSE=y + +# +# Security options +# +CONFIG_SECURITY=y +# CONFIG_SECURITY_NETWORK is not set +CONFIG_SECURITY_CAPABILITIES=m +CONFIG_SECURITY_ROOTPLUG=m +# CONFIG_SECURITY_SELINUX is not set + +# +# Cryptographic options +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_SHA1=m +CONFIG_CRYPTO_SHA256=m +CONFIG_CRYPTO_SHA512=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_AES_586=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +# CONFIG_CRYPTO_TEA is not set +CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_KHAZAD=m +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_MICHAEL_MIC=m +CONFIG_CRYPTO_CRC32C=m +CONFIG_CRYPTO_TEST=m + +# +# Library routines +# +CONFIG_CRC_CCITT=m +CONFIG_CRC32=m +CONFIG_LIBCRC32C=m +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=m +CONFIG_X86_BIOS_REBOOT=y --- linux-source-2.6.8.1-2.6.8.1.orig/debian/config/i386/k7-smp +++ linux-source-2.6.8.1-2.6.8.1/debian/config/i386/k7-smp @@ -0,0 +1,2825 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_X86=y +CONFIG_MMU=y +CONFIG_UID16=y +CONFIG_GENERIC_ISA_DMA=y + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +# CONFIG_CLEAN_COMPILE is not set +CONFIG_BROKEN=y +CONFIG_BROKEN_ON_SMP=y + +# +# General setup +# +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_BSD_PROCESS_ACCT=y +# CONFIG_BSD_PROCESS_ACCT_V3 is not set +CONFIG_SYSCTL=y +# CONFIG_AUDIT is not set +CONFIG_LOG_BUF_SHIFT=15 +CONFIG_HOTPLUG=y +# CONFIG_IKCONFIG is not set +CONFIG_EMBEDDED=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_OBSOLETE_MODPARM=y +CONFIG_MODVERSIONS=y +CONFIG_KMOD=y +CONFIG_STOP_MACHINE=y + +# +# Processor type and features +# +CONFIG_X86_PC=y +# CONFIG_X86_ELAN is not set +# CONFIG_X86_VOYAGER is not set +# CONFIG_X86_NUMAQ is not set +# CONFIG_X86_SUMMIT is not set +# CONFIG_X86_BIGSMP is not set +# CONFIG_X86_VISWS is not set +# CONFIG_X86_GENERICARCH is not set +# CONFIG_X86_ES7000 is not set +# CONFIG_M386 is not set +# CONFIG_M486 is not set +# CONFIG_M586 is not set +# CONFIG_M586TSC is not set +# CONFIG_M586MMX is not set +# CONFIG_M686 is not set +# CONFIG_MPENTIUMII is not set +# CONFIG_MPENTIUMIII is not set +# CONFIG_MPENTIUMM is not set +# CONFIG_MPENTIUM4 is not set +# CONFIG_MK6 is not set +CONFIG_MK7=y +# CONFIG_MK8 is not set +# CONFIG_MCRUSOE is not set +# CONFIG_MWINCHIPC6 is not set +# CONFIG_MWINCHIP2 is not set +# CONFIG_MWINCHIP3D is not set +# CONFIG_MCYRIXIII is not set +# CONFIG_MVIAC3_2 is not set +# CONFIG_X86_GENERIC is not set +CONFIG_X86_CMPXCHG=y +CONFIG_X86_XADD=y +CONFIG_X86_L1_CACHE_SHIFT=6 +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_X86_WP_WORKS_OK=y +CONFIG_X86_INVLPG=y +CONFIG_X86_BSWAP=y +CONFIG_X86_POPAD_OK=y +CONFIG_X86_GOOD_APIC=y +CONFIG_X86_INTEL_USERCOPY=y +CONFIG_X86_USE_PPRO_CHECKSUM=y +CONFIG_X86_USE_3DNOW=y +CONFIG_HPET_TIMER=y +CONFIG_SMP=y +CONFIG_NR_CPUS=8 +CONFIG_SCHED_SMT=y +CONFIG_PREEMPT=y +CONFIG_X86_LOCAL_APIC=y +CONFIG_X86_IO_APIC=y +CONFIG_X86_TSC=y +CONFIG_X86_MCE=y +CONFIG_X86_MCE_NONFATAL=m +CONFIG_X86_MCE_P4THERMAL=y +CONFIG_TOSHIBA=m +CONFIG_I8K=m +CONFIG_MICROCODE=m +CONFIG_X86_MSR=m +CONFIG_X86_CPUID=m + +# +# Firmware Drivers +# +CONFIG_EDD=m +# CONFIG_NOHIGHMEM is not set +CONFIG_HIGHMEM4G=y +# CONFIG_HIGHMEM64G is not set +CONFIG_HIGHMEM=y +# CONFIG_HIGHPTE is not set +# CONFIG_MATH_EMULATION is not set +CONFIG_MTRR=y +# CONFIG_EFI is not set +# CONFIG_IRQBALANCE is not set +CONFIG_HAVE_DEC_LOCK=y +# CONFIG_REGPARM is not set + +# +# Power management options (ACPI, APM) +# +CONFIG_PM=y +# CONFIG_SOFTWARE_SUSPEND is not set +# CONFIG_PM_DISK is not set + +# +# ACPI (Advanced Configuration and Power Interface) Support +# +CONFIG_ACPI=y +CONFIG_ACPI_BOOT=y +CONFIG_ACPI_INTERPRETER=y +CONFIG_ACPI_SLEEP=y +CONFIG_ACPI_SLEEP_PROC_FS=y +CONFIG_ACPI_AC=m +CONFIG_ACPI_BATTERY=m +CONFIG_ACPI_BUTTON=m +CONFIG_ACPI_FAN=m +CONFIG_ACPI_PROCESSOR=m +CONFIG_ACPI_THERMAL=m +CONFIG_ACPI_ASUS=m +CONFIG_ACPI_TOSHIBA=m +# CONFIG_ACPI_DEBUG is not set +CONFIG_ACPI_BUS=y +CONFIG_ACPI_EC=y +CONFIG_ACPI_POWER=y +CONFIG_ACPI_PCI=y +CONFIG_ACPI_SYSTEM=y +CONFIG_X86_PM_TIMER=y + +# +# APM (Advanced Power Management) BIOS Support +# +CONFIG_APM=m +# CONFIG_APM_IGNORE_USER_SUSPEND is not set +# CONFIG_APM_DO_ENABLE is not set +# CONFIG_APM_CPU_IDLE is not set +# CONFIG_APM_DISPLAY_BLANK is not set +# CONFIG_APM_RTC_IS_GMT is not set +# CONFIG_APM_ALLOW_INTS is not set +# CONFIG_APM_REAL_MODE_POWER_OFF is not set + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_PROC_INTF=m +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=m +CONFIG_CPU_FREQ_GOV_USERSPACE=m +# CONFIG_CPU_FREQ_24_API is not set +CONFIG_CPU_FREQ_TABLE=m + +# +# CPUFreq processor drivers +# +CONFIG_X86_ACPI_CPUFREQ=m +# CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set +CONFIG_X86_POWERNOW_K6=m +CONFIG_X86_POWERNOW_K7=m +CONFIG_X86_POWERNOW_K8=m +CONFIG_X86_GX_SUSPMOD=m +CONFIG_X86_SPEEDSTEP_CENTRINO=m +CONFIG_X86_SPEEDSTEP_CENTRINO_TABLE=y +CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI=y +CONFIG_X86_SPEEDSTEP_ICH=m +CONFIG_X86_SPEEDSTEP_SMI=m +CONFIG_X86_P4_CLOCKMOD=m +CONFIG_X86_SPEEDSTEP_LIB=m +CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK=y +CONFIG_X86_LONGRUN=m +CONFIG_X86_LONGHAUL=m + +# +# Bus options (PCI, PCMCIA, EISA, MCA, ISA) +# +CONFIG_PCI=y +# CONFIG_PCI_GOBIOS is not set +# CONFIG_PCI_GOMMCONFIG is not set +# CONFIG_PCI_GODIRECT is not set +CONFIG_PCI_GOANY=y +CONFIG_PCI_BIOS=y +CONFIG_PCI_DIRECT=y +CONFIG_PCI_MMCONFIG=y +CONFIG_PCI_MSI=y +# CONFIG_PCI_LEGACY_PROC is not set +CONFIG_PCI_NAMES=y +CONFIG_ISA=y +# CONFIG_EISA is not set +# CONFIG_MCA is not set +CONFIG_SCx200=m + +# +# PCMCIA/CardBus support +# +CONFIG_PCMCIA=m +# CONFIG_PCMCIA_DEBUG is not set +CONFIG_YENTA=m +CONFIG_CARDBUS=y +CONFIG_PD6729=m +CONFIG_I82092=m +CONFIG_I82365=m +CONFIG_TCIC=m +CONFIG_PCMCIA_PROBE=y + +# +# PCI Hotplug Support +# +CONFIG_HOTPLUG_PCI=m +CONFIG_HOTPLUG_PCI_FAKE=m +CONFIG_HOTPLUG_PCI_COMPAQ=m +# CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM is not set +CONFIG_HOTPLUG_PCI_IBM=m +CONFIG_HOTPLUG_PCI_ACPI=m +CONFIG_HOTPLUG_PCI_CPCI=y +CONFIG_HOTPLUG_PCI_CPCI_ZT5550=m +CONFIG_HOTPLUG_PCI_CPCI_GENERIC=m +CONFIG_HOTPLUG_PCI_PCIE=m +# CONFIG_HOTPLUG_PCI_PCIE_POLL_EVENT_MODE is not set +CONFIG_HOTPLUG_PCI_SHPC=m +# CONFIG_HOTPLUG_PCI_SHPC_POLL_EVENT_MODE is not set + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_AOUT=m +CONFIG_BINFMT_MISC=m + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=m +# CONFIG_DEBUG_DRIVER is not set + +# +# Memory Technology Devices (MTD) +# +CONFIG_MTD=m +# CONFIG_MTD_DEBUG is not set +CONFIG_MTD_PARTITIONS=y +CONFIG_MTD_CONCAT=m +CONFIG_MTD_REDBOOT_PARTS=m +# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set +# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set +# CONFIG_MTD_CMDLINE_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=m +CONFIG_MTD_BLOCK=m +CONFIG_MTD_BLOCK_RO=m +CONFIG_FTL=m +CONFIG_NFTL=m +CONFIG_NFTL_RW=y +CONFIG_INFTL=m + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=m +CONFIG_MTD_JEDECPROBE=m +CONFIG_MTD_GEN_PROBE=m +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +CONFIG_MTD_CFI_INTELEXT=m +CONFIG_MTD_CFI_AMDSTD=m +CONFIG_MTD_CFI_AMDSTD_RETRY=0 +CONFIG_MTD_CFI_STAA=m +CONFIG_MTD_CFI_UTIL=m +CONFIG_MTD_RAM=m +CONFIG_MTD_ROM=m +CONFIG_MTD_ABSENT=m +# CONFIG_MTD_OBSOLETE_CHIPS is not set + +# +# Mapping drivers for chip access +# +CONFIG_MTD_COMPLEX_MAPPINGS=y +CONFIG_MTD_PHYSMAP=m +CONFIG_MTD_PHYSMAP_START=0x8000000 +CONFIG_MTD_PHYSMAP_LEN=0x4000000 +CONFIG_MTD_PHYSMAP_BANKWIDTH=2 +CONFIG_MTD_PNC2000=m +CONFIG_MTD_SC520CDP=m +CONFIG_MTD_NETSC520=m +CONFIG_MTD_SBC_GXX=m +CONFIG_MTD_ELAN_104NC=m +CONFIG_MTD_SCx200_DOCFLASH=m +# CONFIG_MTD_AMD76XROM is not set +# CONFIG_MTD_ICHXROM is not set +# CONFIG_MTD_SCB2_FLASH is not set +CONFIG_MTD_NETtel=m +CONFIG_MTD_DILNETPC=m +CONFIG_MTD_DILNETPC_BOOTSIZE=0x80000 +# CONFIG_MTD_L440GX is not set +CONFIG_MTD_PCI=m +# CONFIG_MTD_PCMCIA is not set + +# +# Self-contained MTD device drivers +# +CONFIG_MTD_PMC551=m +# CONFIG_MTD_PMC551_BUGFIX is not set +# CONFIG_MTD_PMC551_DEBUG is not set +CONFIG_MTD_SLRAM=m +CONFIG_MTD_PHRAM=m +CONFIG_MTD_MTDRAM=m +CONFIG_MTDRAM_TOTAL_SIZE=4096 +CONFIG_MTDRAM_ERASE_SIZE=128 +CONFIG_MTD_BLKMTD=m + +# +# Disk-On-Chip Device Drivers +# +CONFIG_MTD_DOC2000=m +CONFIG_MTD_DOC2001=m +CONFIG_MTD_DOC2001PLUS=m +CONFIG_MTD_DOCPROBE=m +CONFIG_MTD_DOCECC=m +# CONFIG_MTD_DOCPROBE_ADVANCED is not set +CONFIG_MTD_DOCPROBE_ADDRESS=0 + +# +# NAND Flash Device Drivers +# +CONFIG_MTD_NAND=m +# CONFIG_MTD_NAND_VERIFY_WRITE is not set +CONFIG_MTD_NAND_IDS=m +CONFIG_MTD_NAND_DISKONCHIP=m +# CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set +CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0 +# CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE is not set + +# +# Parallel port support +# +CONFIG_PARPORT=m +CONFIG_PARPORT_PC=m +CONFIG_PARPORT_PC_CML1=m +CONFIG_PARPORT_SERIAL=m +CONFIG_PARPORT_PC_FIFO=y +# CONFIG_PARPORT_PC_SUPERIO is not set +CONFIG_PARPORT_PC_PCMCIA=m +# CONFIG_PARPORT_OTHER is not set +CONFIG_PARPORT_1284=y + +# +# Plug and Play support +# +CONFIG_PNP=y +# CONFIG_PNP_DEBUG is not set + +# +# Protocols +# +CONFIG_ISAPNP=y +CONFIG_PNPBIOS=y +CONFIG_PNPBIOS_PROC_FS=y + +# +# Block devices +# +CONFIG_BLK_DEV_FD=m +CONFIG_BLK_DEV_XD=m +CONFIG_PARIDE=m +CONFIG_PARIDE_PARPORT=m + +# +# Parallel IDE high-level drivers +# +CONFIG_PARIDE_PD=m +CONFIG_PARIDE_PCD=m +CONFIG_PARIDE_PF=m +CONFIG_PARIDE_PT=m +CONFIG_PARIDE_PG=m + +# +# Parallel IDE protocol modules +# +CONFIG_PARIDE_ATEN=m +CONFIG_PARIDE_BPCK=m +CONFIG_PARIDE_BPCK6=m +CONFIG_PARIDE_COMM=m +CONFIG_PARIDE_DSTR=m +CONFIG_PARIDE_FIT2=m +CONFIG_PARIDE_FIT3=m +CONFIG_PARIDE_EPAT=m +# CONFIG_PARIDE_EPATC8 is not set +CONFIG_PARIDE_EPIA=m +CONFIG_PARIDE_FRIQ=m +CONFIG_PARIDE_FRPW=m +CONFIG_PARIDE_KBIC=m +CONFIG_PARIDE_KTTI=m +CONFIG_PARIDE_ON20=m +CONFIG_PARIDE_ON26=m +CONFIG_BLK_CPQ_DA=m +CONFIG_BLK_CPQ_CISS_DA=m +CONFIG_CISS_SCSI_TAPE=y +CONFIG_BLK_DEV_DAC960=m +CONFIG_BLK_DEV_UMEM=m +CONFIG_BLK_DEV_LOOP=m +CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_SX8=m +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_BLK_DEV_INITRD=y +CONFIG_LBD=y + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=m +CONFIG_BLK_DEV_IDE=m + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_IDE_SATA is not set +# CONFIG_BLK_DEV_HD_IDE is not set +CONFIG_BLK_DEV_IDEDISK=m +# CONFIG_IDEDISK_MULTI_MODE is not set +CONFIG_BLK_DEV_IDECS=m +CONFIG_BLK_DEV_IDECD=m +CONFIG_BLK_DEV_IDETAPE=m +CONFIG_BLK_DEV_IDEFLOPPY=m +CONFIG_BLK_DEV_IDESCSI=m +# CONFIG_IDE_TASK_IOCTL is not set +CONFIG_IDE_TASKFILE_IO=y + +# +# IDE chipset support/bugfixes +# +CONFIG_IDE_GENERIC=m +CONFIG_BLK_DEV_CMD640=y +# CONFIG_BLK_DEV_CMD640_ENHANCED is not set +CONFIG_BLK_DEV_IDEPNP=m +CONFIG_BLK_DEV_IDEPCI=y +CONFIG_IDEPCI_SHARE_IRQ=y +# CONFIG_BLK_DEV_OFFBOARD is not set +CONFIG_BLK_DEV_GENERIC=m +CONFIG_BLK_DEV_OPTI621=m +CONFIG_BLK_DEV_RZ1000=m +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +CONFIG_IDEDMA_PCI_AUTO=y +# CONFIG_IDEDMA_ONLYDISK is not set +CONFIG_BLK_DEV_ADMA=y +CONFIG_BLK_DEV_AEC62XX=m +CONFIG_BLK_DEV_ALI15X3=m +# CONFIG_WDC_ALI15X3 is not set +CONFIG_BLK_DEV_AMD74XX=m +CONFIG_BLK_DEV_ATIIXP=m +CONFIG_BLK_DEV_CMD64X=m +CONFIG_BLK_DEV_TRIFLEX=m +CONFIG_BLK_DEV_CY82C693=m +CONFIG_BLK_DEV_CS5520=m +CONFIG_BLK_DEV_CS5530=m +CONFIG_BLK_DEV_HPT34X=m +# CONFIG_HPT34X_AUTODMA is not set +CONFIG_BLK_DEV_HPT366=m +CONFIG_BLK_DEV_SC1200=m +CONFIG_BLK_DEV_PIIX=m +CONFIG_BLK_DEV_NS87415=m +CONFIG_BLK_DEV_PDC202XX_OLD=m +CONFIG_PDC202XX_BURST=y +CONFIG_BLK_DEV_PDC202XX_NEW=m +CONFIG_PDC202XX_FORCE=y +CONFIG_BLK_DEV_SVWKS=m +CONFIG_BLK_DEV_SIIMAGE=m +CONFIG_BLK_DEV_SIS5513=m +CONFIG_BLK_DEV_SLC90E66=m +CONFIG_BLK_DEV_TRM290=m +CONFIG_BLK_DEV_VIA82CXXX=m +# CONFIG_IDE_ARM is not set +# CONFIG_IDE_CHIPSETS is not set +CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_IVB is not set +CONFIG_IDEDMA_AUTO=y +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +CONFIG_SCSI=m +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +CONFIG_CHR_DEV_ST=m +CONFIG_CHR_DEV_OSST=m +CONFIG_BLK_DEV_SR=m +# CONFIG_BLK_DEV_SR_VENDOR is not set +CONFIG_CHR_DEV_SG=m +CONFIG_CHR_DEV_SCH=m + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y + +# +# SCSI Transport Attributes +# +CONFIG_SCSI_SPI_ATTRS=m +CONFIG_SCSI_FC_ATTRS=m + +# +# SCSI low-level drivers +# +CONFIG_BLK_DEV_3W_XXXX_RAID=m +CONFIG_SCSI_3W_9XXX=m +CONFIG_SCSI_7000FASST=m +CONFIG_SCSI_ACARD=m +CONFIG_SCSI_AHA152X=m +CONFIG_SCSI_AHA1542=m +CONFIG_SCSI_AACRAID=m +CONFIG_SCSI_AIC7XXX=m +CONFIG_AIC7XXX_CMDS_PER_DEVICE=8 +CONFIG_AIC7XXX_RESET_DELAY_MS=15000 +# CONFIG_AIC7XXX_BUILD_FIRMWARE is not set +CONFIG_AIC7XXX_DEBUG_ENABLE=y +CONFIG_AIC7XXX_DEBUG_MASK=0 +CONFIG_AIC7XXX_REG_PRETTY_PRINT=y +CONFIG_SCSI_AIC7XXX_OLD=m +CONFIG_SCSI_AIC79XX=m +CONFIG_AIC79XX_CMDS_PER_DEVICE=32 +CONFIG_AIC79XX_RESET_DELAY_MS=15000 +# CONFIG_AIC79XX_BUILD_FIRMWARE is not set +CONFIG_AIC79XX_ENABLE_RD_STRM=y +CONFIG_AIC79XX_DEBUG_ENABLE=y +CONFIG_AIC79XX_DEBUG_MASK=0 +CONFIG_AIC79XX_REG_PRETTY_PRINT=y +CONFIG_SCSI_DPT_I2O=m +CONFIG_SCSI_ADVANSYS=m +CONFIG_SCSI_IN2000=m +CONFIG_SCSI_MEGARAID=m +CONFIG_SCSI_SATA=y +CONFIG_SCSI_SATA_SVW=m +CONFIG_SCSI_ATA_PIIX=m +CONFIG_SCSI_SATA_NV=m +CONFIG_SCSI_SATA_PROMISE=m +CONFIG_SCSI_SATA_SX4=m +CONFIG_SCSI_SATA_SIL=m +CONFIG_SCSI_SATA_SIS=m +CONFIG_SCSI_SATA_VIA=m +CONFIG_SCSI_SATA_VITESSE=m +CONFIG_SCSI_BUSLOGIC=m +# CONFIG_SCSI_OMIT_FLASHPOINT is not set +# CONFIG_SCSI_CPQFCTS is not set +CONFIG_SCSI_DMX3191D=m +CONFIG_SCSI_DTC3280=m +CONFIG_SCSI_EATA=m +CONFIG_SCSI_EATA_TAGGED_QUEUE=y +CONFIG_SCSI_EATA_LINKED_COMMANDS=y +CONFIG_SCSI_EATA_MAX_TAGS=16 +CONFIG_SCSI_EATA_PIO=m +CONFIG_SCSI_FUTURE_DOMAIN=m +CONFIG_SCSI_GDTH=m +CONFIG_SCSI_GENERIC_NCR5380=m +CONFIG_SCSI_GENERIC_NCR5380_MMIO=m +CONFIG_SCSI_GENERIC_NCR53C400=y +CONFIG_SCSI_IPS=m +# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_INIA100 is not set +CONFIG_SCSI_PPA=m +CONFIG_SCSI_IMM=m +# CONFIG_SCSI_IZIP_EPP16 is not set +# CONFIG_SCSI_IZIP_SLOW_CTR is not set +CONFIG_SCSI_NCR53C406A=m +CONFIG_SCSI_SYM53C8XX_2=m +CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 +CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 +CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 +# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set +CONFIG_SCSI_IPR=m +# CONFIG_SCSI_IPR_TRACE is not set +# CONFIG_SCSI_IPR_DUMP is not set +CONFIG_SCSI_PAS16=m +# CONFIG_SCSI_PCI2000 is not set +# CONFIG_SCSI_PCI2220I is not set +CONFIG_SCSI_PSI240I=m +CONFIG_SCSI_QLOGIC_FAS=m +CONFIG_SCSI_QLOGIC_ISP=m +CONFIG_SCSI_QLOGIC_FC=m +CONFIG_SCSI_QLOGIC_FC_FIRMWARE=y +CONFIG_SCSI_QLOGIC_1280=m +# CONFIG_SCSI_SEAGATE is not set +CONFIG_SCSI_SYM53C416=m +CONFIG_SCSI_DC395x=m +CONFIG_SCSI_DC390T=m +CONFIG_SCSI_T128=m +CONFIG_SCSI_U14_34F=m +CONFIG_SCSI_U14_34F_TAGGED_QUEUE=y +CONFIG_SCSI_U14_34F_LINKED_COMMANDS=y +CONFIG_SCSI_U14_34F_MAX_TAGS=8 +CONFIG_SCSI_ULTRASTOR=m +CONFIG_SCSI_NSP32=m +CONFIG_SCSI_DEBUG=m + +# +# PCMCIA SCSI adapter support +# +CONFIG_PCMCIA_AHA152X=m +CONFIG_PCMCIA_FDOMAIN=m +CONFIG_PCMCIA_NINJA_SCSI=m +CONFIG_PCMCIA_QLOGIC=m +CONFIG_PCMCIA_SYM53C500=m + +# +# Old CD-ROM drivers (not SCSI, not IDE) +# +CONFIG_CD_NO_IDESCSI=y +CONFIG_AZTCD=m +CONFIG_GSCD=m +# CONFIG_SBPCD is not set +CONFIG_MCD=m +CONFIG_MCD_IRQ=11 +CONFIG_MCD_BASE=0x300 +CONFIG_MCDX=m +CONFIG_OPTCD=m +# CONFIG_CM206 is not set +CONFIG_SJCD=m +CONFIG_ISP16_CDI=m +# CONFIG_CDU31A is not set +CONFIG_CDU535=m + +# +# Multi-device support (RAID and LVM) +# +CONFIG_MD=y +CONFIG_BLK_DEV_MD=m +CONFIG_MD_LINEAR=m +CONFIG_MD_RAID0=m +CONFIG_MD_RAID1=m +CONFIG_MD_RAID5=m +CONFIG_MD_RAID6=m +CONFIG_MD_MULTIPATH=m +CONFIG_BLK_DEV_DM=m +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=m +CONFIG_DM_MIRROR=m +CONFIG_DM_ZERO=m + +# +# Fusion MPT device support +# +CONFIG_FUSION=m +CONFIG_FUSION_MAX_SGE=40 +CONFIG_FUSION_ISENSE=m +CONFIG_FUSION_CTL=m +CONFIG_FUSION_LAN=m + +# +# IEEE 1394 (FireWire) support +# +CONFIG_IEEE1394=m + +# +# Subsystem Options +# +# CONFIG_IEEE1394_VERBOSEDEBUG is not set +# CONFIG_IEEE1394_OUI_DB is not set +CONFIG_IEEE1394_EXTRA_CONFIG_ROMS=y +CONFIG_IEEE1394_CONFIG_ROM_IP1394=y + +# +# Device Drivers +# +CONFIG_IEEE1394_PCILYNX=m +CONFIG_IEEE1394_OHCI1394=m + +# +# Protocol Drivers +# +CONFIG_IEEE1394_VIDEO1394=m +CONFIG_IEEE1394_SBP2=m +# CONFIG_IEEE1394_SBP2_PHYS_DMA is not set +CONFIG_IEEE1394_ETH1394=m +CONFIG_IEEE1394_DV1394=m +CONFIG_IEEE1394_RAWIO=m +CONFIG_IEEE1394_CMP=m +CONFIG_IEEE1394_AMDTP=m + +# +# I2O device support +# +CONFIG_I2O=m +CONFIG_I2O_CONFIG=m +CONFIG_I2O_BLOCK=m +CONFIG_I2O_SCSI=m +CONFIG_I2O_PROC=m + +# +# Networking support +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=m +CONFIG_PACKET_MMAP=y +CONFIG_NETLINK_DEV=m +CONFIG_UNIX=m +CONFIG_NET_KEY=m +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_FWMARK=y +CONFIG_IP_ROUTE_NAT=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_TOS=y +CONFIG_IP_ROUTE_VERBOSE=y +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE=m +CONFIG_NET_IPGRE_BROADCAST=y +CONFIG_IP_MROUTE=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +# CONFIG_ARPD is not set +CONFIG_SYN_COOKIES=y +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +CONFIG_INET_IPCOMP=m + +# +# IP: Virtual Server Configuration +# +CONFIG_IP_VS=m +# CONFIG_IP_VS_DEBUG is not set +CONFIG_IP_VS_TAB_BITS=12 + +# +# IPVS transport protocol load balancing support +# +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_PROTO_ESP=y +CONFIG_IP_VS_PROTO_AH=y + +# +# IPVS scheduler +# +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_WRR=m +CONFIG_IP_VS_LC=m +CONFIG_IP_VS_WLC=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m + +# +# IPVS application helper +# +CONFIG_IP_VS_FTP=m +CONFIG_IPV6=m +CONFIG_IPV6_PRIVACY=y +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +CONFIG_INET6_IPCOMP=m +CONFIG_IPV6_TUNNEL=m +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_BRIDGE_NETFILTER=y + +# +# IP: Netfilter Configuration +# +CONFIG_IP_NF_CONNTRACK=m +CONFIG_IP_NF_FTP=m +CONFIG_IP_NF_IRC=m +CONFIG_IP_NF_TFTP=m +CONFIG_IP_NF_AMANDA=m +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_LIMIT=m +CONFIG_IP_NF_MATCH_IPRANGE=m +CONFIG_IP_NF_MATCH_MAC=m +CONFIG_IP_NF_MATCH_PKTTYPE=m +CONFIG_IP_NF_MATCH_MARK=m +CONFIG_IP_NF_MATCH_MULTIPORT=m +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_DSCP=m +CONFIG_IP_NF_MATCH_AH_ESP=m +CONFIG_IP_NF_MATCH_LENGTH=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_TCPMSS=m +CONFIG_IP_NF_MATCH_HELPER=m +CONFIG_IP_NF_MATCH_STATE=m +CONFIG_IP_NF_MATCH_CONNTRACK=m +CONFIG_IP_NF_MATCH_OWNER=m +CONFIG_IP_NF_MATCH_PHYSDEV=m +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_SAME=m +CONFIG_IP_NF_NAT_LOCAL=y +CONFIG_IP_NF_NAT_SNMP_BASIC=m +CONFIG_IP_NF_NAT_IRC=m +CONFIG_IP_NF_NAT_FTP=m +CONFIG_IP_NF_NAT_TFTP=m +CONFIG_IP_NF_NAT_AMANDA=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_DSCP=m +CONFIG_IP_NF_TARGET_MARK=m +CONFIG_IP_NF_TARGET_CLASSIFY=m +CONFIG_IP_NF_TARGET_LOG=m +CONFIG_IP_NF_TARGET_ULOG=m +CONFIG_IP_NF_TARGET_TCPMSS=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +CONFIG_IP_NF_COMPAT_IPCHAINS=m +CONFIG_IP_NF_COMPAT_IPFWADM=m +CONFIG_IP_NF_TARGET_NOTRACK=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_MATCH_ADDRTYPE=m +CONFIG_IP_NF_MATCH_REALM=m + +# +# IPv6: Netfilter Configuration +# +CONFIG_IP6_NF_QUEUE=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MATCH_LIMIT=m +CONFIG_IP6_NF_MATCH_MAC=m +CONFIG_IP6_NF_MATCH_RT=m +CONFIG_IP6_NF_MATCH_OPTS=m +CONFIG_IP6_NF_MATCH_FRAG=m +CONFIG_IP6_NF_MATCH_HL=m +CONFIG_IP6_NF_MATCH_MULTIPORT=m +CONFIG_IP6_NF_MATCH_OWNER=m +CONFIG_IP6_NF_MATCH_MARK=m +CONFIG_IP6_NF_MATCH_IPV6HEADER=m +CONFIG_IP6_NF_MATCH_AHESP=m +CONFIG_IP6_NF_MATCH_LENGTH=m +CONFIG_IP6_NF_MATCH_EUI64=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_LOG=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_TARGET_MARK=m +CONFIG_IP6_NF_RAW=m + +# +# DECnet: Netfilter Configuration +# +CONFIG_DECNET_NF_GRABULATOR=m + +# +# Bridge: Netfilter Configuration +# +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_802_3=m +CONFIG_BRIDGE_EBT_AMONG=m +CONFIG_BRIDGE_EBT_ARP=m +CONFIG_BRIDGE_EBT_IP=m +CONFIG_BRIDGE_EBT_LIMIT=m +CONFIG_BRIDGE_EBT_MARK=m +CONFIG_BRIDGE_EBT_PKTTYPE=m +CONFIG_BRIDGE_EBT_STP=m +CONFIG_BRIDGE_EBT_VLAN=m +CONFIG_BRIDGE_EBT_ARPREPLY=m +CONFIG_BRIDGE_EBT_DNAT=m +CONFIG_BRIDGE_EBT_MARK_T=m +CONFIG_BRIDGE_EBT_REDIRECT=m +CONFIG_BRIDGE_EBT_SNAT=m +CONFIG_BRIDGE_EBT_LOG=m +CONFIG_XFRM=y +CONFIG_XFRM_USER=m + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IP_SCTP=m +# CONFIG_SCTP_DBG_MSG is not set +# CONFIG_SCTP_DBG_OBJCNT is not set +# CONFIG_SCTP_HMAC_NONE is not set +# CONFIG_SCTP_HMAC_SHA1 is not set +CONFIG_SCTP_HMAC_MD5=y +CONFIG_ATM=y +CONFIG_ATM_CLIP=y +# CONFIG_ATM_CLIP_NO_ICMP is not set +CONFIG_ATM_LANE=m +CONFIG_ATM_MPOA=m +CONFIG_ATM_BR2684=m +# CONFIG_ATM_BR2684_IPFILTER is not set +CONFIG_BRIDGE=m +CONFIG_VLAN_8021Q=m +CONFIG_DECNET=m +# CONFIG_DECNET_SIOCGIFCONF is not set +# CONFIG_DECNET_ROUTER is not set +CONFIG_LLC=y +CONFIG_LLC2=m +CONFIG_IPX=m +# CONFIG_IPX_INTERN is not set +CONFIG_ATALK=m +CONFIG_DEV_APPLETALK=y +CONFIG_LTPC=m +CONFIG_COPS=m +CONFIG_COPS_DAYNA=y +CONFIG_COPS_TANGENT=y +CONFIG_IPDDP=m +CONFIG_IPDDP_ENCAP=y +CONFIG_IPDDP_DECAP=y +CONFIG_X25=m +CONFIG_LAPB=m +# CONFIG_NET_DIVERT is not set +CONFIG_ECONET=m +CONFIG_ECONET_AUNUDP=y +CONFIG_ECONET_NATIVE=y +CONFIG_WAN_ROUTER=m +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_CLK_JIFFIES=y +# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set +# CONFIG_NET_SCH_CLK_CPU is not set +CONFIG_NET_SCH_CBQ=m +CONFIG_NET_SCH_HTB=m +CONFIG_NET_SCH_HFSC=m +CONFIG_NET_SCH_ATM=m +CONFIG_NET_SCH_PRIO=m +CONFIG_NET_SCH_RED=m +CONFIG_NET_SCH_SFQ=m +CONFIG_NET_SCH_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_NETEM=m +CONFIG_NET_SCH_INGRESS=m +CONFIG_NET_QOS=y +CONFIG_NET_ESTIMATOR=y +CONFIG_NET_CLS=y +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_ROUTE=y +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +# CONFIG_CLS_U32_PERF is not set +# CONFIG_NET_CLS_IND is not set +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +# CONFIG_NET_CLS_ACT is not set +CONFIG_NET_CLS_POLICE=y + +# +# Network testing +# +CONFIG_NET_PKTGEN=m +CONFIG_NETPOLL=y +# CONFIG_NETPOLL_RX is not set +# CONFIG_NETPOLL_TRAP is not set +CONFIG_NET_POLL_CONTROLLER=y +CONFIG_HAMRADIO=y + +# +# Packet Radio protocols +# +CONFIG_AX25=m +# CONFIG_AX25_DAMA_SLAVE is not set +CONFIG_NETROM=m +CONFIG_ROSE=m + +# +# AX.25 network device drivers +# +# CONFIG_MKISS is not set +# CONFIG_6PACK is not set +CONFIG_BPQETHER=m +# CONFIG_DMASCC is not set +CONFIG_SCC=m +# CONFIG_SCC_DELAY is not set +# CONFIG_SCC_TRXECHO is not set +CONFIG_BAYCOM_SER_FDX=m +CONFIG_BAYCOM_SER_HDX=m +CONFIG_BAYCOM_PAR=m +CONFIG_BAYCOM_EPP=m +CONFIG_YAM=m +CONFIG_IRDA=m + +# +# IrDA protocols +# +CONFIG_IRLAN=m +CONFIG_IRNET=m +CONFIG_IRCOMM=m +# CONFIG_IRDA_ULTRA is not set + +# +# IrDA options +# +CONFIG_IRDA_CACHE_LAST_LSAP=y +CONFIG_IRDA_FAST_RR=y +CONFIG_IRDA_DEBUG=y + +# +# Infrared-port device drivers +# + +# +# SIR device drivers +# +CONFIG_IRTTY_SIR=m + +# +# Dongle support +# +CONFIG_DONGLE=y +CONFIG_ESI_DONGLE=m +CONFIG_ACTISYS_DONGLE=m +CONFIG_TEKRAM_DONGLE=m +CONFIG_LITELINK_DONGLE=m +CONFIG_MA600_DONGLE=m +CONFIG_GIRBIL_DONGLE=m +CONFIG_MCP2120_DONGLE=m +CONFIG_OLD_BELKIN_DONGLE=m +CONFIG_ACT200L_DONGLE=m + +# +# Old SIR device drivers +# +# CONFIG_IRPORT_SIR is not set + +# +# Old Serial dongle support +# + +# +# FIR device drivers +# +CONFIG_USB_IRDA=m +CONFIG_SIGMATEL_FIR=m +CONFIG_NSC_FIR=m +CONFIG_WINBOND_FIR=m +CONFIG_TOSHIBA_FIR=m +CONFIG_SMC_IRCC_FIR=m +CONFIG_ALI_FIR=m +CONFIG_VLSI_FIR=m +CONFIG_VIA_FIR=m +CONFIG_BT=m +CONFIG_BT_L2CAP=m +CONFIG_BT_SCO=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_CMTP=m +CONFIG_BT_HIDP=m + +# +# Bluetooth device drivers +# +CONFIG_BT_HCIUSB=m +CONFIG_BT_HCIUSB_SCO=y +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_H4=y +CONFIG_BT_HCIUART_BCSP=y +# CONFIG_BT_HCIUART_BCSP_TXCRC is not set +CONFIG_BT_HCIBCM203X=m +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIDTL1=m +CONFIG_BT_HCIBT3C=m +CONFIG_BT_HCIBLUECARD=m +CONFIG_BT_HCIBTUART=m +CONFIG_BT_HCIVHCI=m +CONFIG_NETDEVICES=y +CONFIG_DUMMY=m +CONFIG_BONDING=m +CONFIG_EQUALIZER=m +CONFIG_TUN=m +CONFIG_ETHERTAP=m +CONFIG_NET_SB1000=m + +# +# ARCnet devices +# +CONFIG_ARCNET=m +CONFIG_ARCNET_1201=m +CONFIG_ARCNET_1051=m +CONFIG_ARCNET_RAW=m +CONFIG_ARCNET_COM90xx=m +CONFIG_ARCNET_COM90xxIO=m +CONFIG_ARCNET_RIM_I=m +CONFIG_ARCNET_COM20020=m +CONFIG_ARCNET_COM20020_ISA=m +CONFIG_ARCNET_COM20020_PCI=m + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=m +CONFIG_HAPPYMEAL=m +CONFIG_SUNGEM=m +CONFIG_NET_VENDOR_3COM=y +CONFIG_EL1=m +CONFIG_EL2=m +CONFIG_ELPLUS=m +CONFIG_EL16=m +CONFIG_EL3=m +CONFIG_3C515=m +CONFIG_VORTEX=m +CONFIG_TYPHOON=m +CONFIG_LANCE=m +CONFIG_NET_VENDOR_SMC=y +CONFIG_WD80x3=m +CONFIG_ULTRA=m +CONFIG_SMC9194=m +CONFIG_NET_VENDOR_RACAL=y +# CONFIG_NI5010 is not set +CONFIG_NI52=m +CONFIG_NI65=m + +# +# Tulip family network device support +# +CONFIG_NET_TULIP=y +CONFIG_DE2104X=m +CONFIG_TULIP=m +# CONFIG_TULIP_MWI is not set +# CONFIG_TULIP_MMIO is not set +# CONFIG_TULIP_NAPI is not set +CONFIG_DE4X5=m +CONFIG_WINBOND_840=m +CONFIG_DM9102=m +CONFIG_PCMCIA_XIRCOM=m +# CONFIG_PCMCIA_XIRTULIP is not set +CONFIG_AT1700=m +CONFIG_DEPCA=m +CONFIG_HP100=m +CONFIG_NET_ISA=y +CONFIG_E2100=m +CONFIG_EWRK3=m +CONFIG_EEXPRESS=m +CONFIG_EEXPRESS_PRO=m +CONFIG_HPLAN_PLUS=m +CONFIG_HPLAN=m +CONFIG_LP486E=m +CONFIG_ETH16I=m +CONFIG_NE2000=m +CONFIG_ZNET=m +CONFIG_SEEQ8005=m +CONFIG_NET_PCI=y +CONFIG_PCNET32=m +CONFIG_AMD8111_ETH=m +# CONFIG_AMD8111E_NAPI is not set +CONFIG_ADAPTEC_STARFIRE=m +# CONFIG_ADAPTEC_STARFIRE_NAPI is not set +CONFIG_AC3200=m +CONFIG_APRICOT=m +CONFIG_B44=m +CONFIG_FORCEDETH=m +CONFIG_CS89x0=m +CONFIG_EEPRO100=m +# CONFIG_EEPRO100_PIO is not set +CONFIG_E100=m +# CONFIG_E100_NAPI is not set +CONFIG_FEALNX=m +CONFIG_NATSEMI=m +CONFIG_NE2K_PCI=m +CONFIG_8139CP=m +CONFIG_8139TOO=m +CONFIG_8139TOO_PIO=y +CONFIG_8139TOO_TUNE_TWISTER=y +CONFIG_8139TOO_8129=y +# CONFIG_8139_OLD_RX_RESET is not set +CONFIG_SIS900=m +CONFIG_EPIC100=m +CONFIG_SUNDANCE=m +# CONFIG_SUNDANCE_MMIO is not set +CONFIG_TLAN=m +CONFIG_VIA_RHINE=m +# CONFIG_VIA_RHINE_MMIO is not set +CONFIG_VIA_VELOCITY=m +CONFIG_NET_POCKET=y +CONFIG_ATP=m +CONFIG_DE600=m +CONFIG_DE620=m + +# +# Ethernet (1000 Mbit) +# +CONFIG_DL2K=m +CONFIG_E1000=m +# CONFIG_E1000_NAPI is not set +CONFIG_NS83820=m +CONFIG_HAMACHI=m +CONFIG_YELLOWFIN=m +CONFIG_R8169=m +CONFIG_SK98LIN=m +CONFIG_TIGON3=m + +# +# Ethernet (10000 Mbit) +# +CONFIG_IXGB=m +# CONFIG_IXGB_NAPI is not set +CONFIG_S2IO=m +# CONFIG_S2IO_NAPI is not set + +# +# Token Ring devices +# +CONFIG_TR=y +CONFIG_IBMTR=m +CONFIG_IBMOL=m +CONFIG_IBMLS=m +CONFIG_3C359=m +CONFIG_TMS380TR=m +CONFIG_TMSPCI=m +CONFIG_SKISA=m +CONFIG_PROTEON=m +CONFIG_ABYSS=m + +# +# Wireless LAN (non-hamradio) +# +CONFIG_NET_RADIO=y + +# +# Obsolete Wireless cards support (pre-802.11) +# +CONFIG_STRIP=m +CONFIG_ARLAN=m +CONFIG_WAVELAN=m +CONFIG_PCMCIA_WAVELAN=m +CONFIG_PCMCIA_NETWAVE=m + +# +# Wireless 802.11 Frequency Hopping cards support +# +CONFIG_PCMCIA_RAYCS=m + +# +# Wireless 802.11b ISA/PCI cards support +# +CONFIG_IEEE80211=m +# CONFIG_IEEE80211_DEBUG is not set +CONFIG_IEEE80211_CRYPT=m +CONFIG_IEEE80211_WPA=y +CONFIG_IEEE80211_CRYPT_CCMP=m +CONFIG_IEEE80211_CRYPT_TKIP=m +CONFIG_IPW2100=m +CONFIG_IPW2100_PROMISC=y +# CONFIG_IPW2100_LEGACY_FW_LOAD is not set +# CONFIG_IPW2100_NOWEP is not set +# CONFIG_IPW2100_DEBUG is not set +CONFIG_IPW2200=m +# CONFIG_IPW2200_NOWEP is not set +CONFIG_WLAN_NG=m +CONFIG_PRISM2=m +CONFIG_PRISM2_USB=m +CONFIG_ACX100=m +CONFIG_ADM8211=m +CONFIG_AIRO=m +CONFIG_HERMES=m +CONFIG_PLX_HERMES=m +CONFIG_TMD_HERMES=m +CONFIG_PCI_HERMES=m +CONFIG_ATMEL=m +CONFIG_PCI_ATMEL=m + +# +# Wireless 802.11b Pcmcia/Cardbus cards support +# +CONFIG_PCMCIA_HERMES=m +CONFIG_AIRO_CS=m +CONFIG_PCMCIA_ATMEL=m +CONFIG_PCMCIA_WL3501=m + +# +# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support +# +CONFIG_PRISM54=m +CONFIG_NET_WIRELESS=y + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +CONFIG_PCMCIA_3C589=m +CONFIG_PCMCIA_3C574=m +CONFIG_PCMCIA_FMVJ18X=m +CONFIG_PCMCIA_PCNET=m +CONFIG_PCMCIA_NMCLAN=m +CONFIG_PCMCIA_SMC91C92=m +CONFIG_PCMCIA_XIRC2PS=m +CONFIG_PCMCIA_AXNET=m +CONFIG_ARCNET_COM20020_CS=m +CONFIG_PCMCIA_IBMTR=m + +# +# Wan interfaces +# +CONFIG_WAN=y +CONFIG_HOSTESS_SV11=m +CONFIG_COSA=m +CONFIG_DSCC4=m +CONFIG_DSCC4_PCISYNC=y +CONFIG_DSCC4_PCI_RST=y +CONFIG_LANMEDIA=m +CONFIG_SEALEVEL_4021=m +CONFIG_SYNCLINK_SYNCPPP=m +CONFIG_HDLC=m +CONFIG_HDLC_RAW=y +CONFIG_HDLC_RAW_ETH=y +CONFIG_HDLC_CISCO=y +CONFIG_HDLC_FR=y +CONFIG_HDLC_PPP=y +CONFIG_HDLC_X25=y +CONFIG_PCI200SYN=m +CONFIG_WANXL=m +CONFIG_PC300=m +CONFIG_PC300_MLPPP=y +CONFIG_N2=m +CONFIG_C101=m +CONFIG_FARSYNC=m +CONFIG_DLCI=m +CONFIG_DLCI_COUNT=24 +CONFIG_DLCI_MAX=8 +CONFIG_SDLA=m +CONFIG_WAN_ROUTER_DRIVERS=y +# CONFIG_VENDOR_SANGOMA is not set +CONFIG_CYCLADES_SYNC=m +CONFIG_CYCLOMX_X25=y +CONFIG_LAPBETHER=m +CONFIG_X25_ASY=m +CONFIG_SBNI=m +# CONFIG_SBNI_MULTILINE is not set + +# +# ATM drivers +# +CONFIG_ATM_TCP=m +CONFIG_ATM_LANAI=m +CONFIG_ATM_ENI=m +# CONFIG_ATM_ENI_DEBUG is not set +# CONFIG_ATM_ENI_TUNE_BURST is not set +CONFIG_ATM_FIRESTREAM=m +CONFIG_ATM_ZATM=m +# CONFIG_ATM_ZATM_DEBUG is not set +CONFIG_ATM_NICSTAR=m +# CONFIG_ATM_NICSTAR_USE_SUNI is not set +# CONFIG_ATM_NICSTAR_USE_IDT77105 is not set +CONFIG_ATM_IDT77252=m +# CONFIG_ATM_IDT77252_DEBUG is not set +# CONFIG_ATM_IDT77252_RCV_ALL is not set +CONFIG_ATM_IDT77252_USE_SUNI=y +CONFIG_ATM_AMBASSADOR=m +# CONFIG_ATM_AMBASSADOR_DEBUG is not set +CONFIG_ATM_HORIZON=m +# CONFIG_ATM_HORIZON_DEBUG is not set +CONFIG_ATM_IA=m +# CONFIG_ATM_IA_DEBUG is not set +CONFIG_ATM_FORE200E_MAYBE=m +CONFIG_ATM_FORE200E_PCA=y +CONFIG_ATM_FORE200E_PCA_DEFAULT_FW=y +# CONFIG_ATM_FORE200E_USE_TASKLET is not set +CONFIG_ATM_FORE200E_TX_RETRY=16 +CONFIG_ATM_FORE200E_DEBUG=0 +CONFIG_ATM_FORE200E=m +CONFIG_ATM_HE=m +CONFIG_ATM_HE_USE_SUNI=y +CONFIG_FDDI=y +CONFIG_DEFXX=m +CONFIG_SKFP=m +CONFIG_HIPPI=y +CONFIG_ROADRUNNER=m +# CONFIG_ROADRUNNER_LARGE_RINGS is not set +CONFIG_PLIP=m +CONFIG_PPP=m +CONFIG_PPP_MULTILINK=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_MPPE=m +CONFIG_PPPOE=m +CONFIG_PPPOATM=m +CONFIG_SLIP=m +CONFIG_SLIP_COMPRESSED=y +CONFIG_SLIP_SMART=y +CONFIG_SLIP_MODE_SLIP6=y +CONFIG_NET_FC=y +# CONFIG_IPHASE5526 is not set +CONFIG_SHAPER=m +CONFIG_NETCONSOLE=m +CONFIG_NDISWRAPPER=m + +# +# ISDN subsystem +# +CONFIG_ISDN=m + +# +# Old ISDN4Linux +# +CONFIG_ISDN_I4L=m +CONFIG_ISDN_PPP=y +CONFIG_ISDN_PPP_VJ=y +CONFIG_ISDN_MPP=y +CONFIG_IPPP_FILTER=y +CONFIG_ISDN_PPP_BSDCOMP=m +CONFIG_ISDN_AUDIO=y +CONFIG_ISDN_TTY_FAX=y +CONFIG_ISDN_X25=y + +# +# ISDN feature submodules +# +# CONFIG_ISDN_DRV_LOOP is not set +# CONFIG_ISDN_DIVERSION is not set + +# +# ISDN4Linux hardware drivers +# + +# +# Passive cards +# +CONFIG_ISDN_DRV_HISAX=m + +# +# D-channel protocol features +# +CONFIG_HISAX_EURO=y +CONFIG_DE_AOC=y +# CONFIG_HISAX_NO_SENDCOMPLETE is not set +# CONFIG_HISAX_NO_LLC is not set +# CONFIG_HISAX_NO_KEYPAD is not set +CONFIG_HISAX_1TR6=y +CONFIG_HISAX_NI1=y +CONFIG_HISAX_MAX_CARDS=8 + +# +# HiSax supported cards +# +CONFIG_HISAX_16_0=y +CONFIG_HISAX_16_3=y +CONFIG_HISAX_TELESPCI=y +CONFIG_HISAX_S0BOX=y +CONFIG_HISAX_AVM_A1=y +CONFIG_HISAX_FRITZPCI=y +CONFIG_HISAX_AVM_A1_PCMCIA=y +CONFIG_HISAX_ELSA=y +CONFIG_HISAX_IX1MICROR2=y +CONFIG_HISAX_DIEHLDIVA=y +CONFIG_HISAX_ASUSCOM=y +CONFIG_HISAX_TELEINT=y +CONFIG_HISAX_HFCS=y +CONFIG_HISAX_SEDLBAUER=y +CONFIG_HISAX_SPORTSTER=y +CONFIG_HISAX_MIC=y +CONFIG_HISAX_NETJET=y +CONFIG_HISAX_NETJET_U=y +CONFIG_HISAX_NICCY=y +CONFIG_HISAX_ISURF=y +CONFIG_HISAX_HSTSAPHIR=y +CONFIG_HISAX_BKM_A4T=y +CONFIG_HISAX_SCT_QUADRO=y +CONFIG_HISAX_GAZEL=y +CONFIG_HISAX_HFC_PCI=y +CONFIG_HISAX_W6692=y +CONFIG_HISAX_HFC_SX=y +CONFIG_HISAX_ENTERNOW_PCI=y +# CONFIG_HISAX_DEBUG is not set + +# +# HiSax PCMCIA card service modules +# +CONFIG_HISAX_SEDLBAUER_CS=m +CONFIG_HISAX_ELSA_CS=m +CONFIG_HISAX_AVM_A1_CS=m +CONFIG_HISAX_TELES_CS=m + +# +# HiSax sub driver modules +# +CONFIG_HISAX_ST5481=m +CONFIG_HISAX_HFCUSB=m +CONFIG_HISAX_FRITZ_PCIPNP=m +CONFIG_HISAX_HDLC=y + +# +# Active cards +# +CONFIG_ISDN_DRV_ICN=m +CONFIG_ISDN_DRV_PCBIT=m +CONFIG_ISDN_DRV_SC=m +CONFIG_ISDN_DRV_ACT2000=m +CONFIG_ISDN_DRV_TPAM=m +# CONFIG_HYSDN is not set + +# +# CAPI subsystem +# +CONFIG_ISDN_CAPI=m +CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON=y +CONFIG_ISDN_CAPI_MIDDLEWARE=y +CONFIG_ISDN_CAPI_CAPI20=m +CONFIG_ISDN_CAPI_CAPIFS_BOOL=y +CONFIG_ISDN_CAPI_CAPIFS=m +CONFIG_ISDN_CAPI_CAPIDRV=m + +# +# CAPI hardware drivers +# + +# +# Active AVM cards +# +CONFIG_CAPI_AVM=y +# CONFIG_ISDN_DRV_AVMB1_B1ISA is not set +# CONFIG_ISDN_DRV_AVMB1_B1PCI is not set +# CONFIG_ISDN_DRV_AVMB1_T1ISA is not set +# CONFIG_ISDN_DRV_AVMB1_B1PCMCIA is not set +# CONFIG_ISDN_DRV_AVMB1_T1PCI is not set +# CONFIG_ISDN_DRV_AVMB1_C4 is not set + +# +# Active Eicon DIVA Server cards +# +CONFIG_CAPI_EICON=y +CONFIG_ISDN_DIVAS=m +CONFIG_ISDN_DIVAS_BRIPCI=y +CONFIG_ISDN_DIVAS_PRIPCI=y +CONFIG_ISDN_DIVAS_DIVACAPI=m +CONFIG_ISDN_DIVAS_USERIDI=m +CONFIG_ISDN_DIVAS_MAINT=m + +# +# Modular ISDN driver +# +CONFIG_MISDN_DRV=m +# CONFIG_MISDN_MEMDEBUG is not set +CONFIG_MISDN_AVM_FRITZ=y +CONFIG_MISDN_HFCPCI=y +CONFIG_MISDN_HFCMULTI=y +CONFIG_MISDN_SPEEDFAX=y +CONFIG_MISDN_W6692=y +CONFIG_MISDN_DSP=y + +# +# Telephony Support +# +CONFIG_PHONE=m +CONFIG_PHONE_IXJ=m +CONFIG_PHONE_IXJ_PCMCIA=m + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=m +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_MOUSEDEV_PSAUX_ENABLE=y +CONFIG_INPUT_JOYDEV=m +CONFIG_INPUT_TSDEV=m +CONFIG_INPUT_TSDEV_SCREEN_X=240 +CONFIG_INPUT_TSDEV_SCREEN_Y=320 +CONFIG_INPUT_EVDEV=m +CONFIG_INPUT_EVBUG=m + +# +# Input I/O drivers +# +CONFIG_GAMEPORT=m +CONFIG_SOUND_GAMEPORT=m +CONFIG_GAMEPORT_NS558=m +CONFIG_GAMEPORT_L4=m +CONFIG_GAMEPORT_EMU10K1=m +CONFIG_GAMEPORT_VORTEX=m +CONFIG_GAMEPORT_FM801=m +CONFIG_GAMEPORT_CS461x=m +CONFIG_SERIO=y +CONFIG_SERIO_I8042=y +CONFIG_SERIO_SERPORT=m +CONFIG_SERIO_CT82C710=m +CONFIG_SERIO_PARKBD=m +CONFIG_SERIO_PCIPS2=m + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=y +CONFIG_KEYBOARD_SUNKBD=m +CONFIG_KEYBOARD_LKKBD=m +CONFIG_KEYBOARD_XTKBD=m +CONFIG_KEYBOARD_NEWTON=m +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=m +CONFIG_MOUSE_SERIAL=m +CONFIG_MOUSE_INPORT=m +# CONFIG_MOUSE_ATIXL is not set +CONFIG_MOUSE_LOGIBM=m +CONFIG_MOUSE_PC110PAD=m +CONFIG_MOUSE_VSXXXAA=m +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_ANALOG=m +CONFIG_JOYSTICK_A3D=m +CONFIG_JOYSTICK_ADI=m +CONFIG_JOYSTICK_COBRA=m +CONFIG_JOYSTICK_GF2K=m +CONFIG_JOYSTICK_GRIP=m +CONFIG_JOYSTICK_GRIP_MP=m +CONFIG_JOYSTICK_GUILLEMOT=m +CONFIG_JOYSTICK_INTERACT=m +CONFIG_JOYSTICK_SIDEWINDER=m +CONFIG_JOYSTICK_TMDC=m +CONFIG_JOYSTICK_IFORCE=m +CONFIG_JOYSTICK_IFORCE_USB=y +CONFIG_JOYSTICK_IFORCE_232=y +CONFIG_JOYSTICK_WARRIOR=m +CONFIG_JOYSTICK_MAGELLAN=m +CONFIG_JOYSTICK_SPACEORB=m +CONFIG_JOYSTICK_SPACEBALL=m +CONFIG_JOYSTICK_STINGER=m +CONFIG_JOYSTICK_TWIDDLER=m +CONFIG_JOYSTICK_DB9=m +CONFIG_JOYSTICK_GAMECON=m +CONFIG_JOYSTICK_TURBOGRAFX=m +CONFIG_INPUT_JOYDUMP=m +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_GUNZE=m +CONFIG_INPUT_MISC=y +CONFIG_INPUT_PCSPKR=m +CONFIG_INPUT_UINPUT=m + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +CONFIG_SERIAL_NONSTANDARD=y +# CONFIG_COMPUTONE is not set +CONFIG_ROCKETPORT=m +CONFIG_CYCLADES=m +# CONFIG_CYZ_INTR is not set +# CONFIG_DIGIEPCA is not set +# CONFIG_DIGI is not set +# CONFIG_ESPSERIAL is not set +# CONFIG_MOXA_INTELLIO is not set +# CONFIG_MOXA_SMARTIO is not set +# CONFIG_ISI is not set +CONFIG_SYNCLINK=m +CONFIG_SYNCLINKMP=m +CONFIG_N_HDLC=m +# CONFIG_RISCOM8 is not set +# CONFIG_SPECIALIX is not set +# CONFIG_SX is not set +# CONFIG_RIO is not set +CONFIG_STALDRV=y +# CONFIG_STALLION is not set +# CONFIG_ISTALLION is not set + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_CS=m +# CONFIG_SERIAL_8250_ACPI is not set +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_MANY_PORTS=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +# CONFIG_SERIAL_8250_DETECT_IRQ is not set +CONFIG_SERIAL_8250_MULTIPORT=y +CONFIG_SERIAL_8250_RSA=y + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=256 +CONFIG_PRINTER=m +# CONFIG_LP_CONSOLE is not set +CONFIG_PPDEV=m +CONFIG_TIPAR=m +CONFIG_QIC02_TAPE=m +CONFIG_QIC02_DYNCONF=y + +# +# Setting runtime QIC-02 configuration is done with qic02conf +# + +# +# from the tpqic02-support package. It is available at +# + +# +# metalab.unc.edu or ftp://titus.cfw.com/pub/Linux/util/ +# + +# +# IPMI +# +CONFIG_IPMI_HANDLER=m +# CONFIG_IPMI_PANIC_EVENT is not set +CONFIG_IPMI_DEVICE_INTERFACE=m +CONFIG_IPMI_SI=m +CONFIG_IPMI_WATCHDOG=m + +# +# Watchdog Cards +# +CONFIG_WATCHDOG=y +# CONFIG_WATCHDOG_NOWAYOUT is not set + +# +# Watchdog Device Drivers +# +CONFIG_SOFT_WATCHDOG=m +CONFIG_ACQUIRE_WDT=m +CONFIG_ADVANTECH_WDT=m +CONFIG_ALIM1535_WDT=m +CONFIG_ALIM7101_WDT=m +CONFIG_SC520_WDT=m +CONFIG_EUROTECH_WDT=m +CONFIG_IB700_WDT=m +CONFIG_WAFER_WDT=m +CONFIG_I8XX_TCO=m +CONFIG_SC1200_WDT=m +CONFIG_SCx200_WDT=m +CONFIG_60XX_WDT=m +CONFIG_CPU5_WDT=m +CONFIG_W83627HF_WDT=m +CONFIG_W83877F_WDT=m +CONFIG_MACHZ_WDT=m + +# +# ISA-based Watchdog Cards +# +CONFIG_PCWATCHDOG=m +CONFIG_MIXCOMWD=m +CONFIG_WDT=m +CONFIG_WDT_501=y + +# +# PCI-based Watchdog Cards +# +CONFIG_PCIPCWATCHDOG=m +CONFIG_WDTPCI=m +CONFIG_WDT_501_PCI=y + +# +# USB-based Watchdog Cards +# +CONFIG_USBPCWATCHDOG=m +CONFIG_HW_RANDOM=m +CONFIG_NVRAM=m +CONFIG_RTC=m +CONFIG_GEN_RTC=m +CONFIG_GEN_RTC_X=y +CONFIG_DTLK=m +CONFIG_R3964=m +CONFIG_APPLICOM=m +CONFIG_SONYPI=m + +# +# Ftape, the floppy tape device driver +# +# CONFIG_FTAPE is not set +CONFIG_AGP=m +CONFIG_AGP_ALI=m +CONFIG_AGP_ATI=m +CONFIG_AGP_AMD=m +CONFIG_AGP_AMD64=m +CONFIG_AGP_INTEL=m +CONFIG_AGP_INTEL_MCH=m +CONFIG_AGP_NVIDIA=m +CONFIG_AGP_SIS=m +CONFIG_AGP_SWORKS=m +CONFIG_AGP_VIA=m +CONFIG_AGP_EFFICEON=m +CONFIG_DRM=y +CONFIG_DRM_TDFX=m +CONFIG_DRM_GAMMA=m +CONFIG_DRM_R128=m +CONFIG_DRM_RADEON=m +CONFIG_DRM_I810=m +CONFIG_DRM_I830=m +CONFIG_DRM_MGA=m +CONFIG_DRM_SIS=m + +# +# PCMCIA character devices +# +CONFIG_SYNCLINK_CS=m +CONFIG_MWAVE=m +CONFIG_SCx200_GPIO=m +CONFIG_RAW_DRIVER=m +CONFIG_HPET=y +# CONFIG_HPET_RTC_IRQ is not set +CONFIG_HPET_MMAP=y +CONFIG_MAX_RAW_DEVS=256 +CONFIG_HANGCHECK_TIMER=m + +# +# I2C support +# +CONFIG_I2C=m +CONFIG_I2C_CHARDEV=m + +# +# I2C Algorithms +# +CONFIG_I2C_ALGOBIT=m +CONFIG_I2C_ALGOPCF=m + +# +# I2C Hardware Bus support +# +CONFIG_I2C_ALI1535=m +CONFIG_I2C_ALI1563=m +CONFIG_I2C_ALI15X3=m +CONFIG_I2C_AMD756=m +CONFIG_I2C_AMD8111=m +# CONFIG_I2C_ELEKTOR is not set +CONFIG_I2C_I801=m +CONFIG_I2C_I810=m +CONFIG_I2C_ISA=m +CONFIG_I2C_NFORCE2=m +CONFIG_I2C_PARPORT=m +CONFIG_I2C_PARPORT_LIGHT=m +CONFIG_I2C_PIIX4=m +CONFIG_I2C_PROSAVAGE=m +CONFIG_I2C_SAVAGE4=m +CONFIG_SCx200_I2C=m +CONFIG_SCx200_I2C_SCL=12 +CONFIG_SCx200_I2C_SDA=13 +CONFIG_SCx200_ACB=m +CONFIG_I2C_SIS5595=m +CONFIG_I2C_SIS630=m +CONFIG_I2C_SIS96X=m +CONFIG_I2C_VIA=m +CONFIG_I2C_VIAPRO=m +CONFIG_I2C_VOODOO3=m + +# +# Hardware Sensors Chip support +# +CONFIG_I2C_SENSOR=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM1025=m +CONFIG_SENSORS_ADM1031=m +CONFIG_SENSORS_ASB100=m +CONFIG_SENSORS_DS1621=m +CONFIG_SENSORS_FSCHER=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_IT87=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM77=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_LM83=m +CONFIG_SENSORS_LM85=m +CONFIG_SENSORS_LM90=m +CONFIG_SENSORS_MAX1619=m +CONFIG_SENSORS_VIA686A=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_W83L785TS=m +CONFIG_SENSORS_W83627HF=m + +# +# Other I2C Chip support +# +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_PCF8574=m +CONFIG_SENSORS_PCF8591=m +CONFIG_SENSORS_RTC8564=m +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set + +# +# Dallas's 1-wire bus +# +CONFIG_W1=m +CONFIG_W1_MATROX=m +CONFIG_W1_THERM=m + +# +# Misc devices +# +CONFIG_IBM_ASM=m + +# +# Multimedia devices +# +CONFIG_VIDEO_DEV=m + +# +# Video For Linux +# + +# +# Video Adapters +# +CONFIG_VIDEO_BT848=m +CONFIG_VIDEO_PMS=m +CONFIG_VIDEO_BWQCAM=m +CONFIG_VIDEO_CQCAM=m +CONFIG_VIDEO_W9966=m +CONFIG_VIDEO_CPIA=m +CONFIG_VIDEO_CPIA_PP=m +CONFIG_VIDEO_CPIA_USB=m +CONFIG_VIDEO_SAA5246A=m +CONFIG_VIDEO_SAA5249=m +CONFIG_TUNER_3036=m +CONFIG_VIDEO_STRADIS=m +# CONFIG_VIDEO_ZORAN is not set +# CONFIG_VIDEO_ZR36120 is not set +CONFIG_VIDEO_MEYE=m +CONFIG_VIDEO_SAA7134=m +CONFIG_VIDEO_MXB=m +CONFIG_VIDEO_DPC=m +CONFIG_VIDEO_HEXIUM_ORION=m +CONFIG_VIDEO_HEXIUM_GEMINI=m +CONFIG_VIDEO_CX88=m +CONFIG_VIDEO_OVCAMCHIP=m + +# +# Radio Adapters +# +CONFIG_RADIO_CADET=m +CONFIG_RADIO_RTRACK=m +CONFIG_RADIO_RTRACK2=m +CONFIG_RADIO_AZTECH=m +CONFIG_RADIO_GEMTEK=m +CONFIG_RADIO_GEMTEK_PCI=m +CONFIG_RADIO_MAXIRADIO=m +CONFIG_RADIO_MAESTRO=m +CONFIG_RADIO_MIROPCM20=m +CONFIG_RADIO_MIROPCM20_RDS=m +CONFIG_RADIO_SF16FMI=m +CONFIG_RADIO_SF16FMR2=m +CONFIG_RADIO_TERRATEC=m +CONFIG_RADIO_TRUST=m +CONFIG_RADIO_TYPHOON=m +CONFIG_RADIO_TYPHOON_PROC_FS=y +CONFIG_RADIO_ZOLTRIX=m + +# +# Digital Video Broadcasting Devices +# +CONFIG_DVB=y +CONFIG_DVB_CORE=m + +# +# Supported Frontend Modules +# +CONFIG_DVB_TWINHAN_DST=m +CONFIG_DVB_STV0299=m +CONFIG_DVB_SP887X=m +CONFIG_DVB_SP887X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/sc_main.mc" +CONFIG_DVB_ALPS_TDLB7=m +CONFIG_DVB_ALPS_TDMB7=m +CONFIG_DVB_ATMEL_AT76C651=m +CONFIG_DVB_CX24110=m +CONFIG_DVB_GRUNDIG_29504_491=m +CONFIG_DVB_GRUNDIG_29504_401=m +CONFIG_DVB_MT312=m +CONFIG_DVB_VES1820=m +CONFIG_DVB_VES1X93=m +CONFIG_DVB_TDA1004X=m +CONFIG_DVB_TDA1004X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/tda1004x.bin" +CONFIG_DVB_NXT6000=m + +# +# Supported SAA7146 based PCI Adapters +# +CONFIG_DVB_AV7110=m +# CONFIG_DVB_AV7110_OSD is not set +CONFIG_DVB_BUDGET=m +CONFIG_DVB_BUDGET_CI=m +CONFIG_DVB_BUDGET_AV=m +CONFIG_DVB_BUDGET_PATCH=m + +# +# Supported USB Adapters +# +CONFIG_DVB_TTUSB_BUDGET=m +CONFIG_DVB_TTUSB_DEC=m + +# +# Supported FlexCopII (B2C2) Adapters +# +CONFIG_DVB_B2C2_SKYSTAR=m + +# +# Supported BT878 Adapters +# +CONFIG_DVB_BT8XX=m +CONFIG_VIDEO_SAA7146=m +CONFIG_VIDEO_SAA7146_VV=m +CONFIG_VIDEO_VIDEOBUF=m +CONFIG_VIDEO_TUNER=m +CONFIG_VIDEO_BUF=m +CONFIG_VIDEO_BTCX=m +CONFIG_VIDEO_IR=m + +# +# Graphics support +# +CONFIG_FB=y +CONFIG_FB_CIRRUS=m +CONFIG_FB_PM2=m +CONFIG_FB_PM2_FIFO_DISCONNECT=y +CONFIG_FB_CYBER2000=m +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +CONFIG_FB_VGA16=m +CONFIG_FB_VESA=m +CONFIG_VIDEO_SELECT=y +CONFIG_FB_HGA=m +# CONFIG_FB_HGA_ACCEL is not set +CONFIG_FB_RIVA=m +CONFIG_FB_RIVA_I2C=y +CONFIG_FB_RIVA_DEBUG=y +CONFIG_FB_I810=m +# CONFIG_FB_I810_GTF is not set +CONFIG_FB_MATROX=m +CONFIG_FB_MATROX_MILLENIUM=y +CONFIG_FB_MATROX_MYSTIQUE=y +CONFIG_FB_MATROX_G450=y +CONFIG_FB_MATROX_G100=y +CONFIG_FB_MATROX_I2C=m +CONFIG_FB_MATROX_MAVEN=m +CONFIG_FB_MATROX_MULTIHEAD=y +CONFIG_FB_RADEON_OLD=m +CONFIG_FB_RADEON=m +CONFIG_FB_RADEON_I2C=y +# CONFIG_FB_RADEON_DEBUG is not set +CONFIG_FB_ATY128=m +CONFIG_FB_ATY=m +CONFIG_FB_ATY_CT=y +CONFIG_FB_ATY_GX=y +CONFIG_FB_ATY_XL_INIT=y +CONFIG_FB_SIS=m +CONFIG_FB_SIS_300=y +CONFIG_FB_SIS_315=y +CONFIG_FB_NEOMAGIC=m +CONFIG_FB_KYRO=m +CONFIG_FB_3DFX=m +# CONFIG_FB_3DFX_ACCEL is not set +CONFIG_FB_VOODOO1=m +CONFIG_FB_TRIDENT=m +# CONFIG_FB_TRIDENT_ACCEL is not set +# CONFIG_FB_PM3 is not set +CONFIG_FB_VIRTUAL=m + +# +# Console display driver support +# +CONFIG_VGA_CONSOLE=y +CONFIG_MDA_CONSOLE=m +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=m +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y + +# +# Logo configuration +# +# CONFIG_LOGO is not set + +# +# Sound +# +CONFIG_SOUND=m + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +CONFIG_SND_HWDEP=m +CONFIG_SND_RAWMIDI=m +CONFIG_SND_SEQUENCER=m +CONFIG_SND_SEQ_DUMMY=m +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=m +CONFIG_SND_PCM_OSS=m +CONFIG_SND_SEQUENCER_OSS=y +CONFIG_SND_RTCTIMER=m +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set + +# +# Generic devices +# +CONFIG_SND_MPU401_UART=m +CONFIG_SND_OPL3_LIB=m +CONFIG_SND_OPL4_LIB=m +CONFIG_SND_VX_LIB=m +CONFIG_SND_DUMMY=m +CONFIG_SND_VIRMIDI=m +CONFIG_SND_MTPAV=m +CONFIG_SND_SERIAL_U16550=m +CONFIG_SND_MPU401=m + +# +# ISA devices +# +CONFIG_SND_AD1816A=m +CONFIG_SND_AD1848=m +CONFIG_SND_CS4231=m +CONFIG_SND_CS4232=m +CONFIG_SND_CS4236=m +CONFIG_SND_ES968=m +CONFIG_SND_ES1688=m +CONFIG_SND_ES18XX=m +CONFIG_SND_GUSCLASSIC=m +CONFIG_SND_GUSEXTREME=m +CONFIG_SND_GUSMAX=m +CONFIG_SND_INTERWAVE=m +CONFIG_SND_INTERWAVE_STB=m +CONFIG_SND_OPTI92X_AD1848=m +CONFIG_SND_OPTI92X_CS4231=m +CONFIG_SND_OPTI93X=m +CONFIG_SND_SB8=m +CONFIG_SND_SB16=m +CONFIG_SND_SBAWE=m +CONFIG_SND_SB16_CSP=y +CONFIG_SND_WAVEFRONT=m +CONFIG_SND_ALS100=m +CONFIG_SND_AZT2320=m +CONFIG_SND_CMI8330=m +CONFIG_SND_DT019X=m +CONFIG_SND_OPL3SA2=m +CONFIG_SND_SGALAXY=m +CONFIG_SND_SSCAPE=m + +# +# PCI devices +# +CONFIG_SND_AC97_CODEC=m +CONFIG_SND_ALI5451=m +CONFIG_SND_ATIIXP=m +CONFIG_SND_AU8810=m +CONFIG_SND_AU8820=m +CONFIG_SND_AU8830=m +CONFIG_SND_AZT3328=m +CONFIG_SND_BT87X=m +CONFIG_SND_CS46XX=m +CONFIG_SND_CS46XX_NEW_DSP=y +CONFIG_SND_CS4281=m +CONFIG_SND_EMU10K1=m +CONFIG_SND_KORG1212=m +CONFIG_SND_MIXART=m +CONFIG_SND_NM256=m +CONFIG_SND_RME32=m +CONFIG_SND_RME96=m +CONFIG_SND_RME9652=m +CONFIG_SND_HDSP=m +CONFIG_SND_TRIDENT=m +CONFIG_SND_YMFPCI=m +CONFIG_SND_ALS4000=m +CONFIG_SND_CMIPCI=m +CONFIG_SND_ENS1370=m +CONFIG_SND_ENS1371=m +CONFIG_SND_ES1938=m +CONFIG_SND_ES1968=m +CONFIG_SND_MAESTRO3=m +CONFIG_SND_FM801=m +CONFIG_SND_FM801_TEA575X=m +CONFIG_SND_ICE1712=m +CONFIG_SND_ICE1724=m +CONFIG_SND_INTEL8X0=m +CONFIG_SND_INTEL8X0M=m +CONFIG_SND_SONICVIBES=m +CONFIG_SND_VIA82XX=m +CONFIG_SND_VX222=m + +# +# ALSA USB devices +# +CONFIG_SND_USB_AUDIO=m + +# +# PCMCIA devices +# +CONFIG_SND_VXPOCKET=m +CONFIG_SND_VXP440=m +CONFIG_SND_PDAUDIOCF=m + +# +# Open Sound System +# +CONFIG_SOUND_PRIME=m +CONFIG_SOUND_BT878=m +CONFIG_SOUND_CMPCI=m +# CONFIG_SOUND_CMPCI_FM is not set +# CONFIG_SOUND_CMPCI_MIDI is not set +CONFIG_SOUND_CMPCI_JOYSTICK=y +CONFIG_SOUND_EMU10K1=m +CONFIG_MIDI_EMU10K1=y +CONFIG_SOUND_FUSION=m +CONFIG_SOUND_CS4281=m +CONFIG_SOUND_ES1370=m +CONFIG_SOUND_ES1371=m +CONFIG_SOUND_ESSSOLO1=m +CONFIG_SOUND_MAESTRO=m +CONFIG_SOUND_MAESTRO3=m +CONFIG_SOUND_ICH=m +CONFIG_SOUND_SONICVIBES=m +CONFIG_SOUND_TRIDENT=m +# CONFIG_SOUND_MSNDCLAS is not set +# CONFIG_SOUND_MSNDPIN is not set +CONFIG_SOUND_VIA82CXXX=m +CONFIG_MIDI_VIA82CXXX=y +CONFIG_SOUND_OSS=m +# CONFIG_SOUND_TRACEINIT is not set +# CONFIG_SOUND_DMAP is not set +# CONFIG_SOUND_AD1816 is not set +CONFIG_SOUND_AD1889=m +CONFIG_SOUND_SGALAXY=m +CONFIG_SOUND_ADLIB=m +CONFIG_SOUND_ACI_MIXER=m +CONFIG_SOUND_CS4232=m +CONFIG_SOUND_SSCAPE=m +CONFIG_SOUND_GUS=m +CONFIG_SOUND_GUS16=y +CONFIG_SOUND_GUSMAX=y +CONFIG_SOUND_VMIDI=m +CONFIG_SOUND_TRIX=m +CONFIG_SOUND_MSS=m +CONFIG_SOUND_MPU401=m +CONFIG_SOUND_NM256=m +CONFIG_SOUND_MAD16=m +CONFIG_MAD16_OLDCARD=y +CONFIG_SOUND_PAS=m +CONFIG_SOUND_PSS=m +CONFIG_PSS_MIXER=y +CONFIG_SOUND_SB=m +# CONFIG_SOUND_AWE32_SYNTH is not set +CONFIG_SOUND_WAVEFRONT=m +CONFIG_SOUND_MAUI=m +CONFIG_SOUND_YM3812=m +CONFIG_SOUND_OPL3SA1=m +CONFIG_SOUND_OPL3SA2=m +CONFIG_SOUND_YMFPCI=m +# CONFIG_SOUND_YMFPCI_LEGACY is not set +CONFIG_SOUND_UART6850=m +CONFIG_SOUND_AEDSP16=m +CONFIG_SC6600=y +CONFIG_SC6600_JOY=y +CONFIG_SC6600_CDROM=4 +CONFIG_SC6600_CDROMBASE=0x0 +# CONFIG_AEDSP16_MSS is not set +# CONFIG_AEDSP16_SBPRO is not set +# CONFIG_AEDSP16_MPU401 is not set +CONFIG_SOUND_TVMIXER=m +CONFIG_SOUND_KAHLUA=m +CONFIG_SOUND_ALI5455=m +CONFIG_SOUND_FORTE=m +CONFIG_SOUND_RME96XX=m +CONFIG_SOUND_AD1980=m + +# +# USB support +# +CONFIG_USB=m +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +CONFIG_USB_BANDWIDTH=y +# CONFIG_USB_DYNAMIC_MINORS is not set + +# +# USB Host Controller Drivers +# +CONFIG_USB_EHCI_HCD=m +CONFIG_USB_EHCI_SPLIT_ISO=y +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_OHCI_HCD=m +CONFIG_USB_UHCI_HCD=m + +# +# USB Device Class drivers +# +CONFIG_USB_AUDIO=m + +# +# USB Bluetooth TTY can only be used with disabled Bluetooth subsystem +# +CONFIG_USB_MIDI=m +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +CONFIG_USB_STORAGE_RW_DETECT=y +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_DPCM=y +CONFIG_USB_STORAGE_HP8200e=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y + +# +# USB Human Interface Devices (HID) +# +CONFIG_USB_HID=m +CONFIG_USB_HIDINPUT=y +# CONFIG_HID_FF is not set +CONFIG_USB_HIDDEV=y + +# +# USB HID Boot Protocol drivers +# +CONFIG_USB_KBD=m +CONFIG_USB_MOUSE=m +CONFIG_USB_AIPTEK=m +CONFIG_USB_WACOM=m +CONFIG_USB_KBTAB=m +CONFIG_USB_POWERMATE=m +CONFIG_USB_MTOUCH=m +CONFIG_USB_EGALAX=m +CONFIG_USB_XPAD=m +CONFIG_USB_ATI_REMOTE=m + +# +# USB Imaging devices +# +CONFIG_USB_MDC800=m +CONFIG_USB_MICROTEK=m +CONFIG_USB_HPUSBSCSI=m + +# +# USB Multimedia devices +# +CONFIG_USB_VICAM=m +CONFIG_USB_DSBR=m +CONFIG_USB_IBMCAM=m +CONFIG_USB_KONICAWC=m +CONFIG_USB_OV511=m +CONFIG_USB_PWC=m +CONFIG_USB_SE401=m +CONFIG_USB_SN9C102=m +CONFIG_USB_STV680=m +CONFIG_USB_W9968CF=m + +# +# USB Network adaptors +# +CONFIG_USB_CATC=m +CONFIG_USB_KAWETH=m +CONFIG_USB_PEGASUS=m +CONFIG_USB_RTL8150=m +CONFIG_USB_USBNET=m + +# +# USB Host-to-Host Cables +# +CONFIG_USB_ALI_M5632=y +CONFIG_USB_AN2720=y +CONFIG_USB_BELKIN=y +CONFIG_USB_GENESYS=y +CONFIG_USB_NET1080=y +CONFIG_USB_PL2301=y + +# +# Intelligent USB Devices/Gadgets +# +CONFIG_USB_ARMLINUX=y +CONFIG_USB_EPSON2888=y +CONFIG_USB_ZAURUS=y +CONFIG_USB_CDCETHER=y + +# +# USB Network Adapters +# +CONFIG_USB_AX8817X=y + +# +# USB port drivers +# +CONFIG_USB_USS720=m + +# +# USB Serial Converter support +# +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_BELKIN=m +# CONFIG_USB_SERIAL_WHITEHEAT is not set +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m +CONFIG_USB_SERIAL_EMPEG=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_VISOR=m +CONFIG_USB_SERIAL_IPAQ=m +CONFIG_USB_SERIAL_IR=m +CONFIG_USB_SERIAL_EDGEPORT=m +CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_KEYSPAN_PDA=m +CONFIG_USB_SERIAL_KEYSPAN=m +CONFIG_USB_SERIAL_KLSI=m +CONFIG_USB_SERIAL_KOBIL_SCT=m +CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_SAFE=m +# CONFIG_USB_SERIAL_SAFE_PADDED is not set +CONFIG_USB_SERIAL_CYBERJACK=m +CONFIG_USB_SERIAL_XIRCOM=m +CONFIG_USB_SERIAL_OMNINET=m +CONFIG_USB_EZUSB=y + +# +# USB Miscellaneous drivers +# +CONFIG_USB_TIGL=m +CONFIG_USB_AUERSWALD=m +CONFIG_USB_RIO500=m +CONFIG_USB_LEGOTOWER=m +CONFIG_USB_LCD=m +CONFIG_USB_LED=m +CONFIG_USB_CYTHERM=m +CONFIG_USB_SPEEDTOUCH=m +CONFIG_USB_PHIDGETSERVO=m +CONFIG_USB_TEST=m +CONFIG_USB_EAGLE=m + +# +# USB Gadget Support +# +CONFIG_USB_GADGET=m +CONFIG_USB_GADGET_NET2280=y +CONFIG_USB_NET2280=m +# CONFIG_USB_GADGET_PXA2XX is not set +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_SA1100 is not set +# CONFIG_USB_GADGET_DUMMY_HCD is not set +CONFIG_USB_GADGET_DUALSPEED=y +CONFIG_USB_ZERO=m +CONFIG_USB_ETH=m +CONFIG_USB_ETH_RNDIS=y +CONFIG_USB_GADGETFS=m +CONFIG_USB_FILE_STORAGE=m +# CONFIG_USB_FILE_STORAGE_TEST is not set +CONFIG_USB_G_SERIAL=m + +# +# File systems +# +CONFIG_EXT2_FS=m +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_POSIX_ACL=y +CONFIG_EXT2_FS_SECURITY=y +CONFIG_EXT3_FS=m +CONFIG_EXT3_FS_XATTR=y +CONFIG_EXT3_FS_POSIX_ACL=y +CONFIG_EXT3_FS_SECURITY=y +CONFIG_JBD=m +# CONFIG_JBD_DEBUG is not set +CONFIG_FS_MBCACHE=m +CONFIG_REISERFS_FS=m +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +# CONFIG_REISERFS_FS_XATTR is not set +CONFIG_JFS_FS=m +CONFIG_JFS_POSIX_ACL=y +# CONFIG_JFS_DEBUG is not set +CONFIG_JFS_STATISTICS=y +CONFIG_FS_POSIX_ACL=y +CONFIG_XFS_FS=m +CONFIG_XFS_RT=y +CONFIG_XFS_QUOTA=y +CONFIG_XFS_SECURITY=y +CONFIG_XFS_POSIX_ACL=y +CONFIG_MINIX_FS=m +CONFIG_ROMFS_FS=m +CONFIG_QUOTA=y +CONFIG_QFMT_V1=m +CONFIG_QFMT_V2=m +CONFIG_QUOTACTL=y +CONFIG_AUTOFS_FS=m +CONFIG_AUTOFS4_FS=m + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=m +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_ZISOFS_FS=m +CONFIG_UDF_FS=m +CONFIG_UDF_NLS=y + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +CONFIG_NTFS_FS=m +# CONFIG_NTFS_DEBUG is not set +# CONFIG_NTFS_RW is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_SYSFS=y +CONFIG_DEVFS_FS=y +# CONFIG_DEVFS_MOUNT is not set +# CONFIG_DEVFS_DEBUG is not set +CONFIG_DEVPTS_FS_XATTR=y +CONFIG_DEVPTS_FS_SECURITY=y +CONFIG_TMPFS=y +# CONFIG_HUGETLBFS is not set +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y + +# +# Miscellaneous filesystems +# +CONFIG_ADFS_FS=m +# CONFIG_ADFS_FS_RW is not set +CONFIG_AFFS_FS=m +CONFIG_ASFS_FS=m +# CONFIG_ASFS_RW is not set +CONFIG_HFS_FS=m +CONFIG_HFSPLUS_FS=m +CONFIG_BEFS_FS=m +# CONFIG_BEFS_DEBUG is not set +CONFIG_BFS_FS=m +CONFIG_EFS_FS=m +CONFIG_JFFS_FS=m +CONFIG_JFFS_FS_VERBOSE=0 +CONFIG_JFFS_PROC_FS=y +CONFIG_JFFS2_FS=m +CONFIG_JFFS2_FS_DEBUG=0 +# CONFIG_JFFS2_FS_NAND is not set +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set +CONFIG_JFFS2_ZLIB=y +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +CONFIG_CRAMFS=y +CONFIG_VXFS_FS=m +CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +# CONFIG_QNX4FS_RW is not set +CONFIG_SYSV_FS=m +CONFIG_UFS_FS=m +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=m +CONFIG_NFS_V3=y +CONFIG_NFS_V4=y +CONFIG_NFS_DIRECTIO=y +CONFIG_NFSD=m +CONFIG_NFSD_V3=y +CONFIG_NFSD_V4=y +CONFIG_NFSD_TCP=y +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=m +CONFIG_SUNRPC=m +CONFIG_SUNRPC_GSS=m +CONFIG_RPCSEC_GSS_KRB5=m +CONFIG_SMB_FS=m +# CONFIG_SMB_NLS_DEFAULT is not set +CONFIG_CIFS=m +# CONFIG_CIFS_STATS is not set +# CONFIG_CIFS_XATTR is not set +# CONFIG_CIFS_POSIX is not set +CONFIG_NCP_FS=m +CONFIG_NCPFS_PACKET_SIGNING=y +CONFIG_NCPFS_IOCTL_LOCKING=y +CONFIG_NCPFS_STRONG=y +CONFIG_NCPFS_NFS_NS=y +CONFIG_NCPFS_OS2_NS=y +# CONFIG_NCPFS_SMALLDOS is not set +CONFIG_NCPFS_NLS=y +CONFIG_NCPFS_EXTRAS=y +CONFIG_CODA_FS=m +# CONFIG_CODA_FS_OLD_API is not set +CONFIG_AFS_FS=m +CONFIG_RXRPC=m + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +CONFIG_ACORN_PARTITION=y +CONFIG_ACORN_PARTITION_CUMANA=y +# CONFIG_ACORN_PARTITION_EESOX is not set +CONFIG_ACORN_PARTITION_ICS=y +# CONFIG_ACORN_PARTITION_ADFS is not set +# CONFIG_ACORN_PARTITION_POWERTEC is not set +CONFIG_ACORN_PARTITION_RISCIX=y +CONFIG_OSF_PARTITION=y +CONFIG_AMIGA_PARTITION=y +CONFIG_ATARI_PARTITION=y +CONFIG_MAC_PARTITION=y +CONFIG_MSDOS_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_LDM_PARTITION=y +# CONFIG_LDM_DEBUG is not set +CONFIG_SGI_PARTITION=y +CONFIG_ULTRIX_PARTITION=y +CONFIG_SUN_PARTITION=y +# CONFIG_EFI_PARTITION is not set + +# +# Native Language Support +# +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="cp437" +CONFIG_NLS_CODEPAGE_437=m +CONFIG_NLS_CODEPAGE_737=m +CONFIG_NLS_CODEPAGE_775=m +CONFIG_NLS_CODEPAGE_850=m +CONFIG_NLS_CODEPAGE_852=m +CONFIG_NLS_CODEPAGE_855=m +CONFIG_NLS_CODEPAGE_857=m +CONFIG_NLS_CODEPAGE_860=m +CONFIG_NLS_CODEPAGE_861=m +CONFIG_NLS_CODEPAGE_862=m +CONFIG_NLS_CODEPAGE_863=m +CONFIG_NLS_CODEPAGE_864=m +CONFIG_NLS_CODEPAGE_865=m +CONFIG_NLS_CODEPAGE_866=m +CONFIG_NLS_CODEPAGE_869=m +CONFIG_NLS_CODEPAGE_936=m +CONFIG_NLS_CODEPAGE_950=m +CONFIG_NLS_CODEPAGE_932=m +CONFIG_NLS_CODEPAGE_949=m +CONFIG_NLS_CODEPAGE_874=m +CONFIG_NLS_ISO8859_8=m +CONFIG_NLS_CODEPAGE_1250=m +CONFIG_NLS_CODEPAGE_1251=m +CONFIG_NLS_ASCII=m +CONFIG_NLS_ISO8859_1=m +CONFIG_NLS_ISO8859_2=m +CONFIG_NLS_ISO8859_3=m +CONFIG_NLS_ISO8859_4=m +CONFIG_NLS_ISO8859_5=m +CONFIG_NLS_ISO8859_6=m +CONFIG_NLS_ISO8859_7=m +CONFIG_NLS_ISO8859_9=m +CONFIG_NLS_ISO8859_13=m +CONFIG_NLS_ISO8859_14=m +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_KOI8_R=m +CONFIG_NLS_KOI8_U=m +CONFIG_NLS_UTF8=m + +# +# Profiling support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=m + +# +# Kernel hacking +# +CONFIG_DEBUG_KERNEL=y +# CONFIG_EARLY_PRINTK is not set +# CONFIG_DEBUG_STACKOVERFLOW is not set +# CONFIG_DEBUG_STACK_USAGE is not set +# CONFIG_DEBUG_SLAB is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_DEBUG_HIGHMEM is not set +# CONFIG_DEBUG_INFO is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_FRAME_POINTER is not set +# CONFIG_4KSTACKS is not set +CONFIG_X86_FIND_SMP_CONFIG=y +CONFIG_X86_MPPARSE=y + +# +# Security options +# +CONFIG_SECURITY=y +# CONFIG_SECURITY_NETWORK is not set +CONFIG_SECURITY_CAPABILITIES=m +CONFIG_SECURITY_ROOTPLUG=m +# CONFIG_SECURITY_SELINUX is not set + +# +# Cryptographic options +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_SHA1=m +CONFIG_CRYPTO_SHA256=m +CONFIG_CRYPTO_SHA512=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_AES_586=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_KHAZAD=m +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_MICHAEL_MIC=m +CONFIG_CRYPTO_CRC32C=m +CONFIG_CRYPTO_TEST=m + +# +# Library routines +# +CONFIG_CRC_CCITT=m +CONFIG_CRC32=m +CONFIG_LIBCRC32C=m +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=m +CONFIG_X86_SMP=y +CONFIG_X86_HT=y +CONFIG_X86_HT_DISABLE=y +CONFIG_X86_BIOS_REBOOT=y +CONFIG_X86_TRAMPOLINE=y --- linux-source-2.6.8.1-2.6.8.1.orig/debian/config/powerpc/power3 +++ linux-source-2.6.8.1-2.6.8.1/debian/config/powerpc/power3 @@ -0,0 +1,2082 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_MMU=y +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_HAVE_DEC_LOCK=y +CONFIG_PPC=y +CONFIG_PPC32=y +CONFIG_GENERIC_NVRAM=y + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +CONFIG_CLEAN_COMPILE=y +CONFIG_BROKEN_ON_SMP=y + +# +# General setup +# +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_BSD_PROCESS_ACCT=y +# CONFIG_BSD_PROCESS_ACCT_V3 is not set +CONFIG_SYSCTL=y +CONFIG_AUDIT=y +CONFIG_LOG_BUF_SHIFT=14 +CONFIG_HOTPLUG=y +# CONFIG_IKCONFIG is not set +# CONFIG_EMBEDDED is not set +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_OBSOLETE_MODPARM=y +CONFIG_MODVERSIONS=y +CONFIG_KMOD=y + +# +# Processor +# +# CONFIG_6xx is not set +# CONFIG_40x is not set +# CONFIG_44x is not set +CONFIG_POWER3=y +# CONFIG_POWER4 is not set +# CONFIG_8xx is not set +# CONFIG_E500 is not set +# CONFIG_CPU_FREQ is not set +CONFIG_PM=y +CONFIG_PPC64BRIDGE=y +CONFIG_PPC_STD_MMU=y + +# +# Platform options +# +CONFIG_PPC_MULTIPLATFORM=y +# CONFIG_APUS is not set +# CONFIG_WILLOW is not set +# CONFIG_PCORE is not set +# CONFIG_POWERPMC250 is not set +# CONFIG_EV64260 is not set +# CONFIG_SPRUCE is not set +# CONFIG_LOPEC is not set +# CONFIG_MCPN765 is not set +# CONFIG_MVME5100 is not set +# CONFIG_PPLUS is not set +# CONFIG_PRPMC750 is not set +# CONFIG_PRPMC800 is not set +# CONFIG_SANDPOINT is not set +# CONFIG_ADIR is not set +# CONFIG_K2 is not set +# CONFIG_PAL4 is not set +# CONFIG_GEMINI is not set +# CONFIG_EST8260 is not set +# CONFIG_SBC82xx is not set +# CONFIG_SBS8260 is not set +# CONFIG_RPX8260 is not set +# CONFIG_TQM8260 is not set +# CONFIG_ADS8272 is not set +# CONFIG_LITE5200 is not set +CONFIG_PPC_CHRP=y +CONFIG_PPC_PMAC=y +CONFIG_PPC_PREP=y +CONFIG_PPC_OF=y +CONFIG_PPCBUG_NVRAM=y +# CONFIG_SMP is not set +# CONFIG_PREEMPT is not set +CONFIG_HIGHMEM=y +CONFIG_KERNEL_ELF=y +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_MISC=m +CONFIG_PROC_DEVICETREE=y +CONFIG_PREP_RESIDUAL=y +CONFIG_PROC_PREPRESIDUAL=y +CONFIG_CMDLINE_BOOL=y +CONFIG_CMDLINE="console=ttyS0,9600 console=tty0 root=/dev/sda2" + +# +# Bus options +# +# CONFIG_ISA is not set +CONFIG_GENERIC_ISA_DMA=y +CONFIG_PCI=y +CONFIG_PCI_DOMAINS=y +CONFIG_PCI_LEGACY_PROC=y +CONFIG_PCI_NAMES=y + +# +# PCMCIA/CardBus support +# +CONFIG_PCMCIA=m +# CONFIG_PCMCIA_DEBUG is not set +CONFIG_YENTA=m +CONFIG_CARDBUS=y +CONFIG_PD6729=m +CONFIG_I82092=m +CONFIG_TCIC=m + +# +# Advanced setup +# +# CONFIG_ADVANCED_OPTIONS is not set + +# +# Default settings for advanced configuration options are used +# +CONFIG_HIGHMEM_START=0xfe000000 +CONFIG_LOWMEM_SIZE=0x30000000 +CONFIG_KERNEL_START=0xc0000000 +CONFIG_TASK_SIZE=0x80000000 +CONFIG_BOOT_LOAD=0x00800000 + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=m +# CONFIG_DEBUG_DRIVER is not set + +# +# Memory Technology Devices (MTD) +# +# CONFIG_MTD is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Plug and Play support +# + +# +# Block devices +# +CONFIG_BLK_DEV_FD=m +# CONFIG_MAC_FLOPPY is not set +CONFIG_BLK_CPQ_DA=m +CONFIG_BLK_CPQ_CISS_DA=m +CONFIG_CISS_SCSI_TAPE=y +CONFIG_BLK_DEV_DAC960=m +CONFIG_BLK_DEV_UMEM=m +CONFIG_BLK_DEV_LOOP=m +CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_SX8=m +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_BLK_DEV_INITRD=y +CONFIG_LBD=y + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=y +CONFIG_BLK_DEV_IDE=y + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_IDE_SATA is not set +CONFIG_BLK_DEV_IDEDISK=m +# CONFIG_IDEDISK_MULTI_MODE is not set +CONFIG_BLK_DEV_IDECS=m +CONFIG_BLK_DEV_IDECD=m +CONFIG_BLK_DEV_IDETAPE=m +CONFIG_BLK_DEV_IDEFLOPPY=m +CONFIG_BLK_DEV_IDESCSI=m +# CONFIG_IDE_TASK_IOCTL is not set +# CONFIG_IDE_TASKFILE_IO is not set + +# +# IDE chipset support/bugfixes +# +# CONFIG_IDE_GENERIC is not set +CONFIG_BLK_DEV_IDEPCI=y +CONFIG_IDEPCI_SHARE_IRQ=y +# CONFIG_BLK_DEV_OFFBOARD is not set +CONFIG_BLK_DEV_GENERIC=m +# CONFIG_BLK_DEV_OPTI621 is not set +CONFIG_BLK_DEV_SL82C105=m +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +CONFIG_IDEDMA_PCI_AUTO=y +CONFIG_IDEDMA_ONLYDISK=y +CONFIG_BLK_DEV_ADMA=y +CONFIG_BLK_DEV_AEC62XX=m +# CONFIG_BLK_DEV_ALI15X3 is not set +# CONFIG_BLK_DEV_AMD74XX is not set +CONFIG_BLK_DEV_CMD64X=m +# CONFIG_BLK_DEV_TRIFLEX is not set +# CONFIG_BLK_DEV_CY82C693 is not set +# CONFIG_BLK_DEV_CS5520 is not set +# CONFIG_BLK_DEV_CS5530 is not set +CONFIG_BLK_DEV_HPT34X=m +# CONFIG_HPT34X_AUTODMA is not set +CONFIG_BLK_DEV_HPT366=m +CONFIG_BLK_DEV_SC1200=m +# CONFIG_BLK_DEV_PIIX is not set +CONFIG_BLK_DEV_NS87415=m +CONFIG_BLK_DEV_PDC202XX_OLD=m +# CONFIG_PDC202XX_BURST is not set +CONFIG_BLK_DEV_PDC202XX_NEW=m +CONFIG_PDC202XX_FORCE=y +# CONFIG_BLK_DEV_SVWKS is not set +CONFIG_BLK_DEV_SIIMAGE=m +# CONFIG_BLK_DEV_SLC90E66 is not set +CONFIG_BLK_DEV_TRM290=m +CONFIG_BLK_DEV_VIA82CXXX=m +CONFIG_BLK_DEV_IDE_PMAC=y +CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y +CONFIG_BLK_DEV_IDEDMA_PMAC=y +# CONFIG_BLK_DEV_IDE_PMAC_BLINK is not set +CONFIG_BLK_DEV_IDEDMA_PMAC_AUTO=y +# CONFIG_IDE_ARM is not set +CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_IVB is not set +CONFIG_IDEDMA_AUTO=y +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +CONFIG_SCSI=m +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +CONFIG_CHR_DEV_ST=m +CONFIG_CHR_DEV_OSST=m +CONFIG_BLK_DEV_SR=m +CONFIG_BLK_DEV_SR_VENDOR=y +CONFIG_CHR_DEV_SG=m +CONFIG_CHR_DEV_SCH=m + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y + +# +# SCSI Transport Attributes +# +CONFIG_SCSI_SPI_ATTRS=m +CONFIG_SCSI_FC_ATTRS=m + +# +# SCSI low-level drivers +# +CONFIG_BLK_DEV_3W_XXXX_RAID=m +CONFIG_SCSI_3W_9XXX=m +CONFIG_SCSI_ACARD=m +CONFIG_SCSI_AACRAID=m +CONFIG_SCSI_AIC7XXX=m +CONFIG_AIC7XXX_CMDS_PER_DEVICE=32 +CONFIG_AIC7XXX_RESET_DELAY_MS=15000 +# CONFIG_AIC7XXX_BUILD_FIRMWARE is not set +CONFIG_AIC7XXX_DEBUG_ENABLE=y +CONFIG_AIC7XXX_DEBUG_MASK=0 +CONFIG_AIC7XXX_REG_PRETTY_PRINT=y +CONFIG_SCSI_AIC7XXX_OLD=m +CONFIG_SCSI_AIC79XX=m +CONFIG_AIC79XX_CMDS_PER_DEVICE=32 +CONFIG_AIC79XX_RESET_DELAY_MS=15000 +# CONFIG_AIC79XX_BUILD_FIRMWARE is not set +# CONFIG_AIC79XX_ENABLE_RD_STRM is not set +CONFIG_AIC79XX_DEBUG_ENABLE=y +CONFIG_AIC79XX_DEBUG_MASK=0 +CONFIG_AIC79XX_REG_PRETTY_PRINT=y +CONFIG_SCSI_DPT_I2O=m +CONFIG_SCSI_MEGARAID=m +CONFIG_SCSI_SATA=y +CONFIG_SCSI_SATA_SVW=m +# CONFIG_SCSI_ATA_PIIX is not set +# CONFIG_SCSI_SATA_NV is not set +CONFIG_SCSI_SATA_PROMISE=m +CONFIG_SCSI_SATA_SX4=m +CONFIG_SCSI_SATA_SIL=m +CONFIG_SCSI_SATA_SIS=m +CONFIG_SCSI_SATA_VIA=m +CONFIG_SCSI_SATA_VITESSE=m +CONFIG_SCSI_BUSLOGIC=m +# CONFIG_SCSI_OMIT_FLASHPOINT is not set +CONFIG_SCSI_DMX3191D=m +CONFIG_SCSI_EATA=m +# CONFIG_SCSI_EATA_TAGGED_QUEUE is not set +# CONFIG_SCSI_EATA_LINKED_COMMANDS is not set +CONFIG_SCSI_EATA_MAX_TAGS=16 +CONFIG_SCSI_EATA_PIO=m +CONFIG_SCSI_FUTURE_DOMAIN=m +# CONFIG_SCSI_GDTH is not set +CONFIG_SCSI_IPS=m +CONFIG_SCSI_INIA100=m +CONFIG_SCSI_SYM53C8XX_2=m +CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 +CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 +CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 +# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set +CONFIG_SCSI_IPR=m +# CONFIG_SCSI_IPR_TRACE is not set +# CONFIG_SCSI_IPR_DUMP is not set +CONFIG_SCSI_QLOGIC_ISP=m +CONFIG_SCSI_QLOGIC_FC=m +# CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set +CONFIG_SCSI_QLOGIC_1280=m +CONFIG_SCSI_DC395x=m +CONFIG_SCSI_DC390T=m +CONFIG_SCSI_NSP32=m +# CONFIG_SCSI_DEBUG is not set +CONFIG_SCSI_MESH=m +CONFIG_SCSI_MESH_SYNC_RATE=5 +CONFIG_SCSI_MESH_RESET_DELAY_MS=4000 +CONFIG_SCSI_MAC53C94=m + +# +# PCMCIA SCSI adapter support +# +CONFIG_PCMCIA_AHA152X=m +CONFIG_PCMCIA_FDOMAIN=m +CONFIG_PCMCIA_NINJA_SCSI=m +CONFIG_PCMCIA_QLOGIC=m +CONFIG_PCMCIA_SYM53C500=m + +# +# Multi-device support (RAID and LVM) +# +CONFIG_MD=y +CONFIG_BLK_DEV_MD=m +CONFIG_MD_LINEAR=m +CONFIG_MD_RAID0=m +CONFIG_MD_RAID1=m +CONFIG_MD_RAID5=m +CONFIG_MD_RAID6=m +CONFIG_MD_MULTIPATH=m +CONFIG_BLK_DEV_DM=m +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=m +CONFIG_DM_MIRROR=m +CONFIG_DM_ZERO=m + +# +# Fusion MPT device support +# +CONFIG_FUSION=m +CONFIG_FUSION_MAX_SGE=40 +CONFIG_FUSION_ISENSE=m +CONFIG_FUSION_CTL=m +# CONFIG_FUSION_LAN is not set + +# +# IEEE 1394 (FireWire) support +# +CONFIG_IEEE1394=m + +# +# Subsystem Options +# +# CONFIG_IEEE1394_VERBOSEDEBUG is not set +CONFIG_IEEE1394_OUI_DB=y +CONFIG_IEEE1394_EXTRA_CONFIG_ROMS=y +CONFIG_IEEE1394_CONFIG_ROM_IP1394=y + +# +# Device Drivers +# +CONFIG_IEEE1394_PCILYNX=m +CONFIG_IEEE1394_OHCI1394=m + +# +# Protocol Drivers +# +CONFIG_IEEE1394_VIDEO1394=m +CONFIG_IEEE1394_SBP2=m +CONFIG_IEEE1394_SBP2_PHYS_DMA=y +CONFIG_IEEE1394_ETH1394=m +CONFIG_IEEE1394_DV1394=m +CONFIG_IEEE1394_RAWIO=m +CONFIG_IEEE1394_CMP=m +CONFIG_IEEE1394_AMDTP=m + +# +# I2O device support +# +CONFIG_I2O=m +CONFIG_I2O_CONFIG=m +CONFIG_I2O_BLOCK=m +CONFIG_I2O_SCSI=m +CONFIG_I2O_PROC=m + +# +# Macintosh device drivers +# +CONFIG_ADB=y +CONFIG_ADB_CUDA=y +CONFIG_ADB_PMU=y +CONFIG_PMAC_PBOOK=y +CONFIG_PMAC_APM_EMU=m +CONFIG_PMAC_BACKLIGHT=y +CONFIG_ADB_MACIO=y +CONFIG_INPUT_ADBHID=y +CONFIG_MAC_EMUMOUSEBTN=y +CONFIG_THERM_WINDTUNNEL=m +CONFIG_THERM_ADT746X=m +CONFIG_ANSLCD=m + +# +# Networking support +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=m +# CONFIG_PACKET_MMAP is not set +CONFIG_NETLINK_DEV=m +CONFIG_UNIX=m +CONFIG_NET_KEY=m +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_FWMARK=y +CONFIG_IP_ROUTE_NAT=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_TOS=y +CONFIG_IP_ROUTE_VERBOSE=y +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE=m +CONFIG_NET_IPGRE_BROADCAST=y +CONFIG_IP_MROUTE=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +CONFIG_ARPD=y +# CONFIG_SYN_COOKIES is not set +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +CONFIG_INET_IPCOMP=m + +# +# IP: Virtual Server Configuration +# +CONFIG_IP_VS=m +# CONFIG_IP_VS_DEBUG is not set +CONFIG_IP_VS_TAB_BITS=12 + +# +# IPVS transport protocol load balancing support +# +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_PROTO_ESP=y +CONFIG_IP_VS_PROTO_AH=y + +# +# IPVS scheduler +# +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_WRR=m +CONFIG_IP_VS_LC=m +CONFIG_IP_VS_WLC=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m + +# +# IPVS application helper +# +CONFIG_IP_VS_FTP=m +CONFIG_IPV6=m +CONFIG_IPV6_PRIVACY=y +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +CONFIG_INET6_IPCOMP=m +CONFIG_IPV6_TUNNEL=m +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_BRIDGE_NETFILTER=y + +# +# IP: Netfilter Configuration +# +CONFIG_IP_NF_CONNTRACK=m +CONFIG_IP_NF_FTP=m +CONFIG_IP_NF_IRC=m +CONFIG_IP_NF_TFTP=m +CONFIG_IP_NF_AMANDA=m +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_LIMIT=m +# CONFIG_IP_NF_MATCH_IPRANGE is not set +CONFIG_IP_NF_MATCH_MAC=m +CONFIG_IP_NF_MATCH_PKTTYPE=m +CONFIG_IP_NF_MATCH_MARK=m +CONFIG_IP_NF_MATCH_MULTIPORT=m +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_DSCP=m +# CONFIG_IP_NF_MATCH_AH_ESP is not set +CONFIG_IP_NF_MATCH_LENGTH=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_TCPMSS=m +CONFIG_IP_NF_MATCH_HELPER=m +CONFIG_IP_NF_MATCH_STATE=m +CONFIG_IP_NF_MATCH_CONNTRACK=m +CONFIG_IP_NF_MATCH_OWNER=m +# CONFIG_IP_NF_MATCH_PHYSDEV is not set +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_REDIRECT=m +# CONFIG_IP_NF_TARGET_NETMAP is not set +# CONFIG_IP_NF_TARGET_SAME is not set +CONFIG_IP_NF_NAT_LOCAL=y +CONFIG_IP_NF_NAT_SNMP_BASIC=m +CONFIG_IP_NF_NAT_IRC=m +CONFIG_IP_NF_NAT_FTP=m +CONFIG_IP_NF_NAT_TFTP=m +CONFIG_IP_NF_NAT_AMANDA=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_DSCP=m +CONFIG_IP_NF_TARGET_MARK=m +# CONFIG_IP_NF_TARGET_CLASSIFY is not set +CONFIG_IP_NF_TARGET_LOG=m +# CONFIG_IP_NF_TARGET_ULOG is not set +CONFIG_IP_NF_TARGET_TCPMSS=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +# CONFIG_IP_NF_COMPAT_IPCHAINS is not set +# CONFIG_IP_NF_COMPAT_IPFWADM is not set +CONFIG_IP_NF_TARGET_NOTRACK=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_MATCH_ADDRTYPE=m +CONFIG_IP_NF_MATCH_REALM=m + +# +# IPv6: Netfilter Configuration +# +# CONFIG_IP6_NF_QUEUE is not set +# CONFIG_IP6_NF_IPTABLES is not set + +# +# DECnet: Netfilter Configuration +# +# CONFIG_DECNET_NF_GRABULATOR is not set + +# +# Bridge: Netfilter Configuration +# +# CONFIG_BRIDGE_NF_EBTABLES is not set +CONFIG_XFRM=y +CONFIG_XFRM_USER=m + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IP_SCTP=m +# CONFIG_SCTP_DBG_MSG is not set +# CONFIG_SCTP_DBG_OBJCNT is not set +# CONFIG_SCTP_HMAC_NONE is not set +# CONFIG_SCTP_HMAC_SHA1 is not set +CONFIG_SCTP_HMAC_MD5=y +CONFIG_ATM=m +CONFIG_ATM_CLIP=m +CONFIG_ATM_CLIP_NO_ICMP=y +CONFIG_ATM_LANE=m +CONFIG_ATM_MPOA=m +CONFIG_ATM_BR2684=m +# CONFIG_ATM_BR2684_IPFILTER is not set +CONFIG_BRIDGE=m +CONFIG_VLAN_8021Q=m +CONFIG_DECNET=m +CONFIG_DECNET_SIOCGIFCONF=y +CONFIG_DECNET_ROUTER=y +CONFIG_DECNET_ROUTE_FWMARK=y +CONFIG_LLC=y +CONFIG_LLC2=m +CONFIG_IPX=m +CONFIG_IPX_INTERN=y +CONFIG_ATALK=m +CONFIG_DEV_APPLETALK=y +CONFIG_IPDDP=m +CONFIG_IPDDP_ENCAP=y +CONFIG_IPDDP_DECAP=y +CONFIG_X25=m +CONFIG_LAPB=m +CONFIG_NET_DIVERT=y +CONFIG_ECONET=m +CONFIG_ECONET_AUNUDP=y +CONFIG_ECONET_NATIVE=y +CONFIG_WAN_ROUTER=m +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_CLK_JIFFIES=y +# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set +# CONFIG_NET_SCH_CLK_CPU is not set +CONFIG_NET_SCH_CBQ=m +CONFIG_NET_SCH_HTB=m +CONFIG_NET_SCH_HFSC=m +CONFIG_NET_SCH_ATM=m +CONFIG_NET_SCH_PRIO=m +CONFIG_NET_SCH_RED=m +CONFIG_NET_SCH_SFQ=m +CONFIG_NET_SCH_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_NETEM=m +CONFIG_NET_SCH_INGRESS=m +CONFIG_NET_QOS=y +CONFIG_NET_ESTIMATOR=y +CONFIG_NET_CLS=y +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_ROUTE=y +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +# CONFIG_CLS_U32_PERF is not set +# CONFIG_NET_CLS_IND is not set +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +# CONFIG_NET_CLS_ACT is not set +CONFIG_NET_CLS_POLICE=y + +# +# Network testing +# +CONFIG_NET_PKTGEN=m +CONFIG_NETPOLL=y +CONFIG_NETPOLL_RX=y +CONFIG_NETPOLL_TRAP=y +CONFIG_NET_POLL_CONTROLLER=y +CONFIG_HAMRADIO=y + +# +# Packet Radio protocols +# +CONFIG_AX25=m +CONFIG_AX25_DAMA_SLAVE=y +CONFIG_NETROM=m +CONFIG_ROSE=m + +# +# AX.25 network device drivers +# +CONFIG_MKISS=m +CONFIG_6PACK=m +CONFIG_BPQETHER=m +CONFIG_BAYCOM_SER_FDX=m +CONFIG_BAYCOM_SER_HDX=m +CONFIG_YAM=m +CONFIG_IRDA=m + +# +# IrDA protocols +# +CONFIG_IRLAN=m +CONFIG_IRNET=m +CONFIG_IRCOMM=m +CONFIG_IRDA_ULTRA=y + +# +# IrDA options +# +CONFIG_IRDA_CACHE_LAST_LSAP=y +CONFIG_IRDA_FAST_RR=y +CONFIG_IRDA_DEBUG=y + +# +# Infrared-port device drivers +# + +# +# SIR device drivers +# +CONFIG_IRTTY_SIR=m + +# +# Dongle support +# +# CONFIG_DONGLE is not set + +# +# Old SIR device drivers +# +# CONFIG_IRPORT_SIR is not set + +# +# Old Serial dongle support +# + +# +# FIR device drivers +# +# CONFIG_USB_IRDA is not set +# CONFIG_SIGMATEL_FIR is not set +# CONFIG_TOSHIBA_FIR is not set +# CONFIG_VLSI_FIR is not set +CONFIG_BT=m +CONFIG_BT_L2CAP=m +CONFIG_BT_SCO=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_CMTP=m +CONFIG_BT_HIDP=m + +# +# Bluetooth device drivers +# +CONFIG_BT_HCIUSB=m +CONFIG_BT_HCIUSB_SCO=y +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_H4=y +CONFIG_BT_HCIUART_BCSP=y +CONFIG_BT_HCIUART_BCSP_TXCRC=y +CONFIG_BT_HCIBCM203X=m +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIDTL1=m +CONFIG_BT_HCIBT3C=m +CONFIG_BT_HCIBLUECARD=m +CONFIG_BT_HCIBTUART=m +CONFIG_BT_HCIVHCI=m +CONFIG_NETDEVICES=y +CONFIG_DUMMY=m +CONFIG_BONDING=m +CONFIG_EQUALIZER=m +CONFIG_TUN=m +CONFIG_ETHERTAP=m + +# +# ARCnet devices +# +CONFIG_ARCNET=m +CONFIG_ARCNET_1201=m +CONFIG_ARCNET_1051=m +CONFIG_ARCNET_RAW=m +CONFIG_ARCNET_COM90xx=m +CONFIG_ARCNET_COM90xxIO=m +CONFIG_ARCNET_RIM_I=m +CONFIG_ARCNET_COM20020=m +CONFIG_ARCNET_COM20020_PCI=m + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=y +CONFIG_MACE=m +# CONFIG_MACE_AAUI_PORT is not set +CONFIG_BMAC=m +CONFIG_HAPPYMEAL=m +CONFIG_SUNGEM=m +CONFIG_NET_VENDOR_3COM=y +CONFIG_VORTEX=m +CONFIG_TYPHOON=m + +# +# Tulip family network device support +# +CONFIG_NET_TULIP=y +CONFIG_DE2104X=m +CONFIG_TULIP=m +# CONFIG_TULIP_MWI is not set +# CONFIG_TULIP_MMIO is not set +# CONFIG_TULIP_NAPI is not set +CONFIG_DE4X5=m +CONFIG_WINBOND_840=m +CONFIG_DM9102=m +CONFIG_PCMCIA_XIRCOM=m +CONFIG_PCMCIA_XIRTULIP=m +CONFIG_HP100=m +CONFIG_NET_PCI=y +CONFIG_PCNET32=m +# CONFIG_AMD8111_ETH is not set +CONFIG_ADAPTEC_STARFIRE=m +# CONFIG_ADAPTEC_STARFIRE_NAPI is not set +CONFIG_B44=m +# CONFIG_FORCEDETH is not set +CONFIG_EEPRO100=m +# CONFIG_EEPRO100_PIO is not set +CONFIG_E100=m +# CONFIG_E100_NAPI is not set +CONFIG_FEALNX=m +CONFIG_NATSEMI=m +CONFIG_NE2K_PCI=m +CONFIG_8139CP=m +CONFIG_8139TOO=m +CONFIG_8139TOO_PIO=y +# CONFIG_8139TOO_TUNE_TWISTER is not set +CONFIG_8139TOO_8129=y +# CONFIG_8139_OLD_RX_RESET is not set +CONFIG_SIS900=m +CONFIG_EPIC100=m +CONFIG_SUNDANCE=m +CONFIG_SUNDANCE_MMIO=y +CONFIG_TLAN=m +CONFIG_VIA_RHINE=m +CONFIG_VIA_RHINE_MMIO=y +CONFIG_VIA_VELOCITY=m + +# +# Ethernet (1000 Mbit) +# +CONFIG_DL2K=m +CONFIG_E1000=m +# CONFIG_E1000_NAPI is not set +CONFIG_NS83820=m +CONFIG_HAMACHI=m +CONFIG_YELLOWFIN=m +CONFIG_R8169=m +CONFIG_SK98LIN=m +CONFIG_TIGON3=m +CONFIG_MV64340_ETH=m +# CONFIG_MV64340_ETH_0 is not set +CONFIG_MV64340_ETH_1=y +# CONFIG_MV64340_ETH_2 is not set + +# +# Ethernet (10000 Mbit) +# +CONFIG_IXGB=m +# CONFIG_IXGB_NAPI is not set +CONFIG_S2IO=m +# CONFIG_S2IO_NAPI is not set + +# +# Token Ring devices +# +CONFIG_TR=y +CONFIG_IBMOL=m +CONFIG_IBMLS=m +CONFIG_3C359=m +CONFIG_TMS380TR=m +CONFIG_TMSPCI=m +CONFIG_ABYSS=m + +# +# Wireless LAN (non-hamradio) +# +CONFIG_NET_RADIO=y + +# +# Obsolete Wireless cards support (pre-802.11) +# +CONFIG_STRIP=m +CONFIG_PCMCIA_WAVELAN=m +CONFIG_PCMCIA_NETWAVE=m + +# +# Wireless 802.11 Frequency Hopping cards support +# +CONFIG_PCMCIA_RAYCS=m + +# +# Wireless 802.11b ISA/PCI cards support +# +CONFIG_IEEE80211=m +# CONFIG_IEEE80211_DEBUG is not set +CONFIG_IEEE80211_CRYPT=m +CONFIG_IEEE80211_WPA=y +CONFIG_IEEE80211_CRYPT_CCMP=m +CONFIG_IEEE80211_CRYPT_TKIP=m +CONFIG_IPW2100=m +# CONFIG_IPW2100_PROMISC is not set +# CONFIG_IPW2100_LEGACY_FW_LOAD is not set +# CONFIG_IPW2100_NOWEP is not set +# CONFIG_IPW2100_DEBUG is not set +CONFIG_IPW2200=m +# CONFIG_IPW2200_NOWEP is not set +CONFIG_WLAN_NG=m +CONFIG_PRISM2=m +CONFIG_PRISM2_USB=m +CONFIG_ACX100=m +CONFIG_ADM8211=m +CONFIG_HERMES=m +CONFIG_APPLE_AIRPORT=m +CONFIG_PLX_HERMES=m +CONFIG_TMD_HERMES=m +CONFIG_PCI_HERMES=m +CONFIG_ATMEL=m +# CONFIG_PCI_ATMEL is not set + +# +# Wireless 802.11b Pcmcia/Cardbus cards support +# +CONFIG_PCMCIA_HERMES=m +CONFIG_AIRO_CS=m +CONFIG_PCMCIA_ATMEL=m +CONFIG_PCMCIA_WL3501=m + +# +# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support +# +CONFIG_PRISM54=m +CONFIG_NET_WIRELESS=y + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +CONFIG_PCMCIA_3C589=m +CONFIG_PCMCIA_3C574=m +CONFIG_PCMCIA_FMVJ18X=m +CONFIG_PCMCIA_PCNET=m +CONFIG_PCMCIA_NMCLAN=m +CONFIG_PCMCIA_SMC91C92=m +CONFIG_PCMCIA_XIRC2PS=m +CONFIG_PCMCIA_AXNET=m +CONFIG_ARCNET_COM20020_CS=m +CONFIG_PCMCIA_IBMTR=m + +# +# Wan interfaces +# +CONFIG_WAN=y +CONFIG_DSCC4=m +# CONFIG_DSCC4_PCISYNC is not set +# CONFIG_DSCC4_PCI_RST is not set +CONFIG_LANMEDIA=m +CONFIG_SYNCLINK_SYNCPPP=m +CONFIG_HDLC=m +CONFIG_HDLC_RAW=y +CONFIG_HDLC_RAW_ETH=y +CONFIG_HDLC_CISCO=y +CONFIG_HDLC_FR=y +CONFIG_HDLC_PPP=y +CONFIG_HDLC_X25=y +CONFIG_PCI200SYN=m +CONFIG_WANXL=m +CONFIG_PC300=m +CONFIG_PC300_MLPPP=y +CONFIG_FARSYNC=m +CONFIG_DLCI=m +CONFIG_DLCI_COUNT=24 +CONFIG_DLCI_MAX=8 +CONFIG_WAN_ROUTER_DRIVERS=y +CONFIG_CYCLADES_SYNC=m +CONFIG_CYCLOMX_X25=y +CONFIG_LAPBETHER=m +CONFIG_X25_ASY=m + +# +# ATM drivers +# +CONFIG_ATM_TCP=m +CONFIG_ATM_LANAI=m +CONFIG_ATM_ENI=m +# CONFIG_ATM_ENI_DEBUG is not set +# CONFIG_ATM_ENI_TUNE_BURST is not set +CONFIG_ATM_FIRESTREAM=m +CONFIG_ATM_ZATM=m +CONFIG_ATM_ZATM_DEBUG=y +CONFIG_ATM_NICSTAR=m +CONFIG_ATM_NICSTAR_USE_SUNI=y +CONFIG_ATM_NICSTAR_USE_IDT77105=y +CONFIG_ATM_IDT77252=m +# CONFIG_ATM_IDT77252_DEBUG is not set +# CONFIG_ATM_IDT77252_RCV_ALL is not set +CONFIG_ATM_IDT77252_USE_SUNI=y +CONFIG_ATM_AMBASSADOR=m +# CONFIG_ATM_AMBASSADOR_DEBUG is not set +CONFIG_ATM_HORIZON=m +# CONFIG_ATM_HORIZON_DEBUG is not set +CONFIG_ATM_IA=m +# CONFIG_ATM_IA_DEBUG is not set +CONFIG_ATM_FORE200E_MAYBE=m +CONFIG_ATM_FORE200E_PCA=y +CONFIG_ATM_FORE200E_PCA_DEFAULT_FW=y +CONFIG_ATM_FORE200E_USE_TASKLET=y +CONFIG_ATM_FORE200E_TX_RETRY=16 +CONFIG_ATM_FORE200E_DEBUG=0 +CONFIG_ATM_FORE200E=m +CONFIG_ATM_HE=m +# CONFIG_ATM_HE_USE_SUNI is not set +CONFIG_FDDI=y +CONFIG_DEFXX=m +CONFIG_SKFP=m +CONFIG_HIPPI=y +# CONFIG_ROADRUNNER is not set +CONFIG_PPP=m +CONFIG_PPP_MULTILINK=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_MPPE=m +CONFIG_PPPOE=m +CONFIG_PPPOATM=m +CONFIG_SLIP=m +# CONFIG_SLIP_COMPRESSED is not set +# CONFIG_SLIP_SMART is not set +# CONFIG_SLIP_MODE_SLIP6 is not set +CONFIG_NET_FC=y +CONFIG_SHAPER=m +CONFIG_NETCONSOLE=m +# CONFIG_NDISWRAPPER is not set + +# +# ISDN subsystem +# +CONFIG_ISDN=m + +# +# Old ISDN4Linux +# +# CONFIG_ISDN_I4L is not set + +# +# CAPI subsystem +# +CONFIG_ISDN_CAPI=m +# CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON is not set +CONFIG_ISDN_CAPI_MIDDLEWARE=y +CONFIG_ISDN_CAPI_CAPI20=m +# CONFIG_ISDN_CAPI_CAPIFS_BOOL is not set + +# +# CAPI hardware drivers +# + +# +# Active AVM cards +# +CONFIG_CAPI_AVM=y +CONFIG_ISDN_DRV_AVMB1_B1PCI=m +CONFIG_ISDN_DRV_AVMB1_B1PCIV4=y +CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m +CONFIG_ISDN_DRV_AVMB1_AVM_CS=m +CONFIG_ISDN_DRV_AVMB1_T1PCI=m +CONFIG_ISDN_DRV_AVMB1_C4=m + +# +# Active Eicon DIVA Server cards +# +CONFIG_CAPI_EICON=y +CONFIG_ISDN_DIVAS=m +CONFIG_ISDN_DIVAS_BRIPCI=y +CONFIG_ISDN_DIVAS_PRIPCI=y +CONFIG_ISDN_DIVAS_DIVACAPI=m +CONFIG_ISDN_DIVAS_USERIDI=m +CONFIG_ISDN_DIVAS_MAINT=m + +# +# Modular ISDN driver +# +# CONFIG_MISDN_DRV is not set + +# +# Telephony Support +# +CONFIG_PHONE=m +CONFIG_PHONE_IXJ=m +CONFIG_PHONE_IXJ_PCMCIA=m + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_MOUSEDEV_PSAUX_ENABLE=y +CONFIG_INPUT_JOYDEV=m +CONFIG_INPUT_TSDEV=m +CONFIG_INPUT_TSDEV_SCREEN_X=240 +CONFIG_INPUT_TSDEV_SCREEN_Y=320 +CONFIG_INPUT_EVDEV=m +CONFIG_INPUT_EVBUG=m + +# +# Input I/O drivers +# +CONFIG_GAMEPORT=m +CONFIG_SOUND_GAMEPORT=m +CONFIG_GAMEPORT_NS558=m +CONFIG_GAMEPORT_L4=m +CONFIG_GAMEPORT_EMU10K1=m +CONFIG_GAMEPORT_VORTEX=m +CONFIG_GAMEPORT_FM801=m +CONFIG_GAMEPORT_CS461x=m +CONFIG_SERIO=m +CONFIG_SERIO_I8042=m +CONFIG_SERIO_SERPORT=m +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PCIPS2 is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=m +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=m +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_VSXXXAA is not set +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_ANALOG=m +CONFIG_JOYSTICK_A3D=m +CONFIG_JOYSTICK_ADI=m +CONFIG_JOYSTICK_COBRA=m +CONFIG_JOYSTICK_GF2K=m +CONFIG_JOYSTICK_GRIP=m +CONFIG_JOYSTICK_GRIP_MP=m +CONFIG_JOYSTICK_GUILLEMOT=m +CONFIG_JOYSTICK_INTERACT=m +CONFIG_JOYSTICK_SIDEWINDER=m +CONFIG_JOYSTICK_TMDC=m +CONFIG_JOYSTICK_IFORCE=m +CONFIG_JOYSTICK_IFORCE_USB=y +CONFIG_JOYSTICK_IFORCE_232=y +CONFIG_JOYSTICK_WARRIOR=m +CONFIG_JOYSTICK_MAGELLAN=m +CONFIG_JOYSTICK_SPACEORB=m +CONFIG_JOYSTICK_SPACEBALL=m +CONFIG_JOYSTICK_STINGER=m +CONFIG_JOYSTICK_TWIDDLER=m +CONFIG_INPUT_JOYDUMP=m +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_GUNZE=m +CONFIG_INPUT_MISC=y +CONFIG_INPUT_UINPUT=m + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +# CONFIG_SERIAL_8250_CS is not set +CONFIG_SERIAL_8250_NR_UARTS=4 +# CONFIG_SERIAL_8250_EXTENDED is not set + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_SERIAL_PMACZILOG=y +CONFIG_SERIAL_PMACZILOG_CONSOLE=y +CONFIG_UNIX98_PTYS=y +# CONFIG_LEGACY_PTYS is not set +CONFIG_QIC02_TAPE=m +CONFIG_QIC02_DYNCONF=y + +# +# Setting runtime QIC-02 configuration is done with qic02conf +# + +# +# from the tpqic02-support package. It is available at +# + +# +# metalab.unc.edu or ftp://titus.cfw.com/pub/Linux/util/ +# + +# +# IPMI +# +CONFIG_IPMI_HANDLER=m +# CONFIG_IPMI_PANIC_EVENT is not set +CONFIG_IPMI_DEVICE_INTERFACE=m +CONFIG_IPMI_SI=m +CONFIG_IPMI_WATCHDOG=m + +# +# Watchdog Cards +# +CONFIG_WATCHDOG=y +# CONFIG_WATCHDOG_NOWAYOUT is not set + +# +# Watchdog Device Drivers +# +CONFIG_SOFT_WATCHDOG=m + +# +# PCI-based Watchdog Cards +# +CONFIG_PCIPCWATCHDOG=m +CONFIG_WDTPCI=m +CONFIG_WDT_501_PCI=y + +# +# USB-based Watchdog Cards +# +CONFIG_USBPCWATCHDOG=m +CONFIG_NVRAM=y +CONFIG_GEN_RTC=y +CONFIG_GEN_RTC_X=y +CONFIG_DTLK=m +CONFIG_R3964=m +CONFIG_APPLICOM=m + +# +# Ftape, the floppy tape device driver +# +CONFIG_AGP=m +CONFIG_AGP_UNINORTH=m +CONFIG_DRM=y +CONFIG_DRM_TDFX=m +# CONFIG_DRM_GAMMA is not set +CONFIG_DRM_R128=m +CONFIG_DRM_RADEON=m +CONFIG_DRM_MGA=m +CONFIG_DRM_SIS=m + +# +# PCMCIA character devices +# +CONFIG_SYNCLINK_CS=m +# CONFIG_RAW_DRIVER is not set + +# +# I2C support +# +CONFIG_I2C=y +CONFIG_I2C_CHARDEV=m + +# +# I2C Algorithms +# +CONFIG_I2C_ALGOBIT=y +CONFIG_I2C_ALGOPCF=m + +# +# I2C Hardware Bus support +# +# CONFIG_I2C_ALI1535 is not set +# CONFIG_I2C_ALI1563 is not set +# CONFIG_I2C_ALI15X3 is not set +# CONFIG_I2C_AMD756 is not set +# CONFIG_I2C_AMD8111 is not set +CONFIG_I2C_HYDRA=m +# CONFIG_I2C_I801 is not set +# CONFIG_I2C_I810 is not set +CONFIG_I2C_ISA=m +CONFIG_I2C_KEYWEST=y +# CONFIG_I2C_NFORCE2 is not set +CONFIG_I2C_PARPORT_LIGHT=m +# CONFIG_I2C_PIIX4 is not set +CONFIG_I2C_PROSAVAGE=m +CONFIG_I2C_SAVAGE4=m +CONFIG_SCx200_ACB=m +CONFIG_I2C_SIS5595=m +CONFIG_I2C_SIS630=m +CONFIG_I2C_SIS96X=m +CONFIG_I2C_VIA=m +CONFIG_I2C_VIAPRO=m +CONFIG_I2C_VOODOO3=m + +# +# Hardware Sensors Chip support +# +CONFIG_I2C_SENSOR=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM1025=m +CONFIG_SENSORS_ADM1031=m +CONFIG_SENSORS_ASB100=m +CONFIG_SENSORS_DS1621=m +CONFIG_SENSORS_FSCHER=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_IT87=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM77=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_LM83=m +CONFIG_SENSORS_LM85=m +CONFIG_SENSORS_LM90=m +CONFIG_SENSORS_MAX1619=m +CONFIG_SENSORS_VIA686A=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_W83L785TS=m +CONFIG_SENSORS_W83627HF=m + +# +# Other I2C Chip support +# +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_PCF8574=m +CONFIG_SENSORS_PCF8591=m +CONFIG_SENSORS_RTC8564=m +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set + +# +# Dallas's 1-wire bus +# +CONFIG_W1=m +CONFIG_W1_MATROX=m +CONFIG_W1_THERM=m + +# +# Misc devices +# + +# +# Multimedia devices +# +CONFIG_VIDEO_DEV=m + +# +# Video For Linux +# + +# +# Video Adapters +# +CONFIG_VIDEO_BT848=m +CONFIG_VIDEO_CPIA=m +CONFIG_VIDEO_CPIA_USB=m +CONFIG_VIDEO_SAA5246A=m +CONFIG_VIDEO_SAA5249=m +CONFIG_TUNER_3036=m +CONFIG_VIDEO_STRADIS=m +CONFIG_VIDEO_ZORAN=m +CONFIG_VIDEO_ZORAN_BUZ=m +CONFIG_VIDEO_ZORAN_DC10=m +CONFIG_VIDEO_ZORAN_DC30=m +CONFIG_VIDEO_ZORAN_LML33=m +CONFIG_VIDEO_ZORAN_LML33R10=m +CONFIG_VIDEO_SAA7134=m +CONFIG_VIDEO_MXB=m +CONFIG_VIDEO_DPC=m +CONFIG_VIDEO_HEXIUM_ORION=m +CONFIG_VIDEO_HEXIUM_GEMINI=m +CONFIG_VIDEO_CX88=m +CONFIG_VIDEO_OVCAMCHIP=m + +# +# Radio Adapters +# +CONFIG_RADIO_GEMTEK_PCI=m +CONFIG_RADIO_MAXIRADIO=m +CONFIG_RADIO_MAESTRO=m + +# +# Digital Video Broadcasting Devices +# +CONFIG_DVB=y +CONFIG_DVB_CORE=m + +# +# Supported Frontend Modules +# +CONFIG_DVB_TWINHAN_DST=m +CONFIG_DVB_STV0299=m +CONFIG_DVB_SP887X=m +CONFIG_DVB_SP887X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/sc_main.mc" +CONFIG_DVB_ALPS_TDLB7=m +CONFIG_DVB_ALPS_TDMB7=m +CONFIG_DVB_ATMEL_AT76C651=m +CONFIG_DVB_CX24110=m +CONFIG_DVB_GRUNDIG_29504_491=m +CONFIG_DVB_GRUNDIG_29504_401=m +CONFIG_DVB_MT312=m +CONFIG_DVB_VES1820=m +CONFIG_DVB_VES1X93=m +CONFIG_DVB_TDA1004X=m +CONFIG_DVB_TDA1004X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/tda1004x.bin" +CONFIG_DVB_NXT6000=m + +# +# Supported SAA7146 based PCI Adapters +# +CONFIG_DVB_AV7110=m +CONFIG_DVB_AV7110_OSD=y +CONFIG_DVB_BUDGET=m +CONFIG_DVB_BUDGET_CI=m +CONFIG_DVB_BUDGET_AV=m +CONFIG_DVB_BUDGET_PATCH=m + +# +# Supported USB Adapters +# +CONFIG_DVB_TTUSB_BUDGET=m +CONFIG_DVB_TTUSB_DEC=m + +# +# Supported FlexCopII (B2C2) Adapters +# +CONFIG_DVB_B2C2_SKYSTAR=m + +# +# Supported BT878 Adapters +# +CONFIG_DVB_BT8XX=m +CONFIG_VIDEO_SAA7146=m +CONFIG_VIDEO_SAA7146_VV=m +CONFIG_VIDEO_VIDEOBUF=m +CONFIG_VIDEO_TUNER=m +CONFIG_VIDEO_BUF=m +CONFIG_VIDEO_BTCX=m +CONFIG_VIDEO_IR=m + +# +# Graphics support +# +CONFIG_FB=y +CONFIG_FB_CIRRUS=m +# CONFIG_FB_PM2 is not set +# CONFIG_FB_CYBER2000 is not set +CONFIG_FB_OF=y +CONFIG_FB_CONTROL=y +CONFIG_FB_PLATINUM=y +CONFIG_FB_VALKYRIE=y +CONFIG_FB_CT65550=y +# CONFIG_FB_ASILIANT is not set +CONFIG_FB_IMSTT=y +# CONFIG_FB_VGA16 is not set +CONFIG_FB_RIVA=m +CONFIG_FB_RIVA_I2C=y +# CONFIG_FB_RIVA_DEBUG is not set +CONFIG_FB_MATROX=y +CONFIG_FB_MATROX_MILLENIUM=y +CONFIG_FB_MATROX_MYSTIQUE=y +CONFIG_FB_MATROX_G450=y +CONFIG_FB_MATROX_G100=y +CONFIG_FB_MATROX_I2C=m +CONFIG_FB_MATROX_MAVEN=m +CONFIG_FB_MATROX_MULTIHEAD=y +# CONFIG_FB_RADEON_OLD is not set +CONFIG_FB_RADEON=y +CONFIG_FB_RADEON_I2C=y +# CONFIG_FB_RADEON_DEBUG is not set +CONFIG_FB_ATY128=y +CONFIG_FB_ATY=y +CONFIG_FB_ATY_CT=y +CONFIG_FB_ATY_GX=y +# CONFIG_FB_ATY_XL_INIT is not set +CONFIG_FB_SIS=m +CONFIG_FB_SIS_300=y +CONFIG_FB_SIS_315=y +CONFIG_FB_NEOMAGIC=m +CONFIG_FB_KYRO=m +CONFIG_FB_3DFX=y +# CONFIG_FB_3DFX_ACCEL is not set +CONFIG_FB_VOODOO1=y +CONFIG_FB_TRIDENT=m +CONFIG_FB_TRIDENT_ACCEL=y +# CONFIG_FB_VIRTUAL is not set + +# +# Console display driver support +# +# CONFIG_VGA_CONSOLE is not set +# CONFIG_MDA_CONSOLE is not set +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y + +# +# Logo configuration +# +CONFIG_LOGO=y +# CONFIG_LOGO_LINUX_MONO is not set +CONFIG_LOGO_LINUX_VGA16=y +# CONFIG_LOGO_LINUX_CLUT224 is not set + +# +# Sound +# +CONFIG_SOUND=m +CONFIG_DMASOUND_PMAC=m +CONFIG_DMASOUND=m + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +CONFIG_SND_HWDEP=m +CONFIG_SND_RAWMIDI=m +CONFIG_SND_SEQUENCER=m +# CONFIG_SND_SEQ_DUMMY is not set +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=m +CONFIG_SND_PCM_OSS=m +CONFIG_SND_SEQUENCER_OSS=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set + +# +# Generic devices +# +CONFIG_SND_MPU401_UART=m +CONFIG_SND_OPL3_LIB=m +CONFIG_SND_VX_LIB=m +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_VIRMIDI is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set + +# +# PCI devices +# +CONFIG_SND_AC97_CODEC=m +# CONFIG_SND_ALI5451 is not set +CONFIG_SND_ATIIXP=m +CONFIG_SND_AU8810=m +CONFIG_SND_AU8820=m +CONFIG_SND_AU8830=m +CONFIG_SND_AZT3328=m +CONFIG_SND_BT87X=m +CONFIG_SND_CS46XX=m +CONFIG_SND_CS46XX_NEW_DSP=y +CONFIG_SND_CS4281=m +CONFIG_SND_EMU10K1=m +CONFIG_SND_KORG1212=m +CONFIG_SND_MIXART=m +CONFIG_SND_NM256=m +CONFIG_SND_RME32=m +CONFIG_SND_RME96=m +CONFIG_SND_RME9652=m +CONFIG_SND_HDSP=m +CONFIG_SND_TRIDENT=m +CONFIG_SND_YMFPCI=m +CONFIG_SND_ALS4000=m +CONFIG_SND_CMIPCI=m +CONFIG_SND_ENS1370=m +CONFIG_SND_ENS1371=m +CONFIG_SND_ES1938=m +CONFIG_SND_ES1968=m +CONFIG_SND_MAESTRO3=m +CONFIG_SND_FM801=m +CONFIG_SND_FM801_TEA575X=m +CONFIG_SND_ICE1712=m +CONFIG_SND_ICE1724=m +# CONFIG_SND_INTEL8X0 is not set +# CONFIG_SND_INTEL8X0M is not set +CONFIG_SND_SONICVIBES=m +CONFIG_SND_VIA82XX=m +CONFIG_SND_VX222=m + +# +# ALSA PowerMac devices +# +CONFIG_SND_POWERMAC=m + +# +# ALSA USB devices +# +CONFIG_SND_USB_AUDIO=m + +# +# PCMCIA devices +# + +# +# Open Sound System +# +# CONFIG_SOUND_PRIME is not set + +# +# USB support +# +CONFIG_USB=m +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +CONFIG_USB_BANDWIDTH=y +CONFIG_USB_DYNAMIC_MINORS=y + +# +# USB Host Controller Drivers +# +CONFIG_USB_EHCI_HCD=m +CONFIG_USB_EHCI_SPLIT_ISO=y +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_OHCI_HCD=m +CONFIG_USB_UHCI_HCD=m + +# +# USB Device Class drivers +# +CONFIG_USB_AUDIO=m + +# +# USB Bluetooth TTY can only be used with disabled Bluetooth subsystem +# +CONFIG_USB_MIDI=m +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_RW_DETECT is not set +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_DPCM=y +CONFIG_USB_STORAGE_HP8200e=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y + +# +# USB Human Interface Devices (HID) +# +CONFIG_USB_HID=m +CONFIG_USB_HIDINPUT=y +CONFIG_HID_FF=y +CONFIG_HID_PID=y +CONFIG_LOGITECH_FF=y +CONFIG_THRUSTMASTER_FF=y +CONFIG_USB_HIDDEV=y + +# +# USB HID Boot Protocol drivers +# +# CONFIG_USB_KBD is not set +# CONFIG_USB_MOUSE is not set +CONFIG_USB_AIPTEK=m +CONFIG_USB_WACOM=m +CONFIG_USB_KBTAB=m +CONFIG_USB_POWERMATE=m +CONFIG_USB_MTOUCH=m +CONFIG_USB_EGALAX=m +CONFIG_USB_XPAD=m +CONFIG_USB_ATI_REMOTE=m + +# +# USB Imaging devices +# +CONFIG_USB_MDC800=m +CONFIG_USB_MICROTEK=m +CONFIG_USB_HPUSBSCSI=m + +# +# USB Multimedia devices +# +CONFIG_USB_VICAM=m +CONFIG_USB_DSBR=m +CONFIG_USB_IBMCAM=m +CONFIG_USB_KONICAWC=m +CONFIG_USB_OV511=m +CONFIG_USB_PWC=m +CONFIG_USB_SE401=m +CONFIG_USB_SN9C102=m +CONFIG_USB_STV680=m +CONFIG_USB_W9968CF=m + +# +# USB Network adaptors +# +CONFIG_USB_CATC=m +CONFIG_USB_KAWETH=m +CONFIG_USB_PEGASUS=m +CONFIG_USB_RTL8150=m +CONFIG_USB_USBNET=m + +# +# USB Host-to-Host Cables +# +CONFIG_USB_ALI_M5632=y +CONFIG_USB_AN2720=y +CONFIG_USB_BELKIN=y +CONFIG_USB_GENESYS=y +CONFIG_USB_NET1080=y +CONFIG_USB_PL2301=y + +# +# Intelligent USB Devices/Gadgets +# +CONFIG_USB_ARMLINUX=y +CONFIG_USB_EPSON2888=y +CONFIG_USB_ZAURUS=y +CONFIG_USB_CDCETHER=y + +# +# USB Network Adapters +# +CONFIG_USB_AX8817X=y + +# +# USB port drivers +# + +# +# USB Serial Converter support +# +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_BELKIN=m +# CONFIG_USB_SERIAL_WHITEHEAT is not set +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m +CONFIG_USB_SERIAL_EMPEG=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_VISOR=m +CONFIG_USB_SERIAL_IPAQ=m +CONFIG_USB_SERIAL_IR=m +CONFIG_USB_SERIAL_EDGEPORT=m +CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_KEYSPAN_PDA=m +CONFIG_USB_SERIAL_KEYSPAN=m +CONFIG_USB_SERIAL_KLSI=m +CONFIG_USB_SERIAL_KOBIL_SCT=m +CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_SAFE=m +CONFIG_USB_SERIAL_SAFE_PADDED=y +CONFIG_USB_SERIAL_CYBERJACK=m +CONFIG_USB_SERIAL_XIRCOM=m +CONFIG_USB_SERIAL_OMNINET=m +CONFIG_USB_EZUSB=y + +# +# USB Miscellaneous drivers +# +CONFIG_USB_TIGL=m +CONFIG_USB_AUERSWALD=m +CONFIG_USB_RIO500=m +CONFIG_USB_LEGOTOWER=m +CONFIG_USB_LCD=m +CONFIG_USB_LED=m +CONFIG_USB_CYTHERM=m +CONFIG_USB_SPEEDTOUCH=m +CONFIG_USB_PHIDGETSERVO=m +CONFIG_USB_TEST=m +CONFIG_USB_EAGLE=m + +# +# USB Gadget Support +# +CONFIG_USB_GADGET=m +CONFIG_USB_GADGET_NET2280=y +CONFIG_USB_NET2280=m +# CONFIG_USB_GADGET_PXA2XX is not set +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_SA1100 is not set +# CONFIG_USB_GADGET_DUMMY_HCD is not set +CONFIG_USB_GADGET_DUALSPEED=y +CONFIG_USB_ZERO=m +CONFIG_USB_ETH=m +CONFIG_USB_ETH_RNDIS=y +CONFIG_USB_GADGETFS=m +CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_FILE_STORAGE_TEST=y +CONFIG_USB_G_SERIAL=m + +# +# File systems +# +CONFIG_EXT2_FS=m +# CONFIG_EXT2_FS_XATTR is not set +CONFIG_EXT3_FS=m +CONFIG_EXT3_FS_XATTR=y +# CONFIG_EXT3_FS_POSIX_ACL is not set +# CONFIG_EXT3_FS_SECURITY is not set +CONFIG_JBD=m +# CONFIG_JBD_DEBUG is not set +CONFIG_FS_MBCACHE=m +CONFIG_REISERFS_FS=m +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +CONFIG_REISERFS_FS_XATTR=y +# CONFIG_REISERFS_FS_POSIX_ACL is not set +# CONFIG_REISERFS_FS_SECURITY is not set +CONFIG_JFS_FS=m +# CONFIG_JFS_POSIX_ACL is not set +# CONFIG_JFS_DEBUG is not set +CONFIG_JFS_STATISTICS=y +CONFIG_XFS_FS=m +# CONFIG_XFS_RT is not set +CONFIG_XFS_QUOTA=y +# CONFIG_XFS_SECURITY is not set +CONFIG_XFS_POSIX_ACL=y +CONFIG_MINIX_FS=m +# CONFIG_ROMFS_FS is not set +# CONFIG_QUOTA is not set +CONFIG_QUOTACTL=y +# CONFIG_AUTOFS_FS is not set +CONFIG_AUTOFS4_FS=m + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=m +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_ZISOFS_FS=m +CONFIG_UDF_FS=m +CONFIG_UDF_NLS=y + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +CONFIG_NTFS_FS=m +# CONFIG_NTFS_DEBUG is not set +# CONFIG_NTFS_RW is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_SYSFS=y +CONFIG_DEVFS_FS=y +# CONFIG_DEVFS_MOUNT is not set +# CONFIG_DEVFS_DEBUG is not set +# CONFIG_DEVPTS_FS_XATTR is not set +CONFIG_TMPFS=y +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y + +# +# Miscellaneous filesystems +# +CONFIG_ADFS_FS=m +# CONFIG_ADFS_FS_RW is not set +CONFIG_AFFS_FS=m +CONFIG_ASFS_FS=m +CONFIG_ASFS_RW=y +CONFIG_HFS_FS=m +CONFIG_HFSPLUS_FS=m +CONFIG_BEFS_FS=m +# CONFIG_BEFS_DEBUG is not set +CONFIG_BFS_FS=m +CONFIG_EFS_FS=m +CONFIG_CRAMFS=y +CONFIG_VXFS_FS=m +CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +# CONFIG_QNX4FS_RW is not set +CONFIG_SYSV_FS=m +CONFIG_UFS_FS=m +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=m +CONFIG_NFS_V3=y +CONFIG_NFS_V4=y +# CONFIG_NFS_DIRECTIO is not set +CONFIG_NFSD=m +CONFIG_NFSD_V3=y +CONFIG_NFSD_V4=y +CONFIG_NFSD_TCP=y +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=m +CONFIG_SUNRPC=m +CONFIG_SUNRPC_GSS=m +CONFIG_RPCSEC_GSS_KRB5=m +CONFIG_SMB_FS=m +CONFIG_SMB_NLS_DEFAULT=y +CONFIG_SMB_NLS_REMOTE="iso8859-1" +CONFIG_CIFS=m +# CONFIG_CIFS_STATS is not set +# CONFIG_CIFS_XATTR is not set +# CONFIG_CIFS_POSIX is not set +CONFIG_NCP_FS=m +# CONFIG_NCPFS_PACKET_SIGNING is not set +# CONFIG_NCPFS_IOCTL_LOCKING is not set +# CONFIG_NCPFS_STRONG is not set +CONFIG_NCPFS_NFS_NS=y +CONFIG_NCPFS_OS2_NS=y +# CONFIG_NCPFS_SMALLDOS is not set +CONFIG_NCPFS_NLS=y +CONFIG_NCPFS_EXTRAS=y +CONFIG_CODA_FS=m +# CONFIG_CODA_FS_OLD_API is not set +CONFIG_AFS_FS=m +CONFIG_RXRPC=m + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +# CONFIG_OSF_PARTITION is not set +CONFIG_AMIGA_PARTITION=y +# CONFIG_ATARI_PARTITION is not set +CONFIG_MAC_PARTITION=y +CONFIG_MSDOS_PARTITION=y +# CONFIG_BSD_DISKLABEL is not set +# CONFIG_MINIX_SUBPARTITION is not set +# CONFIG_SOLARIS_X86_PARTITION is not set +# CONFIG_UNIXWARE_DISKLABEL is not set +# CONFIG_LDM_PARTITION is not set +# CONFIG_SGI_PARTITION is not set +# CONFIG_ULTRIX_PARTITION is not set +# CONFIG_SUN_PARTITION is not set +# CONFIG_EFI_PARTITION is not set + +# +# Native Language Support +# +CONFIG_NLS=m +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=m +CONFIG_NLS_CODEPAGE_737=m +CONFIG_NLS_CODEPAGE_775=m +CONFIG_NLS_CODEPAGE_850=m +CONFIG_NLS_CODEPAGE_852=m +CONFIG_NLS_CODEPAGE_855=m +CONFIG_NLS_CODEPAGE_857=m +CONFIG_NLS_CODEPAGE_860=m +CONFIG_NLS_CODEPAGE_861=m +CONFIG_NLS_CODEPAGE_862=m +CONFIG_NLS_CODEPAGE_863=m +CONFIG_NLS_CODEPAGE_864=m +CONFIG_NLS_CODEPAGE_865=m +CONFIG_NLS_CODEPAGE_866=m +CONFIG_NLS_CODEPAGE_869=m +CONFIG_NLS_CODEPAGE_936=m +CONFIG_NLS_CODEPAGE_950=m +CONFIG_NLS_CODEPAGE_932=m +CONFIG_NLS_CODEPAGE_949=m +CONFIG_NLS_CODEPAGE_874=m +CONFIG_NLS_ISO8859_8=m +CONFIG_NLS_CODEPAGE_1250=m +CONFIG_NLS_CODEPAGE_1251=m +CONFIG_NLS_ASCII=m +CONFIG_NLS_ISO8859_1=m +CONFIG_NLS_ISO8859_2=m +CONFIG_NLS_ISO8859_3=m +CONFIG_NLS_ISO8859_4=m +CONFIG_NLS_ISO8859_5=m +CONFIG_NLS_ISO8859_6=m +CONFIG_NLS_ISO8859_7=m +CONFIG_NLS_ISO8859_9=m +CONFIG_NLS_ISO8859_13=m +CONFIG_NLS_ISO8859_14=m +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_KOI8_R=m +CONFIG_NLS_KOI8_U=m +CONFIG_NLS_UTF8=m + +# +# Library routines +# +CONFIG_CRC_CCITT=m +CONFIG_CRC32=m +CONFIG_LIBCRC32C=m +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=m + +# +# Profiling support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=m + +# +# Kernel hacking +# +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_SLAB is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_HIGHMEM is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_XMON is not set +# CONFIG_BDI_SWITCH is not set +# CONFIG_DEBUG_INFO is not set +CONFIG_BOOTX_TEXT=y + +# +# Security options +# +# CONFIG_SECURITY is not set + +# +# Cryptographic options +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_SHA1=m +CONFIG_CRYPTO_SHA256=m +CONFIG_CRYPTO_SHA512=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_KHAZAD=m +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_MICHAEL_MIC=m +CONFIG_CRYPTO_CRC32C=m +CONFIG_CRYPTO_TEST=m --- linux-source-2.6.8.1-2.6.8.1.orig/debian/config/powerpc/power3-smp +++ linux-source-2.6.8.1-2.6.8.1/debian/config/powerpc/power3-smp @@ -0,0 +1,2073 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_MMU=y +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_HAVE_DEC_LOCK=y +CONFIG_PPC=y +CONFIG_PPC32=y +CONFIG_GENERIC_NVRAM=y + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +CONFIG_CLEAN_COMPILE=y + +# +# General setup +# +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_BSD_PROCESS_ACCT=y +# CONFIG_BSD_PROCESS_ACCT_V3 is not set +CONFIG_SYSCTL=y +CONFIG_AUDIT=y +CONFIG_LOG_BUF_SHIFT=15 +CONFIG_HOTPLUG=y +# CONFIG_IKCONFIG is not set +# CONFIG_EMBEDDED is not set +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_OBSOLETE_MODPARM=y +CONFIG_MODVERSIONS=y +CONFIG_KMOD=y +CONFIG_STOP_MACHINE=y + +# +# Processor +# +# CONFIG_6xx is not set +# CONFIG_40x is not set +# CONFIG_44x is not set +CONFIG_POWER3=y +# CONFIG_POWER4 is not set +# CONFIG_8xx is not set +# CONFIG_E500 is not set +# CONFIG_CPU_FREQ is not set +CONFIG_PM=y +CONFIG_PPC64BRIDGE=y +CONFIG_PPC_STD_MMU=y + +# +# Platform options +# +CONFIG_PPC_MULTIPLATFORM=y +# CONFIG_APUS is not set +# CONFIG_WILLOW is not set +# CONFIG_PCORE is not set +# CONFIG_POWERPMC250 is not set +# CONFIG_EV64260 is not set +# CONFIG_SPRUCE is not set +# CONFIG_LOPEC is not set +# CONFIG_MCPN765 is not set +# CONFIG_MVME5100 is not set +# CONFIG_PPLUS is not set +# CONFIG_PRPMC750 is not set +# CONFIG_PRPMC800 is not set +# CONFIG_SANDPOINT is not set +# CONFIG_ADIR is not set +# CONFIG_K2 is not set +# CONFIG_PAL4 is not set +# CONFIG_GEMINI is not set +# CONFIG_EST8260 is not set +# CONFIG_SBC82xx is not set +# CONFIG_SBS8260 is not set +# CONFIG_RPX8260 is not set +# CONFIG_TQM8260 is not set +# CONFIG_ADS8272 is not set +# CONFIG_LITE5200 is not set +CONFIG_PPC_CHRP=y +CONFIG_PPC_PMAC=y +CONFIG_PPC_PREP=y +CONFIG_PPC_OF=y +CONFIG_PPCBUG_NVRAM=y +CONFIG_SMP=y +# CONFIG_IRQ_ALL_CPUS is not set +CONFIG_NR_CPUS=32 +# CONFIG_PREEMPT is not set +CONFIG_HIGHMEM=y +CONFIG_KERNEL_ELF=y +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_MISC=m +CONFIG_PROC_DEVICETREE=y +CONFIG_PREP_RESIDUAL=y +CONFIG_PROC_PREPRESIDUAL=y +CONFIG_CMDLINE_BOOL=y +CONFIG_CMDLINE="console=ttyS0,9600 console=tty0 root=/dev/sda2" + +# +# Bus options +# +# CONFIG_ISA is not set +CONFIG_GENERIC_ISA_DMA=y +CONFIG_PCI=y +CONFIG_PCI_DOMAINS=y +CONFIG_PCI_LEGACY_PROC=y +CONFIG_PCI_NAMES=y + +# +# PCMCIA/CardBus support +# +CONFIG_PCMCIA=m +# CONFIG_PCMCIA_DEBUG is not set +CONFIG_YENTA=m +CONFIG_CARDBUS=y +CONFIG_PD6729=m +CONFIG_I82092=m +CONFIG_TCIC=m + +# +# Advanced setup +# +# CONFIG_ADVANCED_OPTIONS is not set + +# +# Default settings for advanced configuration options are used +# +CONFIG_HIGHMEM_START=0xfe000000 +CONFIG_LOWMEM_SIZE=0x30000000 +CONFIG_KERNEL_START=0xc0000000 +CONFIG_TASK_SIZE=0x80000000 +CONFIG_BOOT_LOAD=0x00800000 + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=m +# CONFIG_DEBUG_DRIVER is not set + +# +# Memory Technology Devices (MTD) +# +# CONFIG_MTD is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Plug and Play support +# + +# +# Block devices +# +CONFIG_BLK_DEV_FD=m +# CONFIG_MAC_FLOPPY is not set +CONFIG_BLK_CPQ_DA=m +CONFIG_BLK_CPQ_CISS_DA=m +CONFIG_CISS_SCSI_TAPE=y +CONFIG_BLK_DEV_DAC960=m +CONFIG_BLK_DEV_UMEM=m +CONFIG_BLK_DEV_LOOP=m +CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_SX8=m +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_BLK_DEV_INITRD=y +CONFIG_LBD=y + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=y +CONFIG_BLK_DEV_IDE=y + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_IDE_SATA is not set +CONFIG_BLK_DEV_IDEDISK=m +# CONFIG_IDEDISK_MULTI_MODE is not set +CONFIG_BLK_DEV_IDECS=m +CONFIG_BLK_DEV_IDECD=m +CONFIG_BLK_DEV_IDETAPE=m +CONFIG_BLK_DEV_IDEFLOPPY=m +CONFIG_BLK_DEV_IDESCSI=m +# CONFIG_IDE_TASK_IOCTL is not set +# CONFIG_IDE_TASKFILE_IO is not set + +# +# IDE chipset support/bugfixes +# +# CONFIG_IDE_GENERIC is not set +CONFIG_BLK_DEV_IDEPCI=y +CONFIG_IDEPCI_SHARE_IRQ=y +# CONFIG_BLK_DEV_OFFBOARD is not set +CONFIG_BLK_DEV_GENERIC=m +# CONFIG_BLK_DEV_OPTI621 is not set +CONFIG_BLK_DEV_SL82C105=m +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +CONFIG_IDEDMA_PCI_AUTO=y +CONFIG_IDEDMA_ONLYDISK=y +CONFIG_BLK_DEV_ADMA=y +CONFIG_BLK_DEV_AEC62XX=m +# CONFIG_BLK_DEV_ALI15X3 is not set +# CONFIG_BLK_DEV_AMD74XX is not set +CONFIG_BLK_DEV_CMD64X=m +# CONFIG_BLK_DEV_TRIFLEX is not set +# CONFIG_BLK_DEV_CY82C693 is not set +# CONFIG_BLK_DEV_CS5520 is not set +# CONFIG_BLK_DEV_CS5530 is not set +CONFIG_BLK_DEV_HPT34X=m +# CONFIG_HPT34X_AUTODMA is not set +CONFIG_BLK_DEV_HPT366=m +CONFIG_BLK_DEV_SC1200=m +# CONFIG_BLK_DEV_PIIX is not set +CONFIG_BLK_DEV_NS87415=m +CONFIG_BLK_DEV_PDC202XX_OLD=m +# CONFIG_PDC202XX_BURST is not set +CONFIG_BLK_DEV_PDC202XX_NEW=m +CONFIG_PDC202XX_FORCE=y +# CONFIG_BLK_DEV_SVWKS is not set +CONFIG_BLK_DEV_SIIMAGE=m +# CONFIG_BLK_DEV_SLC90E66 is not set +CONFIG_BLK_DEV_TRM290=m +CONFIG_BLK_DEV_VIA82CXXX=m +CONFIG_BLK_DEV_IDE_PMAC=y +CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y +CONFIG_BLK_DEV_IDEDMA_PMAC=y +# CONFIG_BLK_DEV_IDE_PMAC_BLINK is not set +CONFIG_BLK_DEV_IDEDMA_PMAC_AUTO=y +# CONFIG_IDE_ARM is not set +CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_IVB is not set +CONFIG_IDEDMA_AUTO=y +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +CONFIG_SCSI=m +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +CONFIG_CHR_DEV_ST=m +CONFIG_CHR_DEV_OSST=m +CONFIG_BLK_DEV_SR=m +CONFIG_BLK_DEV_SR_VENDOR=y +CONFIG_CHR_DEV_SG=m +CONFIG_CHR_DEV_SCH=m + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y + +# +# SCSI Transport Attributes +# +CONFIG_SCSI_SPI_ATTRS=m +CONFIG_SCSI_FC_ATTRS=m + +# +# SCSI low-level drivers +# +CONFIG_BLK_DEV_3W_XXXX_RAID=m +CONFIG_SCSI_3W_9XXX=m +CONFIG_SCSI_ACARD=m +CONFIG_SCSI_AACRAID=m +CONFIG_SCSI_AIC7XXX=m +CONFIG_AIC7XXX_CMDS_PER_DEVICE=32 +CONFIG_AIC7XXX_RESET_DELAY_MS=15000 +# CONFIG_AIC7XXX_BUILD_FIRMWARE is not set +CONFIG_AIC7XXX_DEBUG_ENABLE=y +CONFIG_AIC7XXX_DEBUG_MASK=0 +CONFIG_AIC7XXX_REG_PRETTY_PRINT=y +CONFIG_SCSI_AIC7XXX_OLD=m +CONFIG_SCSI_AIC79XX=m +CONFIG_AIC79XX_CMDS_PER_DEVICE=32 +CONFIG_AIC79XX_RESET_DELAY_MS=15000 +# CONFIG_AIC79XX_BUILD_FIRMWARE is not set +# CONFIG_AIC79XX_ENABLE_RD_STRM is not set +CONFIG_AIC79XX_DEBUG_ENABLE=y +CONFIG_AIC79XX_DEBUG_MASK=0 +CONFIG_AIC79XX_REG_PRETTY_PRINT=y +CONFIG_SCSI_DPT_I2O=m +CONFIG_SCSI_MEGARAID=m +CONFIG_SCSI_SATA=y +CONFIG_SCSI_SATA_SVW=m +# CONFIG_SCSI_ATA_PIIX is not set +# CONFIG_SCSI_SATA_NV is not set +CONFIG_SCSI_SATA_PROMISE=m +CONFIG_SCSI_SATA_SX4=m +CONFIG_SCSI_SATA_SIL=m +CONFIG_SCSI_SATA_SIS=m +CONFIG_SCSI_SATA_VIA=m +CONFIG_SCSI_SATA_VITESSE=m +CONFIG_SCSI_BUSLOGIC=m +# CONFIG_SCSI_OMIT_FLASHPOINT is not set +CONFIG_SCSI_DMX3191D=m +CONFIG_SCSI_EATA=m +# CONFIG_SCSI_EATA_TAGGED_QUEUE is not set +# CONFIG_SCSI_EATA_LINKED_COMMANDS is not set +CONFIG_SCSI_EATA_MAX_TAGS=16 +CONFIG_SCSI_EATA_PIO=m +CONFIG_SCSI_FUTURE_DOMAIN=m +# CONFIG_SCSI_GDTH is not set +CONFIG_SCSI_IPS=m +CONFIG_SCSI_INIA100=m +CONFIG_SCSI_SYM53C8XX_2=m +CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 +CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 +CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 +# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set +CONFIG_SCSI_IPR=m +# CONFIG_SCSI_IPR_TRACE is not set +# CONFIG_SCSI_IPR_DUMP is not set +CONFIG_SCSI_QLOGIC_ISP=m +CONFIG_SCSI_QLOGIC_FC=m +# CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set +CONFIG_SCSI_QLOGIC_1280=m +CONFIG_SCSI_DC395x=m +CONFIG_SCSI_DC390T=m +CONFIG_SCSI_NSP32=m +# CONFIG_SCSI_DEBUG is not set +CONFIG_SCSI_MESH=m +CONFIG_SCSI_MESH_SYNC_RATE=5 +CONFIG_SCSI_MESH_RESET_DELAY_MS=4000 +CONFIG_SCSI_MAC53C94=m + +# +# PCMCIA SCSI adapter support +# +CONFIG_PCMCIA_AHA152X=m +CONFIG_PCMCIA_FDOMAIN=m +CONFIG_PCMCIA_NINJA_SCSI=m +CONFIG_PCMCIA_QLOGIC=m +CONFIG_PCMCIA_SYM53C500=m + +# +# Multi-device support (RAID and LVM) +# +CONFIG_MD=y +CONFIG_BLK_DEV_MD=m +CONFIG_MD_LINEAR=m +CONFIG_MD_RAID0=m +CONFIG_MD_RAID1=m +CONFIG_MD_RAID5=m +CONFIG_MD_RAID6=m +CONFIG_MD_MULTIPATH=m +CONFIG_BLK_DEV_DM=m +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=m +CONFIG_DM_MIRROR=m +CONFIG_DM_ZERO=m + +# +# Fusion MPT device support +# +CONFIG_FUSION=m +CONFIG_FUSION_MAX_SGE=40 +CONFIG_FUSION_ISENSE=m +CONFIG_FUSION_CTL=m +# CONFIG_FUSION_LAN is not set + +# +# IEEE 1394 (FireWire) support +# +CONFIG_IEEE1394=m + +# +# Subsystem Options +# +# CONFIG_IEEE1394_VERBOSEDEBUG is not set +CONFIG_IEEE1394_OUI_DB=y +CONFIG_IEEE1394_EXTRA_CONFIG_ROMS=y +CONFIG_IEEE1394_CONFIG_ROM_IP1394=y + +# +# Device Drivers +# +CONFIG_IEEE1394_PCILYNX=m +CONFIG_IEEE1394_OHCI1394=m + +# +# Protocol Drivers +# +CONFIG_IEEE1394_VIDEO1394=m +CONFIG_IEEE1394_SBP2=m +CONFIG_IEEE1394_SBP2_PHYS_DMA=y +CONFIG_IEEE1394_ETH1394=m +CONFIG_IEEE1394_DV1394=m +CONFIG_IEEE1394_RAWIO=m +CONFIG_IEEE1394_CMP=m +CONFIG_IEEE1394_AMDTP=m + +# +# I2O device support +# +CONFIG_I2O=m +CONFIG_I2O_CONFIG=m +CONFIG_I2O_BLOCK=m +CONFIG_I2O_SCSI=m +CONFIG_I2O_PROC=m + +# +# Macintosh device drivers +# +CONFIG_ADB=y +CONFIG_ADB_CUDA=y +CONFIG_ADB_PMU=y +CONFIG_PMAC_PBOOK=y +CONFIG_PMAC_APM_EMU=m +CONFIG_PMAC_BACKLIGHT=y +CONFIG_ADB_MACIO=y +CONFIG_INPUT_ADBHID=y +CONFIG_MAC_EMUMOUSEBTN=y +CONFIG_THERM_WINDTUNNEL=m +CONFIG_THERM_ADT746X=m +CONFIG_ANSLCD=m + +# +# Networking support +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=m +# CONFIG_PACKET_MMAP is not set +CONFIG_NETLINK_DEV=m +CONFIG_UNIX=m +CONFIG_NET_KEY=m +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_FWMARK=y +CONFIG_IP_ROUTE_NAT=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_TOS=y +CONFIG_IP_ROUTE_VERBOSE=y +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE=m +CONFIG_NET_IPGRE_BROADCAST=y +CONFIG_IP_MROUTE=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +CONFIG_ARPD=y +# CONFIG_SYN_COOKIES is not set +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +CONFIG_INET_IPCOMP=m + +# +# IP: Virtual Server Configuration +# +CONFIG_IP_VS=m +# CONFIG_IP_VS_DEBUG is not set +CONFIG_IP_VS_TAB_BITS=12 + +# +# IPVS transport protocol load balancing support +# +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_PROTO_ESP=y +CONFIG_IP_VS_PROTO_AH=y + +# +# IPVS scheduler +# +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_WRR=m +CONFIG_IP_VS_LC=m +CONFIG_IP_VS_WLC=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m + +# +# IPVS application helper +# +CONFIG_IP_VS_FTP=m +CONFIG_IPV6=m +CONFIG_IPV6_PRIVACY=y +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +CONFIG_INET6_IPCOMP=m +CONFIG_IPV6_TUNNEL=m +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_BRIDGE_NETFILTER=y + +# +# IP: Netfilter Configuration +# +CONFIG_IP_NF_CONNTRACK=m +CONFIG_IP_NF_FTP=m +CONFIG_IP_NF_IRC=m +CONFIG_IP_NF_TFTP=m +CONFIG_IP_NF_AMANDA=m +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_LIMIT=m +# CONFIG_IP_NF_MATCH_IPRANGE is not set +CONFIG_IP_NF_MATCH_MAC=m +CONFIG_IP_NF_MATCH_PKTTYPE=m +CONFIG_IP_NF_MATCH_MARK=m +CONFIG_IP_NF_MATCH_MULTIPORT=m +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_DSCP=m +# CONFIG_IP_NF_MATCH_AH_ESP is not set +CONFIG_IP_NF_MATCH_LENGTH=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_TCPMSS=m +CONFIG_IP_NF_MATCH_HELPER=m +CONFIG_IP_NF_MATCH_STATE=m +CONFIG_IP_NF_MATCH_CONNTRACK=m +CONFIG_IP_NF_MATCH_OWNER=m +# CONFIG_IP_NF_MATCH_PHYSDEV is not set +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_REDIRECT=m +# CONFIG_IP_NF_TARGET_NETMAP is not set +# CONFIG_IP_NF_TARGET_SAME is not set +CONFIG_IP_NF_NAT_LOCAL=y +CONFIG_IP_NF_NAT_SNMP_BASIC=m +CONFIG_IP_NF_NAT_IRC=m +CONFIG_IP_NF_NAT_FTP=m +CONFIG_IP_NF_NAT_TFTP=m +CONFIG_IP_NF_NAT_AMANDA=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_DSCP=m +CONFIG_IP_NF_TARGET_MARK=m +# CONFIG_IP_NF_TARGET_CLASSIFY is not set +CONFIG_IP_NF_TARGET_LOG=m +# CONFIG_IP_NF_TARGET_ULOG is not set +CONFIG_IP_NF_TARGET_TCPMSS=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +# CONFIG_IP_NF_COMPAT_IPCHAINS is not set +# CONFIG_IP_NF_COMPAT_IPFWADM is not set +CONFIG_IP_NF_TARGET_NOTRACK=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_MATCH_ADDRTYPE=m +CONFIG_IP_NF_MATCH_REALM=m + +# +# IPv6: Netfilter Configuration +# +# CONFIG_IP6_NF_QUEUE is not set +# CONFIG_IP6_NF_IPTABLES is not set + +# +# DECnet: Netfilter Configuration +# +# CONFIG_DECNET_NF_GRABULATOR is not set + +# +# Bridge: Netfilter Configuration +# +# CONFIG_BRIDGE_NF_EBTABLES is not set +CONFIG_XFRM=y +CONFIG_XFRM_USER=m + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IP_SCTP=m +# CONFIG_SCTP_DBG_MSG is not set +# CONFIG_SCTP_DBG_OBJCNT is not set +# CONFIG_SCTP_HMAC_NONE is not set +# CONFIG_SCTP_HMAC_SHA1 is not set +CONFIG_SCTP_HMAC_MD5=y +CONFIG_ATM=m +CONFIG_ATM_CLIP=m +CONFIG_ATM_CLIP_NO_ICMP=y +CONFIG_ATM_LANE=m +CONFIG_ATM_MPOA=m +CONFIG_ATM_BR2684=m +# CONFIG_ATM_BR2684_IPFILTER is not set +CONFIG_BRIDGE=m +CONFIG_VLAN_8021Q=m +CONFIG_DECNET=m +CONFIG_DECNET_SIOCGIFCONF=y +CONFIG_DECNET_ROUTER=y +CONFIG_DECNET_ROUTE_FWMARK=y +CONFIG_LLC=y +CONFIG_LLC2=m +CONFIG_IPX=m +CONFIG_IPX_INTERN=y +CONFIG_ATALK=m +CONFIG_DEV_APPLETALK=y +CONFIG_IPDDP=m +CONFIG_IPDDP_ENCAP=y +CONFIG_IPDDP_DECAP=y +CONFIG_X25=m +CONFIG_LAPB=m +CONFIG_NET_DIVERT=y +CONFIG_ECONET=m +CONFIG_ECONET_AUNUDP=y +CONFIG_ECONET_NATIVE=y +CONFIG_WAN_ROUTER=m +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_CLK_JIFFIES=y +# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set +# CONFIG_NET_SCH_CLK_CPU is not set +CONFIG_NET_SCH_CBQ=m +CONFIG_NET_SCH_HTB=m +CONFIG_NET_SCH_HFSC=m +CONFIG_NET_SCH_ATM=m +CONFIG_NET_SCH_PRIO=m +CONFIG_NET_SCH_RED=m +CONFIG_NET_SCH_SFQ=m +CONFIG_NET_SCH_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_NETEM=m +CONFIG_NET_SCH_INGRESS=m +CONFIG_NET_QOS=y +CONFIG_NET_ESTIMATOR=y +CONFIG_NET_CLS=y +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_ROUTE=y +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +# CONFIG_CLS_U32_PERF is not set +# CONFIG_NET_CLS_IND is not set +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +# CONFIG_NET_CLS_ACT is not set +CONFIG_NET_CLS_POLICE=y + +# +# Network testing +# +CONFIG_NET_PKTGEN=m +CONFIG_NETPOLL=y +CONFIG_NETPOLL_RX=y +CONFIG_NETPOLL_TRAP=y +CONFIG_NET_POLL_CONTROLLER=y +CONFIG_HAMRADIO=y + +# +# Packet Radio protocols +# +CONFIG_AX25=m +CONFIG_AX25_DAMA_SLAVE=y +CONFIG_NETROM=m +CONFIG_ROSE=m + +# +# AX.25 network device drivers +# +CONFIG_BPQETHER=m +CONFIG_BAYCOM_SER_FDX=m +CONFIG_BAYCOM_SER_HDX=m +CONFIG_YAM=m +CONFIG_IRDA=m + +# +# IrDA protocols +# +CONFIG_IRLAN=m +CONFIG_IRNET=m +CONFIG_IRCOMM=m +CONFIG_IRDA_ULTRA=y + +# +# IrDA options +# +CONFIG_IRDA_CACHE_LAST_LSAP=y +CONFIG_IRDA_FAST_RR=y +CONFIG_IRDA_DEBUG=y + +# +# Infrared-port device drivers +# + +# +# SIR device drivers +# +CONFIG_IRTTY_SIR=m + +# +# Dongle support +# +# CONFIG_DONGLE is not set + +# +# Old SIR device drivers +# + +# +# Old Serial dongle support +# + +# +# FIR device drivers +# +# CONFIG_USB_IRDA is not set +# CONFIG_SIGMATEL_FIR is not set +# CONFIG_TOSHIBA_FIR is not set +# CONFIG_VLSI_FIR is not set +CONFIG_BT=m +CONFIG_BT_L2CAP=m +CONFIG_BT_SCO=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_CMTP=m +CONFIG_BT_HIDP=m + +# +# Bluetooth device drivers +# +CONFIG_BT_HCIUSB=m +CONFIG_BT_HCIUSB_SCO=y +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_H4=y +CONFIG_BT_HCIUART_BCSP=y +CONFIG_BT_HCIUART_BCSP_TXCRC=y +CONFIG_BT_HCIBCM203X=m +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIDTL1=m +CONFIG_BT_HCIBT3C=m +CONFIG_BT_HCIBLUECARD=m +CONFIG_BT_HCIBTUART=m +CONFIG_BT_HCIVHCI=m +CONFIG_NETDEVICES=y +CONFIG_DUMMY=m +CONFIG_BONDING=m +CONFIG_EQUALIZER=m +CONFIG_TUN=m +CONFIG_ETHERTAP=m + +# +# ARCnet devices +# +CONFIG_ARCNET=m +CONFIG_ARCNET_1201=m +CONFIG_ARCNET_1051=m +CONFIG_ARCNET_RAW=m +CONFIG_ARCNET_COM90xx=m +CONFIG_ARCNET_COM90xxIO=m +CONFIG_ARCNET_RIM_I=m +CONFIG_ARCNET_COM20020=m +CONFIG_ARCNET_COM20020_PCI=m + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=y +CONFIG_MACE=m +# CONFIG_MACE_AAUI_PORT is not set +CONFIG_BMAC=m +CONFIG_HAPPYMEAL=m +CONFIG_SUNGEM=m +CONFIG_NET_VENDOR_3COM=y +CONFIG_VORTEX=m +CONFIG_TYPHOON=m + +# +# Tulip family network device support +# +CONFIG_NET_TULIP=y +CONFIG_DE2104X=m +CONFIG_TULIP=m +# CONFIG_TULIP_MWI is not set +# CONFIG_TULIP_MMIO is not set +# CONFIG_TULIP_NAPI is not set +CONFIG_DE4X5=m +CONFIG_WINBOND_840=m +CONFIG_DM9102=m +CONFIG_PCMCIA_XIRCOM=m +CONFIG_HP100=m +CONFIG_NET_PCI=y +CONFIG_PCNET32=m +# CONFIG_AMD8111_ETH is not set +CONFIG_ADAPTEC_STARFIRE=m +# CONFIG_ADAPTEC_STARFIRE_NAPI is not set +CONFIG_B44=m +# CONFIG_FORCEDETH is not set +CONFIG_EEPRO100=m +# CONFIG_EEPRO100_PIO is not set +CONFIG_E100=m +# CONFIG_E100_NAPI is not set +CONFIG_FEALNX=m +CONFIG_NATSEMI=m +CONFIG_NE2K_PCI=m +CONFIG_8139CP=m +CONFIG_8139TOO=m +CONFIG_8139TOO_PIO=y +# CONFIG_8139TOO_TUNE_TWISTER is not set +CONFIG_8139TOO_8129=y +# CONFIG_8139_OLD_RX_RESET is not set +CONFIG_SIS900=m +CONFIG_EPIC100=m +CONFIG_SUNDANCE=m +CONFIG_SUNDANCE_MMIO=y +CONFIG_TLAN=m +CONFIG_VIA_RHINE=m +CONFIG_VIA_RHINE_MMIO=y +CONFIG_VIA_VELOCITY=m + +# +# Ethernet (1000 Mbit) +# +CONFIG_DL2K=m +CONFIG_E1000=m +# CONFIG_E1000_NAPI is not set +CONFIG_NS83820=m +CONFIG_HAMACHI=m +CONFIG_YELLOWFIN=m +CONFIG_R8169=m +CONFIG_SK98LIN=m +CONFIG_TIGON3=m +CONFIG_MV64340_ETH=m +# CONFIG_MV64340_ETH_0 is not set +CONFIG_MV64340_ETH_1=y +# CONFIG_MV64340_ETH_2 is not set + +# +# Ethernet (10000 Mbit) +# +CONFIG_IXGB=m +# CONFIG_IXGB_NAPI is not set +CONFIG_S2IO=m +# CONFIG_S2IO_NAPI is not set + +# +# Token Ring devices +# +CONFIG_TR=y +CONFIG_IBMOL=m +CONFIG_IBMLS=m +CONFIG_3C359=m +CONFIG_TMS380TR=m +CONFIG_TMSPCI=m +CONFIG_ABYSS=m + +# +# Wireless LAN (non-hamradio) +# +CONFIG_NET_RADIO=y + +# +# Obsolete Wireless cards support (pre-802.11) +# +CONFIG_STRIP=m +CONFIG_PCMCIA_WAVELAN=m +CONFIG_PCMCIA_NETWAVE=m + +# +# Wireless 802.11 Frequency Hopping cards support +# +CONFIG_PCMCIA_RAYCS=m + +# +# Wireless 802.11b ISA/PCI cards support +# +CONFIG_IEEE80211=m +# CONFIG_IEEE80211_DEBUG is not set +CONFIG_IEEE80211_CRYPT=m +CONFIG_IEEE80211_WPA=y +CONFIG_IEEE80211_CRYPT_CCMP=m +CONFIG_IEEE80211_CRYPT_TKIP=m +CONFIG_IPW2100=m +# CONFIG_IPW2100_PROMISC is not set +# CONFIG_IPW2100_LEGACY_FW_LOAD is not set +# CONFIG_IPW2100_NOWEP is not set +# CONFIG_IPW2100_DEBUG is not set +CONFIG_IPW2200=m +# CONFIG_IPW2200_NOWEP is not set +CONFIG_WLAN_NG=m +CONFIG_PRISM2=m +CONFIG_PRISM2_USB=m +CONFIG_ACX100=m +CONFIG_ADM8211=m +CONFIG_HERMES=m +CONFIG_APPLE_AIRPORT=m +CONFIG_PLX_HERMES=m +CONFIG_TMD_HERMES=m +CONFIG_PCI_HERMES=m +CONFIG_ATMEL=m +# CONFIG_PCI_ATMEL is not set + +# +# Wireless 802.11b Pcmcia/Cardbus cards support +# +CONFIG_PCMCIA_HERMES=m +CONFIG_AIRO_CS=m +CONFIG_PCMCIA_ATMEL=m +CONFIG_PCMCIA_WL3501=m + +# +# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support +# +CONFIG_PRISM54=m +CONFIG_NET_WIRELESS=y + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +CONFIG_PCMCIA_3C589=m +CONFIG_PCMCIA_3C574=m +CONFIG_PCMCIA_FMVJ18X=m +CONFIG_PCMCIA_PCNET=m +CONFIG_PCMCIA_NMCLAN=m +CONFIG_PCMCIA_SMC91C92=m +CONFIG_PCMCIA_XIRC2PS=m +CONFIG_PCMCIA_AXNET=m +CONFIG_ARCNET_COM20020_CS=m +CONFIG_PCMCIA_IBMTR=m + +# +# Wan interfaces +# +CONFIG_WAN=y +CONFIG_DSCC4=m +# CONFIG_DSCC4_PCISYNC is not set +# CONFIG_DSCC4_PCI_RST is not set +CONFIG_LANMEDIA=m +CONFIG_SYNCLINK_SYNCPPP=m +CONFIG_HDLC=m +CONFIG_HDLC_RAW=y +CONFIG_HDLC_RAW_ETH=y +CONFIG_HDLC_CISCO=y +CONFIG_HDLC_FR=y +CONFIG_HDLC_PPP=y +CONFIG_HDLC_X25=y +CONFIG_PCI200SYN=m +CONFIG_WANXL=m +CONFIG_PC300=m +CONFIG_PC300_MLPPP=y +CONFIG_FARSYNC=m +CONFIG_DLCI=m +CONFIG_DLCI_COUNT=24 +CONFIG_DLCI_MAX=8 +CONFIG_WAN_ROUTER_DRIVERS=y +CONFIG_CYCLADES_SYNC=m +CONFIG_CYCLOMX_X25=y +CONFIG_LAPBETHER=m +CONFIG_X25_ASY=m + +# +# ATM drivers +# +CONFIG_ATM_TCP=m +CONFIG_ATM_LANAI=m +CONFIG_ATM_ENI=m +# CONFIG_ATM_ENI_DEBUG is not set +# CONFIG_ATM_ENI_TUNE_BURST is not set +CONFIG_ATM_FIRESTREAM=m +CONFIG_ATM_ZATM=m +CONFIG_ATM_ZATM_DEBUG=y +CONFIG_ATM_NICSTAR=m +CONFIG_ATM_NICSTAR_USE_SUNI=y +CONFIG_ATM_NICSTAR_USE_IDT77105=y +CONFIG_ATM_IDT77252=m +# CONFIG_ATM_IDT77252_DEBUG is not set +# CONFIG_ATM_IDT77252_RCV_ALL is not set +CONFIG_ATM_IDT77252_USE_SUNI=y +CONFIG_ATM_AMBASSADOR=m +# CONFIG_ATM_AMBASSADOR_DEBUG is not set +CONFIG_ATM_HORIZON=m +# CONFIG_ATM_HORIZON_DEBUG is not set +CONFIG_ATM_IA=m +# CONFIG_ATM_IA_DEBUG is not set +CONFIG_ATM_FORE200E_MAYBE=m +CONFIG_ATM_FORE200E_PCA=y +CONFIG_ATM_FORE200E_PCA_DEFAULT_FW=y +CONFIG_ATM_FORE200E_USE_TASKLET=y +CONFIG_ATM_FORE200E_TX_RETRY=16 +CONFIG_ATM_FORE200E_DEBUG=0 +CONFIG_ATM_FORE200E=m +CONFIG_ATM_HE=m +# CONFIG_ATM_HE_USE_SUNI is not set +CONFIG_FDDI=y +CONFIG_DEFXX=m +CONFIG_SKFP=m +CONFIG_HIPPI=y +# CONFIG_ROADRUNNER is not set +CONFIG_PPP=m +CONFIG_PPP_MULTILINK=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_MPPE=m +CONFIG_PPPOE=m +CONFIG_PPPOATM=m +CONFIG_SLIP=m +# CONFIG_SLIP_COMPRESSED is not set +# CONFIG_SLIP_SMART is not set +# CONFIG_SLIP_MODE_SLIP6 is not set +CONFIG_NET_FC=y +CONFIG_SHAPER=m +CONFIG_NETCONSOLE=m +# CONFIG_NDISWRAPPER is not set + +# +# ISDN subsystem +# +CONFIG_ISDN=m + +# +# Old ISDN4Linux +# +# CONFIG_ISDN_I4L is not set + +# +# CAPI subsystem +# +CONFIG_ISDN_CAPI=m +# CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON is not set +CONFIG_ISDN_CAPI_MIDDLEWARE=y +CONFIG_ISDN_CAPI_CAPI20=m +# CONFIG_ISDN_CAPI_CAPIFS_BOOL is not set + +# +# CAPI hardware drivers +# + +# +# Active AVM cards +# +CONFIG_CAPI_AVM=y + +# +# Active Eicon DIVA Server cards +# +CONFIG_CAPI_EICON=y +CONFIG_ISDN_DIVAS=m +CONFIG_ISDN_DIVAS_BRIPCI=y +CONFIG_ISDN_DIVAS_PRIPCI=y +CONFIG_ISDN_DIVAS_DIVACAPI=m +CONFIG_ISDN_DIVAS_USERIDI=m +CONFIG_ISDN_DIVAS_MAINT=m + +# +# Modular ISDN driver +# +# CONFIG_MISDN_DRV is not set + +# +# Telephony Support +# +CONFIG_PHONE=m +CONFIG_PHONE_IXJ=m +CONFIG_PHONE_IXJ_PCMCIA=m + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_MOUSEDEV_PSAUX_ENABLE=y +CONFIG_INPUT_JOYDEV=m +CONFIG_INPUT_TSDEV=m +CONFIG_INPUT_TSDEV_SCREEN_X=240 +CONFIG_INPUT_TSDEV_SCREEN_Y=320 +CONFIG_INPUT_EVDEV=m +CONFIG_INPUT_EVBUG=m + +# +# Input I/O drivers +# +CONFIG_GAMEPORT=m +CONFIG_SOUND_GAMEPORT=m +CONFIG_GAMEPORT_NS558=m +CONFIG_GAMEPORT_L4=m +CONFIG_GAMEPORT_EMU10K1=m +CONFIG_GAMEPORT_VORTEX=m +CONFIG_GAMEPORT_FM801=m +CONFIG_GAMEPORT_CS461x=m +CONFIG_SERIO=m +CONFIG_SERIO_I8042=m +CONFIG_SERIO_SERPORT=m +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PCIPS2 is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=m +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=m +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_VSXXXAA is not set +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_ANALOG=m +CONFIG_JOYSTICK_A3D=m +CONFIG_JOYSTICK_ADI=m +CONFIG_JOYSTICK_COBRA=m +CONFIG_JOYSTICK_GF2K=m +CONFIG_JOYSTICK_GRIP=m +CONFIG_JOYSTICK_GRIP_MP=m +CONFIG_JOYSTICK_GUILLEMOT=m +CONFIG_JOYSTICK_INTERACT=m +CONFIG_JOYSTICK_SIDEWINDER=m +CONFIG_JOYSTICK_TMDC=m +CONFIG_JOYSTICK_IFORCE=m +CONFIG_JOYSTICK_IFORCE_USB=y +CONFIG_JOYSTICK_IFORCE_232=y +CONFIG_JOYSTICK_WARRIOR=m +CONFIG_JOYSTICK_MAGELLAN=m +CONFIG_JOYSTICK_SPACEORB=m +CONFIG_JOYSTICK_SPACEBALL=m +CONFIG_JOYSTICK_STINGER=m +CONFIG_JOYSTICK_TWIDDLER=m +CONFIG_INPUT_JOYDUMP=m +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_GUNZE=m +CONFIG_INPUT_MISC=y +CONFIG_INPUT_UINPUT=m + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +# CONFIG_SERIAL_8250_CS is not set +CONFIG_SERIAL_8250_NR_UARTS=4 +# CONFIG_SERIAL_8250_EXTENDED is not set + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_SERIAL_PMACZILOG=y +CONFIG_SERIAL_PMACZILOG_CONSOLE=y +CONFIG_UNIX98_PTYS=y +# CONFIG_LEGACY_PTYS is not set +CONFIG_QIC02_TAPE=m +CONFIG_QIC02_DYNCONF=y + +# +# Setting runtime QIC-02 configuration is done with qic02conf +# + +# +# from the tpqic02-support package. It is available at +# + +# +# metalab.unc.edu or ftp://titus.cfw.com/pub/Linux/util/ +# + +# +# IPMI +# +CONFIG_IPMI_HANDLER=m +# CONFIG_IPMI_PANIC_EVENT is not set +CONFIG_IPMI_DEVICE_INTERFACE=m +CONFIG_IPMI_SI=m +CONFIG_IPMI_WATCHDOG=m + +# +# Watchdog Cards +# +CONFIG_WATCHDOG=y +# CONFIG_WATCHDOG_NOWAYOUT is not set + +# +# Watchdog Device Drivers +# +CONFIG_SOFT_WATCHDOG=m + +# +# PCI-based Watchdog Cards +# +CONFIG_PCIPCWATCHDOG=m +CONFIG_WDTPCI=m +CONFIG_WDT_501_PCI=y + +# +# USB-based Watchdog Cards +# +CONFIG_USBPCWATCHDOG=m +CONFIG_NVRAM=y +CONFIG_GEN_RTC=y +CONFIG_GEN_RTC_X=y +CONFIG_DTLK=m +CONFIG_R3964=m +CONFIG_APPLICOM=m + +# +# Ftape, the floppy tape device driver +# +CONFIG_AGP=m +CONFIG_AGP_UNINORTH=m +CONFIG_DRM=y +CONFIG_DRM_TDFX=m +# CONFIG_DRM_GAMMA is not set +CONFIG_DRM_R128=m +CONFIG_DRM_RADEON=m +CONFIG_DRM_MGA=m +CONFIG_DRM_SIS=m + +# +# PCMCIA character devices +# +CONFIG_SYNCLINK_CS=m +# CONFIG_RAW_DRIVER is not set + +# +# I2C support +# +CONFIG_I2C=y +CONFIG_I2C_CHARDEV=m + +# +# I2C Algorithms +# +CONFIG_I2C_ALGOBIT=y +CONFIG_I2C_ALGOPCF=m + +# +# I2C Hardware Bus support +# +# CONFIG_I2C_ALI1535 is not set +# CONFIG_I2C_ALI1563 is not set +# CONFIG_I2C_ALI15X3 is not set +# CONFIG_I2C_AMD756 is not set +# CONFIG_I2C_AMD8111 is not set +CONFIG_I2C_HYDRA=m +# CONFIG_I2C_I801 is not set +# CONFIG_I2C_I810 is not set +CONFIG_I2C_ISA=m +CONFIG_I2C_KEYWEST=y +# CONFIG_I2C_NFORCE2 is not set +CONFIG_I2C_PARPORT_LIGHT=m +# CONFIG_I2C_PIIX4 is not set +CONFIG_I2C_PROSAVAGE=m +CONFIG_I2C_SAVAGE4=m +CONFIG_SCx200_ACB=m +CONFIG_I2C_SIS5595=m +CONFIG_I2C_SIS630=m +CONFIG_I2C_SIS96X=m +CONFIG_I2C_VIA=m +CONFIG_I2C_VIAPRO=m +CONFIG_I2C_VOODOO3=m + +# +# Hardware Sensors Chip support +# +CONFIG_I2C_SENSOR=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM1025=m +CONFIG_SENSORS_ADM1031=m +CONFIG_SENSORS_ASB100=m +CONFIG_SENSORS_DS1621=m +CONFIG_SENSORS_FSCHER=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_IT87=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM77=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_LM83=m +CONFIG_SENSORS_LM85=m +CONFIG_SENSORS_LM90=m +CONFIG_SENSORS_MAX1619=m +CONFIG_SENSORS_VIA686A=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_W83L785TS=m +CONFIG_SENSORS_W83627HF=m + +# +# Other I2C Chip support +# +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_PCF8574=m +CONFIG_SENSORS_PCF8591=m +CONFIG_SENSORS_RTC8564=m +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set + +# +# Dallas's 1-wire bus +# +CONFIG_W1=m +CONFIG_W1_MATROX=m +CONFIG_W1_THERM=m + +# +# Misc devices +# + +# +# Multimedia devices +# +CONFIG_VIDEO_DEV=m + +# +# Video For Linux +# + +# +# Video Adapters +# +CONFIG_VIDEO_BT848=m +CONFIG_VIDEO_CPIA=m +CONFIG_VIDEO_CPIA_USB=m +CONFIG_VIDEO_SAA5246A=m +CONFIG_VIDEO_SAA5249=m +CONFIG_TUNER_3036=m +CONFIG_VIDEO_STRADIS=m +CONFIG_VIDEO_ZORAN=m +CONFIG_VIDEO_ZORAN_BUZ=m +CONFIG_VIDEO_ZORAN_DC10=m +CONFIG_VIDEO_ZORAN_DC30=m +CONFIG_VIDEO_ZORAN_LML33=m +CONFIG_VIDEO_ZORAN_LML33R10=m +CONFIG_VIDEO_SAA7134=m +CONFIG_VIDEO_MXB=m +CONFIG_VIDEO_DPC=m +CONFIG_VIDEO_HEXIUM_ORION=m +CONFIG_VIDEO_HEXIUM_GEMINI=m +CONFIG_VIDEO_CX88=m +CONFIG_VIDEO_OVCAMCHIP=m + +# +# Radio Adapters +# +CONFIG_RADIO_GEMTEK_PCI=m +CONFIG_RADIO_MAXIRADIO=m +CONFIG_RADIO_MAESTRO=m + +# +# Digital Video Broadcasting Devices +# +CONFIG_DVB=y +CONFIG_DVB_CORE=m + +# +# Supported Frontend Modules +# +CONFIG_DVB_TWINHAN_DST=m +CONFIG_DVB_STV0299=m +CONFIG_DVB_SP887X=m +CONFIG_DVB_SP887X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/sc_main.mc" +CONFIG_DVB_ALPS_TDLB7=m +CONFIG_DVB_ALPS_TDMB7=m +CONFIG_DVB_ATMEL_AT76C651=m +CONFIG_DVB_CX24110=m +CONFIG_DVB_GRUNDIG_29504_491=m +CONFIG_DVB_GRUNDIG_29504_401=m +CONFIG_DVB_MT312=m +CONFIG_DVB_VES1820=m +CONFIG_DVB_VES1X93=m +CONFIG_DVB_TDA1004X=m +CONFIG_DVB_TDA1004X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/tda1004x.bin" +CONFIG_DVB_NXT6000=m + +# +# Supported SAA7146 based PCI Adapters +# +CONFIG_DVB_AV7110=m +CONFIG_DVB_AV7110_OSD=y +CONFIG_DVB_BUDGET=m +CONFIG_DVB_BUDGET_CI=m +CONFIG_DVB_BUDGET_AV=m +CONFIG_DVB_BUDGET_PATCH=m + +# +# Supported USB Adapters +# +CONFIG_DVB_TTUSB_BUDGET=m +CONFIG_DVB_TTUSB_DEC=m + +# +# Supported FlexCopII (B2C2) Adapters +# +CONFIG_DVB_B2C2_SKYSTAR=m + +# +# Supported BT878 Adapters +# +CONFIG_DVB_BT8XX=m +CONFIG_VIDEO_SAA7146=m +CONFIG_VIDEO_SAA7146_VV=m +CONFIG_VIDEO_VIDEOBUF=m +CONFIG_VIDEO_TUNER=m +CONFIG_VIDEO_BUF=m +CONFIG_VIDEO_BTCX=m +CONFIG_VIDEO_IR=m + +# +# Graphics support +# +CONFIG_FB=y +CONFIG_FB_CIRRUS=m +# CONFIG_FB_PM2 is not set +# CONFIG_FB_CYBER2000 is not set +CONFIG_FB_OF=y +CONFIG_FB_CONTROL=y +CONFIG_FB_PLATINUM=y +CONFIG_FB_VALKYRIE=y +CONFIG_FB_CT65550=y +# CONFIG_FB_ASILIANT is not set +CONFIG_FB_IMSTT=y +# CONFIG_FB_VGA16 is not set +CONFIG_FB_RIVA=m +CONFIG_FB_RIVA_I2C=y +# CONFIG_FB_RIVA_DEBUG is not set +CONFIG_FB_MATROX=y +CONFIG_FB_MATROX_MILLENIUM=y +CONFIG_FB_MATROX_MYSTIQUE=y +CONFIG_FB_MATROX_G450=y +CONFIG_FB_MATROX_G100=y +CONFIG_FB_MATROX_I2C=m +CONFIG_FB_MATROX_MAVEN=m +CONFIG_FB_MATROX_MULTIHEAD=y +# CONFIG_FB_RADEON_OLD is not set +CONFIG_FB_RADEON=y +CONFIG_FB_RADEON_I2C=y +# CONFIG_FB_RADEON_DEBUG is not set +CONFIG_FB_ATY128=y +CONFIG_FB_ATY=y +CONFIG_FB_ATY_CT=y +CONFIG_FB_ATY_GX=y +# CONFIG_FB_ATY_XL_INIT is not set +CONFIG_FB_SIS=m +CONFIG_FB_SIS_300=y +CONFIG_FB_SIS_315=y +CONFIG_FB_NEOMAGIC=m +CONFIG_FB_KYRO=m +CONFIG_FB_3DFX=y +# CONFIG_FB_3DFX_ACCEL is not set +CONFIG_FB_VOODOO1=y +CONFIG_FB_TRIDENT=m +CONFIG_FB_TRIDENT_ACCEL=y +# CONFIG_FB_VIRTUAL is not set + +# +# Console display driver support +# +# CONFIG_VGA_CONSOLE is not set +# CONFIG_MDA_CONSOLE is not set +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y + +# +# Logo configuration +# +CONFIG_LOGO=y +# CONFIG_LOGO_LINUX_MONO is not set +CONFIG_LOGO_LINUX_VGA16=y +# CONFIG_LOGO_LINUX_CLUT224 is not set + +# +# Sound +# +CONFIG_SOUND=m +CONFIG_DMASOUND_PMAC=m +CONFIG_DMASOUND=m + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +CONFIG_SND_HWDEP=m +CONFIG_SND_RAWMIDI=m +CONFIG_SND_SEQUENCER=m +# CONFIG_SND_SEQ_DUMMY is not set +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=m +CONFIG_SND_PCM_OSS=m +CONFIG_SND_SEQUENCER_OSS=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set + +# +# Generic devices +# +CONFIG_SND_MPU401_UART=m +CONFIG_SND_OPL3_LIB=m +CONFIG_SND_VX_LIB=m +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_VIRMIDI is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set + +# +# PCI devices +# +CONFIG_SND_AC97_CODEC=m +# CONFIG_SND_ALI5451 is not set +CONFIG_SND_ATIIXP=m +CONFIG_SND_AU8810=m +CONFIG_SND_AU8820=m +CONFIG_SND_AU8830=m +CONFIG_SND_AZT3328=m +CONFIG_SND_BT87X=m +CONFIG_SND_CS46XX=m +CONFIG_SND_CS46XX_NEW_DSP=y +CONFIG_SND_CS4281=m +CONFIG_SND_EMU10K1=m +CONFIG_SND_KORG1212=m +CONFIG_SND_MIXART=m +CONFIG_SND_NM256=m +CONFIG_SND_RME32=m +CONFIG_SND_RME96=m +CONFIG_SND_RME9652=m +CONFIG_SND_HDSP=m +CONFIG_SND_TRIDENT=m +CONFIG_SND_YMFPCI=m +CONFIG_SND_ALS4000=m +CONFIG_SND_CMIPCI=m +CONFIG_SND_ENS1370=m +CONFIG_SND_ENS1371=m +CONFIG_SND_ES1938=m +CONFIG_SND_ES1968=m +CONFIG_SND_MAESTRO3=m +CONFIG_SND_FM801=m +CONFIG_SND_FM801_TEA575X=m +CONFIG_SND_ICE1712=m +CONFIG_SND_ICE1724=m +# CONFIG_SND_INTEL8X0 is not set +# CONFIG_SND_INTEL8X0M is not set +CONFIG_SND_SONICVIBES=m +CONFIG_SND_VIA82XX=m +CONFIG_SND_VX222=m + +# +# ALSA PowerMac devices +# +CONFIG_SND_POWERMAC=m + +# +# ALSA USB devices +# +CONFIG_SND_USB_AUDIO=m + +# +# PCMCIA devices +# + +# +# Open Sound System +# +# CONFIG_SOUND_PRIME is not set + +# +# USB support +# +CONFIG_USB=m +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +CONFIG_USB_BANDWIDTH=y +CONFIG_USB_DYNAMIC_MINORS=y + +# +# USB Host Controller Drivers +# +CONFIG_USB_EHCI_HCD=m +CONFIG_USB_EHCI_SPLIT_ISO=y +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_OHCI_HCD=m +CONFIG_USB_UHCI_HCD=m + +# +# USB Device Class drivers +# +CONFIG_USB_AUDIO=m + +# +# USB Bluetooth TTY can only be used with disabled Bluetooth subsystem +# +CONFIG_USB_MIDI=m +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_RW_DETECT is not set +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_DPCM=y +CONFIG_USB_STORAGE_HP8200e=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y + +# +# USB Human Interface Devices (HID) +# +CONFIG_USB_HID=m +CONFIG_USB_HIDINPUT=y +CONFIG_HID_FF=y +CONFIG_HID_PID=y +CONFIG_LOGITECH_FF=y +CONFIG_THRUSTMASTER_FF=y +CONFIG_USB_HIDDEV=y + +# +# USB HID Boot Protocol drivers +# +# CONFIG_USB_KBD is not set +# CONFIG_USB_MOUSE is not set +CONFIG_USB_AIPTEK=m +CONFIG_USB_WACOM=m +CONFIG_USB_KBTAB=m +CONFIG_USB_POWERMATE=m +CONFIG_USB_MTOUCH=m +CONFIG_USB_EGALAX=m +CONFIG_USB_XPAD=m +CONFIG_USB_ATI_REMOTE=m + +# +# USB Imaging devices +# +CONFIG_USB_MDC800=m +CONFIG_USB_MICROTEK=m +CONFIG_USB_HPUSBSCSI=m + +# +# USB Multimedia devices +# +CONFIG_USB_VICAM=m +CONFIG_USB_DSBR=m +CONFIG_USB_IBMCAM=m +CONFIG_USB_KONICAWC=m +CONFIG_USB_OV511=m +CONFIG_USB_PWC=m +CONFIG_USB_SE401=m +CONFIG_USB_SN9C102=m +CONFIG_USB_STV680=m +CONFIG_USB_W9968CF=m + +# +# USB Network adaptors +# +CONFIG_USB_CATC=m +CONFIG_USB_KAWETH=m +CONFIG_USB_PEGASUS=m +CONFIG_USB_RTL8150=m +CONFIG_USB_USBNET=m + +# +# USB Host-to-Host Cables +# +CONFIG_USB_ALI_M5632=y +CONFIG_USB_AN2720=y +CONFIG_USB_BELKIN=y +CONFIG_USB_GENESYS=y +CONFIG_USB_NET1080=y +CONFIG_USB_PL2301=y + +# +# Intelligent USB Devices/Gadgets +# +CONFIG_USB_ARMLINUX=y +CONFIG_USB_EPSON2888=y +CONFIG_USB_ZAURUS=y +CONFIG_USB_CDCETHER=y + +# +# USB Network Adapters +# +CONFIG_USB_AX8817X=y + +# +# USB port drivers +# + +# +# USB Serial Converter support +# +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_BELKIN=m +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m +CONFIG_USB_SERIAL_EMPEG=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_VISOR=m +CONFIG_USB_SERIAL_IPAQ=m +CONFIG_USB_SERIAL_IR=m +CONFIG_USB_SERIAL_EDGEPORT=m +CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_KEYSPAN_PDA=m +CONFIG_USB_SERIAL_KEYSPAN=m +CONFIG_USB_SERIAL_KLSI=m +CONFIG_USB_SERIAL_KOBIL_SCT=m +CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_SAFE=m +CONFIG_USB_SERIAL_SAFE_PADDED=y +CONFIG_USB_SERIAL_CYBERJACK=m +CONFIG_USB_SERIAL_XIRCOM=m +CONFIG_USB_SERIAL_OMNINET=m +CONFIG_USB_EZUSB=y + +# +# USB Miscellaneous drivers +# +CONFIG_USB_TIGL=m +CONFIG_USB_AUERSWALD=m +CONFIG_USB_RIO500=m +CONFIG_USB_LEGOTOWER=m +CONFIG_USB_LCD=m +CONFIG_USB_LED=m +CONFIG_USB_CYTHERM=m +CONFIG_USB_SPEEDTOUCH=m +CONFIG_USB_PHIDGETSERVO=m +CONFIG_USB_TEST=m +CONFIG_USB_EAGLE=m + +# +# USB Gadget Support +# +CONFIG_USB_GADGET=m +CONFIG_USB_GADGET_NET2280=y +CONFIG_USB_NET2280=m +# CONFIG_USB_GADGET_PXA2XX is not set +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_SA1100 is not set +# CONFIG_USB_GADGET_DUMMY_HCD is not set +CONFIG_USB_GADGET_DUALSPEED=y +CONFIG_USB_ZERO=m +CONFIG_USB_ETH=m +CONFIG_USB_ETH_RNDIS=y +CONFIG_USB_GADGETFS=m +CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_FILE_STORAGE_TEST=y +CONFIG_USB_G_SERIAL=m + +# +# File systems +# +CONFIG_EXT2_FS=m +# CONFIG_EXT2_FS_XATTR is not set +CONFIG_EXT3_FS=m +CONFIG_EXT3_FS_XATTR=y +# CONFIG_EXT3_FS_POSIX_ACL is not set +# CONFIG_EXT3_FS_SECURITY is not set +CONFIG_JBD=m +# CONFIG_JBD_DEBUG is not set +CONFIG_FS_MBCACHE=m +CONFIG_REISERFS_FS=m +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +CONFIG_REISERFS_FS_XATTR=y +# CONFIG_REISERFS_FS_POSIX_ACL is not set +# CONFIG_REISERFS_FS_SECURITY is not set +CONFIG_JFS_FS=m +# CONFIG_JFS_POSIX_ACL is not set +# CONFIG_JFS_DEBUG is not set +CONFIG_JFS_STATISTICS=y +CONFIG_XFS_FS=m +# CONFIG_XFS_RT is not set +CONFIG_XFS_QUOTA=y +# CONFIG_XFS_SECURITY is not set +CONFIG_XFS_POSIX_ACL=y +CONFIG_MINIX_FS=m +# CONFIG_ROMFS_FS is not set +# CONFIG_QUOTA is not set +CONFIG_QUOTACTL=y +# CONFIG_AUTOFS_FS is not set +CONFIG_AUTOFS4_FS=m + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=m +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_ZISOFS_FS=m +CONFIG_UDF_FS=m +CONFIG_UDF_NLS=y + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +CONFIG_NTFS_FS=m +# CONFIG_NTFS_DEBUG is not set +# CONFIG_NTFS_RW is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_SYSFS=y +CONFIG_DEVFS_FS=y +# CONFIG_DEVFS_MOUNT is not set +# CONFIG_DEVFS_DEBUG is not set +# CONFIG_DEVPTS_FS_XATTR is not set +CONFIG_TMPFS=y +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y + +# +# Miscellaneous filesystems +# +CONFIG_ADFS_FS=m +# CONFIG_ADFS_FS_RW is not set +CONFIG_AFFS_FS=m +CONFIG_ASFS_FS=m +CONFIG_ASFS_RW=y +CONFIG_HFS_FS=m +CONFIG_HFSPLUS_FS=m +CONFIG_BEFS_FS=m +# CONFIG_BEFS_DEBUG is not set +CONFIG_BFS_FS=m +CONFIG_EFS_FS=m +CONFIG_CRAMFS=y +CONFIG_VXFS_FS=m +CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +# CONFIG_QNX4FS_RW is not set +CONFIG_SYSV_FS=m +CONFIG_UFS_FS=m +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=m +CONFIG_NFS_V3=y +CONFIG_NFS_V4=y +# CONFIG_NFS_DIRECTIO is not set +CONFIG_NFSD=m +CONFIG_NFSD_V3=y +CONFIG_NFSD_V4=y +CONFIG_NFSD_TCP=y +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=m +CONFIG_SUNRPC=m +CONFIG_SUNRPC_GSS=m +CONFIG_RPCSEC_GSS_KRB5=m +CONFIG_SMB_FS=m +CONFIG_SMB_NLS_DEFAULT=y +CONFIG_SMB_NLS_REMOTE="iso8859-1" +CONFIG_CIFS=m +# CONFIG_CIFS_STATS is not set +# CONFIG_CIFS_XATTR is not set +# CONFIG_CIFS_POSIX is not set +CONFIG_NCP_FS=m +# CONFIG_NCPFS_PACKET_SIGNING is not set +# CONFIG_NCPFS_IOCTL_LOCKING is not set +# CONFIG_NCPFS_STRONG is not set +CONFIG_NCPFS_NFS_NS=y +CONFIG_NCPFS_OS2_NS=y +# CONFIG_NCPFS_SMALLDOS is not set +CONFIG_NCPFS_NLS=y +CONFIG_NCPFS_EXTRAS=y +CONFIG_CODA_FS=m +# CONFIG_CODA_FS_OLD_API is not set +CONFIG_AFS_FS=m +CONFIG_RXRPC=m + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +# CONFIG_OSF_PARTITION is not set +CONFIG_AMIGA_PARTITION=y +# CONFIG_ATARI_PARTITION is not set +CONFIG_MAC_PARTITION=y +CONFIG_MSDOS_PARTITION=y +# CONFIG_BSD_DISKLABEL is not set +# CONFIG_MINIX_SUBPARTITION is not set +# CONFIG_SOLARIS_X86_PARTITION is not set +# CONFIG_UNIXWARE_DISKLABEL is not set +# CONFIG_LDM_PARTITION is not set +# CONFIG_SGI_PARTITION is not set +# CONFIG_ULTRIX_PARTITION is not set +# CONFIG_SUN_PARTITION is not set +# CONFIG_EFI_PARTITION is not set + +# +# Native Language Support +# +CONFIG_NLS=m +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=m +CONFIG_NLS_CODEPAGE_737=m +CONFIG_NLS_CODEPAGE_775=m +CONFIG_NLS_CODEPAGE_850=m +CONFIG_NLS_CODEPAGE_852=m +CONFIG_NLS_CODEPAGE_855=m +CONFIG_NLS_CODEPAGE_857=m +CONFIG_NLS_CODEPAGE_860=m +CONFIG_NLS_CODEPAGE_861=m +CONFIG_NLS_CODEPAGE_862=m +CONFIG_NLS_CODEPAGE_863=m +CONFIG_NLS_CODEPAGE_864=m +CONFIG_NLS_CODEPAGE_865=m +CONFIG_NLS_CODEPAGE_866=m +CONFIG_NLS_CODEPAGE_869=m +CONFIG_NLS_CODEPAGE_936=m +CONFIG_NLS_CODEPAGE_950=m +CONFIG_NLS_CODEPAGE_932=m +CONFIG_NLS_CODEPAGE_949=m +CONFIG_NLS_CODEPAGE_874=m +CONFIG_NLS_ISO8859_8=m +CONFIG_NLS_CODEPAGE_1250=m +CONFIG_NLS_CODEPAGE_1251=m +CONFIG_NLS_ASCII=m +CONFIG_NLS_ISO8859_1=m +CONFIG_NLS_ISO8859_2=m +CONFIG_NLS_ISO8859_3=m +CONFIG_NLS_ISO8859_4=m +CONFIG_NLS_ISO8859_5=m +CONFIG_NLS_ISO8859_6=m +CONFIG_NLS_ISO8859_7=m +CONFIG_NLS_ISO8859_9=m +CONFIG_NLS_ISO8859_13=m +CONFIG_NLS_ISO8859_14=m +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_KOI8_R=m +CONFIG_NLS_KOI8_U=m +CONFIG_NLS_UTF8=m + +# +# Library routines +# +CONFIG_CRC_CCITT=m +CONFIG_CRC32=m +CONFIG_LIBCRC32C=m +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=m + +# +# Profiling support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=m + +# +# Kernel hacking +# +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_SLAB is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_HIGHMEM is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_XMON is not set +# CONFIG_BDI_SWITCH is not set +# CONFIG_DEBUG_INFO is not set +CONFIG_BOOTX_TEXT=y + +# +# Security options +# +# CONFIG_SECURITY is not set + +# +# Cryptographic options +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_SHA1=m +CONFIG_CRYPTO_SHA256=m +CONFIG_CRYPTO_SHA512=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_KHAZAD=m +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_MICHAEL_MIC=m +CONFIG_CRYPTO_CRC32C=m +CONFIG_CRYPTO_TEST=m --- linux-source-2.6.8.1-2.6.8.1.orig/debian/config/powerpc/power4 +++ linux-source-2.6.8.1-2.6.8.1/debian/config/powerpc/power4 @@ -0,0 +1,2079 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_MMU=y +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_HAVE_DEC_LOCK=y +CONFIG_PPC=y +CONFIG_PPC32=y +CONFIG_GENERIC_NVRAM=y + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +CONFIG_CLEAN_COMPILE=y +CONFIG_BROKEN_ON_SMP=y + +# +# General setup +# +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_BSD_PROCESS_ACCT=y +# CONFIG_BSD_PROCESS_ACCT_V3 is not set +CONFIG_SYSCTL=y +CONFIG_AUDIT=y +CONFIG_LOG_BUF_SHIFT=14 +CONFIG_HOTPLUG=y +# CONFIG_IKCONFIG is not set +# CONFIG_EMBEDDED is not set +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_OBSOLETE_MODPARM=y +CONFIG_MODVERSIONS=y +CONFIG_KMOD=y + +# +# Processor +# +# CONFIG_6xx is not set +# CONFIG_40x is not set +# CONFIG_44x is not set +# CONFIG_POWER3 is not set +CONFIG_POWER4=y +# CONFIG_8xx is not set +# CONFIG_E500 is not set +# CONFIG_ALTIVEC is not set +# CONFIG_CPU_FREQ is not set +CONFIG_PM=y +CONFIG_PPC64BRIDGE=y +CONFIG_PPC_STD_MMU=y + +# +# Platform options +# +CONFIG_PPC_MULTIPLATFORM=y +# CONFIG_APUS is not set +# CONFIG_WILLOW is not set +# CONFIG_PCORE is not set +# CONFIG_POWERPMC250 is not set +# CONFIG_EV64260 is not set +# CONFIG_SPRUCE is not set +# CONFIG_LOPEC is not set +# CONFIG_MCPN765 is not set +# CONFIG_MVME5100 is not set +# CONFIG_PPLUS is not set +# CONFIG_PRPMC750 is not set +# CONFIG_PRPMC800 is not set +# CONFIG_SANDPOINT is not set +# CONFIG_ADIR is not set +# CONFIG_K2 is not set +# CONFIG_PAL4 is not set +# CONFIG_GEMINI is not set +# CONFIG_EST8260 is not set +# CONFIG_SBC82xx is not set +# CONFIG_SBS8260 is not set +# CONFIG_RPX8260 is not set +# CONFIG_TQM8260 is not set +# CONFIG_ADS8272 is not set +# CONFIG_LITE5200 is not set +CONFIG_PPC_CHRP=y +CONFIG_PPC_PMAC=y +CONFIG_PPC_PMAC64=y +CONFIG_PPC_PREP=y +CONFIG_PPC_OF=y +CONFIG_PPCBUG_NVRAM=y +# CONFIG_SMP is not set +# CONFIG_PREEMPT is not set +CONFIG_HIGHMEM=y +CONFIG_KERNEL_ELF=y +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_MISC=m +CONFIG_PROC_DEVICETREE=y +CONFIG_PREP_RESIDUAL=y +CONFIG_PROC_PREPRESIDUAL=y +CONFIG_CMDLINE_BOOL=y +CONFIG_CMDLINE="console=ttyS0,9600 console=tty0 root=/dev/sda2" + +# +# Bus options +# +# CONFIG_ISA is not set +CONFIG_GENERIC_ISA_DMA=y +CONFIG_PCI=y +CONFIG_PCI_DOMAINS=y +CONFIG_PCI_LEGACY_PROC=y +CONFIG_PCI_NAMES=y + +# +# PCMCIA/CardBus support +# +CONFIG_PCMCIA=m +# CONFIG_PCMCIA_DEBUG is not set +CONFIG_YENTA=m +CONFIG_CARDBUS=y +CONFIG_PD6729=m +CONFIG_I82092=m +CONFIG_TCIC=m + +# +# Advanced setup +# +# CONFIG_ADVANCED_OPTIONS is not set + +# +# Default settings for advanced configuration options are used +# +CONFIG_HIGHMEM_START=0xfe000000 +CONFIG_LOWMEM_SIZE=0x30000000 +CONFIG_KERNEL_START=0xc0000000 +CONFIG_TASK_SIZE=0x80000000 +CONFIG_BOOT_LOAD=0x00800000 + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=m +# CONFIG_DEBUG_DRIVER is not set + +# +# Memory Technology Devices (MTD) +# +# CONFIG_MTD is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Plug and Play support +# + +# +# Block devices +# +CONFIG_BLK_DEV_FD=m +CONFIG_BLK_CPQ_DA=m +CONFIG_BLK_CPQ_CISS_DA=m +CONFIG_CISS_SCSI_TAPE=y +CONFIG_BLK_DEV_DAC960=m +CONFIG_BLK_DEV_UMEM=m +CONFIG_BLK_DEV_LOOP=m +CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_SX8=m +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_BLK_DEV_INITRD=y +CONFIG_LBD=y + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=y +CONFIG_BLK_DEV_IDE=y + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_IDE_SATA is not set +CONFIG_BLK_DEV_IDEDISK=m +# CONFIG_IDEDISK_MULTI_MODE is not set +CONFIG_BLK_DEV_IDECS=m +CONFIG_BLK_DEV_IDECD=m +CONFIG_BLK_DEV_IDETAPE=m +CONFIG_BLK_DEV_IDEFLOPPY=m +CONFIG_BLK_DEV_IDESCSI=m +# CONFIG_IDE_TASK_IOCTL is not set +# CONFIG_IDE_TASKFILE_IO is not set + +# +# IDE chipset support/bugfixes +# +# CONFIG_IDE_GENERIC is not set +CONFIG_BLK_DEV_IDEPCI=y +CONFIG_IDEPCI_SHARE_IRQ=y +# CONFIG_BLK_DEV_OFFBOARD is not set +CONFIG_BLK_DEV_GENERIC=m +# CONFIG_BLK_DEV_OPTI621 is not set +CONFIG_BLK_DEV_SL82C105=m +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +CONFIG_IDEDMA_PCI_AUTO=y +CONFIG_IDEDMA_ONLYDISK=y +CONFIG_BLK_DEV_ADMA=y +CONFIG_BLK_DEV_AEC62XX=m +# CONFIG_BLK_DEV_ALI15X3 is not set +# CONFIG_BLK_DEV_AMD74XX is not set +CONFIG_BLK_DEV_CMD64X=m +# CONFIG_BLK_DEV_TRIFLEX is not set +# CONFIG_BLK_DEV_CY82C693 is not set +# CONFIG_BLK_DEV_CS5520 is not set +# CONFIG_BLK_DEV_CS5530 is not set +CONFIG_BLK_DEV_HPT34X=m +# CONFIG_HPT34X_AUTODMA is not set +CONFIG_BLK_DEV_HPT366=m +CONFIG_BLK_DEV_SC1200=m +# CONFIG_BLK_DEV_PIIX is not set +CONFIG_BLK_DEV_NS87415=m +CONFIG_BLK_DEV_PDC202XX_OLD=m +# CONFIG_PDC202XX_BURST is not set +CONFIG_BLK_DEV_PDC202XX_NEW=m +CONFIG_PDC202XX_FORCE=y +# CONFIG_BLK_DEV_SVWKS is not set +CONFIG_BLK_DEV_SIIMAGE=m +# CONFIG_BLK_DEV_SLC90E66 is not set +CONFIG_BLK_DEV_TRM290=m +CONFIG_BLK_DEV_VIA82CXXX=m +CONFIG_BLK_DEV_IDE_PMAC=y +CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y +CONFIG_BLK_DEV_IDEDMA_PMAC=y +# CONFIG_BLK_DEV_IDE_PMAC_BLINK is not set +CONFIG_BLK_DEV_IDEDMA_PMAC_AUTO=y +# CONFIG_IDE_ARM is not set +CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_IVB is not set +CONFIG_IDEDMA_AUTO=y +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +CONFIG_SCSI=m +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +CONFIG_CHR_DEV_ST=m +CONFIG_CHR_DEV_OSST=m +CONFIG_BLK_DEV_SR=m +CONFIG_BLK_DEV_SR_VENDOR=y +CONFIG_CHR_DEV_SG=m +CONFIG_CHR_DEV_SCH=m + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y + +# +# SCSI Transport Attributes +# +CONFIG_SCSI_SPI_ATTRS=m +CONFIG_SCSI_FC_ATTRS=m + +# +# SCSI low-level drivers +# +CONFIG_BLK_DEV_3W_XXXX_RAID=m +CONFIG_SCSI_3W_9XXX=m +CONFIG_SCSI_ACARD=m +CONFIG_SCSI_AACRAID=m +CONFIG_SCSI_AIC7XXX=m +CONFIG_AIC7XXX_CMDS_PER_DEVICE=32 +CONFIG_AIC7XXX_RESET_DELAY_MS=15000 +# CONFIG_AIC7XXX_BUILD_FIRMWARE is not set +CONFIG_AIC7XXX_DEBUG_ENABLE=y +CONFIG_AIC7XXX_DEBUG_MASK=0 +CONFIG_AIC7XXX_REG_PRETTY_PRINT=y +CONFIG_SCSI_AIC7XXX_OLD=m +CONFIG_SCSI_AIC79XX=m +CONFIG_AIC79XX_CMDS_PER_DEVICE=32 +CONFIG_AIC79XX_RESET_DELAY_MS=15000 +# CONFIG_AIC79XX_BUILD_FIRMWARE is not set +# CONFIG_AIC79XX_ENABLE_RD_STRM is not set +CONFIG_AIC79XX_DEBUG_ENABLE=y +CONFIG_AIC79XX_DEBUG_MASK=0 +CONFIG_AIC79XX_REG_PRETTY_PRINT=y +CONFIG_SCSI_DPT_I2O=m +CONFIG_SCSI_MEGARAID=m +CONFIG_SCSI_SATA=y +CONFIG_SCSI_SATA_SVW=m +# CONFIG_SCSI_ATA_PIIX is not set +# CONFIG_SCSI_SATA_NV is not set +CONFIG_SCSI_SATA_PROMISE=m +CONFIG_SCSI_SATA_SX4=m +CONFIG_SCSI_SATA_SIL=m +CONFIG_SCSI_SATA_SIS=m +CONFIG_SCSI_SATA_VIA=m +CONFIG_SCSI_SATA_VITESSE=m +CONFIG_SCSI_BUSLOGIC=m +# CONFIG_SCSI_OMIT_FLASHPOINT is not set +CONFIG_SCSI_DMX3191D=m +CONFIG_SCSI_EATA=m +# CONFIG_SCSI_EATA_TAGGED_QUEUE is not set +# CONFIG_SCSI_EATA_LINKED_COMMANDS is not set +CONFIG_SCSI_EATA_MAX_TAGS=16 +CONFIG_SCSI_EATA_PIO=m +CONFIG_SCSI_FUTURE_DOMAIN=m +# CONFIG_SCSI_GDTH is not set +CONFIG_SCSI_IPS=m +CONFIG_SCSI_INIA100=m +CONFIG_SCSI_SYM53C8XX_2=m +CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 +CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 +CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 +# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set +CONFIG_SCSI_IPR=m +# CONFIG_SCSI_IPR_TRACE is not set +# CONFIG_SCSI_IPR_DUMP is not set +CONFIG_SCSI_QLOGIC_ISP=m +CONFIG_SCSI_QLOGIC_FC=m +# CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set +CONFIG_SCSI_QLOGIC_1280=m +CONFIG_SCSI_DC395x=m +CONFIG_SCSI_DC390T=m +CONFIG_SCSI_NSP32=m +# CONFIG_SCSI_DEBUG is not set +CONFIG_SCSI_MESH=m +CONFIG_SCSI_MESH_SYNC_RATE=5 +CONFIG_SCSI_MESH_RESET_DELAY_MS=4000 +CONFIG_SCSI_MAC53C94=m + +# +# PCMCIA SCSI adapter support +# +CONFIG_PCMCIA_AHA152X=m +CONFIG_PCMCIA_FDOMAIN=m +CONFIG_PCMCIA_NINJA_SCSI=m +CONFIG_PCMCIA_QLOGIC=m +CONFIG_PCMCIA_SYM53C500=m + +# +# Multi-device support (RAID and LVM) +# +CONFIG_MD=y +CONFIG_BLK_DEV_MD=m +CONFIG_MD_LINEAR=m +CONFIG_MD_RAID0=m +CONFIG_MD_RAID1=m +CONFIG_MD_RAID5=m +CONFIG_MD_RAID6=m +CONFIG_MD_MULTIPATH=m +CONFIG_BLK_DEV_DM=m +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=m +CONFIG_DM_MIRROR=m +CONFIG_DM_ZERO=m + +# +# Fusion MPT device support +# +CONFIG_FUSION=m +CONFIG_FUSION_MAX_SGE=40 +CONFIG_FUSION_ISENSE=m +CONFIG_FUSION_CTL=m +# CONFIG_FUSION_LAN is not set + +# +# IEEE 1394 (FireWire) support +# +CONFIG_IEEE1394=m + +# +# Subsystem Options +# +# CONFIG_IEEE1394_VERBOSEDEBUG is not set +CONFIG_IEEE1394_OUI_DB=y +CONFIG_IEEE1394_EXTRA_CONFIG_ROMS=y +CONFIG_IEEE1394_CONFIG_ROM_IP1394=y + +# +# Device Drivers +# +CONFIG_IEEE1394_PCILYNX=m +CONFIG_IEEE1394_OHCI1394=m + +# +# Protocol Drivers +# +CONFIG_IEEE1394_VIDEO1394=m +CONFIG_IEEE1394_SBP2=m +CONFIG_IEEE1394_SBP2_PHYS_DMA=y +CONFIG_IEEE1394_ETH1394=m +CONFIG_IEEE1394_DV1394=m +CONFIG_IEEE1394_RAWIO=m +CONFIG_IEEE1394_CMP=m +CONFIG_IEEE1394_AMDTP=m + +# +# I2O device support +# +CONFIG_I2O=m +CONFIG_I2O_CONFIG=m +CONFIG_I2O_BLOCK=m +CONFIG_I2O_SCSI=m +CONFIG_I2O_PROC=m + +# +# Macintosh device drivers +# +CONFIG_ADB=y +CONFIG_ADB_PMU=y +CONFIG_PMAC_PBOOK=y +CONFIG_PMAC_APM_EMU=m +CONFIG_PMAC_BACKLIGHT=y +CONFIG_INPUT_ADBHID=y +CONFIG_MAC_EMUMOUSEBTN=y +CONFIG_THERM_PM72=y + +# +# Networking support +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=m +# CONFIG_PACKET_MMAP is not set +CONFIG_NETLINK_DEV=m +CONFIG_UNIX=m +CONFIG_NET_KEY=m +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_FWMARK=y +CONFIG_IP_ROUTE_NAT=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_TOS=y +CONFIG_IP_ROUTE_VERBOSE=y +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE=m +CONFIG_NET_IPGRE_BROADCAST=y +CONFIG_IP_MROUTE=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +CONFIG_ARPD=y +# CONFIG_SYN_COOKIES is not set +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +CONFIG_INET_IPCOMP=m + +# +# IP: Virtual Server Configuration +# +CONFIG_IP_VS=m +# CONFIG_IP_VS_DEBUG is not set +CONFIG_IP_VS_TAB_BITS=12 + +# +# IPVS transport protocol load balancing support +# +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_PROTO_ESP=y +CONFIG_IP_VS_PROTO_AH=y + +# +# IPVS scheduler +# +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_WRR=m +CONFIG_IP_VS_LC=m +CONFIG_IP_VS_WLC=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m + +# +# IPVS application helper +# +CONFIG_IP_VS_FTP=m +CONFIG_IPV6=m +CONFIG_IPV6_PRIVACY=y +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +CONFIG_INET6_IPCOMP=m +CONFIG_IPV6_TUNNEL=m +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_BRIDGE_NETFILTER=y + +# +# IP: Netfilter Configuration +# +CONFIG_IP_NF_CONNTRACK=m +CONFIG_IP_NF_FTP=m +CONFIG_IP_NF_IRC=m +CONFIG_IP_NF_TFTP=m +CONFIG_IP_NF_AMANDA=m +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_LIMIT=m +# CONFIG_IP_NF_MATCH_IPRANGE is not set +CONFIG_IP_NF_MATCH_MAC=m +CONFIG_IP_NF_MATCH_PKTTYPE=m +CONFIG_IP_NF_MATCH_MARK=m +CONFIG_IP_NF_MATCH_MULTIPORT=m +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_DSCP=m +# CONFIG_IP_NF_MATCH_AH_ESP is not set +CONFIG_IP_NF_MATCH_LENGTH=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_TCPMSS=m +CONFIG_IP_NF_MATCH_HELPER=m +CONFIG_IP_NF_MATCH_STATE=m +CONFIG_IP_NF_MATCH_CONNTRACK=m +CONFIG_IP_NF_MATCH_OWNER=m +# CONFIG_IP_NF_MATCH_PHYSDEV is not set +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_REDIRECT=m +# CONFIG_IP_NF_TARGET_NETMAP is not set +# CONFIG_IP_NF_TARGET_SAME is not set +CONFIG_IP_NF_NAT_LOCAL=y +CONFIG_IP_NF_NAT_SNMP_BASIC=m +CONFIG_IP_NF_NAT_IRC=m +CONFIG_IP_NF_NAT_FTP=m +CONFIG_IP_NF_NAT_TFTP=m +CONFIG_IP_NF_NAT_AMANDA=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_DSCP=m +CONFIG_IP_NF_TARGET_MARK=m +# CONFIG_IP_NF_TARGET_CLASSIFY is not set +CONFIG_IP_NF_TARGET_LOG=m +# CONFIG_IP_NF_TARGET_ULOG is not set +CONFIG_IP_NF_TARGET_TCPMSS=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +# CONFIG_IP_NF_COMPAT_IPCHAINS is not set +# CONFIG_IP_NF_COMPAT_IPFWADM is not set +CONFIG_IP_NF_TARGET_NOTRACK=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_MATCH_ADDRTYPE=m +CONFIG_IP_NF_MATCH_REALM=m + +# +# IPv6: Netfilter Configuration +# +# CONFIG_IP6_NF_QUEUE is not set +# CONFIG_IP6_NF_IPTABLES is not set + +# +# DECnet: Netfilter Configuration +# +# CONFIG_DECNET_NF_GRABULATOR is not set + +# +# Bridge: Netfilter Configuration +# +# CONFIG_BRIDGE_NF_EBTABLES is not set +CONFIG_XFRM=y +CONFIG_XFRM_USER=m + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IP_SCTP=m +# CONFIG_SCTP_DBG_MSG is not set +# CONFIG_SCTP_DBG_OBJCNT is not set +# CONFIG_SCTP_HMAC_NONE is not set +# CONFIG_SCTP_HMAC_SHA1 is not set +CONFIG_SCTP_HMAC_MD5=y +CONFIG_ATM=m +CONFIG_ATM_CLIP=m +CONFIG_ATM_CLIP_NO_ICMP=y +CONFIG_ATM_LANE=m +CONFIG_ATM_MPOA=m +CONFIG_ATM_BR2684=m +# CONFIG_ATM_BR2684_IPFILTER is not set +CONFIG_BRIDGE=m +CONFIG_VLAN_8021Q=m +CONFIG_DECNET=m +CONFIG_DECNET_SIOCGIFCONF=y +CONFIG_DECNET_ROUTER=y +CONFIG_DECNET_ROUTE_FWMARK=y +CONFIG_LLC=y +CONFIG_LLC2=m +CONFIG_IPX=m +CONFIG_IPX_INTERN=y +CONFIG_ATALK=m +CONFIG_DEV_APPLETALK=y +CONFIG_IPDDP=m +CONFIG_IPDDP_ENCAP=y +CONFIG_IPDDP_DECAP=y +CONFIG_X25=m +CONFIG_LAPB=m +CONFIG_NET_DIVERT=y +CONFIG_ECONET=m +CONFIG_ECONET_AUNUDP=y +CONFIG_ECONET_NATIVE=y +CONFIG_WAN_ROUTER=m +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_CLK_JIFFIES=y +# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set +# CONFIG_NET_SCH_CLK_CPU is not set +CONFIG_NET_SCH_CBQ=m +CONFIG_NET_SCH_HTB=m +CONFIG_NET_SCH_HFSC=m +CONFIG_NET_SCH_ATM=m +CONFIG_NET_SCH_PRIO=m +CONFIG_NET_SCH_RED=m +CONFIG_NET_SCH_SFQ=m +CONFIG_NET_SCH_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_NETEM=m +CONFIG_NET_SCH_INGRESS=m +CONFIG_NET_QOS=y +CONFIG_NET_ESTIMATOR=y +CONFIG_NET_CLS=y +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_ROUTE=y +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +# CONFIG_CLS_U32_PERF is not set +# CONFIG_NET_CLS_IND is not set +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +# CONFIG_NET_CLS_ACT is not set +CONFIG_NET_CLS_POLICE=y + +# +# Network testing +# +CONFIG_NET_PKTGEN=m +CONFIG_NETPOLL=y +CONFIG_NETPOLL_RX=y +CONFIG_NETPOLL_TRAP=y +CONFIG_NET_POLL_CONTROLLER=y +CONFIG_HAMRADIO=y + +# +# Packet Radio protocols +# +CONFIG_AX25=m +CONFIG_AX25_DAMA_SLAVE=y +CONFIG_NETROM=m +CONFIG_ROSE=m + +# +# AX.25 network device drivers +# +CONFIG_MKISS=m +CONFIG_6PACK=m +CONFIG_BPQETHER=m +CONFIG_BAYCOM_SER_FDX=m +CONFIG_BAYCOM_SER_HDX=m +CONFIG_YAM=m +CONFIG_IRDA=m + +# +# IrDA protocols +# +CONFIG_IRLAN=m +CONFIG_IRNET=m +CONFIG_IRCOMM=m +CONFIG_IRDA_ULTRA=y + +# +# IrDA options +# +CONFIG_IRDA_CACHE_LAST_LSAP=y +CONFIG_IRDA_FAST_RR=y +CONFIG_IRDA_DEBUG=y + +# +# Infrared-port device drivers +# + +# +# SIR device drivers +# +CONFIG_IRTTY_SIR=m + +# +# Dongle support +# +# CONFIG_DONGLE is not set + +# +# Old SIR device drivers +# +# CONFIG_IRPORT_SIR is not set + +# +# Old Serial dongle support +# + +# +# FIR device drivers +# +# CONFIG_USB_IRDA is not set +# CONFIG_SIGMATEL_FIR is not set +# CONFIG_TOSHIBA_FIR is not set +# CONFIG_VLSI_FIR is not set +CONFIG_BT=m +CONFIG_BT_L2CAP=m +CONFIG_BT_SCO=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_CMTP=m +CONFIG_BT_HIDP=m + +# +# Bluetooth device drivers +# +CONFIG_BT_HCIUSB=m +CONFIG_BT_HCIUSB_SCO=y +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_H4=y +CONFIG_BT_HCIUART_BCSP=y +CONFIG_BT_HCIUART_BCSP_TXCRC=y +CONFIG_BT_HCIBCM203X=m +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIDTL1=m +CONFIG_BT_HCIBT3C=m +CONFIG_BT_HCIBLUECARD=m +CONFIG_BT_HCIBTUART=m +CONFIG_BT_HCIVHCI=m +CONFIG_NETDEVICES=y +CONFIG_DUMMY=m +CONFIG_BONDING=m +CONFIG_EQUALIZER=m +CONFIG_TUN=m +CONFIG_ETHERTAP=m + +# +# ARCnet devices +# +CONFIG_ARCNET=m +CONFIG_ARCNET_1201=m +CONFIG_ARCNET_1051=m +CONFIG_ARCNET_RAW=m +CONFIG_ARCNET_COM90xx=m +CONFIG_ARCNET_COM90xxIO=m +CONFIG_ARCNET_RIM_I=m +CONFIG_ARCNET_COM20020=m +CONFIG_ARCNET_COM20020_PCI=m + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=y +CONFIG_MACE=m +# CONFIG_MACE_AAUI_PORT is not set +CONFIG_BMAC=m +CONFIG_HAPPYMEAL=m +CONFIG_SUNGEM=m +CONFIG_NET_VENDOR_3COM=y +CONFIG_VORTEX=m +CONFIG_TYPHOON=m + +# +# Tulip family network device support +# +CONFIG_NET_TULIP=y +CONFIG_DE2104X=m +CONFIG_TULIP=m +# CONFIG_TULIP_MWI is not set +# CONFIG_TULIP_MMIO is not set +# CONFIG_TULIP_NAPI is not set +CONFIG_DE4X5=m +CONFIG_WINBOND_840=m +CONFIG_DM9102=m +CONFIG_PCMCIA_XIRCOM=m +CONFIG_PCMCIA_XIRTULIP=m +CONFIG_HP100=m +CONFIG_NET_PCI=y +CONFIG_PCNET32=m +# CONFIG_AMD8111_ETH is not set +CONFIG_ADAPTEC_STARFIRE=m +# CONFIG_ADAPTEC_STARFIRE_NAPI is not set +CONFIG_B44=m +# CONFIG_FORCEDETH is not set +CONFIG_EEPRO100=m +# CONFIG_EEPRO100_PIO is not set +CONFIG_E100=m +# CONFIG_E100_NAPI is not set +CONFIG_FEALNX=m +CONFIG_NATSEMI=m +CONFIG_NE2K_PCI=m +CONFIG_8139CP=m +CONFIG_8139TOO=m +CONFIG_8139TOO_PIO=y +# CONFIG_8139TOO_TUNE_TWISTER is not set +CONFIG_8139TOO_8129=y +# CONFIG_8139_OLD_RX_RESET is not set +CONFIG_SIS900=m +CONFIG_EPIC100=m +CONFIG_SUNDANCE=m +CONFIG_SUNDANCE_MMIO=y +CONFIG_TLAN=m +CONFIG_VIA_RHINE=m +CONFIG_VIA_RHINE_MMIO=y +CONFIG_VIA_VELOCITY=m + +# +# Ethernet (1000 Mbit) +# +CONFIG_DL2K=m +CONFIG_E1000=m +# CONFIG_E1000_NAPI is not set +CONFIG_NS83820=m +CONFIG_HAMACHI=m +CONFIG_YELLOWFIN=m +CONFIG_R8169=m +CONFIG_SK98LIN=m +CONFIG_TIGON3=m +CONFIG_MV64340_ETH=m +# CONFIG_MV64340_ETH_0 is not set +CONFIG_MV64340_ETH_1=y +# CONFIG_MV64340_ETH_2 is not set + +# +# Ethernet (10000 Mbit) +# +CONFIG_IXGB=m +# CONFIG_IXGB_NAPI is not set +CONFIG_S2IO=m +# CONFIG_S2IO_NAPI is not set + +# +# Token Ring devices +# +CONFIG_TR=y +CONFIG_IBMOL=m +CONFIG_IBMLS=m +CONFIG_3C359=m +CONFIG_TMS380TR=m +CONFIG_TMSPCI=m +CONFIG_ABYSS=m + +# +# Wireless LAN (non-hamradio) +# +CONFIG_NET_RADIO=y + +# +# Obsolete Wireless cards support (pre-802.11) +# +CONFIG_STRIP=m +CONFIG_PCMCIA_WAVELAN=m +CONFIG_PCMCIA_NETWAVE=m + +# +# Wireless 802.11 Frequency Hopping cards support +# +CONFIG_PCMCIA_RAYCS=m + +# +# Wireless 802.11b ISA/PCI cards support +# +CONFIG_IEEE80211=m +# CONFIG_IEEE80211_DEBUG is not set +CONFIG_IEEE80211_CRYPT=m +CONFIG_IEEE80211_WPA=y +CONFIG_IEEE80211_CRYPT_CCMP=m +CONFIG_IEEE80211_CRYPT_TKIP=m +CONFIG_IPW2100=m +# CONFIG_IPW2100_PROMISC is not set +# CONFIG_IPW2100_LEGACY_FW_LOAD is not set +# CONFIG_IPW2100_NOWEP is not set +# CONFIG_IPW2100_DEBUG is not set +CONFIG_IPW2200=m +# CONFIG_IPW2200_NOWEP is not set +CONFIG_WLAN_NG=m +CONFIG_PRISM2=m +CONFIG_PRISM2_USB=m +CONFIG_ACX100=m +CONFIG_ADM8211=m +CONFIG_HERMES=m +CONFIG_APPLE_AIRPORT=m +CONFIG_PLX_HERMES=m +CONFIG_TMD_HERMES=m +CONFIG_PCI_HERMES=m +CONFIG_ATMEL=m +# CONFIG_PCI_ATMEL is not set + +# +# Wireless 802.11b Pcmcia/Cardbus cards support +# +CONFIG_PCMCIA_HERMES=m +CONFIG_AIRO_CS=m +CONFIG_PCMCIA_ATMEL=m +CONFIG_PCMCIA_WL3501=m + +# +# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support +# +CONFIG_PRISM54=m +CONFIG_NET_WIRELESS=y + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +CONFIG_PCMCIA_3C589=m +CONFIG_PCMCIA_3C574=m +CONFIG_PCMCIA_FMVJ18X=m +CONFIG_PCMCIA_PCNET=m +CONFIG_PCMCIA_NMCLAN=m +CONFIG_PCMCIA_SMC91C92=m +CONFIG_PCMCIA_XIRC2PS=m +CONFIG_PCMCIA_AXNET=m +CONFIG_ARCNET_COM20020_CS=m +CONFIG_PCMCIA_IBMTR=m + +# +# Wan interfaces +# +CONFIG_WAN=y +CONFIG_DSCC4=m +# CONFIG_DSCC4_PCISYNC is not set +# CONFIG_DSCC4_PCI_RST is not set +CONFIG_LANMEDIA=m +CONFIG_SYNCLINK_SYNCPPP=m +CONFIG_HDLC=m +CONFIG_HDLC_RAW=y +CONFIG_HDLC_RAW_ETH=y +CONFIG_HDLC_CISCO=y +CONFIG_HDLC_FR=y +CONFIG_HDLC_PPP=y +CONFIG_HDLC_X25=y +CONFIG_PCI200SYN=m +CONFIG_WANXL=m +CONFIG_PC300=m +CONFIG_PC300_MLPPP=y +CONFIG_FARSYNC=m +CONFIG_DLCI=m +CONFIG_DLCI_COUNT=24 +CONFIG_DLCI_MAX=8 +CONFIG_WAN_ROUTER_DRIVERS=y +CONFIG_CYCLADES_SYNC=m +CONFIG_CYCLOMX_X25=y +CONFIG_LAPBETHER=m +CONFIG_X25_ASY=m + +# +# ATM drivers +# +CONFIG_ATM_TCP=m +CONFIG_ATM_LANAI=m +CONFIG_ATM_ENI=m +# CONFIG_ATM_ENI_DEBUG is not set +# CONFIG_ATM_ENI_TUNE_BURST is not set +CONFIG_ATM_FIRESTREAM=m +CONFIG_ATM_ZATM=m +CONFIG_ATM_ZATM_DEBUG=y +CONFIG_ATM_NICSTAR=m +CONFIG_ATM_NICSTAR_USE_SUNI=y +CONFIG_ATM_NICSTAR_USE_IDT77105=y +CONFIG_ATM_IDT77252=m +# CONFIG_ATM_IDT77252_DEBUG is not set +# CONFIG_ATM_IDT77252_RCV_ALL is not set +CONFIG_ATM_IDT77252_USE_SUNI=y +CONFIG_ATM_AMBASSADOR=m +# CONFIG_ATM_AMBASSADOR_DEBUG is not set +CONFIG_ATM_HORIZON=m +# CONFIG_ATM_HORIZON_DEBUG is not set +CONFIG_ATM_IA=m +# CONFIG_ATM_IA_DEBUG is not set +CONFIG_ATM_FORE200E_MAYBE=m +CONFIG_ATM_FORE200E_PCA=y +CONFIG_ATM_FORE200E_PCA_DEFAULT_FW=y +CONFIG_ATM_FORE200E_USE_TASKLET=y +CONFIG_ATM_FORE200E_TX_RETRY=16 +CONFIG_ATM_FORE200E_DEBUG=0 +CONFIG_ATM_FORE200E=m +CONFIG_ATM_HE=m +# CONFIG_ATM_HE_USE_SUNI is not set +CONFIG_FDDI=y +CONFIG_DEFXX=m +CONFIG_SKFP=m +CONFIG_HIPPI=y +# CONFIG_ROADRUNNER is not set +CONFIG_PPP=m +CONFIG_PPP_MULTILINK=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_MPPE=m +CONFIG_PPPOE=m +CONFIG_PPPOATM=m +CONFIG_SLIP=m +# CONFIG_SLIP_COMPRESSED is not set +# CONFIG_SLIP_SMART is not set +# CONFIG_SLIP_MODE_SLIP6 is not set +CONFIG_NET_FC=y +CONFIG_SHAPER=m +CONFIG_NETCONSOLE=m +# CONFIG_NDISWRAPPER is not set + +# +# ISDN subsystem +# +CONFIG_ISDN=m + +# +# Old ISDN4Linux +# +# CONFIG_ISDN_I4L is not set + +# +# CAPI subsystem +# +CONFIG_ISDN_CAPI=m +# CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON is not set +CONFIG_ISDN_CAPI_MIDDLEWARE=y +CONFIG_ISDN_CAPI_CAPI20=m +# CONFIG_ISDN_CAPI_CAPIFS_BOOL is not set + +# +# CAPI hardware drivers +# + +# +# Active AVM cards +# +CONFIG_CAPI_AVM=y +CONFIG_ISDN_DRV_AVMB1_B1PCI=m +CONFIG_ISDN_DRV_AVMB1_B1PCIV4=y +CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m +CONFIG_ISDN_DRV_AVMB1_AVM_CS=m +CONFIG_ISDN_DRV_AVMB1_T1PCI=m +CONFIG_ISDN_DRV_AVMB1_C4=m + +# +# Active Eicon DIVA Server cards +# +CONFIG_CAPI_EICON=y +CONFIG_ISDN_DIVAS=m +CONFIG_ISDN_DIVAS_BRIPCI=y +CONFIG_ISDN_DIVAS_PRIPCI=y +CONFIG_ISDN_DIVAS_DIVACAPI=m +CONFIG_ISDN_DIVAS_USERIDI=m +CONFIG_ISDN_DIVAS_MAINT=m + +# +# Modular ISDN driver +# +# CONFIG_MISDN_DRV is not set + +# +# Telephony Support +# +CONFIG_PHONE=m +CONFIG_PHONE_IXJ=m +CONFIG_PHONE_IXJ_PCMCIA=m + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_MOUSEDEV_PSAUX_ENABLE=y +CONFIG_INPUT_JOYDEV=m +CONFIG_INPUT_TSDEV=m +CONFIG_INPUT_TSDEV_SCREEN_X=240 +CONFIG_INPUT_TSDEV_SCREEN_Y=320 +CONFIG_INPUT_EVDEV=m +CONFIG_INPUT_EVBUG=m + +# +# Input I/O drivers +# +CONFIG_GAMEPORT=m +CONFIG_SOUND_GAMEPORT=m +CONFIG_GAMEPORT_NS558=m +CONFIG_GAMEPORT_L4=m +CONFIG_GAMEPORT_EMU10K1=m +CONFIG_GAMEPORT_VORTEX=m +CONFIG_GAMEPORT_FM801=m +CONFIG_GAMEPORT_CS461x=m +CONFIG_SERIO=m +CONFIG_SERIO_I8042=m +CONFIG_SERIO_SERPORT=m +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PCIPS2 is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=m +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=m +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_VSXXXAA is not set +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_ANALOG=m +CONFIG_JOYSTICK_A3D=m +CONFIG_JOYSTICK_ADI=m +CONFIG_JOYSTICK_COBRA=m +CONFIG_JOYSTICK_GF2K=m +CONFIG_JOYSTICK_GRIP=m +CONFIG_JOYSTICK_GRIP_MP=m +CONFIG_JOYSTICK_GUILLEMOT=m +CONFIG_JOYSTICK_INTERACT=m +CONFIG_JOYSTICK_SIDEWINDER=m +CONFIG_JOYSTICK_TMDC=m +CONFIG_JOYSTICK_IFORCE=m +CONFIG_JOYSTICK_IFORCE_USB=y +CONFIG_JOYSTICK_IFORCE_232=y +CONFIG_JOYSTICK_WARRIOR=m +CONFIG_JOYSTICK_MAGELLAN=m +CONFIG_JOYSTICK_SPACEORB=m +CONFIG_JOYSTICK_SPACEBALL=m +CONFIG_JOYSTICK_STINGER=m +CONFIG_JOYSTICK_TWIDDLER=m +CONFIG_INPUT_JOYDUMP=m +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_GUNZE=m +CONFIG_INPUT_MISC=y +CONFIG_INPUT_UINPUT=m + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +# CONFIG_SERIAL_8250_CS is not set +CONFIG_SERIAL_8250_NR_UARTS=4 +# CONFIG_SERIAL_8250_EXTENDED is not set + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_SERIAL_PMACZILOG=y +CONFIG_SERIAL_PMACZILOG_CONSOLE=y +CONFIG_UNIX98_PTYS=y +# CONFIG_LEGACY_PTYS is not set +CONFIG_QIC02_TAPE=m +CONFIG_QIC02_DYNCONF=y + +# +# Setting runtime QIC-02 configuration is done with qic02conf +# + +# +# from the tpqic02-support package. It is available at +# + +# +# metalab.unc.edu or ftp://titus.cfw.com/pub/Linux/util/ +# + +# +# IPMI +# +CONFIG_IPMI_HANDLER=m +# CONFIG_IPMI_PANIC_EVENT is not set +CONFIG_IPMI_DEVICE_INTERFACE=m +CONFIG_IPMI_SI=m +CONFIG_IPMI_WATCHDOG=m + +# +# Watchdog Cards +# +CONFIG_WATCHDOG=y +# CONFIG_WATCHDOG_NOWAYOUT is not set + +# +# Watchdog Device Drivers +# +CONFIG_SOFT_WATCHDOG=m + +# +# PCI-based Watchdog Cards +# +CONFIG_PCIPCWATCHDOG=m +CONFIG_WDTPCI=m +CONFIG_WDT_501_PCI=y + +# +# USB-based Watchdog Cards +# +CONFIG_USBPCWATCHDOG=m +CONFIG_NVRAM=y +CONFIG_GEN_RTC=y +CONFIG_GEN_RTC_X=y +CONFIG_DTLK=m +CONFIG_R3964=m +CONFIG_APPLICOM=m + +# +# Ftape, the floppy tape device driver +# +CONFIG_AGP=m +CONFIG_AGP_UNINORTH=m +CONFIG_DRM=y +CONFIG_DRM_TDFX=m +# CONFIG_DRM_GAMMA is not set +CONFIG_DRM_R128=m +CONFIG_DRM_RADEON=m +CONFIG_DRM_MGA=m +CONFIG_DRM_SIS=m + +# +# PCMCIA character devices +# +CONFIG_SYNCLINK_CS=m +# CONFIG_RAW_DRIVER is not set + +# +# I2C support +# +CONFIG_I2C=y +CONFIG_I2C_CHARDEV=m + +# +# I2C Algorithms +# +CONFIG_I2C_ALGOBIT=y +CONFIG_I2C_ALGOPCF=m + +# +# I2C Hardware Bus support +# +# CONFIG_I2C_ALI1535 is not set +# CONFIG_I2C_ALI1563 is not set +# CONFIG_I2C_ALI15X3 is not set +# CONFIG_I2C_AMD756 is not set +# CONFIG_I2C_AMD8111 is not set +CONFIG_I2C_HYDRA=m +# CONFIG_I2C_I801 is not set +# CONFIG_I2C_I810 is not set +CONFIG_I2C_ISA=m +CONFIG_I2C_KEYWEST=y +# CONFIG_I2C_NFORCE2 is not set +CONFIG_I2C_PARPORT_LIGHT=m +# CONFIG_I2C_PIIX4 is not set +CONFIG_I2C_PROSAVAGE=m +CONFIG_I2C_SAVAGE4=m +CONFIG_SCx200_ACB=m +CONFIG_I2C_SIS5595=m +CONFIG_I2C_SIS630=m +CONFIG_I2C_SIS96X=m +CONFIG_I2C_VIA=m +CONFIG_I2C_VIAPRO=m +CONFIG_I2C_VOODOO3=m + +# +# Hardware Sensors Chip support +# +CONFIG_I2C_SENSOR=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM1025=m +CONFIG_SENSORS_ADM1031=m +CONFIG_SENSORS_ASB100=m +CONFIG_SENSORS_DS1621=m +CONFIG_SENSORS_FSCHER=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_IT87=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM77=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_LM83=m +CONFIG_SENSORS_LM85=m +CONFIG_SENSORS_LM90=m +CONFIG_SENSORS_MAX1619=m +CONFIG_SENSORS_VIA686A=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_W83L785TS=m +CONFIG_SENSORS_W83627HF=m + +# +# Other I2C Chip support +# +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_PCF8574=m +CONFIG_SENSORS_PCF8591=m +CONFIG_SENSORS_RTC8564=m +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set + +# +# Dallas's 1-wire bus +# +CONFIG_W1=m +CONFIG_W1_MATROX=m +CONFIG_W1_THERM=m + +# +# Misc devices +# + +# +# Multimedia devices +# +CONFIG_VIDEO_DEV=m + +# +# Video For Linux +# + +# +# Video Adapters +# +CONFIG_VIDEO_BT848=m +CONFIG_VIDEO_CPIA=m +CONFIG_VIDEO_CPIA_USB=m +CONFIG_VIDEO_SAA5246A=m +CONFIG_VIDEO_SAA5249=m +CONFIG_TUNER_3036=m +CONFIG_VIDEO_STRADIS=m +CONFIG_VIDEO_ZORAN=m +CONFIG_VIDEO_ZORAN_BUZ=m +CONFIG_VIDEO_ZORAN_DC10=m +CONFIG_VIDEO_ZORAN_DC30=m +CONFIG_VIDEO_ZORAN_LML33=m +CONFIG_VIDEO_ZORAN_LML33R10=m +CONFIG_VIDEO_SAA7134=m +CONFIG_VIDEO_MXB=m +CONFIG_VIDEO_DPC=m +CONFIG_VIDEO_HEXIUM_ORION=m +CONFIG_VIDEO_HEXIUM_GEMINI=m +CONFIG_VIDEO_CX88=m +CONFIG_VIDEO_OVCAMCHIP=m + +# +# Radio Adapters +# +CONFIG_RADIO_GEMTEK_PCI=m +CONFIG_RADIO_MAXIRADIO=m +CONFIG_RADIO_MAESTRO=m + +# +# Digital Video Broadcasting Devices +# +CONFIG_DVB=y +CONFIG_DVB_CORE=m + +# +# Supported Frontend Modules +# +CONFIG_DVB_TWINHAN_DST=m +CONFIG_DVB_STV0299=m +CONFIG_DVB_SP887X=m +CONFIG_DVB_SP887X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/sc_main.mc" +CONFIG_DVB_ALPS_TDLB7=m +CONFIG_DVB_ALPS_TDMB7=m +CONFIG_DVB_ATMEL_AT76C651=m +CONFIG_DVB_CX24110=m +CONFIG_DVB_GRUNDIG_29504_491=m +CONFIG_DVB_GRUNDIG_29504_401=m +CONFIG_DVB_MT312=m +CONFIG_DVB_VES1820=m +CONFIG_DVB_VES1X93=m +CONFIG_DVB_TDA1004X=m +CONFIG_DVB_TDA1004X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/tda1004x.bin" +CONFIG_DVB_NXT6000=m + +# +# Supported SAA7146 based PCI Adapters +# +CONFIG_DVB_AV7110=m +CONFIG_DVB_AV7110_OSD=y +CONFIG_DVB_BUDGET=m +CONFIG_DVB_BUDGET_CI=m +CONFIG_DVB_BUDGET_AV=m +CONFIG_DVB_BUDGET_PATCH=m + +# +# Supported USB Adapters +# +CONFIG_DVB_TTUSB_BUDGET=m +CONFIG_DVB_TTUSB_DEC=m + +# +# Supported FlexCopII (B2C2) Adapters +# +CONFIG_DVB_B2C2_SKYSTAR=m + +# +# Supported BT878 Adapters +# +CONFIG_DVB_BT8XX=m +CONFIG_VIDEO_SAA7146=m +CONFIG_VIDEO_SAA7146_VV=m +CONFIG_VIDEO_VIDEOBUF=m +CONFIG_VIDEO_TUNER=m +CONFIG_VIDEO_BUF=m +CONFIG_VIDEO_BTCX=m +CONFIG_VIDEO_IR=m + +# +# Graphics support +# +CONFIG_FB=y +CONFIG_FB_CIRRUS=m +# CONFIG_FB_PM2 is not set +# CONFIG_FB_CYBER2000 is not set +CONFIG_FB_OF=y +CONFIG_FB_CONTROL=y +CONFIG_FB_PLATINUM=y +CONFIG_FB_VALKYRIE=y +CONFIG_FB_CT65550=y +# CONFIG_FB_ASILIANT is not set +CONFIG_FB_IMSTT=y +# CONFIG_FB_VGA16 is not set +CONFIG_FB_RIVA=m +CONFIG_FB_RIVA_I2C=y +# CONFIG_FB_RIVA_DEBUG is not set +CONFIG_FB_MATROX=y +CONFIG_FB_MATROX_MILLENIUM=y +CONFIG_FB_MATROX_MYSTIQUE=y +CONFIG_FB_MATROX_G450=y +CONFIG_FB_MATROX_G100=y +CONFIG_FB_MATROX_I2C=m +CONFIG_FB_MATROX_MAVEN=m +CONFIG_FB_MATROX_MULTIHEAD=y +# CONFIG_FB_RADEON_OLD is not set +CONFIG_FB_RADEON=y +CONFIG_FB_RADEON_I2C=y +# CONFIG_FB_RADEON_DEBUG is not set +CONFIG_FB_ATY128=y +CONFIG_FB_ATY=y +CONFIG_FB_ATY_CT=y +CONFIG_FB_ATY_GX=y +# CONFIG_FB_ATY_XL_INIT is not set +CONFIG_FB_SIS=m +CONFIG_FB_SIS_300=y +CONFIG_FB_SIS_315=y +CONFIG_FB_NEOMAGIC=m +CONFIG_FB_KYRO=m +CONFIG_FB_3DFX=y +# CONFIG_FB_3DFX_ACCEL is not set +CONFIG_FB_VOODOO1=y +CONFIG_FB_TRIDENT=m +CONFIG_FB_TRIDENT_ACCEL=y +# CONFIG_FB_VIRTUAL is not set + +# +# Console display driver support +# +# CONFIG_VGA_CONSOLE is not set +# CONFIG_MDA_CONSOLE is not set +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y + +# +# Logo configuration +# +CONFIG_LOGO=y +# CONFIG_LOGO_LINUX_MONO is not set +CONFIG_LOGO_LINUX_VGA16=y +# CONFIG_LOGO_LINUX_CLUT224 is not set + +# +# Sound +# +CONFIG_SOUND=m +CONFIG_DMASOUND_PMAC=m +CONFIG_DMASOUND=m + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +CONFIG_SND_HWDEP=m +CONFIG_SND_RAWMIDI=m +CONFIG_SND_SEQUENCER=m +# CONFIG_SND_SEQ_DUMMY is not set +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=m +CONFIG_SND_PCM_OSS=m +CONFIG_SND_SEQUENCER_OSS=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set + +# +# Generic devices +# +CONFIG_SND_MPU401_UART=m +CONFIG_SND_OPL3_LIB=m +CONFIG_SND_VX_LIB=m +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_VIRMIDI is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set + +# +# PCI devices +# +CONFIG_SND_AC97_CODEC=m +# CONFIG_SND_ALI5451 is not set +CONFIG_SND_ATIIXP=m +CONFIG_SND_AU8810=m +CONFIG_SND_AU8820=m +CONFIG_SND_AU8830=m +CONFIG_SND_AZT3328=m +CONFIG_SND_BT87X=m +CONFIG_SND_CS46XX=m +CONFIG_SND_CS46XX_NEW_DSP=y +CONFIG_SND_CS4281=m +CONFIG_SND_EMU10K1=m +CONFIG_SND_KORG1212=m +CONFIG_SND_MIXART=m +CONFIG_SND_NM256=m +CONFIG_SND_RME32=m +CONFIG_SND_RME96=m +CONFIG_SND_RME9652=m +CONFIG_SND_HDSP=m +CONFIG_SND_TRIDENT=m +CONFIG_SND_YMFPCI=m +CONFIG_SND_ALS4000=m +CONFIG_SND_CMIPCI=m +CONFIG_SND_ENS1370=m +CONFIG_SND_ENS1371=m +CONFIG_SND_ES1938=m +CONFIG_SND_ES1968=m +CONFIG_SND_MAESTRO3=m +CONFIG_SND_FM801=m +CONFIG_SND_FM801_TEA575X=m +CONFIG_SND_ICE1712=m +CONFIG_SND_ICE1724=m +# CONFIG_SND_INTEL8X0 is not set +# CONFIG_SND_INTEL8X0M is not set +CONFIG_SND_SONICVIBES=m +CONFIG_SND_VIA82XX=m +CONFIG_SND_VX222=m + +# +# ALSA PowerMac devices +# +CONFIG_SND_POWERMAC=m + +# +# ALSA USB devices +# +CONFIG_SND_USB_AUDIO=m + +# +# PCMCIA devices +# + +# +# Open Sound System +# +# CONFIG_SOUND_PRIME is not set + +# +# USB support +# +CONFIG_USB=m +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +CONFIG_USB_BANDWIDTH=y +CONFIG_USB_DYNAMIC_MINORS=y + +# +# USB Host Controller Drivers +# +CONFIG_USB_EHCI_HCD=m +CONFIG_USB_EHCI_SPLIT_ISO=y +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_OHCI_HCD=m +CONFIG_USB_UHCI_HCD=m + +# +# USB Device Class drivers +# +CONFIG_USB_AUDIO=m + +# +# USB Bluetooth TTY can only be used with disabled Bluetooth subsystem +# +CONFIG_USB_MIDI=m +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_RW_DETECT is not set +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_DPCM=y +CONFIG_USB_STORAGE_HP8200e=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y + +# +# USB Human Interface Devices (HID) +# +CONFIG_USB_HID=m +CONFIG_USB_HIDINPUT=y +CONFIG_HID_FF=y +CONFIG_HID_PID=y +CONFIG_LOGITECH_FF=y +CONFIG_THRUSTMASTER_FF=y +CONFIG_USB_HIDDEV=y + +# +# USB HID Boot Protocol drivers +# +# CONFIG_USB_KBD is not set +# CONFIG_USB_MOUSE is not set +CONFIG_USB_AIPTEK=m +CONFIG_USB_WACOM=m +CONFIG_USB_KBTAB=m +CONFIG_USB_POWERMATE=m +CONFIG_USB_MTOUCH=m +CONFIG_USB_EGALAX=m +CONFIG_USB_XPAD=m +CONFIG_USB_ATI_REMOTE=m + +# +# USB Imaging devices +# +CONFIG_USB_MDC800=m +CONFIG_USB_MICROTEK=m +CONFIG_USB_HPUSBSCSI=m + +# +# USB Multimedia devices +# +CONFIG_USB_VICAM=m +CONFIG_USB_DSBR=m +CONFIG_USB_IBMCAM=m +CONFIG_USB_KONICAWC=m +CONFIG_USB_OV511=m +CONFIG_USB_PWC=m +CONFIG_USB_SE401=m +CONFIG_USB_SN9C102=m +CONFIG_USB_STV680=m +CONFIG_USB_W9968CF=m + +# +# USB Network adaptors +# +CONFIG_USB_CATC=m +CONFIG_USB_KAWETH=m +CONFIG_USB_PEGASUS=m +CONFIG_USB_RTL8150=m +CONFIG_USB_USBNET=m + +# +# USB Host-to-Host Cables +# +CONFIG_USB_ALI_M5632=y +CONFIG_USB_AN2720=y +CONFIG_USB_BELKIN=y +CONFIG_USB_GENESYS=y +CONFIG_USB_NET1080=y +CONFIG_USB_PL2301=y + +# +# Intelligent USB Devices/Gadgets +# +CONFIG_USB_ARMLINUX=y +CONFIG_USB_EPSON2888=y +CONFIG_USB_ZAURUS=y +CONFIG_USB_CDCETHER=y + +# +# USB Network Adapters +# +CONFIG_USB_AX8817X=y + +# +# USB port drivers +# + +# +# USB Serial Converter support +# +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_BELKIN=m +# CONFIG_USB_SERIAL_WHITEHEAT is not set +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m +CONFIG_USB_SERIAL_EMPEG=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_VISOR=m +CONFIG_USB_SERIAL_IPAQ=m +CONFIG_USB_SERIAL_IR=m +CONFIG_USB_SERIAL_EDGEPORT=m +CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_KEYSPAN_PDA=m +CONFIG_USB_SERIAL_KEYSPAN=m +CONFIG_USB_SERIAL_KLSI=m +CONFIG_USB_SERIAL_KOBIL_SCT=m +CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_SAFE=m +CONFIG_USB_SERIAL_SAFE_PADDED=y +CONFIG_USB_SERIAL_CYBERJACK=m +CONFIG_USB_SERIAL_XIRCOM=m +CONFIG_USB_SERIAL_OMNINET=m +CONFIG_USB_EZUSB=y + +# +# USB Miscellaneous drivers +# +CONFIG_USB_TIGL=m +CONFIG_USB_AUERSWALD=m +CONFIG_USB_RIO500=m +CONFIG_USB_LEGOTOWER=m +CONFIG_USB_LCD=m +CONFIG_USB_LED=m +CONFIG_USB_CYTHERM=m +CONFIG_USB_SPEEDTOUCH=m +CONFIG_USB_PHIDGETSERVO=m +CONFIG_USB_TEST=m +CONFIG_USB_EAGLE=m + +# +# USB Gadget Support +# +CONFIG_USB_GADGET=m +CONFIG_USB_GADGET_NET2280=y +CONFIG_USB_NET2280=m +# CONFIG_USB_GADGET_PXA2XX is not set +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_SA1100 is not set +# CONFIG_USB_GADGET_DUMMY_HCD is not set +CONFIG_USB_GADGET_DUALSPEED=y +CONFIG_USB_ZERO=m +CONFIG_USB_ETH=m +CONFIG_USB_ETH_RNDIS=y +CONFIG_USB_GADGETFS=m +CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_FILE_STORAGE_TEST=y +CONFIG_USB_G_SERIAL=m + +# +# File systems +# +CONFIG_EXT2_FS=m +# CONFIG_EXT2_FS_XATTR is not set +CONFIG_EXT3_FS=m +CONFIG_EXT3_FS_XATTR=y +# CONFIG_EXT3_FS_POSIX_ACL is not set +# CONFIG_EXT3_FS_SECURITY is not set +CONFIG_JBD=m +# CONFIG_JBD_DEBUG is not set +CONFIG_FS_MBCACHE=m +CONFIG_REISERFS_FS=m +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +CONFIG_REISERFS_FS_XATTR=y +# CONFIG_REISERFS_FS_POSIX_ACL is not set +# CONFIG_REISERFS_FS_SECURITY is not set +CONFIG_JFS_FS=m +# CONFIG_JFS_POSIX_ACL is not set +# CONFIG_JFS_DEBUG is not set +CONFIG_JFS_STATISTICS=y +CONFIG_XFS_FS=m +# CONFIG_XFS_RT is not set +CONFIG_XFS_QUOTA=y +# CONFIG_XFS_SECURITY is not set +CONFIG_XFS_POSIX_ACL=y +CONFIG_MINIX_FS=m +# CONFIG_ROMFS_FS is not set +# CONFIG_QUOTA is not set +CONFIG_QUOTACTL=y +# CONFIG_AUTOFS_FS is not set +CONFIG_AUTOFS4_FS=m + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=m +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_ZISOFS_FS=m +CONFIG_UDF_FS=m +CONFIG_UDF_NLS=y + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +CONFIG_NTFS_FS=m +# CONFIG_NTFS_DEBUG is not set +# CONFIG_NTFS_RW is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_SYSFS=y +CONFIG_DEVFS_FS=y +# CONFIG_DEVFS_MOUNT is not set +# CONFIG_DEVFS_DEBUG is not set +# CONFIG_DEVPTS_FS_XATTR is not set +CONFIG_TMPFS=y +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y + +# +# Miscellaneous filesystems +# +CONFIG_ADFS_FS=m +# CONFIG_ADFS_FS_RW is not set +CONFIG_AFFS_FS=m +CONFIG_ASFS_FS=m +CONFIG_ASFS_RW=y +CONFIG_HFS_FS=m +CONFIG_HFSPLUS_FS=m +CONFIG_BEFS_FS=m +# CONFIG_BEFS_DEBUG is not set +CONFIG_BFS_FS=m +CONFIG_EFS_FS=m +CONFIG_CRAMFS=y +CONFIG_VXFS_FS=m +CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +# CONFIG_QNX4FS_RW is not set +CONFIG_SYSV_FS=m +CONFIG_UFS_FS=m +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=m +CONFIG_NFS_V3=y +CONFIG_NFS_V4=y +# CONFIG_NFS_DIRECTIO is not set +CONFIG_NFSD=m +CONFIG_NFSD_V3=y +CONFIG_NFSD_V4=y +CONFIG_NFSD_TCP=y +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=m +CONFIG_SUNRPC=m +CONFIG_SUNRPC_GSS=m +CONFIG_RPCSEC_GSS_KRB5=m +CONFIG_SMB_FS=m +CONFIG_SMB_NLS_DEFAULT=y +CONFIG_SMB_NLS_REMOTE="iso8859-1" +CONFIG_CIFS=m +# CONFIG_CIFS_STATS is not set +# CONFIG_CIFS_XATTR is not set +# CONFIG_CIFS_POSIX is not set +CONFIG_NCP_FS=m +# CONFIG_NCPFS_PACKET_SIGNING is not set +# CONFIG_NCPFS_IOCTL_LOCKING is not set +# CONFIG_NCPFS_STRONG is not set +CONFIG_NCPFS_NFS_NS=y +CONFIG_NCPFS_OS2_NS=y +# CONFIG_NCPFS_SMALLDOS is not set +CONFIG_NCPFS_NLS=y +CONFIG_NCPFS_EXTRAS=y +CONFIG_CODA_FS=m +# CONFIG_CODA_FS_OLD_API is not set +CONFIG_AFS_FS=m +CONFIG_RXRPC=m + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +# CONFIG_OSF_PARTITION is not set +CONFIG_AMIGA_PARTITION=y +# CONFIG_ATARI_PARTITION is not set +CONFIG_MAC_PARTITION=y +CONFIG_MSDOS_PARTITION=y +# CONFIG_BSD_DISKLABEL is not set +# CONFIG_MINIX_SUBPARTITION is not set +# CONFIG_SOLARIS_X86_PARTITION is not set +# CONFIG_UNIXWARE_DISKLABEL is not set +# CONFIG_LDM_PARTITION is not set +# CONFIG_SGI_PARTITION is not set +# CONFIG_ULTRIX_PARTITION is not set +# CONFIG_SUN_PARTITION is not set +# CONFIG_EFI_PARTITION is not set + +# +# Native Language Support +# +CONFIG_NLS=m +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=m +CONFIG_NLS_CODEPAGE_737=m +CONFIG_NLS_CODEPAGE_775=m +CONFIG_NLS_CODEPAGE_850=m +CONFIG_NLS_CODEPAGE_852=m +CONFIG_NLS_CODEPAGE_855=m +CONFIG_NLS_CODEPAGE_857=m +CONFIG_NLS_CODEPAGE_860=m +CONFIG_NLS_CODEPAGE_861=m +CONFIG_NLS_CODEPAGE_862=m +CONFIG_NLS_CODEPAGE_863=m +CONFIG_NLS_CODEPAGE_864=m +CONFIG_NLS_CODEPAGE_865=m +CONFIG_NLS_CODEPAGE_866=m +CONFIG_NLS_CODEPAGE_869=m +CONFIG_NLS_CODEPAGE_936=m +CONFIG_NLS_CODEPAGE_950=m +CONFIG_NLS_CODEPAGE_932=m +CONFIG_NLS_CODEPAGE_949=m +CONFIG_NLS_CODEPAGE_874=m +CONFIG_NLS_ISO8859_8=m +CONFIG_NLS_CODEPAGE_1250=m +CONFIG_NLS_CODEPAGE_1251=m +CONFIG_NLS_ASCII=m +CONFIG_NLS_ISO8859_1=m +CONFIG_NLS_ISO8859_2=m +CONFIG_NLS_ISO8859_3=m +CONFIG_NLS_ISO8859_4=m +CONFIG_NLS_ISO8859_5=m +CONFIG_NLS_ISO8859_6=m +CONFIG_NLS_ISO8859_7=m +CONFIG_NLS_ISO8859_9=m +CONFIG_NLS_ISO8859_13=m +CONFIG_NLS_ISO8859_14=m +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_KOI8_R=m +CONFIG_NLS_KOI8_U=m +CONFIG_NLS_UTF8=m + +# +# Library routines +# +CONFIG_CRC_CCITT=m +CONFIG_CRC32=m +CONFIG_LIBCRC32C=m +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=m + +# +# Profiling support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=m + +# +# Kernel hacking +# +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_SLAB is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_HIGHMEM is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_XMON is not set +# CONFIG_BDI_SWITCH is not set +# CONFIG_DEBUG_INFO is not set +CONFIG_BOOTX_TEXT=y + +# +# Security options +# +# CONFIG_SECURITY is not set + +# +# Cryptographic options +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_SHA1=m +CONFIG_CRYPTO_SHA256=m +CONFIG_CRYPTO_SHA512=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_KHAZAD=m +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_MICHAEL_MIC=m +CONFIG_CRYPTO_CRC32C=m +CONFIG_CRYPTO_TEST=m --- linux-source-2.6.8.1-2.6.8.1.orig/debian/config/powerpc/power4-smp +++ linux-source-2.6.8.1-2.6.8.1/debian/config/powerpc/power4-smp @@ -0,0 +1,2070 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_MMU=y +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_HAVE_DEC_LOCK=y +CONFIG_PPC=y +CONFIG_PPC32=y +CONFIG_GENERIC_NVRAM=y + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +CONFIG_CLEAN_COMPILE=y + +# +# General setup +# +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_BSD_PROCESS_ACCT=y +# CONFIG_BSD_PROCESS_ACCT_V3 is not set +CONFIG_SYSCTL=y +CONFIG_AUDIT=y +CONFIG_LOG_BUF_SHIFT=15 +CONFIG_HOTPLUG=y +# CONFIG_IKCONFIG is not set +# CONFIG_EMBEDDED is not set +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_OBSOLETE_MODPARM=y +CONFIG_MODVERSIONS=y +CONFIG_KMOD=y +CONFIG_STOP_MACHINE=y + +# +# Processor +# +# CONFIG_6xx is not set +# CONFIG_40x is not set +# CONFIG_44x is not set +# CONFIG_POWER3 is not set +CONFIG_POWER4=y +# CONFIG_8xx is not set +# CONFIG_E500 is not set +# CONFIG_ALTIVEC is not set +# CONFIG_CPU_FREQ is not set +CONFIG_PM=y +CONFIG_PPC64BRIDGE=y +CONFIG_PPC_STD_MMU=y + +# +# Platform options +# +CONFIG_PPC_MULTIPLATFORM=y +# CONFIG_APUS is not set +# CONFIG_WILLOW is not set +# CONFIG_PCORE is not set +# CONFIG_POWERPMC250 is not set +# CONFIG_EV64260 is not set +# CONFIG_SPRUCE is not set +# CONFIG_LOPEC is not set +# CONFIG_MCPN765 is not set +# CONFIG_MVME5100 is not set +# CONFIG_PPLUS is not set +# CONFIG_PRPMC750 is not set +# CONFIG_PRPMC800 is not set +# CONFIG_SANDPOINT is not set +# CONFIG_ADIR is not set +# CONFIG_K2 is not set +# CONFIG_PAL4 is not set +# CONFIG_GEMINI is not set +# CONFIG_EST8260 is not set +# CONFIG_SBC82xx is not set +# CONFIG_SBS8260 is not set +# CONFIG_RPX8260 is not set +# CONFIG_TQM8260 is not set +# CONFIG_ADS8272 is not set +# CONFIG_LITE5200 is not set +CONFIG_PPC_CHRP=y +CONFIG_PPC_PMAC=y +CONFIG_PPC_PMAC64=y +CONFIG_PPC_PREP=y +CONFIG_PPC_OF=y +CONFIG_PPCBUG_NVRAM=y +CONFIG_SMP=y +# CONFIG_IRQ_ALL_CPUS is not set +CONFIG_NR_CPUS=32 +# CONFIG_PREEMPT is not set +CONFIG_HIGHMEM=y +CONFIG_KERNEL_ELF=y +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_MISC=m +CONFIG_PROC_DEVICETREE=y +CONFIG_PREP_RESIDUAL=y +CONFIG_PROC_PREPRESIDUAL=y +CONFIG_CMDLINE_BOOL=y +CONFIG_CMDLINE="console=ttyS0,9600 console=tty0 root=/dev/sda2" + +# +# Bus options +# +# CONFIG_ISA is not set +CONFIG_GENERIC_ISA_DMA=y +CONFIG_PCI=y +CONFIG_PCI_DOMAINS=y +CONFIG_PCI_LEGACY_PROC=y +CONFIG_PCI_NAMES=y + +# +# PCMCIA/CardBus support +# +CONFIG_PCMCIA=m +# CONFIG_PCMCIA_DEBUG is not set +CONFIG_YENTA=m +CONFIG_CARDBUS=y +CONFIG_PD6729=m +CONFIG_I82092=m +CONFIG_TCIC=m + +# +# Advanced setup +# +# CONFIG_ADVANCED_OPTIONS is not set + +# +# Default settings for advanced configuration options are used +# +CONFIG_HIGHMEM_START=0xfe000000 +CONFIG_LOWMEM_SIZE=0x30000000 +CONFIG_KERNEL_START=0xc0000000 +CONFIG_TASK_SIZE=0x80000000 +CONFIG_BOOT_LOAD=0x00800000 + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=m +# CONFIG_DEBUG_DRIVER is not set + +# +# Memory Technology Devices (MTD) +# +# CONFIG_MTD is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Plug and Play support +# + +# +# Block devices +# +CONFIG_BLK_DEV_FD=m +CONFIG_BLK_CPQ_DA=m +CONFIG_BLK_CPQ_CISS_DA=m +CONFIG_CISS_SCSI_TAPE=y +CONFIG_BLK_DEV_DAC960=m +CONFIG_BLK_DEV_UMEM=m +CONFIG_BLK_DEV_LOOP=m +CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_SX8=m +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_BLK_DEV_INITRD=y +CONFIG_LBD=y + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=y +CONFIG_BLK_DEV_IDE=y + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_IDE_SATA is not set +CONFIG_BLK_DEV_IDEDISK=m +# CONFIG_IDEDISK_MULTI_MODE is not set +CONFIG_BLK_DEV_IDECS=m +CONFIG_BLK_DEV_IDECD=m +CONFIG_BLK_DEV_IDETAPE=m +CONFIG_BLK_DEV_IDEFLOPPY=m +CONFIG_BLK_DEV_IDESCSI=m +# CONFIG_IDE_TASK_IOCTL is not set +# CONFIG_IDE_TASKFILE_IO is not set + +# +# IDE chipset support/bugfixes +# +# CONFIG_IDE_GENERIC is not set +CONFIG_BLK_DEV_IDEPCI=y +CONFIG_IDEPCI_SHARE_IRQ=y +# CONFIG_BLK_DEV_OFFBOARD is not set +CONFIG_BLK_DEV_GENERIC=m +# CONFIG_BLK_DEV_OPTI621 is not set +CONFIG_BLK_DEV_SL82C105=m +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +CONFIG_IDEDMA_PCI_AUTO=y +CONFIG_IDEDMA_ONLYDISK=y +CONFIG_BLK_DEV_ADMA=y +CONFIG_BLK_DEV_AEC62XX=m +# CONFIG_BLK_DEV_ALI15X3 is not set +# CONFIG_BLK_DEV_AMD74XX is not set +CONFIG_BLK_DEV_CMD64X=m +# CONFIG_BLK_DEV_TRIFLEX is not set +# CONFIG_BLK_DEV_CY82C693 is not set +# CONFIG_BLK_DEV_CS5520 is not set +# CONFIG_BLK_DEV_CS5530 is not set +CONFIG_BLK_DEV_HPT34X=m +# CONFIG_HPT34X_AUTODMA is not set +CONFIG_BLK_DEV_HPT366=m +CONFIG_BLK_DEV_SC1200=m +# CONFIG_BLK_DEV_PIIX is not set +CONFIG_BLK_DEV_NS87415=m +CONFIG_BLK_DEV_PDC202XX_OLD=m +# CONFIG_PDC202XX_BURST is not set +CONFIG_BLK_DEV_PDC202XX_NEW=m +CONFIG_PDC202XX_FORCE=y +# CONFIG_BLK_DEV_SVWKS is not set +CONFIG_BLK_DEV_SIIMAGE=m +# CONFIG_BLK_DEV_SLC90E66 is not set +CONFIG_BLK_DEV_TRM290=m +CONFIG_BLK_DEV_VIA82CXXX=m +CONFIG_BLK_DEV_IDE_PMAC=y +CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y +CONFIG_BLK_DEV_IDEDMA_PMAC=y +# CONFIG_BLK_DEV_IDE_PMAC_BLINK is not set +CONFIG_BLK_DEV_IDEDMA_PMAC_AUTO=y +# CONFIG_IDE_ARM is not set +CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_IVB is not set +CONFIG_IDEDMA_AUTO=y +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +CONFIG_SCSI=m +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +CONFIG_CHR_DEV_ST=m +CONFIG_CHR_DEV_OSST=m +CONFIG_BLK_DEV_SR=m +CONFIG_BLK_DEV_SR_VENDOR=y +CONFIG_CHR_DEV_SG=m +CONFIG_CHR_DEV_SCH=m + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y + +# +# SCSI Transport Attributes +# +CONFIG_SCSI_SPI_ATTRS=m +CONFIG_SCSI_FC_ATTRS=m + +# +# SCSI low-level drivers +# +CONFIG_BLK_DEV_3W_XXXX_RAID=m +CONFIG_SCSI_3W_9XXX=m +CONFIG_SCSI_ACARD=m +CONFIG_SCSI_AACRAID=m +CONFIG_SCSI_AIC7XXX=m +CONFIG_AIC7XXX_CMDS_PER_DEVICE=32 +CONFIG_AIC7XXX_RESET_DELAY_MS=15000 +# CONFIG_AIC7XXX_BUILD_FIRMWARE is not set +CONFIG_AIC7XXX_DEBUG_ENABLE=y +CONFIG_AIC7XXX_DEBUG_MASK=0 +CONFIG_AIC7XXX_REG_PRETTY_PRINT=y +CONFIG_SCSI_AIC7XXX_OLD=m +CONFIG_SCSI_AIC79XX=m +CONFIG_AIC79XX_CMDS_PER_DEVICE=32 +CONFIG_AIC79XX_RESET_DELAY_MS=15000 +# CONFIG_AIC79XX_BUILD_FIRMWARE is not set +# CONFIG_AIC79XX_ENABLE_RD_STRM is not set +CONFIG_AIC79XX_DEBUG_ENABLE=y +CONFIG_AIC79XX_DEBUG_MASK=0 +CONFIG_AIC79XX_REG_PRETTY_PRINT=y +CONFIG_SCSI_DPT_I2O=m +CONFIG_SCSI_MEGARAID=m +CONFIG_SCSI_SATA=y +CONFIG_SCSI_SATA_SVW=m +# CONFIG_SCSI_ATA_PIIX is not set +# CONFIG_SCSI_SATA_NV is not set +CONFIG_SCSI_SATA_PROMISE=m +CONFIG_SCSI_SATA_SX4=m +CONFIG_SCSI_SATA_SIL=m +CONFIG_SCSI_SATA_SIS=m +CONFIG_SCSI_SATA_VIA=m +CONFIG_SCSI_SATA_VITESSE=m +CONFIG_SCSI_BUSLOGIC=m +# CONFIG_SCSI_OMIT_FLASHPOINT is not set +CONFIG_SCSI_DMX3191D=m +CONFIG_SCSI_EATA=m +# CONFIG_SCSI_EATA_TAGGED_QUEUE is not set +# CONFIG_SCSI_EATA_LINKED_COMMANDS is not set +CONFIG_SCSI_EATA_MAX_TAGS=16 +CONFIG_SCSI_EATA_PIO=m +CONFIG_SCSI_FUTURE_DOMAIN=m +# CONFIG_SCSI_GDTH is not set +CONFIG_SCSI_IPS=m +CONFIG_SCSI_INIA100=m +CONFIG_SCSI_SYM53C8XX_2=m +CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 +CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 +CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 +# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set +CONFIG_SCSI_IPR=m +# CONFIG_SCSI_IPR_TRACE is not set +# CONFIG_SCSI_IPR_DUMP is not set +CONFIG_SCSI_QLOGIC_ISP=m +CONFIG_SCSI_QLOGIC_FC=m +# CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set +CONFIG_SCSI_QLOGIC_1280=m +CONFIG_SCSI_DC395x=m +CONFIG_SCSI_DC390T=m +CONFIG_SCSI_NSP32=m +# CONFIG_SCSI_DEBUG is not set +CONFIG_SCSI_MESH=m +CONFIG_SCSI_MESH_SYNC_RATE=5 +CONFIG_SCSI_MESH_RESET_DELAY_MS=4000 +CONFIG_SCSI_MAC53C94=m + +# +# PCMCIA SCSI adapter support +# +CONFIG_PCMCIA_AHA152X=m +CONFIG_PCMCIA_FDOMAIN=m +CONFIG_PCMCIA_NINJA_SCSI=m +CONFIG_PCMCIA_QLOGIC=m +CONFIG_PCMCIA_SYM53C500=m + +# +# Multi-device support (RAID and LVM) +# +CONFIG_MD=y +CONFIG_BLK_DEV_MD=m +CONFIG_MD_LINEAR=m +CONFIG_MD_RAID0=m +CONFIG_MD_RAID1=m +CONFIG_MD_RAID5=m +CONFIG_MD_RAID6=m +CONFIG_MD_MULTIPATH=m +CONFIG_BLK_DEV_DM=m +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=m +CONFIG_DM_MIRROR=m +CONFIG_DM_ZERO=m + +# +# Fusion MPT device support +# +CONFIG_FUSION=m +CONFIG_FUSION_MAX_SGE=40 +CONFIG_FUSION_ISENSE=m +CONFIG_FUSION_CTL=m +# CONFIG_FUSION_LAN is not set + +# +# IEEE 1394 (FireWire) support +# +CONFIG_IEEE1394=m + +# +# Subsystem Options +# +# CONFIG_IEEE1394_VERBOSEDEBUG is not set +CONFIG_IEEE1394_OUI_DB=y +CONFIG_IEEE1394_EXTRA_CONFIG_ROMS=y +CONFIG_IEEE1394_CONFIG_ROM_IP1394=y + +# +# Device Drivers +# +CONFIG_IEEE1394_PCILYNX=m +CONFIG_IEEE1394_OHCI1394=m + +# +# Protocol Drivers +# +CONFIG_IEEE1394_VIDEO1394=m +CONFIG_IEEE1394_SBP2=m +CONFIG_IEEE1394_SBP2_PHYS_DMA=y +CONFIG_IEEE1394_ETH1394=m +CONFIG_IEEE1394_DV1394=m +CONFIG_IEEE1394_RAWIO=m +CONFIG_IEEE1394_CMP=m +CONFIG_IEEE1394_AMDTP=m + +# +# I2O device support +# +CONFIG_I2O=m +CONFIG_I2O_CONFIG=m +CONFIG_I2O_BLOCK=m +CONFIG_I2O_SCSI=m +CONFIG_I2O_PROC=m + +# +# Macintosh device drivers +# +CONFIG_ADB=y +CONFIG_ADB_PMU=y +CONFIG_PMAC_PBOOK=y +CONFIG_PMAC_APM_EMU=m +CONFIG_PMAC_BACKLIGHT=y +CONFIG_INPUT_ADBHID=y +CONFIG_MAC_EMUMOUSEBTN=y +CONFIG_THERM_PM72=y + +# +# Networking support +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=m +# CONFIG_PACKET_MMAP is not set +CONFIG_NETLINK_DEV=m +CONFIG_UNIX=m +CONFIG_NET_KEY=m +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_FWMARK=y +CONFIG_IP_ROUTE_NAT=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_TOS=y +CONFIG_IP_ROUTE_VERBOSE=y +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE=m +CONFIG_NET_IPGRE_BROADCAST=y +CONFIG_IP_MROUTE=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +CONFIG_ARPD=y +# CONFIG_SYN_COOKIES is not set +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +CONFIG_INET_IPCOMP=m + +# +# IP: Virtual Server Configuration +# +CONFIG_IP_VS=m +# CONFIG_IP_VS_DEBUG is not set +CONFIG_IP_VS_TAB_BITS=12 + +# +# IPVS transport protocol load balancing support +# +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_PROTO_ESP=y +CONFIG_IP_VS_PROTO_AH=y + +# +# IPVS scheduler +# +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_WRR=m +CONFIG_IP_VS_LC=m +CONFIG_IP_VS_WLC=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m + +# +# IPVS application helper +# +CONFIG_IP_VS_FTP=m +CONFIG_IPV6=m +CONFIG_IPV6_PRIVACY=y +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +CONFIG_INET6_IPCOMP=m +CONFIG_IPV6_TUNNEL=m +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_BRIDGE_NETFILTER=y + +# +# IP: Netfilter Configuration +# +CONFIG_IP_NF_CONNTRACK=m +CONFIG_IP_NF_FTP=m +CONFIG_IP_NF_IRC=m +CONFIG_IP_NF_TFTP=m +CONFIG_IP_NF_AMANDA=m +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_LIMIT=m +# CONFIG_IP_NF_MATCH_IPRANGE is not set +CONFIG_IP_NF_MATCH_MAC=m +CONFIG_IP_NF_MATCH_PKTTYPE=m +CONFIG_IP_NF_MATCH_MARK=m +CONFIG_IP_NF_MATCH_MULTIPORT=m +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_DSCP=m +# CONFIG_IP_NF_MATCH_AH_ESP is not set +CONFIG_IP_NF_MATCH_LENGTH=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_TCPMSS=m +CONFIG_IP_NF_MATCH_HELPER=m +CONFIG_IP_NF_MATCH_STATE=m +CONFIG_IP_NF_MATCH_CONNTRACK=m +CONFIG_IP_NF_MATCH_OWNER=m +# CONFIG_IP_NF_MATCH_PHYSDEV is not set +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_REDIRECT=m +# CONFIG_IP_NF_TARGET_NETMAP is not set +# CONFIG_IP_NF_TARGET_SAME is not set +CONFIG_IP_NF_NAT_LOCAL=y +CONFIG_IP_NF_NAT_SNMP_BASIC=m +CONFIG_IP_NF_NAT_IRC=m +CONFIG_IP_NF_NAT_FTP=m +CONFIG_IP_NF_NAT_TFTP=m +CONFIG_IP_NF_NAT_AMANDA=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_DSCP=m +CONFIG_IP_NF_TARGET_MARK=m +# CONFIG_IP_NF_TARGET_CLASSIFY is not set +CONFIG_IP_NF_TARGET_LOG=m +# CONFIG_IP_NF_TARGET_ULOG is not set +CONFIG_IP_NF_TARGET_TCPMSS=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +# CONFIG_IP_NF_COMPAT_IPCHAINS is not set +# CONFIG_IP_NF_COMPAT_IPFWADM is not set +CONFIG_IP_NF_TARGET_NOTRACK=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_MATCH_ADDRTYPE=m +CONFIG_IP_NF_MATCH_REALM=m + +# +# IPv6: Netfilter Configuration +# +# CONFIG_IP6_NF_QUEUE is not set +# CONFIG_IP6_NF_IPTABLES is not set + +# +# DECnet: Netfilter Configuration +# +# CONFIG_DECNET_NF_GRABULATOR is not set + +# +# Bridge: Netfilter Configuration +# +# CONFIG_BRIDGE_NF_EBTABLES is not set +CONFIG_XFRM=y +CONFIG_XFRM_USER=m + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IP_SCTP=m +# CONFIG_SCTP_DBG_MSG is not set +# CONFIG_SCTP_DBG_OBJCNT is not set +# CONFIG_SCTP_HMAC_NONE is not set +# CONFIG_SCTP_HMAC_SHA1 is not set +CONFIG_SCTP_HMAC_MD5=y +CONFIG_ATM=m +CONFIG_ATM_CLIP=m +CONFIG_ATM_CLIP_NO_ICMP=y +CONFIG_ATM_LANE=m +CONFIG_ATM_MPOA=m +CONFIG_ATM_BR2684=m +# CONFIG_ATM_BR2684_IPFILTER is not set +CONFIG_BRIDGE=m +CONFIG_VLAN_8021Q=m +CONFIG_DECNET=m +CONFIG_DECNET_SIOCGIFCONF=y +CONFIG_DECNET_ROUTER=y +CONFIG_DECNET_ROUTE_FWMARK=y +CONFIG_LLC=y +CONFIG_LLC2=m +CONFIG_IPX=m +CONFIG_IPX_INTERN=y +CONFIG_ATALK=m +CONFIG_DEV_APPLETALK=y +CONFIG_IPDDP=m +CONFIG_IPDDP_ENCAP=y +CONFIG_IPDDP_DECAP=y +CONFIG_X25=m +CONFIG_LAPB=m +CONFIG_NET_DIVERT=y +CONFIG_ECONET=m +CONFIG_ECONET_AUNUDP=y +CONFIG_ECONET_NATIVE=y +CONFIG_WAN_ROUTER=m +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_CLK_JIFFIES=y +# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set +# CONFIG_NET_SCH_CLK_CPU is not set +CONFIG_NET_SCH_CBQ=m +CONFIG_NET_SCH_HTB=m +CONFIG_NET_SCH_HFSC=m +CONFIG_NET_SCH_ATM=m +CONFIG_NET_SCH_PRIO=m +CONFIG_NET_SCH_RED=m +CONFIG_NET_SCH_SFQ=m +CONFIG_NET_SCH_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_NETEM=m +CONFIG_NET_SCH_INGRESS=m +CONFIG_NET_QOS=y +CONFIG_NET_ESTIMATOR=y +CONFIG_NET_CLS=y +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_ROUTE=y +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +# CONFIG_CLS_U32_PERF is not set +# CONFIG_NET_CLS_IND is not set +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +# CONFIG_NET_CLS_ACT is not set +CONFIG_NET_CLS_POLICE=y + +# +# Network testing +# +CONFIG_NET_PKTGEN=m +CONFIG_NETPOLL=y +CONFIG_NETPOLL_RX=y +CONFIG_NETPOLL_TRAP=y +CONFIG_NET_POLL_CONTROLLER=y +CONFIG_HAMRADIO=y + +# +# Packet Radio protocols +# +CONFIG_AX25=m +CONFIG_AX25_DAMA_SLAVE=y +CONFIG_NETROM=m +CONFIG_ROSE=m + +# +# AX.25 network device drivers +# +CONFIG_BPQETHER=m +CONFIG_BAYCOM_SER_FDX=m +CONFIG_BAYCOM_SER_HDX=m +CONFIG_YAM=m +CONFIG_IRDA=m + +# +# IrDA protocols +# +CONFIG_IRLAN=m +CONFIG_IRNET=m +CONFIG_IRCOMM=m +CONFIG_IRDA_ULTRA=y + +# +# IrDA options +# +CONFIG_IRDA_CACHE_LAST_LSAP=y +CONFIG_IRDA_FAST_RR=y +CONFIG_IRDA_DEBUG=y + +# +# Infrared-port device drivers +# + +# +# SIR device drivers +# +CONFIG_IRTTY_SIR=m + +# +# Dongle support +# +# CONFIG_DONGLE is not set + +# +# Old SIR device drivers +# + +# +# Old Serial dongle support +# + +# +# FIR device drivers +# +# CONFIG_USB_IRDA is not set +# CONFIG_SIGMATEL_FIR is not set +# CONFIG_TOSHIBA_FIR is not set +# CONFIG_VLSI_FIR is not set +CONFIG_BT=m +CONFIG_BT_L2CAP=m +CONFIG_BT_SCO=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_CMTP=m +CONFIG_BT_HIDP=m + +# +# Bluetooth device drivers +# +CONFIG_BT_HCIUSB=m +CONFIG_BT_HCIUSB_SCO=y +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_H4=y +CONFIG_BT_HCIUART_BCSP=y +CONFIG_BT_HCIUART_BCSP_TXCRC=y +CONFIG_BT_HCIBCM203X=m +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIDTL1=m +CONFIG_BT_HCIBT3C=m +CONFIG_BT_HCIBLUECARD=m +CONFIG_BT_HCIBTUART=m +CONFIG_BT_HCIVHCI=m +CONFIG_NETDEVICES=y +CONFIG_DUMMY=m +CONFIG_BONDING=m +CONFIG_EQUALIZER=m +CONFIG_TUN=m +CONFIG_ETHERTAP=m + +# +# ARCnet devices +# +CONFIG_ARCNET=m +CONFIG_ARCNET_1201=m +CONFIG_ARCNET_1051=m +CONFIG_ARCNET_RAW=m +CONFIG_ARCNET_COM90xx=m +CONFIG_ARCNET_COM90xxIO=m +CONFIG_ARCNET_RIM_I=m +CONFIG_ARCNET_COM20020=m +CONFIG_ARCNET_COM20020_PCI=m + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=y +CONFIG_MACE=m +# CONFIG_MACE_AAUI_PORT is not set +CONFIG_BMAC=m +CONFIG_HAPPYMEAL=m +CONFIG_SUNGEM=m +CONFIG_NET_VENDOR_3COM=y +CONFIG_VORTEX=m +CONFIG_TYPHOON=m + +# +# Tulip family network device support +# +CONFIG_NET_TULIP=y +CONFIG_DE2104X=m +CONFIG_TULIP=m +# CONFIG_TULIP_MWI is not set +# CONFIG_TULIP_MMIO is not set +# CONFIG_TULIP_NAPI is not set +CONFIG_DE4X5=m +CONFIG_WINBOND_840=m +CONFIG_DM9102=m +CONFIG_PCMCIA_XIRCOM=m +CONFIG_HP100=m +CONFIG_NET_PCI=y +CONFIG_PCNET32=m +# CONFIG_AMD8111_ETH is not set +CONFIG_ADAPTEC_STARFIRE=m +# CONFIG_ADAPTEC_STARFIRE_NAPI is not set +CONFIG_B44=m +# CONFIG_FORCEDETH is not set +CONFIG_EEPRO100=m +# CONFIG_EEPRO100_PIO is not set +CONFIG_E100=m +# CONFIG_E100_NAPI is not set +CONFIG_FEALNX=m +CONFIG_NATSEMI=m +CONFIG_NE2K_PCI=m +CONFIG_8139CP=m +CONFIG_8139TOO=m +CONFIG_8139TOO_PIO=y +# CONFIG_8139TOO_TUNE_TWISTER is not set +CONFIG_8139TOO_8129=y +# CONFIG_8139_OLD_RX_RESET is not set +CONFIG_SIS900=m +CONFIG_EPIC100=m +CONFIG_SUNDANCE=m +CONFIG_SUNDANCE_MMIO=y +CONFIG_TLAN=m +CONFIG_VIA_RHINE=m +CONFIG_VIA_RHINE_MMIO=y +CONFIG_VIA_VELOCITY=m + +# +# Ethernet (1000 Mbit) +# +CONFIG_DL2K=m +CONFIG_E1000=m +# CONFIG_E1000_NAPI is not set +CONFIG_NS83820=m +CONFIG_HAMACHI=m +CONFIG_YELLOWFIN=m +CONFIG_R8169=m +CONFIG_SK98LIN=m +CONFIG_TIGON3=m +CONFIG_MV64340_ETH=m +# CONFIG_MV64340_ETH_0 is not set +CONFIG_MV64340_ETH_1=y +# CONFIG_MV64340_ETH_2 is not set + +# +# Ethernet (10000 Mbit) +# +CONFIG_IXGB=m +# CONFIG_IXGB_NAPI is not set +CONFIG_S2IO=m +# CONFIG_S2IO_NAPI is not set + +# +# Token Ring devices +# +CONFIG_TR=y +CONFIG_IBMOL=m +CONFIG_IBMLS=m +CONFIG_3C359=m +CONFIG_TMS380TR=m +CONFIG_TMSPCI=m +CONFIG_ABYSS=m + +# +# Wireless LAN (non-hamradio) +# +CONFIG_NET_RADIO=y + +# +# Obsolete Wireless cards support (pre-802.11) +# +CONFIG_STRIP=m +CONFIG_PCMCIA_WAVELAN=m +CONFIG_PCMCIA_NETWAVE=m + +# +# Wireless 802.11 Frequency Hopping cards support +# +CONFIG_PCMCIA_RAYCS=m + +# +# Wireless 802.11b ISA/PCI cards support +# +CONFIG_IEEE80211=m +# CONFIG_IEEE80211_DEBUG is not set +CONFIG_IEEE80211_CRYPT=m +CONFIG_IEEE80211_WPA=y +CONFIG_IEEE80211_CRYPT_CCMP=m +CONFIG_IEEE80211_CRYPT_TKIP=m +CONFIG_IPW2100=m +# CONFIG_IPW2100_PROMISC is not set +# CONFIG_IPW2100_LEGACY_FW_LOAD is not set +# CONFIG_IPW2100_NOWEP is not set +# CONFIG_IPW2100_DEBUG is not set +CONFIG_IPW2200=m +# CONFIG_IPW2200_NOWEP is not set +CONFIG_WLAN_NG=m +CONFIG_PRISM2=m +CONFIG_PRISM2_USB=m +CONFIG_ACX100=m +CONFIG_ADM8211=m +CONFIG_HERMES=m +CONFIG_APPLE_AIRPORT=m +CONFIG_PLX_HERMES=m +CONFIG_TMD_HERMES=m +CONFIG_PCI_HERMES=m +CONFIG_ATMEL=m +# CONFIG_PCI_ATMEL is not set + +# +# Wireless 802.11b Pcmcia/Cardbus cards support +# +CONFIG_PCMCIA_HERMES=m +CONFIG_AIRO_CS=m +CONFIG_PCMCIA_ATMEL=m +CONFIG_PCMCIA_WL3501=m + +# +# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support +# +CONFIG_PRISM54=m +CONFIG_NET_WIRELESS=y + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +CONFIG_PCMCIA_3C589=m +CONFIG_PCMCIA_3C574=m +CONFIG_PCMCIA_FMVJ18X=m +CONFIG_PCMCIA_PCNET=m +CONFIG_PCMCIA_NMCLAN=m +CONFIG_PCMCIA_SMC91C92=m +CONFIG_PCMCIA_XIRC2PS=m +CONFIG_PCMCIA_AXNET=m +CONFIG_ARCNET_COM20020_CS=m +CONFIG_PCMCIA_IBMTR=m + +# +# Wan interfaces +# +CONFIG_WAN=y +CONFIG_DSCC4=m +# CONFIG_DSCC4_PCISYNC is not set +# CONFIG_DSCC4_PCI_RST is not set +CONFIG_LANMEDIA=m +CONFIG_SYNCLINK_SYNCPPP=m +CONFIG_HDLC=m +CONFIG_HDLC_RAW=y +CONFIG_HDLC_RAW_ETH=y +CONFIG_HDLC_CISCO=y +CONFIG_HDLC_FR=y +CONFIG_HDLC_PPP=y +CONFIG_HDLC_X25=y +CONFIG_PCI200SYN=m +CONFIG_WANXL=m +CONFIG_PC300=m +CONFIG_PC300_MLPPP=y +CONFIG_FARSYNC=m +CONFIG_DLCI=m +CONFIG_DLCI_COUNT=24 +CONFIG_DLCI_MAX=8 +CONFIG_WAN_ROUTER_DRIVERS=y +CONFIG_CYCLADES_SYNC=m +CONFIG_CYCLOMX_X25=y +CONFIG_LAPBETHER=m +CONFIG_X25_ASY=m + +# +# ATM drivers +# +CONFIG_ATM_TCP=m +CONFIG_ATM_LANAI=m +CONFIG_ATM_ENI=m +# CONFIG_ATM_ENI_DEBUG is not set +# CONFIG_ATM_ENI_TUNE_BURST is not set +CONFIG_ATM_FIRESTREAM=m +CONFIG_ATM_ZATM=m +CONFIG_ATM_ZATM_DEBUG=y +CONFIG_ATM_NICSTAR=m +CONFIG_ATM_NICSTAR_USE_SUNI=y +CONFIG_ATM_NICSTAR_USE_IDT77105=y +CONFIG_ATM_IDT77252=m +# CONFIG_ATM_IDT77252_DEBUG is not set +# CONFIG_ATM_IDT77252_RCV_ALL is not set +CONFIG_ATM_IDT77252_USE_SUNI=y +CONFIG_ATM_AMBASSADOR=m +# CONFIG_ATM_AMBASSADOR_DEBUG is not set +CONFIG_ATM_HORIZON=m +# CONFIG_ATM_HORIZON_DEBUG is not set +CONFIG_ATM_IA=m +# CONFIG_ATM_IA_DEBUG is not set +CONFIG_ATM_FORE200E_MAYBE=m +CONFIG_ATM_FORE200E_PCA=y +CONFIG_ATM_FORE200E_PCA_DEFAULT_FW=y +CONFIG_ATM_FORE200E_USE_TASKLET=y +CONFIG_ATM_FORE200E_TX_RETRY=16 +CONFIG_ATM_FORE200E_DEBUG=0 +CONFIG_ATM_FORE200E=m +CONFIG_ATM_HE=m +# CONFIG_ATM_HE_USE_SUNI is not set +CONFIG_FDDI=y +CONFIG_DEFXX=m +CONFIG_SKFP=m +CONFIG_HIPPI=y +# CONFIG_ROADRUNNER is not set +CONFIG_PPP=m +CONFIG_PPP_MULTILINK=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_MPPE=m +CONFIG_PPPOE=m +CONFIG_PPPOATM=m +CONFIG_SLIP=m +# CONFIG_SLIP_COMPRESSED is not set +# CONFIG_SLIP_SMART is not set +# CONFIG_SLIP_MODE_SLIP6 is not set +CONFIG_NET_FC=y +CONFIG_SHAPER=m +CONFIG_NETCONSOLE=m +# CONFIG_NDISWRAPPER is not set + +# +# ISDN subsystem +# +CONFIG_ISDN=m + +# +# Old ISDN4Linux +# +# CONFIG_ISDN_I4L is not set + +# +# CAPI subsystem +# +CONFIG_ISDN_CAPI=m +# CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON is not set +CONFIG_ISDN_CAPI_MIDDLEWARE=y +CONFIG_ISDN_CAPI_CAPI20=m +# CONFIG_ISDN_CAPI_CAPIFS_BOOL is not set + +# +# CAPI hardware drivers +# + +# +# Active AVM cards +# +CONFIG_CAPI_AVM=y + +# +# Active Eicon DIVA Server cards +# +CONFIG_CAPI_EICON=y +CONFIG_ISDN_DIVAS=m +CONFIG_ISDN_DIVAS_BRIPCI=y +CONFIG_ISDN_DIVAS_PRIPCI=y +CONFIG_ISDN_DIVAS_DIVACAPI=m +CONFIG_ISDN_DIVAS_USERIDI=m +CONFIG_ISDN_DIVAS_MAINT=m + +# +# Modular ISDN driver +# +# CONFIG_MISDN_DRV is not set + +# +# Telephony Support +# +CONFIG_PHONE=m +CONFIG_PHONE_IXJ=m +CONFIG_PHONE_IXJ_PCMCIA=m + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_MOUSEDEV_PSAUX_ENABLE=y +CONFIG_INPUT_JOYDEV=m +CONFIG_INPUT_TSDEV=m +CONFIG_INPUT_TSDEV_SCREEN_X=240 +CONFIG_INPUT_TSDEV_SCREEN_Y=320 +CONFIG_INPUT_EVDEV=m +CONFIG_INPUT_EVBUG=m + +# +# Input I/O drivers +# +CONFIG_GAMEPORT=m +CONFIG_SOUND_GAMEPORT=m +CONFIG_GAMEPORT_NS558=m +CONFIG_GAMEPORT_L4=m +CONFIG_GAMEPORT_EMU10K1=m +CONFIG_GAMEPORT_VORTEX=m +CONFIG_GAMEPORT_FM801=m +CONFIG_GAMEPORT_CS461x=m +CONFIG_SERIO=m +CONFIG_SERIO_I8042=m +CONFIG_SERIO_SERPORT=m +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PCIPS2 is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=m +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=m +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_VSXXXAA is not set +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_ANALOG=m +CONFIG_JOYSTICK_A3D=m +CONFIG_JOYSTICK_ADI=m +CONFIG_JOYSTICK_COBRA=m +CONFIG_JOYSTICK_GF2K=m +CONFIG_JOYSTICK_GRIP=m +CONFIG_JOYSTICK_GRIP_MP=m +CONFIG_JOYSTICK_GUILLEMOT=m +CONFIG_JOYSTICK_INTERACT=m +CONFIG_JOYSTICK_SIDEWINDER=m +CONFIG_JOYSTICK_TMDC=m +CONFIG_JOYSTICK_IFORCE=m +CONFIG_JOYSTICK_IFORCE_USB=y +CONFIG_JOYSTICK_IFORCE_232=y +CONFIG_JOYSTICK_WARRIOR=m +CONFIG_JOYSTICK_MAGELLAN=m +CONFIG_JOYSTICK_SPACEORB=m +CONFIG_JOYSTICK_SPACEBALL=m +CONFIG_JOYSTICK_STINGER=m +CONFIG_JOYSTICK_TWIDDLER=m +CONFIG_INPUT_JOYDUMP=m +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_GUNZE=m +CONFIG_INPUT_MISC=y +CONFIG_INPUT_UINPUT=m + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +# CONFIG_SERIAL_8250_CS is not set +CONFIG_SERIAL_8250_NR_UARTS=4 +# CONFIG_SERIAL_8250_EXTENDED is not set + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_SERIAL_PMACZILOG=y +CONFIG_SERIAL_PMACZILOG_CONSOLE=y +CONFIG_UNIX98_PTYS=y +# CONFIG_LEGACY_PTYS is not set +CONFIG_QIC02_TAPE=m +CONFIG_QIC02_DYNCONF=y + +# +# Setting runtime QIC-02 configuration is done with qic02conf +# + +# +# from the tpqic02-support package. It is available at +# + +# +# metalab.unc.edu or ftp://titus.cfw.com/pub/Linux/util/ +# + +# +# IPMI +# +CONFIG_IPMI_HANDLER=m +# CONFIG_IPMI_PANIC_EVENT is not set +CONFIG_IPMI_DEVICE_INTERFACE=m +CONFIG_IPMI_SI=m +CONFIG_IPMI_WATCHDOG=m + +# +# Watchdog Cards +# +CONFIG_WATCHDOG=y +# CONFIG_WATCHDOG_NOWAYOUT is not set + +# +# Watchdog Device Drivers +# +CONFIG_SOFT_WATCHDOG=m + +# +# PCI-based Watchdog Cards +# +CONFIG_PCIPCWATCHDOG=m +CONFIG_WDTPCI=m +CONFIG_WDT_501_PCI=y + +# +# USB-based Watchdog Cards +# +CONFIG_USBPCWATCHDOG=m +CONFIG_NVRAM=y +CONFIG_GEN_RTC=y +CONFIG_GEN_RTC_X=y +CONFIG_DTLK=m +CONFIG_R3964=m +CONFIG_APPLICOM=m + +# +# Ftape, the floppy tape device driver +# +CONFIG_AGP=m +CONFIG_AGP_UNINORTH=m +CONFIG_DRM=y +CONFIG_DRM_TDFX=m +# CONFIG_DRM_GAMMA is not set +CONFIG_DRM_R128=m +CONFIG_DRM_RADEON=m +CONFIG_DRM_MGA=m +CONFIG_DRM_SIS=m + +# +# PCMCIA character devices +# +CONFIG_SYNCLINK_CS=m +# CONFIG_RAW_DRIVER is not set + +# +# I2C support +# +CONFIG_I2C=y +CONFIG_I2C_CHARDEV=m + +# +# I2C Algorithms +# +CONFIG_I2C_ALGOBIT=y +CONFIG_I2C_ALGOPCF=m + +# +# I2C Hardware Bus support +# +# CONFIG_I2C_ALI1535 is not set +# CONFIG_I2C_ALI1563 is not set +# CONFIG_I2C_ALI15X3 is not set +# CONFIG_I2C_AMD756 is not set +# CONFIG_I2C_AMD8111 is not set +CONFIG_I2C_HYDRA=m +# CONFIG_I2C_I801 is not set +# CONFIG_I2C_I810 is not set +CONFIG_I2C_ISA=m +CONFIG_I2C_KEYWEST=y +# CONFIG_I2C_NFORCE2 is not set +CONFIG_I2C_PARPORT_LIGHT=m +# CONFIG_I2C_PIIX4 is not set +CONFIG_I2C_PROSAVAGE=m +CONFIG_I2C_SAVAGE4=m +CONFIG_SCx200_ACB=m +CONFIG_I2C_SIS5595=m +CONFIG_I2C_SIS630=m +CONFIG_I2C_SIS96X=m +CONFIG_I2C_VIA=m +CONFIG_I2C_VIAPRO=m +CONFIG_I2C_VOODOO3=m + +# +# Hardware Sensors Chip support +# +CONFIG_I2C_SENSOR=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM1025=m +CONFIG_SENSORS_ADM1031=m +CONFIG_SENSORS_ASB100=m +CONFIG_SENSORS_DS1621=m +CONFIG_SENSORS_FSCHER=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_IT87=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM77=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_LM83=m +CONFIG_SENSORS_LM85=m +CONFIG_SENSORS_LM90=m +CONFIG_SENSORS_MAX1619=m +CONFIG_SENSORS_VIA686A=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_W83L785TS=m +CONFIG_SENSORS_W83627HF=m + +# +# Other I2C Chip support +# +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_PCF8574=m +CONFIG_SENSORS_PCF8591=m +CONFIG_SENSORS_RTC8564=m +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set + +# +# Dallas's 1-wire bus +# +CONFIG_W1=m +CONFIG_W1_MATROX=m +CONFIG_W1_THERM=m + +# +# Misc devices +# + +# +# Multimedia devices +# +CONFIG_VIDEO_DEV=m + +# +# Video For Linux +# + +# +# Video Adapters +# +CONFIG_VIDEO_BT848=m +CONFIG_VIDEO_CPIA=m +CONFIG_VIDEO_CPIA_USB=m +CONFIG_VIDEO_SAA5246A=m +CONFIG_VIDEO_SAA5249=m +CONFIG_TUNER_3036=m +CONFIG_VIDEO_STRADIS=m +CONFIG_VIDEO_ZORAN=m +CONFIG_VIDEO_ZORAN_BUZ=m +CONFIG_VIDEO_ZORAN_DC10=m +CONFIG_VIDEO_ZORAN_DC30=m +CONFIG_VIDEO_ZORAN_LML33=m +CONFIG_VIDEO_ZORAN_LML33R10=m +CONFIG_VIDEO_SAA7134=m +CONFIG_VIDEO_MXB=m +CONFIG_VIDEO_DPC=m +CONFIG_VIDEO_HEXIUM_ORION=m +CONFIG_VIDEO_HEXIUM_GEMINI=m +CONFIG_VIDEO_CX88=m +CONFIG_VIDEO_OVCAMCHIP=m + +# +# Radio Adapters +# +CONFIG_RADIO_GEMTEK_PCI=m +CONFIG_RADIO_MAXIRADIO=m +CONFIG_RADIO_MAESTRO=m + +# +# Digital Video Broadcasting Devices +# +CONFIG_DVB=y +CONFIG_DVB_CORE=m + +# +# Supported Frontend Modules +# +CONFIG_DVB_TWINHAN_DST=m +CONFIG_DVB_STV0299=m +CONFIG_DVB_SP887X=m +CONFIG_DVB_SP887X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/sc_main.mc" +CONFIG_DVB_ALPS_TDLB7=m +CONFIG_DVB_ALPS_TDMB7=m +CONFIG_DVB_ATMEL_AT76C651=m +CONFIG_DVB_CX24110=m +CONFIG_DVB_GRUNDIG_29504_491=m +CONFIG_DVB_GRUNDIG_29504_401=m +CONFIG_DVB_MT312=m +CONFIG_DVB_VES1820=m +CONFIG_DVB_VES1X93=m +CONFIG_DVB_TDA1004X=m +CONFIG_DVB_TDA1004X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/tda1004x.bin" +CONFIG_DVB_NXT6000=m + +# +# Supported SAA7146 based PCI Adapters +# +CONFIG_DVB_AV7110=m +CONFIG_DVB_AV7110_OSD=y +CONFIG_DVB_BUDGET=m +CONFIG_DVB_BUDGET_CI=m +CONFIG_DVB_BUDGET_AV=m +CONFIG_DVB_BUDGET_PATCH=m + +# +# Supported USB Adapters +# +CONFIG_DVB_TTUSB_BUDGET=m +CONFIG_DVB_TTUSB_DEC=m + +# +# Supported FlexCopII (B2C2) Adapters +# +CONFIG_DVB_B2C2_SKYSTAR=m + +# +# Supported BT878 Adapters +# +CONFIG_DVB_BT8XX=m +CONFIG_VIDEO_SAA7146=m +CONFIG_VIDEO_SAA7146_VV=m +CONFIG_VIDEO_VIDEOBUF=m +CONFIG_VIDEO_TUNER=m +CONFIG_VIDEO_BUF=m +CONFIG_VIDEO_BTCX=m +CONFIG_VIDEO_IR=m + +# +# Graphics support +# +CONFIG_FB=y +CONFIG_FB_CIRRUS=m +# CONFIG_FB_PM2 is not set +# CONFIG_FB_CYBER2000 is not set +CONFIG_FB_OF=y +CONFIG_FB_CONTROL=y +CONFIG_FB_PLATINUM=y +CONFIG_FB_VALKYRIE=y +CONFIG_FB_CT65550=y +# CONFIG_FB_ASILIANT is not set +CONFIG_FB_IMSTT=y +# CONFIG_FB_VGA16 is not set +CONFIG_FB_RIVA=m +CONFIG_FB_RIVA_I2C=y +# CONFIG_FB_RIVA_DEBUG is not set +CONFIG_FB_MATROX=y +CONFIG_FB_MATROX_MILLENIUM=y +CONFIG_FB_MATROX_MYSTIQUE=y +CONFIG_FB_MATROX_G450=y +CONFIG_FB_MATROX_G100=y +CONFIG_FB_MATROX_I2C=m +CONFIG_FB_MATROX_MAVEN=m +CONFIG_FB_MATROX_MULTIHEAD=y +# CONFIG_FB_RADEON_OLD is not set +CONFIG_FB_RADEON=y +CONFIG_FB_RADEON_I2C=y +# CONFIG_FB_RADEON_DEBUG is not set +CONFIG_FB_ATY128=y +CONFIG_FB_ATY=y +CONFIG_FB_ATY_CT=y +CONFIG_FB_ATY_GX=y +# CONFIG_FB_ATY_XL_INIT is not set +CONFIG_FB_SIS=m +CONFIG_FB_SIS_300=y +CONFIG_FB_SIS_315=y +CONFIG_FB_NEOMAGIC=m +CONFIG_FB_KYRO=m +CONFIG_FB_3DFX=y +# CONFIG_FB_3DFX_ACCEL is not set +CONFIG_FB_VOODOO1=y +CONFIG_FB_TRIDENT=m +CONFIG_FB_TRIDENT_ACCEL=y +# CONFIG_FB_VIRTUAL is not set + +# +# Console display driver support +# +# CONFIG_VGA_CONSOLE is not set +# CONFIG_MDA_CONSOLE is not set +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y + +# +# Logo configuration +# +CONFIG_LOGO=y +# CONFIG_LOGO_LINUX_MONO is not set +CONFIG_LOGO_LINUX_VGA16=y +# CONFIG_LOGO_LINUX_CLUT224 is not set + +# +# Sound +# +CONFIG_SOUND=m +CONFIG_DMASOUND_PMAC=m +CONFIG_DMASOUND=m + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +CONFIG_SND_HWDEP=m +CONFIG_SND_RAWMIDI=m +CONFIG_SND_SEQUENCER=m +# CONFIG_SND_SEQ_DUMMY is not set +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=m +CONFIG_SND_PCM_OSS=m +CONFIG_SND_SEQUENCER_OSS=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set + +# +# Generic devices +# +CONFIG_SND_MPU401_UART=m +CONFIG_SND_OPL3_LIB=m +CONFIG_SND_VX_LIB=m +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_VIRMIDI is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set + +# +# PCI devices +# +CONFIG_SND_AC97_CODEC=m +# CONFIG_SND_ALI5451 is not set +CONFIG_SND_ATIIXP=m +CONFIG_SND_AU8810=m +CONFIG_SND_AU8820=m +CONFIG_SND_AU8830=m +CONFIG_SND_AZT3328=m +CONFIG_SND_BT87X=m +CONFIG_SND_CS46XX=m +CONFIG_SND_CS46XX_NEW_DSP=y +CONFIG_SND_CS4281=m +CONFIG_SND_EMU10K1=m +CONFIG_SND_KORG1212=m +CONFIG_SND_MIXART=m +CONFIG_SND_NM256=m +CONFIG_SND_RME32=m +CONFIG_SND_RME96=m +CONFIG_SND_RME9652=m +CONFIG_SND_HDSP=m +CONFIG_SND_TRIDENT=m +CONFIG_SND_YMFPCI=m +CONFIG_SND_ALS4000=m +CONFIG_SND_CMIPCI=m +CONFIG_SND_ENS1370=m +CONFIG_SND_ENS1371=m +CONFIG_SND_ES1938=m +CONFIG_SND_ES1968=m +CONFIG_SND_MAESTRO3=m +CONFIG_SND_FM801=m +CONFIG_SND_FM801_TEA575X=m +CONFIG_SND_ICE1712=m +CONFIG_SND_ICE1724=m +# CONFIG_SND_INTEL8X0 is not set +# CONFIG_SND_INTEL8X0M is not set +CONFIG_SND_SONICVIBES=m +CONFIG_SND_VIA82XX=m +CONFIG_SND_VX222=m + +# +# ALSA PowerMac devices +# +CONFIG_SND_POWERMAC=m + +# +# ALSA USB devices +# +CONFIG_SND_USB_AUDIO=m + +# +# PCMCIA devices +# + +# +# Open Sound System +# +# CONFIG_SOUND_PRIME is not set + +# +# USB support +# +CONFIG_USB=m +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +CONFIG_USB_BANDWIDTH=y +CONFIG_USB_DYNAMIC_MINORS=y + +# +# USB Host Controller Drivers +# +CONFIG_USB_EHCI_HCD=m +CONFIG_USB_EHCI_SPLIT_ISO=y +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_OHCI_HCD=m +CONFIG_USB_UHCI_HCD=m + +# +# USB Device Class drivers +# +CONFIG_USB_AUDIO=m + +# +# USB Bluetooth TTY can only be used with disabled Bluetooth subsystem +# +CONFIG_USB_MIDI=m +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_RW_DETECT is not set +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_DPCM=y +CONFIG_USB_STORAGE_HP8200e=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y + +# +# USB Human Interface Devices (HID) +# +CONFIG_USB_HID=m +CONFIG_USB_HIDINPUT=y +CONFIG_HID_FF=y +CONFIG_HID_PID=y +CONFIG_LOGITECH_FF=y +CONFIG_THRUSTMASTER_FF=y +CONFIG_USB_HIDDEV=y + +# +# USB HID Boot Protocol drivers +# +# CONFIG_USB_KBD is not set +# CONFIG_USB_MOUSE is not set +CONFIG_USB_AIPTEK=m +CONFIG_USB_WACOM=m +CONFIG_USB_KBTAB=m +CONFIG_USB_POWERMATE=m +CONFIG_USB_MTOUCH=m +CONFIG_USB_EGALAX=m +CONFIG_USB_XPAD=m +CONFIG_USB_ATI_REMOTE=m + +# +# USB Imaging devices +# +CONFIG_USB_MDC800=m +CONFIG_USB_MICROTEK=m +CONFIG_USB_HPUSBSCSI=m + +# +# USB Multimedia devices +# +CONFIG_USB_VICAM=m +CONFIG_USB_DSBR=m +CONFIG_USB_IBMCAM=m +CONFIG_USB_KONICAWC=m +CONFIG_USB_OV511=m +CONFIG_USB_PWC=m +CONFIG_USB_SE401=m +CONFIG_USB_SN9C102=m +CONFIG_USB_STV680=m +CONFIG_USB_W9968CF=m + +# +# USB Network adaptors +# +CONFIG_USB_CATC=m +CONFIG_USB_KAWETH=m +CONFIG_USB_PEGASUS=m +CONFIG_USB_RTL8150=m +CONFIG_USB_USBNET=m + +# +# USB Host-to-Host Cables +# +CONFIG_USB_ALI_M5632=y +CONFIG_USB_AN2720=y +CONFIG_USB_BELKIN=y +CONFIG_USB_GENESYS=y +CONFIG_USB_NET1080=y +CONFIG_USB_PL2301=y + +# +# Intelligent USB Devices/Gadgets +# +CONFIG_USB_ARMLINUX=y +CONFIG_USB_EPSON2888=y +CONFIG_USB_ZAURUS=y +CONFIG_USB_CDCETHER=y + +# +# USB Network Adapters +# +CONFIG_USB_AX8817X=y + +# +# USB port drivers +# + +# +# USB Serial Converter support +# +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_BELKIN=m +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m +CONFIG_USB_SERIAL_EMPEG=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_VISOR=m +CONFIG_USB_SERIAL_IPAQ=m +CONFIG_USB_SERIAL_IR=m +CONFIG_USB_SERIAL_EDGEPORT=m +CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_KEYSPAN_PDA=m +CONFIG_USB_SERIAL_KEYSPAN=m +CONFIG_USB_SERIAL_KLSI=m +CONFIG_USB_SERIAL_KOBIL_SCT=m +CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_SAFE=m +CONFIG_USB_SERIAL_SAFE_PADDED=y +CONFIG_USB_SERIAL_CYBERJACK=m +CONFIG_USB_SERIAL_XIRCOM=m +CONFIG_USB_SERIAL_OMNINET=m +CONFIG_USB_EZUSB=y + +# +# USB Miscellaneous drivers +# +CONFIG_USB_TIGL=m +CONFIG_USB_AUERSWALD=m +CONFIG_USB_RIO500=m +CONFIG_USB_LEGOTOWER=m +CONFIG_USB_LCD=m +CONFIG_USB_LED=m +CONFIG_USB_CYTHERM=m +CONFIG_USB_SPEEDTOUCH=m +CONFIG_USB_PHIDGETSERVO=m +CONFIG_USB_TEST=m +CONFIG_USB_EAGLE=m + +# +# USB Gadget Support +# +CONFIG_USB_GADGET=m +CONFIG_USB_GADGET_NET2280=y +CONFIG_USB_NET2280=m +# CONFIG_USB_GADGET_PXA2XX is not set +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_SA1100 is not set +# CONFIG_USB_GADGET_DUMMY_HCD is not set +CONFIG_USB_GADGET_DUALSPEED=y +CONFIG_USB_ZERO=m +CONFIG_USB_ETH=m +CONFIG_USB_ETH_RNDIS=y +CONFIG_USB_GADGETFS=m +CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_FILE_STORAGE_TEST=y +CONFIG_USB_G_SERIAL=m + +# +# File systems +# +CONFIG_EXT2_FS=m +# CONFIG_EXT2_FS_XATTR is not set +CONFIG_EXT3_FS=m +CONFIG_EXT3_FS_XATTR=y +# CONFIG_EXT3_FS_POSIX_ACL is not set +# CONFIG_EXT3_FS_SECURITY is not set +CONFIG_JBD=m +# CONFIG_JBD_DEBUG is not set +CONFIG_FS_MBCACHE=m +CONFIG_REISERFS_FS=m +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +CONFIG_REISERFS_FS_XATTR=y +# CONFIG_REISERFS_FS_POSIX_ACL is not set +# CONFIG_REISERFS_FS_SECURITY is not set +CONFIG_JFS_FS=m +# CONFIG_JFS_POSIX_ACL is not set +# CONFIG_JFS_DEBUG is not set +CONFIG_JFS_STATISTICS=y +CONFIG_XFS_FS=m +# CONFIG_XFS_RT is not set +CONFIG_XFS_QUOTA=y +# CONFIG_XFS_SECURITY is not set +CONFIG_XFS_POSIX_ACL=y +CONFIG_MINIX_FS=m +# CONFIG_ROMFS_FS is not set +# CONFIG_QUOTA is not set +CONFIG_QUOTACTL=y +# CONFIG_AUTOFS_FS is not set +CONFIG_AUTOFS4_FS=m + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=m +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_ZISOFS_FS=m +CONFIG_UDF_FS=m +CONFIG_UDF_NLS=y + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +CONFIG_NTFS_FS=m +# CONFIG_NTFS_DEBUG is not set +# CONFIG_NTFS_RW is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_SYSFS=y +CONFIG_DEVFS_FS=y +# CONFIG_DEVFS_MOUNT is not set +# CONFIG_DEVFS_DEBUG is not set +# CONFIG_DEVPTS_FS_XATTR is not set +CONFIG_TMPFS=y +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y + +# +# Miscellaneous filesystems +# +CONFIG_ADFS_FS=m +# CONFIG_ADFS_FS_RW is not set +CONFIG_AFFS_FS=m +CONFIG_ASFS_FS=m +CONFIG_ASFS_RW=y +CONFIG_HFS_FS=m +CONFIG_HFSPLUS_FS=m +CONFIG_BEFS_FS=m +# CONFIG_BEFS_DEBUG is not set +CONFIG_BFS_FS=m +CONFIG_EFS_FS=m +CONFIG_CRAMFS=y +CONFIG_VXFS_FS=m +CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +# CONFIG_QNX4FS_RW is not set +CONFIG_SYSV_FS=m +CONFIG_UFS_FS=m +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=m +CONFIG_NFS_V3=y +CONFIG_NFS_V4=y +# CONFIG_NFS_DIRECTIO is not set +CONFIG_NFSD=m +CONFIG_NFSD_V3=y +CONFIG_NFSD_V4=y +CONFIG_NFSD_TCP=y +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=m +CONFIG_SUNRPC=m +CONFIG_SUNRPC_GSS=m +CONFIG_RPCSEC_GSS_KRB5=m +CONFIG_SMB_FS=m +CONFIG_SMB_NLS_DEFAULT=y +CONFIG_SMB_NLS_REMOTE="iso8859-1" +CONFIG_CIFS=m +# CONFIG_CIFS_STATS is not set +# CONFIG_CIFS_XATTR is not set +# CONFIG_CIFS_POSIX is not set +CONFIG_NCP_FS=m +# CONFIG_NCPFS_PACKET_SIGNING is not set +# CONFIG_NCPFS_IOCTL_LOCKING is not set +# CONFIG_NCPFS_STRONG is not set +CONFIG_NCPFS_NFS_NS=y +CONFIG_NCPFS_OS2_NS=y +# CONFIG_NCPFS_SMALLDOS is not set +CONFIG_NCPFS_NLS=y +CONFIG_NCPFS_EXTRAS=y +CONFIG_CODA_FS=m +# CONFIG_CODA_FS_OLD_API is not set +CONFIG_AFS_FS=m +CONFIG_RXRPC=m + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +# CONFIG_OSF_PARTITION is not set +CONFIG_AMIGA_PARTITION=y +# CONFIG_ATARI_PARTITION is not set +CONFIG_MAC_PARTITION=y +CONFIG_MSDOS_PARTITION=y +# CONFIG_BSD_DISKLABEL is not set +# CONFIG_MINIX_SUBPARTITION is not set +# CONFIG_SOLARIS_X86_PARTITION is not set +# CONFIG_UNIXWARE_DISKLABEL is not set +# CONFIG_LDM_PARTITION is not set +# CONFIG_SGI_PARTITION is not set +# CONFIG_ULTRIX_PARTITION is not set +# CONFIG_SUN_PARTITION is not set +# CONFIG_EFI_PARTITION is not set + +# +# Native Language Support +# +CONFIG_NLS=m +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=m +CONFIG_NLS_CODEPAGE_737=m +CONFIG_NLS_CODEPAGE_775=m +CONFIG_NLS_CODEPAGE_850=m +CONFIG_NLS_CODEPAGE_852=m +CONFIG_NLS_CODEPAGE_855=m +CONFIG_NLS_CODEPAGE_857=m +CONFIG_NLS_CODEPAGE_860=m +CONFIG_NLS_CODEPAGE_861=m +CONFIG_NLS_CODEPAGE_862=m +CONFIG_NLS_CODEPAGE_863=m +CONFIG_NLS_CODEPAGE_864=m +CONFIG_NLS_CODEPAGE_865=m +CONFIG_NLS_CODEPAGE_866=m +CONFIG_NLS_CODEPAGE_869=m +CONFIG_NLS_CODEPAGE_936=m +CONFIG_NLS_CODEPAGE_950=m +CONFIG_NLS_CODEPAGE_932=m +CONFIG_NLS_CODEPAGE_949=m +CONFIG_NLS_CODEPAGE_874=m +CONFIG_NLS_ISO8859_8=m +CONFIG_NLS_CODEPAGE_1250=m +CONFIG_NLS_CODEPAGE_1251=m +CONFIG_NLS_ASCII=m +CONFIG_NLS_ISO8859_1=m +CONFIG_NLS_ISO8859_2=m +CONFIG_NLS_ISO8859_3=m +CONFIG_NLS_ISO8859_4=m +CONFIG_NLS_ISO8859_5=m +CONFIG_NLS_ISO8859_6=m +CONFIG_NLS_ISO8859_7=m +CONFIG_NLS_ISO8859_9=m +CONFIG_NLS_ISO8859_13=m +CONFIG_NLS_ISO8859_14=m +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_KOI8_R=m +CONFIG_NLS_KOI8_U=m +CONFIG_NLS_UTF8=m + +# +# Library routines +# +CONFIG_CRC_CCITT=m +CONFIG_CRC32=m +CONFIG_LIBCRC32C=m +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=m + +# +# Profiling support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=m + +# +# Kernel hacking +# +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_SLAB is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_HIGHMEM is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_XMON is not set +# CONFIG_BDI_SWITCH is not set +# CONFIG_DEBUG_INFO is not set +CONFIG_BOOTX_TEXT=y + +# +# Security options +# +# CONFIG_SECURITY is not set + +# +# Cryptographic options +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_SHA1=m +CONFIG_CRYPTO_SHA256=m +CONFIG_CRYPTO_SHA512=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_KHAZAD=m +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_MICHAEL_MIC=m +CONFIG_CRYPTO_CRC32C=m +CONFIG_CRYPTO_TEST=m --- linux-source-2.6.8.1-2.6.8.1.orig/debian/config/powerpc/powerpc +++ linux-source-2.6.8.1-2.6.8.1/debian/config/powerpc/powerpc @@ -0,0 +1,2095 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_MMU=y +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_HAVE_DEC_LOCK=y +CONFIG_PPC=y +CONFIG_PPC32=y +CONFIG_GENERIC_NVRAM=y + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +CONFIG_CLEAN_COMPILE=y +CONFIG_BROKEN_ON_SMP=y + +# +# General setup +# +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_BSD_PROCESS_ACCT=y +# CONFIG_BSD_PROCESS_ACCT_V3 is not set +CONFIG_SYSCTL=y +CONFIG_AUDIT=y +CONFIG_LOG_BUF_SHIFT=14 +CONFIG_HOTPLUG=y +# CONFIG_IKCONFIG is not set +# CONFIG_EMBEDDED is not set +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_OBSOLETE_MODPARM=y +CONFIG_MODVERSIONS=y +CONFIG_KMOD=y + +# +# Processor +# +CONFIG_6xx=y +# CONFIG_40x is not set +# CONFIG_44x is not set +# CONFIG_POWER3 is not set +# CONFIG_POWER4 is not set +# CONFIG_8xx is not set +# CONFIG_E500 is not set +CONFIG_ALTIVEC=y +CONFIG_TAU=y +# CONFIG_TAU_INT is not set +# CONFIG_TAU_AVERAGE is not set +CONFIG_CPU_FREQ=y +# CONFIG_CPU_FREQ_PROC_INTF is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=m +CONFIG_CPU_FREQ_GOV_USERSPACE=m +# CONFIG_CPU_FREQ_24_API is not set +CONFIG_CPU_FREQ_PMAC=y +CONFIG_CPU_FREQ_TABLE=y +CONFIG_PPC601_SYNC_FIX=y +CONFIG_PM=y +CONFIG_PPC_STD_MMU=y + +# +# Platform options +# +CONFIG_PPC_MULTIPLATFORM=y +# CONFIG_APUS is not set +# CONFIG_WILLOW is not set +# CONFIG_PCORE is not set +# CONFIG_POWERPMC250 is not set +# CONFIG_EV64260 is not set +# CONFIG_SPRUCE is not set +# CONFIG_LOPEC is not set +# CONFIG_MCPN765 is not set +# CONFIG_MVME5100 is not set +# CONFIG_PPLUS is not set +# CONFIG_PRPMC750 is not set +# CONFIG_PRPMC800 is not set +# CONFIG_SANDPOINT is not set +# CONFIG_ADIR is not set +# CONFIG_K2 is not set +# CONFIG_PAL4 is not set +# CONFIG_GEMINI is not set +# CONFIG_EST8260 is not set +# CONFIG_SBC82xx is not set +# CONFIG_SBS8260 is not set +# CONFIG_RPX8260 is not set +# CONFIG_TQM8260 is not set +# CONFIG_ADS8272 is not set +# CONFIG_LITE5200 is not set +CONFIG_PPC_CHRP=y +CONFIG_PPC_PMAC=y +CONFIG_PPC_PREP=y +CONFIG_PPC_OF=y +CONFIG_PPCBUG_NVRAM=y +# CONFIG_SMP is not set +# CONFIG_PREEMPT is not set +CONFIG_HIGHMEM=y +CONFIG_KERNEL_ELF=y +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_MISC=m +CONFIG_PROC_DEVICETREE=y +CONFIG_PREP_RESIDUAL=y +CONFIG_PROC_PREPRESIDUAL=y +CONFIG_CMDLINE_BOOL=y +CONFIG_CMDLINE="console=ttyS0,9600 console=tty0 root=/dev/sda2" + +# +# Bus options +# +# CONFIG_ISA is not set +CONFIG_GENERIC_ISA_DMA=y +CONFIG_PCI=y +CONFIG_PCI_DOMAINS=y +CONFIG_PCI_LEGACY_PROC=y +CONFIG_PCI_NAMES=y + +# +# PCMCIA/CardBus support +# +CONFIG_PCMCIA=m +# CONFIG_PCMCIA_DEBUG is not set +CONFIG_YENTA=m +CONFIG_CARDBUS=y +CONFIG_PD6729=m +CONFIG_I82092=m +CONFIG_TCIC=m + +# +# Advanced setup +# +# CONFIG_ADVANCED_OPTIONS is not set + +# +# Default settings for advanced configuration options are used +# +CONFIG_HIGHMEM_START=0xfe000000 +CONFIG_LOWMEM_SIZE=0x30000000 +CONFIG_KERNEL_START=0xc0000000 +CONFIG_TASK_SIZE=0x80000000 +CONFIG_BOOT_LOAD=0x00800000 + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=m +# CONFIG_DEBUG_DRIVER is not set + +# +# Memory Technology Devices (MTD) +# +# CONFIG_MTD is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Plug and Play support +# + +# +# Block devices +# +CONFIG_BLK_DEV_FD=m +CONFIG_MAC_FLOPPY=y +CONFIG_BLK_CPQ_DA=m +CONFIG_BLK_CPQ_CISS_DA=m +CONFIG_CISS_SCSI_TAPE=y +CONFIG_BLK_DEV_DAC960=m +CONFIG_BLK_DEV_UMEM=m +CONFIG_BLK_DEV_LOOP=m +CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_SX8=m +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_BLK_DEV_INITRD=y +CONFIG_LBD=y + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=y +CONFIG_BLK_DEV_IDE=y + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_IDE_SATA is not set +CONFIG_BLK_DEV_IDEDISK=m +# CONFIG_IDEDISK_MULTI_MODE is not set +CONFIG_BLK_DEV_IDECS=m +CONFIG_BLK_DEV_IDECD=m +CONFIG_BLK_DEV_IDETAPE=m +CONFIG_BLK_DEV_IDEFLOPPY=m +CONFIG_BLK_DEV_IDESCSI=m +# CONFIG_IDE_TASK_IOCTL is not set +# CONFIG_IDE_TASKFILE_IO is not set + +# +# IDE chipset support/bugfixes +# +# CONFIG_IDE_GENERIC is not set +CONFIG_BLK_DEV_IDEPCI=y +CONFIG_IDEPCI_SHARE_IRQ=y +# CONFIG_BLK_DEV_OFFBOARD is not set +CONFIG_BLK_DEV_GENERIC=m +# CONFIG_BLK_DEV_OPTI621 is not set +CONFIG_BLK_DEV_SL82C105=m +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +CONFIG_IDEDMA_PCI_AUTO=y +CONFIG_IDEDMA_ONLYDISK=y +CONFIG_BLK_DEV_ADMA=y +CONFIG_BLK_DEV_AEC62XX=m +# CONFIG_BLK_DEV_ALI15X3 is not set +# CONFIG_BLK_DEV_AMD74XX is not set +CONFIG_BLK_DEV_CMD64X=m +# CONFIG_BLK_DEV_TRIFLEX is not set +# CONFIG_BLK_DEV_CY82C693 is not set +# CONFIG_BLK_DEV_CS5520 is not set +# CONFIG_BLK_DEV_CS5530 is not set +CONFIG_BLK_DEV_HPT34X=m +# CONFIG_HPT34X_AUTODMA is not set +CONFIG_BLK_DEV_HPT366=m +CONFIG_BLK_DEV_SC1200=m +# CONFIG_BLK_DEV_PIIX is not set +CONFIG_BLK_DEV_NS87415=m +CONFIG_BLK_DEV_PDC202XX_OLD=m +# CONFIG_PDC202XX_BURST is not set +CONFIG_BLK_DEV_PDC202XX_NEW=m +CONFIG_PDC202XX_FORCE=y +# CONFIG_BLK_DEV_SVWKS is not set +CONFIG_BLK_DEV_SIIMAGE=m +# CONFIG_BLK_DEV_SLC90E66 is not set +CONFIG_BLK_DEV_TRM290=m +CONFIG_BLK_DEV_VIA82CXXX=m +CONFIG_BLK_DEV_IDE_PMAC=y +CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y +CONFIG_BLK_DEV_IDEDMA_PMAC=y +# CONFIG_BLK_DEV_IDE_PMAC_BLINK is not set +CONFIG_BLK_DEV_IDEDMA_PMAC_AUTO=y +# CONFIG_IDE_ARM is not set +CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_IVB is not set +CONFIG_IDEDMA_AUTO=y +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +CONFIG_SCSI=m +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +CONFIG_CHR_DEV_ST=m +CONFIG_CHR_DEV_OSST=m +CONFIG_BLK_DEV_SR=m +CONFIG_BLK_DEV_SR_VENDOR=y +CONFIG_CHR_DEV_SG=m +CONFIG_CHR_DEV_SCH=m + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y + +# +# SCSI Transport Attributes +# +CONFIG_SCSI_SPI_ATTRS=m +CONFIG_SCSI_FC_ATTRS=m + +# +# SCSI low-level drivers +# +CONFIG_BLK_DEV_3W_XXXX_RAID=m +CONFIG_SCSI_3W_9XXX=m +CONFIG_SCSI_ACARD=m +CONFIG_SCSI_AACRAID=m +CONFIG_SCSI_AIC7XXX=m +CONFIG_AIC7XXX_CMDS_PER_DEVICE=32 +CONFIG_AIC7XXX_RESET_DELAY_MS=15000 +# CONFIG_AIC7XXX_BUILD_FIRMWARE is not set +CONFIG_AIC7XXX_DEBUG_ENABLE=y +CONFIG_AIC7XXX_DEBUG_MASK=0 +CONFIG_AIC7XXX_REG_PRETTY_PRINT=y +CONFIG_SCSI_AIC7XXX_OLD=m +CONFIG_SCSI_AIC79XX=m +CONFIG_AIC79XX_CMDS_PER_DEVICE=32 +CONFIG_AIC79XX_RESET_DELAY_MS=15000 +# CONFIG_AIC79XX_BUILD_FIRMWARE is not set +# CONFIG_AIC79XX_ENABLE_RD_STRM is not set +CONFIG_AIC79XX_DEBUG_ENABLE=y +CONFIG_AIC79XX_DEBUG_MASK=0 +CONFIG_AIC79XX_REG_PRETTY_PRINT=y +CONFIG_SCSI_DPT_I2O=m +CONFIG_SCSI_MEGARAID=m +CONFIG_SCSI_SATA=y +CONFIG_SCSI_SATA_SVW=m +# CONFIG_SCSI_ATA_PIIX is not set +# CONFIG_SCSI_SATA_NV is not set +CONFIG_SCSI_SATA_PROMISE=m +CONFIG_SCSI_SATA_SX4=m +CONFIG_SCSI_SATA_SIL=m +CONFIG_SCSI_SATA_SIS=m +CONFIG_SCSI_SATA_VIA=m +CONFIG_SCSI_SATA_VITESSE=m +CONFIG_SCSI_BUSLOGIC=m +# CONFIG_SCSI_OMIT_FLASHPOINT is not set +CONFIG_SCSI_DMX3191D=m +CONFIG_SCSI_EATA=m +# CONFIG_SCSI_EATA_TAGGED_QUEUE is not set +# CONFIG_SCSI_EATA_LINKED_COMMANDS is not set +CONFIG_SCSI_EATA_MAX_TAGS=16 +CONFIG_SCSI_EATA_PIO=m +CONFIG_SCSI_FUTURE_DOMAIN=m +# CONFIG_SCSI_GDTH is not set +CONFIG_SCSI_IPS=m +CONFIG_SCSI_INIA100=m +CONFIG_SCSI_SYM53C8XX_2=m +CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 +CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 +CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 +# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set +CONFIG_SCSI_IPR=m +# CONFIG_SCSI_IPR_TRACE is not set +# CONFIG_SCSI_IPR_DUMP is not set +CONFIG_SCSI_QLOGIC_ISP=m +CONFIG_SCSI_QLOGIC_FC=m +# CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set +CONFIG_SCSI_QLOGIC_1280=m +CONFIG_SCSI_DC395x=m +CONFIG_SCSI_DC390T=m +CONFIG_SCSI_NSP32=m +# CONFIG_SCSI_DEBUG is not set +CONFIG_SCSI_MESH=m +CONFIG_SCSI_MESH_SYNC_RATE=5 +CONFIG_SCSI_MESH_RESET_DELAY_MS=4000 +CONFIG_SCSI_MAC53C94=m + +# +# PCMCIA SCSI adapter support +# +CONFIG_PCMCIA_AHA152X=m +CONFIG_PCMCIA_FDOMAIN=m +CONFIG_PCMCIA_NINJA_SCSI=m +CONFIG_PCMCIA_QLOGIC=m +CONFIG_PCMCIA_SYM53C500=m + +# +# Multi-device support (RAID and LVM) +# +CONFIG_MD=y +CONFIG_BLK_DEV_MD=m +CONFIG_MD_LINEAR=m +CONFIG_MD_RAID0=m +CONFIG_MD_RAID1=m +CONFIG_MD_RAID5=m +CONFIG_MD_RAID6=m +CONFIG_MD_MULTIPATH=m +CONFIG_BLK_DEV_DM=m +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=m +CONFIG_DM_MIRROR=m +CONFIG_DM_ZERO=m + +# +# Fusion MPT device support +# +CONFIG_FUSION=m +CONFIG_FUSION_MAX_SGE=40 +CONFIG_FUSION_ISENSE=m +CONFIG_FUSION_CTL=m +# CONFIG_FUSION_LAN is not set + +# +# IEEE 1394 (FireWire) support +# +CONFIG_IEEE1394=m + +# +# Subsystem Options +# +# CONFIG_IEEE1394_VERBOSEDEBUG is not set +CONFIG_IEEE1394_OUI_DB=y +CONFIG_IEEE1394_EXTRA_CONFIG_ROMS=y +CONFIG_IEEE1394_CONFIG_ROM_IP1394=y + +# +# Device Drivers +# +CONFIG_IEEE1394_PCILYNX=m +CONFIG_IEEE1394_OHCI1394=m + +# +# Protocol Drivers +# +CONFIG_IEEE1394_VIDEO1394=m +CONFIG_IEEE1394_SBP2=m +CONFIG_IEEE1394_SBP2_PHYS_DMA=y +CONFIG_IEEE1394_ETH1394=m +CONFIG_IEEE1394_DV1394=m +CONFIG_IEEE1394_RAWIO=m +CONFIG_IEEE1394_CMP=m +CONFIG_IEEE1394_AMDTP=m + +# +# I2O device support +# +CONFIG_I2O=m +CONFIG_I2O_CONFIG=m +CONFIG_I2O_BLOCK=m +CONFIG_I2O_SCSI=m +CONFIG_I2O_PROC=m + +# +# Macintosh device drivers +# +CONFIG_ADB=y +CONFIG_ADB_CUDA=y +CONFIG_ADB_PMU=y +CONFIG_PMAC_PBOOK=y +CONFIG_PMAC_APM_EMU=m +CONFIG_PMAC_BACKLIGHT=y +CONFIG_ADB_MACIO=y +CONFIG_INPUT_ADBHID=y +CONFIG_MAC_EMUMOUSEBTN=y +CONFIG_THERM_WINDTUNNEL=m +CONFIG_THERM_ADT746X=m +CONFIG_ANSLCD=m + +# +# Networking support +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=m +# CONFIG_PACKET_MMAP is not set +CONFIG_NETLINK_DEV=m +CONFIG_UNIX=m +CONFIG_NET_KEY=m +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_FWMARK=y +CONFIG_IP_ROUTE_NAT=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_TOS=y +CONFIG_IP_ROUTE_VERBOSE=y +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE=m +CONFIG_NET_IPGRE_BROADCAST=y +CONFIG_IP_MROUTE=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +CONFIG_ARPD=y +# CONFIG_SYN_COOKIES is not set +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +CONFIG_INET_IPCOMP=m + +# +# IP: Virtual Server Configuration +# +CONFIG_IP_VS=m +# CONFIG_IP_VS_DEBUG is not set +CONFIG_IP_VS_TAB_BITS=12 + +# +# IPVS transport protocol load balancing support +# +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_PROTO_ESP=y +CONFIG_IP_VS_PROTO_AH=y + +# +# IPVS scheduler +# +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_WRR=m +CONFIG_IP_VS_LC=m +CONFIG_IP_VS_WLC=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m + +# +# IPVS application helper +# +CONFIG_IP_VS_FTP=m +CONFIG_IPV6=m +CONFIG_IPV6_PRIVACY=y +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +CONFIG_INET6_IPCOMP=m +CONFIG_IPV6_TUNNEL=m +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_BRIDGE_NETFILTER=y + +# +# IP: Netfilter Configuration +# +CONFIG_IP_NF_CONNTRACK=m +CONFIG_IP_NF_FTP=m +CONFIG_IP_NF_IRC=m +CONFIG_IP_NF_TFTP=m +CONFIG_IP_NF_AMANDA=m +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_LIMIT=m +# CONFIG_IP_NF_MATCH_IPRANGE is not set +CONFIG_IP_NF_MATCH_MAC=m +CONFIG_IP_NF_MATCH_PKTTYPE=m +CONFIG_IP_NF_MATCH_MARK=m +CONFIG_IP_NF_MATCH_MULTIPORT=m +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_DSCP=m +# CONFIG_IP_NF_MATCH_AH_ESP is not set +CONFIG_IP_NF_MATCH_LENGTH=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_TCPMSS=m +CONFIG_IP_NF_MATCH_HELPER=m +CONFIG_IP_NF_MATCH_STATE=m +CONFIG_IP_NF_MATCH_CONNTRACK=m +CONFIG_IP_NF_MATCH_OWNER=m +# CONFIG_IP_NF_MATCH_PHYSDEV is not set +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_REDIRECT=m +# CONFIG_IP_NF_TARGET_NETMAP is not set +# CONFIG_IP_NF_TARGET_SAME is not set +CONFIG_IP_NF_NAT_LOCAL=y +CONFIG_IP_NF_NAT_SNMP_BASIC=m +CONFIG_IP_NF_NAT_IRC=m +CONFIG_IP_NF_NAT_FTP=m +CONFIG_IP_NF_NAT_TFTP=m +CONFIG_IP_NF_NAT_AMANDA=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_DSCP=m +CONFIG_IP_NF_TARGET_MARK=m +# CONFIG_IP_NF_TARGET_CLASSIFY is not set +CONFIG_IP_NF_TARGET_LOG=m +# CONFIG_IP_NF_TARGET_ULOG is not set +CONFIG_IP_NF_TARGET_TCPMSS=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +# CONFIG_IP_NF_COMPAT_IPCHAINS is not set +# CONFIG_IP_NF_COMPAT_IPFWADM is not set +CONFIG_IP_NF_TARGET_NOTRACK=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_MATCH_ADDRTYPE=m +CONFIG_IP_NF_MATCH_REALM=m + +# +# IPv6: Netfilter Configuration +# +# CONFIG_IP6_NF_QUEUE is not set +# CONFIG_IP6_NF_IPTABLES is not set + +# +# DECnet: Netfilter Configuration +# +# CONFIG_DECNET_NF_GRABULATOR is not set + +# +# Bridge: Netfilter Configuration +# +# CONFIG_BRIDGE_NF_EBTABLES is not set +CONFIG_XFRM=y +CONFIG_XFRM_USER=m + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IP_SCTP=m +# CONFIG_SCTP_DBG_MSG is not set +# CONFIG_SCTP_DBG_OBJCNT is not set +# CONFIG_SCTP_HMAC_NONE is not set +# CONFIG_SCTP_HMAC_SHA1 is not set +CONFIG_SCTP_HMAC_MD5=y +CONFIG_ATM=m +CONFIG_ATM_CLIP=m +CONFIG_ATM_CLIP_NO_ICMP=y +CONFIG_ATM_LANE=m +CONFIG_ATM_MPOA=m +CONFIG_ATM_BR2684=m +# CONFIG_ATM_BR2684_IPFILTER is not set +CONFIG_BRIDGE=m +CONFIG_VLAN_8021Q=m +CONFIG_DECNET=m +CONFIG_DECNET_SIOCGIFCONF=y +CONFIG_DECNET_ROUTER=y +CONFIG_DECNET_ROUTE_FWMARK=y +CONFIG_LLC=y +CONFIG_LLC2=m +CONFIG_IPX=m +CONFIG_IPX_INTERN=y +CONFIG_ATALK=m +CONFIG_DEV_APPLETALK=y +CONFIG_IPDDP=m +CONFIG_IPDDP_ENCAP=y +CONFIG_IPDDP_DECAP=y +CONFIG_X25=m +CONFIG_LAPB=m +CONFIG_NET_DIVERT=y +CONFIG_ECONET=m +CONFIG_ECONET_AUNUDP=y +CONFIG_ECONET_NATIVE=y +CONFIG_WAN_ROUTER=m +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_CLK_JIFFIES=y +# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set +# CONFIG_NET_SCH_CLK_CPU is not set +CONFIG_NET_SCH_CBQ=m +CONFIG_NET_SCH_HTB=m +CONFIG_NET_SCH_HFSC=m +CONFIG_NET_SCH_ATM=m +CONFIG_NET_SCH_PRIO=m +CONFIG_NET_SCH_RED=m +CONFIG_NET_SCH_SFQ=m +CONFIG_NET_SCH_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_NETEM=m +CONFIG_NET_SCH_INGRESS=m +CONFIG_NET_QOS=y +CONFIG_NET_ESTIMATOR=y +CONFIG_NET_CLS=y +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_ROUTE=y +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +# CONFIG_CLS_U32_PERF is not set +# CONFIG_NET_CLS_IND is not set +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +# CONFIG_NET_CLS_ACT is not set +CONFIG_NET_CLS_POLICE=y + +# +# Network testing +# +CONFIG_NET_PKTGEN=m +CONFIG_NETPOLL=y +CONFIG_NETPOLL_RX=y +CONFIG_NETPOLL_TRAP=y +CONFIG_NET_POLL_CONTROLLER=y +CONFIG_HAMRADIO=y + +# +# Packet Radio protocols +# +CONFIG_AX25=m +CONFIG_AX25_DAMA_SLAVE=y +CONFIG_NETROM=m +CONFIG_ROSE=m + +# +# AX.25 network device drivers +# +CONFIG_MKISS=m +CONFIG_6PACK=m +CONFIG_BPQETHER=m +CONFIG_BAYCOM_SER_FDX=m +CONFIG_BAYCOM_SER_HDX=m +CONFIG_YAM=m +CONFIG_IRDA=m + +# +# IrDA protocols +# +CONFIG_IRLAN=m +CONFIG_IRNET=m +CONFIG_IRCOMM=m +CONFIG_IRDA_ULTRA=y + +# +# IrDA options +# +CONFIG_IRDA_CACHE_LAST_LSAP=y +CONFIG_IRDA_FAST_RR=y +CONFIG_IRDA_DEBUG=y + +# +# Infrared-port device drivers +# + +# +# SIR device drivers +# +CONFIG_IRTTY_SIR=m + +# +# Dongle support +# +# CONFIG_DONGLE is not set + +# +# Old SIR device drivers +# +# CONFIG_IRPORT_SIR is not set + +# +# Old Serial dongle support +# + +# +# FIR device drivers +# +# CONFIG_USB_IRDA is not set +# CONFIG_SIGMATEL_FIR is not set +# CONFIG_TOSHIBA_FIR is not set +# CONFIG_VLSI_FIR is not set +CONFIG_BT=m +CONFIG_BT_L2CAP=m +CONFIG_BT_SCO=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_CMTP=m +CONFIG_BT_HIDP=m + +# +# Bluetooth device drivers +# +CONFIG_BT_HCIUSB=m +CONFIG_BT_HCIUSB_SCO=y +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_H4=y +CONFIG_BT_HCIUART_BCSP=y +CONFIG_BT_HCIUART_BCSP_TXCRC=y +CONFIG_BT_HCIBCM203X=m +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIDTL1=m +CONFIG_BT_HCIBT3C=m +CONFIG_BT_HCIBLUECARD=m +CONFIG_BT_HCIBTUART=m +CONFIG_BT_HCIVHCI=m +CONFIG_NETDEVICES=y +CONFIG_DUMMY=m +CONFIG_BONDING=m +CONFIG_EQUALIZER=m +CONFIG_TUN=m +CONFIG_ETHERTAP=m + +# +# ARCnet devices +# +CONFIG_ARCNET=m +CONFIG_ARCNET_1201=m +CONFIG_ARCNET_1051=m +CONFIG_ARCNET_RAW=m +CONFIG_ARCNET_COM90xx=m +CONFIG_ARCNET_COM90xxIO=m +CONFIG_ARCNET_RIM_I=m +CONFIG_ARCNET_COM20020=m +CONFIG_ARCNET_COM20020_PCI=m + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=y +CONFIG_MACE=m +# CONFIG_MACE_AAUI_PORT is not set +CONFIG_BMAC=m +CONFIG_HAPPYMEAL=m +CONFIG_SUNGEM=m +CONFIG_NET_VENDOR_3COM=y +CONFIG_VORTEX=m +CONFIG_TYPHOON=m + +# +# Tulip family network device support +# +CONFIG_NET_TULIP=y +CONFIG_DE2104X=m +CONFIG_TULIP=m +# CONFIG_TULIP_MWI is not set +# CONFIG_TULIP_MMIO is not set +# CONFIG_TULIP_NAPI is not set +CONFIG_DE4X5=m +CONFIG_WINBOND_840=m +CONFIG_DM9102=m +CONFIG_PCMCIA_XIRCOM=m +CONFIG_PCMCIA_XIRTULIP=m +CONFIG_HP100=m +CONFIG_NET_PCI=y +CONFIG_PCNET32=m +# CONFIG_AMD8111_ETH is not set +CONFIG_ADAPTEC_STARFIRE=m +# CONFIG_ADAPTEC_STARFIRE_NAPI is not set +CONFIG_B44=m +# CONFIG_FORCEDETH is not set +CONFIG_EEPRO100=m +# CONFIG_EEPRO100_PIO is not set +CONFIG_E100=m +# CONFIG_E100_NAPI is not set +CONFIG_FEALNX=m +CONFIG_NATSEMI=m +CONFIG_NE2K_PCI=m +CONFIG_8139CP=m +CONFIG_8139TOO=m +CONFIG_8139TOO_PIO=y +# CONFIG_8139TOO_TUNE_TWISTER is not set +CONFIG_8139TOO_8129=y +# CONFIG_8139_OLD_RX_RESET is not set +CONFIG_SIS900=m +CONFIG_EPIC100=m +CONFIG_SUNDANCE=m +CONFIG_SUNDANCE_MMIO=y +CONFIG_TLAN=m +CONFIG_VIA_RHINE=m +CONFIG_VIA_RHINE_MMIO=y +CONFIG_VIA_VELOCITY=m + +# +# Ethernet (1000 Mbit) +# +CONFIG_DL2K=m +CONFIG_E1000=m +# CONFIG_E1000_NAPI is not set +CONFIG_NS83820=m +CONFIG_HAMACHI=m +CONFIG_YELLOWFIN=m +CONFIG_R8169=m +CONFIG_SK98LIN=m +CONFIG_TIGON3=m +CONFIG_MV64340_ETH=m +# CONFIG_MV64340_ETH_0 is not set +CONFIG_MV64340_ETH_1=y +# CONFIG_MV64340_ETH_2 is not set + +# +# Ethernet (10000 Mbit) +# +CONFIG_IXGB=m +# CONFIG_IXGB_NAPI is not set +CONFIG_S2IO=m +# CONFIG_S2IO_NAPI is not set + +# +# Token Ring devices +# +CONFIG_TR=y +CONFIG_IBMOL=m +CONFIG_IBMLS=m +CONFIG_3C359=m +CONFIG_TMS380TR=m +CONFIG_TMSPCI=m +CONFIG_ABYSS=m + +# +# Wireless LAN (non-hamradio) +# +CONFIG_NET_RADIO=y + +# +# Obsolete Wireless cards support (pre-802.11) +# +CONFIG_STRIP=m +CONFIG_PCMCIA_WAVELAN=m +CONFIG_PCMCIA_NETWAVE=m + +# +# Wireless 802.11 Frequency Hopping cards support +# +CONFIG_PCMCIA_RAYCS=m + +# +# Wireless 802.11b ISA/PCI cards support +# +CONFIG_IEEE80211=m +# CONFIG_IEEE80211_DEBUG is not set +CONFIG_IEEE80211_CRYPT=m +CONFIG_IEEE80211_WPA=y +CONFIG_IEEE80211_CRYPT_CCMP=m +CONFIG_IEEE80211_CRYPT_TKIP=m +CONFIG_IPW2100=m +# CONFIG_IPW2100_PROMISC is not set +# CONFIG_IPW2100_LEGACY_FW_LOAD is not set +# CONFIG_IPW2100_NOWEP is not set +# CONFIG_IPW2100_DEBUG is not set +CONFIG_IPW2200=m +# CONFIG_IPW2200_NOWEP is not set +CONFIG_WLAN_NG=m +CONFIG_PRISM2=m +CONFIG_PRISM2_USB=m +CONFIG_ACX100=m +CONFIG_ADM8211=m +CONFIG_HERMES=m +CONFIG_APPLE_AIRPORT=m +CONFIG_PLX_HERMES=m +CONFIG_TMD_HERMES=m +CONFIG_PCI_HERMES=m +CONFIG_ATMEL=m +# CONFIG_PCI_ATMEL is not set + +# +# Wireless 802.11b Pcmcia/Cardbus cards support +# +CONFIG_PCMCIA_HERMES=m +CONFIG_AIRO_CS=m +CONFIG_PCMCIA_ATMEL=m +CONFIG_PCMCIA_WL3501=m + +# +# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support +# +CONFIG_PRISM54=m +CONFIG_NET_WIRELESS=y + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +CONFIG_PCMCIA_3C589=m +CONFIG_PCMCIA_3C574=m +CONFIG_PCMCIA_FMVJ18X=m +CONFIG_PCMCIA_PCNET=m +CONFIG_PCMCIA_NMCLAN=m +CONFIG_PCMCIA_SMC91C92=m +CONFIG_PCMCIA_XIRC2PS=m +CONFIG_PCMCIA_AXNET=m +CONFIG_ARCNET_COM20020_CS=m +CONFIG_PCMCIA_IBMTR=m + +# +# Wan interfaces +# +CONFIG_WAN=y +CONFIG_DSCC4=m +# CONFIG_DSCC4_PCISYNC is not set +# CONFIG_DSCC4_PCI_RST is not set +CONFIG_LANMEDIA=m +CONFIG_SYNCLINK_SYNCPPP=m +CONFIG_HDLC=m +CONFIG_HDLC_RAW=y +CONFIG_HDLC_RAW_ETH=y +CONFIG_HDLC_CISCO=y +CONFIG_HDLC_FR=y +CONFIG_HDLC_PPP=y +CONFIG_HDLC_X25=y +CONFIG_PCI200SYN=m +CONFIG_WANXL=m +CONFIG_PC300=m +CONFIG_PC300_MLPPP=y +CONFIG_FARSYNC=m +CONFIG_DLCI=m +CONFIG_DLCI_COUNT=24 +CONFIG_DLCI_MAX=8 +CONFIG_WAN_ROUTER_DRIVERS=y +CONFIG_CYCLADES_SYNC=m +CONFIG_CYCLOMX_X25=y +CONFIG_LAPBETHER=m +CONFIG_X25_ASY=m + +# +# ATM drivers +# +CONFIG_ATM_TCP=m +CONFIG_ATM_LANAI=m +CONFIG_ATM_ENI=m +# CONFIG_ATM_ENI_DEBUG is not set +# CONFIG_ATM_ENI_TUNE_BURST is not set +CONFIG_ATM_FIRESTREAM=m +CONFIG_ATM_ZATM=m +CONFIG_ATM_ZATM_DEBUG=y +CONFIG_ATM_NICSTAR=m +CONFIG_ATM_NICSTAR_USE_SUNI=y +CONFIG_ATM_NICSTAR_USE_IDT77105=y +CONFIG_ATM_IDT77252=m +# CONFIG_ATM_IDT77252_DEBUG is not set +# CONFIG_ATM_IDT77252_RCV_ALL is not set +CONFIG_ATM_IDT77252_USE_SUNI=y +CONFIG_ATM_AMBASSADOR=m +# CONFIG_ATM_AMBASSADOR_DEBUG is not set +CONFIG_ATM_HORIZON=m +# CONFIG_ATM_HORIZON_DEBUG is not set +CONFIG_ATM_IA=m +# CONFIG_ATM_IA_DEBUG is not set +CONFIG_ATM_FORE200E_MAYBE=m +CONFIG_ATM_FORE200E_PCA=y +CONFIG_ATM_FORE200E_PCA_DEFAULT_FW=y +CONFIG_ATM_FORE200E_USE_TASKLET=y +CONFIG_ATM_FORE200E_TX_RETRY=16 +CONFIG_ATM_FORE200E_DEBUG=0 +CONFIG_ATM_FORE200E=m +CONFIG_ATM_HE=m +# CONFIG_ATM_HE_USE_SUNI is not set +CONFIG_FDDI=y +CONFIG_DEFXX=m +CONFIG_SKFP=m +CONFIG_HIPPI=y +# CONFIG_ROADRUNNER is not set +CONFIG_PPP=m +CONFIG_PPP_MULTILINK=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_MPPE=m +CONFIG_PPPOE=m +CONFIG_PPPOATM=m +CONFIG_SLIP=m +# CONFIG_SLIP_COMPRESSED is not set +# CONFIG_SLIP_SMART is not set +# CONFIG_SLIP_MODE_SLIP6 is not set +CONFIG_NET_FC=y +CONFIG_SHAPER=m +CONFIG_NETCONSOLE=m +# CONFIG_NDISWRAPPER is not set + +# +# ISDN subsystem +# +CONFIG_ISDN=m + +# +# Old ISDN4Linux +# +# CONFIG_ISDN_I4L is not set + +# +# CAPI subsystem +# +CONFIG_ISDN_CAPI=m +# CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON is not set +CONFIG_ISDN_CAPI_MIDDLEWARE=y +CONFIG_ISDN_CAPI_CAPI20=m +# CONFIG_ISDN_CAPI_CAPIFS_BOOL is not set + +# +# CAPI hardware drivers +# + +# +# Active AVM cards +# +CONFIG_CAPI_AVM=y +CONFIG_ISDN_DRV_AVMB1_B1PCI=m +CONFIG_ISDN_DRV_AVMB1_B1PCIV4=y +CONFIG_ISDN_DRV_AVMB1_B1PCMCIA=m +CONFIG_ISDN_DRV_AVMB1_AVM_CS=m +CONFIG_ISDN_DRV_AVMB1_T1PCI=m +CONFIG_ISDN_DRV_AVMB1_C4=m + +# +# Active Eicon DIVA Server cards +# +CONFIG_CAPI_EICON=y +CONFIG_ISDN_DIVAS=m +CONFIG_ISDN_DIVAS_BRIPCI=y +CONFIG_ISDN_DIVAS_PRIPCI=y +CONFIG_ISDN_DIVAS_DIVACAPI=m +CONFIG_ISDN_DIVAS_USERIDI=m +CONFIG_ISDN_DIVAS_MAINT=m + +# +# Modular ISDN driver +# +# CONFIG_MISDN_DRV is not set + +# +# Telephony Support +# +CONFIG_PHONE=m +CONFIG_PHONE_IXJ=m +CONFIG_PHONE_IXJ_PCMCIA=m + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_MOUSEDEV_PSAUX_ENABLE=y +CONFIG_INPUT_JOYDEV=m +CONFIG_INPUT_TSDEV=m +CONFIG_INPUT_TSDEV_SCREEN_X=240 +CONFIG_INPUT_TSDEV_SCREEN_Y=320 +CONFIG_INPUT_EVDEV=m +CONFIG_INPUT_EVBUG=m + +# +# Input I/O drivers +# +CONFIG_GAMEPORT=m +CONFIG_SOUND_GAMEPORT=m +CONFIG_GAMEPORT_NS558=m +CONFIG_GAMEPORT_L4=m +CONFIG_GAMEPORT_EMU10K1=m +CONFIG_GAMEPORT_VORTEX=m +CONFIG_GAMEPORT_FM801=m +CONFIG_GAMEPORT_CS461x=m +CONFIG_SERIO=m +CONFIG_SERIO_I8042=m +CONFIG_SERIO_SERPORT=m +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PCIPS2 is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=m +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=m +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_VSXXXAA is not set +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_ANALOG=m +CONFIG_JOYSTICK_A3D=m +CONFIG_JOYSTICK_ADI=m +CONFIG_JOYSTICK_COBRA=m +CONFIG_JOYSTICK_GF2K=m +CONFIG_JOYSTICK_GRIP=m +CONFIG_JOYSTICK_GRIP_MP=m +CONFIG_JOYSTICK_GUILLEMOT=m +CONFIG_JOYSTICK_INTERACT=m +CONFIG_JOYSTICK_SIDEWINDER=m +CONFIG_JOYSTICK_TMDC=m +CONFIG_JOYSTICK_IFORCE=m +CONFIG_JOYSTICK_IFORCE_USB=y +CONFIG_JOYSTICK_IFORCE_232=y +CONFIG_JOYSTICK_WARRIOR=m +CONFIG_JOYSTICK_MAGELLAN=m +CONFIG_JOYSTICK_SPACEORB=m +CONFIG_JOYSTICK_SPACEBALL=m +CONFIG_JOYSTICK_STINGER=m +CONFIG_JOYSTICK_TWIDDLER=m +CONFIG_INPUT_JOYDUMP=m +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_GUNZE=m +CONFIG_INPUT_MISC=y +CONFIG_INPUT_UINPUT=m + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +# CONFIG_SERIAL_8250_CS is not set +CONFIG_SERIAL_8250_NR_UARTS=4 +# CONFIG_SERIAL_8250_EXTENDED is not set + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_SERIAL_PMACZILOG=y +CONFIG_SERIAL_PMACZILOG_CONSOLE=y +CONFIG_UNIX98_PTYS=y +# CONFIG_LEGACY_PTYS is not set +CONFIG_QIC02_TAPE=m +CONFIG_QIC02_DYNCONF=y + +# +# Setting runtime QIC-02 configuration is done with qic02conf +# + +# +# from the tpqic02-support package. It is available at +# + +# +# metalab.unc.edu or ftp://titus.cfw.com/pub/Linux/util/ +# + +# +# IPMI +# +CONFIG_IPMI_HANDLER=m +# CONFIG_IPMI_PANIC_EVENT is not set +CONFIG_IPMI_DEVICE_INTERFACE=m +CONFIG_IPMI_SI=m +CONFIG_IPMI_WATCHDOG=m + +# +# Watchdog Cards +# +CONFIG_WATCHDOG=y +# CONFIG_WATCHDOG_NOWAYOUT is not set + +# +# Watchdog Device Drivers +# +CONFIG_SOFT_WATCHDOG=m + +# +# PCI-based Watchdog Cards +# +CONFIG_PCIPCWATCHDOG=m +CONFIG_WDTPCI=m +CONFIG_WDT_501_PCI=y + +# +# USB-based Watchdog Cards +# +CONFIG_USBPCWATCHDOG=m +CONFIG_NVRAM=y +CONFIG_GEN_RTC=y +CONFIG_GEN_RTC_X=y +CONFIG_DTLK=m +CONFIG_R3964=m +CONFIG_APPLICOM=m + +# +# Ftape, the floppy tape device driver +# +CONFIG_AGP=m +CONFIG_AGP_UNINORTH=m +CONFIG_DRM=y +CONFIG_DRM_TDFX=m +# CONFIG_DRM_GAMMA is not set +CONFIG_DRM_R128=m +CONFIG_DRM_RADEON=m +CONFIG_DRM_MGA=m +CONFIG_DRM_SIS=m + +# +# PCMCIA character devices +# +CONFIG_SYNCLINK_CS=m +# CONFIG_RAW_DRIVER is not set + +# +# I2C support +# +CONFIG_I2C=y +CONFIG_I2C_CHARDEV=m + +# +# I2C Algorithms +# +CONFIG_I2C_ALGOBIT=y +CONFIG_I2C_ALGOPCF=m + +# +# I2C Hardware Bus support +# +# CONFIG_I2C_ALI1535 is not set +# CONFIG_I2C_ALI1563 is not set +# CONFIG_I2C_ALI15X3 is not set +# CONFIG_I2C_AMD756 is not set +# CONFIG_I2C_AMD8111 is not set +CONFIG_I2C_HYDRA=m +# CONFIG_I2C_I801 is not set +# CONFIG_I2C_I810 is not set +CONFIG_I2C_ISA=m +CONFIG_I2C_KEYWEST=y +# CONFIG_I2C_NFORCE2 is not set +CONFIG_I2C_PARPORT_LIGHT=m +# CONFIG_I2C_PIIX4 is not set +CONFIG_I2C_PROSAVAGE=m +CONFIG_I2C_SAVAGE4=m +CONFIG_SCx200_ACB=m +CONFIG_I2C_SIS5595=m +CONFIG_I2C_SIS630=m +CONFIG_I2C_SIS96X=m +CONFIG_I2C_VIA=m +CONFIG_I2C_VIAPRO=m +CONFIG_I2C_VOODOO3=m + +# +# Hardware Sensors Chip support +# +CONFIG_I2C_SENSOR=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM1025=m +CONFIG_SENSORS_ADM1031=m +CONFIG_SENSORS_ASB100=m +CONFIG_SENSORS_DS1621=m +CONFIG_SENSORS_FSCHER=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_IT87=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM77=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_LM83=m +CONFIG_SENSORS_LM85=m +CONFIG_SENSORS_LM90=m +CONFIG_SENSORS_MAX1619=m +CONFIG_SENSORS_VIA686A=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_W83L785TS=m +CONFIG_SENSORS_W83627HF=m + +# +# Other I2C Chip support +# +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_PCF8574=m +CONFIG_SENSORS_PCF8591=m +CONFIG_SENSORS_RTC8564=m +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set + +# +# Dallas's 1-wire bus +# +CONFIG_W1=m +CONFIG_W1_MATROX=m +CONFIG_W1_THERM=m + +# +# Misc devices +# + +# +# Multimedia devices +# +CONFIG_VIDEO_DEV=m + +# +# Video For Linux +# + +# +# Video Adapters +# +CONFIG_VIDEO_BT848=m +CONFIG_VIDEO_CPIA=m +CONFIG_VIDEO_CPIA_USB=m +CONFIG_VIDEO_SAA5246A=m +CONFIG_VIDEO_SAA5249=m +CONFIG_TUNER_3036=m +CONFIG_VIDEO_STRADIS=m +CONFIG_VIDEO_ZORAN=m +CONFIG_VIDEO_ZORAN_BUZ=m +CONFIG_VIDEO_ZORAN_DC10=m +CONFIG_VIDEO_ZORAN_DC30=m +CONFIG_VIDEO_ZORAN_LML33=m +CONFIG_VIDEO_ZORAN_LML33R10=m +CONFIG_VIDEO_SAA7134=m +CONFIG_VIDEO_MXB=m +CONFIG_VIDEO_DPC=m +CONFIG_VIDEO_HEXIUM_ORION=m +CONFIG_VIDEO_HEXIUM_GEMINI=m +CONFIG_VIDEO_CX88=m +CONFIG_VIDEO_OVCAMCHIP=m + +# +# Radio Adapters +# +CONFIG_RADIO_GEMTEK_PCI=m +CONFIG_RADIO_MAXIRADIO=m +CONFIG_RADIO_MAESTRO=m + +# +# Digital Video Broadcasting Devices +# +CONFIG_DVB=y +CONFIG_DVB_CORE=m + +# +# Supported Frontend Modules +# +CONFIG_DVB_TWINHAN_DST=m +CONFIG_DVB_STV0299=m +CONFIG_DVB_SP887X=m +CONFIG_DVB_SP887X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/sc_main.mc" +CONFIG_DVB_ALPS_TDLB7=m +CONFIG_DVB_ALPS_TDMB7=m +CONFIG_DVB_ATMEL_AT76C651=m +CONFIG_DVB_CX24110=m +CONFIG_DVB_GRUNDIG_29504_491=m +CONFIG_DVB_GRUNDIG_29504_401=m +CONFIG_DVB_MT312=m +CONFIG_DVB_VES1820=m +CONFIG_DVB_VES1X93=m +CONFIG_DVB_TDA1004X=m +CONFIG_DVB_TDA1004X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/tda1004x.bin" +CONFIG_DVB_NXT6000=m + +# +# Supported SAA7146 based PCI Adapters +# +CONFIG_DVB_AV7110=m +CONFIG_DVB_AV7110_OSD=y +CONFIG_DVB_BUDGET=m +CONFIG_DVB_BUDGET_CI=m +CONFIG_DVB_BUDGET_AV=m +CONFIG_DVB_BUDGET_PATCH=m + +# +# Supported USB Adapters +# +CONFIG_DVB_TTUSB_BUDGET=m +CONFIG_DVB_TTUSB_DEC=m + +# +# Supported FlexCopII (B2C2) Adapters +# +CONFIG_DVB_B2C2_SKYSTAR=m + +# +# Supported BT878 Adapters +# +CONFIG_DVB_BT8XX=m +CONFIG_VIDEO_SAA7146=m +CONFIG_VIDEO_SAA7146_VV=m +CONFIG_VIDEO_VIDEOBUF=m +CONFIG_VIDEO_TUNER=m +CONFIG_VIDEO_BUF=m +CONFIG_VIDEO_BTCX=m +CONFIG_VIDEO_IR=m + +# +# Graphics support +# +CONFIG_FB=y +CONFIG_FB_CIRRUS=m +# CONFIG_FB_PM2 is not set +# CONFIG_FB_CYBER2000 is not set +CONFIG_FB_OF=y +CONFIG_FB_CONTROL=y +CONFIG_FB_PLATINUM=y +CONFIG_FB_VALKYRIE=y +CONFIG_FB_CT65550=y +# CONFIG_FB_ASILIANT is not set +CONFIG_FB_IMSTT=y +# CONFIG_FB_VGA16 is not set +CONFIG_FB_RIVA=m +CONFIG_FB_RIVA_I2C=y +# CONFIG_FB_RIVA_DEBUG is not set +CONFIG_FB_MATROX=y +CONFIG_FB_MATROX_MILLENIUM=y +CONFIG_FB_MATROX_MYSTIQUE=y +CONFIG_FB_MATROX_G450=y +CONFIG_FB_MATROX_G100=y +CONFIG_FB_MATROX_I2C=m +CONFIG_FB_MATROX_MAVEN=m +CONFIG_FB_MATROX_MULTIHEAD=y +# CONFIG_FB_RADEON_OLD is not set +CONFIG_FB_RADEON=y +CONFIG_FB_RADEON_I2C=y +# CONFIG_FB_RADEON_DEBUG is not set +CONFIG_FB_ATY128=y +CONFIG_FB_ATY=y +CONFIG_FB_ATY_CT=y +CONFIG_FB_ATY_GX=y +# CONFIG_FB_ATY_XL_INIT is not set +CONFIG_FB_SIS=m +CONFIG_FB_SIS_300=y +CONFIG_FB_SIS_315=y +CONFIG_FB_NEOMAGIC=m +CONFIG_FB_KYRO=m +CONFIG_FB_3DFX=y +# CONFIG_FB_3DFX_ACCEL is not set +CONFIG_FB_VOODOO1=y +CONFIG_FB_TRIDENT=m +CONFIG_FB_TRIDENT_ACCEL=y +# CONFIG_FB_VIRTUAL is not set + +# +# Console display driver support +# +# CONFIG_VGA_CONSOLE is not set +# CONFIG_MDA_CONSOLE is not set +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y + +# +# Logo configuration +# +CONFIG_LOGO=y +# CONFIG_LOGO_LINUX_MONO is not set +CONFIG_LOGO_LINUX_VGA16=y +# CONFIG_LOGO_LINUX_CLUT224 is not set + +# +# Sound +# +CONFIG_SOUND=m +CONFIG_DMASOUND_PMAC=m +CONFIG_DMASOUND=m + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +CONFIG_SND_HWDEP=m +CONFIG_SND_RAWMIDI=m +CONFIG_SND_SEQUENCER=m +# CONFIG_SND_SEQ_DUMMY is not set +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=m +CONFIG_SND_PCM_OSS=m +CONFIG_SND_SEQUENCER_OSS=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set + +# +# Generic devices +# +CONFIG_SND_MPU401_UART=m +CONFIG_SND_OPL3_LIB=m +CONFIG_SND_VX_LIB=m +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_VIRMIDI is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set + +# +# PCI devices +# +CONFIG_SND_AC97_CODEC=m +# CONFIG_SND_ALI5451 is not set +CONFIG_SND_ATIIXP=m +CONFIG_SND_AU8810=m +CONFIG_SND_AU8820=m +CONFIG_SND_AU8830=m +CONFIG_SND_AZT3328=m +CONFIG_SND_BT87X=m +CONFIG_SND_CS46XX=m +CONFIG_SND_CS46XX_NEW_DSP=y +CONFIG_SND_CS4281=m +CONFIG_SND_EMU10K1=m +CONFIG_SND_KORG1212=m +CONFIG_SND_MIXART=m +CONFIG_SND_NM256=m +CONFIG_SND_RME32=m +CONFIG_SND_RME96=m +CONFIG_SND_RME9652=m +CONFIG_SND_HDSP=m +CONFIG_SND_TRIDENT=m +CONFIG_SND_YMFPCI=m +CONFIG_SND_ALS4000=m +CONFIG_SND_CMIPCI=m +CONFIG_SND_ENS1370=m +CONFIG_SND_ENS1371=m +CONFIG_SND_ES1938=m +CONFIG_SND_ES1968=m +CONFIG_SND_MAESTRO3=m +CONFIG_SND_FM801=m +CONFIG_SND_FM801_TEA575X=m +CONFIG_SND_ICE1712=m +CONFIG_SND_ICE1724=m +# CONFIG_SND_INTEL8X0 is not set +# CONFIG_SND_INTEL8X0M is not set +CONFIG_SND_SONICVIBES=m +CONFIG_SND_VIA82XX=m +CONFIG_SND_VX222=m + +# +# ALSA PowerMac devices +# +CONFIG_SND_POWERMAC=m + +# +# ALSA USB devices +# +CONFIG_SND_USB_AUDIO=m + +# +# PCMCIA devices +# + +# +# Open Sound System +# +# CONFIG_SOUND_PRIME is not set + +# +# USB support +# +CONFIG_USB=m +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +CONFIG_USB_BANDWIDTH=y +CONFIG_USB_DYNAMIC_MINORS=y + +# +# USB Host Controller Drivers +# +CONFIG_USB_EHCI_HCD=m +CONFIG_USB_EHCI_SPLIT_ISO=y +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_OHCI_HCD=m +CONFIG_USB_UHCI_HCD=m + +# +# USB Device Class drivers +# +CONFIG_USB_AUDIO=m + +# +# USB Bluetooth TTY can only be used with disabled Bluetooth subsystem +# +CONFIG_USB_MIDI=m +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_RW_DETECT is not set +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_DPCM=y +CONFIG_USB_STORAGE_HP8200e=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y + +# +# USB Human Interface Devices (HID) +# +CONFIG_USB_HID=m +CONFIG_USB_HIDINPUT=y +CONFIG_HID_FF=y +CONFIG_HID_PID=y +CONFIG_LOGITECH_FF=y +CONFIG_THRUSTMASTER_FF=y +CONFIG_USB_HIDDEV=y + +# +# USB HID Boot Protocol drivers +# +# CONFIG_USB_KBD is not set +# CONFIG_USB_MOUSE is not set +CONFIG_USB_AIPTEK=m +CONFIG_USB_WACOM=m +CONFIG_USB_KBTAB=m +CONFIG_USB_POWERMATE=m +CONFIG_USB_MTOUCH=m +CONFIG_USB_EGALAX=m +CONFIG_USB_XPAD=m +CONFIG_USB_ATI_REMOTE=m + +# +# USB Imaging devices +# +CONFIG_USB_MDC800=m +CONFIG_USB_MICROTEK=m +CONFIG_USB_HPUSBSCSI=m + +# +# USB Multimedia devices +# +CONFIG_USB_VICAM=m +CONFIG_USB_DSBR=m +CONFIG_USB_IBMCAM=m +CONFIG_USB_KONICAWC=m +CONFIG_USB_OV511=m +CONFIG_USB_PWC=m +CONFIG_USB_SE401=m +CONFIG_USB_SN9C102=m +CONFIG_USB_STV680=m +CONFIG_USB_W9968CF=m + +# +# USB Network adaptors +# +CONFIG_USB_CATC=m +CONFIG_USB_KAWETH=m +CONFIG_USB_PEGASUS=m +CONFIG_USB_RTL8150=m +CONFIG_USB_USBNET=m + +# +# USB Host-to-Host Cables +# +CONFIG_USB_ALI_M5632=y +CONFIG_USB_AN2720=y +CONFIG_USB_BELKIN=y +CONFIG_USB_GENESYS=y +CONFIG_USB_NET1080=y +CONFIG_USB_PL2301=y + +# +# Intelligent USB Devices/Gadgets +# +CONFIG_USB_ARMLINUX=y +CONFIG_USB_EPSON2888=y +CONFIG_USB_ZAURUS=y +CONFIG_USB_CDCETHER=y + +# +# USB Network Adapters +# +CONFIG_USB_AX8817X=y + +# +# USB port drivers +# + +# +# USB Serial Converter support +# +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_BELKIN=m +# CONFIG_USB_SERIAL_WHITEHEAT is not set +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m +CONFIG_USB_SERIAL_EMPEG=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_VISOR=m +CONFIG_USB_SERIAL_IPAQ=m +CONFIG_USB_SERIAL_IR=m +CONFIG_USB_SERIAL_EDGEPORT=m +CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_KEYSPAN_PDA=m +CONFIG_USB_SERIAL_KEYSPAN=m +CONFIG_USB_SERIAL_KLSI=m +CONFIG_USB_SERIAL_KOBIL_SCT=m +CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_SAFE=m +CONFIG_USB_SERIAL_SAFE_PADDED=y +CONFIG_USB_SERIAL_CYBERJACK=m +CONFIG_USB_SERIAL_XIRCOM=m +CONFIG_USB_SERIAL_OMNINET=m +CONFIG_USB_EZUSB=y + +# +# USB Miscellaneous drivers +# +CONFIG_USB_TIGL=m +CONFIG_USB_AUERSWALD=m +CONFIG_USB_RIO500=m +CONFIG_USB_LEGOTOWER=m +CONFIG_USB_LCD=m +CONFIG_USB_LED=m +CONFIG_USB_CYTHERM=m +CONFIG_USB_SPEEDTOUCH=m +CONFIG_USB_PHIDGETSERVO=m +CONFIG_USB_TEST=m +CONFIG_USB_EAGLE=m + +# +# USB Gadget Support +# +CONFIG_USB_GADGET=m +CONFIG_USB_GADGET_NET2280=y +CONFIG_USB_NET2280=m +# CONFIG_USB_GADGET_PXA2XX is not set +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_SA1100 is not set +# CONFIG_USB_GADGET_DUMMY_HCD is not set +CONFIG_USB_GADGET_DUALSPEED=y +CONFIG_USB_ZERO=m +CONFIG_USB_ETH=m +CONFIG_USB_ETH_RNDIS=y +CONFIG_USB_GADGETFS=m +CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_FILE_STORAGE_TEST=y +CONFIG_USB_G_SERIAL=m + +# +# File systems +# +CONFIG_EXT2_FS=m +# CONFIG_EXT2_FS_XATTR is not set +CONFIG_EXT3_FS=m +CONFIG_EXT3_FS_XATTR=y +# CONFIG_EXT3_FS_POSIX_ACL is not set +# CONFIG_EXT3_FS_SECURITY is not set +CONFIG_JBD=m +# CONFIG_JBD_DEBUG is not set +CONFIG_FS_MBCACHE=m +CONFIG_REISERFS_FS=m +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +CONFIG_REISERFS_FS_XATTR=y +# CONFIG_REISERFS_FS_POSIX_ACL is not set +# CONFIG_REISERFS_FS_SECURITY is not set +CONFIG_JFS_FS=m +# CONFIG_JFS_POSIX_ACL is not set +# CONFIG_JFS_DEBUG is not set +CONFIG_JFS_STATISTICS=y +CONFIG_XFS_FS=m +# CONFIG_XFS_RT is not set +CONFIG_XFS_QUOTA=y +# CONFIG_XFS_SECURITY is not set +CONFIG_XFS_POSIX_ACL=y +CONFIG_MINIX_FS=m +# CONFIG_ROMFS_FS is not set +# CONFIG_QUOTA is not set +CONFIG_QUOTACTL=y +# CONFIG_AUTOFS_FS is not set +CONFIG_AUTOFS4_FS=m + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=m +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_ZISOFS_FS=m +CONFIG_UDF_FS=m +CONFIG_UDF_NLS=y + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +CONFIG_NTFS_FS=m +# CONFIG_NTFS_DEBUG is not set +# CONFIG_NTFS_RW is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_SYSFS=y +CONFIG_DEVFS_FS=y +# CONFIG_DEVFS_MOUNT is not set +# CONFIG_DEVFS_DEBUG is not set +# CONFIG_DEVPTS_FS_XATTR is not set +CONFIG_TMPFS=y +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y + +# +# Miscellaneous filesystems +# +CONFIG_ADFS_FS=m +# CONFIG_ADFS_FS_RW is not set +CONFIG_AFFS_FS=m +CONFIG_ASFS_FS=m +CONFIG_ASFS_RW=y +CONFIG_HFS_FS=m +CONFIG_HFSPLUS_FS=m +CONFIG_BEFS_FS=m +# CONFIG_BEFS_DEBUG is not set +CONFIG_BFS_FS=m +CONFIG_EFS_FS=m +CONFIG_CRAMFS=y +CONFIG_VXFS_FS=m +CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +# CONFIG_QNX4FS_RW is not set +CONFIG_SYSV_FS=m +CONFIG_UFS_FS=m +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=m +CONFIG_NFS_V3=y +CONFIG_NFS_V4=y +# CONFIG_NFS_DIRECTIO is not set +CONFIG_NFSD=m +CONFIG_NFSD_V3=y +CONFIG_NFSD_V4=y +CONFIG_NFSD_TCP=y +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=m +CONFIG_SUNRPC=m +CONFIG_SUNRPC_GSS=m +CONFIG_RPCSEC_GSS_KRB5=m +CONFIG_SMB_FS=m +CONFIG_SMB_NLS_DEFAULT=y +CONFIG_SMB_NLS_REMOTE="iso8859-1" +CONFIG_CIFS=m +# CONFIG_CIFS_STATS is not set +# CONFIG_CIFS_XATTR is not set +# CONFIG_CIFS_POSIX is not set +CONFIG_NCP_FS=m +# CONFIG_NCPFS_PACKET_SIGNING is not set +# CONFIG_NCPFS_IOCTL_LOCKING is not set +# CONFIG_NCPFS_STRONG is not set +CONFIG_NCPFS_NFS_NS=y +CONFIG_NCPFS_OS2_NS=y +# CONFIG_NCPFS_SMALLDOS is not set +CONFIG_NCPFS_NLS=y +CONFIG_NCPFS_EXTRAS=y +CONFIG_CODA_FS=m +# CONFIG_CODA_FS_OLD_API is not set +CONFIG_AFS_FS=m +CONFIG_RXRPC=m + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +# CONFIG_OSF_PARTITION is not set +CONFIG_AMIGA_PARTITION=y +# CONFIG_ATARI_PARTITION is not set +CONFIG_MAC_PARTITION=y +CONFIG_MSDOS_PARTITION=y +# CONFIG_BSD_DISKLABEL is not set +# CONFIG_MINIX_SUBPARTITION is not set +# CONFIG_SOLARIS_X86_PARTITION is not set +# CONFIG_UNIXWARE_DISKLABEL is not set +# CONFIG_LDM_PARTITION is not set +# CONFIG_SGI_PARTITION is not set +# CONFIG_ULTRIX_PARTITION is not set +# CONFIG_SUN_PARTITION is not set +# CONFIG_EFI_PARTITION is not set + +# +# Native Language Support +# +CONFIG_NLS=m +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=m +CONFIG_NLS_CODEPAGE_737=m +CONFIG_NLS_CODEPAGE_775=m +CONFIG_NLS_CODEPAGE_850=m +CONFIG_NLS_CODEPAGE_852=m +CONFIG_NLS_CODEPAGE_855=m +CONFIG_NLS_CODEPAGE_857=m +CONFIG_NLS_CODEPAGE_860=m +CONFIG_NLS_CODEPAGE_861=m +CONFIG_NLS_CODEPAGE_862=m +CONFIG_NLS_CODEPAGE_863=m +CONFIG_NLS_CODEPAGE_864=m +CONFIG_NLS_CODEPAGE_865=m +CONFIG_NLS_CODEPAGE_866=m +CONFIG_NLS_CODEPAGE_869=m +CONFIG_NLS_CODEPAGE_936=m +CONFIG_NLS_CODEPAGE_950=m +CONFIG_NLS_CODEPAGE_932=m +CONFIG_NLS_CODEPAGE_949=m +CONFIG_NLS_CODEPAGE_874=m +CONFIG_NLS_ISO8859_8=m +CONFIG_NLS_CODEPAGE_1250=m +CONFIG_NLS_CODEPAGE_1251=m +CONFIG_NLS_ASCII=m +CONFIG_NLS_ISO8859_1=m +CONFIG_NLS_ISO8859_2=m +CONFIG_NLS_ISO8859_3=m +CONFIG_NLS_ISO8859_4=m +CONFIG_NLS_ISO8859_5=m +CONFIG_NLS_ISO8859_6=m +CONFIG_NLS_ISO8859_7=m +CONFIG_NLS_ISO8859_9=m +CONFIG_NLS_ISO8859_13=m +CONFIG_NLS_ISO8859_14=m +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_KOI8_R=m +CONFIG_NLS_KOI8_U=m +CONFIG_NLS_UTF8=m + +# +# Library routines +# +CONFIG_CRC_CCITT=m +CONFIG_CRC32=m +CONFIG_LIBCRC32C=m +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=m + +# +# Profiling support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=m + +# +# Kernel hacking +# +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_SLAB is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_HIGHMEM is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_XMON is not set +# CONFIG_BDI_SWITCH is not set +# CONFIG_DEBUG_INFO is not set +CONFIG_BOOTX_TEXT=y + +# +# Security options +# +# CONFIG_SECURITY is not set + +# +# Cryptographic options +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_SHA1=m +CONFIG_CRYPTO_SHA256=m +CONFIG_CRYPTO_SHA512=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_KHAZAD=m +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_MICHAEL_MIC=m +CONFIG_CRYPTO_CRC32C=m +CONFIG_CRYPTO_TEST=m --- linux-source-2.6.8.1-2.6.8.1.orig/debian/config/powerpc/powerpc-smp +++ linux-source-2.6.8.1-2.6.8.1/debian/config/powerpc/powerpc-smp @@ -0,0 +1,2077 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_MMU=y +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_HAVE_DEC_LOCK=y +CONFIG_PPC=y +CONFIG_PPC32=y +CONFIG_GENERIC_NVRAM=y + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +CONFIG_CLEAN_COMPILE=y + +# +# General setup +# +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_BSD_PROCESS_ACCT=y +# CONFIG_BSD_PROCESS_ACCT_V3 is not set +CONFIG_SYSCTL=y +CONFIG_AUDIT=y +CONFIG_LOG_BUF_SHIFT=15 +CONFIG_HOTPLUG=y +# CONFIG_IKCONFIG is not set +# CONFIG_EMBEDDED is not set +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_OBSOLETE_MODPARM=y +CONFIG_MODVERSIONS=y +CONFIG_KMOD=y +CONFIG_STOP_MACHINE=y + +# +# Processor +# +CONFIG_6xx=y +# CONFIG_40x is not set +# CONFIG_44x is not set +# CONFIG_POWER3 is not set +# CONFIG_POWER4 is not set +# CONFIG_8xx is not set +# CONFIG_E500 is not set +CONFIG_ALTIVEC=y +CONFIG_TAU=y +# CONFIG_TAU_INT is not set +# CONFIG_TAU_AVERAGE is not set +# CONFIG_CPU_FREQ is not set +CONFIG_PPC601_SYNC_FIX=y +CONFIG_PM=y +CONFIG_PPC_STD_MMU=y + +# +# Platform options +# +CONFIG_PPC_MULTIPLATFORM=y +# CONFIG_APUS is not set +# CONFIG_WILLOW is not set +# CONFIG_PCORE is not set +# CONFIG_POWERPMC250 is not set +# CONFIG_EV64260 is not set +# CONFIG_SPRUCE is not set +# CONFIG_LOPEC is not set +# CONFIG_MCPN765 is not set +# CONFIG_MVME5100 is not set +# CONFIG_PPLUS is not set +# CONFIG_PRPMC750 is not set +# CONFIG_PRPMC800 is not set +# CONFIG_SANDPOINT is not set +# CONFIG_ADIR is not set +# CONFIG_K2 is not set +# CONFIG_PAL4 is not set +# CONFIG_GEMINI is not set +# CONFIG_EST8260 is not set +# CONFIG_SBC82xx is not set +# CONFIG_SBS8260 is not set +# CONFIG_RPX8260 is not set +# CONFIG_TQM8260 is not set +# CONFIG_ADS8272 is not set +# CONFIG_LITE5200 is not set +CONFIG_PPC_CHRP=y +CONFIG_PPC_PMAC=y +CONFIG_PPC_PREP=y +CONFIG_PPC_OF=y +CONFIG_PPCBUG_NVRAM=y +CONFIG_SMP=y +# CONFIG_IRQ_ALL_CPUS is not set +CONFIG_NR_CPUS=32 +# CONFIG_PREEMPT is not set +CONFIG_HIGHMEM=y +CONFIG_KERNEL_ELF=y +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_MISC=m +CONFIG_PROC_DEVICETREE=y +CONFIG_PREP_RESIDUAL=y +CONFIG_PROC_PREPRESIDUAL=y +CONFIG_CMDLINE_BOOL=y +CONFIG_CMDLINE="console=ttyS0,9600 console=tty0 root=/dev/sda2" + +# +# Bus options +# +# CONFIG_ISA is not set +CONFIG_GENERIC_ISA_DMA=y +CONFIG_PCI=y +CONFIG_PCI_DOMAINS=y +CONFIG_PCI_LEGACY_PROC=y +CONFIG_PCI_NAMES=y + +# +# PCMCIA/CardBus support +# +CONFIG_PCMCIA=m +# CONFIG_PCMCIA_DEBUG is not set +CONFIG_YENTA=m +CONFIG_CARDBUS=y +CONFIG_PD6729=m +CONFIG_I82092=m +CONFIG_TCIC=m + +# +# Advanced setup +# +# CONFIG_ADVANCED_OPTIONS is not set + +# +# Default settings for advanced configuration options are used +# +CONFIG_HIGHMEM_START=0xfe000000 +CONFIG_LOWMEM_SIZE=0x30000000 +CONFIG_KERNEL_START=0xc0000000 +CONFIG_TASK_SIZE=0x80000000 +CONFIG_BOOT_LOAD=0x00800000 + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=m +# CONFIG_DEBUG_DRIVER is not set + +# +# Memory Technology Devices (MTD) +# +# CONFIG_MTD is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Plug and Play support +# + +# +# Block devices +# +CONFIG_BLK_DEV_FD=m +# CONFIG_MAC_FLOPPY is not set +CONFIG_BLK_CPQ_DA=m +CONFIG_BLK_CPQ_CISS_DA=m +CONFIG_CISS_SCSI_TAPE=y +CONFIG_BLK_DEV_DAC960=m +CONFIG_BLK_DEV_UMEM=m +CONFIG_BLK_DEV_LOOP=m +CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_SX8=m +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_BLK_DEV_INITRD=y +CONFIG_LBD=y + +# +# ATA/ATAPI/MFM/RLL support +# +CONFIG_IDE=y +CONFIG_BLK_DEV_IDE=y + +# +# Please see Documentation/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_IDE_SATA is not set +CONFIG_BLK_DEV_IDEDISK=m +# CONFIG_IDEDISK_MULTI_MODE is not set +CONFIG_BLK_DEV_IDECS=m +CONFIG_BLK_DEV_IDECD=m +CONFIG_BLK_DEV_IDETAPE=m +CONFIG_BLK_DEV_IDEFLOPPY=m +CONFIG_BLK_DEV_IDESCSI=m +# CONFIG_IDE_TASK_IOCTL is not set +# CONFIG_IDE_TASKFILE_IO is not set + +# +# IDE chipset support/bugfixes +# +# CONFIG_IDE_GENERIC is not set +CONFIG_BLK_DEV_IDEPCI=y +CONFIG_IDEPCI_SHARE_IRQ=y +# CONFIG_BLK_DEV_OFFBOARD is not set +CONFIG_BLK_DEV_GENERIC=m +# CONFIG_BLK_DEV_OPTI621 is not set +CONFIG_BLK_DEV_SL82C105=m +CONFIG_BLK_DEV_IDEDMA_PCI=y +# CONFIG_BLK_DEV_IDEDMA_FORCED is not set +CONFIG_IDEDMA_PCI_AUTO=y +CONFIG_IDEDMA_ONLYDISK=y +CONFIG_BLK_DEV_ADMA=y +CONFIG_BLK_DEV_AEC62XX=m +# CONFIG_BLK_DEV_ALI15X3 is not set +# CONFIG_BLK_DEV_AMD74XX is not set +CONFIG_BLK_DEV_CMD64X=m +# CONFIG_BLK_DEV_TRIFLEX is not set +# CONFIG_BLK_DEV_CY82C693 is not set +# CONFIG_BLK_DEV_CS5520 is not set +# CONFIG_BLK_DEV_CS5530 is not set +CONFIG_BLK_DEV_HPT34X=m +# CONFIG_HPT34X_AUTODMA is not set +CONFIG_BLK_DEV_HPT366=m +CONFIG_BLK_DEV_SC1200=m +# CONFIG_BLK_DEV_PIIX is not set +CONFIG_BLK_DEV_NS87415=m +CONFIG_BLK_DEV_PDC202XX_OLD=m +# CONFIG_PDC202XX_BURST is not set +CONFIG_BLK_DEV_PDC202XX_NEW=m +CONFIG_PDC202XX_FORCE=y +# CONFIG_BLK_DEV_SVWKS is not set +CONFIG_BLK_DEV_SIIMAGE=m +# CONFIG_BLK_DEV_SLC90E66 is not set +CONFIG_BLK_DEV_TRM290=m +CONFIG_BLK_DEV_VIA82CXXX=m +CONFIG_BLK_DEV_IDE_PMAC=y +CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y +CONFIG_BLK_DEV_IDEDMA_PMAC=y +# CONFIG_BLK_DEV_IDE_PMAC_BLINK is not set +CONFIG_BLK_DEV_IDEDMA_PMAC_AUTO=y +# CONFIG_IDE_ARM is not set +CONFIG_BLK_DEV_IDEDMA=y +# CONFIG_IDEDMA_IVB is not set +CONFIG_IDEDMA_AUTO=y +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +CONFIG_SCSI=m +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +CONFIG_CHR_DEV_ST=m +CONFIG_CHR_DEV_OSST=m +CONFIG_BLK_DEV_SR=m +CONFIG_BLK_DEV_SR_VENDOR=y +CONFIG_CHR_DEV_SG=m +CONFIG_CHR_DEV_SCH=m + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y + +# +# SCSI Transport Attributes +# +CONFIG_SCSI_SPI_ATTRS=m +CONFIG_SCSI_FC_ATTRS=m + +# +# SCSI low-level drivers +# +CONFIG_BLK_DEV_3W_XXXX_RAID=m +CONFIG_SCSI_3W_9XXX=m +CONFIG_SCSI_ACARD=m +CONFIG_SCSI_AACRAID=m +CONFIG_SCSI_AIC7XXX=m +CONFIG_AIC7XXX_CMDS_PER_DEVICE=32 +CONFIG_AIC7XXX_RESET_DELAY_MS=15000 +# CONFIG_AIC7XXX_BUILD_FIRMWARE is not set +CONFIG_AIC7XXX_DEBUG_ENABLE=y +CONFIG_AIC7XXX_DEBUG_MASK=0 +CONFIG_AIC7XXX_REG_PRETTY_PRINT=y +CONFIG_SCSI_AIC7XXX_OLD=m +CONFIG_SCSI_AIC79XX=m +CONFIG_AIC79XX_CMDS_PER_DEVICE=32 +CONFIG_AIC79XX_RESET_DELAY_MS=15000 +# CONFIG_AIC79XX_BUILD_FIRMWARE is not set +# CONFIG_AIC79XX_ENABLE_RD_STRM is not set +CONFIG_AIC79XX_DEBUG_ENABLE=y +CONFIG_AIC79XX_DEBUG_MASK=0 +CONFIG_AIC79XX_REG_PRETTY_PRINT=y +CONFIG_SCSI_DPT_I2O=m +CONFIG_SCSI_MEGARAID=m +CONFIG_SCSI_SATA=y +CONFIG_SCSI_SATA_SVW=m +# CONFIG_SCSI_ATA_PIIX is not set +# CONFIG_SCSI_SATA_NV is not set +CONFIG_SCSI_SATA_PROMISE=m +CONFIG_SCSI_SATA_SX4=m +CONFIG_SCSI_SATA_SIL=m +CONFIG_SCSI_SATA_SIS=m +CONFIG_SCSI_SATA_VIA=m +CONFIG_SCSI_SATA_VITESSE=m +CONFIG_SCSI_BUSLOGIC=m +# CONFIG_SCSI_OMIT_FLASHPOINT is not set +CONFIG_SCSI_DMX3191D=m +CONFIG_SCSI_EATA=m +# CONFIG_SCSI_EATA_TAGGED_QUEUE is not set +# CONFIG_SCSI_EATA_LINKED_COMMANDS is not set +CONFIG_SCSI_EATA_MAX_TAGS=16 +CONFIG_SCSI_EATA_PIO=m +CONFIG_SCSI_FUTURE_DOMAIN=m +# CONFIG_SCSI_GDTH is not set +CONFIG_SCSI_IPS=m +CONFIG_SCSI_INIA100=m +CONFIG_SCSI_SYM53C8XX_2=m +CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 +CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 +CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 +# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set +CONFIG_SCSI_IPR=m +# CONFIG_SCSI_IPR_TRACE is not set +# CONFIG_SCSI_IPR_DUMP is not set +CONFIG_SCSI_QLOGIC_ISP=m +CONFIG_SCSI_QLOGIC_FC=m +# CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set +CONFIG_SCSI_QLOGIC_1280=m +CONFIG_SCSI_DC395x=m +CONFIG_SCSI_DC390T=m +CONFIG_SCSI_NSP32=m +# CONFIG_SCSI_DEBUG is not set +CONFIG_SCSI_MESH=m +CONFIG_SCSI_MESH_SYNC_RATE=5 +CONFIG_SCSI_MESH_RESET_DELAY_MS=4000 +CONFIG_SCSI_MAC53C94=m + +# +# PCMCIA SCSI adapter support +# +CONFIG_PCMCIA_AHA152X=m +CONFIG_PCMCIA_FDOMAIN=m +CONFIG_PCMCIA_NINJA_SCSI=m +CONFIG_PCMCIA_QLOGIC=m +CONFIG_PCMCIA_SYM53C500=m + +# +# Multi-device support (RAID and LVM) +# +CONFIG_MD=y +CONFIG_BLK_DEV_MD=m +CONFIG_MD_LINEAR=m +CONFIG_MD_RAID0=m +CONFIG_MD_RAID1=m +CONFIG_MD_RAID5=m +CONFIG_MD_RAID6=m +CONFIG_MD_MULTIPATH=m +CONFIG_BLK_DEV_DM=m +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=m +CONFIG_DM_MIRROR=m +CONFIG_DM_ZERO=m + +# +# Fusion MPT device support +# +CONFIG_FUSION=m +CONFIG_FUSION_MAX_SGE=40 +CONFIG_FUSION_ISENSE=m +CONFIG_FUSION_CTL=m +# CONFIG_FUSION_LAN is not set + +# +# IEEE 1394 (FireWire) support +# +CONFIG_IEEE1394=m + +# +# Subsystem Options +# +# CONFIG_IEEE1394_VERBOSEDEBUG is not set +CONFIG_IEEE1394_OUI_DB=y +CONFIG_IEEE1394_EXTRA_CONFIG_ROMS=y +CONFIG_IEEE1394_CONFIG_ROM_IP1394=y + +# +# Device Drivers +# +CONFIG_IEEE1394_PCILYNX=m +CONFIG_IEEE1394_OHCI1394=m + +# +# Protocol Drivers +# +CONFIG_IEEE1394_VIDEO1394=m +CONFIG_IEEE1394_SBP2=m +CONFIG_IEEE1394_SBP2_PHYS_DMA=y +CONFIG_IEEE1394_ETH1394=m +CONFIG_IEEE1394_DV1394=m +CONFIG_IEEE1394_RAWIO=m +CONFIG_IEEE1394_CMP=m +CONFIG_IEEE1394_AMDTP=m + +# +# I2O device support +# +CONFIG_I2O=m +CONFIG_I2O_CONFIG=m +CONFIG_I2O_BLOCK=m +CONFIG_I2O_SCSI=m +CONFIG_I2O_PROC=m + +# +# Macintosh device drivers +# +CONFIG_ADB=y +CONFIG_ADB_CUDA=y +CONFIG_ADB_PMU=y +CONFIG_PMAC_PBOOK=y +CONFIG_PMAC_APM_EMU=m +CONFIG_PMAC_BACKLIGHT=y +CONFIG_ADB_MACIO=y +CONFIG_INPUT_ADBHID=y +CONFIG_MAC_EMUMOUSEBTN=y +CONFIG_THERM_WINDTUNNEL=m +CONFIG_THERM_ADT746X=m +CONFIG_ANSLCD=m + +# +# Networking support +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=m +# CONFIG_PACKET_MMAP is not set +CONFIG_NETLINK_DEV=m +CONFIG_UNIX=m +CONFIG_NET_KEY=m +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_FWMARK=y +CONFIG_IP_ROUTE_NAT=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_TOS=y +CONFIG_IP_ROUTE_VERBOSE=y +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE=m +CONFIG_NET_IPGRE_BROADCAST=y +CONFIG_IP_MROUTE=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +CONFIG_ARPD=y +# CONFIG_SYN_COOKIES is not set +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +CONFIG_INET_IPCOMP=m + +# +# IP: Virtual Server Configuration +# +CONFIG_IP_VS=m +# CONFIG_IP_VS_DEBUG is not set +CONFIG_IP_VS_TAB_BITS=12 + +# +# IPVS transport protocol load balancing support +# +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_PROTO_ESP=y +CONFIG_IP_VS_PROTO_AH=y + +# +# IPVS scheduler +# +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_WRR=m +CONFIG_IP_VS_LC=m +CONFIG_IP_VS_WLC=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m + +# +# IPVS application helper +# +CONFIG_IP_VS_FTP=m +CONFIG_IPV6=m +CONFIG_IPV6_PRIVACY=y +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +CONFIG_INET6_IPCOMP=m +CONFIG_IPV6_TUNNEL=m +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_BRIDGE_NETFILTER=y + +# +# IP: Netfilter Configuration +# +CONFIG_IP_NF_CONNTRACK=m +CONFIG_IP_NF_FTP=m +CONFIG_IP_NF_IRC=m +CONFIG_IP_NF_TFTP=m +CONFIG_IP_NF_AMANDA=m +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_LIMIT=m +# CONFIG_IP_NF_MATCH_IPRANGE is not set +CONFIG_IP_NF_MATCH_MAC=m +CONFIG_IP_NF_MATCH_PKTTYPE=m +CONFIG_IP_NF_MATCH_MARK=m +CONFIG_IP_NF_MATCH_MULTIPORT=m +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_DSCP=m +# CONFIG_IP_NF_MATCH_AH_ESP is not set +CONFIG_IP_NF_MATCH_LENGTH=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_TCPMSS=m +CONFIG_IP_NF_MATCH_HELPER=m +CONFIG_IP_NF_MATCH_STATE=m +CONFIG_IP_NF_MATCH_CONNTRACK=m +CONFIG_IP_NF_MATCH_OWNER=m +# CONFIG_IP_NF_MATCH_PHYSDEV is not set +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_REDIRECT=m +# CONFIG_IP_NF_TARGET_NETMAP is not set +# CONFIG_IP_NF_TARGET_SAME is not set +CONFIG_IP_NF_NAT_LOCAL=y +CONFIG_IP_NF_NAT_SNMP_BASIC=m +CONFIG_IP_NF_NAT_IRC=m +CONFIG_IP_NF_NAT_FTP=m +CONFIG_IP_NF_NAT_TFTP=m +CONFIG_IP_NF_NAT_AMANDA=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_DSCP=m +CONFIG_IP_NF_TARGET_MARK=m +# CONFIG_IP_NF_TARGET_CLASSIFY is not set +CONFIG_IP_NF_TARGET_LOG=m +# CONFIG_IP_NF_TARGET_ULOG is not set +CONFIG_IP_NF_TARGET_TCPMSS=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +# CONFIG_IP_NF_COMPAT_IPCHAINS is not set +# CONFIG_IP_NF_COMPAT_IPFWADM is not set +CONFIG_IP_NF_TARGET_NOTRACK=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_MATCH_ADDRTYPE=m +CONFIG_IP_NF_MATCH_REALM=m + +# +# IPv6: Netfilter Configuration +# +# CONFIG_IP6_NF_QUEUE is not set +# CONFIG_IP6_NF_IPTABLES is not set + +# +# DECnet: Netfilter Configuration +# +# CONFIG_DECNET_NF_GRABULATOR is not set + +# +# Bridge: Netfilter Configuration +# +# CONFIG_BRIDGE_NF_EBTABLES is not set +CONFIG_XFRM=y +CONFIG_XFRM_USER=m + +# +# SCTP Configuration (EXPERIMENTAL) +# +CONFIG_IP_SCTP=m +# CONFIG_SCTP_DBG_MSG is not set +# CONFIG_SCTP_DBG_OBJCNT is not set +# CONFIG_SCTP_HMAC_NONE is not set +# CONFIG_SCTP_HMAC_SHA1 is not set +CONFIG_SCTP_HMAC_MD5=y +CONFIG_ATM=m +CONFIG_ATM_CLIP=m +CONFIG_ATM_CLIP_NO_ICMP=y +CONFIG_ATM_LANE=m +CONFIG_ATM_MPOA=m +CONFIG_ATM_BR2684=m +# CONFIG_ATM_BR2684_IPFILTER is not set +CONFIG_BRIDGE=m +CONFIG_VLAN_8021Q=m +CONFIG_DECNET=m +CONFIG_DECNET_SIOCGIFCONF=y +CONFIG_DECNET_ROUTER=y +CONFIG_DECNET_ROUTE_FWMARK=y +CONFIG_LLC=y +CONFIG_LLC2=m +CONFIG_IPX=m +CONFIG_IPX_INTERN=y +CONFIG_ATALK=m +CONFIG_DEV_APPLETALK=y +CONFIG_IPDDP=m +CONFIG_IPDDP_ENCAP=y +CONFIG_IPDDP_DECAP=y +CONFIG_X25=m +CONFIG_LAPB=m +CONFIG_NET_DIVERT=y +CONFIG_ECONET=m +CONFIG_ECONET_AUNUDP=y +CONFIG_ECONET_NATIVE=y +CONFIG_WAN_ROUTER=m +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_CLK_JIFFIES=y +# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set +# CONFIG_NET_SCH_CLK_CPU is not set +CONFIG_NET_SCH_CBQ=m +CONFIG_NET_SCH_HTB=m +CONFIG_NET_SCH_HFSC=m +CONFIG_NET_SCH_ATM=m +CONFIG_NET_SCH_PRIO=m +CONFIG_NET_SCH_RED=m +CONFIG_NET_SCH_SFQ=m +CONFIG_NET_SCH_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_NETEM=m +CONFIG_NET_SCH_INGRESS=m +CONFIG_NET_QOS=y +CONFIG_NET_ESTIMATOR=y +CONFIG_NET_CLS=y +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_ROUTE=y +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +# CONFIG_CLS_U32_PERF is not set +# CONFIG_NET_CLS_IND is not set +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +# CONFIG_NET_CLS_ACT is not set +CONFIG_NET_CLS_POLICE=y + +# +# Network testing +# +CONFIG_NET_PKTGEN=m +CONFIG_NETPOLL=y +CONFIG_NETPOLL_RX=y +CONFIG_NETPOLL_TRAP=y +CONFIG_NET_POLL_CONTROLLER=y +CONFIG_HAMRADIO=y + +# +# Packet Radio protocols +# +CONFIG_AX25=m +CONFIG_AX25_DAMA_SLAVE=y +CONFIG_NETROM=m +CONFIG_ROSE=m + +# +# AX.25 network device drivers +# +CONFIG_BPQETHER=m +CONFIG_BAYCOM_SER_FDX=m +CONFIG_BAYCOM_SER_HDX=m +CONFIG_YAM=m +CONFIG_IRDA=m + +# +# IrDA protocols +# +CONFIG_IRLAN=m +CONFIG_IRNET=m +CONFIG_IRCOMM=m +CONFIG_IRDA_ULTRA=y + +# +# IrDA options +# +CONFIG_IRDA_CACHE_LAST_LSAP=y +CONFIG_IRDA_FAST_RR=y +CONFIG_IRDA_DEBUG=y + +# +# Infrared-port device drivers +# + +# +# SIR device drivers +# +CONFIG_IRTTY_SIR=m + +# +# Dongle support +# +# CONFIG_DONGLE is not set + +# +# Old SIR device drivers +# + +# +# Old Serial dongle support +# + +# +# FIR device drivers +# +# CONFIG_USB_IRDA is not set +# CONFIG_SIGMATEL_FIR is not set +# CONFIG_TOSHIBA_FIR is not set +# CONFIG_VLSI_FIR is not set +CONFIG_BT=m +CONFIG_BT_L2CAP=m +CONFIG_BT_SCO=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_CMTP=m +CONFIG_BT_HIDP=m + +# +# Bluetooth device drivers +# +CONFIG_BT_HCIUSB=m +CONFIG_BT_HCIUSB_SCO=y +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_H4=y +CONFIG_BT_HCIUART_BCSP=y +CONFIG_BT_HCIUART_BCSP_TXCRC=y +CONFIG_BT_HCIBCM203X=m +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIDTL1=m +CONFIG_BT_HCIBT3C=m +CONFIG_BT_HCIBLUECARD=m +CONFIG_BT_HCIBTUART=m +CONFIG_BT_HCIVHCI=m +CONFIG_NETDEVICES=y +CONFIG_DUMMY=m +CONFIG_BONDING=m +CONFIG_EQUALIZER=m +CONFIG_TUN=m +CONFIG_ETHERTAP=m + +# +# ARCnet devices +# +CONFIG_ARCNET=m +CONFIG_ARCNET_1201=m +CONFIG_ARCNET_1051=m +CONFIG_ARCNET_RAW=m +CONFIG_ARCNET_COM90xx=m +CONFIG_ARCNET_COM90xxIO=m +CONFIG_ARCNET_RIM_I=m +CONFIG_ARCNET_COM20020=m +CONFIG_ARCNET_COM20020_PCI=m + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +CONFIG_MII=y +CONFIG_MACE=m +# CONFIG_MACE_AAUI_PORT is not set +CONFIG_BMAC=m +CONFIG_HAPPYMEAL=m +CONFIG_SUNGEM=m +CONFIG_NET_VENDOR_3COM=y +CONFIG_VORTEX=m +CONFIG_TYPHOON=m + +# +# Tulip family network device support +# +CONFIG_NET_TULIP=y +CONFIG_DE2104X=m +CONFIG_TULIP=m +# CONFIG_TULIP_MWI is not set +# CONFIG_TULIP_MMIO is not set +# CONFIG_TULIP_NAPI is not set +CONFIG_DE4X5=m +CONFIG_WINBOND_840=m +CONFIG_DM9102=m +CONFIG_PCMCIA_XIRCOM=m +CONFIG_HP100=m +CONFIG_NET_PCI=y +CONFIG_PCNET32=m +# CONFIG_AMD8111_ETH is not set +CONFIG_ADAPTEC_STARFIRE=m +# CONFIG_ADAPTEC_STARFIRE_NAPI is not set +CONFIG_B44=m +# CONFIG_FORCEDETH is not set +CONFIG_EEPRO100=m +# CONFIG_EEPRO100_PIO is not set +CONFIG_E100=m +# CONFIG_E100_NAPI is not set +CONFIG_FEALNX=m +CONFIG_NATSEMI=m +CONFIG_NE2K_PCI=m +CONFIG_8139CP=m +CONFIG_8139TOO=m +CONFIG_8139TOO_PIO=y +# CONFIG_8139TOO_TUNE_TWISTER is not set +CONFIG_8139TOO_8129=y +# CONFIG_8139_OLD_RX_RESET is not set +CONFIG_SIS900=m +CONFIG_EPIC100=m +CONFIG_SUNDANCE=m +CONFIG_SUNDANCE_MMIO=y +CONFIG_TLAN=m +CONFIG_VIA_RHINE=m +CONFIG_VIA_RHINE_MMIO=y +CONFIG_VIA_VELOCITY=m + +# +# Ethernet (1000 Mbit) +# +CONFIG_DL2K=m +CONFIG_E1000=m +# CONFIG_E1000_NAPI is not set +CONFIG_NS83820=m +CONFIG_HAMACHI=m +CONFIG_YELLOWFIN=m +CONFIG_R8169=m +CONFIG_SK98LIN=m +CONFIG_TIGON3=m +CONFIG_MV64340_ETH=m +# CONFIG_MV64340_ETH_0 is not set +CONFIG_MV64340_ETH_1=y +# CONFIG_MV64340_ETH_2 is not set + +# +# Ethernet (10000 Mbit) +# +CONFIG_IXGB=m +# CONFIG_IXGB_NAPI is not set +CONFIG_S2IO=m +# CONFIG_S2IO_NAPI is not set + +# +# Token Ring devices +# +CONFIG_TR=y +CONFIG_IBMOL=m +CONFIG_IBMLS=m +CONFIG_3C359=m +CONFIG_TMS380TR=m +CONFIG_TMSPCI=m +CONFIG_ABYSS=m + +# +# Wireless LAN (non-hamradio) +# +CONFIG_NET_RADIO=y + +# +# Obsolete Wireless cards support (pre-802.11) +# +CONFIG_STRIP=m +CONFIG_PCMCIA_WAVELAN=m +CONFIG_PCMCIA_NETWAVE=m + +# +# Wireless 802.11 Frequency Hopping cards support +# +CONFIG_PCMCIA_RAYCS=m + +# +# Wireless 802.11b ISA/PCI cards support +# +CONFIG_IEEE80211=m +# CONFIG_IEEE80211_DEBUG is not set +CONFIG_IEEE80211_CRYPT=m +CONFIG_IEEE80211_WPA=y +CONFIG_IEEE80211_CRYPT_CCMP=m +CONFIG_IEEE80211_CRYPT_TKIP=m +CONFIG_IPW2100=m +# CONFIG_IPW2100_PROMISC is not set +# CONFIG_IPW2100_LEGACY_FW_LOAD is not set +# CONFIG_IPW2100_NOWEP is not set +# CONFIG_IPW2100_DEBUG is not set +CONFIG_IPW2200=m +# CONFIG_IPW2200_NOWEP is not set +CONFIG_WLAN_NG=m +CONFIG_PRISM2=m +CONFIG_PRISM2_USB=m +CONFIG_ACX100=m +CONFIG_ADM8211=m +CONFIG_HERMES=m +CONFIG_APPLE_AIRPORT=m +CONFIG_PLX_HERMES=m +CONFIG_TMD_HERMES=m +CONFIG_PCI_HERMES=m +CONFIG_ATMEL=m +# CONFIG_PCI_ATMEL is not set + +# +# Wireless 802.11b Pcmcia/Cardbus cards support +# +CONFIG_PCMCIA_HERMES=m +CONFIG_AIRO_CS=m +CONFIG_PCMCIA_ATMEL=m +CONFIG_PCMCIA_WL3501=m + +# +# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support +# +CONFIG_PRISM54=m +CONFIG_NET_WIRELESS=y + +# +# PCMCIA network device support +# +CONFIG_NET_PCMCIA=y +CONFIG_PCMCIA_3C589=m +CONFIG_PCMCIA_3C574=m +CONFIG_PCMCIA_FMVJ18X=m +CONFIG_PCMCIA_PCNET=m +CONFIG_PCMCIA_NMCLAN=m +CONFIG_PCMCIA_SMC91C92=m +CONFIG_PCMCIA_XIRC2PS=m +CONFIG_PCMCIA_AXNET=m +CONFIG_ARCNET_COM20020_CS=m +CONFIG_PCMCIA_IBMTR=m + +# +# Wan interfaces +# +CONFIG_WAN=y +CONFIG_DSCC4=m +# CONFIG_DSCC4_PCISYNC is not set +# CONFIG_DSCC4_PCI_RST is not set +CONFIG_LANMEDIA=m +CONFIG_SYNCLINK_SYNCPPP=m +CONFIG_HDLC=m +CONFIG_HDLC_RAW=y +CONFIG_HDLC_RAW_ETH=y +CONFIG_HDLC_CISCO=y +CONFIG_HDLC_FR=y +CONFIG_HDLC_PPP=y +CONFIG_HDLC_X25=y +CONFIG_PCI200SYN=m +CONFIG_WANXL=m +CONFIG_PC300=m +CONFIG_PC300_MLPPP=y +CONFIG_FARSYNC=m +CONFIG_DLCI=m +CONFIG_DLCI_COUNT=24 +CONFIG_DLCI_MAX=8 +CONFIG_WAN_ROUTER_DRIVERS=y +CONFIG_CYCLADES_SYNC=m +CONFIG_CYCLOMX_X25=y +CONFIG_LAPBETHER=m +CONFIG_X25_ASY=m + +# +# ATM drivers +# +CONFIG_ATM_TCP=m +CONFIG_ATM_LANAI=m +CONFIG_ATM_ENI=m +# CONFIG_ATM_ENI_DEBUG is not set +# CONFIG_ATM_ENI_TUNE_BURST is not set +CONFIG_ATM_FIRESTREAM=m +CONFIG_ATM_ZATM=m +CONFIG_ATM_ZATM_DEBUG=y +CONFIG_ATM_NICSTAR=m +CONFIG_ATM_NICSTAR_USE_SUNI=y +CONFIG_ATM_NICSTAR_USE_IDT77105=y +CONFIG_ATM_IDT77252=m +# CONFIG_ATM_IDT77252_DEBUG is not set +# CONFIG_ATM_IDT77252_RCV_ALL is not set +CONFIG_ATM_IDT77252_USE_SUNI=y +CONFIG_ATM_AMBASSADOR=m +# CONFIG_ATM_AMBASSADOR_DEBUG is not set +CONFIG_ATM_HORIZON=m +# CONFIG_ATM_HORIZON_DEBUG is not set +CONFIG_ATM_IA=m +# CONFIG_ATM_IA_DEBUG is not set +CONFIG_ATM_FORE200E_MAYBE=m +CONFIG_ATM_FORE200E_PCA=y +CONFIG_ATM_FORE200E_PCA_DEFAULT_FW=y +CONFIG_ATM_FORE200E_USE_TASKLET=y +CONFIG_ATM_FORE200E_TX_RETRY=16 +CONFIG_ATM_FORE200E_DEBUG=0 +CONFIG_ATM_FORE200E=m +CONFIG_ATM_HE=m +# CONFIG_ATM_HE_USE_SUNI is not set +CONFIG_FDDI=y +CONFIG_DEFXX=m +CONFIG_SKFP=m +CONFIG_HIPPI=y +# CONFIG_ROADRUNNER is not set +CONFIG_PPP=m +CONFIG_PPP_MULTILINK=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_MPPE=m +CONFIG_PPPOE=m +CONFIG_PPPOATM=m +CONFIG_SLIP=m +# CONFIG_SLIP_COMPRESSED is not set +# CONFIG_SLIP_SMART is not set +# CONFIG_SLIP_MODE_SLIP6 is not set +CONFIG_NET_FC=y +CONFIG_SHAPER=m +CONFIG_NETCONSOLE=m +# CONFIG_NDISWRAPPER is not set + +# +# ISDN subsystem +# +CONFIG_ISDN=m + +# +# Old ISDN4Linux +# +# CONFIG_ISDN_I4L is not set + +# +# CAPI subsystem +# +CONFIG_ISDN_CAPI=m +# CONFIG_ISDN_DRV_AVMB1_VERBOSE_REASON is not set +CONFIG_ISDN_CAPI_MIDDLEWARE=y +CONFIG_ISDN_CAPI_CAPI20=m +# CONFIG_ISDN_CAPI_CAPIFS_BOOL is not set + +# +# CAPI hardware drivers +# + +# +# Active AVM cards +# +CONFIG_CAPI_AVM=y + +# +# Active Eicon DIVA Server cards +# +CONFIG_CAPI_EICON=y +CONFIG_ISDN_DIVAS=m +CONFIG_ISDN_DIVAS_BRIPCI=y +CONFIG_ISDN_DIVAS_PRIPCI=y +CONFIG_ISDN_DIVAS_DIVACAPI=m +CONFIG_ISDN_DIVAS_USERIDI=m +CONFIG_ISDN_DIVAS_MAINT=m + +# +# Modular ISDN driver +# +# CONFIG_MISDN_DRV is not set + +# +# Telephony Support +# +CONFIG_PHONE=m +CONFIG_PHONE_IXJ=m +CONFIG_PHONE_IXJ_PCMCIA=m + +# +# Input device support +# +CONFIG_INPUT=y + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_MOUSEDEV_PSAUX_ENABLE=y +CONFIG_INPUT_JOYDEV=m +CONFIG_INPUT_TSDEV=m +CONFIG_INPUT_TSDEV_SCREEN_X=240 +CONFIG_INPUT_TSDEV_SCREEN_Y=320 +CONFIG_INPUT_EVDEV=m +CONFIG_INPUT_EVBUG=m + +# +# Input I/O drivers +# +CONFIG_GAMEPORT=m +CONFIG_SOUND_GAMEPORT=m +CONFIG_GAMEPORT_NS558=m +CONFIG_GAMEPORT_L4=m +CONFIG_GAMEPORT_EMU10K1=m +CONFIG_GAMEPORT_VORTEX=m +CONFIG_GAMEPORT_FM801=m +CONFIG_GAMEPORT_CS461x=m +CONFIG_SERIO=m +CONFIG_SERIO_I8042=m +CONFIG_SERIO_SERPORT=m +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PCIPS2 is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +CONFIG_KEYBOARD_ATKBD=m +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +CONFIG_INPUT_MOUSE=y +CONFIG_MOUSE_PS2=m +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_VSXXXAA is not set +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_ANALOG=m +CONFIG_JOYSTICK_A3D=m +CONFIG_JOYSTICK_ADI=m +CONFIG_JOYSTICK_COBRA=m +CONFIG_JOYSTICK_GF2K=m +CONFIG_JOYSTICK_GRIP=m +CONFIG_JOYSTICK_GRIP_MP=m +CONFIG_JOYSTICK_GUILLEMOT=m +CONFIG_JOYSTICK_INTERACT=m +CONFIG_JOYSTICK_SIDEWINDER=m +CONFIG_JOYSTICK_TMDC=m +CONFIG_JOYSTICK_IFORCE=m +CONFIG_JOYSTICK_IFORCE_USB=y +CONFIG_JOYSTICK_IFORCE_232=y +CONFIG_JOYSTICK_WARRIOR=m +CONFIG_JOYSTICK_MAGELLAN=m +CONFIG_JOYSTICK_SPACEORB=m +CONFIG_JOYSTICK_SPACEBALL=m +CONFIG_JOYSTICK_STINGER=m +CONFIG_JOYSTICK_TWIDDLER=m +CONFIG_INPUT_JOYDUMP=m +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_GUNZE=m +CONFIG_INPUT_MISC=y +CONFIG_INPUT_UINPUT=m + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +# CONFIG_SERIAL_8250_CS is not set +CONFIG_SERIAL_8250_NR_UARTS=4 +# CONFIG_SERIAL_8250_EXTENDED is not set + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_SERIAL_PMACZILOG=y +CONFIG_SERIAL_PMACZILOG_CONSOLE=y +CONFIG_UNIX98_PTYS=y +# CONFIG_LEGACY_PTYS is not set +CONFIG_QIC02_TAPE=m +CONFIG_QIC02_DYNCONF=y + +# +# Setting runtime QIC-02 configuration is done with qic02conf +# + +# +# from the tpqic02-support package. It is available at +# + +# +# metalab.unc.edu or ftp://titus.cfw.com/pub/Linux/util/ +# + +# +# IPMI +# +CONFIG_IPMI_HANDLER=m +# CONFIG_IPMI_PANIC_EVENT is not set +CONFIG_IPMI_DEVICE_INTERFACE=m +CONFIG_IPMI_SI=m +CONFIG_IPMI_WATCHDOG=m + +# +# Watchdog Cards +# +CONFIG_WATCHDOG=y +# CONFIG_WATCHDOG_NOWAYOUT is not set + +# +# Watchdog Device Drivers +# +CONFIG_SOFT_WATCHDOG=m + +# +# PCI-based Watchdog Cards +# +CONFIG_PCIPCWATCHDOG=m +CONFIG_WDTPCI=m +CONFIG_WDT_501_PCI=y + +# +# USB-based Watchdog Cards +# +CONFIG_USBPCWATCHDOG=m +CONFIG_NVRAM=y +CONFIG_GEN_RTC=y +CONFIG_GEN_RTC_X=y +CONFIG_DTLK=m +CONFIG_R3964=m +CONFIG_APPLICOM=m + +# +# Ftape, the floppy tape device driver +# +CONFIG_AGP=m +CONFIG_AGP_UNINORTH=m +CONFIG_DRM=y +CONFIG_DRM_TDFX=m +# CONFIG_DRM_GAMMA is not set +CONFIG_DRM_R128=m +CONFIG_DRM_RADEON=m +CONFIG_DRM_MGA=m +CONFIG_DRM_SIS=m + +# +# PCMCIA character devices +# +CONFIG_SYNCLINK_CS=m +# CONFIG_RAW_DRIVER is not set + +# +# I2C support +# +CONFIG_I2C=y +CONFIG_I2C_CHARDEV=m + +# +# I2C Algorithms +# +CONFIG_I2C_ALGOBIT=y +CONFIG_I2C_ALGOPCF=m + +# +# I2C Hardware Bus support +# +# CONFIG_I2C_ALI1535 is not set +# CONFIG_I2C_ALI1563 is not set +# CONFIG_I2C_ALI15X3 is not set +# CONFIG_I2C_AMD756 is not set +# CONFIG_I2C_AMD8111 is not set +CONFIG_I2C_HYDRA=m +# CONFIG_I2C_I801 is not set +# CONFIG_I2C_I810 is not set +CONFIG_I2C_ISA=m +CONFIG_I2C_KEYWEST=y +# CONFIG_I2C_NFORCE2 is not set +CONFIG_I2C_PARPORT_LIGHT=m +# CONFIG_I2C_PIIX4 is not set +CONFIG_I2C_PROSAVAGE=m +CONFIG_I2C_SAVAGE4=m +CONFIG_SCx200_ACB=m +CONFIG_I2C_SIS5595=m +CONFIG_I2C_SIS630=m +CONFIG_I2C_SIS96X=m +CONFIG_I2C_VIA=m +CONFIG_I2C_VIAPRO=m +CONFIG_I2C_VOODOO3=m + +# +# Hardware Sensors Chip support +# +CONFIG_I2C_SENSOR=m +CONFIG_SENSORS_ADM1021=m +CONFIG_SENSORS_ADM1025=m +CONFIG_SENSORS_ADM1031=m +CONFIG_SENSORS_ASB100=m +CONFIG_SENSORS_DS1621=m +CONFIG_SENSORS_FSCHER=m +CONFIG_SENSORS_GL518SM=m +CONFIG_SENSORS_IT87=m +CONFIG_SENSORS_LM75=m +CONFIG_SENSORS_LM77=m +CONFIG_SENSORS_LM78=m +CONFIG_SENSORS_LM80=m +CONFIG_SENSORS_LM83=m +CONFIG_SENSORS_LM85=m +CONFIG_SENSORS_LM90=m +CONFIG_SENSORS_MAX1619=m +CONFIG_SENSORS_VIA686A=m +CONFIG_SENSORS_W83781D=m +CONFIG_SENSORS_W83L785TS=m +CONFIG_SENSORS_W83627HF=m + +# +# Other I2C Chip support +# +CONFIG_SENSORS_EEPROM=m +CONFIG_SENSORS_PCF8574=m +CONFIG_SENSORS_PCF8591=m +CONFIG_SENSORS_RTC8564=m +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# CONFIG_I2C_DEBUG_CHIP is not set + +# +# Dallas's 1-wire bus +# +CONFIG_W1=m +CONFIG_W1_MATROX=m +CONFIG_W1_THERM=m + +# +# Misc devices +# + +# +# Multimedia devices +# +CONFIG_VIDEO_DEV=m + +# +# Video For Linux +# + +# +# Video Adapters +# +CONFIG_VIDEO_BT848=m +CONFIG_VIDEO_CPIA=m +CONFIG_VIDEO_CPIA_USB=m +CONFIG_VIDEO_SAA5246A=m +CONFIG_VIDEO_SAA5249=m +CONFIG_TUNER_3036=m +CONFIG_VIDEO_STRADIS=m +CONFIG_VIDEO_ZORAN=m +CONFIG_VIDEO_ZORAN_BUZ=m +CONFIG_VIDEO_ZORAN_DC10=m +CONFIG_VIDEO_ZORAN_DC30=m +CONFIG_VIDEO_ZORAN_LML33=m +CONFIG_VIDEO_ZORAN_LML33R10=m +CONFIG_VIDEO_SAA7134=m +CONFIG_VIDEO_MXB=m +CONFIG_VIDEO_DPC=m +CONFIG_VIDEO_HEXIUM_ORION=m +CONFIG_VIDEO_HEXIUM_GEMINI=m +CONFIG_VIDEO_CX88=m +CONFIG_VIDEO_OVCAMCHIP=m + +# +# Radio Adapters +# +CONFIG_RADIO_GEMTEK_PCI=m +CONFIG_RADIO_MAXIRADIO=m +CONFIG_RADIO_MAESTRO=m + +# +# Digital Video Broadcasting Devices +# +CONFIG_DVB=y +CONFIG_DVB_CORE=m + +# +# Supported Frontend Modules +# +CONFIG_DVB_TWINHAN_DST=m +CONFIG_DVB_STV0299=m +CONFIG_DVB_SP887X=m +CONFIG_DVB_SP887X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/sc_main.mc" +CONFIG_DVB_ALPS_TDLB7=m +CONFIG_DVB_ALPS_TDMB7=m +CONFIG_DVB_ATMEL_AT76C651=m +CONFIG_DVB_CX24110=m +CONFIG_DVB_GRUNDIG_29504_491=m +CONFIG_DVB_GRUNDIG_29504_401=m +CONFIG_DVB_MT312=m +CONFIG_DVB_VES1820=m +CONFIG_DVB_VES1X93=m +CONFIG_DVB_TDA1004X=m +CONFIG_DVB_TDA1004X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/tda1004x.bin" +CONFIG_DVB_NXT6000=m + +# +# Supported SAA7146 based PCI Adapters +# +CONFIG_DVB_AV7110=m +CONFIG_DVB_AV7110_OSD=y +CONFIG_DVB_BUDGET=m +CONFIG_DVB_BUDGET_CI=m +CONFIG_DVB_BUDGET_AV=m +CONFIG_DVB_BUDGET_PATCH=m + +# +# Supported USB Adapters +# +CONFIG_DVB_TTUSB_BUDGET=m +CONFIG_DVB_TTUSB_DEC=m + +# +# Supported FlexCopII (B2C2) Adapters +# +CONFIG_DVB_B2C2_SKYSTAR=m + +# +# Supported BT878 Adapters +# +CONFIG_DVB_BT8XX=m +CONFIG_VIDEO_SAA7146=m +CONFIG_VIDEO_SAA7146_VV=m +CONFIG_VIDEO_VIDEOBUF=m +CONFIG_VIDEO_TUNER=m +CONFIG_VIDEO_BUF=m +CONFIG_VIDEO_BTCX=m +CONFIG_VIDEO_IR=m + +# +# Graphics support +# +CONFIG_FB=y +CONFIG_FB_CIRRUS=m +# CONFIG_FB_PM2 is not set +# CONFIG_FB_CYBER2000 is not set +CONFIG_FB_OF=y +CONFIG_FB_CONTROL=y +CONFIG_FB_PLATINUM=y +CONFIG_FB_VALKYRIE=y +CONFIG_FB_CT65550=y +# CONFIG_FB_ASILIANT is not set +CONFIG_FB_IMSTT=y +# CONFIG_FB_VGA16 is not set +CONFIG_FB_RIVA=m +CONFIG_FB_RIVA_I2C=y +# CONFIG_FB_RIVA_DEBUG is not set +CONFIG_FB_MATROX=y +CONFIG_FB_MATROX_MILLENIUM=y +CONFIG_FB_MATROX_MYSTIQUE=y +CONFIG_FB_MATROX_G450=y +CONFIG_FB_MATROX_G100=y +CONFIG_FB_MATROX_I2C=m +CONFIG_FB_MATROX_MAVEN=m +CONFIG_FB_MATROX_MULTIHEAD=y +# CONFIG_FB_RADEON_OLD is not set +CONFIG_FB_RADEON=y +CONFIG_FB_RADEON_I2C=y +# CONFIG_FB_RADEON_DEBUG is not set +CONFIG_FB_ATY128=y +CONFIG_FB_ATY=y +CONFIG_FB_ATY_CT=y +CONFIG_FB_ATY_GX=y +# CONFIG_FB_ATY_XL_INIT is not set +CONFIG_FB_SIS=m +CONFIG_FB_SIS_300=y +CONFIG_FB_SIS_315=y +CONFIG_FB_NEOMAGIC=m +CONFIG_FB_KYRO=m +CONFIG_FB_3DFX=y +# CONFIG_FB_3DFX_ACCEL is not set +CONFIG_FB_VOODOO1=y +CONFIG_FB_TRIDENT=m +CONFIG_FB_TRIDENT_ACCEL=y +# CONFIG_FB_VIRTUAL is not set + +# +# Console display driver support +# +# CONFIG_VGA_CONSOLE is not set +# CONFIG_MDA_CONSOLE is not set +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y + +# +# Logo configuration +# +CONFIG_LOGO=y +# CONFIG_LOGO_LINUX_MONO is not set +CONFIG_LOGO_LINUX_VGA16=y +# CONFIG_LOGO_LINUX_CLUT224 is not set + +# +# Sound +# +CONFIG_SOUND=m +CONFIG_DMASOUND_PMAC=m +CONFIG_DMASOUND=m + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=m +CONFIG_SND_TIMER=m +CONFIG_SND_PCM=m +CONFIG_SND_HWDEP=m +CONFIG_SND_RAWMIDI=m +CONFIG_SND_SEQUENCER=m +# CONFIG_SND_SEQ_DUMMY is not set +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=m +CONFIG_SND_PCM_OSS=m +CONFIG_SND_SEQUENCER_OSS=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set + +# +# Generic devices +# +CONFIG_SND_MPU401_UART=m +CONFIG_SND_OPL3_LIB=m +CONFIG_SND_VX_LIB=m +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_VIRMIDI is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set + +# +# PCI devices +# +CONFIG_SND_AC97_CODEC=m +# CONFIG_SND_ALI5451 is not set +CONFIG_SND_ATIIXP=m +CONFIG_SND_AU8810=m +CONFIG_SND_AU8820=m +CONFIG_SND_AU8830=m +CONFIG_SND_AZT3328=m +CONFIG_SND_BT87X=m +CONFIG_SND_CS46XX=m +CONFIG_SND_CS46XX_NEW_DSP=y +CONFIG_SND_CS4281=m +CONFIG_SND_EMU10K1=m +CONFIG_SND_KORG1212=m +CONFIG_SND_MIXART=m +CONFIG_SND_NM256=m +CONFIG_SND_RME32=m +CONFIG_SND_RME96=m +CONFIG_SND_RME9652=m +CONFIG_SND_HDSP=m +CONFIG_SND_TRIDENT=m +CONFIG_SND_YMFPCI=m +CONFIG_SND_ALS4000=m +CONFIG_SND_CMIPCI=m +CONFIG_SND_ENS1370=m +CONFIG_SND_ENS1371=m +CONFIG_SND_ES1938=m +CONFIG_SND_ES1968=m +CONFIG_SND_MAESTRO3=m +CONFIG_SND_FM801=m +CONFIG_SND_FM801_TEA575X=m +CONFIG_SND_ICE1712=m +CONFIG_SND_ICE1724=m +# CONFIG_SND_INTEL8X0 is not set +# CONFIG_SND_INTEL8X0M is not set +CONFIG_SND_SONICVIBES=m +CONFIG_SND_VIA82XX=m +CONFIG_SND_VX222=m + +# +# ALSA PowerMac devices +# +CONFIG_SND_POWERMAC=m + +# +# ALSA USB devices +# +CONFIG_SND_USB_AUDIO=m + +# +# PCMCIA devices +# + +# +# Open Sound System +# +# CONFIG_SOUND_PRIME is not set + +# +# USB support +# +CONFIG_USB=m +# CONFIG_USB_DEBUG is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +CONFIG_USB_BANDWIDTH=y +CONFIG_USB_DYNAMIC_MINORS=y + +# +# USB Host Controller Drivers +# +CONFIG_USB_EHCI_HCD=m +CONFIG_USB_EHCI_SPLIT_ISO=y +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_OHCI_HCD=m +CONFIG_USB_UHCI_HCD=m + +# +# USB Device Class drivers +# +CONFIG_USB_AUDIO=m + +# +# USB Bluetooth TTY can only be used with disabled Bluetooth subsystem +# +CONFIG_USB_MIDI=m +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_RW_DETECT is not set +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_DPCM=y +CONFIG_USB_STORAGE_HP8200e=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y + +# +# USB Human Interface Devices (HID) +# +CONFIG_USB_HID=m +CONFIG_USB_HIDINPUT=y +CONFIG_HID_FF=y +CONFIG_HID_PID=y +CONFIG_LOGITECH_FF=y +CONFIG_THRUSTMASTER_FF=y +CONFIG_USB_HIDDEV=y + +# +# USB HID Boot Protocol drivers +# +# CONFIG_USB_KBD is not set +# CONFIG_USB_MOUSE is not set +CONFIG_USB_AIPTEK=m +CONFIG_USB_WACOM=m +CONFIG_USB_KBTAB=m +CONFIG_USB_POWERMATE=m +CONFIG_USB_MTOUCH=m +CONFIG_USB_EGALAX=m +CONFIG_USB_XPAD=m +CONFIG_USB_ATI_REMOTE=m + +# +# USB Imaging devices +# +CONFIG_USB_MDC800=m +CONFIG_USB_MICROTEK=m +CONFIG_USB_HPUSBSCSI=m + +# +# USB Multimedia devices +# +CONFIG_USB_VICAM=m +CONFIG_USB_DSBR=m +CONFIG_USB_IBMCAM=m +CONFIG_USB_KONICAWC=m +CONFIG_USB_OV511=m +CONFIG_USB_PWC=m +CONFIG_USB_SE401=m +CONFIG_USB_SN9C102=m +CONFIG_USB_STV680=m +CONFIG_USB_W9968CF=m + +# +# USB Network adaptors +# +CONFIG_USB_CATC=m +CONFIG_USB_KAWETH=m +CONFIG_USB_PEGASUS=m +CONFIG_USB_RTL8150=m +CONFIG_USB_USBNET=m + +# +# USB Host-to-Host Cables +# +CONFIG_USB_ALI_M5632=y +CONFIG_USB_AN2720=y +CONFIG_USB_BELKIN=y +CONFIG_USB_GENESYS=y +CONFIG_USB_NET1080=y +CONFIG_USB_PL2301=y + +# +# Intelligent USB Devices/Gadgets +# +CONFIG_USB_ARMLINUX=y +CONFIG_USB_EPSON2888=y +CONFIG_USB_ZAURUS=y +CONFIG_USB_CDCETHER=y + +# +# USB Network Adapters +# +CONFIG_USB_AX8817X=y + +# +# USB port drivers +# + +# +# USB Serial Converter support +# +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_BELKIN=m +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m +CONFIG_USB_SERIAL_EMPEG=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_VISOR=m +CONFIG_USB_SERIAL_IPAQ=m +CONFIG_USB_SERIAL_IR=m +CONFIG_USB_SERIAL_EDGEPORT=m +CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_KEYSPAN_PDA=m +CONFIG_USB_SERIAL_KEYSPAN=m +CONFIG_USB_SERIAL_KLSI=m +CONFIG_USB_SERIAL_KOBIL_SCT=m +CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_SAFE=m +CONFIG_USB_SERIAL_SAFE_PADDED=y +CONFIG_USB_SERIAL_CYBERJACK=m +CONFIG_USB_SERIAL_XIRCOM=m +CONFIG_USB_SERIAL_OMNINET=m +CONFIG_USB_EZUSB=y + +# +# USB Miscellaneous drivers +# +CONFIG_USB_TIGL=m +CONFIG_USB_AUERSWALD=m +CONFIG_USB_RIO500=m +CONFIG_USB_LEGOTOWER=m +CONFIG_USB_LCD=m +CONFIG_USB_LED=m +CONFIG_USB_CYTHERM=m +CONFIG_USB_SPEEDTOUCH=m +CONFIG_USB_PHIDGETSERVO=m +CONFIG_USB_TEST=m +CONFIG_USB_EAGLE=m + +# +# USB Gadget Support +# +CONFIG_USB_GADGET=m +CONFIG_USB_GADGET_NET2280=y +CONFIG_USB_NET2280=m +# CONFIG_USB_GADGET_PXA2XX is not set +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_SA1100 is not set +# CONFIG_USB_GADGET_DUMMY_HCD is not set +CONFIG_USB_GADGET_DUALSPEED=y +CONFIG_USB_ZERO=m +CONFIG_USB_ETH=m +CONFIG_USB_ETH_RNDIS=y +CONFIG_USB_GADGETFS=m +CONFIG_USB_FILE_STORAGE=m +CONFIG_USB_FILE_STORAGE_TEST=y +CONFIG_USB_G_SERIAL=m + +# +# File systems +# +CONFIG_EXT2_FS=m +# CONFIG_EXT2_FS_XATTR is not set +CONFIG_EXT3_FS=m +CONFIG_EXT3_FS_XATTR=y +# CONFIG_EXT3_FS_POSIX_ACL is not set +# CONFIG_EXT3_FS_SECURITY is not set +CONFIG_JBD=m +# CONFIG_JBD_DEBUG is not set +CONFIG_FS_MBCACHE=m +CONFIG_REISERFS_FS=m +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +CONFIG_REISERFS_FS_XATTR=y +# CONFIG_REISERFS_FS_POSIX_ACL is not set +# CONFIG_REISERFS_FS_SECURITY is not set +CONFIG_JFS_FS=m +# CONFIG_JFS_POSIX_ACL is not set +# CONFIG_JFS_DEBUG is not set +CONFIG_JFS_STATISTICS=y +CONFIG_XFS_FS=m +# CONFIG_XFS_RT is not set +CONFIG_XFS_QUOTA=y +# CONFIG_XFS_SECURITY is not set +CONFIG_XFS_POSIX_ACL=y +CONFIG_MINIX_FS=m +# CONFIG_ROMFS_FS is not set +# CONFIG_QUOTA is not set +CONFIG_QUOTACTL=y +# CONFIG_AUTOFS_FS is not set +CONFIG_AUTOFS4_FS=m + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=m +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_ZISOFS_FS=m +CONFIG_UDF_FS=m +CONFIG_UDF_NLS=y + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=m +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +CONFIG_NTFS_FS=m +# CONFIG_NTFS_DEBUG is not set +# CONFIG_NTFS_RW is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_SYSFS=y +CONFIG_DEVFS_FS=y +# CONFIG_DEVFS_MOUNT is not set +# CONFIG_DEVFS_DEBUG is not set +# CONFIG_DEVPTS_FS_XATTR is not set +CONFIG_TMPFS=y +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y + +# +# Miscellaneous filesystems +# +CONFIG_ADFS_FS=m +# CONFIG_ADFS_FS_RW is not set +CONFIG_AFFS_FS=m +CONFIG_ASFS_FS=m +CONFIG_ASFS_RW=y +CONFIG_HFS_FS=m +CONFIG_HFSPLUS_FS=m +CONFIG_BEFS_FS=m +# CONFIG_BEFS_DEBUG is not set +CONFIG_BFS_FS=m +CONFIG_EFS_FS=m +CONFIG_CRAMFS=y +CONFIG_VXFS_FS=m +CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +# CONFIG_QNX4FS_RW is not set +CONFIG_SYSV_FS=m +CONFIG_UFS_FS=m +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +CONFIG_NFS_FS=m +CONFIG_NFS_V3=y +CONFIG_NFS_V4=y +# CONFIG_NFS_DIRECTIO is not set +CONFIG_NFSD=m +CONFIG_NFSD_V3=y +CONFIG_NFSD_V4=y +CONFIG_NFSD_TCP=y +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=m +CONFIG_SUNRPC=m +CONFIG_SUNRPC_GSS=m +CONFIG_RPCSEC_GSS_KRB5=m +CONFIG_SMB_FS=m +CONFIG_SMB_NLS_DEFAULT=y +CONFIG_SMB_NLS_REMOTE="iso8859-1" +CONFIG_CIFS=m +# CONFIG_CIFS_STATS is not set +# CONFIG_CIFS_XATTR is not set +# CONFIG_CIFS_POSIX is not set +CONFIG_NCP_FS=m +# CONFIG_NCPFS_PACKET_SIGNING is not set +# CONFIG_NCPFS_IOCTL_LOCKING is not set +# CONFIG_NCPFS_STRONG is not set +CONFIG_NCPFS_NFS_NS=y +CONFIG_NCPFS_OS2_NS=y +# CONFIG_NCPFS_SMALLDOS is not set +CONFIG_NCPFS_NLS=y +CONFIG_NCPFS_EXTRAS=y +CONFIG_CODA_FS=m +# CONFIG_CODA_FS_OLD_API is not set +CONFIG_AFS_FS=m +CONFIG_RXRPC=m + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +# CONFIG_OSF_PARTITION is not set +CONFIG_AMIGA_PARTITION=y +# CONFIG_ATARI_PARTITION is not set +CONFIG_MAC_PARTITION=y +CONFIG_MSDOS_PARTITION=y +# CONFIG_BSD_DISKLABEL is not set +# CONFIG_MINIX_SUBPARTITION is not set +# CONFIG_SOLARIS_X86_PARTITION is not set +# CONFIG_UNIXWARE_DISKLABEL is not set +# CONFIG_LDM_PARTITION is not set +# CONFIG_SGI_PARTITION is not set +# CONFIG_ULTRIX_PARTITION is not set +# CONFIG_SUN_PARTITION is not set +# CONFIG_EFI_PARTITION is not set + +# +# Native Language Support +# +CONFIG_NLS=m +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=m +CONFIG_NLS_CODEPAGE_737=m +CONFIG_NLS_CODEPAGE_775=m +CONFIG_NLS_CODEPAGE_850=m +CONFIG_NLS_CODEPAGE_852=m +CONFIG_NLS_CODEPAGE_855=m +CONFIG_NLS_CODEPAGE_857=m +CONFIG_NLS_CODEPAGE_860=m +CONFIG_NLS_CODEPAGE_861=m +CONFIG_NLS_CODEPAGE_862=m +CONFIG_NLS_CODEPAGE_863=m +CONFIG_NLS_CODEPAGE_864=m +CONFIG_NLS_CODEPAGE_865=m +CONFIG_NLS_CODEPAGE_866=m +CONFIG_NLS_CODEPAGE_869=m +CONFIG_NLS_CODEPAGE_936=m +CONFIG_NLS_CODEPAGE_950=m +CONFIG_NLS_CODEPAGE_932=m +CONFIG_NLS_CODEPAGE_949=m +CONFIG_NLS_CODEPAGE_874=m +CONFIG_NLS_ISO8859_8=m +CONFIG_NLS_CODEPAGE_1250=m +CONFIG_NLS_CODEPAGE_1251=m +CONFIG_NLS_ASCII=m +CONFIG_NLS_ISO8859_1=m +CONFIG_NLS_ISO8859_2=m +CONFIG_NLS_ISO8859_3=m +CONFIG_NLS_ISO8859_4=m +CONFIG_NLS_ISO8859_5=m +CONFIG_NLS_ISO8859_6=m +CONFIG_NLS_ISO8859_7=m +CONFIG_NLS_ISO8859_9=m +CONFIG_NLS_ISO8859_13=m +CONFIG_NLS_ISO8859_14=m +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_KOI8_R=m +CONFIG_NLS_KOI8_U=m +CONFIG_NLS_UTF8=m + +# +# Library routines +# +CONFIG_CRC_CCITT=m +CONFIG_CRC32=m +CONFIG_LIBCRC32C=m +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=m + +# +# Profiling support +# +CONFIG_PROFILING=y +CONFIG_OPROFILE=m + +# +# Kernel hacking +# +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_SLAB is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_HIGHMEM is not set +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_XMON is not set +# CONFIG_BDI_SWITCH is not set +# CONFIG_DEBUG_INFO is not set +CONFIG_BOOTX_TEXT=y + +# +# Security options +# +# CONFIG_SECURITY is not set + +# +# Cryptographic options +# +CONFIG_CRYPTO=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_NULL=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_SHA1=m +CONFIG_CRYPTO_SHA256=m +CONFIG_CRYPTO_SHA512=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_KHAZAD=m +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_MICHAEL_MIC=m +CONFIG_CRYPTO_CRC32C=m +CONFIG_CRYPTO_TEST=m --- linux-source-2.6.8.1-2.6.8.1.orig/debian/control +++ linux-source-2.6.8.1-2.6.8.1/debian/control @@ -0,0 +1,655 @@ +Source: linux-source-2.6.8.1 +Section: devel +Priority: optional +Maintainer: Debian kernel team +Uploaders: William Lee Irwin III , Jens Schmalzing , Sven Luther , Andres Salomon +Standards-Version: 3.6.1 +Build-Depends: bzip2, debhelper (>= 3), docbook-utils, gs, kernel-package (>= 8.091.0ubuntu3), module-init-tools, sharutils, transfig, dpatch + +Package: linux-source-2.6.8.1 +Architecture: all +Section: devel +Priority: optional +Provides: linux-source, linux-source-2.6 +Depends: binutils, bzip2, coreutils | fileutils (>= 4.0) +Recommends: libc-dev, gcc, make +Suggests: libncurses-dev | ncurses-dev, kernel-package, libqt3-dev +Description: Linux kernel source for version 2.6.8.1 with Debian patches + This package provides the source code for the Linux kernel version 2.6.8.1. + . + You may configure the kernel to your setup by typing "make config" + and following instructions, but you could get ncursesX.X-dev and try + "make menuconfig" for a jazzier, and easier to use interface. There + are options to use QT or GNOME based configuration interfaces, but they + need additional packages to be installed. Also, please read the detailed + documentation in the file + /usr/share/doc/linux-source-2.6.8.1/README.headers.gz. + . + If you wish to use this package to create a custom Linux kernel, then + it is suggested that you investigate the package kernel-package, + which has been designed to ease the task of creating kernel image + packages. + +Package: linux-doc-2.6.8.1 +Architecture: all +Section: doc +Priority: optional +Provides: linux-doc-2.6 +Depends: coreutils | fileutils (>= 4.0) +Description: Linux kernel specific documentation for version 2.6.8.1 + This package provides the various readme's in the 2.6.8.1 kernel + Documentation/ subdirectory: these typically contain kernel-specific + installation notes for some drivers for example. See + /usr/share/doc/linux-doc-X.X.XX/Documentation/00-INDEX for a list of what + is contained in each file. Please read the Changes file, as it + contains information about the problems, which may result by + upgrading your kernel. + +Package: linux-patch-debian-2.6.8.1 +Architecture: all +Section: devel +Priority: optional +Depends: bzip2 +Suggests: linux-source-2.6.8.1 +Description: Debian patches to Linux 2.6.8.1 + This package includes the patches used to produce the prepackaged + linux-source-2.6.8.1 package. They should be applied to a pristine + Linux 2.6.8.1 kernel. Note that these patches do NOT apply + against a pristine Linux 2.6.8 kernel but only against + linux-source-2.6.8.1_2.6.8.1.orig.tar.gz from the Debian archive. + +Package: linux-tree-2.6.8.1 +Architecture: all +Section: devel +Priority: optional +Depends: linux-patch-debian-2.6.8.1 (= ${Source-Version}), ${kt-depends} +Provides: ${kt-provides} +Description: Linux kernel tree for building prepackaged Debian kernel images + This meta package is used as a build-time dependency of prepackaged + Debian linux-image packages. Its dependencies are structured so that a + complete kernel tree with Debian patches applied will be available after + this package is installed. It also contains the upstream changelog file. + . + For those intending to use this package as a build-time dependency, this + package provides a list of virtual packages that guarantees the availability + of a particular Debian revision of the kernel tree. The + linux-image-2.6.8.1-i386 package is an example of this. + +Package: linux-headers-2.6.8.1-6 +Architecture: amd64 i386 powerpc +Section: devel +Priority: optional +Depends: coreutils | fileutils (>= 4.0), ${shlibs:Depends} +Provides: linux-headers, linux-headers-2.6 +Description: Header files related to Linux kernel version 2.6.8.1 + This package provides kernel header files for version 2.6.8.1, for sites + that want the latest kernel headers. Please read + /usr/share/doc/linux-headers-2.6.8.1-6/debian.README.gz for details + +Package: linux-headers-2.6.8.1-6-386 +Architecture: i386 +Section: devel +Priority: optional +Depends: coreutils | fileutils (>= 4.0), linux-headers-2.6.8.1-6 +Provides: linux-headers, linux-headers-2.6 +Description: Linux kernel headers 2.6.8.1 on 386 + This package provides kernel header files for version 2.6.8.1 on + 386, + for sites that want the latest kernel headers. + Please read /usr/share/doc/linux-headers-2.6.8.1-6/debian.README.gz for + details + +Package: linux-image-2.6.8.1-6-386 +Architecture: i386 +Section: base +Priority: optional +Provides: linux-image, linux-image-2.6 +Depends: initrd-tools (>= 0.1.63), coreutils | fileutils (>= 4.0), module-init-tools (>= 0.9.13) +Conflicts: hotplug (<< 0.0.20040105-1) +Suggests: lilo (>= 19.1) | grub, fdutils, linux-doc-2.6.8.1 | linux-source-2.6.8.1 +Description: Linux kernel image for version 2.6.8.1 on 386. + This package contains the Linux kernel image for version 2.6.8.1 on + 386, + the corresponding System.map file, and the modules built by the packager. + It also contains scripts that try to ensure that the system is not left in + a unbootable state after an update. + . + If you wish to update a bootdisk, or to use a bootloader to make + installing and using the image easier, we suggest you install the latest + fdutils (for formatting a floppy to be used as boot disk), and LILO, for a + powerful bootloader. Of course, both these are optional. + . + Kernel image packages are generally produced using kernel-package, + and it is suggested that you install that package if you wish to + create a custom kernel from the sources. + +Package: linux-headers-2.6.8.1-6-686 +Architecture: i386 +Section: devel +Priority: optional +Depends: coreutils | fileutils (>= 4.0), linux-headers-2.6.8.1-6 +Provides: linux-headers, linux-headers-2.6 +Description: Linux kernel headers 2.6.8.1 on PPro/Celeron/PII/PIII/PIV + This package provides kernel header files for version 2.6.8.1 on + Pentium Pro/Celeron/Pentium II/Pentium III/Pentium IV, + for sites that want the latest kernel headers. + Please read /usr/share/doc/linux-headers-2.6.8.1-6/debian.README.gz for + details + +Package: linux-image-2.6.8.1-6-686 +Architecture: i386 +Section: base +Priority: optional +Provides: linux-image, linux-image-2.6 +Depends: initrd-tools (>= 0.1.63), coreutils | fileutils (>= 4.0), module-init-tools (>= 0.9.13) +Conflicts: hotplug (<< 0.0.20040105-1) +Suggests: lilo (>= 19.1) | grub, fdutils, linux-doc-2.6.8.1 | linux-source-2.6.8.1 +Description: Linux kernel image for version 2.6.8.1 on PPro/Celeron/PII/PIII/PIV. + This package contains the Linux kernel image for version 2.6.8.1 on + Pentium Pro/Celeron/Pentium II/Pentium III/Pentium IV, + the corresponding System.map file, and the modules built by the packager. + It also contains scripts that try to ensure that the system is not left in + a unbootable state after an update. + . + If you wish to update a bootdisk, or to use a bootloader to make + installing and using the image easier, we suggest you install the latest + fdutils (for formatting a floppy to be used as boot disk), and LILO, for a + powerful bootloader. Of course, both these are optional. + . + Kernel image packages are generally produced using kernel-package, + and it is suggested that you install that package if you wish to + create a custom kernel from the sources. + +Package: linux-headers-2.6.8.1-6-686-smp +Architecture: i386 +Section: devel +Priority: optional +Depends: coreutils | fileutils (>= 4.0), linux-headers-2.6.8.1-6 +Provides: linux-headers, linux-headers-2.6 +Description: Linux kernel headers 2.6.8.1 on PPro/Celeron/PII/PIII/PIV SMP + This package provides kernel header files for version 2.6.8.1 on + Pentium Pro/Celeron/Pentium II/Pentium III/Pentium IV with SMP support, + for sites that want the latest kernel headers. + SMP (symmetric multi-processing) is needed if you have multiple processors. + Please read /usr/share/doc/linux-headers-2.6.8.1-6/debian.README.gz for + details + +Package: linux-image-2.6.8.1-6-686-smp +Architecture: i386 +Section: base +Priority: optional +Provides: linux-image, linux-image-2.6 +Depends: initrd-tools (>= 0.1.63), coreutils | fileutils (>= 4.0), module-init-tools (>= 0.9.13) +Conflicts: hotplug (<< 0.0.20040105-1) +Suggests: lilo (>= 19.1) | grub, fdutils, linux-doc-2.6.8.1 | linux-source-2.6.8.1 +Description: Linux kernel image for version 2.6.8.1 on PPro/Celeron/PII/PIII/PIV SMP. + This package contains the Linux kernel image for version 2.6.8.1 on + Pentium Pro/Celeron/Pentium II/Pentium III/Pentium IV with SMP support, + the corresponding System.map file, and the modules built by the packager. + SMP (symmetric multi-processing) is needed if you have multiple processors. + It also contains scripts that try to ensure that the system is not left in + a unbootable state after an update. + . + If you wish to update a bootdisk, or to use a bootloader to make + installing and using the image easier, we suggest you install the latest + fdutils (for formatting a floppy to be used as boot disk), and LILO, for a + powerful bootloader. Of course, both these are optional. + . + Kernel image packages are generally produced using kernel-package, + and it is suggested that you install that package if you wish to + create a custom kernel from the sources. + +Package: linux-headers-2.6.8.1-6-k7 +Architecture: i386 +Section: devel +Priority: optional +Depends: coreutils | fileutils (>= 4.0), linux-headers-2.6.8.1-6 +Provides: linux-headers, linux-headers-2.6 +Description: Linux kernel headers 2.6.8.1 on AMD K7 + This package provides kernel header files for version 2.6.8.1 on + AMD Duron/Athlon, + for sites that want the latest kernel headers. + Please read /usr/share/doc/linux-headers-2.6.8.1-6/debian.README.gz for + details + +Package: linux-image-2.6.8.1-6-k7 +Architecture: i386 +Section: base +Priority: optional +Provides: linux-image, linux-image-2.6 +Depends: initrd-tools (>= 0.1.63), coreutils | fileutils (>= 4.0), module-init-tools (>= 0.9.13) +Conflicts: hotplug (<< 0.0.20040105-1) +Suggests: lilo (>= 19.1) | grub, fdutils, linux-doc-2.6.8.1 | linux-source-2.6.8.1 +Description: Linux kernel image for version 2.6.8.1 on AMD K7. + This package contains the Linux kernel image for version 2.6.8.1 on + AMD Duron/Athlon, + the corresponding System.map file, and the modules built by the packager. + It also contains scripts that try to ensure that the system is not left in + a unbootable state after an update. + . + If you wish to update a bootdisk, or to use a bootloader to make + installing and using the image easier, we suggest you install the latest + fdutils (for formatting a floppy to be used as boot disk), and LILO, for a + powerful bootloader. Of course, both these are optional. + . + Kernel image packages are generally produced using kernel-package, + and it is suggested that you install that package if you wish to + create a custom kernel from the sources. + +Package: linux-headers-2.6.8.1-6-k7-smp +Architecture: i386 +Section: devel +Priority: optional +Depends: coreutils | fileutils (>= 4.0), linux-headers-2.6.8.1-6 +Provides: linux-headers, linux-headers-2.6 +Description: Linux kernel headers 2.6.8.1 on AMD K7 SMP + This package provides kernel header files for version 2.6.8.1 on + AMD Duron/Athlon with SMP support, + for sites that want the latest kernel headers. + SMP (symmetric multi-processing) is needed if you have multiple processors. + Please read /usr/share/doc/linux-headers-2.6.8.1-6/debian.README.gz for + details + +Package: linux-image-2.6.8.1-6-k7-smp +Architecture: i386 +Section: base +Priority: optional +Provides: linux-image, linux-image-2.6 +Depends: initrd-tools (>= 0.1.63), coreutils | fileutils (>= 4.0), module-init-tools (>= 0.9.13) +Conflicts: hotplug (<< 0.0.20040105-1) +Suggests: lilo (>= 19.1) | grub, fdutils, linux-doc-2.6.8.1 | linux-source-2.6.8.1 +Description: Linux kernel image for version 2.6.8.1 on AMD K7 SMP. + This package contains the Linux kernel image for version 2.6.8.1 on + AMD Duron/Athlon with SMP support, + the corresponding System.map file, and the modules built by the packager. + SMP (symmetric multi-processing) is needed if you have multiple processors. + It also contains scripts that try to ensure that the system is not left in + a unbootable state after an update. + . + If you wish to update a bootdisk, or to use a bootloader to make + installing and using the image easier, we suggest you install the latest + fdutils (for formatting a floppy to be used as boot disk), and LILO, for a + powerful bootloader. Of course, both these are optional. + . + Kernel image packages are generally produced using kernel-package, + and it is suggested that you install that package if you wish to + create a custom kernel from the sources. + +Package: linux-headers-2.6.8.1-6-power3 +Architecture: powerpc +Section: devel +Priority: optional +Depends: coreutils | fileutils (>= 4.0), linux-headers-2.6.8.1-6 +Provides: linux-headers, linux-headers-2.6 +Description: Linux kernel headers 2.6.8.1 on Power3 + This package provides kernel header files for version 2.6.8.1 on + Power3, + for sites that want the latest kernel headers. + Please read /usr/share/doc/linux-headers-2.6.8.1-6/debian.README.gz for + details + +Package: linux-image-2.6.8.1-6-power3 +Architecture: powerpc +Section: base +Priority: optional +Provides: linux-image, linux-image-2.6 +Depends: initrd-tools (>= 0.1.65), coreutils | fileutils (>= 4.0), module-init-tools (>= 0.9.13) +Conflicts: hotplug (<< 0.0.20040105-1) +Suggests: linux-doc-2.6.8.1 | linux-source-2.6.8.1 +Description: Linux kernel image for version 2.6.8.1 on Power3. + This package contains the Linux kernel image for version 2.6.8.1 on + Power3, + the corresponding System.map file, and the modules built by the packager. + It also contains scripts that try to ensure that the system is not left in + a unbootable state after an update. + . + If you wish to update a bootdisk, or to use a bootloader to make + installing and using the image easier, we suggest you install the latest + fdutils (for formatting a floppy to be used as boot disk), and LILO, for a + powerful bootloader. Of course, both these are optional. + . + Kernel image packages are generally produced using kernel-package, + and it is suggested that you install that package if you wish to + create a custom kernel from the sources. + +Package: linux-headers-2.6.8.1-6-power3-smp +Architecture: powerpc +Section: devel +Priority: optional +Depends: coreutils | fileutils (>= 4.0), linux-headers-2.6.8.1-6 +Provides: linux-headers, linux-headers-2.6 +Description: Linux kernel headers 2.6.8.1 on Power3 SMP + This package provides kernel header files for version 2.6.8.1 on + Power3 with SMP support, + for sites that want the latest kernel headers. + SMP (symmetric multi-processing) is needed if you have multiple processors. + Please read /usr/share/doc/linux-headers-2.6.8.1-6/debian.README.gz for + details + +Package: linux-image-2.6.8.1-6-power3-smp +Architecture: powerpc +Section: base +Priority: optional +Provides: linux-image, linux-image-2.6 +Depends: initrd-tools (>= 0.1.65), coreutils | fileutils (>= 4.0), module-init-tools (>= 0.9.13) +Conflicts: hotplug (<< 0.0.20040105-1) +Suggests: linux-doc-2.6.8.1 | linux-source-2.6.8.1 +Description: Linux kernel image for version 2.6.8.1 on Power3 SMP. + This package contains the Linux kernel image for version 2.6.8.1 on + Power3 with SMP support, + the corresponding System.map file, and the modules built by the packager. + SMP (symmetric multi-processing) is needed if you have multiple processors. + It also contains scripts that try to ensure that the system is not left in + a unbootable state after an update. + . + If you wish to update a bootdisk, or to use a bootloader to make + installing and using the image easier, we suggest you install the latest + fdutils (for formatting a floppy to be used as boot disk), and LILO, for a + powerful bootloader. Of course, both these are optional. + . + Kernel image packages are generally produced using kernel-package, + and it is suggested that you install that package if you wish to + create a custom kernel from the sources. + +Package: linux-headers-2.6.8.1-6-power4 +Architecture: powerpc +Section: devel +Priority: optional +Depends: coreutils | fileutils (>= 4.0), linux-headers-2.6.8.1-6 +Provides: linux-headers, linux-headers-2.6 +Description: Linux kernel headers 2.6.8.1 on Power4 + This package provides kernel header files for version 2.6.8.1 on + Power4, + for sites that want the latest kernel headers. + Please read /usr/share/doc/linux-headers-2.6.8.1-6/debian.README.gz for + details + +Package: linux-image-2.6.8.1-6-power4 +Architecture: powerpc +Section: base +Priority: optional +Provides: linux-image, linux-image-2.6 +Depends: initrd-tools (>= 0.1.65), coreutils | fileutils (>= 4.0), module-init-tools (>= 0.9.13) +Conflicts: hotplug (<< 0.0.20040105-1) +Suggests: linux-doc-2.6.8.1 | linux-source-2.6.8.1 +Description: Linux kernel image for version 2.6.8.1 on Power4. + This package contains the Linux kernel image for version 2.6.8.1 on + Power4, + the corresponding System.map file, and the modules built by the packager. + It also contains scripts that try to ensure that the system is not left in + a unbootable state after an update. + . + If you wish to update a bootdisk, or to use a bootloader to make + installing and using the image easier, we suggest you install the latest + fdutils (for formatting a floppy to be used as boot disk), and LILO, for a + powerful bootloader. Of course, both these are optional. + . + Kernel image packages are generally produced using kernel-package, + and it is suggested that you install that package if you wish to + create a custom kernel from the sources. + +Package: linux-headers-2.6.8.1-6-power4-smp +Architecture: powerpc +Section: devel +Priority: optional +Depends: coreutils | fileutils (>= 4.0), linux-headers-2.6.8.1-6 +Provides: linux-headers, linux-headers-2.6 +Description: Linux kernel headers 2.6.8.1 on Power4 SMP + This package provides kernel header files for version 2.6.8.1 on + Power4 with SMP support, + for sites that want the latest kernel headers. + SMP (symmetric multi-processing) is needed if you have multiple processors. + Please read /usr/share/doc/linux-headers-2.6.8.1-6/debian.README.gz for + details + +Package: linux-image-2.6.8.1-6-power4-smp +Architecture: powerpc +Section: base +Priority: optional +Provides: linux-image, linux-image-2.6 +Depends: initrd-tools (>= 0.1.65), coreutils | fileutils (>= 4.0), module-init-tools (>= 0.9.13) +Conflicts: hotplug (<< 0.0.20040105-1) +Suggests: linux-doc-2.6.8.1 | linux-source-2.6.8.1 +Description: Linux kernel image for version 2.6.8.1 on Power4 SMP. + This package contains the Linux kernel image for version 2.6.8.1 on + Power4 with SMP support, + the corresponding System.map file, and the modules built by the packager. + SMP (symmetric multi-processing) is needed if you have multiple processors. + It also contains scripts that try to ensure that the system is not left in + a unbootable state after an update. + . + If you wish to update a bootdisk, or to use a bootloader to make + installing and using the image easier, we suggest you install the latest + fdutils (for formatting a floppy to be used as boot disk), and LILO, for a + powerful bootloader. Of course, both these are optional. + . + Kernel image packages are generally produced using kernel-package, + and it is suggested that you install that package if you wish to + create a custom kernel from the sources. + +Package: linux-headers-2.6.8.1-6-powerpc +Architecture: powerpc +Section: devel +Priority: optional +Depends: coreutils | fileutils (>= 4.0), linux-headers-2.6.8.1-6 +Provides: linux-headers, linux-headers-2.6 +Description: Linux kernel headers 2.6.8.1 on PowerPC + This package provides kernel header files for version 2.6.8.1 on + PowerPC, + for sites that want the latest kernel headers. + Please read /usr/share/doc/linux-headers-2.6.8.1-6/debian.README.gz for + details + +Package: linux-image-2.6.8.1-6-powerpc +Architecture: powerpc +Section: base +Priority: optional +Provides: linux-image, linux-image-2.6 +Depends: initrd-tools (>= 0.1.65), coreutils | fileutils (>= 4.0), module-init-tools (>= 0.9.13) +Conflicts: hotplug (<< 0.0.20040105-1) +Suggests: linux-doc-2.6.8.1 | linux-source-2.6.8.1 +Description: Linux kernel image for version 2.6.8.1 on PowerPC. + This package contains the Linux kernel image for version 2.6.8.1 on + PowerPC, + the corresponding System.map file, and the modules built by the packager. + It also contains scripts that try to ensure that the system is not left in + a unbootable state after an update. + . + If you wish to update a bootdisk, or to use a bootloader to make + installing and using the image easier, we suggest you install the latest + fdutils (for formatting a floppy to be used as boot disk), and LILO, for a + powerful bootloader. Of course, both these are optional. + . + Kernel image packages are generally produced using kernel-package, + and it is suggested that you install that package if you wish to + create a custom kernel from the sources. + +Package: linux-headers-2.6.8.1-6-powerpc-smp +Architecture: powerpc +Section: devel +Priority: optional +Depends: coreutils | fileutils (>= 4.0), linux-headers-2.6.8.1-6 +Provides: linux-headers, linux-headers-2.6 +Description: Linux kernel headers 2.6.8.1 on PowerPC SMP + This package provides kernel header files for version 2.6.8.1 on + PowerPC with SMP support, + for sites that want the latest kernel headers. + SMP (symmetric multi-processing) is needed if you have multiple processors. + Please read /usr/share/doc/linux-headers-2.6.8.1-6/debian.README.gz for + details + +Package: linux-image-2.6.8.1-6-powerpc-smp +Architecture: powerpc +Section: base +Priority: optional +Provides: linux-image, linux-image-2.6 +Depends: initrd-tools (>= 0.1.65), coreutils | fileutils (>= 4.0), module-init-tools (>= 0.9.13) +Conflicts: hotplug (<< 0.0.20040105-1) +Suggests: linux-doc-2.6.8.1 | linux-source-2.6.8.1 +Description: Linux kernel image for version 2.6.8.1 on PowerPC SMP. + This package contains the Linux kernel image for version 2.6.8.1 on + PowerPC with SMP support, + the corresponding System.map file, and the modules built by the packager. + SMP (symmetric multi-processing) is needed if you have multiple processors. + It also contains scripts that try to ensure that the system is not left in + a unbootable state after an update. + . + If you wish to update a bootdisk, or to use a bootloader to make + installing and using the image easier, we suggest you install the latest + fdutils (for formatting a floppy to be used as boot disk), and LILO, for a + powerful bootloader. Of course, both these are optional. + . + Kernel image packages are generally produced using kernel-package, + and it is suggested that you install that package if you wish to + create a custom kernel from the sources. + +Package: linux-headers-2.6.8.1-6-amd64-k8 +Architecture: amd64 +Section: devel +Priority: optional +Depends: coreutils | fileutils (>= 4.0), linux-headers-2.6.8.1-6 +Provides: linux-headers, linux-headers-2.6 +Description: Linux kernel headers 2.6.8.1 on AMD K8 + This package provides kernel header files for version 2.6.8.1 on + AMD Athlon64/Athlon FX/Opteron, + for sites that want the latest kernel headers. + Please read /usr/share/doc/linux-headers-2.6.8.1-6/debian.README.gz for + details + +Package: linux-image-2.6.8.1-6-amd64-k8 +Architecture: amd64 +Section: base +Priority: optional +Provides: linux-image, linux-image-2.6 +Depends: initrd-tools (>= 0.1.65), coreutils | fileutils (>= 4.0), module-init-tools (>= 0.9.13) +Conflicts: hotplug (<< 0.0.20040105-1) +Suggests: lilo (>= 19.1) | grub, fdutils, linux-doc-2.6.8.1 | linux-source-2.6.8.1 +Description: Linux kernel image for version 2.6.8.1 on AMD K8. + This package contains the Linux kernel image for version 2.6.8.1 on + AMD Athlon64/Athlon FX/Opteron, + the corresponding System.map file, and the modules built by the packager. + It also contains scripts that try to ensure that the system is not left in + a unbootable state after an update. + . + If you wish to update a bootdisk, or to use a bootloader to make + installing and using the image easier, we suggest you install the latest + fdutils (for formatting a floppy to be used as boot disk), and LILO, for a + powerful bootloader. Of course, both these are optional. + . + Kernel image packages are generally produced using kernel-package, + and it is suggested that you install that package if you wish to + create a custom kernel from the sources. + +Package: linux-headers-2.6.8.1-6-amd64-k8-smp +Architecture: amd64 +Section: devel +Priority: optional +Depends: coreutils | fileutils (>= 4.0), linux-headers-2.6.8.1-6 +Provides: linux-headers, linux-headers-2.6 +Description: Linux kernel headers 2.6.8.1 on AMD K8 SMP + This package provides kernel header files for version 2.6.8.1 on + AMD Athlon64/Athlon FX/Opteron with SMP support, + for sites that want the latest kernel headers. + SMP (symmetric multi-processing) is needed if you have multiple processors. + Please read /usr/share/doc/linux-headers-2.6.8.1-6/debian.README.gz for + details + +Package: linux-image-2.6.8.1-6-amd64-k8-smp +Architecture: amd64 +Section: base +Priority: optional +Provides: linux-image, linux-image-2.6 +Depends: initrd-tools (>= 0.1.65), coreutils | fileutils (>= 4.0), module-init-tools (>= 0.9.13) +Conflicts: hotplug (<< 0.0.20040105-1) +Suggests: lilo (>= 19.1) | grub, fdutils, linux-doc-2.6.8.1 | linux-source-2.6.8.1 +Description: Linux kernel image for version 2.6.8.1 on AMD K8 SMP. + This package contains the Linux kernel image for version 2.6.8.1 on + AMD Athlon64/Athlon FX/Opteron with SMP support, + the corresponding System.map file, and the modules built by the packager. + SMP (symmetric multi-processing) is needed if you have multiple processors. + It also contains scripts that try to ensure that the system is not left in + a unbootable state after an update. + . + If you wish to update a bootdisk, or to use a bootloader to make + installing and using the image easier, we suggest you install the latest + fdutils (for formatting a floppy to be used as boot disk), and LILO, for a + powerful bootloader. Of course, both these are optional. + . + Kernel image packages are generally produced using kernel-package, + and it is suggested that you install that package if you wish to + create a custom kernel from the sources. + +Package: linux-headers-2.6.8.1-6-amd64-generic +Architecture: amd64 +Section: devel +Priority: optional +Depends: coreutils | fileutils (>= 4.0), linux-headers-2.6.8.1-6 +Provides: linux-headers, linux-headers-2.6 +Description: Linux kernel headers 2.6.8.1 on x86_64 + This package provides kernel header files for version 2.6.8.1 on + the x86_64 architecture, + for sites that want the latest kernel headers. + Please read /usr/share/doc/linux-headers-2.6.8.1-6/debian.README.gz for + details + +Package: linux-image-2.6.8.1-6-amd64-generic +Architecture: amd64 +Section: base +Priority: optional +Provides: linux-image, linux-image-2.6 +Depends: initrd-tools (>= 0.1.65), coreutils | fileutils (>= 4.0), module-init-tools (>= 0.9.13) +Conflicts: hotplug (<< 0.0.20040105-1) +Suggests: lilo (>= 19.1) | grub, fdutils, linux-doc-2.6.8.1 | linux-source-2.6.8.1 +Description: Linux kernel image for version 2.6.8.1 on x86_64. + This package contains the Linux kernel image for version 2.6.8.1 on + the x86_64 architecture, + the corresponding System.map file, and the modules built by the packager. + It also contains scripts that try to ensure that the system is not left in + a unbootable state after an update. + . + If you wish to update a bootdisk, or to use a bootloader to make + installing and using the image easier, we suggest you install the latest + fdutils (for formatting a floppy to be used as boot disk), and LILO, for a + powerful bootloader. Of course, both these are optional. + . + Kernel image packages are generally produced using kernel-package, + and it is suggested that you install that package if you wish to + create a custom kernel from the sources. + +Package: linux-headers-2.6.8.1-6-amd64-xeon +Architecture: amd64 +Section: devel +Priority: optional +Depends: coreutils | fileutils (>= 4.0), linux-headers-2.6.8.1-6 +Provides: linux-headers, linux-headers-2.6 +Description: Linux kernel headers 2.6.8.1 on Intel x86_64 + This package provides kernel header files for version 2.6.8.1 on + Intel Xeon DP, + for sites that want the latest kernel headers. + Please read /usr/share/doc/linux-headers-2.6.8.1-6/debian.README.gz for + details + +Package: linux-image-2.6.8.1-6-amd64-xeon +Architecture: amd64 +Section: base +Priority: optional +Provides: linux-image, linux-image-2.6 +Depends: initrd-tools (>= 0.1.65), coreutils | fileutils (>= 4.0), module-init-tools (>= 0.9.13) +Conflicts: hotplug (<< 0.0.20040105-1) +Suggests: lilo (>= 19.1) | grub, fdutils, linux-doc-2.6.8.1 | linux-source-2.6.8.1 +Description: Linux kernel image for version 2.6.8.1 on Intel x86_64. + This package contains the Linux kernel image for version 2.6.8.1 on + Intel Xeon DP, + the corresponding System.map file, and the modules built by the packager. + It also contains scripts that try to ensure that the system is not left in + a unbootable state after an update. + . + If you wish to update a bootdisk, or to use a bootloader to make + installing and using the image easier, we suggest you install the latest + fdutils (for formatting a floppy to be used as boot disk), and LILO, for a + powerful bootloader. Of course, both these are optional. + . + Kernel image packages are generally produced using kernel-package, + and it is suggested that you install that package if you wish to + create a custom kernel from the sources. + --- linux-source-2.6.8.1-2.6.8.1.orig/debian/copyright +++ linux-source-2.6.8.1-2.6.8.1/debian/copyright @@ -0,0 +1,36 @@ +This is the Debian GNU/Linux prepackaged version of the Linux kernel. +Linux was written by Linus Torvalds +and others. + +This package was put together by Simon Shapiro , from +sources retrieved from directories under +ftp.cs.helsinki.fi:/pub/Software/Linux/Kernel/ +The sources may be found at most Linux ftp sites, including +ftp://ftp.kernel.org/pub/linux/kernel/ + +This package was then maintained by Sven Rudolph. + +This package was maintained by Herbert Xu +from March 1997 to May 2004. + +This package is currently maintained by the +Debian Kernel Team + +Linux is copyrighted by Linus Torvalds and others. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 dated June, 1991. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + +On Debian GNU/Linux systems, the complete text of the GNU General +Public License can be found in `/usr/share/common-licenses/GPL'. --- linux-source-2.6.8.1-2.6.8.1.orig/debian/firmware.tar.gz.uu +++ linux-source-2.6.8.1-2.6.8.1/debian/firmware.tar.gz.uu @@ -0,0 +1,17133 @@ +begin 600 firmware.tar.gz +M'XL(`#B84D$``^R]"7A41=8_7/?V[>[;G:9S$P)T%M,W(22713H**L[+#+?# +M*FX=1*/@2"=&0089QWT<##F +MQO^Z&VX[\\S2TO\)//A?'/\S^IYY3I^SSCF;QO^L,_N<\_^/__^)?[\8?^=W +MS"U7_[GZFM[7WO:_H0[`X^S?'/\^YYQ]]ME\_&G2GWG6&33^5/_9?9G^?P2( +M_Q\??[DEY%WF9NE,81[6F][.2]^03D^0_9E-8./=4OH\>?REYR^;6,[?.L^3 +MZ(W%/S*OC9]OZCQ<:5Y@JA0*Q3\VS?A&D\5_,+WQO:8/D&RJ]=.B\Y#5]Y9K.X%DW$,Z)L?/;P_>.MX=)XI8_%G3#-V.Z5M65:VW!QEYA1<*L?95T8T&F,L2;_\ +M[_GXFYQF#"Y-]\Q>DEX:G+>,L=\%SPV:H];GU"S[W`JP@M%2/HO[&I5\*>YI +M+,A7XJ[&0FW'7)5U8%V8]T//UX7EC!6.C@Y?9M^T;-;+Z<[+C[W\ +MPLN9KW1Y!>]-J_`W]LJ(5T;2^XE7W*^>]NK@5V=2WIDO7_#J[:\^^^JKK_[S +MU?3E+U.^C%4OK]++BRZY6V)5[%K]TBY,^0COFY8](TGL\N6>+Q+?]OS./>XM +M:>RR@O+"6B9Z%UKFUKKZ?SMX.\& +M3=D]8]"4\Z<,FO(W>CI\V_^[9V(7/SYVV=%54TV,WC#3$S?-LRV,M,L3:<)&NP0QRC3J%*. +MCZD?'1IU^M+?P`A;`_&GS(*54C6[EL63]50^0PW/F&H<7U\1+`WZVWP]=MGP +M%4._!=Y7C2HH`':[&ZQ1S81]JY;W'EU0\%/C^5/P^T,C&W_Z\%VK$=[1N'L& +M?K]O#*RQ8LWAI@9>>Z.\9<-R5[S!'!TKZ"LW7++BHA5ABD]OB)47G!EHV!@K +M*/4U%O3Q-*JY9NY&<_^$L7,>7L[B'&[7F\N5>:FD:[\45 +MZ1\&+U]^]-N-L6CV1A-UCFY<+VU(/Y^@$"K/OH1F=747EL7K]U#]\@HWU7_1 +MB@WIPX.N+4-CZHI!L5`T>^!PFO_:BCIJ@=%0.+)?71<6VGC;G'C\*M.*';>FY#5O74:X_7I[/T;(7Z$VK\^TB1KPMS?9#)_KQBJI2,9[)G)8UI +M8=]&?.EN&!W3;#R^_9(4H'25.7DPTI.KCQ1N6/[%"7M&TO!;X1/"N-3?& +M3(+@O'3`<,VI,`RW0O")%4H["#[3!H)K.02O:`#]7!\#KD3/]#3,ZJLTR"V8 +M7!O[.;O61(ZW8FKN6YQ>NJCL_VIPQ>::P9&W.9"ZK052MQ&,;B.X2AG3S"XL +M9^,]Z6U'1M35G#TLS'&S<5[8U8B1P8CY^(B-7=8Z)E-BJ7$J"DZAT0G26/][ +MA?O+@G**;R@L'[LL]SN,\##J1[!QP=RISBQ06\9^6$S*'69ZOVV=O6.77;Y\ +MQG+_MT^G?SQ*RE<:T==S7Y;H+][EAK'+VN95OGLZ7>+0`*2I+0PCR +M69V40R/J_F!T;#*-%["BX)RNC1:-XHVQFT8`DQ5J^XWF3656K.#,#@U742O] +MC5?&_CA"RBCX@XMFMUEUI?G'LJOH^ZOX;/BL,:?<%3ZQ46(QZGE:8WELQ(@K +M1_[Q,JKE0]"U3G'_*HFE+R\LOVF9B\*`IAG;3[/_IVA9[$`4,.V6#DJK.*G[ +MRTWSI_*H>:"\C(\=TM`?-THBFA(BFJ)-7'%?H#I]<.YH.2?W_,N)IJ@37[\O +M=S0+B;?"\BRSL+R3F3GQQ0FT/92F/6^(N'[WG91W_]<58M3RR;\*S$:!8X3_S'^QB- +M'/+GCDY0[]+7OQ^.\HL:-HXJZ%;0 +M:(YRY^?3FIG7*,7%UZAI\]#-@VFUCFX>V'GBX/M_/RKW_-9:6].TB9?P--0L +MA0.-"J`YU$U_(Z,/AB+G3QT?.?_%E?*6+R3QKDW\T_VHV^!U>WG=OQ6_XA=->/KHBO&+[\BG+]=A420OU +M&QZ.Z:6>1M?X@C/D!O?X#U:R\?<-5].#6US5M43GCL:355E$S=BUG1ABDO7N +M5Q2>DN`I+TE22*0J/'6UE,VF2FZ>HYGG<#GI;N?K+4.W#-YZZ?<5$FOMI\3X +MZI$NC;^,VGV5B7GK(2SV5-^S[(H@<-I+;VS\R.&%Y<#\J9(KNTX:&-?8-&FI +M5)J];RZ3YDD8_8-SITF%Y5HXU,C"GD9W.//##F%MHRL#7S&IPT1@[;D/<$I' +MX0$/J%2N0K5(5+8V$;F08SC/$7U%0@H]A>53I<)+T[.O>.J/K\1?N>Z5NUY1 +M)QZ<^M8K$LVX\VA&:=?CJVL>2,4PII5G7%)X:6$%K0+1C(&9Y1WY6P;+C'8< +MF%7>R7G+BG8:V+F\B_/6.=IEH%S]_"_*R&Q71L=V971L5T9'IPQ\V5HSJVZM +MM[5.41^++Y7VS7WOJ897/G[EPU<"U*OSTG]ZQ4>_7[TRC-K`KC\RU4=/@![> +MKO1AZ2XGG(B[HLFX$G5'\88U2BT'3\3*75&I7(G*Y>ZH1O`M+#_X@,1<'/8_ +M4PCK%5&7:&%Y=A1K52;E.3^](^=TC&BHW(AFTZ-=KTX$%ZX]Z*$W;SEX9+5< +MK`$W+_&#]XXJT-,;[Z4U(<`(%V+S1OQY +M6N'HS>?C&?V@%+_FU9NF38MG5QN#HR,-PF=1U[%I-RW;/'!S5&,2NS<68(7E +MMSPH,;6EW+\]F./TX%YZ"D<7%/D:[ADY[S+,#L:VCB[03S3\LN:GIVT=;9S_ +M/3WSJ>;'7YT6;ZUMR\`MO#;0=-17>(F?H:87'CPV+9<@G.?45TB0E#HAQSSJ +M\3TF\*8#8V&E\1,JZ_T'/YG66N:\V#TC1"D^YFHX/Y+KQW\TZ77#>Z67I^N,HUX(:5Q.LV>PP^>1JTP +M8W+8U8`9+;%W@ZX3[Z33;[KX/7K\;?KKR$3..+-@JM7XC_5(JD+;ITKIV:ZP +MIZ$#K0H#&P&AI133?1]B*@M1*1H#1`='WWLH'%\_L@M+:UPJ'9H;8`IH)L__V4.%D)=! +M$V-M>ZG'+XVR>!7-&OQN--\U/[=.)]Y(_O#'580]Z1BSJ,DZF.)9*:RY9"<7$XN=;Y"O)9",HA$D@ +M6.AKC!;*C1>O1JJK0:W^PVKDN"?]XM60'Y3&PO3"8%%ZO+SRDO1JC<6CE0,+ +MRXNX;"$W#%OGF1"8"'R_=+X<\V9C79$ZU1'T0DSCW(=9C77(E*)2F310&LK7 +MH1+3*.L^J,>0GA>)-66]*7CPC@TL)HU0,J:;,\IJR]@H*>LE22;HO<7A/&T^ +MEWJ]Q%C]<-&#N>L$?QZ*59<&VD@$YIGNAAE]&7O]$T%[](\32NC']K]HM] +M9]ZRYETG5!9[Y+5Q7(AE-4R7E/'G#L<(G?$BOG"-0IGQC'C&OT=NNDRC +M$C+9UVO46X'L[PO01>Q5$JU3>,M%E^@)KFAXC74^NT$9>)@R3S_^X?1 +M^[1&8->[-%\0]\/#:.V)-1Z2+?!^^&$6+XNQUUQ;AM#?@;$N&5(Z&__\\.#= +M"F3W>)V),N3&LOS/_J\P3Z[Q%XCV> +M)[FV#!XYY+6R7QF/=!YSVVLRC4=][.XUM[U&TO$Y)0V=MM03[TP\_CG>!L\H +MM0W$6N$%:-WV6CVU>/CPN]>(<4);6UI*[9,;,E[CLW&"R6F&&8V>F=GP5#JD +M].MB6NYUID,?.+4SHP\\@EQEK]?&$--E8IED#E[T2$%?3X/,PT\]\M)K!6>X +M&SS\[?E'G'J*,QO4\:`Q31->DE#.FD=`KV?&9HUX5LID"X+WIF]YC>#3H(Q_ +MY;4"76TDV!6;C4C??'?9ZR1E1G^BYP`][A'[YZ[/-J-R8DDZOD.>G@,71A]. +M7Y`>CA7TS>3ZHW2N/PHT%ISI;:3V-,I$Q\^/U4NVY`X'/G(=GMRT_37Z.JA, +MG$)ELDCW`!1M4CNAY9[8OKEI-'LBIH];`JG,Q^UUPP5XK_>8Y8"R&M')XS +M=AGP>L+K`J_=T`?S[]T.;H]=-BU>OOSRY2*V^=MC7WYNY1-M.?PA\6OA`PTZ +MS7:INFH0.P@8^AJPME;%Y%RQNC[ZNEACGS5?6EL+74-#/='._>4WT-C\A<;F +MQN@]Z5AK!9_DI]\T>A@]D@D=& +M>FZ*,B?V9GJ[A9Y;Z;F-GMOI^2L]=]#S-WHFT7,G/37T3*9Z!0Z'^&JUXU'` +M.53=M66MJHT=S":*TZ#DUIJB3P5GH"]R8^YK:U>PH!24@ZZ@1.1&^8:--\[W +MO"$QL4:]-4*4-552\]6&NZ6!NKLAO[IVO)Q3._QNJ:"P=A252F&LJ,1ECBHH +MHIE0G4DS7J/8F>:L,K[6TEB#&H0;E5$#"[T-"J<))N6X]`V3W@6-D/A[6Y1OE#+%]IQ)JL-X+Z +MGM:8._HHR?I7!%=+079P+E8@BV1@;PSRZ\&YA^?6D?2Z?^X]DFT^7B;EWB-) +M//VU-ZX(YH[VYN22G.MC,H\+$#5VC9PG*23W>F.N[$[,3S3X1':0:([XJD[J +MP!Z25":UH_:BQJ52(EO)=?&PX`D>77=%,#(:.R$LOL'TO]EIB]!>4.N)`KPV +M/G)^^NCFD)23?O[W;^QN]R;RI>)DBNLZ<>L"+V&C-^CA*[J'N!UO^5NF6OZV +MN2&=I,CX!10[C!X6E:)RM"1FC")(-2AA>:-",J1";7!'+R#)LA;[:U>"-G[.V+/9^<'A0Z$>5^%,F9,#,01V'`,<*5O*WD1TOPYNG +M:2/7YA6"T$C^ +MUU+\]3^#OT.>2VE[[;6@4BE]+[7A+'?#@0ECY]CQ%];6$VTJ7R[62=`VZ%`P +MRI%R*S<2=4::<[X8Z0UK,9I=)[[_F!C%*V@4,X:V+WA?W> +M1+Z\V/:H.U['4TX;B31CXCD+`=<-L?XOOO?&ZK5B%2WHZVL`;X]')BY_V,)+ +MWB2LHC44,1%,B68[DKHTC654Z,[,Q[S<.DECWZA[7@I?NPMR-(29EW&7.+NL6O/;2 +MZRJZI6=QGE5B6>.SV3TO@I-@XUG5/2\N>//A-Y>^^=2;B]]<].:*-Y][,S=^ +M;W3EFR'^-Y/_#?"_/O[7TQ(&W=!(0EGUIJOE;5[TGH%O81:RSZ1YY?=<(O$< +M(;Y7H1*F/1=K?''2FNAK&-O?+VE8(U:)]'(]-SUZP_4*I^]O1[]:*-:)@/.^ +M:6%Z^:;L]*C$?KDB@:J_2VO8N^:[),V]:YY.X=/-__KV=U\6E*>%SVD0*T1A +M^>=6(:V$O8B;+QS]SO!WB0MT-;XS*CH73*BF;!>?D-)R?_O9( +MM9RDR`^S-GK*O9>L'_D6UZ'W6?>VR=_-M\HVI$O[T<^L_1N"?=9A#Z(H>#JM +MVZ=3.PK.\#1@]P.]G/X,0F.7;>"[1Y[5X.G<#2GJJV"&-(CP\8/AF!KV?@@< +M5VB6;S0?6:OQU1@E^AI.Y0E04GX#2LAM;"M7`N<\$]^%M$?_`$%K$=*[T+J% +M=(E+B]5K&+MD-?9BE(9*HO9>4_"_\I9;WICW1BYQ_FF.-@?4W-7P3BQJ3N%: +M+\PEL<9F(G._7_=$HQ8^YP:L_CKF=,Z2::6S?3NZ@YV_T3*+G3GIJZ)D0KZXR(6M)[$5)XYPJ^B"QE"9" +MXCB&_])_L`C`'GYX][CXO*H)M5.E!K.Q3`O17<XWH\:]FS4B?VEGD=3_W` +M_+!,JJZ]ENN1R[^_!"7O+]NVC,_/^+A+45(7=FRC*`LEO65.^`]?9K,XK:DJ +M9/#8HFS4,Y3GWFIN*ROC(?3B^S(I7LO;AJ^VE[75M#29V!?HQ_/N,'>6=>:A +M`=F[S$G+SCDE%E_O*F-Q5OW]R%VQ3AF9;+NYAV2#J=*`D-#)3)68MFO.UI'; +M"*M='TOC=P_?'MOKY"C-ES\L'=\VWXZ1.R^#'F7W*#EG]W#`H+,#0]049`.R +M_V4."'TS7+0^-1)!:G64\.9?L7>6?1,#Q%CUQR.QV[>;UO^,QH*"],9MRQ#_ +M%G%5F8V(]5"LTMACPO*YUZR0/_]VF;(%M=V[/$@Q]RY'&#L)W8CJNQK=\1^7 +MN>+8+_A+[1?2%U+6Q,/ST`+H*%.05XEF[BL3W^$;5]RWW.U\@S29RD4+K@BF +MES<3?6%,)CJ4.]I%LS&UTZ+?@YT.*:[PKT"%:9;27[W42RL*=C3DZGG2.SN'HJY;LB':W3)EYR +MC]@S$GM5?ZG5)EYYCZ`*W>-3":H%9S0W@*?Z][(K@@$.GU0_V^]QX-_>V`\C +MI(R]Y@]E*E_K=PO=&7V%^>AM5(B_T+F^P[VL]^B!>J(AL"4UHI_/;1W/)Y>S +M^.,\=C*]*5LRJ81GEVOTMVG"VKER_'+SO3*2(;.OPP[_6;Z&3=FC37`.+$X< +M0W1#\*I8P=G8M5R7?177CXB=2.5C,:,QG^5_+DE_-/A(\+Z@_/GGRY4MC,;O +MW\NO(PI^G2ES;)HKR5LR5X"+@#W`SN7J6I::79=^7[%DT-(A4XGO]8?5QJRP +MK_&*AWO=:D45_MQ`, +MKEDA<+[SEH(!!QJB1+5=U9<.BJXHHY"7AQC]_7QNO`QP=657FE?PF((SOFDH +MZ!NB%3I>1JWHXVHT6VFF?5>_5M14V::F96O8.(GCZAYG!G!V-;RN'DT^_M+*LLZ,6`FV@I, +M+23>9D+M8K.P^C/BCOY22Q,WWJ'*SY3Q;*(H#VU/9L/Z!UI<*8OE>QH[L,X3 +M7[@WP!:NF#CRSY<]$G@;X['*$=1.:M_B&+4O_L(: +M5U!H\>IHQ:\S83-R3BR1?8ZI;%$(7LTK.M-?^;ODBL=>'E8^WC0)>R`#;E[5 +MG'VSN7'N=&G8Z#\-'U8^P1Q6?KUY0^PO)+]ELH$$$]QM_^?GN=/FSP2__O.K<].OG0A)-U4BKY$#!^7P:_"2H +M5W\\]./!J;3.XU4V/C8[>T;8UP#.*I.IG38.W!@-C;_^99\31EX#FL.-M[[\ +M)ZZ3)IZ!XC]+EY-WO,SXCNHG0S\9/#[VIQ$%?_`VE)$48Y[I:KBKK]1H1.=F +M?Q+]$ZW1/V=_3*$)%+J>'L]WZ@;!:SVU!E9AR]:0Y)S^WES7Q/`H-;_#A['1 +M!87^!FBD*T=)6N5P*1\XZ6ODEG+C*_GJ@+U>:?R'P^5T5W#CRR].8!1^[^7W +MYD+70NM-P[OW??PR4MZ;^]%]&[^[.6:>Z6]4PUF-,\*9C0UAK7$8<<)GO2P% +MKXN91`="L2U/,/;3RY>L'+ERT"L#7Y&"H=@>BLE?>(#UGO7P6?8%W\1_O%VV0JZ\9-/@U*7ZM>=5K0]\.K73Q=U9]]:`G7U/> +M=[WCR>_?(-.Z63UH_6M2\,*5C*=[)@XK-Z*?1`OOQV\Z00N_C'[E[\Y8^2GE +M).B7AAO`HTGIV+M"^K!+C(&_NU_^KHQR9,?`T6&,`@W9X*8:Y?G'YDU^N'+=2/#?S5O^50HOI_3EZ\'[]!HFW2J5U#.U4)WX2 +M_?4+\O?R6;6W`M7>D*?KE2WC"+6H28UQM$ +M6!%0Y5`4.3<3)#Y +MZ+?K6O%;](;SOHA^4?1NY>W:'ML!]&G[>:.LI437!.E]%9\ +MS7N@%V'=UM@V2@?'UO.5]^;V>$#^+O+*IZ^]-QVK@*^+_\I5O.N/[]LJ!KXQS1O>LEX$/H!(8E;2&VR>HO(],JGQ@ +M;$S-&&M>_:J@"\$&Q"\THV>Y&I3X>R;P;5'9V)A,>?)VO$=?YS1F;Y`_G_E* +MY]UB#\0=SMC(/I_U"G$0VP,;V$&)9`M0X9=>("F>5O.'J)5L_"W#0??.;OAP +ME)3O;J3>=?4T7/UJ#K3F]`M:JTP<.@&ZWF'8^7T`O,60\DRSH+17XV>O0/88 +M&ALVXKR1P[F>P[X>;3<&2I(Q6):,H?.EL:,4;>SP@K-N:6#C.PZWJ+ZK7\57 +MPV/KLP7?.-#9Z\+W'M`>C/>JD5=?AC96F5?3:I6:J]4CK[FL +MVKR&E:^/O/[_D508N)0BX^AM\;P$.8V,>@K5%L^WJ +M5X==:@R>-AA_IP\6X_1>L)3:\5[ZU:]NG%N:/4T2[7DO*,ID/.V]X'OI+T#6S9P412K<*?&Q]([OOMP^2.7/!I=,/"1]`[OWD+RFY_O +MT[T_!W4_FCX_W:2>R)^_^&K'V,#2S(:,]>IN^?V'7A6XXPT?_/"6V`WA_8V@ +MGC=0SA=>?>A5>_G]+K/0\J)&%BXD'KWC*#D_D^N^2&;B]M)-#^:6 +M[\C.C=X2Z\1U8:LDJ*7V(^\R:50O.+).%5KKB\W5@EQ[^9B:]9?%SL.IH;--\+OFO\=LL- +M(_]R63:;+DV5Y/AS?%;-?A&[6Y=RSFBMM)CXB726R:XP1Y6I7/>\,[9K1";Q +M2*Z)NR>`$X!>IR,;\1#"RV@E7D[/"BY=BUUQP%&*]^%PO(+B1SEIHC?4SC[] +M&@O..KN1J.19?1K.W,[K&,GE9,=R1G/L1^>N:K4?O6+DJ,LT)F>H[+S@[;&_ +MCA`6/:SZCMC?1@B+GDFQ.T<(BYZ:V.01PJ)'6.F$8DI8;[B.[X<5G-6KD<7E +M2SZ=JS)6+EU"G#:;4=WQ6G`G/JX5NCA^;[2M9@AVC9^MPNJ?WN""/J\!-L^^ +M!L:FQJ>:-Y;=5`8HCG@\?2WXD+1WE"TJ<76[5X7H[T[BB#-G7;."?>[>OIO" +M768=7K5S3>:L]+7'Z6W3FA":ZTEU[AI5+JX>5EW$J?O(A[VI7\*H-H9@4 +M5AKEL-QXS>HO)F`%89(V7_ZN\^IYJ]GGA(W;??MXYR=PRUS +ML*=XPVKL^4V7M$O9M:PJ-<8*C?%4:*CTKK98RV:4C,SF_G>*RT]?N +M7+-LC12_>FXKQ!YI@=B#\VV"&';0T<.GJ8=B'[T+,S[,73-NE!)_P72M@Y;" +MO66J-'KRX)$-JX7L42GVE8M_N:^,]J:S";'K^4YZ0_S3U9E,8L_/`%Q3H_'5 +M?/9YV7?F=OG]=.+T&=>*^3A]\31<0+3E`J(M8<*V"TQOFS%ZUQDCC`MV@H_/ +M%^,D\=:[UPPBVGGJZ+RPYOD9%\<@"P*:7=:@=1/,Z\NZS!*0D0DR.M>0R5N* +MUWR8+J"4@D_WATO1OL][4TO_N`:["B4-L/EVQ7[.G@N;_H.8)U<$L5N3QBTH +M5&>W)K73X6_3?ORZQIO03.IRP]TOY3XK6M&^SJL?'L_K[$-U/KP&\KR;($%M +M-A]>4Q1$[;>9V*'6&U/VU._&).@D^6SZZ451SX*7L.)O'`G-L<8$CG';=EX2 +MZD6N.Y_;N2:=:6%7@RN]W\M=B6=GZ5AYU&JL.3>]BCQC;?R=\3A1@;YNZOUU +MIA)_?0U1@NU2+NAXEX9SJ#]9G)H3+:\V!F]X.'?T#H+!+2,%+?]LS?IUKZ/Y:VQJ`O04# +M0HVHR4VX1=A3?=5G#7)'O'^979;`TD8*K6U+7M*1^ +M;?[32643V82SOKLVMNC9?2L#*^>M?..UC2NQ5XUODN$.#>Z)(H2\!=\]]XC\ +MMF>\%'SC-5?UM8,$]SS^M:MC;SZ;M7+52K8'7,ACZ?*1=U][+.C_KCKV]V?S +M5IZQO>!]!.S=KZ6B"6I#PDS62;%/S(7E2^[),`U +M"?L;+XT?GL4^!S[)C8\%7W;6\8^&"[S8N4:F$G#>Z>='/._*_SSQFM`L2>RK +M'?)VS^M;CRBOO\>M?>3W/WB5'>S09NY=O$X)INA&YT<]04$YP`=Y&X+K;QEU +M0WY6(Z2E#.*;3)).>[]^`W%IY[S^2_X)-=!\"0Y_'53'?!VK@M>A.YDM=.># +M5V\A3+S%!%>CY>9&H04PD7\?5KG-_`U'[.M5SMM0*!A82P]^_WH!AH[ +M%O\$NRZ=0N-O>QV[L.\/WC`8NT:665M65OW!X"_3GY5TPEJY4QWGD#T3OYA@ +M2OAV^J/(UR$N.YSQI]'/HE(G?#_OT?-&&H.'CS*(:P8WVYKRV*/!.-YJ1[P_ +MT(J]3[_8S]D@VDJE":X7Y:X/L2JANYXF:;26O1==_RAR7/TJ_G(-1Z>Q-$.` +M%Y^FGT.P/H=_QZKJ8MB#_B3Z3Y[_L?2'7EWO:*PA%TR57I(R8T(2>(2XM-&CK24^'^:9"Q3](%]-^E +M'KW#H8^=?=V!OD+T+:U!GGCIQ5\3_-^-ON-`ON\;@/R[@]]I`_G&P7KU1T,_ +M&JQG?#CPPVC;48!F9N@;J?T(Z&;6QTRNB7F+?I]*%[J8MRG\#CWO +MLT"$4.\GT>H%_2:+_KC/8['#:?IK>.U(L+ +M%@1]#/8,PFH,>#[@N5^WNDU97[SWAM2B74QIL>4M8HR3V?*6[]Y`>,\;;36. +M7JYQW/'&C@4!]M$;';AF_P>^)\KR`PV'S""S<@^;B)7&_S`<\=ZUS3SV),T] +MGML4.ZA"ITER2&/Q"K9;WI*Y]HJ@D"Z=QM]*O@O<0YT#[L.7242S_O`87KZ.B[#+S:+8KMW6/XH/9%2,N +MBQW-=O\B3KS7K55:ODQD2[EBS\'-XQXHN]]LICBQOZ`29_'![`=&W$_:L)N8<[:LICW`#N`FC`6D+ +M*$VBM%I.+Q]]$]9NPDX%-FZT5C0HU2O6%N@4[N;BUBPJJXS!ZL_5N"[[];5F +M;J7IB;UO[EFKA+.%[2BW67$U#H[]W:FW-?_G/+_8?7S?W+<6+:I4W/C3G&5V_B`!+L4[(U@ +M9^0^OH>9S7QO8J\SR.E!D$G5Q&FTR?7HFS>_R1A:\=.A$:5! +M^^P=X7R;*_&8_FL841PV_B7)'_8XNQ!IC>>_F>[L@XUW0N-;8D*L_$V)\J?> +M(1VEC;_W_!;IZ-)[*NX=?6_Y6HD1[^6C+PMTXJW&N\+R1BO'QR22ULZ-7?^B +MV%=]Z7G\7?V,L.+Y2RWF967LP[E*-JNN)$[*F]W>BH>PS+'B0:O/'=YGCK#@ +M^4MMJP4/^LFJSXN!CX%%B[S[J3??3Q>;:OD*/DLNB;WW8LYKX56F]`31J2?I +M>8J>I^E90L]2>IZAYUEZGJ/G>7I>H.=%>EZ*GKKK^Z)D\K>HI/)WL7,6;(%N +M)[$+S"U+W>&\4>=N/&>=>.^^1?SFCLIF'5X*K>NTKFA=P;K\=;GK>JPK6>>* +M%Q3W:)3B!=U*&M/B!45%C;YX0=>"1F^\H#"_T1TO*,AM3(\7Z*'&#O&H4V+> +M*'\XG4;=3Z/N;CQGW43Z0FT\A[YP-V;%86GJCT^57H@->FD7YZE?7+IL-7XW +M^/,9PWOS3JYSJ3.Q:-HW=(+UK#'V*P&\+>J;\1N?>WR?WHNCB% +M*F/N+6*W]I%UW\3X>70JX[%%0OK!]W)CI:-QZ$V_$1[N;4:H'=!,G&*7`EW% +M+VQ5!,?>7;?]OX?SCCG +MG#//^O_]/_R?^`?_#RF,&L;_AON%\)-(AO];#WW?B3Z/T;/_*RK92N_':L*9 +M,DP@)0HGPG&6&$#/&'HFT[.(GG7T;*(G24^XDM+I&4//9'H6T;..GDWT).D) +M5U$Z/6/HF4S/(GK6T;.)GB0]X:LI_6HV:='5*_?*3*N9X@O9Q.N+RV\<5 +M(2ZW?9R!N%#[N%Z(Z]0^KA1QF>WC^B(NO7U4%-2TGJ+'015%VMEO3:VG,0Q,'HE^`M=V1Z5E.GP!36V-ZGM,? +MP,[NP/0BIR^`D>UG>B^G'X"%[65Z7ZJ?U)Z:N']OG[\LV^DO9B_Y>;([?8!/]1>PBO\YZ^_-8T!]B^WQ9;*-/8R_Z +M%.N'-)WP5@U-="T%COPAJ%GW,$,_<)8!?*)G('N6Z4AC+*@IU+L[YD>C*9G/R_\VEISV1JS[EGM[9G_O]<7>Q&JFMB:UW6K/_!?E53 +M72?;P/G._\%^53##?K"U+NO/3%?[==":DT2C)@V(Q]TDB\TS57;'Y@IE7ERM +MQ=Q06(9^,EFB>%@&\H#&*`G='"9WT(C.Q$%0+U`H3'0MIM)OO6XBO3FIQQ7D +M`3TD&ODG2=#:/SN_-SF_MSF_?W-^)SN_4YS?Z6V6?\E:%V[;K__3[QYZUU@' +M@D]316V"8.*D!U@'32%Q,L0L54I4F@0K36566BG@P7JK['A3A4SS6:$YHK*) +M:0&:IQK-TRR:IS0/:3YNI'GY(LU/,4][T3PMI7G:E^8IS6-??YJG)LU3T)9! +M-&X*"ZJR%NE*=I$OSGK[JEG0 +M-X[M4R>PC>H-[$7U9C9'O9U-5">QBU2+VC";\F=2>^KI5Z\-]EL*/&[^\6J" +MS0D&>MC\XY]H^!013H_S<-MTB]+;IE$8](@HM,I_+99I$'=3;/?1+ +M8S!)"6H%1"^E&F92O#8R%-0N[QS4KLP*:O',H%:M!;5QP:`V(1#4;O`'M9O5 +MH";;8WPN>X`O<#O1,ZLG['Z]`"['05Y6'L4*9$X_?? +M+1=EJJL9+U]E=W-:"QBE\`=]DNX`"]%!(R%,_T_C^[]SC`(.+AOL0O7Q/((V +MS7N-W:T6TKQGOJ:*.FH+\/C_5'M4UD3SA_BBV2XM]*I+RUOITO05+JUHF4LS +M7G1IO9YW::7/NK2^2UU:OZ==6O\G79JYV*4-LEW:L(4N[8(%+BWV".6A_J`O +MX*](P-!#"M-*@S2F]+#IR9)YUQ";]MIL227\Z44P0'Z.0_1-+S[VM+81OF51 +M>HAP+8_&5Z=Q+J+Q-FC<>]'XE]+X]J5Q[D>XT9_PQ+R]%0>8'?8-HK1AE.<" +MRALC/!A)>'!Y:LW\E-/@@3$'9K1N^X81S"X@F,GWAS-=]X8SLVNVSF#6$T1O +M>JM9!#.:U^I(!V9Y!$NB%VH1P9;FM]J+OB-ZX>M+Y=#\)GHQA^C%G'3JAWHY +MC5,!>!WB0:4[HK%2HM4RP42B][Y$GTW@`!,TO]:))P34!U%:?X*+`KBXFRHH +M'_^N'\69H/DIC-S]9TK;>%IK#0`>< +M9Q++POJAR/1[*9VL?"]#CO +MM:<1WY9%[U+34,SAJ1E,3Z2R9E9*08K(Z?1B;VE3A"3#34T^M`XV4FL;J)#_4TK?49AWY +MI,3BV,`DP83"^E'ZG54W%GPA9`L)\D6]&6.:ECS^G&4$LB:+6DA>L];*6DZ_1;18]#3BYY2>OK2TX^>_O28]`RB9Q@] +M%]`3HV +M^?0LH,>FYTEZEM+S/#W+Z%E)#Z?-M&X/POR$G$;S'CBC$LX$2";02";((ID@ +M1#)!'LD$.LD$18Y,T(MD@E*2"?J23-"/9(+^)!.8)!,`=U,T7NU'-(B]H(+^ +ML^-;^%S+8^O54D\'+12@M>%0HB1`88YWB7`F?H?B%W2,67%W.L>CL0A+F,]R +MF89YY;ICR]CDY*A91OP(XH!SK"X>I[$M9=,J3?[458Y3$3^M0,37Z29_INGC +MF%*;S91I85=-5*3)LJ90N1Q_G+KQBSHDK,541^J]@-[1!ONDJ/O_;3(/Y!W` +M61&T0_QSUXYELC5.(EP';`D^H3J:VTRI"_''717K'YK'`@4(OQK!VK(OX8UX^\8J`N70_ +M\8TSHAF89RWE43D%QXG'I++P#>)MFMN(EZA^B>H_]=L6VD3P+U(%;<)\GTIM +M\&39(:(3ICYK807S,ZON/]"8WZ(=R>2Z^*GEH/S?+(O2."UA#BV1!2W!:4/0 +MDB3D#E<3X5*E&00MJ[=,\!V3E0('"9YV +M,^$@TMM\(T\C$N^QHFWS,F6(!GD&:?\=61_MAKS_W\$[_BWA'JTWZOTK9*$K +M(AEJ]LLR4Z4"54[H%O&Z)G'`IN86O*\JP8E96/WV.0(0\D.A[;S3VA5G2<;C +MU1HVHR4>.(WU[NV3$::&U:O>DIE,ZT[@AY,E[$WBL:G.P(=4WL`^QBV$+Q:M +M'9VAEYIA:M"'L%F+8QCC;D2G_%CW9A&\)[UM%KTOLQN4*2KG#4\D2_Z",'T3 +MQ+I7PV(^J,&L**=AC$4Y_;1>I3;0F@5ZQZ:5:?:_J0WJ0(W-?CR;3=I4B3+7 +M>Z9K+%"5_;9*OYI2OMX_U/>VO\2WP>]5&_S35'B7.;:,E6=NKI`/)$L^\UNJ3K]?^)G:0&W; +MP*9K[P:G:V]G3M?69U%;'Z'^O$O]Z4S]86:%]8H%W*#PY7O2>S-*G +M%M#82SX[(&#+[J\S;W97J5)%&^'^;$YY)_;\] +MC<*!K2$VE_+1T-V!]^G?5_@(KI,D"EN2*=6\8P9HW%C'[RO2#B9+,`YO,+=& +M,GJ,GE#;<;'GG8R`QE*;JUA=4R53'J]DBXT1]MMG&\U/$)]%8\;RWB]?3&UZ +M+#'Y$6M8(J)/R#<86U])\SQF3\XWFI,7FLC'UR,'KR[_@!IW]$RC2Z*[";P" +M3/2978VCR=--]?AVONX=K26>$S@1I.\FC:D*T5QX8+!/_;6R['UG&F&G+*)' +M\0>D\[(>=/+6@6>\(M=@CWCBEM[!(&DE;B\)&6QA2=R>WT'$`^\0_Z2(?Z#K +M>5GLZ;,-_CWQ:;3@1%B>-V[%J#^UIZMV]7_HUW=G&K]SVM+L].$7[?WZ3*._ +MDT>_YV0)8,SG08SF`<0I.:S-7D_SW0G/IS!U0[7_8!@>Z(J)1\:FN/["Z<:6 +MQ`#+NO5D"1^O\T]&L':R*>`![,I:PO/F9`<3<+5G^HU#U&:T28.N>9*%,6>` +ME&0'B]>T[3Y;H3IO9 +M[ZC--R;%_+WF9(DUJ*-A51.^7Y:KM]"8?I1GTH#XA\\3?'S=#+2-L0'JU\3G +MHQ[;T\WP$WU&W+=.G*XX:P;!"VI]:WR6P%0TY8/][)8'.(QO-^68S-HN7D;.H'?0MZ@KG"ZJ(:WCV)IB7LP)5QR&CZ +MLM-U)5'`^[8^U=\71-^LISMRV.GL9"2.?E$>;8G,K&=.-Y@25@>]1&5RV24< +MUZLS#1FP.R,9<5/%@+T%A8G3*$/+='E$\3B.1H/19.T!HHT_HIPVC$#$G'6?QQ +MR%CUTTB.+;38'"N$]:V4^'L7>'QJDT*P8GG47J5`9=/L&Q1_5'/5%ZO2\::Q +M!=B'J+]6E942E4W97#&;IJ7LH?;/*!RGR%%-KHE;.6@?Y$@/,UW6`&+>))K7 +M^@TJI;>FQ4T980\-J,S&J42#`8-`38GIJ6E:XDE<&$S]\2(#^E.DY5`; +ME,00T][9PR`>/H8U4%;&JE*B(,;FQ$.R/)3JIUG84B>[@9<[??-8Z4!S"6B: +M/K0['R.VOUG@X7L.O.H8[_L@&C.9VF"/(SQX9$A0:5]Z53WE*GC=><@_)4 +M:WX?@\O7GS;S=8<]4AS75W4E'(_&K(T.#!8[;3BOP!`XM4B[EK?=P_%+.4KA +M1B?O(N1=S_%+K=$M6?$"SN-2\[^`^&KVR-/EOBZ +MTS[S=$-.%)O6&PD^1]TKFTNLCD2;!VH&RL,\FT#]T6=K8HY2/CY_7R*X@":_ +M$!1X\0*]W\GASFKW)7D8ZT;M'A&6G+#U0U+`X\[FB(_HCGR<\CGU+,;QPW1#-!WBQ,=KM!-\X\-_A`Y4$&X>\+*B33.55B3?EM%P])5YQ +MXK53XE7$2Y`E1;R+YFU49[$QD$?408U$Z4E)K-X-O^6A10^CT4>O@], +M_/-)$A:RG;)=:"_6%2I7:F;Q1)LTMY.F.&DGVJ1YG#352?O92?-2?3F_TJX< +MIUTY3KO4WV@7TOV4IK&)\D--=P#B(\FCL`DLP]\;$.^"7:!K&1)XB^!ZL%^=#KTBT +M5";Y09]#](OXVPX8HYHQVM+EZ,T8K2^M6=889TZ=*>:?S->$R?$LDGT\-:;% +MZ7Q]@=G5,K4L"V&LR9(6HK!":ZN+THLH#;2QD'X5HIE3>7&+7]#`XO8TY=190G15BKDR[@'"^UF=8YXLT^S2T1X_S-83D1WV(0G.+ +M:'!Z'P-ZN[HA-+=&.O-G,,**P08UE^@C>W`\QURM?LE9;]?U:N4EF`59-=:E +M9O,2E<55=N`-DJ^BL71Z#X"OH'6;:$$LC>@_\TLFNY'6"8LYLA.+\;8%FB/- +MDRW.6V+=O]=':Q3-.P8DD&53J8F;;)X48KE-%?=Z:[7G:$SFN6JA(XW-D^BW +M#GJ**IX'Z>Q1DGEX,3F;M^/A&!?L*U__R +M1(1=ZC*\X*?>RC>@4P>?-9_&$#0>8Z@?H;47\X_:VI/@8Q\_@35/LS?)!N85 +MY';C;1HCHL-=RXCEDZ$SH_)6Y7/:;?]+YFNH]9#+8#^+<='_<2(R@=IP)#&9 +MOFBJM&`W0G5I[\K,_<003:''2X^''A\]ZA,.O28Y3ZIY/ZK]\$1D'(4')L;48>VTN-R7Y./DJQVJJ?3P<2'> +M0DH\'55(;N;]7>@Q0^AOPD/]'>KTUROZ^[=?ZZ]7]/>V_]!?^0S#7_,K_4V6 +M&IZ:UG%IVRXEL:X2[5+;M"OKM]HU[C^TJ_H_M.O'4B/GU]JUM]3H7--F'/)H +M'#S,,))#?WTIS +M3Y04I=I2X;1E4KA*&*FM1SC.Z<2=.RK`.YQ:MOY!J7%]C9'JFTJT96P=03L\ +M637UIWH:-U.:?6YW6L^HG(L)UB03_%H;];=+C3M2Y3AX&#@Y7>/K#+4A>QXM +M-S1>`8*Q?M211_Z2C"0`_U\K;W6I4>^4YZG9L20QM8/*FM^(/KE%9MV(]RBB +M)TEQ)?1;#)Y1$3PC:\XS&[:`+A+Y7YOHYD +MN-@_9.9UZF23"1:GBSH!H]]_)F"D)6B]?YIFGJQ;)R'(SS?`D@62.'M(2IG6&?V9,D2SO^G1`J-F +MP"@A8*0O<6#DP"`PV6L&$+^C!Y?W4N.@4GL9C87M%W"1G>^#-!;V0E%&%R=. +MP_@L<.#D/U&2XL/8OZGM5#_J01]DR$;MYN.`.%A=_0K`)^K@/70S;_`Q`MX7 +MU8PU/2WC1/3P0*682QBK!<5F4;W0;UPY7V;%3CA.8<,)5U.XNQ,>1V'K\''! +MBWUU/(*]L"F),677)2;7,4FO2M$-MG!'N7QRYR]HAX7Y,+`4^L44G\9E,'D$ +MR4PU/M,^K:>Q"[!<80C:44&\QF(UKJ]/1'P.[J!?-Q,\4OAQ$/G/+34"#G[8 +MVZ1?X-#/P+.^K7F.SKQ094$II)%L?6AF!\YG\7V,@!Y2:Z1Y&LD%1Q!?1[!4 +M4FDLQ`[TCQ/-7L+J\DS]\DQC;XI>._5(1._MDM9Z]D)72W35)+QS\7')B]M* +M<\1-[:$T+8WZ=(#X4U?"Q_'@`/C3T0Y-4<0ZO)/*V`OZ74LR!,/>U$Z?1/PB +M"]K9'EH'9^4RW?U(."9988OEX\*"81JC1VXS-]GD<::]1HRY_6`K+&5:0^UU +MK?"JH_?_';"Q^V8:.U.PV2'6T1*"C:ZTP@9Q'0$OJ7U<%^1+1EKBI##U!\]B +M%383)G#ZC'Q3*Z6'/;&S'3U4J=]NI]\*?:^BWX\XN)ZB=0ZL]=X"SM;F8D-W +M"YZ6T^&/>AB/T[II+SU>,BA%0V[$/$QRO/NM>7@QY)F=U.ZDTQ=F1S'V:&]I +M34.T93S`+^2,->WI/1RZD*+;3GR]TU[;8Y8J8MY-P+R;X\B?)]M3=I+N&S0,> +M8._T%^4T1(P/G'*`)VA7"ZXHIY9C4CDD/TJ;?UG.NHCQ58H^`,?:XM6N#`.Z +MM5_MQ^J(T93J[\W'N4R$-,"?TPU_@1HE'E+V2ZI"#^:3CV2U@$R\&61?C87X +M6)^.L7;H&*$4]`[_2*R+UEUZO.0FXN/UF3V,NQ/%1*L$C8)\=3?)5RY'CY@! +MV52E>>5Q]MR:93..M9OSJ646=`^O4IL2R0(3ZY6M$`]0'R6^5,:<#KF/;ZE( +M.Y8L`2[:?^MA+*:ZV)#CA$^+U'E4CPP'NDPVN6Y[^F;J%\FY#E\@4=D6-U2R +MA#SOJ14ZU9SC7`=![TAW[3SCU>(M?8 +MM9@#@*>6>#_:L4;E\XCET-K_;G<^ESJUB=/?%G&9E!?P-!V^B>=_L[NSAH;C +M`]K&O^[$$U^O^74U$WI2.:Q=,!]C$=9BF`M5.TW2WD#,A-W,^F.1TDMLL9G4P][J8!KF.+0S'F+\I +M6X9\UY'I^)ZWB>@I]`=HI^U_<-J^'?%/BGC(T/:L5EX><@=? +MRV8D(X=X'*N2H/-L,P8^\/?Q-F/0%J__&#&F.'S\?FK_WEJ:H_7$F[H*8MX: +M9D45K@^K8A^?B-@U&9SNHOT[A?X@UH-@@'U(73M>TC\E!WY]3,".UND4_'K= +M!?AMXO!+]3?5-WN&Z!N')<&U/2S5-K!4R]@"@F5@/<%R9X6?:L:X<%CFM<(2 +M<`,L[3M%N2Z^_],>9@K@6)F"65.E]%-[F`T&O?W=K\-,/R?":?AOPLP+F"4K +MK:4G(OKE`F989WO/+.;ZF]Z`69OQ[0W^;)QHJ_T/JFNA-\[U+<\?B\Q-)*/_ +M=S(3'\>BB-&8*&F1F;@^\Z-C)1+Q@':BNT$\BJG?5R)HBJ.#X?H;1P\C$2]Z +M)U\KB&8406X8&K=;9'7!#[@@%_N8;CTJ]DZQ3VV])<+2B5/P*C-B)!T8M8M/ +MCQC?.>W4O4(^D6M*+*0#3WJD$>ULUODZK!*=Z>V35#_];FCFZ&M5"T0;^3VD!QUR4&U`D;`M@<2%6M?+UJVKT@ +MJV+_6LP%];$A)/^-B;."G9S?1!L+'5DQP'420[2!]`O=3][4:1KLQO*G3-." +M3AI3O6JJ+Y`W\BG/WYS\D#?PS4VI[^F['O1`%R/PSH$%X1B7(R#/U8F^MRU7 +M=NBX]8',X<7[WS%%@U0NDW"Y(J.[(VNHID)Q19`_@B*NOQ.7AWP!$>=/"!H. +M_9+M$W%=G;A"Y/.VTK^4+&P@7A'QULT"[M:08Y&VO%+M*>O.E5AWWN[=,G_% +M^B)D%G\-\4)MYA_+B9+,8O#R52 +MM"6E<^X,.#8Y[;N?\/("IQW=1#MX73.*5-A3C$@#XXY4#/^SBE>1R\0U\DY]W5PH\.,17TYRQG?LF"!K635QN, +M7XQY`/'OB?C?MY5CWS':R;;0/=CKG>\C#FXPX(;=2C-/;O\%S2P"':_I;1QJ +M(RN:T#,5'2NQOR*:!MWWR>866>;4;^U;>QM6BKYA#Y?:'>![1F/B]LO%AIJ8 +M'+?7BG)8CM.N'XY&],=.BKW=K@F1=@H^+#:3$1GQKU%Z1VU+<=4]].RN'C)Q$O(SDV$X\G +M_`;6#VM83V&K5-H=^Q`F2QP5_=YXE.-B/>%37FVQV,^C=22/RCL5=OKL8L,+ +M&P;PPD.SC61R@("_1F6*']]WE-M0<7WTWJ,E*%?L]5.]4[AN)HZZ +ML4>KUQ:*^D_=W^G?V_BG4YX,>X\-80/K@SXJVV!)6<@V34=+VGZCG]W;^+?S +M#:_OI5_6E_=;]?7N;=S6ICZY)AICP6A(7Q4VW*CW_#;U?GI*O26]C4EMZM6? +M.-IB0U7GT,$BAPYV`1]3T(8.8I\[HC.N]L!?;#'YJ +M#@NE?B&W'8>\16/)\04V*9#7+%I7B(\>!)LGDADQ%I!79E/_K49:XV=AKW.: +M=A_DWQ\,8R'DWP^.MMICW7N4^)QP64I?37R>J>\TC*$W8-]82KM&;I +MEQ[C\Z8=_KTH\(_+UYL-8P#TH2\2S(@W0#MMEUA;+:RYTYA9I)A:#Z55!^N! +M#`([VU/F(M_'HN_4NEI.W["&!K%FTOMTK*]6K1:@<)!^N2TG:#W!B-/M:::I +MJ;6T[A*-DFLU?@Z'9%;(26DGH&,/QTNMJ'8&/6Q+[CU/`_ZZK-!U^*,^AV_G4,(UH$.AT4,39 +MVY(<']!?1FV0Z&FG.P+_<:.HR^6T+Q_?>YSOI[;BB3WX:&0]X03?0Z4V%("H +M/V$84LT8[:$5`M\Y7H)V[S*,<33>UGA!@]@?C@H\.K.8TR][S$F.1_;'XE<_ +M[-!C*K;NNHQUMA9IV%?L,6-EX%.UB] +M,_:U=I3+B765+NCEH7/QTQR&;$JX?NP$]9'@>"R93'H3#L[6F)8KX;&@9P%- +M9$N71-G2Z31#AM-8PIC/&Y.M`3%:/T+03_ANLJ$KEX4LS`IG1!G#MYLJ7_G;CHI91(=>26ZJY/%Y +M0[2O*6[FIF1)`_T&8,_4[#-C7].X>755\V+?E=LLD,R^/D].Y?GXTY +MHE]*>+G8B"-L7T+A7CWCD-E\) +M4(95X.#&WI\C&M\?75>Y?[W,LAQ>R>_8G-@#=&YSPJ8*^ZT;B+9*3OAF"LM. +M^'8*NYSP)`HK3MBBL-L)UU/8XX1G4-CKA&=CC7?"\RCL<\+W@Y]U.>W<^K-C +MMP`<@DWBYDK;T7DDIQ+.]3&(UZ%^/.DQ)0_L%=\GV.LF]J!8(3,#+E-CI^VL +MF`U;L;RA9?*3'L;MF'L&:&T7^$]X4@48M-TKQ=S2AY]N/)%:XZD]0N?6JCO3 +M(.-"#]6&;NN0[XHD/:4WRX3>+$"T>[JDVSYG/ZZ.F:-Q+H#6!]3+/*8YS!?5 +M)E(_SI.BFNJL$Z8;]C@8#Y/D4\ELGL_MW%K6#3?6C2/)$NL]L0Y;ZW^.G-H^ +MJJ-J&>%6W::?2]B#/@.R_%QGC?[:6:.O)^;?[G5ZRQIMO4SY6)SS>T6-L./T +MQC'+\,SU/?M(H^6Z2GQ-3W@T;;>1WQ@)M,[>L:JL3NV5@0ZH,YB-9@P +MB8)GJ^I8=-*ZADTZ*5?.RF;:XLHO9T=]K3HTU[>E);H#_"]]17/_55 +M_:)VFOIU[=/JM[7;?4VU0WQ;:XM].VNO5=%/QL9P?>==2H&J)M9;LV`G.]L< +MQP(%(:8LTK:"COLWJ5P?Z?)J61V\6K=$TQ(UT7_>_=27;C7?.V'=S*-T5J_' +M/B/:J5.X5X01F`P9CX=T[<9OK]L`?HU9CX%B=N._(1 +MY^RBN!U.W![DZP;9:DQ\KQ.W'_FZ,MU-<3\Y<8>13V?+RD2^=Z1TH+NS$=44^FH=!BBMRX@SD\U-=%-?=B3L=^;RP +MC1P3[^W$G8E\-+89%-?'B3L'^0B_,BFN'X5[4%Q'S%LE&BLBV&,N0,;@>(EY +M"MZ??@.$9P5.&3U1ADN<#4:X.U\_B,=R;#W!H]@49]"82LZ\P,RN!:_HE&]( +M)>#=+9J`)N;3LNGK53;G^U@OPA?"<+TTW:O],D^3VHOBD<9YTSGOQ-N5?RQ9 +MTDMZ7RV5=O#Y-3M'S&VT";:XU"=_,#&,RPM>G&5\^KRJ-,PU"J?A0BDJ(XW2 +M6%'4U+U1=>\3Q'>1?/$#S3U>#]5)-,#/GAYFLE/2^?PG&+T_=8B?%9]G:I2. +M-.8OR$$Z=()[GQJBT3SV_S"]V.^:=!YKIC5Y'^;UU)T5:8N'5?F5:!7"^Z=X +MM,>IKA\I/^NVN8+ST_5&#/!%VGZ2!;^N*2E#W_K7##5!NQ0:.Z6K5U/I83;Q +MAX&HR>2H>6@J:-?@*`O0(P^.'J5YSZRB*)M-3UU1M/D^O$N4'W;RZTTV`_L= +M"#>9*%^9X]$*8=,SVZ,!)^QJDB,4*7X(\BC),8>(-AXEFF%7'HL@_:@33W%: +M,^*O$O'-3GPS:*E%\:-%/+.*!5U!W53'H=HA5,80'^7W*=9V,8[%1`N('OTP +MW:->2&.UG^C3>023"['VT[O?P;M#!)L+[]A6T9JVK27M*-*.;VU-HW`JK9E_ +M]WV;[[YO28/=PH7'VZ0=;TU3ZB"'3XYSWM5?:-J0N:9%XV@GQHAH)[=]L,N/ +M$2\?-5/Q6U/Q%QV+R&WB=Z;BSS\6<;6)_SH5/^Q81*%X/L^PKT3\%GCKNQ+) +MDK9P8]8&%;!3)(*K(IDRJV;0:8`'9-.&$CXHIJ18JBHM4:49])XU."IG*0SC +M(5MX5\0^UKU%41>]RYD*SJ^9"M(RG;0Y[APWTH@P>!`?2,6_8WH1/QMZ:(J? +M[>R)35YB^O`./4?B:$2:_+[)W%Y5X,!03:(PM5^5\&W]6-55/QU[17%\9Q]M +MGU]V\C=3?K1/H?SNMOD/M,^O./F9-41%FSV4W]LV_][6_!XG+_J@BC,'IKTL +M$:&PQC8>$;S=TT&3O]`TJ\ULA5E\; +M97.86>K%R0QJD[2E(J#*<1[/L!=0:;J/T_R'S[!FR80LH[JA6W;%6.V6"N)J +MXC.)S[2/:=O%^=(;:([LRJ)=[&BS$-US-Q<$9A6&^?OZA"A +M?]#BICJU$GM#%6S:U3'(8&SZE@K3.T7U'24>F_M8J(HCSC?K<5Y6S'LU]8'* +MH[@`TE+E^\.JT!F.)7PL*-?N\JB9=WE\++-I2=9=VU4V+V\>L]XQW7=37NC5 +MB09@KI@@]E>I'%Y&,&[ZZ5O*:[)' +MF!GB,+1,Q2/QLZ'T%@N2#`B]-/9"/-.':`KE+YY^+-PUW&"12@1@0[2OOE(B9'24_4Y\@O^ONZ/1TI8 +M+LT#+O>VUPWH*WIBOTKHE\]5#>O/B8A5(>8>ZW6$ZT2;WA;RF^3X!6%.N':S +M)O:AH$NGQRZG[V!#C'G;[4@$?@>PGZE_6&RX^=FW<+PG]!:UQ<8?J<[FJ1?R +M,^.I.E"VDBK;)^HY/E78_7!?)O#E!'W=AYIAX>CUIYJ!,I#G!,ER\E2ANX'M +M&M>U4MEH5ZV;\79R.%,;T:X`SH`V,W,GM2<+-)/62WMGLB2?<)#K<=)%^Q^$ +MONY/Q<8KSMX8VLEE7-B!CVVE)W4T?M;G1[@.'.GZ;>*XH_IY,LU:$=_`"?TP&?/Q8;.\#C_9=H*^;R]V_)+6?+[6.'NS +MK[R&1G$INWO](47H:7H>:='3Z+L/1\2\%G``/%-X(6<>*8&\GYQ,.)O>%"[4 +MZ!U]^H>C6PNVP8VMASELQ5XDSJRR&+5=@R[0_GVQ`;MBA/7^Q=S6)7E\>\5L +M1Q[MY\BCFZ"S&=6S=>][SI`0X&&?VY/O8_)P?1[V/SC>':7V-M=>J"I\'WYL +M7%?SJ.QI<=9-^*>Q/SVE3;0>)6!?/#YBG"38)@C';Q[^2*<4^=D\O(XWC$]1&P +M%\/91_I&STM]3_ATC=,7U+.7Y.^STXT6O=R\GL8C2$N5YSVE//BC`!]XI2B# +MSZ_O6_48@*E^1L\6/4:[^-X]C:DI_<:NPQP?^1@^DX(7]"VZ:GN*C1HJ75]03-MFI_:P8GT<['L:.U-[)]B?FF2R$`Q5@3^P=4.[P?,2C>+^&>Z$OQ>9 +M_:*<1`]C7PK^LM0/^E_4?0+MZ!(QCE.?0/_LVUMQBMO%;\@UCE':,0<')#?V +M2@B^>:U]Q[D6ZX=@*WR']N1V-O;S;<;YUL..KP)GG!N[&2',TW./1!XB7HOC +M%^R\GNO-RRE-#+!`QT,6^\49?=Z?K3V,>:D]28SCK/\PCO_N8=S3)B\?Q\5M +MQE%NCROLB]:^O'UZ3^-!1V=KW_D?\/&S'BU\7PL^/M`&'X_D_B:NV'_O0>N: +M\RWPXU:!'R>G=O!S&OID-Z,CP2H,>"WNQL\]2?4TKQ_O9B".G[N3=E8$:PP3 +MOB1@4YAV:OO>[$%E&"U^#_BX?]V;CSO6O%^%VRK8S`FXZ5_E.KBZOO(7[5_1 +MPWC2R1=@.WQLT8Y?SH<7>QA/.7EP#M##908/Y^UY^W4]UK&>G\TU.U)<&L5E +M.+_K)IM$:S97+*K1XQ+QP'6.CF,:=!R$C[;#*S>=LN_-ZUW4PWC5J1?K?EU' +MIF<#CG_M9JR!G=`,K]JQOH3S!K_H_T,]C,$.S*`'1;LX___O-+Z/R.=+YBGS +M)9YK'"28'DS1S-[.?'FUS?CW@HY6X%AM#U&G36O`:*J+C91Y?*$LSF;J1S(- +M;C>!/06J_SCQ*7Q-NJ:'`9T-QX^K1!NL/VUA_&PT^WZJ@]LWU_S:G?EJ'!V43)2D4 +M9Z,9W[\]705L[!-$/[!WFGN8^^W@:]1VHIW`[P/MUR1[-.R3C98SD?K!0]P. +M_^U$>`IC\2IQGBA:Q:8]7L74+96V37S+K+>K&&NJTM\]&@GQ/8T!56P&>(E% +MW`?*/)_?KZ7V94[;,18RSV+TJW!IM-UYS`MH_&IZ.7BYNP)[V8KE4_M)?HW1 +M;U_ZG0.>D?A7/^63G3Q])_M-]G3WN*V?;L!?#?)`)LJ@/"[D\;3FT<]HS1.B +M=)9+M,/JKNHYW0S$*12V0R)>1M9*0_A5]_[0OCF^@-T%^ +M[?B."I7"K@.%/34E,R"G!BEL'M_!<2)9&[Z!RW*36#R93&?@[9H)UT*$ +M6YVHC2=!MXCG[(RSV!3N0K_WN_W\G+U<2"0EW-U@O?X4UR?0N+V8%M>_/-1B +MAZX_X_WG,HTFJ')\[6M]BZ$&S^4._8@YQLJH`-%'2$^NHC@J^U3PB>>.1A +MSOO_P3EK+Q.]P_C"5FY@*@ZR+/'R$S>+LZBU&_/%O/@G,^R+#@O9X-E#`N>/ +M$;W%[\^MN#\(^-?#LU?[T-_E\$'0^KL9L&12*GP4U(50'F6P<]O`";N>GYNO.H-DF4F +M3V;Q:`T;Y[9,+9WZ6$"_.`=A/VL8.".>3C2?6:J*/5#XNLCG8Q)6QU&9G,;( +M)$_GFQK@`U\DLP#+-XN,/M2V"]09ON&JJG(?+6R`:J`=(39.L9@6H[2+4FD4 +MAW/;(^@]D&B*P@;S,@K#)O,J^F%3"-^M\]"N>2[Z51*0M3V$U\R$G9"??@/T +MJRWR:))RGLJ*:,[@;.F1(@-GR26%YC4SQ%YKT,QA^>>965,]VD!%5>T+>Q./ +M<#WG$5B12$<\U[/DSRS#?A[Z'Z:^%E!?^5R:3K"A<-B!#6#2']\0K%?#'X@U +M3`L]0VVI'Z;BS`\S>L3MK4Y;ZE71CJ)46V:6Y?&\U&[,=8 +M!`ONSP$\$M%@X7\'-C:F"9X.>V$T/[6VZRAPQ7ZQN_$G!U?LSXN(/ANBOX6M +MY7+_$6FBW*93RD69I9"9:-Y\=\H:S\M?W-WX:ZK\]W^]?)RKY+H`*E^<]6\M +M_[O?:O=#W4EF<# +M0A]+M`Z^%)Y(A.N*H2=8DVN(L_N"#@78$A_WM0!Y=':1`;LF([$]FK?0HQTE +MVJV_G&OT3928]H_"_A!\TDBB_X7U0["_S^>\/K7(&$9YSB7ZF:AA<8O@R['6$>V\@GXG@2\\N\B8!+O"20/B@0=!MYCP*PR?4>#]'LS@/`?RZF<4 +M&9-QSC1XJ$5O9G]W,,+N+2J'S0#LR>$+CSUX#:>EV"OCO$#6X/)V^#"\N[$W +M)6?"#F+2(F[K!;HO*4T^-ON:<6Q.939X)7EV]3AY3D&V/&E3);?SA*^X15LJ +M9J4S?9Q2Y>?[#(%W8O`CQTJ^KYB%.8\R[ +MJZ+N./$?LR=;;-K5X]B\S2%VXSC*^Y8JU5>J\O'-%59"K:K]DHGN)?(Y3YI!>U-WX +MAP,SZWI:=W/"&M9G:^*AB-5X4.@='_L/W^=U-]Y/?7_-(7XV%.M7?ZF`Z/WV +MBJF,Z?US)R#>$!SC`F +M4C)%,XU9F_T!J=GQ3W"ED+?15GUR^[;R=G[3U1B?:N<_3VEGY__,M9VP";*G/OL!ML">W1V%'%J!YV@5\%+4QD61QV'"BG>#]42W +M7`G&[3(7YY-LL=@80>M'.QT"K^<;P]CDU+/^U]*_,EK.P8&6S-\BL],483M] +M:E[],\/8G,H+GH':L5\BN@7?(L[[(7I7Z%U_MJM1RO5Q):J]5(05"NM+1-B" +MG1>U67;LRCZ#K[:_Y1B]<#;%L0^.41[NSSKEM^^V'$-WTJ$_M,]D>J?%0[G^ +M^BCX9OB#)+F(ZWE?[$EKV=!X7\NC[J?W_93>C\*PV>.RT[,]A;T>TZNHO>)\ +M$NRR2+ZQ[Q5ME([OK)`2`ZH`V[,F^TQ[;E?CK,G=39P1TN<@[#-AIV?/%F'T +M*4CMJ8/_[4%A]=O-8B\)/KCQ_EWJ/9?I^_E9WP'Q"Y9S^LME5]0'O@VZ)M!] +M[GOB[4)^3IQA+XGH8?Q#6B\DK[J3^J'1+\X%IV!_5&KRH=WV'5VY#\E4?+/$ +M_#S^MJYB>IG4\@V%::V4VM0I49U2FSHE +MJE-J4Z=$=4IMZI0TK:>PIK=YI[!6U.:=PIK1YIW"6J\V +M[Q06??R!:%0-BW6D<`>*=TVRI$'CB6A,FA:])P<+DZ??OCX'^OR[SY8^V_^^ +MN\\_^ORK#_W;R&4U[A\;^VZMWUK.M[;S;5Z17A0HTHJRBD)%2A%-%:L-C"R" +M49MW"FMJFW<*:X$V[Q36M#;O%-:RVKQ36`NU>:>PEM?FG<):J^_@`Q%A9PZ= +MZUM\?X3/FZGZBP>X+RD3>\9$3[C-];Y#D9,DU_#UA-9_V.UQ&ST--GI-:G6; +MO/;.-GE;\A#MK/V^(BW(8G[+%5,)_MC#\--Z$J1,Z=(@3:=VI7Q.V4L../PD +MB^FCH7<]O85?EDY"YPU]VKI*>SSQ9[H:3_GDN3N#Z=8U![G>3+\Z3_A'Q`,9 +M=FT:IX-C#C98)U+;6K>0C!^/TD;`#H76/-3Q-\:-J> +MW#XV_'/26_OD`7Z>YTKXFP9__8=,X6?Q\0-")W`'X0_P)'56`3S$51V$+RSJ +M\UL+!3XHA",!9OOR%G@T_669PS#/*E8UDD&.DGRO$3ZEWED^&X=W*>&-P6X! +MNIOD"?!H+%9W_X$2G1[$\?IO/.#8XV(OC0F;[M*#$;Z6X5S1S'B0N@AO*WYPL[X"!N[*GS#S_.0[)PDFG61 +M<0*WVN*BQ.4W`!^WC]=YZH(TM/>'6..*[ +MT"9:JP(X9P'?=2Z5.EW:O#S))HPOIOA6Z?0@G]N-F>]"=N_NL08LRXQV>0^.KPNS84S)?5-2[1$ +M_WGPZ>U6*N-9-04FFV>&L+>%\@,X4W*0Y@KEEV&K#]LWXJWLX83/CN\!ZS1J +M_^X#?&Z$2!:4[A"R!];;?EMQ3K``LJW)ZFHU^8[-W*:E/\5S'Y:,^BEC[2I0 +M%1EK5(&JR5B;"M0L^N5[.YL/1$)R5&/]Q5RQ\PY$^+UWWQX0Y]>(=\)\R6-# +MB7^Z4"N"?U?"4]1QG-X[>[PT'TI4:GO.,7H'/F(,:_F>EY?;'N8M\-):X-6R +M%GC%.5@:R^SZ)3[L#634#_7;23<_4XPZP"\$WQ'\Q)7H'Y6G*;7\[A9F%:@! +MT"[+-EES?SX.;,J6BKL)YJ%ZX7.2\[.YN[C=8@[%9=8O49&'[RG2FH(QGCQ9 +MCJ,L[M^>XJP:>9P&?[4X$Y_)^'Z[_2;UGW#<[G&@I#1%IW[Z*9),)BMMZ'?X +M&>L-4;U;FO!EQ?2XO3#)=9:N9F*PWB)\_!O16Y*+DB=V\#ME:-Z8J?%1%!WG +M>4T%"%W;5#$3?EP>V5[)_$NR0<_3"+?MM`/\++@X3_A3RWE"?(]U+<_25=B& +M*10^O3[N[UUO^0+TSOTZYPTM"]3L6`)=)8>3W;],F3%.57)V26S:T!CWM0&9 +MTRS-RBHV6+$>5V807YDS,\IAQ*:)LU+PR:X5&YX9M7Z" +M4IP54QKR4#K.%T.'HQ!_.^O83R6L*_69UJM`8N<29D\RE1DD2C]-M!)GSX@W +MFPW?LHN'E2DYYS%6+,6X[PWT&><)9"EF]Q<^UCG]?.^G=CH6S.4\QOR=/8Y. +M(]B4S?>*]BL&UN*DLP\(G^I^Q.@\7PO$7,M0>O!]P)'+4H#3D,_8Q7G"?^(\)583'4L#%OVMI_X +MNH9VMK:/A>Q"ZH\5MGA_EOW$==0M,@WD"U9HU";")K>C>QWXOZGR@K?:Z-]I +M'+&^6=BCKNQL6+=VYNN3_9Y+[!WQ]6-`'.LAZ"MTL7II!L%C$5\+V$GBD0XE +MF93);<>GUZ.O]8Z/682_5[G/^31*<\&F*,O'WP/..]LETM54^E`_?T]/O=_L +MY>_!5/X"\=Z!WJ?`CONQHWQ_`'&^U#>?2#Q//LD,M23[Z,Z:HU],K;(3S*/P^O\#%\/K>L)QEXZ +M#'V$\!L,'2#7#="O&^O)3\D2:V'`T(>F<1]3J3+U!UK+K*/O+?@D[H=Z]2J< +M#=-=-.^=_73\@M:T[%,R8:O.YC:%L0>B/^(V#O&S7QU4^U8OUQ'J9PA:D_H& +M-*SE7H(#_"XEW>XE\@!>H>--%_L)X2_8+\+^]4[MM8GN%5H:<4_/)TC:_1Q%-$BTO@BX+#0JX3 +MY\09?$`CC/TOR.O0[W8_R&VG),(KE%E[TT\ENN3X^KOQ)]&.@3_Q<]ZPD;#2 +M#W!]U0+@.==7$;Q@\Y8K\;.;C'X5BL>[\@BMB($#$>M.OV%=*\IBOZ.RO,1W +MW)$4Y[/5`YPWL:JJJG'GI$G:7.-$L4!Y]^0>>\ +MLJZ6P,;$M&##EB49\(UMY9Z(8.Z[FBUI]6U";MIWFI";?I9E^1ATB"-^:J%9 +M5D_T>\!/K7[E +M3D-[FRJ?2(RI^T5[YQ8;7#.EPEG-^S5T";]X@)C#7V;JA?^;0`3WM[S"XPWX*/L +M@I,1/@^H?=:K/W'\X^E#"XSW^+>&J@\1?=2'GHS`]J&_1/S-0N)UWPT::9"O +M5OPD]E[KV_2CTRG]B!<;GSK]4$ZQ;>'I5Q8;_W#2]=^=Y/X44^WV.O"",&J= +M3?"ZK4T]ZBGE7%)L;&T+KS;CP>V'"&=_1#KAY?7H9X\"KG_2C^\OP=K#>$;@QKH8:SY@>Z&/Z:$M&7GO"_3G(X\9]^2K-C$N<# +MN)Q*,@;X`?V4<\"EP.N^Q<8C*7LEBFMJ0F^)G[8F6VP]@RTR]E.SH"MB)LE= +M@0)C&JW1\)]A^PN,)_'M=WP=B-MJ@8'X7K\R1U&77E)L/./4%:(V!JP2M13G +M41S:E$,\"&A3+^R'R07\OI[Y_Y!97YRGFZ>'[!M#QD1UJ,K/;^)\'M$F?4X/ +MHR_5A\?NP`QNYYY.ZPS1V\5ORX:,]7"DR,/O#CG:?A](/RO#T)*MNMAV[.-J#M)0?L5+'G_?9;GC,+FZU227>2GIQ +M/V@>WQ<:6%_%]V;T^CJUCO"QB$6Y_3-?BY0"K-%CP3^#[GIP'U4ST9F7958\ +M0^?\S-?IC-M(6S6%X[!?I->5D7Q1&&>N+172X_M+;'M_"SUFM^V/I&SV],]U +MHRNW82PFV8GZ1+BQ);&I-EA(N/FQ;KR&-*P#0XN-*[`W\/#^$IV=$'+O_/TE +MJS'^?]>-;L`_ZB?L91Y\C_W"]HSO+^SL9A37M/AXBCU8:V99R\0]5'5SJ-P' +M&+>+8G<[Y:[3C3/^5\K]KIMQIE.N]?3)R*_EL;_N9O0]I6YF[1?[G1V*#1G] +MKQF3!1VVON2XVO35:4)_=!+GXRUI:8U8[YX-B_7.M__PX<,'5QU>]8^U +MJ];[Z'?5JJ/TK#J,?_1Z&-ENVB_DR0OW.WZ-60SS$W.8]VNP5U5I75"Y+:@^ +MCK%]!'R":4+XGX8XI-K>+/UBG#F>*[$GBA;TA&X'-=/S?`VXAR.)TXCG,J +MCC[D:+*$ER_L3'G9*%>_7S=H;HW3_[*_U1?LN?L%7]2R#A>K^ES=N!WM6+1# +MW#M%<*U.A.O:TGZ83C3),=\T837I!G-6! +M32M[_&2D/\Y588_"%>1V.!;Q0_C&GJP;'>D;E.FC,H.GTON%W8RLFI0MWZ9* +M?=A^?K\*ERMZ[!>VJ;1>!5B3C^_;-GL=F_ZX/R_Q?C2'>#RV8&89R6[PI>6, +MB=B;L8>"IHKUP573HZP`>QQ%YXT`W\GWU@:J?&^-XZXJ]O$XCQ)P[2_H?7SZ?/B*5]G#/?Y +M/.D3]B#==E8$8(?[I,K/+,'^`[[06#"><]>15ANBU9@G-W4S/G9LB.PU7B%7 +M]=C?>E_6L1\C+;)GBSRFIWB?LBSH`PN;HN8,;OO/;<0*ZJ;]7QI>0^(9N$JUA0#<%OJBP).<#> +M>H+K,>S$CT)??O+'5CJZ\<>(7M&9ZW4#QSWQ040WY5/ISGG=C`X.W5&=/57E +M5_9>[4'=C(P4?9H$.W;BR=]E*O0?4@Z[09[$X@>3R22SS"Q[2DC8ANVD-A%\ +M80[.LSWZ*0!Z0^PB^)P_?#,+=.R3[LK"JXQTGJ5PT9CVQ]^BD +M4?VI>-EH&^]MC>^&^!)5/Q`V[@"=>OP$ERV1E[%UOJ+-\$U,W)N]O8SKX7'? +MX[LTYB^F";M?[/53V+ZRBW$E]5VV/>#?QN(.(K?B4V$+A[-T;G:>UH[?\G0S +MSDD(6U'8KB`=_*J.?`1S?9#0R6?4&^JB!..X#/F,MXOX)'+>)]H +M/?]GF/-E(E_W7^33N6_'156IO73N;^DW\H*_!4SLC6'C,FHKAQ^7AX=F(0Q> +M0?Z0\/4#V`OLKI#^76#`CY_=$#;&(C_&M0>U;>&/0@8=+V@'?`R>ZIM1AZ]F +M-WP'#+%@UP>X"]N[)_44YY_^X3M_Q0*0XZO^Y%DMPV^3(7+YA6P/]=+@X[>E?I5IQNE +MV'M;(=9^^$W*)'H:G.KTG_C*QZG]P=JA&G1TBO6T+S6V_/[.#XJ,']O>RS+D +MQTCOA/"5$N>^Z`?$+X%YO920\S,U'>U(@UTO@@Z6=A04%_=;6@>_&V>ZNN$V\M2 +M>6="!J3PM9.C9NJ]FL(ROQ..RK]%E`^_-864-H_JG@^OXNX0B=N&O(UB+@")VX&]_\GXF0G;A;W_R?B7$[<;.[_3\1Q7Z(4 +M-P?YWA1QDI-O'O*]+N("3MR]R+=&Q'5PXNY'OE=%7-")>Q#Y5HJX="=N/O(M +M%W&:$_<(\KWDX$N>`[,#^\19+H)9AZD.S#Z7F:]M?4N=]OO#*NYL>]KQ$PM_ +MMJDV\#WA)]KW$VW0'Q=Q[C9ML!>*N#0G;@'W_]^^[PN1[^'V?;>1[R$1%W+B +M%B/?_?DM?K\\#PF_7T\B_I[6>*56Q"]%_)S6>+<3_RSB[VJ-E^XA.97BGT?\ +MC-9X]CCC-LPAW!&XH#7>=.+G)UK;W;GM^%BIO&/B\D<.?WR_X[=UDDBSF_>U +MG+VRW]S7@LO(A^_81P[-O#55EICCP"'GT?X;G/S_WB?&_,5] +M0@_U5)YA#6$&K0>&_82CW]^?C%AOT).?:^AE1X1]^Y?B.XN^`PU.I[EEWY-L +MN9L#^-([T3H'["I17W>G#?O1KGC[.74$^?XHXLY.^TGP-\GI6WG[=;D>\B$5?BQ&U'O@L2(N +M=8_(`>0;*N*Z.7&'D&^0B,MPXD!O]3(15^;$'4>^`2)NH!/7C'R_=VB_$R>C +MO[\3<7V/BKSV;?M*9J3HP^_V17"7C5V<[]S3(N#^ +M9-)C]D:]P`W8@;2<;=G$]0PM]YK16.RDO+COA<.7\H8F>;,*SR287K&OY`M* +MP[D:O5=K&H/%@>-;0OAO])ARL\<,,8>.%3MUECOTHNN^"!]SX@.5I,1IE%XH +M\J3XPG3B"WW#]W%?F+W>$?P*SB3,Q!D8V`G(;)Q58X[C..-IO9M(AXTTOY;9IH=$@46]G\#Q/MR6X%ZKN<<%W!X8*)_ +M-R#,X_G=\(OB_"ZH2>+^/[Z?5E,(*RU^OF^.%-4"Z^.J2M]("5$.,\/JUI0] +M)-6!=-!8Y)&=/+/=DI!O72(==Q@CG35+XW"O*?+<[>3!?BW:J\Z@=)6).AP? +MGJ)^R.O+*:U&XOMMV#NTMQ8( +M'MRWKT2GIX7?_Y;*>4:44W]*.3-0SM)3ROG&*8=1.:Q-.7M_<.[>-:OT1?0- +MSD@QO0KV%_$D]A4Q6W,UF(/.QQ/Z?/F +M^:9#5A9G"'N,+V,]9D59KR'\/D)^SN_&?*,?]#H]GBUCSP_70O4>]=3]#*[7 +M+.M*=?44^QGUW;D.^!=Z@]]WA3VSD#5^+?W +MDK]/5R/;R:\>;W^NF:='NAI[G/KXW:X4#YTI?(D`+F]#I\*B69POJ,'OF"S8 +M`8N=.%/GU'_A:TP\VTAV"+;Z<:X^) +M/9*XH]MG;L(@V/_D/`J]1YT\?A`["*J855]H@4CK%V.-:"7V,%?K&\ +M<%83X)`3SMK*]X1V5?#[7$'_<:8KKR2.NZ$UR$:+CU+?EHK^CG'Z.TS`P%HJ +M^FO=GL+S]9570W;^XC1AGYBBC[7;A7T']'U_U+C=#UOP0XGU#,WY1T49^I]^ +MB.!.6/09>P^L?KUYMM)5[2'TH\L`$C +M6/+O9(N^DU5#62ST,;`#2VNJ\',;:6$7QN5L=8`:>EUFQ6J5RJ;I<3:U:2ST +MA-RN^5CR5\OL?DJ9`5YF-,1]C_R'\MAQ1U:_Z-?[>`[UJQ_ZM#T901_[.7W4 +MGSO-.`K[EYM_<,Y&+(HOI>]@^Q9WEZGX.P]T +MN'U?3'[&NS^+:K^GYW?T<'L\HF])^!:7);.'!^N<;@;`$YT49>3A/MM)Z^)+ +MJ8]J?8&J676J)]&V+R;UI4"5Y4)65!?5$,8W7:`[I/PX)Y;IQ&=95:I<%V70 +M$V;R^\TD?F8L$W;$5)[8L[)H+=I2`;]5JZG.`AS!82;-49W[X@:-@3U!D1S5 +ML.9V+=VES16#P#R7G +MU+_O.[M^NK]?_5@_'P-KJ/9[>G3OCQ%OC63I[!D5_H/EI87$EQ(?8#4M,1/] +M36]"G\'FV#D]X%-G08G9H]Y4V=/XU=7D'9LK9+4NEN2\AS.'G]O-SW2PTW97 +MU&70;\EN#@?84?(]OP6%C$W973$KR'0+9^RG[J[PXS<@OI$\3EY\,WVST$,B +M_U'B9UTB[`=ME\6W\"V,?+`3TA5A6X3X64X\;PM],YN^EY&&N\,\\*NT4YQ5 +M6I`4](3*_K.[.[<9[79G,N*&K17W;;.S`F7_KM[1D1&\?T=PF\!A+?Q5ZD^( +M,GH\.T33F$\]N[Z$$QTW!N8;)ZM>P'ZLO8-QVKS[: +MFO>EEFG54JL]/H6=[YF)[Q=S +M7VM\[-U?8X*&)MH"%RU!4?M=Z&<'4HPQ5W?3@_AY\ +M0RWFM*4+Q>G_P%YU23R#RD_ID.'/PRN?]UI]/V3>'#2L;H'[Q.O0,L/./4]U>&B^B._78 +M(@7<0<\D[3C*=(MUQ\H6=H.I\OM2GW2UA.@)M1,VO/-03HGZN()\H&&+XI-0 +M-RL$[3:9+&NX\^N3U^'K&?L"B^*A7TG_$..OT%Q"G%)FP@88\.8V#C_C[I!X +M#'8.XAN)WR_#C@K;!UD=VQ*?H1CB?@',$TG89J%]]JO"'L">*'ZMU7M+!(\] +M0"W%^HW]>>?,B<7]*0_@]!ES?,D]X=`-M1:W[VI(,O.&DY:V(YVQ-Y+.V1B" +M+^TFUR?!Q]:=6$_N +MWUNB/[U/Z&ELT39>YLU[(];S^S@/M(SXFWY3B[GM-,X<])LR1*M_E/+>IQC\ +MO.TNL>Q1^[WKM_+TE_6"/8B4J/`_M+>GKV'C4/;"WQ%X5$O$>]+OVB;OEB8[I +M:](-V-WS^P4@^U"[FYT[NA3T@6C4'-A/?)J,\#,FN"MD[MZ24&IO_"*"U]_V +M"=L"W*]BB;+=7F&G@S*#,X6?2IH5H6#M-$V=*-[X"UZ'LA\.Z8[/^ +M98+OVZ9T/?H=.RKN`M_^02+BKPEKQW&O#LD:K^+,D[FW)(\U\3--@G?J>@K? +M!-ZRC'C+MU6I'KQE/,3OQ65/$MVM)-Z2UJDYQ&]V(!Z":%&Q2C1H.O$_M![* +M]87\O!_.9&NL2(6M95'=0,[?=%'`=W%:VL);(5XEGB%EX\/7EZG^WLX];QX0-Q/$]F/> +MA/(5SYNFZ?V[\'VPLW&^HCYLL0SAKZ0[SN>Z-E><3_T^FW@<^TX!W[,13V6! +M_VN[EMM/B73]+O%[#NYSGNS$91`-<8:]$"/>33,)359;-IYQR*XWX,YM.@M;CN]J5*M+5:Q[X8[*##' +M`PG"D7R3Z.W>$G%.(:P&?A8T:J]S]DWL;X[1L"Y"-Z:^P.6SL?Q].QCEHXC\B4IDJV<'KEZ:&A.+%6;X>S[/$?4B@U3UDB]8CK]J_ +MMD0]/-FD]7VH)L^XEM89XFD5*3Z'\WPEW*X;=M!JC30N@]99;MM,8^E/^9S! +M'494;N=IQ:H*7[9_.Q9A=Z!?T6]P +M[A^!K/XW$5:G#N5][$5M(?0RT3[,#Y1+S'4LS:)G$L$1:BG87]1(,7OCGI)> +MX`FF")]:^V&K2&UNAG]2#]Y93"&^B_O:J6'S]&*F!S$.6/,,"B-?";6G*Y\(D@D&Q*]THGQ]G7RF +MDZ_OJ>5E,?TTRE?MY)OMY*L^-5\ZTPLHWSU.OH>=?/>]R!UU,.O!X_I;PS.'Y'6^P]VOG_^(ID`\P!Q[[%_O.>R&P^ +M#P?$KU%HM?XHUW`GUE5R.PB2_\Z=REK]OE)9Y];"+\BZ2OW^/25LCD?<%_N7 +M/9%!N%N0YNW6)MPWXS:XO<^=317))'%9F%<+=Y1;2RB>K:^T-P@?!N`[HI)C +MD_/(ADJTPUZ;:Z0G#%I+')Z#TK.<,&Q\D`>^1N`3C^^#S2SDY[^YG5!-4[F; +MZK'K][3>3WG)GHBET[I+Z\"<&Y92- +M%,[[.F>BZ'O->HK:[]XK:+"`K;!C_%AM`_=P]_,R;=7*/T!X(HWW`V7=-JV(P+Z/>HTGH$KW!-Y/;&I#'J'D1B_ZW(-J::GJ?^#\BXV +M1O"S.#26WSXO^$VN$R;(@!]ADZPJEDPDTW`NS=N\BT&?_/T +M=2/\\`=QYXX*V*QC_4$=^A\)OZD.ZZXD7SN$>/<6R.-V1[N&PPCDWJ$4\FDPG$P4<>`7?8U1R-RPC^/P;9GDB7M?$;8 +MS][10]C/;M^T:=-7W^R@OP3C+Y,1?T+XH9!5,?\,V`S6.SP*=!P%9*N`90-]<>[A]I$YX>Q)Z;TG,>_W3W9$%W(=H4Z7=(]>X +M''/IH3W\/E6%_$_*D,M7VL4G1>)(EDVJBF.1D?9Q^ +M+WT[1=(N1?VZ:-=E:%=8M*4"\:?E4YM,\;D47TCAKO08E'8Z/6?2MSJKL'C(Y +M_]&#?GM37!_'1UE?6>C^D@3L8B=O3R=O+_HMI;BS4O[,:!TYV]'/L2=W1[C\ +M#MO,/9\,4MA[4G81_[X>Z2N5*9."=N[^8RJW5O4NCIZ=L9 +M\)U=?#(REV35"^#;_/UFL1]UA,;W/8*'X&-C;JZ;B9O:$BY+Q<%SM=Z=9)F$ +M-69(70^_<$O8K`51%O!H*GB965>:)+!IR@R)>>B7U=7"B))8HUHMBW[]+-IR +M=Q+.2.'N)$9<.&""]D&65V?(ZHWTJ]#OS?1Y@-)OJ17^[VZEWRR*O\UYOYU^ +M-7K_*_V&*-\=T`70^R3ZS:/?&HHOHOC)3GZ+?GM1?*WSCN89]`Y83ZEU8/W7 +MW1&LZ0,3ZVK;[@7UQW[2T;#A3Q2WW/EY.]%`UCE-^"Q];'=)V[SV@;#1P6FG;)7Q>T9]X:--">_]5!GPQXMYC*W!]R08P1ARWO/;K$7 +M065!UAWLT(DBX@]^<V$>7]_UPBQ#AL[AWUG";AF^ +MF+'/='%S!/3*NLUGZ#F%XN[5+$>/-A4^+\,:/Z=#OP'\7KC;.9OL3%GP;.#E2F7.LW%X:(<$CX?Q`:Y1>#:M +M42A/'Y=CG,?+6N<;AC6LB]>P^R7Y.3G;$';UK)3FW#E[>1E<1^2$N8[Q=LK3 +MB]+[[.5ZIKH>NTNL/DYZ]]TEJ,,>G6.,A>AYW\(W*,MW$O.>Y;A@[N/K^A$'TMPCV]]/V7FX5N +MMRAUWRV,$<;_'&%=G/E\:!?WM6)W@2_M]956P=Z(]PYQUMF:J!@I?EKPFU[M +MCZ@SC^E+N2YS0!5L=N69X@SB7:?FZ\+TER@??(;!WXA:W^33:5UN>WX--K?V +ME6'X?F[QZ\7MMA-#^9V/>C"#>'+=;!E/FE\+3O$#"+O23/@-K/%J=O>C?)\" +M]Y9?Q=LBYH>T<`!V$82=.:VOG!^ALNX_U:>@XM7&X#OXI"K),=B1727ZDRH? +M<_03^>3:&9K^\L^"I[PLQ''?6[OA[?6M7Q(MQ))Y$#^48MSAVOJDSM5[87SF^0WQ,^`X)G'(6@=.W +M/F&:(V)N<_I"_9139R92/N1.I0>]B/X[W^!<3>$,X7\[[=1\)6&:BPY=G_(K +M=*5KV,APTGF=)'^`KO&S'*Q$1;UJPFO:$VD>X^XZA"5]BFB7"7T<&ZH5U9>H8:1# +M%T&\+S^W0;SG"6**[2#3P_"]2>D#:E@<=Z45X#MZ'U.CQT>0_-$)ZPW1C&A" +ME->NGYZP4>'T'?.G6GI%X1-L8@OX\9_9A7G8`^T#H` +M/"RM_8UU\7B^<8U3ASZ)UA>^[^&;135>] +MV*=ALZ*X!U17X`>FOB#$9EFF='SSV-\IA6HA[A=23#6=RE#$?7CC^)U&T)GA +M'C)\`U^Q"HU2G6G";RSW/S)?'\?\$M_3N0Q\,_47;;+W9NMQZA^?NV6[6G0M +M`0_US,XFNE%HV&C,LZXSH9*3^K]@F/ +ML/W[U,O7`>@XK--.1/3'`P;G.\8(6+(!NQQ_*N+\A#Q3S`GL5>*9;'KT_/YK),J:*J@3OT.-;*9IHO +MP[!>]?@/Y2W.-V8ZY<%V`VC7?IKOGQP79VGNQ)HU+IO@W=VTSU9XNU)YK./B7"3:O\BQ +MA0)M9;?16-*X:RWKR!CMG!?$FFL?H31:4U)EQ*"O.WU7"?=K.SK;>!9WNV"S57%J7_6_YALOIN8#]&)G_PS]A/#![9R)X^L0[BC">3T:?\!5 +MR+73M^SN?S[:[@$?\V_6=X5^?`]V@Z77,[>L_VTX,4"CM\O?L;Z +M)G%>Z!?]C>4;C6WN'*%OG'%A\1CP.+=GIYBW;^[D=/O;-ZBL@[LC\%\.&0>\ +M;#UH,=:%._EY=!E\C[4DS'E7V)E$T,Z.V?S<-O!9=>Z8@NK$ZGTD8GV[LP1Y +M]/1LXW3PF#,)]O]RZGV6ZFW:'?$[NI<4+]'.'YG+L>ESTM]Z^"0_=Z0_W4G< +M:S&9RMLHRK.?VLG/F%A?[N9Z4O#9[(O=_'QG6YB!MMOA?&.)`[,O4-Z)D+$4 +M>AA:WP/\SCVOBGI[--$L=\ +M8UEJ7-XEF05GQFAL^1T=P4)^+L_Z5C:PS\M."CTV]O/%OG%3Q30"8O.4#AIS +M9QN.CY\*MV,W@+JLRZCO!&O0<_VEXT*'@7UD19R-Q%Q+HSBL;1B;--#Y<"=N +M%VW?<#*",T[HN_U-R-@`/%NSL^5F_(BS5M%K(N+]V=Q'PKZX[NY_,C''GK\5#\>%/T`SPQ[ +M;NY7D>;^2)(GY(5Y8B_[P+>5?(U:X#7U&SJ+M2E_1Y0E0-N%O3?W]X5UMF"G +MF(N]=D5T_TEA*U!^DI\GMRF.RX\7'8\(6TF:9]B#NE"D\_ZL#AF[T+^I.TNX +M;R]K3.P#[N>)^'/PZ,PD/B]J>FNB\W@ZQ?/[1.O#,9Z>\FU94FFR.GIF5%K)R74FNVMS1;#>-(/3<.^Y'JH[D2SQUKQ5RY3- +M2]A-+":[-X_UUI`HMG171%8*3#EO?93!O^*?=[;:(T>IOFHFZ,^?=I8DD[A' +MHI.1![ZJDO'Y6["S.<+/L^/.E+=DIN0R3@]ORX(Y0@G77WS,6JFE:4H2SQ3[B9>@[_WDOB2Y +M7U[@YD>[(B'BISZANG;B+#_!=!<_T[^N$F?Z.<[L2#?VHD[G3+Z]+=TX@'>L +M?UO317L(+KVIGRWESF!&!LX37KBSQ<>CGKTSINL-5_*R_C!%^5_MBN336BWB:.QR[&C*3QVOJW9GQ5TT[^`GD'`RQH+Q$/IFCX,] +MQ="XWG-G"?IKOR=T47QN[-LA<$D-J_F.W0K:X:]97]NR7^41O(4*?=05>HO/ +M5.QQR.)NOY8]+NZ3VK6CPB.+.K!W9;^5Y'.`[X61]&VO2Y8@'CSNL/5M;'[^ +MM8/3=/MVQNF*=2(9<3EG*;A?'=RQ.$RDL3FR84UNYFLGQ\^I'C7D[,^C_;T5 +MQGE`\'OV&TS84]]T0M":]Z$WX0MJ;Z1 +MZ%U^-`9>0+*&:[A/+`WV`N#[X7,5/O^,81KVBI'&\L7=M*Q^B',_23R'+?0) +MWX!3=U3,`DR>]<=1MOVV*)O[(\3]"L@#'X30A<"VH9;RP_?%@B5E)>C_@NE1 +MW'_DJO<+7NM`LD1QPCA77D>\M^W*XKZV/=1^?@_/Q2$#][7#_Z#MUXV=SIS' +M6L!]$JJZL3_EHPAKUKO)2`HG7(N':]R/:%%W?I/B;5] +MQ0[G3`!PU*J"7(7Q9]/>JF0I_\W7RX[_9KLRM6^ZVMDW=6./AYW6LF\:L(;X +M>;E%OKC=>U>$WY]1XS/SF$\+U#1%[1D'^=Y<'KO.#QB5)GRF72'H4Q[KKF;4 +M\WN+QV5P>Z/NW,[ZX&06A_T1SB47.KX(1M(O>(U+V7GB_IX5N<9EB"-^=P2; +MR?U*GPM_!?#=+SQWZNH^%/B',VF+=9D[VF_2^OL`U: +MM$/(,;1VB+G<7\QEZANU?5QOZ(3!QV6DUA=!JY"7X_4C_(Z!S*1!H[H)OZ +M_BX<]Y'6@+TYM.V1/+,7?&[4[6C9=[<&$&[`?PGU2YW*=8DQT*]@1Z%CC``' +M?&(=T'L(/TG\'-*_A#]/ZS2:,]4$0_KVU_JOW^4V``-KS`ZN*^%W)P9.,ZP_ +MTOME2:YCOKM9^#B:_;[8H_W^#+%'NW7/GCW!(&'N"*)]%3M*K%QF6)?MX'E7 +M.WGW.7E_^/F8Q/Z+\HV@[I\9Q?>N]M-<>BAQR_#9G<;E>W$N+^]7@ +M$QRZSWH^5=B2:D[J[5UQ_F +M=J/V)0+NW&[464-@`]9V/;$R,1X._]*"4V]$P1=8G4]&].6.#$%RC'UY1P,^ +M"3D^SA#X:/44ZP_7Z[]V(F*MD0SH$NS;A'],^UMQ]ZT5<6B#3/6!9CEX6=MS +M1PGLQ.`?EM\G0.W@ME-3"]04S]5;X?Z.Q_7&N0G**ZLFM]&K_95\LI,/>8+8 +MZW0[,L%42?2-<+NW<[\0\$2_SVMD)273RMG!]PHO)]A8\[PZ'\_=V[EO>*S[ +M6[\`S._6[$U9#H](M.ASF;4](V\_V9F?3\78\W.@VSIS6G>2^X8/:Q/`AWV5 +MQ>V`]8(=W/\[[#&2R>3D_\[#;9N.G";T:O_:+OP7U%EQ^,O/0E\GK8O#USN; +M]4:4S>K/%&L(AQL[,"E>ZYS!P+X8X9[J33`+NEWL(Y`<;^#N<\AR6*-Y?V=) +M3+.*57Z/'=:R*04&4\OX?7,!B@>_SVVTF%?0%&4'E]5$.\*B'59_6F_RJ!W" +M]VXQS@,QB?@?V'?JSIT##L_US?;(,,C*,[&6Z%<3[U=E)SF\JW9266!=F-63 +MRZ'PKP-_HL!!\*5VIRY&&6@%[L>^%=,^LKU2925^5\V?:#Z_H')]):T[.)_6 +MG*R,Z]T#!GMV5MR^-EW8>B]<4LD6-U1BKN,^XP";[F?J^_[F%"]]20<#OJQ0 +M)LZA\/U-XEOYOEMB717.OOJ=NJ&WZ:"TWI.E.[QCP$GG-')/LN0DA6$;(^U* +MEL!&L);D$WL7_,ELK^1^N'.:HIS?VPX_ZA=J"OPJ0F=]7@'WT=X6/G5?)TLL +MXBOLT30&*P)Q_=WM)<-2YZYG;N>VYUSWA?7M#UV<>PN$/S;N4\IP<[T0YW?@ +M]_SM[2UVYO9=V[E,[!_^GOASXKOL9&,$X0;9V-NR:_ZFR<36DG4O<,ZHG$\[ +M&[]SRM%O#'`]Q]VXBW)C9Z,__!&D[A'ZB>`Y]0??1LS7#SIS^Y2L!/QK;^)W +M*+`%>:9"JY5"O$0"][A#;M,+#/!NN"O;+G;Z`Y]RU"?X3T,_D<9<.RNF;:9Q +ML3TDF^L6U\O)N@F;S!0Q'VSR3WTZG?L[U5GKMT.Y=E[DILBJ9\FC?@NY#.<;QPB/JYGJ)Q0Y>8R_PH?9[@?;N@+AC%WA]LV0H,L[_>8D'[8Q[>./X +MCM^[>G_KF-EV9]R]VS)F4B?GOMF=@98QP[P!KZ8_VMEXQBG'_J_6,=/G=S:> +M<\9,<>Q@[]XOUO<)'XLU^YL^8LW^=L.W],_U+?1VC2AG7F=^CQ;[OG.[/ML[ +M])8^VU-$GT^FVKB-8+H%\XEDS;';6V7TR/:6M1]CW/QX!RW+69^!*WP@^9O$+IVXC8O]8IIW8R,URX +MJ_415N9W\[L0*V;#CU47X6,:_`Z_1]@2\GO*?WOJ/(0+YR%^=O8#2K=S/Z;' +MG;$$?4WA7I)XF@*B41+\923A"XJ^EPM,_8'.!+LQA*,TGP$SUS"M7?H](EUQ +MXXY,K\5R3#,QLX.:YZK5\J5:3I?]TC`MY1/;VI>Z"WU`'/UC.`/KZ!7R?+2\ +M>)J6Y/LD3DO@TP-W)V417OLT,U0ZDZD!+CMMYF>(2Z=:&LVR$&P_^]9RKQ2Q +M?O@E7`X1SO5-ZO"#HK,Z4_CQ^W(;UP-CKXN?U\9]=^"-+J&V.>N)O]9LT5'" +M=^*LH]N$_PGX/J3V^AU;Z`#V,^E[W`D#O6O/;U*766, +MS:L4YYRI/]"9^4\*^VOFJ=4(D57F<^ZCFK2(PZ275]8,5QGUIY;K)\'S[FQ[ +M[NFU;9S7L3MF[*=LSGP3/NWU/O<3[G^V0$/J':XJ._*Z=I%O19'`?R3=/OEOC>4S!;R#ZX4SL; +MMEV0Y>"OFI>OFWF$`_R,=T93N)!H8UZMI&ZHA+W&:)IO' +M0GFN&5I*MY_O4WE=R(M^O$N*DU!%9WI7 +MG7?H=8FV<-R5\9VG*9HW4]PSDEG_D6^QSX%78R?C>=`\\'8:\6E$F\"WN=U+ +M?=`-J00?7H?LX+TZ@.,/SA=S'V$JMUN/L?6=C-_*:S\H\O+Z99I+H(N:G0V\ +M=KMQ5P?%T3M[;#O7_W$YJW9'1+%^2"O2)J;I`B8#\;W^/XVKD/S<$Y(L>VYT_;2O0W#W!;9;;U<(1=MTW(T>8V +M[M/6?BC#F=^;*D'/>!ASZH73^-T,_*X]!U:$,S,`._V&9&0[O__/YCHGZ!NW +M$TY!%[>`I]G#WG-*'[[2!L9UTX%TVR$\<7OT5SLXSZL+DB`+_T +M](OSYOSLM#].8R/Q<?>N +M`T0';TP*&S\'INQC>B?Z:-=D\C55'[VMQ2>M'MHF8%4S1@/.6P\>B+"U!+>R +M;9R>NA0NU_+SVL\O:4/+3ML6X>>RN(\.J8H=:`;/455/>>SO:*P.+(TJ"Y0;Q!@O*3,B(<_A]'CO'RK/6ETM8UX'GT+NJ=3'%\G"]'*?Q^C"27RK%^2ZE +M-LZF1>/L,9H'U`<5Y>$>X`5Z3*V;IC%_"N]MG%\-.#Y;6;,>9XEDDM\M)XLSPO;/6R-\3X?D7"XWU$B:?8Q@-DV*I^[W +M`R_,/+*F6K2>3M],?#^5"SF(M>KTV4];(_J;VR(.GE2"/MQ.\"BUI!;\+FW& +MV7J"(WS3)I)Q><[W,7[&/?".\,%%?XITZLXS:MO\&%_C-\C=""/ +MG^L`GK`#VZ/P*\/YM(W)".XB8P]NBQSE=XX-5=5ZIJDS2H@7NY#+\BJ-LV(7 +M,V6Q5Z/W&,DY9?:]5+=,:PCX!M"/+XY$N(Q>?S!B4WM:9)2&K?QLSD",C?+:^)LD$_Q-Y,4\6T'B2_!D1Y1V:>+KXYZ&^YR]J^),W@ +M=[A#)C@`6;J#>AAU#,XWH.\[1')C!N0JI1.7QPX3_X@YSWW\2)V,S`3W,W*T^4&_*$OXXHG92P0L#J?N2Z)U0^^3QF4WB]N?FJK]Y(E(AAS5 +M#J?D8%J7]3-%'M[??Z9X6).%<'X4=R.#7A#MPWR9^GFKKVVT2??D&#+] +MVYQE_(W>]3>WMIPQTN_ZS[:3CJXUP!?H-_<^9+3JX +MP"DZ.+UO5CL=G'Y+UB]T +M\+_OW\6Y)JF&:-P481O<@8B\U4!E4SQL!*9ZA!TAXK&./H1TV%1P6Q.F6$^? +MB*1X[#9E:AI[T8?UFM^/26MVV_84.>W)R@MJH?R@EJ<3G`J#X/.=O97-E7Q_ +M_/B.BMFH/TNTNX[STIMX'8HD_)30+[_KC/T3_BV?CK)'=W#?S[+4"1A3\G[]FQKG]AL9Z_0L=M''>A/%MOH"[%]OCP6].NLMS_5OZ)3 +M^A=*P9O*XS0_PZ''*#^CE!&^9>$>2&S$NQ+7QIO?XG.7VJ*C?@GYYL_G^RB< +M=^8X"!\TM(YS>WZ$PDV6(\O26OEES1-]X/^&[8W;K^Y\A +MNP91UF9AM^[8.4E4!_P*2!2/\V&(YWJ>5)GX;LHOZV*U[>MBDUO?IW"ZXN`* +MZ.3?A,ZY+:Z$'%C:H:U'VZDP2W_-[5'@_$Y:FP.?!0I\1X'J0UC:F?-/\7^R]#7Q4 +MQ?4W/GMWLWLW;,(%(BX0R$V([*+@14M;JE3N`@*^8*.BL59_;((*OB$J;2FF +MX28$"(@4*[64HESPW6JKU;:VM1*Q(J(H"E5>)0$%5%0$Q!#"[O]\S\Q--@&L +M]O=[GN?__S]L/INY.S-W7LZ<.7-FYKRX?UP/1AHXP]74W5CT&3VE7:+'_':I\8HTBZ/>TFW>,K+@W9W+S#F +M*KMP>)Y/SYG^B;C<"R'W*=_I3IL7Z(&[L)UH)+M'Q'E&5^J3Z=D2>/.+%KT/ +M@^*I:W:@@CBXUP'\\PRO#NZ'5W?5AZ7"&97-OART*FFGF'&HQMK<%R +MSM@K*5BR[A"]X\$>\K*`+>#'OCX7R;OVJD[RSIGKA#T<^'W&B1KNE'3:@\VH +MY[IGPP<;9)CS:PVO'(POVN<;1OONP/79D:9PLCGU6%GU.?C=5W>#>?$S@)\X +M0\>=UI.T[X%,0:]V\"ON%A^HX` +MC;^[L/6,$+C@G1'FSU#^(@"O&:UZXB:UV[.S:4Z/Q,W*,,LC+/.I,CMX97LV +M*J4_-NWQ\Y,K!@">IS)\W-,#=Z?:'WS%-5F<^F+-%7PKHF +MHVRI;SXV6:OB<.<4X!--G^'9('3,P%%RJ0RW(]'X$UY=JMVR'/B-UG5W7"0N +M^@G;`>R.["S%)7UU5+;'#>VU8)/2Z2K'RGRK"X_5^RKO`;5G`UU9[-E%A&C_ +MFZV\#/=W3S2^4[6!Y0T/2G\7OE7IF-.4CF'LW)>[Q#^C/*PON5V-F:?33C`- +MJ-^`UU'PK(_&]V7TT8.-6X9S%5W*9/\5]'2DP3!P1"O<#OFE#M(;;=MLOA.- +M-WEMQIIQ@Z21[K`OK'1Z6[DX\Y`%W&;YQL"$[(+`J.QN@3C;A>LF1AENI?3C +MZ,XY)&DK]>LTZI;[:)=XM9)3@#Z5F173OT/KWQSXFJA(ET'V7]Q/\SV0Y'U8 +M59$P>V>-9']/T$,IRI*\29%OI!%,^>874C@D3?NX7#O:VS>R9:^,>PJ3?IN0 +M9XBO+L]C^5R[Q>^0;6LTN7LUY<#=$7*A/V1,^B,C%OX.,.E=^U,QSPX@)?N5C3* +M,/N,,@J**?RO0PSKP0'"V8>@RT(T2=F;%_"A`WVM<[^0^H0W:W'T12@?+IGZ +M?-#M<$24+F%W_]TC+%%_+> +M/K%#ZJ%TWJ%\21+O&5A:9OZ2Z#WD>@C'6"Y(+]"3:"/M56`C#G,)/M5-D3"R +MFH68C#2*"V?$3:*X@D`AVS6`[MWAM)ETQ^KQ`NB7]"*\BW[)=W^:FJ.XMRD< +M3CPN;&X@#ON\H4+>IR=$W*]D14`?U[-?EA%&#?I_:1?<\[`\8C^JT[S5+\^\ +M4B,,\\Z#%ONEZ[DCYN$VXW*5;131MS=]42YXKD)/]WC/=LO3(31G]-$93RJ$ +M#7SW<&4%XXI(2ERA%8SF"+TP4^39*NXV>] +M1#-,:94CI9[X>]M;[Y>(KVO^K;R'Y_UXM[TL8^*=YV(/FT/E1&!+,B7M`K'O +M42R3^5*W/08YF\>B4I^>?BM\EWC;D7B6O4TLEP[99/%9$\MX8"_JO"%U,T'' +MG<@1"V=[!Z@^Z#E@+W^`?7./33:K^TGO/`9W)WZU9SO0+HUI"^S?009ID6Q? +M8SO[>VB_5FD;,WC_WR7^`(UGR]U/^>=2WN6+[:UW4Z]LEWZQ<*Z!N^47#ECI +MI:,-]A,%.5+&#_@^K0N[RS^U/#M)T*^%C<=HI9NHEGJ/Y?"UY*L9I;._'-@? +MN:1+7*M,V+X:G>7PF!>!["'P!^D743KT)F&3XI0/H>=<#OU='^\GEY0OA+W? +M%MF!\VSWP?QX.GTS^S!F_\IH8SP[*;KWM=T*I(V6:<5"^KRBM. +M<@U@68,>K?=]P13-M8[U!8`Y"W4Y5%GB1 +M(6F1!(VG$F7L3\?,Q7+M]=8` +M]^^AN-GG?,.<^R73:O/.+YFVM_:#UJ(567&TE>/R:9V_AMI'M-[]"86@]1X, +M:K:S[V,Q?;OD"R[>?K3\VKS/6FC+4?XM7SLYOD/M[[#GC+(>NI1OZX2S)-B( +MU=O*M+D==UB0:X/>JE$=-`(4(BZO6NXE>3[OWBOG\QVM\]D9N5WY5!+EL#F6 +M1%D+.S,=-[-V6-6IL=6\/BV+7])Y&='U(\H',Y/?E$3T'6#KW3HP(EW +M]EE(6XJ]`60TTI*F0X,ZQ?-[#VDM]K./TH-ZZ.1X!Z5'QN\YG>,1E%>R/28^H_I_(,=!F"U]34+' +M4`0*DY`/]&0"!=LBDC`U:H*&^]/.\2=![U-4?QWQN003)R'+S%DGQ[-:;%NT^H#D=6_`]MB`=X_^@./`3NA/,B]0%]>73!/0@\P:<2_A3*M,'%(S,&^#YAL1>OZZ/;L,^ +M,^Q&?YEF7YOF)9WC(27[,\`W,D_4L1_'H^W)WW)RO%BU_5XJ]R\8K_,[\UFJ +M\QPQ95-WERZC.I8C?F3G^.DXS]24?:MS.\>_1;]K6-XSF">ZJ/FUIT':-<7Y +M'^NJ-DH>^CP!Q[`UV_6BD'ZNQKD#!8T=`J +M-T;]/!OK04'G^*]PKS6EV8*L@=2M;KU_P_U9MG^HP3Q[U5`C*TN3\X_V!<&P +MUG('Z.X]S/>E65FPF6R7:)!;R#9MG?+DSW",7K`W,[OUS*O]_1S?9U'YF3;# +MD&Y^W-`BMV8^JMJ/=5?I.#0J_0;6):+X_AB[K,[Q.7SNEF.[\R0,<'?M^N5< +M,^]J4OK.J(Y[&?6X#2SC,">U+0%8G43KF]O4*>Z#O8O1$DY^AI.4 +MF:!>V=E^VPB&35V'#$+[>^IWB(^A>JF1D.4CY/IURGW[#E:*C?8?H=5<\=Z!D\ +M@*YLLT7HMV>G+@'[H3-U[NQK#NW +MZ[5.\3SEG_?CP30:8](6C^N8)ND/7(VA\_ZGEOE00XNO9%'>8'FR..*%G+CX +MR2'+?2F7Q]_U<*R3M)CCRROBW;FY+/<&!ZB:\QO^C!=_1^1Z:^%G#YS/RZ,OGPZ4$=W7G+/HV6&W> +M]1^MX^P^UK5%5RW@*!L+\/-%91M^*C=$Z^QH*C-(92J^%3X$L,=@75CX+`WX +M($<-NF-#W@KU!68S_V0':)Z.4/)0W-^NLK^L8PU+I!/9CN-_!.5OU1?+>`7@->FL^'6;\XO.-/X19KXK7U&?" +MK'O(\91GMXIW'PSSW0CSS`^$I0XBXK-"\?>]^$`H7D_/V&NR'1;B31XDOG$9 +MSH9H+/=X.GS0D<:]M[*GS7:E:5^DP[^SKX'O?W3Z'?%^PX<1_>X\M7Z6#W-+ +MG?]-)]B]GR$O;:CR@A73^`Y@K]<.XA$T:L/NC/JQQ\]K5W^T:J8.N7VO_GSO +M]U?47Y]1O]E2_UBN7_I;H'T([M`H;4!J6Y6\BPD:#X)OC]-Z1'/T67HV8_)Y +M#.)/D<]K(=-,37%[R]_KO=^%\G>=][M`_GX"Y?22S\^CG'SY?!7B>\AG3W>? +M*(+N1E7K_J+O"\>F!&T(#,+`%` +MKZ^ZF<8(=D.%GC<]:$013\_&[*"1#]N/LX)2E^&C^MA@3V[]D7IKE6<7!K8U +M8VJ>O54?\VS*H2W=P0/$NK;P;RAGLLAAN;4I(H?+K5"_'0IY+CY0;TV!#V_P +M1FX!-5&,^JIOH-(D_M(M@"[(9-!)G-U#9J`[QCBFX][\HN&7#]=HIUF!=,CQ +M3-]9.GEQT$C0V!N+0X91'3(<9X3NU`@#>2IH/Y!'[Z;3IIU':8.AV]$D[7>` +M;YY/^[2XZ,_R/G$-_7`+S,]\<>\>K3JVG64Z$#_)TXT%;=JLQ:\@?A5I5U#] +MW[1_*$\\6B]IUL_J^9X8])G7">*!H2L+VZ_8WWW3LF\2<@Z(YJ`!>(&VYSNV +MGK](&-'N/B.?]EC@[:/4]YNZYQC1180?])VDX##)@\,OZUOTVYU;ZY4?(IR7 +M%I9+OTC;O_&X:DV[Q^LT!O";(5SHWNV6]_M8KS$W`5L\T]B&4MODNNQG?R;C +MA18VJC!W77,2[I%T:C_K#^9!%V5->#+-%6V($#5FR)A;%#)JBT/&E.XAYAMX +M?0P0WFC`#R(GFHS'<\5BP<^`B8-G&L^*?,I'WSQ'^E?`?A[X,IC>P_HVG$+@ +MS16]0D8F[J0/[RH=^G/"#?"WS3[>LX,WFB]>"7-_`->;ZI4=_,;PU<6INC:58+;(3`[M03#2L@U#?!06B^JN!ZSR1'9VX5B* +MS\\V?+3GJR9XSJ7Y4>.,9#]E/"[YA4G(S+6,R_3ZUG&!'S_0B^GR7+46\Y)@ +MAC)P]H.Y48,X+38)=>-LU^B>;>31%_":O*@MO"8YH98YY4["G`K).47YYM/7 +M_;E/ZIR`WQU)X_,GHHTCY'P4YPJV%V0443T/7W\)R@X/_+A^/E%/@-[^LD45M"7UMURUK,*E)57 +M!,(M<>D[]*'5F](QHU#%?O'*;Y?Q-Q,6WM;B`_80.](6]YJ*TY?2F +M\+-MDEZ_M,WBLHF?VDL?R")\3B'C\!":OT13G2_2')K+"N(!(67TW#+,;6KK +M+MF6:]3.MEA-;+R#'62T.MEX9:+X-JOC'NAT'UP*_P8'J/US +M"X7':JV>W*XO;?!S:09^4K[Y]#5_+UKQ>F<]RSOJ"EX8%Q[W6S+&W99X.9#P +MLH3P<@SMC:5L.,%<)WS*)OJ>TDIPM@5<+:@8[2:^5]6@:<_TIMQ`G)?W,M<,^2X\*R]J"_>G5) +M1,\Q#/KFT]?$E^!;#'I,>Y_!&VB#4VD;OLHDGWNS7F,U[(:7V;[*A,VRP+2) +M#`;D&HY[)_8O`WM)`1'EM>2(LBE)\!Z\$0H32N:Q%KZ33)O]T$&VEO+E4?U1 +M7W*45XQ\,^I+B8B++?214/.VXZX:MQC#3H"QB4%E5I"R;"+&WJ"Y#ESQ\[HA:2Q@VH;_RQ+,O[?P9O[Z4L"\#7]V=KWE +MKGRO9=S%HO\K!1+.K>`^9X3,G7\YCR&E@+\Q;RCG&$7H(SWVK!M'.`4+X0Z?-",$LP/MZ +MG]K7^XYJ(]IW17=AF-6"]O4"=JNYS>8M[_$^GML]ZCV6.>1U1'QSOD^N7[8] +M7-&G.(UQU3#JSYQE)1G3I%S0]Z13##JM>?0&,N"%3.NK +MSP:](1H5H/49N*'T6BYD>B]IOT?SM>]@KO?7>;U89`ISH)SC'KRK+Z6^%LOR +M\#[3K>E#B&[=17A"=(OVN*!3K(N=33Q'K9/$&BM^41C5S%5E*[!VN$3>4H6U +MXAI?CB8&L?JGL"'H7R-(4M8_F?C`M@UT)/.A9&<2X`7XG:8I/M*Q0#CMFR?&)R3@T>B>/R.TK,<@Z3`>/"57=@WR^U<(^@?=\W[#/@]5>$CP`[M.C:B\@Y^.0).C&T+`\/S2=ZW0Q:V]EH:_:W2=I\?JMK?9,'_G/ +M^A3-.&LUT+\9D@\53I+Q!'<_T'N#W5:N&_6^+.O%66L>GS]R/X7F/'X>\ +M&-%RR"X#/\!7@A\?1/36IJ]3Z2,8JSW!)GGWT?@PPK')<\\5U.&[]`O%DWJ) +M6*.S+AOK>TU+CCYO3,(=_]\_I2Y&4Z +M27M9\\];^(:X(*[<>"93?72FFT"KH;3E][_L#1! +MXPOYW3SG/#VO1G`\O6"@/#RS364*`>M2`*7ISNQLWF-2 +M/'C=B/-A.+HXS+(KQL-A([HH+.EWWX_&%VG9@S2<"7]CW.S+=DI9[_L_6`N: +MJVYFNUO5]>G8<$4/?:_C+HSH/O0J5!]S"&<*"*%SF\VV\U=+''_^4EK;^1M6 +M\S=L&`^K^4NANSL=B]8@CM(!%WHV=U+=?7Q2KGKH5FEKH'FK=55JR:(!J;'5 +M:T4X&_RT4:G;\,&6[DB-JG"O%Y,@_[HS+%)$Q]ND)6^0:7VS12HL[PRW9[71 +MQ8,,&I6KBQ[$3\?H6]A6AH#EY99VCG?T=#\HC[@_:+`,\I)=X]O+X+F_[1P_ +MV6:W1]L;973+9;]W9Z:5@W97.C5BNFL +M(XJ(PT;5D0_%OQ&8W^_(E"7,*_.B:-L;D=?@A6E +MF_2>CVC8BTV1.'1[V38*Q1=[\5^J>/A'+A-LX\+1[6'\U>-RG/O[LKG+'[X1M'CNE,I)G2L&F7XZ'>80M@Q#R%\C,:J^+Q+ +MBB!31G'(UX'BX2N`>%\SAY[Q.^N:K0\&,!721;JAGQ56,H+1JGMPM,KL[$N-(N\HC,%V[?</[M^W6T'*:X;#\0%+1AGPWP-? +M))N>T@3;E*#G+="=N/@DMLOFP3ZN8)]8)6'OB`\LP-C7SA8[X\VYD/.3,!8/ +M$7RA$TUXBG$V"R0.,3[US)&^K1NWM.!M>YUAZ$3S>MM,W +MF\$VBX8DB[`7FT7SH#D(F77X#6N-KZ'XBI`-+80V\54JOJY=?.76%OTG_EVQ +MU?+TG3/U]T)6_ELQ_PRK6Q6U+'.KWM'J(7.I*L*2D0^9/-I_W/M5FD[ +M_NTM+?JV_UZO'+;(EI=!]QHZY1$:,N!G6.D[,Q\"'[;_>*_%II)XX3W6`?'2 +M,,\BCU(?9XS2?97$.P!7::^DS8#M[5VEOF_3,^&7`*_2##^;T.-C?YL!IJ?I +MPVG0,4.]Z\/9YGE;Y?D&M87U![UW<4L$FM<:ETQ_F>;WV0;1<'H/?ND2\GT_ +MZB6("5D&Z2L7CG.NJO@I[==_;`/*3[- +MBQ=4ZC(_SJV:=I?B[L%1<6RK-+-,VBM,J]3+B1:4.QW:IE5+GZ`,1S_@9JIW +MT,^,>IE.9/;9U&VB/3>@3,SM=%K:/6]IET^V2_L$:V\[>*G^,QTOW&K![N,W +MT>5OL9W@X<^&W9;H3##F>DPYSLVFK`]G[)WD7&)Z]43:.I8=!/.\+59Q9;W- +MYUI$8ZB$,./8U/=+0=OZ$3SRA:NS?WC_^VU\<#5#7NTOG>*_5;)H5S@K=+87 +M,[.L1,PLM$5UD3VYEMZK-6TQWXFV^$BZJZ%T!LZH.[T_OI#&R*=KQ(.^7WHJ +M[6AFLXV+]_E<.[M=7>YCG>)/JKI\4]]OL[YP^D.=X)N&TSM`_D\KAEYSM^#4 +M':4Y*#=G1YLUGMN_I%/\64_>[MYK+[[*61&>7$L[2>,:6A>+RG)AGTV'+_"& +MTCG9T*_JXXCJZ0D1&&&(ZMY#???3>K-8-T3H@U+H0/7#FL'W_6/+1?"5A`B> +M4L(VC^;;W=K4.[]3_'FOWLSXNSK%_^'%4YG5/"_&EN-,$/,#7VU!K2$6%%+? +M")9Y1242MC&";7TWW]0/64=9FUEK^&KBNITR)_BJ:4X&*=_=3E2K*+29_YMG +M1S4:9XWZJ5$_(7>A,6]_"L:HF[CK@](@RV^?XF`4]28VF$??'"& +MMX\7\]QNL%TBX3+./C2C4*^C.@]-3QAA@ID9<(SV..-.ZA0_G#E.OR3\H+Q% +MFF.$VX_/C9WB*9777]GPB#\UF'"56-<*OA,1*V9(_O3%V0EY'IV[+"H"1?:+ +M5#^U+=HA(/3NH*/&EIBHT6RSXY;8BU4)R9=NW4RX[[)M.\$F!6A?!]RE_2^] +M%R[,`NZ;88G[#:5'X6-I)[;C*'%_>#@X]0.)9R=]<#2>7=(I/L8;UWD[2L"S +MP,:1+]4;XQ85O]I1&NQ,3,=RFPA'@\#10GJO.B$BP-$B.P"K73T:2GUS;2-">U1M$;W?'?AC +M1TW8;>Q>;;?IU^!.\7(/YES64/M0EAI7?\*@C9!19#C2YUF%X'%XT6\;[GN; +M8W5^I;_Y[&9>0PE^>@>E)XGR)]*:[*I?EX_?@/M)XKN_,S2H.=1&]2[>/+RZFXL7\QB/P%%M6QWK01I"9_\K=,7 +MZ0C=%S?'-'KF_MZ[F=>_;]9?]]_VMTKIK*"OX(GNILGKZIU:9![A)]7]HR'O +M*C/[3+A[,GP`9?09ZSK[(`L,T9]ZFG6%)V3!-X$>TKL$8FUAX,R4,-!#;6%` +MOW7Z(AVAN91@0,_,1]V^6>JVM9,19SVV?4;+/*9B]0/8?U.X%V&U68+]..R. +MNW.EOP?@#ON`I_<]_^WFYBY2IACC]M!F:7<=]8[;;+U'91O.7;S&%A",G!<[ +MQ)W3MS`.NI>%E4W=@F2?M['WI;RIT;;9HP/;,6KQ.S1+ZM>8IVYAOFX^[/@] +MUR%^`.TNW,JRITF"VQ@EG[Y2D_HM5WCRZO2B)\'O>#S:S[ +MAO=[W1G4@U4S#>AS+WI1$U/I&?Q_!>*PI_2+^!1Z=A\7\2#EG4I?=SOQI-`U +MN6VS/+L9M5GJ`BE[L"AWP7TSC7OINQ!ZS5^`IQV;O.<^PH^;-L=^>9^T&^B> +MH]Y3[Q2S?Y9 +MA2TR)=VRF(?G>,P-O]*1Q1G.66$?[ZT&APOU!,%3\U<9B`.\(]6"=<8U7Y6\ +MJS8W6T[_3UK\WCJP!WO!YICH1^'Y$FY.K\WL+[K#D\H/J((#\'[H[*`^@OH- +M7>/A]*PIFRKGJ'B;0M#@40R;(VX@9!3S/I.>! +M2I?11SSH")0[>P3;S+\S"_PCX0KEQ3OG4UI@MI1GOY-XAHMF2[N/L"]Z$:6/ +MHM]X+YRM?";1>[!QV?[=Q_TR_2K4&QBKK_@=]DD-TCYD1GTEJOP2>@9.8HZ_ +MYI?E78BR9E!=$5_T/'HO.(/Z1/#.G]U'XGKAYIA[N8CG4UZG@&"LCV5I#VRZ*JH31RDC"GS$[J9]+ZE-U9VG$*5/J<0N!$1$0K*"]D&J;,7Q:-T-RLX;B$+8P7H\X,Q[CW3E>?/]O1Y]Q):_7L[:5AX;,C`9IS +M5$Z@AWU%ISQ?T>RJ5`_D)W-55TG,EU6_F"A,^ +MTV=2.X48JR?_J(GJV4)'_6ROWZB+.I0^=[:KSZ/ZT>;:_V8;S`FT]M*R(!*@-OZ2ZYV91&6(:PXKU +M9")5T66P735W:10Z1JRSSS9>340G[85W)@@W">Z!I,[" +MWS2UH/K;I)[_D?VM.SU +M)R\J*('=X9NP'D_=5=I$SY!O[0);S8I6L\U(:GN8QBW"NC*M:PYL%\+6NC-V +MLX7W42[NB=P9>HL?O!XSY/H#/4'S@FQ>?Z`C>).B63=2OB959K[*VP1;MN?* +MO&:%?M1:!GN);B*[S5KF/KE'^@8IV=RREIG;LN/OX%SL'YOXO(+7SE]NLN+0 +M;YM35$XP@(QWN0A4E5-9Y;"K#KMUQ=!\U(>6LS[BOBU\?G'3XU3'4"H;-BN% +M*->=$.O@Y]6&I.UST/S$9O9]S;:61QGQZ[`/71P4AO.('JBLN\Q&/K%X9@*X$W&DW7ZQ3!BR'AIC)V0@3TN=&FRW +M$WYHM(]?O#(!'QGF&:K^;Q'OS[($-,<@_TCSJ@;M/W6SU,NB<=*%:K^>T?Z^ +M$G;<_@%&/,EZQ2$=,GPTCQVV^W\NM;>&VD;Q6H:/`7$_M56HMK*_CHSR(:_O +MM17MS%?U1+=(/<0?T9BD&AZ1,O?)UM?;&H=G^:.\9NI3\@38!RQ:7]$;0DDRP.IZQT# +MLE;%X23[JJ4^NEU@NV!\$KBEI?HZW#=7XE?@X9#AX9B[6];A[-H`84"^OXB*"8(+3E%U)1-B'A#.!I:6>;!"7>;S6EQH===# +M+T?TBDTA_FD*Y(T#]Q/,+8(U?$&BK$JE7WEDH^6\OLER:)UQXIN4GZ!-?#[G +MOHIY4<=P9CUS34C=SU=5WT^1^[,X5["HE/"EYL@FZFR-TUJ'-EWI%(E^^ZT:I'OKM^5Q" +M^3KZ*GW62)CLV2C]!%;3.LGYMG`[`F)7V%V@M9S38H["GC>UIU8LJ2_M0TT- +MWF^62#PE'.J%^[X@X[*GJ\MW3MT4;:3AC[`=S(0\[ZY09^#"5]*F/>\JF'CP +M<"4L`SB36VP3;6)=G1*B$F=Z9GX("Z$$US9N9#:UT^&ZJ4P?])GIAZI<0#'7V +MG0I;7;GUW0*I\0[?44/GH5C.9M*6EIK&?:RT5D_@/78]*?2CK^RW=79K3 +MF(ZYM50VT0:G5O+/[M\]',"YKH2]6T5Y"#]A9T3<3WW68RU]QCTCRX)3?\UI +M@$W0<#9OE&7]597%2U +M'>,2-LS;-S&M<=[>*&G-`VW'QKU)CHT<$[N$Q\AK(S_;MGL#Y_"+V9P_E,LM0WL;F(>`;Q])+W6=VP4Y,*(C.(-`&L\/F6:; +MST#^HP_K6[OW2-]K[I6;I)VDOTH8B5]MM-S+-JEURB;ZN)M]/:%><9N;8#^/ +MMSD)R&$&EA$^P^X*;`,%Y;QD_?->3@+G>Z(HR'`3W]+BC(?W$[_D8,Q?21C> +M//7M*NUPB,;]O$WL]T\\MC$F87B5+>>9C]<+V+\F>F>WF0L_V2C]8]'ZRG"9 +M).VN.]_?Y-D`+S%GP:XU[>%AXUP\PGC:7/4)P8,8*(WV"Q5UR70Z_1G\?@1@ +M)WRNP%YJBMYJ\YOH'.3B--@!BHJ.VTNQACWT)6QX%SFRG*J$O.>@<@3T"4:J +M\@O9II)YNJ1KYN*-TB\%YM<5&RWX,NA2DZ.[PPY8TZ`C7D0X`/D-=?[NI8,7 +MG<8VQXY.<_!>E3P+T,"O*A\!E'>8/V#KTZ8EDM2."6Q+7I-G9>:%F-ME2?>P +MO'?RUP1U9YI(^G$V<\8!MKONK^&]Y03SMHTQO_*+[@[=R';:W0.P.51%>7S\ +M'E&M">9-R)?@?>H`FAQFETTMMM?X=Z=-K7(U@PG'FF3=L)=AWK-)XB7BKI%X +MZ'R7Z.Y!F8?UN'\I\T"GR!FKW%DTE]:D/IC`/IV![:/V"^2YL[MMT1MO`"Q(L8R2CMV6WT80OU`?*" +MPJ$YQF54L7QQ]2'9#]CQ\_%YX0@#]^L:<"\+YSA#DAY<)#QRJ"SP:C,35,=\ +M^&]E71W(+!%,W`$;8X`Y[_UHCFO$^HE:HD]!V-,MM\6\JBCDA2.@&\H6L+-_ +M@[*/X):9SVULH:7NYBU6%][K+$G"KM%\@AW.H40M9/>2-NS&LXP9VT-,&-Y9 +MZ15*/_PR&D9S7&[+6:GF)@QO3\K^:9U"VU\#7SP/)\#OX9QI!O:D69K>!?VF +M^8,ZV"_8#W%W/C[I/KQ1TN>`PM5W-UCNTHWR[A3^NU[>(NT[MK198[NR:',6 +MSM@TA^^.%L#?A9:T?34)T&3>QW$]%^8P7^K^9J/D;;_8$`OHMAZH3=*>MT'J +M3]!OS?L->@X?C+AG([I32'!E&W'27C/AG9Y;/=.CI#99=F4P&4U7S30JS +M4F7S16V9'4B5.065#O59BT*_".L%R[$3S8)L%WP/C<8Y5E5#Z5PU=DDU=G?[ +M"9JGM8Z=^?:&&+TO?2$_O$'!>'G9`6F#DL\,G-0TVQS7)2[]9XS0V6Z,%Y^4 +M\6+UAECZ[B%1V%#3X#<5M!DVB"NF)6&FC.]8U'P-:*;@N5I=E=>B:Y.!MV+1 +M!CGNL'6(=Y6O-Z)#ME@%>A"SX8OT/_4]F?EE>_)'=G(;9CY#L-@OVV!64QO0 +M+]S556KLEP0P<3](6^"=L6::4[>7!A_?$',.J_DV8X,U+)6N@CP2PP]SC>_Z +MEI>Q[2+P03M`6WW$'[\2YKKAQRH+>GY2-UJ8HY):4^O=I<"]T1UF,!S\$'BP/ +M#T1_B=\C0MG&SSKWX^V<^!%U3Q51.G[M\[AKC[7- +M>9%XEN+;^1P?=GI%B/7R.'V.3->].B:V;;OY8DZ\.C7$:6G[$(7#.(NG>;>5 +M\*NP2V[+T!SAO'T++1-V6+BM7MI603W +MZMAOLM\7`1[1T%-4`(79%((W!/\;7>PS\NEK+H;-ZR7EM4]H(I25K1?C-\$E +M3F'57PY:H9[G&V[@(PLRG[@7P[V`,_.PY:"O16'6B10/ZJW^P&$?U+"[BX<^ +M+(WT(-Q^4&?[^)`5F]U)F.S[^)#TRU6+F_:*F8DBW`B)X*`]VJ=9GT*NA,J% +MKQC8TL"S2W,YJIY-Z)Y[\7O3L7PO_K-TK-B+_R0=B].SOVE7:?8>PA7$^?99 +MD"MA^'XH_92?4BE*7;(]T81LSPC5GL#JU7M7?[1:?CXA>ONO!@MEL5\Q +M*KO#_:'D::?LLSK@3BQ#+MQ?J<\';Q$(^/04^$VGL`0T7,PWHQU@,Y7B_3@' +M`A]$:])LP%+SV5D!4P]5ZDF^D]2<%"WX^4W?(AR?IV?B]1 +MCP_GM]TVQ/H[,K\9I6>\Y_FK^_1=SZ9:.=O@3ZVJTNV8'K&E_4.LQ4*K+X-^ +MI7F.SG)P][X2:U\>7]5AI\M:^^C.T<#=YEX6S-_,-^MB_MP1KTG651P7LV +MIF-K-JC]D;1O!+HT"+(3IS=:!FPO^J0>J'=OCODPAG@A,SNGE1>Z?(,\EWM* +MEFO>_2[[LYJ)R?P2836"BF_ +M.FC)"(/?7Q6*OY<:LI#;L3(4STF5LAV\,V%N?FQI6=38:7^9SL +MHS9U=VE.A7X)'S=M(#PF6*.-#(=_I6/G4KND;SC:9U%?I(\5PNL(SGGI.2#R +MF%XI_W'(`QY-9)QQ`B?`AK-/SHSGS'?XK-D6N)\>[YTSM)S#'",?:&?;=%NE +M%^JB3I:CL4ZZ3\J):BRMF=="6\]^5_H"#6QHV>>PS/OS1_@L)\!^-FE^`5\# +MU/>`+5@FG_BR%ACX6F%@IMZ5YR\WO=MB$U.<3G&^NK(BUF%VRQS3%XA[:=17 +MV*)_B=I->%,\E);F<]^-B2K:#QQQ#);;'Z;>/XG>?WR']3Z]_P%L4VMCC5.( +M-^K(M@3'&L7T['Q?Y>W\KF5.:N)Y;@Y^-X8S;FE/\%T)/_CBHST#_(N82M=< +MTA2<1>\LG4/S)IC:^4@@33S3;;2>0X<'-`;XV\2R\^5H]YE95,,U(?9E@J\Y +M+L3R^.Z`=]G''X]=![DN%L//&_@FKGMY&?SV,%PA/U)--+ORE03;T7+D&6"P +MJ[*="1EQ^XCT1;=DUWC8Y-/"TA8>ZV`&I!T\'H^#[?CHVR/Q'IYMXLSX29%X +M=Q7OE:-KNM&FK$_:[0-NB!!/?G19YOA(O-"+Q]V%V;IF.#O>L=A'#'1X:"S@ +M5W19:EN5JQ]I\0>)_0?\Q+EGA^+=*HGWOF*O)7T[O,OUN$]'XCUAES1`OVL5 +M_ZJ]R[Z6^+V!H7@,Z=Z>T#L/Q-D@T2?8HQ4A$??D;HUV,KU>/N7O"_+&Q\U[ +ME%P^[F%P1@";(+B+\^27$2=U$72QX-UCRL\?JPV^F051Y_.T]>_:"KX$YW5? +MLT^FV/75>37NC\6_X-V53WS2@RI1WCYNO+:SJ^*XD(`8(<=.[ +M+"\-/QABL3F)Y:1O.C:,4`^_`[US!WRNI(?'DL=&/B?96C;Q"1/XKB/Y[C'E +MKH]7AKB"RJCKHS>A?=7!/.>*KW[_N/W\09M^<#W`^G\KJ +M+B8)UK.EW^=]=9OD&*FQ/_#58XG]TDRVXP";(*(5!SXY_GN9,(L"[F>\Z\G` +M2QD7P/V,KP]WE"'ZRC(T;]SZ?L/W"^7[+>->^+5A])5S_ICC$>7QF-`R'B?_ +M^[IX;O^;L6"_MWO_W=Q3X_KQ?SBN[W^#<3WX3JMN`PX5`%>*:]]7M,G`&$!7 +M"Z'R7]CQ3;ZOQ=DYS:4"R"5,*(`/8\5;&2JO5OG5Z8%CI'_5&'GO^=J_Y^FH +M2/NJNK.-^M>];9[C]LWSREM15OPMU9D''E>J%'PU=RAP[ +M/TQ;CO)MN@R^>]9WB#LX7ZYTJD3%3)]]L8_/"6@SEYG'(0[)GBKE +M2#C]J4#;]-X$H\QT.]@V'3[GE(^>,VEOTJ;^?+E_$W9!ZSNP"3=#L"QK=2?X +MN);CXGCC^#Q]F6_K +MH,KM266%5;D]J(Y0QGC?2V5FR;;D'(&_65GVH$MEV2]262_0UPO7C<%0$-]T +M"_$;:DP#OQ5L_U>?(8QC^<[,Q$N;VY56\L<%2?B@$;@#_0HZ@G><0GDW_G7? +M$=_>;IT/'EVU4<"GE/)1>-1\.)1JG0]?IMK.A]O:PKQDC(1+^#+Z3U\O[$9? +ME.5\EK*XO9^FCNHCPVV4A)N'KU$/7QB_"MKB,.(&G,IQ9F:0;MA3%OMS9:X/,-Y8?7D/C+/N8U +MG]P_LUZF3;*LO"JBT7%5SGI9CI?&MK<=40)[T'E54NJL3;7,4?%FZJ@Y*OJUK=M1=2^@NNZFKQ<^=)F:HT'"!\"18((ZV\!J +M>M!HSZOE*YZ4807]$EZGAJBUC]K_".V!L<;B'.$XZT+=C8+/E-BG+_&UD!G6 +MU)I4=XO`&)A*5]2!3RK8I<:>.QLA[7'DN`])#B/T=_1W_OU:3FMB%NY0"(9. +M\[^LK-0(UO5%6V%?(.`KU".^,EW4L1S<)%%#>_:F?WT]WBNC;/'YORU[`LIV +M/CVZ["S(/S8G;'[/E]"%G>#YP+(RD/^"7138,`I*^L&V0U1\5J7/(9B5\'U' +M0-@:K\FT/BA[(NW'X2A^O9KZ4!EC'@GUZS1^SO24Y9^ZBW7_1//#U_-80'X( +M<:QS$G1^#CGC"<0_P&8"I6>6P7Q6=Y''^>F]H])LP><,U32>692'=59Q7KHN +M_;7VBEF5KH/[4BYOYC);5)43C*MXOFB8$_J*Y/'R^"K'E>!.F?>I%D6RSR:X?&H +MNL<;TF_6*81>8"7T`NVH'SJKN'^MF5:B!6';R+3%+^H+1#!I%T+_MCHAR\$Y +MJD^>]4M=`A$%O+,Y+6D'9MKR'KQ30X&8F;2+$%]317""/^/J$CXCKT@G'\5Y +M%O4K.>,E/0B^?U[2_N7L0MU7L]P1=RJ_M.'M[-/D5S-@QW))<@%"U5Z1TR#K +M;%1WVW]>S^?:."O;\`[6%MSE#"F?_T=-X/PVBO,R6ML6$STD'H37*G%$$_GY +M6"M#QH.P[4#TM/AE30Q,!_F>-(_B]R[7F/Z"IS";=ULMOO_@6QKV,=@6@PYY +MD/&0<2[$&I`:.Q2T_L/*OK8;S8Z+]$@^.,$IH_D0>=.QPLV,/H"7' +MDV'0`N5"=/?9`T,VZ[M,)7SH0+0<^>>.I'&:27C3;-M2?M*U10BXY=A\Q\XZ +MW,(N"X)GK[/%S!R[,<=FVZ-9351.,^ZHIR6?@@U'K->1ETI$I##AFQ'01618 +MHJ/G8T5H)2+X`F.5F)0&M[S57Y@LQ]/[[V9._@] +MO-,2K_*'INXHO?-SZ?.A>=:3>N.L_N%#LW+"3;,^T0_/6J.[2OX(.MTB>*YM +MGIQ@F6ZMLIIM+'4!?A/O\4F-K7>LI/DV=3OL0-EW0M>)GI\@^A*I&7ZQ3L^( +MZTAA/Z(UD<#PBPT5UP7Y(+]0,^SB/!77"_G\R#?LX@+$$7B**62]]IJAU):A +MMGD2VC(T$9KZ06G5Q^G8*0@)AI_,M*F?B?F"?K>VY8/2)W:E8Y&::Z@M'ZBV +M?%#:[P.*"UQ#;?E`M87R;4>^<=26#U1;*%\]\HVCME#<-L)7"F>_EXZ96PEV +M->47F[,2NB<393,&&$038-N7DENU0C#J6FPS-O6 +MQP9X-F_L]1;TFB'CCOD)GY/`J_G!LO#=P40X&?3IOPP6AJF>!-M,8?F=;=>=MKP-=X7)$M@N3&M\#VQ0&(#\)H60H<]K%CS'H]/\=I1^ +MEU!\A$*;PGQ*FT0\CDGA9/`Z@6GZ7=2N8OH]GW[["8?C]+R`GHN"L`LF6/]V +M+MI.?88\$MK,.)=='_57^+!V"OG;B;(]UI"4&]0@+^WX2VSX.2[VV=`1\F'O +MK7"6Y08(GTO8W_+#"8WP+P2[`OWI_>X-B:4UKX1!>^1]0BBIPU<"\6![Z64M +M6T1%Y[J$F&,FS/N&&XMJ8MD=4WI2;]K=-D^>G1"_&F[<<[ST@)XMNB99#MCX +M]7`C$A'FSIJ0CGD(6-`:,!1R89DP@&]X+:7+OE4-;],W;_YZ?0,.E5`>Y.<[ +M#1$H,?DN>;BQ=&8(YV)#&1ZPG9)M=A-S5B7@)WH1I7%\'N+M;H+B[O'BNE)= +M:"_%/0$>/SO9#6U&FFQS?8)YM(PVA]^@?2R-1V8;S+?2L0%4!M[!G62;<8;O +M0[\<1^Z?)FR=AH!HE1T-R?O>7.('LO7U+#_%M)7R/AHL.RK/'#_E8;I(^[C? +M:*TV:-:LL_["^#XD.3J+H'9Z((X\PW%;C;7C?.*C4V.3SA?KI,SY*ZWYQR!_ +M7.;OYN4?_@[KZSJ?R?SFBG5LXX;WB@?E'@8ZX-A'.:]]P#+"X#U@FVD`[JOG +M%4;-GIEKCNEXMJ%@]Y7VJW8UP[M`Q_PZ/$W*O__VRW1:)]@'*DT[@+D!/8H, +M73C-5VVX^]:UV-5QGEEGF97K6^X,W:7O'E?[\E +M^^\\MR#V +MHOY=I7O38ZMS658E5").J2^=$1;F(-JS`K>9+UHL9'Q0QL-7(H4&RG#W^UEG +M!F69^V2Y@^C9W9M11W7(P'ON"]1N)R1EOW^Q3OJ8K?+%KT]MJV)]Y'6:&%P9 +MLM'OFO0(VQSA9]V^[ZNX:HISA\DXP0[6$52W2A_A;]`$C*GXFX@>K +M^,' +MV6X&9"H6O9*`GI@P:8V`'AGN#`L"\<$84XI?P/9U1A@^,=+0%H7$8&\\/PO% +MH?=G#E[/N@;.?0J?;UNG?.1")KB^S/WV>M8O\7SF,L_TJL[^]L2\$5'VO]>S +MR7*@"XGS1NB;W1]+FB7[+%]J6M(U#*'MUQT,JN +M[.NP[.]4^0Q=`7?*03[KPGIN_O2@5:?ZC_,E\SUE%RX5S..S/_AI%4-TW#VC +MS&CUD!(SVA8F`XX!$_=Q/?Z&@HG[2!/+$SD7!>.HTYUPL,4GJCE>/K/NP;7J +M&6.!M:!74,H3S)*^(,TY!RVVBS1:T9`>A!,!H>](+4]D9?C;1_-K>DC2R[7K)+T\ +M3:TO.>LL6_F@!IZ85_GCRA]LV><-4M[S7=KOL'VYU+3R95V$R?E*_?&^P&,1 +MC+//"\0]?-B2.G?]=?9YY^G=@$][3HT_VQV`#/.NQ."F7:59J73LI%2X6E3J +MM.K'=?-"B:^,(T+/$VRY$3Z8)W\JYV>[77I?X2S;^\D=##7[K# +M:I@H?-M\/1!/K,$7W$ZR__YXZ[K%ZZ2L6L9'N@?]1Y3N6 +MQZ>W/]X/>]H_R7:;Q0S#UY_:5I9=:5=#OM?C)1[">1_ASU#")=C`F?O`"..N!^3< +M]8L`$T'[8RCB-WJ"VK,@*+$T8UQ64Y"2.X+&&$ +M[H?<8<(6??J6-$\?3<^B]DC5:,.@,$5A"Y]:G6,W9V%?GN!]/=L"R36CX&'" +MD$F<$=0[*/T53R;1]85XW77?0U +M__1VRQ[/F?PVT4A3SVOR[C%;=6VF05_CBU"K+T9*V\MW=X5Z/FU'Q$R3S\00 +MOUO%&^WBQ4(9;[:+#ZAXK5V\KN(#[>(C*CZ8$0_;0MGXK148QD+>GR;S5+[, +M=Z,J+M*NS'P5G]LNOO'7,KYSN_AF%9^7$=^5VA!5;3"Q[X1L$N4M1MD4UX_" +M8L31\X!V;>M%\7W4NW'5_H'':/\@%1?/J/=4R-G#9PB?^;-#O&YXK@ +M`8>];;'M)/:CV%#FAM:UZ-V;I[UC!7DMFB;7HMD)'>L2X[1>:'='FEY%.#W4 +M,&IR]$XUHW6_8QL:]*H4/FG0$ZH4CC:UH32+TGY'^!5P<28%^U.VL6"&Q%$? +M/:,\GJN_"TH]J,:WY=IU0/&KWWK;VH>S.'5V#OXM!!LYGU.^7+,[Z[/GO6.Q +MG^7CR/_F9\[#Q9A#81NZDO"_'J#P0*K`SE*_@Q2&4C[;V_>)`+>;98#Y/)7F +MW%S0AYH1M.=J&%]UN%4^C>7$[PG%FY0\*\L*+XNWG9?SJ)_F!-`FYFO$V6_+ +M?D;>MCQYGI+7/9M@N]K90!N2_)`BW)FAN$Z\O6=7MV.ZCVUN2C-?I;$=$E%2 +ME`4?-:";(VSH?4^'#^@QM#[-6<:\4P_`''=7E![(R&.6M,T3S'S_0IGFF++- +M3N!MWDNXRRF$G#;V#3O^9>5]Q;X!,N7M]PXT-^)YQ]D[Y'EZ3(?;S+N7WCY%^52BN57JZ3'S. +M`9D+*=\+6INQ7X*,-.S@-&+]A"WWZD+;G:;%H5L*?:"JYK=B&MO*%3;O37U* +M#Z^]WL'H4-QHK;/$U'R#<$;M''@K!I[/(+AK@#OM=<2BAY/.YV_)/K_ZEO4R +M^W*N*]-P3TOS8L!4,PF_,F8[WI7KL:GO2L_H]3N.H?\P.!3WJW389?;XX1SP +MPY#A/P9/S.]].Q1_5?'$SD?KK(Y3ZV?54)XZK-L=M?AKN%.'+O_?I-Z[LXG@ +M`MO)E6X9\I@=M'@7JC]K[&A'HJV0QP\?RW[B>E@_&"F_<3'@FP_L9GY/Z() +M6X*\SX9N,/;7X$>@+PQ^A/?=L48+/D?1_L'4%M@NRH<_>O3E1QWB3<1CXG?3 +M[/XZ]N:(-Z_>R[8GW-^]Q3;\F';<^!;OE<:EEE>UMYWI?A2D?8?<+T7$T7.' +M^[$S2'RWS*/I\$FT_:@\;D.0^&.9)Q_^3/4RO7.-J4=29A+WX*(BP7#\5#J-%OB7/8Q<23>CLA&60,J9P\%'#R\=6\+LHU) +ML^8+*;LO[69FBZK=;6@GU_ML,%ZLRO0%LO7#T\RD3SO?P#O(#S@%4F*"3YQO +M\+VCJ5_B@ZW_7-'=7ZD[PEF9*(8^">6%3G+NU-VE=V:LJ]SN1X/Q,U0=HOFZ +MH1BW[3/".N\7J/T=J"\:R^\*T9WWL;1F$]UNF'&>+ERJ*ZO^*%O&[GW!>,(K +M+;>^F]?V=#I$Y=1W.P?C^&,?ZU3Q7(5^9,W*[+E8"Q[8/1XR +M"5V)XP1MVINF1A2)"5W%G!88X"Y[*[7W\#21W%IU'LVI;'T+A8`7YCKB-'K_ +MO:K91J!RSM!`90=J1UUWMLU"];?,SPG8BX],8HYA?N80_<<7@[`)Y?;G"[$R\?:2I_NAY,S48G^K!Y=&8[=[0 +M(9Y7:=O;"99,YV#[A\K*K96\)>@7RHSK=HO.(->GP>>18^"^$.EY`2F;?Q3> +MWA2,SU+UG72XK:ZU^RF8&:)4;]MV=0L]HW7NDRSIPYO>"]6$CKG6 +MNH$O)$_^X"N)AJQ8-N:\>U#$3Z?Z6^9?(Y6S;!3-OU"[^1=J._^&TOQ;-"+9 +M@>K:GA738X2+S=/<,CG_0OK2#I(.'F\.FMG!^#D>;"IIW[&(^)I#V7(>9HW4 +M`0O<]<,O0^8\E',M=-RY9J:SXB-4N<>;:VY35GRDRG.\N68>S(J/4GF\N<:Z +M2&/EG)&X/]+V<+R/KNR_=L!\\K.7S5U_3AZ60+1'Q4Y/+6+?03HJG]?@\ +MV%L$'Y$ZU1;_E+]C].S\7L1Q%^0^*3@.=T3F$_)9B&P=Y4%.)4#/4?`=`KXK +M(??/,F:V1CP:SG>8)\.>Z$':'JT,\![2[/*6/!O_\5JV?^6R5L;_'F17VRIWH.2M5:&N.LJER/#W9K`P] +MV79[7_,/JMW-:^4\._26M--XAM=NN;]WOZ#TF=(FC-EMO:5_Q7D$VNMOVCD> +M9Q#MSZCZPA[,TJS6,RKPR7J5C7,'[/4U"M%'43G4"-(S^AA:9!O>&85&;0[0 +M,^H`3VC^.L`V8?B^"302ZX9/XKO;L%;>.6V5/*"3MU;Z%MFRML76GIM>I\Y6 +M/-@/;3WG#Q;:/9`6K))XAG,4YO\+DA8A@U^U&>T!;+/N)YCCW"7H$\&6\_^` +M.O]?*\]0^JV5_&CV6LN?@MTUI4-&,/:G\FUWU=I6O-BS3N'%<@7G3+QP9-L( +M+WQ3=['M'=A)W:=DI%KV@[=GQ3>H.8=S"'^E9F?:T.=]]BU9\GORATLXK +MSBTTV_`'J8^ILMH`A:*FC^TC7ETC_,JBM"#H"^%6)(2[V;[$MR.O6>O3GIMG5!]N=QY1EQ1N\\Y@9"B=A=SJ@R?.8JR1.NH\IG`Q+F#D?OVGM +M2RV7=\S53KDWGX1>7H[S`5^E.=1?6?]($'!$ +M(_RN^"N+[,=8%H?F2"82?JBTHJ&&/Y5M^ZG-//X49L4);D&Y[\M2 +M]HR"F6B-E`#6,NS +MK/VIY7;U%^W@][VL^`K5E@59?JG[G@F_@0%Y+E.U5I[+O/^F/*-X\0!6XH]37![HBLU[/QQ/4[;]*: +MG"X+I+:5N1&4L[QL$.P7"L5W$6X,'9T5+R.:,S`SGOTT9_S6L,ZW_@:O!;P: +M#W[[W*PX[NJBA+>!RE<26;C;6TA](9J-]@HM!`4*:2.H.CBTZK-T3)9EZL72 +MEJ(Q0-.-?O3-;!ON9%\D?+VHI6TJ/]+]TBXNV\/]=A;[\?#RQ#/S[)'X;WZ< +MCEVNS@.DS&M2VB.1/I`C%=U,AG'F3_+_)JZ^5PZ-D`D]!#T +MV1W(1[;BSU'OHMP_I6/%E)_3:$XS?&OR[8&4U@]K-X7N4]2FVQ+VL?(,4'G, +M)V2>+"DODIQ)XYU9WR"J;X!JYT"JS_T8ZVU"VO?Q<*O_FVR+/[)#$Y`WGG,C +MH6;CFU)OON?[5ABTDK4,X3RR1\\LL?I-M%#AY +MP3C.N^9A;"^7OL]87J0.=]%$=WMJ<3%2BSM_:I1WI'N_M-BG!.RH3/-[[YTLT]B6X1"9%O#> +MRY-I+$MQMDS+\MXS9!K+5@R2:=EX/G\?ZT/A_-`=M4_)/Q3H]7_7V(X!CFDU +M&08\'JA6\4"GX[[`";3R0&,`AP(=^B"L(Z5XS5XX9W4*2J!?$!#B.V+%F];_ +MA!VS_Q5?]N^PH-$R;PC%"3Z.F]MHP8Z'>V4CX\W_='UN2);?Z/F=W(*YFBX0 +M:4E#6<:-8+KE[TJV1LGJ+WQ)$\X9^V*0@>&TZ2J-]HFC`'N5;S'R]=LGUZQ5 +M;R@;EZWE57W^!LL8+D"^V#XK(&40QE=]^D;,1\^FL@OB8U\D!<9\R-M\_(9< +MAYY_HT56,!OV`7Y!;YGW[!:WJO- +M>&\6K1&T9Q93"=Y;93WFVC>LI/(A"S^L!^@K'G_\DKT((:,!^8Z*(>.X3Q4% +MY:`!6(MK679O27G^$H33RE]GGQ+I\K6_YGSCX/?,A9PJUM9/TI9[FAKSS[ZT +MWJUM*6^.+,\KJXIE=:4/2/!P;Z%=.U)6`\XD?KQ#[BLH'3Y,.FA2 +MMHN7C.;-%N1CS%MW6"'*XXRB>L]3\+I)P\+?A1E`U^D +M791@LJ6_V5(6IC?N9%:FK+>X?W'=_:=\OI#:;;[D/8=U<[.([P5=!PR439[G +M?PT]$6E7#+P,/?-]2G\??'.FK+=5F>;?6LMTGY//Y@4[>-_9^-N<1.^2:Y710MLLZ&$X^];^G@J^MX#NF'7PICP<[/O=IVETZMR?X +M2EH;WU=SOH@ED`\[%?W0W_ +M\[0V_#]BS[)-F8UO4/^E3;"JN>F8;<-?IIO"G?P;^T+@]C7&K +M25GKO'&;+I^=\G2;-8WO]=28\5V-B"@YM52*G@VLJ9#;=)__D/;%Q"-@W]91 +MQ`\0/3E0U5\WI\AR6V@&[OM/^9#'RAU%L;-Z9A[2SH&&H>O&Y`X +M`WQT8:.%Z)_7CCG`%Z'PY7IZ;[;$(V>\/)]R(V](6]HL/T9\RHR4!3M5PN>6 +M23NMDF]"_\!79+.M*)H;WSHD[6OCO!9[`(WM6\EVL[T(<`B<\)GE+?:2B7ZC+WOH^^(-F).TK_KAYQ9@`WH]_Y_4!E](/\#R +M9\W//#Z?[A#9PWEK,=+;0-/-^O#S+\F,>[]R#S7&9D+6MP<2Z]ZUU%B4\UC0 +M?,8<-\]+P?:BP>LB:">UW0>]?9^Z5V`[Z3L"]@5LMG]MEV)F0-:*T4NRVV +M401/[4?J2]-I(F'45M`J[+/@?P&^X$)3/X3N4PG/6=%Z+H]\':;*?,S'@^?% +MV.)^B[ZX;YRIH8S[_*`L,E7@WRWH.>U%A_Q$=Q2\"_4=SW +M5!SOG>Y:8WEG)MR7&NFG#_0`-KU.QUCCS`![UQ_ZXW="C@1Z[I!'`9^#]PI+^J3 +M'#JN4_R^3M>GA7_I?+D4Y\O%M)G(>'CA^.H6Z]?P'IE]WDH9XPF$/3[WGC4LPP;;I@=^!3F0F8F?7XLN!0?M:-BTN\97=9?G/^:P1MZ3L>SYMQNMO6J/A[M#MQ3[!?"".%?H6\+[!LVD +MO9Q="__`HAG^@<&K]RT)`KKXSCD*]G^P"FK(?F%N;5/*))4\#W+-P+ORPES,?>=\2:1FUNK!JM +M[Z7R$>(Q9PR5PLXYC&X6Z>^#/W%QGY +M[CYBW<=GY.WR]92V4"4>Q)+F0`F;1O;+[X?QBXW4VP_M,_J>/. +MA_MY+79G'+%>YK;3^EQS1/(`A"//*=NQC+>$&^[5:V(8>[9_NU#B2/`ZB2-; +MUZ^?/]_#D?PU5E3=>[H[OY0Z#Q]\R;HY[OM?2GZ:\!@\/O8&@=20A6Y^HSPK +M`)V`S6^B:P;M[K)@DX%"^+0T1:/%^_^);:^3Y:=8:WGLM!.U^[!.I5V"MB67:"?T\2._-T%KV]L>U.Z#\ +M1SNKU\BS1>A*X$Z6YQ6M4N"-CK3Z^!:KUOQ;NP#FL0SL_H+`*LD$Y+)_.M)3F819L35QY4)Z=/W=T_>9Q;%.Q78IGUUC'MG$A +MI.V`;V#C0CRQYM_:P^)\#Q^W3EE/9OW'J+.EOON/4=^:UZT6>5?81Z:]\6#: +MQ\#../89@[&/"<1TL_<1B^5#X+^!Z-<56-,^?9TPT4ED5(B\3%8HRX2HP55XJ98H$H5:DWBLEBJOBYJ!7S +MQ)WBI^)NCOVU6*326_\FM/M]WU$YCO?GB@?$8^(/XD]M8JDG5Q/]6NCG,[X7 +M^TK_J^)>?YSY_+6OQYP[::_:1](7]Q1U_K_F]9BY0)XABM=?CT&6S=STIO0I +MLIK@,T^6Q_O:N;(L[15Z)RG?<5Y^/>;>H][_)SU7J')7T+-WSO\BY?^7RK^< +MGM]3^5^@-EU"S_^@N'$J_>_TO%>E_XW*<%7\<_1\LXK_2VN=SI^HC)^UME%, +M4?W](Y5SKH,A][G>5+G8G^ +MN'B4ZKJ,^O0(O?>F>N\A>KY,O?,@E7V9ZO\R>CY;Q2^E/+>H_$LH?H2*OY^> +MUZCXQ92GNXK_+3U?H>)_@S$A_'VMF?'7]>!TKXI?I>*'JOA[5/S+,MX\5<7/ +MI[K.5^/Q"^K'O-?E6=3-KRN9EOJR\T"+7VAFG0W(GAU(C1UJWKE+^JA;$BKW +MC86?IMW04R^)B'AV@/@]\6#"-_!I=;ZXTD[C_`9]5=)$P\U./)BY" +MN<\T6R_2FG1F;5QWGVZV$,>R/+,V2UQC_H-H1(9]_UVSM1'[ +MT"+E,T_ECV;F/RVD-EO#ML^]NG4`MV=TFS- +M9-F,F!Y`>1?MM[(A]P]^!G*,WMDKZQ:F+)=]\VXK*T$_;VVV[DD-L+Q=&P^\C6D +M8V%Z;P!\G3:F8U7_2,=L\(Z;8-^#TM^F=>Q@.O84XE:F8[`_X:KRG?WI6!WB +M7TW'UB+\B,K]G.H=]#K+T_!9KZ[6'-@Y4#[^S$\V6+DT7@$1RPZ8(<,LWB77 +MYV6KRIBO^RY\;<2R10WA_\7-UG?Y;EO7US.Z%.Z*)7 +M&9#/3V/;:!^UZ:Y_G#?I#]%7ZS)NW`/-59W81N&]HZ\7RX.)R%K +MSWL@\%4[X!.I0#_O:4WIXPU)0HX:.GY=J3^>?VI/IAJV@EP>0^GSW?-A,X;X +M&/-27^M=2XVR;^:7_(6;B0/^5CQ^L!T>BT!?O3DEDHXZ6T">M^'CM7F?952& +M&;>KUT-FE6A-.!CGO3N-?X3>P3VZ]I;D+]R%&?5!GA!SZTWB$Q?36'[R6LS; +MCPE#VA3B>T3EG]A9^9K%-G#8'X>2RZE^O54NY^$WOU(NAW7?]"I;;]I="EVA +MQP@?NZ>F+<)99[B]'D$_7[QS2LEP3=U=RC+MI^P^2D?#C?GB7;Q\W74;NOE' +MZ7'T]L7SO#S@N:D'N.VS]#G->V?5VK+0EGMDJSW^@ +MAXJ],/B,1[;*_;OW^^!6RX%M[TI:SSXZ;(VKC-G2)Z'@^3.4UJS\E+#/!UW9 +M>9C7$]>6?NSFP$_]CL-8>VPS#?ELJG?Q?LML?$_ZW_M,R;Q5O&:)\UZWO+V! +M.>,UZ3,#>O;0'YCY8AG+G^#L+Q/.30(ZY%*V#V7@#BS2L_8MDIEF]3 +M/JT_HSF[H&H$ZS5`7Q?/YH.OM?J%^,EKUO;4DFJF,=5U9;^3MFS*V\@O;A?Q +MHLI3E=S_2)WE"D5L:#'-Y0&594.+*^L?.2-`-.2V&/Q2CU^0JD]`GJFXYM%P +MFW(VBG@_5Y=(Z$2]5?2DF>ET,^1#J_U/0E_E] +M5EQ/C;2#M9!5[8M]F1VHE>>006>6`1Z4ZX$^%/V&G%34DYLNE&-HZM*6O?9P +M.+F,^I#'?$'(WN!KE;$V\V7>0"IL&][[W60Z(UV*>;^46^"X0\64*OFWB[Q;QAU4\S\&3Y1R\ +M/E50S7)WXI"RD;*M++E&$Q=2O;B;6#QMI&V^W"1]Q-,:ZMD)*>HBS)M30\HC +M1#P"_;JG-/'I;/8;:<.ON:'*^B7L@/Q=EM5'Q;$_\K_*N&^K +M.,@KNW^6<3>KN-S4"-M\5K6#^@0[-^&4[F"NFZMDO'N2/*/R[&E@3P^=;L9! +MHIO5KS7QQFHK2G,0^WP?W]D.T;.?U`3.!\`_PA\%9/<"L!L^ +MO=7WBZ>#-@+GKN>+%AX"^6'3W=R[.I:E_(F$H'3>H`'Y!W?*KT?6"' +M.RAMQ5$[M_041E7#ZEB^,T(?$"C4-_AMXPP*T;:-]'RF7JB[6U?'-OFE+R_Q +MQ_^%;5QY_#;ZUGQU&\U76]OH+%QM-1]N*]L^"'2_NXB?H>R/U-W1<'1Z5Q$_ +M4Z5KE0F'_;L^OSHFU/B(7ZVVI-QH71GP/H6]]DO$0_24\_@I6D-!>S3OKE(4 +MZ,,Q;SQ_7M=C_SH6_37-OWW&4CZT(Y-'_L#IF +M/O6!-1`V=W%>_.3JV,`J:<_W>=AC,#^6]&<:M:W:97J3QO7&XHD$VU\DQ6*+ +M0I'4E(W*?HO!+PLCT$$8.7Q?:CJPLVG^L\G2*JN=`:GE52[Q*VL)U@\ZUU&= +M53K+*M5)'>&G*&T]I3V;D>8^WX2[TV0)I=51VIC,]X@6:93V!*4]3VE7(4W: +M31?"=N3[SS:Q70JSTWXIRV7LE[:4.NZ7]Q??I7ESU^J8LEGO<_Z\/^;<^('D +MA;%N2Z_Z!'REF)"QI3U9 +ML'IUS#FD:/G%J^49'^BY8NX.V-UZWGRB*\: +M0YOEQ'B\"#<1U*6<[&*CW]SG,W-P%GWYG_3_^N_HO_7 +M?47_R[]&__]+]?]OJO]_5?U_3O6_/FTYWY']-".K60;`[)\=Y[VX)V^[+6U- +M`+UYZ8`E3J*TA^B=>]^QS"_@!X;V%`<$G^M59TE:4G^_QCX*/=H2>$?N:]F> +MKM(SKE;RN.ZZ-//MXC>T;T%YJLX5:].PL99T/FN-&_I&&N<;2>=7:)\ +MI_/^1U8!>('N'\N[$>_]56GLBY+FX,/RS`#WDBO3UE.(.VTURR)<@SL$POL\ +M+=>(!G*-_"#!0,\UBK-SC7@DU^B7FVL,,'*-@9USC4%YN<;@KKF&'XD&!68GN<854W(-S5T2OHK2_10FH_)>@O%E$>%+=\*7158R +MJ/""=0X(-X`7;M\FHK=$5_Z0MJZIG#B,VJ3GB=/UJ+A(SQ<3=5/,TXO%[_6X +M>$/O)S[5!XC<\$!Q>GB0N"@\6$P,#Q>_#Y>(>>$+Q:<=?)4[_S"&GL6^YO&= +M%Q9TOHJ>KQ#S.FKTG*3G46)B!S\]V_1L^CH.(A@,X[%_\U7+Q-@3S:_%.3_. +M.6--UEC`N^%S:S;M^2!S[10W6B,'99&\=`?@%WM+-@[;-K7I@RM@[I_G+VOS;OP&<>T=\>! +M-O&^CM2FIW;+_6]$GEWP_=9]!^3]%LK[=+LE=A%O@S/>[":K"OVZ?(?5@F=5 +M:6L&Q=V)?6Y#.C8+Z;TSTG^>MGZ%N/>4K/8=:>MIV*I`>]YJVQ[XZ62YE3HP +M"4J^X%UY/C+Y4)%B]]6K,_'\3'J\]9!4"CR__/X/'D_X[<,@G./0B.)@$!X+)%023JP@F +M28+)-0HF$Q1,;HI*'P.,1T_KCKP*.' +MCK\./'3H^.O`TD-'K0.=X:?.XUON.R3YEJ;/)=]RZ'/)MS1^SFN`F[_:\F._ +M"3EX?H[;9O?53#=]33O'3Z*QK)*VZ,?[?@X;U43.%7_;#Q_LWQ8)1X`WA`^)";+<=>XD0R`R^7>T?L([9`WME7R/(:D"/RJWTDWR/C +MOAOY?#ZY3_&_:HG.FRWQZ6N6:;W*YYH<+UZUX..)]P(IHD>GM::YH5?YG('Q +MJT'2?7'E'N6?HZ`\#:$DQ^8SO54L5R?Y`LRKQAV:*(3\V8P<:?-LXWZ6BV/Y +M$A$O8=H*6["0`[ODD+6198<(KXL(%['G$.-Y7C9#E@,V5&H*V=YC=LJ=#=FL +M3%G&#LTFR\.<1NM4AVH?VQUR7_/J4W("FBBAM[B^3:AK.,U%6J_F87\MANB0 +M47-/TUB^:#-PWSXD[]^(QC_;3CX$<4^U.V\WL2:EB-:[L"OCLU$VZLI5F +MJ;%,&\IV![:6_<0QRGZT7=ENY-66LTMS[2IU_BKU,,T^7RB]@OZZV_<0\5N8 +MQWUT,RZ?&=YJ,H7$UXP#+B;Y?+^43-2FO!#[/ +M6?&VE#O'?E')$_&ZN2"%.T%[+\OBB%JS<55K6Y];)>51@1]/:.+RVA&Z5EE8 +M"UFA;,PMPMOT`NM],A:Z["`\BM7@X[!Y0VGWA/R--Y;7<[^.*BVDZ: +M'Z]JD4=U_["*;?(<8)M&;MDY[%VKG]H[ +M4VBXUVSE_3/*,`\V0O;(-O<>X/'"7(XWP"=!?]9%PYPRX=,-?J*NWBIY^5_) +M/CG=/[&QT.H?:=POXKG2Q,?N_M1JLCO8>QWN#-!^HCQJ3E/HO2(HU>FO11[*6=-2.DPP86 +M?I]5-=+P[#)FXHSY,O4']X+$OQFL*Q_2S0U-5AX]FY?+\7.W_8OVXKISUHR8 +M#ML]<[M(VP^0666YNMR=%N13(1/)[?Y[HV51N^$/!7W"P".$/.A1^+;AB/6M +M2NES-(3\[=/7'[&^K=+-X5M9YC$[LUS".1U^5RK'&G4T=KX[#EANCU>EW,(0 +M*JM2PICA>V2GA"^%'1!BG]:)^I^K_#(_V&A5*GBOS[P7_S&5`5@+,VFZC1;Z +MF$UT#.5DJ?)T%8:/T4?S^2/6#*\/=Z7EGJW76&,%M==\5L+6Z4L\"/#H'(E' +M;>8>M?U`:LC0PCX*OK]HM$:EXC;28(^;YV21:6,>8%[EUK3ZDS7_O,?"?'0F +MI5FFJO9=Z3L.8X=[TDB5].T%O*%%C^/S'&D?U;E\M17TY&0N6\T^H>%OS;ET +MM07Y8=BB<3NI.4YQN)?VLVQ`FO'PQ=$RK7DIU37BD*>[+>>HKN:7(^<7]VMR +MHW4[]0MX"9E/]U;!]G@NUT,Z?K?!VXF8LR/M%MJ$-JYZQVJA,:-6Q0!'\X9& +MZT>I.,O7/_4'7.JH\Z7L5;PGE+(,DAY41R1>F[`M1F.'=I;H5>&+=!_-HYE5 +M(BHFH/X+*>[\C#BFR7JA_E]Z0F]4ME[-VS99@=22I/C!+LO=LU&>1TS8:\'_ +ME7AYE>5FB;BGCP!:\O%$PM)=&RW4[8S;:YDOK6)XF6>LXGT0^%"TD6W6/_!J +MK!CV$\"G?/$*ZV'CGM&,R/UH(-7'0?LY?TU=`G,Z?0>-%]84S6>;HT5<^BF7 +M.!(1K;;8:C$.PQIY'8Z(F&Y6BT$X(_6E@K;(=;MIA/?9N:MB8K^Z!_WH%99M +MT"#32[Q/+L083''^>&K((^'D`[2L\8.VF\6*_Z*#7X#M(L4OT&]C-\OD"^87#B@=`IS!'S7_!Q^Q.BN_RIJ2WV`Y_*5*-\O4 +MDWN5S"[3H2Z-Q!_$;`)6=VF* +MCG5H)%XH;B-_>AKES:]_)#N5SW,',&<]C!YR;OF4[D6;]O8Y8DU7]GX8![>] +M$@/LA./@SD$/B#H=\!79Y;:(T%IS9T-I<'9#:5:%L%E?("CUI@."*`3K8"=U +M,:.A%#Z*-.A&\/.T9.[,LI(`Y#N5?CCD`C3"G8GLMJ&`\_29KR +M,\WG:[!;-ZMA//PX>3KVGKXHCWQK0IJR:AZY553H!"H2>F!`*P=2CC@BHN +M2'%A%:>K.&JLX4)N*/)2B:]R7%+,;+`#\X@%J%B>W/T\:$;9%#&O+"IFEMGP +M_168[0O+]"7)W2_(=#U5-K\E3RWRE.EBON]G`K9RYU-`2O +M:5?&4MV+/ZJ,.51?3<(61B(J(@D;8X!G@C]M95^,ZE-WL+\N9PW1LLIZZ3<* +MMF+GK+`#M$B+N2_90I]N^%+51!N71;.:MK/?*)W6'!%$N5717)192_--7TKM +M&AH5@2J;;41C3`/5=B"\0M=3U?.%OLQN&K=;/6N_@W>C:AW(^K=[*/>'4HP6TKO#IL/'U(T=^@WP3N[:DHN[/$%AMH, +MF"*T*AK31+(C[B[U*H(IQ]L!E2^7\FFPP7.,O$'.6V43MT9Y:?RT +MI90^5*93G;I*UX^3GJW2LX^3'E'ID>.D9_9)3R7FPS[S-&J?69F8X*-GVL7J +MG*?&G$)\2!1TS>_=FV];V2)7;PY993%-%Z^$#>+QC,I0+K4D&HI#R>4C-R+9;!];`[XTNI(:QOL +M4K6_.S9_T&QU4NNLN&-7&UDX3K^@V>KBI=/^`>9N.[3+XXYHMO*\/+2O8!M+ +MGDTJ6B_=^7ND+<.[B`RRL< +MU`<+\"/;69]S$/T63C7;192_@?=Y45$D986HC=%LC?)06=6: +M88N[=,@1#Q:?Z";N;#MN+Q75/B,+YRNY127-:2/.(G +M\B@T9F*_5J3G48ASF6@MXBB=OG@60AG2L'Y7M +MJQQ90GAN]]-RC`%"Z8KR'9]9,D##V9U;()Y<*7G@62L5#UY7]A^/'?:PD(UD +MGP1#+AE,8\9PZ."-(3V+`46ZR(L(-0WXY0K^+`E7A +MPD`AT7K:TRTT(;>>["6J#/,293/_II4QWF?3'VR"L'T*,41?3WM*K8;]TTU@ +MFW*!`GTW\6;P&5;5+H_?R^/IG0Y<:35/;2L#LP#\]Y\/P_>/I$$U23T(^DQK +MAH^>F19C_2#>&>N(/\#^`?0`A7X*LR@,4!BD,*O&U-TQ*V,A3W:FCZS/DXM: +MH/92S^",\9'#5JML-?$ZJC[4I<%6'-N)*W3<\U?&_!GE@3;[`E)'"W+,[,,1 +M="Y5?[&8]THWV);34GULYP&CLQ2I9W6C=0VX.4K]K6_N=1_O@%/9&`]]F>;JXMR\.P`M;#U_]:%/3I+7MD!#F39U>ZFOIBX,7UBP +M>0>_PF'H#V->5#Z28%V:Q0?9OJEO\4C#-0D^W15\/GW9:FXZ>OR@BN;>DCE^ +MM$_3,7Z.[M,SQB]5Z!"=F(#QTPC7`[`+"+UMC">%00JS*"38,>@E4MKI7G>1SQ'C)2RXSJ$VF*.2N8$8`=N5Z*3 +M,]J(T'-G"MF6=/-U8CNU6=IM);@038-<62'.VW/-:.>`3X],/8:<[:6'K9[> +MVESM8YGF7,@.!XFWR(7KU"HC#[+'Q[*'>\%AHD-Q99OUV'G,D8>MF,K3]7CE +M##UL;5=[8[8WC/WHG:_$#.=FG<\S=J481\Z@_L+VK5G[2NP,,5*.W^J7)7[C +M?*YB6GF@41/-E6Y95YR?5XPMCS[#]S;C(8.]M`#R4W82^USH2&3"`CH1[AF' +MK5Y*]I7E4PAV'0,Q711_6`8_`"7^V<88WVS#H&>7^))+IIV'N=(=/@@TZ'OM +MVV-=GA[)MSQ7-[1S0]"#QJ!'XY6RN3^0]HVR??%N8O>$S$_7V;DNSW723 +M5:C.>)%';P='INN'FZPO51W%-4?[/^!R#C99/N^L^,][63ZQJ&:DSG=EWTNS +MKIT.O53<6^0?M-@OQN*7N<[(,>IT]S3Q'<)7U6GN;K+2JEWN([).SH>SE;_O +MMXA0Z("QCG752$;Y3.BTE!5-C;2+:L9SV_ANY,8T^R\00]&WP,@MDC!R?O9RC,?@C70,<*G:W"H[SG!YMG]>8./-I +ML?O',C:LPU-@;,!Y/>)I]\+SN>1ERTE-&PI;'Y[_0_A*,<-$\_7M?*_C]GOU +MZ^GRP%9'BR[/DD6"?K?7Y3&?:;+&>'+P-`]8E^>1G4?KZ?R^R;K,R['O23RFFCR[,(/!W\:<'.:;BM/L^RMOH\L.5K+CED'66_-_R^ +MM-_[X=)3I]*66/#GQAF?3,LJ97U%O.B#K)LT4I +M#_38]VEB]F=?6)!I%,-DFCBISG+\]+MWAAS=IU]8)9"Y0]PY*I]1Q_K^8C_Q +M915$C;[41`W">S512R%D^N92N)M]05&^@X0`]-M;UCMGC7P^!<^OT/,1VJT5:''S +MQSNYW^;DG5*&Y?:=2F\!>AQ$%C_Z2/K.XSO,CRRV9_C/CR2LE'T$]X./V.;! +M+,A3C=EK+0`,>JG^[UUN.7M]<3._3HXUZEC\!?O=X/3/EUMF/U_\YZEM9;E++.VA<9_:"IHNS_>2[`<*_7WJ(QHOC#R +MNM/.1MV[+Y:Z?RS_'24<<1P1=YXDV#RTVW+W+8])>R\%>O&*5ALS9MUR:2N0 +MV@A^T2T2\932I<7:#OX1_H`?HM_0'XS*( +M?>S4[-&Z:(8^(L[['+9=+'KL*F4_O%@_\EKKK"(^V1'ROLO]9'FK_:H_+E>V +M,Y:7]8,/)MBM(%C*OLA[=2Y?V.Q_R+WR16DS7[0O+A$Q?]0QLLOQ?]`Q5\NXEIF_@M5_*7MRCE/L*\>MZ1= +M.2-4_.AVY0Q3\>>W*\=6\2/;E?-]%3^\73EGJ?A$NW*^J]IY3KMR!JKXLV4Y +MM*,U0ZEM2><,$3>_I\J8ZZ_U53HM99FGTSOZT*3Y[;9EF:>I^#-E6>EI+]EB +MZHY2[[U38;^:TD4?FE/]V[6OMVR'&1/Q3!G7HGQE/R+6KMT]5;N+95VXN^R( +ML[/NU.ZBMF73#D_F[2'+%G,TWO=Q'8:("LV=@+0VY7=2[T2]OE137[:W].5Q +MG'50NA.A^O):Z^/[U6S5ETZM97)\2,7GJC'+KF']`G>FG*.P5>*C?6BOE)FD +M/5>4SW(T84BYM&E)&[8&JTV;\DW0*GT.]H\G$X\I>0H?RW)P'MR)P?XZE<-I +M5`:?O53FY@V![@.%T.?VIP;7"CM7RD.)W#P\0Y\[YXBTG1I@V3B;^]5B:UDO +MMP/!,L'VEAW?%(;?[/H6^\E,/_L1_JF5!<9NT`$*]S3(]1%\S"_]CC&? +MOK_RVWGWTE=H8_/8YRJ%6SDLR'M?A?"%.G":8+D;K*WF11];<:('Y@7+8_TH +MY#EO+I=K"_+@:@K^C5-!Z5>6GITIVRW680?M@WS5YP>L7T"6IT[:#.#SF,G; +MB<^@\85M,]B>@5XV[LK@ASF=8%_77G[PF`%ZA@UI(7Q&=]H;!"H3]CS858(/ +M1="N(_6E^4+:5F-Y_NT'8(?)%M]>'F,_M]0N;;9/STO#=UJ!L5;Q#^LI=#^H +ML[+@9\U:+FE:^@5I,YG&N!E^IF_<9M6G!Y_Z-VU+U+Z-=NL+>K=JL+E;+?HBM?E64`:VZB?'FB]%\?[>U^PXL#3BS^S +M!J#VZSG5'OA1VH)$?NBOQZPP"\`K^9OE_@UE\,EQ@+U +MVU%AA0IK55BC0E>%B[=+.V^?43N<]`L2A]^B-F"^7O>:A;;/I3U<+]T#)F!N`R +MZH#U'0\N&;J:\'ONF_=13$0_DNUZ@W[X/6N@X`/\X^8`W/Q(]G7[!TU@F6^C$18EN=NK3E/ORQU%FO +M>--RML@^N;]_P?+V-5=1&[4JQXA2?0/3IFUV:ZVSZIW6.B.OPX[``>NFC#K= +MAUIAL^IW&/]MUEH/G]O+$YQRP/JM>A>\*]H).:2`GZ@/?=U[I5]TL4JU<7$K +M3E;\02.R1#Q9UC;B?21.>N=?@]7YUSBV_\#NDA*K]0 +M^>N`'E01/8=PKX"SR_MW7=Q+LR9,BQ\UCL,QCGOV6S_U=#.]=?:2C:J,L>77>#ZW1=C0VKWKOK_? +MFJK>C>`,L6)(^0;J[[J +MG]X+[@S".N"J,[^J\_,$>H[RNEA@0)YT@$_&XZP?_.T8,=*`S>;+*(3O#_.> +M?=;EB*/U^!(QRW`I[7OTF\\42E8SCSNH%^7M16E72/T!,47!\:(7)`],>!UI +MEO2D6*Z5Y2:'U*\C"--E>?C='#(,_KVMC&WF5(2,//Z]O"S*Z4$C2K_-SY;# +M3HCMC;NHA"T=ZC="H4+6I1&\_N:#_HU[@?LTI`\V$G^4O81)/ZK5BOBVD/C#,PYR#-ES%JCI[R@A5( +M+8<\7]+=I_;-\I1*5F!(*:H>/.3<>>8T@RG((=4-I# +MI-)I?G<>]BRVG0?;";7Y=B0@Z'V:<[6+$R)(ZTI0T/N"_4/@KF'NE](OMOA" +MT@"<#]@UQ!72N`U7_&=K[`]J/NQ4>ONZ +M)Q:J]'N/G6[\1J;SF4&[])?!SU[SJ74EYD?_%Z0?$6,C[UEYOZV_P+*2P%\^ +M=\U_Y>)!3K"M'Y!_[;?FPH]&9CS\@&3^AA^0C-^>'Y!?8BU8L]^"?YIHY2N) +M0&I7(FOJ[M*@^4*K'Y#J##\@VB,)^`'QRAY`=`E\66:;V/_'BOW6Y)8VF7I+ +M6S+]?[RPWYJ2D:>E?<27WO6)TBG;DXY54)ZC[/]%/\RP^T?C!GW5,;LL<>$N +MRPD*V*9GFN/D-[!/>#R+'@TMZQGLYSN/OM#&YA_XOV+PU(0KQ;X!/&9Q#G'N +M1K40WSU]9D$4/.`,A(K..^`SELC]._2*B4L^\3GQ.?$Y\3GQ.?$Y\3GQ.?$Y +M\3GQ.?$Y\3GQ.?$Y\3GQ.?$Y\3GQ.?$Y\3GQ^?_CIU83SUWS?[H1)SXG/B<^ +M)SXG/B<^)SXG/B<^)SXG/B<^)SXG/B<^_S=_`L>)3PP=>=:@T\\X?>#I[(M0 +MC"[[F7G&M\TS!PP8^#]6]QUB*OW]3$RAOY^*G]#?C\5D^KM=W$9_MXI)]'>+ +MF$A_-XLKZ*]47$Y_EXDQ]'>IN(3^+A8E]/<#<1']C187TM\%XGS1E?Y.$GGT +MUT5TIK].PJ"_CB)7Y(B(Z""R15CH(B1ZW12&/6W1ZU85_D2%=ZC0"7?B<(8* +MYZCP%RIAJ<)B%<95>"%A0<`O(B4J +M'*/"*U1XE0J3<`Q.X34JG*#"FU0X2863*0Q2^#.$`1'YN0JK`B*-<+H*9ZAP +MM@KODN&)SXG/B<__MSY!%3ZU$,JK/E&G0N@W!BB$?F,6A="7#U(XX!T9?^)S +MXG/B<^)SXG/B\W_+QX`9=%K]`D(3`^@O#[IFK+XF/[PJ-LEP(*5%D1[P$H38 +M[1<"=L+QNGTL45&NI!VUTU?:[K9-EW#[\$JS?N@7M@. +M$K/N\>/]`=[[IFC=3`8XWS2D7_JSVR=?>[,YYOJ;K[W-'#/AMFO+IMV8 +M_!NB_C3Z9-;SWTT_\3GQ.?$1HAXV`B9IHCVK7?\>"([62A.\^&VPU:_B)\D\ +M^`U];3>MB>'0F:8OBFO_=?;!ED;K-`Q`QYN^-?AFQ$?HMT[?6GPSXO/HMT'? +MN?AFQ.?3[RA]Y^.;$5^\#W84_OVTGSSE]G$3KKUF[+7MXFN[_-M7C_I<<_WM +MD\HF4W&WC2T;-UF(*Q^Z\B'$^P+\T0+"3X'Z)0(^7Z3E([)\$5]$:XV(^#.> +M`QDY\>@+ACKHWL]0A]84[S&BZWHDG%%"MOR?C3"+\\JL61%-=-9\44TKU@(# +M-'V49B0U\R;-UGR^@$_KX`MT]>DMSS(SQ1R=_YM#ZW__QZ='.D>+!XQ*WJ1^ +MTY!TZ)J1'L'OUCQ'_6[WOM_G$T$M2YQZ8JOZ_\O/S3>7C1O[T[+K)X^]YOJ) +MMXR][=K;)XV]_=J;_[?5CPIOF7C[M6,GWS;^:[W@EP'0\?9Q91,OF3*FW8N: +M"*F,1]+'+V9PFU]YHH?H($Y6)?=2L>?0]Q1QO#N"@>)4^FO]P&3#2<2&LIV_ +MK]&1UL^P&X4HH*]^I1"C3Q-BY0^$>"Q+B"VYQ,;2MXZ^9Y\IQ+@SCUK&_I=\ +M'!6R+YZO\>EXC+BL@%_C=9$^X$Q;4>SVR663K[]]\O7C;O^?:N_7^=PVY:CE +MK_7C\_N%3_,+O_]_>3M.G.Z?^)SXG/B<^)SXG/C\W_W)T_U7[B+F*?Z]4>4_ +M6_3TWQX_]=;\RTX:E/MX=G[HLJQ_!'(Z9H7"'7PM3`DX*=I=9X5R>I]%G)ES +MY^GGGIR=]]V)/F:R_(@7XJP+)U0_NGRU?!8E5]]ZQ\]E7I1^[LF9Y=.[.1TG +MRCJHA!;FDEDVS8^JLKYIG]#8AU;6-/[FT[L.YJ3_\<[3[XVYNR3IUQY[X^>7 +M=]M5_J>=HQ?M.?<7]Q78LV]__ +MT6]7_#B_X???O^'"*V]*5&I?_&#Z51,.7#SP+?W0/=MO_]VEY4-.C>B7_.K: +M$?]U7WS`TN]VS/Z3%<[]3O%O>WQ_6Y\UUU^T9MJ2CWITOK_GY"M.']C_.W_< +M\NFSAW]T\,'1/RG[RQL_O^.2<[;>^E^_[O+%PQ/^*D2_%Y-VP8Y5/_ODSR^L +M'W'7QO$7W/;>@O4+=S]U_HP;_W[JRQ_\H.LG+\]\=]%EURWH].8]-M]K)<:7ECV[==KOW=ZZ3W[+JMN'CGUB56[_G;:F;_:Z=8M[/;6_=,> +MN&YXY9C?G3V]P^JY?5]9=^/@^,\>V?Y\SZX_>?+LS9=?<]'D7GF;?YD=N6G4 +M^\]=O63B/SX;]O`_'_W>@V=\=]V=^\[\U[`[?SCQ+YOF^JYY^NW%]><]NZ'I +MB=#^4][\P^IY!SX<&37^=4OMWEO.O^VJXD&?E[YR^\6_[OU:Q=+%NPO/V7KO +MEK*9.3,ZSJ\?6O'/6Q]_?\.AWZ^]_NZ3K_A-[*R_Q@9M +M[/+Q,Z=]J^CO;T]Z;';HD6_]N7_1X%^>9+YZWJSTXU-*IC[T"W_C#YWPR=TW +M77O&NRMKGEO[4O53?7]Z9:=>K]W1_.@[-Y_5;^5#C36?_N;@7>F<=_[QWM-W +MCTF6:/XW'KO\Y[NZ_:E\],X]BWYQ;L%]L^VF69^=],>/Y[UZN$-BSS/CQQXY +M]Z/>RR_]\OU[?_NC'Z]HR/_^[R^\X:8K*Q-?:--_,.&JBP^\-?"0OOV>W]U> +M?NFI0_3(KRX9<>U]_S4@_MVEV1VM/^6&B[_3X[?;OK^FST773UOST9+./7K> +M?\7D@:=_I_^6/S[[Z8\./WCP)Z/_4O;S-RZY8^LY_W5KEU\__,5?)PCQ8C\[ +MN:/@9ZO^_,GZ%^X:,7[C;1&_A^J=VSSC_[S>^?.H//OBDZ\R7%[U[W66= +M%LQY\T,C$$Q5N7NG##_E;Q?L6+;_ZI13ES5GR).%ST\:]7E@W+:?OOB''P\= +M9P[XH/N1W.4W5UT8S>OS[9>L%QJ^O:SV]=._=T_I9?N:JZ>.7/7$WW:=>=K. +M7]6YW1;>_]8#TX9?-Z;R[-]UF#YW]2M];UP7'_S(SY[?WK7GDS_9?/8UET^^ +M**_7+S='LD?=]-S[2Z[^Q\1AG_WSX>\]>L:#Z[Z[[\Y_G7GGL(D_W/07W]RG +MKUG\]GGU&YY]HFE_Z,U35O_AP+R1'QK16_ZUM_;\6ZZZ;5!QZ>>WO_+KBU_K +MO;1B]^)S"N_=6K8E9V;'&?7S*X;>^L_7'Y^_(9CUI2^_\XH';AC[^T/7KSWY +M[M]<<58L]M>-@S[NF +M^G_QP\:PT_WD:S>]>T;-RK7/5;_4]ZDK?]JKTQVO/=I\\SO]SFI+$>(B_LT_ +M_Y[0F/]^K\9[SINO+;N]W9XS'-GS=O?GQ/CT[L +M%A^*CYVG'&?Z,W=_G?X]5*8Y[?Z^R>WW_[` +M2YN/589I`BX$K.E"3*/?O7P!7TOM`9^8N^6]^NWR5P$R^569'I)`BA2_,]$J +M\].V)V$1H6]8G:2U_62Q-.G_]-]_:BJTX+B?PL)(7B0OYZ33>G8K +M[%[4HW>/WOG%/4_I>4JO/@4Q[Z]7GYZGY!=W+XJ:77N=U#,OOW/WSMT[=3.B +MK7_'J*M0B&"X0\HIK#[_?G]9\6HK>.9(ZDCY\N#EU +MJ*FI^5#CH:8OOVP\=/"+@XT'#GQQ???;YWD\^^>QK=UK3 +M@DWX-*?D;PKWW['_Q_LG[I^POWS_U>LFKINPKGS=U<],?&;",^7/7'W/Q'LF +MW%-^S]6W3[Q]PNWEMU]]Z<1+)UQ:?NG5WYKXK0G?*O_6U5TF=IG0I;S+U7=, +MO&/"'>5W7/VCB3^:\*/R'UU]]L2S)YQ=?O;5/2;VF-"CO,?5PR8.FS"L?-C5 +MO2?VGM"[O/?5_HG^"?YR_]4W3KQQPHWE-UY]P<0+)EQ0?L'5ITT\;<)IY:== +MW6%BAPD=RCMN>6;L/;>@;8?O./SCPQ,/3SA\S>&QFV_=?./F +M:S>/W?S#O]_T]_%_+_O[E3NF[9BRX[8=-^VX[J6?OC3II1L>F/;`SQZX[8&; +M'KCN@;+IMTR_8?JUT\=^?.O'-WY\[;"?#;MMV$W#KAM6UOO6WC?VOJYWTG^K +M_T;_M?ZQ-TZZ\;H;K[W@9Q?<=L%-%XP_;61^^:[LEVH#]TO%<[^0?V_N@8Z-1G,GO7.DBY%7=%)QUSXGQZ.G=NO7_?0> +M`_(']AS4:W"!;5Y3.*'HIMZ3BB>?,J5/1.C,HU'TS"&Y+`O>E#YS2&',BXOW&T;AP32>>K<\^=53_P'#1'T:^?H/ +MZ-WRY!<3^-TSSD`JRCOCC-XM3TC%TYEG(O4`/_5N>9*IYXSVVG+.Z/AI>/HL +M?V*OAO_?)8@;AH]?I.U=R!T,X7O(]P&1_!@^TD_+M +MY'P!)<7C/<-58FN^ARG?PW-1ELPGR_'R-7OY[!M>I^_<`+\[I"4]LUZ>>\[O +MYPKQ>RXOLUU>_2C/BW'%`/$@?=>R/-$87PF%8^A;)W^+IRA\EK[KU>_1Q,/< +M//ZVT\<)>4>'AW$3QTWVXC!FV;0^#[]^XBV(X/&[;0JG97Y\+2M[D-;87F+2 +M3V^[>>)XF>W&:W\V=MPM-T_Z\63F=]J\Z_%DMT^Z=MSDVWY\\Z0;)W/ZF"DE +M8*R&@4TZJC(A<0U]!D[@1LS@YX?GX@%P_.R%)]\;,X6*O$F^_8MY3;4K]A"+ +M2\]/TXM/M[#UU@#_@#P1XO]#U+,044,01:#_=L"F_\R'`B+31"7]_5Q4T-^Q +M]6IN5SHUM[`^S4WB1G&#N)[HP\6L1=.J0W,!Z]"<)T;1W\@6S1FI.R.U9Z3^ +M##1H@O271?WRBW].-9P!#FX0N]&WDSA9-*9-RB_$MYF+0K=JG/G&W<6_//6> +MP0O\OYKVL/E(]I/3_M#Q3_[ZZ@9SN_V!N_/,73,^$_?Z%OKVVP<(W1Q?E59K +MS[,?*WJ\Z'=%_]+>R?JBT9F^Q'C4>.Q;CW_K=]_ZO?',W7_VU^5_07"HTN80 +MCCVM_55;(:K$')_KHV??BOP55.\*HDS13WVO[WJKX?"G\<.#1']1+/H?'O1I +MO.'PKK=\KT<_[=SYT^CKOK=V'6Z(?SKH,">+08?CGQYN>&O7Z[Y/HYT[_W_Y +M_68MN.V339NRWHF]6_Q.>MV6#5L_3NMFSYX]OM3?./QB\*U3=IV]S_I<_VCG +M!_4?[FT^W&.OM<5\]\"N-0=?^_RC]T*;<@_D1*-%_;73UW59\>7FIN#)/8M/ +MSHYL[?Q:G_K^HGNGU$E?]LSNT[M;W\][O7'2NAZ'BD[NVO4+?5/'^CZ!TT[K +M>-8!*W5R'_']#_N\E5IYX%\=FT\S^_3IV$'_J.M[)W]PZ.-UV]]X]_.MW0[V +M"??43MK9:9W85/_I:P>V?IB]H[CIY%.:SOFR?Y?4Z>_U_S`:R>F36Q3J^%'V +M:]W6]#U0;!I65@^CV?RP^P>-'[WU^BOKQ<8W/OAR1\]&\Z1T?&O_ +M+:>F^Q:?&NN3=?(&\=*'&T[T__]L_SMW]C$U/)IB:FU"35%L[?B[2W"-FDR= +MS(<*P9`>SNX0R!65C4N_B4/K%XWU-/Z]?_ +M=&O`&6=^:^"WO_/=0=\[Z^S!WS]GB)T8.FSXN2-&CCKO_`LN''W1#THNON32 +M,9==7GK%#Z_\T557_]?89%GYN&NNO6[\A.MON/&FFR?>,NG6VVZ?_..?_'3* +MSZ;>4?'SRFE0?!FP4/QX0..-_Q+BM3HX$16=92M]OJX^0SWFLB213P3\^$#\ +M-[NU*UH@$#W&Q\Q\SNL>C2Z@KZ&^V>KK_8Z:^?G1?L71Z"EFS^[?/2T0Z!0) +M!WN?'.V>EY?7-2_/Q_#5B`YCO<^B9D,&.8=&)(\HMDG2NC@NZ/!P-%1BQ_F=\^/W/1Q>4 +MS[IC^F]?>6G*09^0?VNQ>A(O(<3WZ:F8:NDENJKQG=PJ8_S_L'<]T%%59_Y[ +M,R_AS60RN8213C!U7C!EGAB9@0T8;8YY@2C@H6S$;,-VJ7D#Q`3%@"$(Q9B\ +M&<(?D5+LT8K4E1'_P.E:U*ZZ7=>C.6I=SUE+75?WG#VV)0C+=K,Y?S<>_[WKW?_?[=[][[WLT;(((UU_3W7U,3_&@[^Z,M +M_2W1TT^Y%#FO,$P`UPVXQJK#V^6S!$&YU_\>Y/">$:7X7(O;[XC,XR!U`#5+ +M,#.58DXK`Z7Q,-<$U#P'7'X):X0*FD3G4B5]&7S'0+>*)L.FU?05FD)QZ.D" +MFDH74@TB[#1*8+4R'3W^&=5BGIM%%U,=74*7TE>I'M)?!@Y-:J39-(>:Z'*Z +M`O/I/,RL5V*&78"Y=B'TW8S9=Q%=C17/7]#7J946TU_2-^BO:`E]DZZA-K(@ +MQE):!IG:Z5KJP'R]`O/V]9B_;\`\O@KS^8V8U]=`LVLQSZ_#C/\MS/TW8Q5P +M"RS)3TJBX',VJ'?@WA:ZD_;2`?I[>I[^B1!MZ#`=HU_36_0NO4\GZ"3E:)CR +M^.=X_\H][7/Y$?JM+*_N_%;;"JRE5V`1M&'4TNE`##`!NPO[#ZWI/H["`GWM +M#>U<6RZ@%K6GEK=VK^AI=]NWM-^PNKT[U;.VN_W4^JIE_?(;4JENN?Y;-*K\ +M;V_\XM!==VCR/PC6.(+VTP%NW-E_?T\,KT[>1SA;2"JF0"JF0"JF0"JF0 +M"JF0"JF0"JF0"JF0"JF0"JF0"JF0/M?T@8^&SOBCS1<"7PPKA51(A51(A?3_ +M.UV[HON&=:GN]L2*U>MFS$@F1_*VI:M6]4R[=MVGT4<2:58RR?GTBV>.R;E8 +M.VMZDJ8GIT^?/F/&C)G39Q'N7@R4GOR?2?_Q:>V:GE2WKE-G>_?2]NZ>L];K +MZ&Y/]72FNLYVWQ4F>2K_$TFCO\@T3_X?JY-_0I!W8I\(T/X<-&\&M/"'9NVR +M.NJ+E?OX#S44E/,QB_(-@#9`/V`/X%G`(8`#B*5P']`&Z`?L`3P+.`1P`+&E +MN`]H`_0#]@">!1P".(#8,MQ?1KU[EM7>Y2/1M^-JZFU;]IL=/M*/-AAHLXSY +MU!725=P3H*]/)9VB.ZX>P448%Q^+BS*N>BRNDG%58W$ZX\X;BZMFW+EC<0;C +MHF-Q-8P[9RPNR;CRL;A:QI6-Q=4Q+C065\^XP%BUEVVE/1J3Q;6439( +M>HTG!^LB.X[T6D\&ECFKDE[O\<^R9<$_R\/\-]'"$I.FE=13N*2.C@=KZ6`P +M20>"-;0C:%!7L)H6!G6:%JRD<#!*QP,1.A@0=""@VK\MT>&W6K3+SSDTH\G< +MIG+*O;7,<9P/B>7*O<6'QU6W7&;)\NC[-NZ/OH>R>AET,PM0U[4LROXWR=49 +M]<:L.1@C]N^91I,D5VL42]U\H<341:T^Z&KY#<;\P\UTO"Q +M5GJ`Z+9A)\XT!IFCW@:+_9UL75-/#K7ZV+9\;Q6Y!YM[Y9\IV#:&Q#C<3Z-M +MD/.<$[<5OM\@>:'#3L*N)X,JQUETS$FP;EA'(_J)BJZ2T?(8H^1A7V"?8-]@ +M'Z'*?[QJ$<9LFL?NB'SV%(URS(NF>3RIR"VHSY%ROL[RTU+F'>;7Z"!?#Z4H +M%Y?\G\*_##QHJ7FR:`/DX$]E>-I8+C3'#L/1]\D.YQVRD^/HQ_N@^IOQQD^,!Q9=BKF7:??IVD@WM. +M?\"DL#EIA!=%<7G)'(?]7'Y/MQV1[]ZX93\"&76T>>*T'=AGV7?9A]F71^QB +MP"X*QV+'B8^VCQL+&RRPK-D/.HF1^N(,.T8\.[*=5#[C_P#Z'IRBG71TBS+% +M$?L!EX>1]I$SVH_Q:_;?$3K?=^WT(=.Y1^\$+<&XC_(KEEUSOV>JR3D$UR@K +M]K]#3YBUI+-PGU\>3,"/#;H.^<;!!+V"_`GD3D;VNSF!_`LRA'Y#.]XC"0O6%A88ZTM?NKN$Z#GL5'\[/KL^J)N]'7L=%_VML]0KN7H:^THN6[Y#.5J)4,O&R77 +M*M*UNE*1ALLJXA(W6EJM.%PJ[K3TM(\-E0:KP\[<;68QG,=CC%J7C?G +M^4H%XHS%`76!BC+B6K.&?$`W^7[.T2V5ZW`\1(R\7G%C[2HO7^/EZ[S\9B_O +M]_*-7KYEU`F.TQJ,TR3& +M:2W&*<9QH![CU,0XY=C2!+NI%-9\=JQ<`VU_)E8>HAUE`K0C=`#TNDHJ01_C +MO*0:]`W0K_'B0"WHUX%^/>@C3@2;0'\>Z"\`_6;0;Z$=@<74%=@*^DK?T"-+ +M:&'`HFF!Y10.=-)Q;24=U%;3`:V'=FCKJ4OKI86:#1ZVHWXY^!E`KJ?#=?O9 +MC__(M6PJ$*\5/KX1WU*14LT+!9/#(LED;"P +MRL-BN0B+SG!8K`R%Q>I@6/1H8>'+M@7\V89`:#WB&.IIJ+>U.RRVWX2XSN]V +M+Y5]B!!=I#$]MAW35&"_3TJ7:6H_)DE?HV_+6,LZ&O$?EDG9P$N(4J&4LI^< +MW;Z?IHU"GB\;]#7MODI^+W^X5="WM\HOZ!_S"W.L735F_ +MF'>O7RRXQR^:=Z,.Y&%9>'W%YPVB*HED%T!8GOK,=R[2GMBL:_*<&.N#Z +MTH?0ID;:'G,;_"V"^U'X6B7LJ\/.U;"W`;O7P/Y)V+<6=JZ#;]3#3\SUIWV` +MLK%`$^[-0YT%J-L,/VB!'RSVYDQ[OHS!#LR#SA9`9[X[8N7^[\;* +M*_J.;B7[?L2;:5H$.L.XUEH\G55"EX@76C5TB_&MU:`=XD6@%G0POA$O=B!> +M["B#'-IBV*F*USI8@RH;&IN3B-4^19X7L6H1GTWV`7)C?MK#PP'U)MRKAUY4 +MUDO14"OJR79UP)D<[S$N%%Z3H0\5/&K@4K[%U\)N)T +MOZ=BCOOC7B[T\@>68G6JCR+V2HRI4>,OH\VC346APBLWA`;Y8Q4AGJT+%_2*.MRF=Q +M4$_)[VV>XT`G*.LGD&_+=/"ZD/<6"N\O!LQF$NK\HC0U,W]8=W:T`NP`0.`K8#M@)V`.P"[`/<`LH`'`/L!#P,>!3P. +MD+$9\W83KVEYGX9QSSZCP6="V!,([`DBV!-$L2>HQ)Y`QYZ@VML3U&!/D,2> +MH!9[@CKL">JQ)S"Q)V#?'8GQ6AUB$/U0X_A/)]^48ZV2!K5D<:F(AC`WO)>/ +MAU"FHG0'^>Q.!;KV;WBS@]1T-`/?(C43E5"4B6%]U:SV6IVP`YE_(-%\),-ASN8A\GCV!?3'7ZLSR1]K%7@`TGE#JQ; +MMC:.E^?U1NB!3M5)K'%`B]LP/@O?8KR"_A7T?V9;.6;RL7+.YW+.,9ALJZA, +MCH$.+BL?S"15TI>][?7/.?2B\CD`?(]=5N&8>LL-NWW]J^[61 +MLYHJQ[V1F`3>JS4W)O$XWP3;%T>R4<0'4]]V;RL%RM,^DP +M_;/2PCT90\B+(3XWAA#I%L<0A_<;_B'8(66&.88-V":O-V0NOTF9L +MPP',3ZKK,W02]G-2KOW@Q]D<[,?W1[7Q;49H+[8;1]$$:3%MZC_XR(?Y)G1\.$[/ +M8&V-/EM>Y'-_,XVU\!<;<\9$?AZUU13\'(2V[6UF&W\%\2G(\]TVZ+OW.?/M +M01^M5C=J;;( +M'@(/VAQ!V^^KH-Y#*:8Y6+Q%4&AIQ7,:-1B<&W@N&`^\&!RGO13>7`>T[\%5GGS0[?K8=;?>\X +M\5>#MJ8C?RU(VDO@[47:(EX(;Q'/E6\1@Q'PNAOR_`3R3(0\9%KR\5]OFY2) +M0L^CW&^]_8R/RC95P?9*(!MR=4MW9,R>HJ4:C3O<6H)XL=8KWXJ8<1.7MPRU +MEL#_UWGE6R'_^A*40T>C]!W4@RMLX.LM1UH#T&NO@K*MF$K?\V8(=J,)1UI+ +MWG7B;(>GJ8A_[K09$!UME^SMPPF.3\3GC#-#*5+O2]%>8U&VZQ(C=S_F']B, +MSR[O!4]_G>_?;<_/)_1?Q@QYKC6C-V=_%S-RSM=,KB=CN>=7^W\"O[IQIO&E +M_`4F^Q7K1/^PVCCA7&1J)X_)^>Y$&FM-]HDPG[EN6VK]K8_NO#R@?10MO7.F +M$?-H(1Y9=RKS(]_SZF9XK?ADI4&[BRW[U;#!YX2S[U<8?&Y8OZ#,Q;/?,?Y= +M%W_G^?,CM.@20[;'^DR?GD_P.6_[.JZ-_=SC..I;Z;AE.Z%+?V53.*359'_HY(>,]],7]"GX^;-OB1!KKX.\? +MZS@/UPK6R?Q3("'8#*-;$QAC84J++.Z5`I>]O=0(]2FFOG4XKGO]T-QA>8[^ +MA1_YR'**S>Q7SS.V.E-,Z9M];<)X'3QV#<>7I(NE'U`CZH,G?J;#;;0T:6H: +MVSUJTW[U`?QX(\_72C/+Z?0-["WV]4VDYV`_(6#%I:)^3/[8ONPSC`'A) +MLY9I@H8O)EJ>`DVO;*$,DVGZO*E&,9[&^''\`'] +MYPGC1+[-Y#K2QM>QWL!_RM4;F&)YQ:N/G8Z=V7.E#)+'J=!9]J?YA(^?W?.9 +M:JY6$3*H"3)S6^CN9;3%WMUB.O^"LMPG],7$B5VHC/R%Q]S\)>1R?I6O"F)2 +MQ]ZS#=<>99X]F"[[5S'OFUR:V9T3##?&-%@K>3X8B%G3 +M.-\]Q9IP.M'KH/:Q,\><]OSS_GHPR58!YAR +MOR8_B^R4N/NG$[D$)1PWKI\/6NLCACW9M5WVO=PIO5W`>GLHGU"X?S6FR?XP +M5TAZ_)L'T(/]=HE!YP['[7>13T+>42G[L'^=2V2O+#(4_@APZRR#]TZ^B>CK +M?">!_=66@0C*]Q<9]@2W7_H5^H5,JUDO-T\QI`ZI0=.E'HJM[/HI1A#K!,95 +M>SC])@^'=C^'G?2>*3)F4-#5S]$#L*EJ:OIW$KJOK]&T^R/R;T3>>\3#;W?Q +MC*M\U,5E;_7JAHI<.5YE?7@Z]KE_C\*OG^S4.0;E"E4 +M5F?G8^9H?[.?R27L&R<8]M19!OU7SM7ET[F$HMH!4G5-Z]NI9YL]T>D[O2_R24LZ;L-5O,^T+DF8;`?O?V(ZT<\'^BI"8:/ +M=?=&/E$$W*9_SL7M7^:ECZBOY.3?!LFQTB(,GK?^F[>_`8^JNO;'\7U.)C-G +M)I-P@`!#B&0G!.;PYN!++;7T:&UC6V^9I%9B:UMJO:VE,9P)`<*+ +M2%MKO13E@%:LU=:V]ET+VE9MJZUM?4%%"8B\"8H(`B',_-=G[7TFDX#M]7Y_ +MSY_G"7/./OOLL_?::Z^]UMKKQ7M*P7B/_J;_T3X8=P;S?:DJ8_BLZ^7U:/`Z +MW]:,ML:(6;;H#%O^D[E4'5WS=[&,_Z:^6T+[R9B9ME."?7+V$,>@NMYF^BX2 +M$H@:.PZZ>L$0A1_?[BVL=Z-=-M;DB-*;M%)IOQ85;L+H$9GUT`]T+K%"[76> +M6.4E0'>GD&Q:`OF4^G0/]5M44W]#M998XL\/Q=)V2>+,[3.JRTS +ME+3$HNU-*VEQFF'J?U==:\A,VV9[QJNB_K$.)"S<$F\Z"7X&T6LYWZ+G?<\R +MKHGK,$VR*5HM[$ET'V]/NF':%\*Y*QLK<[3?E-$:ZJ0U1<^J.N$[--.5OYSD +MD`S7"#[.#,VSC%QMHUB529CF+/H^4=S"-\5\;G?I]GG9-00O@J,_;**:M]L4 +M;GI?T/#J$#SV/30?)O7!KR+<6#,SXW^[-VE4S5*TM+67_<@,WFLV-?^=Z?M, +M&SCT-*[!`Q`L_=>&J/67FVG[GZQ4?E_?)+JE_90POQU="F_B>(_V8L.KF8_] +M6N&](;Q/$=YWZO7S"8TS_-UMZKO`F8'??4Y_MWV6+3]=J6A/QX#O?IV^ZX6A +MEZ3OK+/C`7W&@KZDS/'^6W]SMOJFO_(#:-/R'GB?@W8ZYO/UM'[2 +MC>*+&I9I]8[\9)VC<'.=/83'%V8\#1TSA=>JZ_Z'@B7PU&J7GAF*6.R.I&E+ +M+9*OK+G[TN@(ECOG=_Q&?@//U'+KV='DURL/J>A+*0^IZVH_8/XGU +M8\;Q/,,<\>?]&\]UP&<9]%V#YM`(S:+U$'']E\YTS!SQ-Y_2Z_^CM/Y#!,O_ +M&NR@/:S7:VD\_@.#&8]0C_>/CQ!SKZMK +M0U][!Y1OF5?=FXH233-[L)\INK`!])WW'=%80_/-_!&U74-X'N5U-->N)_AF +M`#LM$X5RHA5U185,8,V0G,;[A#6@/*3+[0'E%LH-Z"14.=;]2+1/O)/9)EJA +MDVN@]T;2L]Q"D1G)[XI$B.H%=8"=!LF2)TEP'JG;+D%_L6=1NT:OR.0*S]S$ +M8'JWJN@;"?V-*GJ^F[Y1I;]AZV\\BO&TB];!^AZX?[2H7JDN#[77MAIMM9D3 +M^!;!3*QR$V']S-+/CA8]BQ2-P=!C0#^K]!@L/093C^&D?A:C]V11_T.Z_Y*> +MG:!^2=VOLJ+V+=T^OH_GH(77Z34-GIIA16M@VT*#87P!\!0\"^$.X!LE6F#2 +MN@4C'KSOAW*IZXKWCTC1_M$^B/]C'16>N.H?=8D!S#PMNIOWG\BY>TXR6LX_,*)I+@Y +MYH@MZIF\]X3B*;%'=M*>?6F(UCSM,97O4WSA/ZE^]TFUKO].UYF0XSU](NF' +M)_'ZP_CM@#_[V)EZOR<:2JO5NRLFF9<2'G1+C2/:MV^T1,82AQ[*B*YTXR"Z +MCX.O(KZ%Z%5C&>UU(F:XXCK:$SVA=1VBD7G?[YY(]2[T6!8$W_.M*.W'\/D% +M@IFF&VJGZ5]M),2H[J9O1;+V#VG>5I=DP5DWKC;HMP/ZW!:N@^?B>]U-*]B' +M6@2KLB)Y +M]8J_$=*UG>.LU#H@WN<)[VFO:)G2M8`C]!O7OS9^/=E8J7\3^K>:?Y5<\^<'OR+D +M5N*-0X^P;J("/-YS]&WIT'Q%6)[S_Y1/]9(L:!-^R2?R*YA>G8SSK`\U8;T3R0GZ3%X&<*O_RIQ(OC6PS4.SKZPKN6# +MD.E`WS(SP!]I[Y.)/CXBT]@7[;];:;#^[Q58QW^+[VWKL011]6\R.83J6NI#^_D%C;`O]O3/N);'S9%Z9TS[1#] +M1>@O3']1^K/HC_>4ZLRM*N)6E@K+;(]TQ+(S[#%!\YQ2@,=3G'Y +M>>?0>%7Y'32^4OI>B/XB]!?.]N]G*+>M&?VTBOIIOUL__Z>XGY/[]_,[],R? +M??I^UI_C##M=/VO/<0;K\LWY.,+-)9^9\\D;PV +MT-V,/Y%JI>L+9ZBV5FVE=5[/?$_B$T0ZMFEQGM'V$U@O+DP +MC7>6'F]$C?<;IQMO1(WW:_]BO.%SG%C[:<9;_6K]9_T:^K_D6_WC[;J3I=OPZ>[0QO+YJ':IJ'L'"<_*S3S\.^LYV:]B+= +MX803R=:`UKS5DZIG6D-TIF,SZRSEE_3Z1Y\TK40[H"7?AFZI^^P"K92YB`NZ +MX;?F4Y!+3OO]%\]VGM2T\QC3DEDV:(I!O[+J1+(^Z,L.W9>VFA8V)C7@[T_K +M'73BQMU-S(\,:-O_Z]G.%]J=8&S@#^9U$+1K%EJN_X')SO7TS-\W@?8V:N<_ +M=?R)T_31_^/9SH*@'8V'\9-+;=YGJ`\C5]-V0_,5)QC[*[7L]>5\*@?XGZZ] +MWY[M=.KVPNV[-^86EUNB]Z'TL:VF&$N\=CW]Y:DL2;_CZ`]V`;RO]E:[U2^# +M+A+YO4.XH5+7)G[1!>^%^!LK3N23\?5+[8%]D@M4G^0M[]XG^8.SG36Z3^B/ +MH_LP'M\O4;!9G:MQ_2&3G0U43^[J**F=YO8/VLNM[^V"XJ(?U>P$,(=M_KV^>YX<(\$3T\U*S6$N9J[3BWOE/I +ME(X]UV4F]MP36YAAS!D2T`W +MQ!V[+S5/[CF%=CR!]3#K;.C(`SZ-Y43S,I+KVJ.N_.DD9R]PXC.:=LPE7F.# +ME9&;7E3.?Q>>.<9*UVHW5-LD([Z"\@V`9"IZ)A#@T+4,T>Z/HJ';E64.=_0&] +MUM\QB-[+B7W?V8^S%:*K\=^9HH3GI3KCWWPB54K]H6=V&8WI$/&G);DHX\$A +M\*=O3E0T):3VX3W4QG[0[VQWTQ*(7*5[H@;QBZ+"'QFF?7#Y*"%+U]0T&EZ- +M)T8+US!FVX+^S**U*1:VNO(C:L[]6_M@:=(>ZC_>!Z\.NO__`C9^^5!G3P"; +MW6H?31)L_$@?;%`V%/`J[5\V`O7,OC*CAL:#OPT6;)M]]R'%FN>%JFP\V3G/6T;_KG]"1G +M!#3DY/$4]J>'_L4Z_$_(,Z^?Y6!?4+CMIS'WZ.^4]B?2A?D`OU`USY75`5T( +MZ+8N'ZG[ZX?=*2&U[J[%NANJU]W.XTI.Z?";Y7_E4GR./F#?VL^>Y?Q.USOMW$/_K&([Y4O;Q6K@`6P=3FGGR;.L-PEP +M)32P'9?:(?G1V'YJ.[\_RWD^H`_`L6*\>G2(`_W?:_'&6B?`, +M\&>Z$:NUTL1#FC'#"M$?UE.49+6X2;P99%];)'BN?W4\5:!CA%+033R7VY3N +MZ#Z>_`K.(<^8Y-R4&^?Z?QW/-`KRU3"2KTJTKG,P9%.+UE58GY'WFNXD6O^" +M^=0&#WJ(&/$:N7RMB_W*#Q$/T)DFOM3$FDZ4]NQH*CN>3P(7I3W)V0"=X-^/ +M$SZMLQ(/(JMD"W9^E_7X2[?3N$C.U7R!06U[K`_QE#P?SBK]\?>/LSZ"Y.". +M0`[?JGG++V/_N.6L/CD\-%V-IT>/AW[+_G`\:;;[6:P!P-/./9X>VF[Q.A)5 +MM/=_0JVE845E_L=5V1"J"WBZFF_B^A^=J/?0FLSTXO)&74Y\O1V3UA#HP[.'FD=-&(=_/2XDCE7'$]-XSG>U`SXGKDL;!FY?/,NHJ<35H1Q5'O9I.P2 +M6Y8J.1-R,_/!)*>3W.8)K]S=7R)LR'7BCII&$>L>:4*^&RHDWN<^$3V%_@#] +M#/\#+E5$GS_8U_?_T'W?A?*IJAPRM+^\CY>'W,%[65<^=9C+1(L!O6S1'$3! +MWU]5-`?%>-U\EK-(\_$'J?_[<:[>2;QI26UCI%UXZ1#KS%K$)TZD_*8A3'?1 +M_SU*?]`X@6``NP'YO>/):8$<^!D-.]JG`_A-6@'X;6/X!>,-QB;/T'M2*=L@ +M7-8?EE81+*T&L99@&=],L-S3%*,O8UX8EM5]L`3<`$LY1+5;`OA\*LPA@EF_VSCZ1DF#/>B^I,&W8EWB/JVC@Q`*^&G^7D-8SZE0\]RWE9]U-&E'QBMB<]/`>> +M3"@CVMDK>1^VB,Z<&36L&/TRO5HPT>F`_<.'U!H5<=#2A?S>0-FE/)NV"[HF +M:GO+W_IT3EA#J%O2+MP2EK6:77G>1,6_C#"T[8#:SP'W.1I7Y1-JCL1M2<<; +MK^F$17V@LFMRTSN4S0]LA(R6/K[>G9X*U8-T^T^:S_MH]S&^BCW5: +M5HRS3F*F?0']0O=3O7B)#1O)T8N6V!7ZF;`B5C`6R!NCJ&J[$7MVMJ.O[$'TV&%X__G@F:!EDLD[!<\?T) +M6M:PW!"5U4/^N%.53=-EU:CGJ[)83M%PZ)?D':ILC"ZK0[WO32C0OT`6=E!^ +MFRKW\L>4'OSOQU+%O%)VP+YS)?:=/TXIK%^UORB9)=8^RRU>?Z(J33*+:M_2 +MSP+ZA&=RF>X3R3/6.[ZZS]# +M^IP!(1`4_S;3Q9S(G1,*\NX(W9=*P.%KJB^!SGDXX/C?NG\7$EX^K_OQ@.H' +M?ZMKG`695)Q4WV1O_M>I*Y=BF"?UD6^@> +MY,?T^[_1N+$"N.'WT"CF>G.(>+9$47>J8?'TOZSQ--@^[[9&]! +MEAGXKEPPQ?$"^H8S$NIWG,^5YF;\JQS'RBW,^`^K=L3W=;]N.):2MRN[)3DF +MIYX-P(<-;CYEHOPW]/P._=XWCJFXIC0G;`.;Y;.JEK$T*-:[$__1L?98\EN0 +M+YZ=X/PCY[CBCA[FR4JIWUY'A5.&:Y)U_U@IY'9ZCKU83)WLH"W8%H@JX0XI +MA:YM=Q.5V>DUDY2^'C(&]<^?C-BJEB57JU\^*P/O2^O!Q/D^K8/9MZF^!>T- +MI?;0EO_E43SG1@_M7=K.I#82=[#GX'OK5]*WH/-W)K,\+C8XKO<0S6F''O^E +M"I<;"1^KL_JLD?:AZJR*@5H,>_D^QXG`WH-X:?G!*B>?GZ[F+S3@/*=ABM,< +M\/-?/L8VDZS/_M*Q9'5@\^?2=Q>Q;B>#;^,<6F;KU/<'G@]-G>*\H-LS81OS +M&^E@?Y$?J7)$WE2RT6>.)8O?\<^:XKRBW^'OG7WJ]ZK?[7L3ICA?*_J>V9YN +M%!7IA/RA=$KQW>E%W[U\P'?KICAM1=^5XXX5[`@[-!V]5M/1$>"#JHOH*,[R +M<[(1Y\K\G=LEGQOUZ$M[GMQRC-<=\"[`Q?4_+V-<9/G\"Q.< +MZ="GGD4P(]X"_?1+U-[L8<]>(MSZD&M/"/7I<,.086!7/V`M\SD8O6=U9)D^ +M8@^NP)Y+]TNQ/WM9.T[7%?3+MMO8*PA&3/>7N*YM96G?)AIG9FWVMX,-`.2_ +M$]#1UV2F>&G[+/H[6]N2GT._O"?2_&T&7:??/_Q1\3#80[`7^S\>+T$K>=[W +M'^5YQ]Z0Q_GEHILXIF]<\U/5FNZ/IH[91-,#'27+*7>/+^@IH;_!?^*[(=!I?_PI=!Z\@;Q]O.875-T$Z/P:5>:_EF=\P'@%]<&@OWZZ)_`O +MN?'\K1+=O]%X_UOZ?:L/3_PGCJ8V$TXH.]Z:3"WAMI>:X,">L^9!A>^,ES@[ +MI3VUE>;;.W!4KBG)M,QO.LEXY#^N?N4!3<^IW3%8,_43G*W`O]?4 +M^]XOCC(]+CY7MA\CI/A)ROFV7HLE;4(\2;*[>$6](W^FYF=#;E,6N$%RD0T] +M"Y_-7!=VCFG[:Y/:>S27<@:1+(\SF$KJ7]QS[5;@F[:]PK@@4_F?5./Z)LO_ +M$YPZ?J?<.HQG^R/*WO?5H\K>EWW^YMJ/_KK/WA?C4+;PF1;8P@6X3MN!1XR+V;5Y. +MH$29?V2\\TN>8]'(SR8H'Q$CYS3`'LK,[4Z7]I#LB-@:;>M:?D5C*ZE[PH!] +M_?S?P?]C-\ZQ6_9`]VXJV5K4=:6%P+O;FG_^C=U-RXDN_3Q/^R?*JV?:6ZAL +MV;9\\@GZC<.&JS?JWO8/@EE$6G8$Y[AL`]$H8INK;(*1F$3WLZ/;<;9(\@-LN?Y!M(;>)T`YW@:- +M*U\XFF+;>%J_O_J-*2HU[Q4+[%PZ:MG.12Q6-FOSB=8:^OIZNC;U]0UT7:*O +MV^@ZI*\]NB[5UYUT'=;7770=T=[\#V1MP5=F'3S/H3(5V<:8DZX<9+7%NSCJF%!K]0#>"#`H/GO%6O,O2#EW!GL^]4?I\/IT<39D9NBUBNBX +MA+SH&#+0PPV!'BY.M/QF0_I1?;[7(=Q/P2^(]@M\5X1==W8T;7^1QG&1D;8M +MO6^XI;#UP7RX).\:;N]M;-M7V$=*L8^\DT]Z?]3\P(RCJ8']`\X>(]SJ:#Z: +M%-^+.>!S;]9[MGQ:T;`OD#`AQZ4*>[;W*ZHG,GQF<_!11=\>6YAT'R?ZZ7_V +M>.J)A?/YK\Z#3?(R>/8[GH`?$UYU;*BVQ)!Q]LB1B +M/X'R#II+*O=+NZVGJ>R901%[R^"('5^\*VKVO-9DGGR-^6_8^L>7S+0&+QD7 +MW5H:L8FZA8"ENV[>P+!/J_)T+MTU\W_6VE/['D$9J+ +MVF:>NR7I3#WU9[SNSX2B_DRDOD`?A?>?-"*QIXVD]8RQV]IB1*);C5E6MY&, +M[C0>M_88\RR,,]"?K@B9EM7N>\OI5\2\5B(B"6&MLZ>^0G"/;;)8OTG\9>6* +ML#VVO7NCE:M>?4N[YX[-[=#7PF6^UA*-__@&X1]=3TH)F5@6MO])]RMH[%OI +M=\YD]H7.O*S+MM/ODQ-`K]9E=NBR7:CG"%E"9;MUV>NH-Q:RVKK,?EUV$/7& +M"%E*96_ILB.H)X4,4]D[NJP']48+&:&R$[H,>]J3HV"'N2X37J#*8O0[9Z20 +M42HKTV7P]7YR.'S.UF5L75:)>I6@V^LRPW392-0;3'A"956Z;#3J#1*RG,IJ +M=-D8U*-U6$%E];K,0;T8?8O*QNNRR:@785_5S)FZ[&S4H[D=3&7GZ++WHQ[A +MUQ`JFTK7$ZAL*-8T>#%:!_4$?\@0\*Q6MS$1;6@;0UR/U_N' +MU'XLD(E]J.IH3@V]+K"RD5<#WT#[#LM/'1YT\%A3#T1\"WV81/A"JTY.H7Z< +M6L>S)E$YGC&O:FW(]&O_>#XY*7NW-26[A-?7RM%J;:-/L#]^K#09J\C-OE14 +M7#@RLN"U)N%KQT5DPX%Z5M>HYG(C:V"L^A8]P_=I9-ZSAV($)M +MA!;&X+=0TG:1\0?:FXV>O4W,1X?GQI@/&?M:4ZS^HN8WZ%WQG3U-91MFM\0J +M+VS!]4$C8J^GOKQ)[:$>OW>+U0CXXQG]65MRXQHP]FFYF6G0MM!W2-:[,VQ; +M],?V/#'8:J;=PT0/1$=]6BRG/V]&^M@PNC=_3\_I3XQ)]P[%\UI7+)>TMV\F +M6E3OBBY<=[MH/U01L>M@0Q2/V`1?R^\FN2-D9`X3'8'<*GO7T/0O1,^R5S.O&ZES_:8(-T6+T\R"-MYO& +MPF=73QTCWC_M!N4[@_(_'TN91>5[@O+'CZ5*BLJW!.5_.)8*47FP#B%+@6ZM +MR.63Q7`3XG$+L`MEPU&:*]<45PF<28%'%$L(IT3(-4*>9=%:,KKHOO+"M%D9 +M$I@/T\-]2)V;?:L^74+WYI`0_%O=$)X-T<]6E5:5XAD1CC#*XT'Y[]T(RE=" +M[TWE*_497/YN-XI[^&8N('CD'W/!PS$.4#EX..J_9>#=SGE62>=2B_/`T'O^ +M]?WKF[I^+]5'_T)4O[2X_A?[UP_I^D+,LM#G,-6/%-=O[:L?UG4Q!HOP%##V +M[\NEZ-H6<]Y1O-^8=U*.M@5C_KB(MP'?`?X;/(Z3WY7>T"+D7W+3&[SVJ(/S +MCVR&>*YU=`U[?OB[O%E6X/>*=7-QXH'\\)D.\?NLF\LOOHGH9X,K.B,,3PE> +MG.03V&&:G1&EDZ4YYOU9\WBB=ZF]M53IU@*[=/A60B?!_AJR@?@-@^"RD/?\ +MXC8%E:/-%9WT2W+.H:/''@RU72ZPNFB>@7T\0:BVEB=D=33/A\5ESYH#Z/)EA@?9EQ +MQ0>!QXXL?0P\24)T9M-BE7"G@&>RJ,_&CJ:X96:X7.!LHMDM[2'Z@%B#O88+ +M6<@JA:Z[I!'?(JXHLXSX5/\=CIV24>!:T'ZNQE#YR'JV+VDOM%6%KR`I:QT.Z-U:NV&6) +MU=6KA?=[M_0FJ@L]/_&)V"M'M_MN22=VN!*:0Z]1K#%<$749!B&"`?0Z%3CO +MI7:XC8J,&P./&?-G*@T_0-'DDZ@ +M][KOR"GR0<=S1Y(B0>N$Y>;^N@;_SLDX/U/Z[O.BCC/J)DC>\?81WK +M?0\I^<_0\82$OL[>,UB=BT&W3W_^G^D]V#1C7=]Q)(68'^QW_!''*=5^M!.A +M!REQG/^B;_8NOH1C3@3?@-UW2+<-W6^:\)3/%JBL9[&R1^)82(@%!SW@MP8[ +M'D(X?'>P@[90YP3)A.9BI1."31WK<.D;Z%\V++B_W*:8:U^QCC[XQ)$D^AF' +MGW6O^PGAYU8.\M/ZA\IOC^=M6/>^ZG>9CU#NLB/>JC]QO;\;(5CJ#G +M):A#<)L,N&U-.KNAKWO@B/:]KK%^_-L^/8S_)=7'@K_WE%#!WYME?Q,^\O=' +M1^`LI0/G3H+[S;[QWA+E&^_-M.$;X$\Y2OLCS=G?+<>FLH+_][VE2A^T_DA! +MAR8S1U)JO2MX`+X!OIA=1Y+0(^07$BX/ZJZI6T+W@/^S6H?7680SGU0XH\Y, +ME2\8]=V&SE$^G'1@_XQK_[=)MLG)]^QJ6JGE7$_KIK=!%W31Y+XS^E4S$X"' +M=";S>2NN_<^?@7,:QL<_4'][LY=8(;87F)>1;R(FPI*,&*OB7?FS!O3)"ULY +MP';%6'#0Q<$&B.ITC!#R)/09=R:= +M8/=E9 +M'.A-YJHUQ'-8$\`+>AQIR25)9WAPCH)X$WR^T]^6B]L;,AFVX\&Y6R.OI[]6 +M+*S9<`WY*-]W_#KBKXQL'^Y +M23L"-`/ZF,17Z&WS[!/HQ]2RGA\8$ +M>NC/[<,IUA'?7^T/XQR5D=G)UB +M'K_\+^;QJ4G.-XOJ\CPN*YK'O=7]<$76!L+;6[4NV+_J7^#CYDD%?K&` +MCVU%^/AR];OBBOSU)-KO]+O`CZ\J_#BYN#S&-'1,TAE*L*H!7:M+LG^6T4GK +M6B8=E+&OH+&GJ:+=<1&C!K:/90/[=]\D:L,IQ%/A>3\^A><=>^!IX78W;/L4 +MW.3OJC6N;FX^I?_K)SEWZ7IQL3LJUNT^=3VLG>1\7]>![V+84WZ9D`FX_U(V +M#NUD/V=W*)654=E@_;MIH4NT9GO3NG:9,8AW[NA1NI,E]!LG?/0UC]T]X'R> +MOWO3).<7^KO@`SJ&"CD2<#P^SODU[)FZ(M;0SB3S"J>,?\DDYT(-,^A7T2_( +M#?*G<3ZOY/5R?%3_]3*KVGF;8/IV0#//U.OE]J+YGT3KY<,*Q[(3U#=]V@,^ +MA6]]N(3+ZTRE`Y)/#'78O@-G%?3]'N);>'^Z?)*#\RNF+1>J->O]Z!UUK@+9 +MYG;51Y3CO<.:SF"O@\R8Y_Z/'#)]<^?U-^G?3A=391DEXHS(?B<>+(%V/B$TWQ&^\W#'`^(]RCBRYA.'NJ_)\F+ +M84?M%'PWY36'V5_@T5S-(B$R+3_/7/DGCY;XF +MG)F'O*@UU8C9@G[/I=]5.%^+"AFC>J:N<^["F"ON'I_QTRD'<;!0![+28*I3 +M@CKAOCKRLKXZ"7QKS3A'>.,M_W_&.2@+T;6\35U/R<&6:P)BT;2:B-M@)Q/R +M&+U_=S2#=T(=81OU[9[=319=FV7H5]+C,ZFQ>^=A'FHALR'F07VR$?'5!G42 +M;TA\HY6373B['DS7@W79(/J+TS7L]LKI.MR>[()\6T'7;L]NQHE\MF8^RWB< +MKW>0`&_72[B6(-P:1GT\";I%/.=PNH;?T@CZO:4TQC$+S#I+^.43'3'I\QFY +MXW!*_*@L(S]\N&`O+^W#_7A?^7>3>=]*7E.T7E^@=TS8I/C-3/?$7.NV!ZB# +M,XO3[1N:)]@K8Y4O7= +MO.7*CC.<.;EQKK()F&E?1N_']/?`IR/VA]$YT^+S:>`6X1)\NT&[IXJD.I^L +M\$?"%U_\+O/=!OXQG+O770PP%[+&TAE5L']B"N"YX@K5$GVE^ +M[8%]EL].=+ZJ^RQ7$`[?/>Z4=CF60YEJ5\66Z6L7;4X!SWVRN^GE`7L$M_^G +MB4XV:'_AZ=LWBOJM_-O[VG_YW?K]NXG.BJ#=ZT_?KE74;O7_MMV?372^$[1[ +MS>G;=8O:W3D`'HO?K=U[)CI^T.ZG3]^N7=3N50/FK_;=VKU]HO.#H-V/GKY= +M6=1NZX!VZ]^MW6]-='X:M#O[].W"ACD;5>WN^?'_$KY+)SJ_#=K]T*GM`L>Q +MGX`>3Q7`=UHW^52!UPOJU8&?H6NL(?]#AH/U-/7[E@V:X*\;PK[O@ZG.NG:A +M9*E299^P_[N0T86*C^T)^WKP`:^.=?Y.?9J6M2RQ]B +M4&'?U6T='-#6E\%SOS#6>87:DF,,I2NL%!+MEIV.7GQVHK-3PV(JU>'X#&TN +MZSVJVZ5;J>(7N:Q]TO*!3.AV3_/]K^+[5.<-:C.$=T#;IPOQ1;&4[?]"-!Z\ +M#QOFK]'?,7S[]V,=_SMO%^+[>5]Y.P5ZJ>@KP;@MW[*3OD-]B_DO"(Y-6"UF +MQZ"3!4W]$/%W\K=CG2]1>Q\B>`]J]YL/$LQ#[6)UB8J1]ID]]/Y]-/9<;MN: +M?N._<"+1N8D\_@=`&\5%MKC[FLO.&G>172T<:W;[^`;0;+-G5U.!;E-Y,=VN +MIOD>.LZUX>-8)V:SCNEBL8SMJ=E.T^NRP3_48RY%S`K=W:5TFR)F^^\(94-) +MXY2?T#@3L@HX`WC/!WZL&^N,HGX*KTS#NHQCF6+/0KV*UK>3WM>5;,6\N8BK +M>B*N<.(#)%7@_;:YO"=,,Z)628`/16U>AV^=*V0*=;^W:Q[L8EG32-,&>W&Y +M:JQS'IZ=#;W;KJ:.%/$CU);"&ZGQQG6K+&%5=B)6H7\9^SUL<#+^W\8ZXMZ+ +M,W*]FL.Z";/9!M@D^`"F9Q%,78+Q61K&@/LV@C%@CGE%63"O0W6=H;H.[D67 +M17S^KE-P7$8G.G/T'(=09X"\R7@0FNA5'$.S=.,?S%/U,95]"[J1_3\H\[GJ*RX +MGOBOL8XW_FWF=_T+)CK7T7-YO^!UZ8U[6\6L:"Y]7-^!#_B.4 +MM&!+LC^73U>,'0"O5R_D7]T\+Y^0D$0]7VAT)8JX+M.&,X@_`@%VM^[7L&\VM,Z\*(^!GH;N4#5(0(D2WH]X^#GZ*YM2?JA*JC4PU-_^4OS)QR6K`A6<;U_ +M7*!Y-]9/GU7C`.[0_1DAX<@OJ7:]7+GC_;',$4-/\G?]=P[UZ>]_?8AU[DP+ +M/6I7;([*#RB?F&KBRWSFYUR.>Z/6S2S"2T/QF"+-]T/HGFD5W9M,HV8QC9I- +M,/0_K6#"NL,_#=;T)]*/_H#.3[FU/YU'V6=*A9#QL0[V+_'70QQ?;%+Q?O47 +M*@MBHF/PG`/]['T7DMSU6E-L\Z%D$),,-FLXMVWMO#J*6,OBNSN:EO>@KFV;RNQ!#?W-G4T0/=Z*LJ]L9U=[IFYZ.6T;F!YF9'DX$<%P>A +MJUFOOY^V)>XK&FRV?RZ%G&YDV! +M(H$/E'QJ@GP8,C3)4T-#KAVCOQ#]0>8?3N\,"6$_F4YSK&)73Z(R7M.+"([? +MJK\4YPGPNT*,9W'K9R_E,X95KS:R+$HP[+>>KYG@[`_TG+#O:UO'-LV@-4:H +M.RI6?K95K&H>"5G=7'E5J[FJ=J1)=`(G7@S/=03/003?4$N,S\?COV]$?&21 +M?+5I.<830SS#VEA)^ZL;KQ)F;&%N=HMY72N1S+T,9V/E0D\L^4RK6+T](:YK +MI;J/$*R;"=;;F[RS&2>S""9F^2@ +MYACV)-S3'F6TU30/PE*$CI2&>VU%AUUM-]BCAC38HRL;[#.&JWG+MA]*2OH3 +MJSR%DQ\^E"H'?T`R8.E`.M4PP7E.P\P;2OQ(58V-O=:K?#OE?>F0.@^[X%^\ +M?_X$Y_'@_;*W.8:"VG=K+;%H5]-B0OMIHPS;BU%[GU7MR6F'E(T]]!(D;^<7 +M76+GZ.\D_?72WPGZXWFF><<\]^"^>)XG37!^I/4I>>@7<1Y!,II_,^CJ32[T +M%4R/B7;@^8G@^8I\J@?/=2S<"SI=@O5VIE\GM>X'^_\)?5T+^ZWHFYJ#>:OF^+GJ676G?@89 +M_&.'U/D68#3\$)\GW(F8)`1WVRNW?XE]YQOUSLSVI(MK_^OURD>;WL4XY15G +M.KFBK]>PNNBLW^C +M5\"?EXUH)\7_.M^GA(?^XWQSA=U/XO[DGY3 +MQ7F1;VA=-_K.!67NK11R)1Q&K"SV@5K7\E7$7&0?!L*]('8,\'C[>.<1 +MC<=Q;U=47EI*\E*DP;^NU(F3W#,"NE7J:RXO,O#K0']'4'E5%^U[7L2M)EI8 +MDE-[_(8Z(4W"79+5^\>HP7>>&>]LT]_9?+KG3X\O^-:#[]V_U11GA)0_UL"Z +M\B_CG>U!W:ZP=6XNV8"^'#1@GT#R&6)RTOUANJF<*\WB.)<]6U[0] +M6_X471ZJL?ZA8XUB[36PC9#%NA++6VK;[:++@RT[78,7$LZ$C&RM.79M#]; +MUD&Z/TC/85X$/C[SH"E@[\]V/T]/4K;^HKL9847!+]UF1&V94&-@OZIE[\M'73FLWGE??KP+WV1_**ZC+NS[Y1!UC?%4C)YMFR-I/#-JK"DZAH$Q +M0MV?%=S#_H/@L^`^=?_.PC^GH8/G,P)8`1&_'6V7'L>I+R&YMA0Q]J/,']"O +M[>EK^N7Q#R/YR>^.,L'7`YR#)/IF5M^RKP%\WTA#S;1D1O"[7X6XY,G +MQCC--)Z/6TGKT]8LZQAB3[)%/,(?WHK";POKL-Q?^%S^$%51_Q5 +M^7A?!;FV;6%FQG=A7\@VU9ESZ9IMOT/3K1_?S^5-9KFR4<4<1Z/*KI7K")/' +MI6(:FG:HZ)ZN;:OHGJ[M>-$]7=NP-06O\$7=GD?7?&8LA>2R!'U7&(5WZ)IX +M0*/HFP9]TRCZID'?-(J^:=`WC:)O&K9==&\C%F71/5T3+]EW3]>V++JG:[N^ +MZ)ZN;:?HGJ[M247W=*W&>(!H5[MH'$K7Y51>TN89C5]5_/4M9RC^^HUS#IWS +MRCD[SMGUYWWG/'?.B^?0O[^ROQO'68KJ^L3]2' +MZFGY>T4P\@A&1?=T;5M%]W1MQXONZ=JVB^[IVJXLNJ=K.U%T3]=V==$]7=L% +M'QGW+>6OR?X-C[!M`\N6UY6KN,*@-5Z$94JV14%,*;;'(%Z8>'6;9<&(+3-O +MJ?/1N6\EV2>"UN:1GQ;9@$QZB^-5NK`3(_K!?EF??SMUDO9]WF>(=X(M/]OM +MV[#;[[:N*JHKKRZJ6ZB#/?S5IK(*T1CS2AHM@C_L#V*TSU10I4'&#-NG_A3B +M6HY[2]GT87_\WB@'9TN%<_&3.*_&6=BF9KF78$*T+(C[=Q-R-.U\B\^\_,@9 +M*J8SQW66C?ZR,J9WK%<[EJ=O[=HH#FUMAD[HF9=-SF$0TK'BS14$T[7*;\S_ +M".S^YO:UX_6U8Q[/)_TMJ@_8,\L@F\P?H_9HPE/O'V^E_%O&.(%OF#A(/?.J +M'4GES*=,?XOE-G$CS=UCPN"8\3I^?SW-B7S?$#X_X?D_<3`ESWF;_<40:W51 +M2,E9]L]AJT?][IU)<_!X'G:!=&^+WKL)?M3"N),O[^_H/: +MAP>\K&`_,/_>MU*<#P6^S=$LA$[#9N6.MC^SFVIAI],O73S +M2TC&^G"9UK].5G&/"9S6^EG,__ICQCN?UF>E(6U/`#[4?R6?HC:MW@`7:*RX +M'E?GL9UT4$^N4?/'@O>89_@>N'F2>Z2MZKGV)-\XZU"K%/YV$&=AZ3/ +M/@DYJ7".E<_?G88N`S@GA<8YR"HQ=9;)Y\QG*=PKQE6#U[L@F5T4>,"0Y@'A +M_]]Q6-F;B#;BK0@^Z!^OJX,'^WQ='Z!^74Y\&OI$>]D6^.@C?FX)=*'Y3-<_ +M3.P61+*S-MN<8M^[L<3^5A3R7ITK5OF)$,G!R\O@8[%CH^A=*[I>0GR_.@\Y +M?<2JS2[\!3IR<]V.W$*7XX1%2NP2^*5V=F^T<]-6(P]0::@Y4]E>ZXK5;@)V +M*V@_#K_4MVF/I?HF_/LJ!'0SEOSCP60A_M%MU/_/OL5K(]$YTS(6*/D`^_%* +MV.!VU4*^=D5'UB;Y@^U85U,YQ_H6-$X3>UNM%3*QA]5:MHF]J]:JI%^V#;GR +MK53"3-O>+PXJN>N[!U.<9^SC;ZFX[$*V8+U`=W(L>XE=#QTXX2F^T4/WP\,1 +M6@_$]U:(JN-T#WS$'&;9GB7"_@K5:R.T5T3L2OKEF!DTER,[-T9Q[C^X240!?_^8.I?#[?[./LC>.\/);V#\14/$VB;?X=><[Y4](; +M%M6_)7S\ACKGR)_8S?DG:=VXP?R$0A(Q1=P0$#K;W;0,L>36[&H6L8TC0>_+ +M"+?EDH,S#"=_6D.HJ]4*5>TUQ))9C1SO"_+Z;==\[B*"S81.SYZPQ*-I2CIB +MG,RP;KAJ69IA))8H?VO0K9*D$^[*Q@A*&3$._FU4AYXCQHFHD%4A^(I>3_@[ +MAL9,^UD\MV>C\-O<4%=SC&2E1O9?)]YM)6+P;YC=$*JZ2(AQ1B/'_Z(Q^]!! +MF4:C/TWE96*<;.BCG[3_Q["6AR^Q:/Q63/EY=X]D.Y"70@[V:O#@_]0RRH;* +MD8Y)\YC7=C_(S01>UY\#&\OI&<[O0Q-?#5I9V\TV!3C?L;IT:WPUJ-GP'/H$[T_5*LS#)H'64_?N*/&D_]UD.DD:-GPL-8; +M5HB$E#1&K\;C/>(#!U.7PX8CD'L@?W34.=E<#>',PI;[L!=*ZS*L/=CF8D_@ +M7#QMTUN0#P>^MH5<%&TUGTEP')_IGV&=(,FTV!M!CTMR^19QX7!'?)+^?AK/ +MR(=*E%V)$^,S+-Y/B3[C/-L?.IC@N8[W$G&2]O'#>6&0W!KKZ5[:";ATZMQ: +MT.>NMSC/51D]*\&S9]1]7-][&]6]%3RW8GP_A.X7`??]6?90/,/Z[>2S3)6' +MY<9W,[PPKO6GQ^;0(?OEGA&#\JX_X/PG/@L([= +MS_KN+X>5+MN?:7MS(MQ.1="_K6&^+\(R?6?<<<_2C0)[>DV +M_0O[VNR@]SWDFUB#[_HM\(^7K^=2@:T??@&;@@V54#E[Q/[Z=U[M6_O0V^F"OP;^`&BOR[/\\9F3^>P,+LBM)8W1I4\L-1F +M'H-XHK3A()X7P\+L4+%VD*_%P#5L^9 +M-U4_[GZ38^6P_>9U!UF7>176&NLR50Z*T"B#XU<(^@U1.>Y#:X3M?9'JGTES +M\R?5EK?VS91W#>WO+7D5*^%S!Q5O]4?]K5O?3"G;^XPZ2\RY;F4G?:<3.F;) +M>R-L.`TJ0USD"JV[DZ\F8?_J>NBC8S@>EC[M>)7 +MWJ_:\\\_F<*YU=1W.P_[[Z13J=N;>CO)>"L'.[,1Q_TT=>7\I#,BB(NV_LU" +MC%ZO'?WM;KXS-[?CE/Y>DW1NUC'`XUZ$[9"N9'IYRAE_`_:0'Q#MQ/GY-$/; +M'.5J6HP/"`D=:'@J\,VQ_*=J'9Q!RIJ3*8Y]4'1.W!$5$N]"-T^K00;GK7S. +MVP9Y@_XE3J;\+]$X%VK]V)D#QOG1I'._[C/.F,VQ:#.)]=%TTQCTP>+VS6'* +MCOZF<4*>6Q/AK9,I7@^P=T\P36CF +MYS^M=?[([SJ6_(D:HV^>3.&\<1K\!&%WB#A)D".'*KSU/UXTCF$#QG%^TOF[ +M'D?H-+87\KRD\YQ^[A_IY=C40;\C&EX0NL6AWI1_4=%WK`'M3$XZ.XOA57QN +M#WMMPMDW\9SP\@L8TW=J.7^C_RG"(>+_>"\^[TW-;W0WRT\1'T@R&V@#YRX! +MC20^"+PK<,Q?#1T%L6&.TOU=_I*R0>@8!QY]6_/UA$-A'2O`K!>RE/I4.@;/ +MU'F=W6ZY\@\CG!CBBF(\-<0OWGF)C3AALJ/6N0M]O?@MSE,BO5H'Y:T!/A;! +ML/<'>NP):C?N):UKX0>KZ4<5\32@'ZTU\,VMY3RBW4^;8C[\_%?+ +MA+\AX7RQ:Z8%7@F^VLN)?LPG7*LDWD@^U9MR/.1O[&Z>3]^7Y<)A7SN2@^&[ +M`MN.#3\U'5/G1;&.]3\CE<1+S-%S5AQ;BOO]SCAGA^ZW_*B*.\1RW/O>+,B7 +M_N$W:![<#.=\IF\$<5/Q/KYW'FV`_H%Q?6>G^`YTK_I\[X)0"Y^QR=`&RX3_ +M`7*Q=#43W[!]J9MK:9T!V3?<8&_*MV3P*U8U)^KUO@MY"SEK8'?'N4'I;V'> +MR(3;#0\QD)''9AS\A6[LGK=ED+(!\')&JQ0-*G]#1281^.69R#N%L[P(X5N' +M4'$K7WNC$*],T=!QEM]0Z]R`=;ENM\J72N.]"C$3B^G9W\8Y8[5-;W!FOQAV +M9>O>5+;1ZBS?1CO^U%KG;*I;2OO`]^_'-V;R&O:C:@V'E"V`SCMF"N])HDNW +MO:GT/S0>M"&GU#I5N>FW(18:S0?G4>,]XK$W4H&O@S^QUAF#?B-/7$XT`H]V +MY+9E*XAOE$ZM\QL\@YZB(NE\`N]Y(RA>.JWUO]QO)7^$[8VJ=L?0,\PH[ +MXUO_*$ZQV6>[XA^/<\:U%V)X-MZ:=2M%5N4%[GCYC:3_%<'VY&*K;C=1ZYSU +MOVGWKG'.V4&[7SN9.ET=Z8]SSAWX[;^]H_/$9_OSR" +M?W1[!-4>?4/IM=:^H?-6B,8\9&^B-SRN"R.617N5Q3XTLE6(-X1_3#ICTPW>J!7[#6-1W+)[E]Y9_# +M;:-=?[]TB*:TRLUO],7Z[SH-7N^6I\'KFOYX??TXQVCOP^NX]B/V)ZCX@HS/ +MKT@GUMZ'SP6\_6_8C2C"=9*Q4#^X+/CG,KVP`=B +M6[/\;A^.RZ^_H>R=:0^%?3/;&_1&M$]D)E:=>SS-YWQKES607(Q8J7I.IF=P +MGNA'1C@M@J(<\@V2A&[\K7 +M1S@AQM\:E5=T+^T;=&^&)E@X?V89>*3ED%R=$4S[\LU7O6R*!,[7UM)>+P[J +MG*W;FLNA3Y2S;$FP(7H?2T"OU"Y].<9?C^CVT]N^^*!/$LN4\@W=%Z=JM +M$F/W-,7!6]YEL8\X[*$1ZY;H7-6*=_K\#@3B=7UPG/,W?0[O?SS">.5__8T^ +M^\;_>"/E3QW.>N1X3S@S@VB%.7`]GCW.*==KS=)GNZ'3G`'[D\P2T]^`W69+ANTV +MRRRBW8M8=Z'W_6J<6]Y[[V7Q=K=A->'F%=YL.P;?TA^-<%KA,T(R_U5LYQ2U +MZNZ=;8MV48GY;.6R"/O#J;*:SUS+WXC#]JOR`OA*K3R1$O51%4?%67Z9F#"K +M4C0<3($O-\]1?,E\O#,#.0])%A4UUO6XAS=V">V;$W&NJ9_1]X-RTRDNC_25 +MPV9N1M*2UTIG`=;FDA.L.T-=(39%;W@)^19HM_-W-6!>KK^/YNK[-.:AYR/Y:2K+]PH6`[VE+8HQ;S#6^.==Z?4WXE7KMH +MQ7/PC1+U".:^7:[MCAUK74[9<"%F#/>+>"/#F^N)S8+C#1`UJU1CDI;\J'26 +M0._"]<:?4D]RO.IU+<%9/MMQO4M=\)D,D]G2^3CUE>''\BG-R0RV!6\RGR1\ +M_0OL%O8U97]8YR`VL=\@G7FHCWF=0.U4*)HO7CK`N0^J;"GS!Y(L^^8.D)SS6'1(B.79)OB32:M"ZUKIVV?7.E-P'G>YVI-@ +MHSN$UGG%8MU'XNO64_\KLK-LZ.5"WMW1`/Z7PS]^TUCGS>)\<(\>2)V94S'5 +M[N$<.-,S5R!>X=*:0HXWG`%ARJ3167^0E567USO1E7F +M%-=;H,J\EP\H/?9/#J2LH"]_(=Q&;!:JYP7QW1X;P?'=4.?/U,8-N9FNJ9_) +MWZMG[-M$[[71LR'!>YO4,_#Z-[S">K@,QEI:1)?`(PZ,B<9G*]3>V3@#H>NK +M%Z;=X/XJNC8Y[RZU_S/5/NQLZ^C9:OKV:L3&+<0WGIMYXDF5ZP=]:Z%G=P45;2'>!S_5\&J1N<9Z@#\+E-EHW59)^HU +MJK(Z7;8$]2Y19;6ZK`OU/JS*3%VV'/5FJ[(27;82]69J/$`,FE5%M=EWT*]_U!EY;KL%M2;ILHJ=-FMJ/N]79;8N6X-Z +MYVI\N4W#[(L'E&\V]L;%&F9/F2):_+TS=?]C-1;RV=ZMX],CCG[0!SXG'M]_ +MG.B#/TZ5E1;U0=:KLC)=MA;U:ON/_0[4J^D_=A_UJE590I=M0+VJFD*\T/!W +M5;S0NU`^HJ\\E%7E]Z"\LJ^\5)??B_+!?>7&-TENI/+[4%[15R[6TS8$&T_D +M8:[K*W=U^6VYOGX/+YZ?TJ#NW,S%.EZ\N$7'BS?5,_^&`P5?:O_\/EQ&/;PW +M&^_AS+!WM&Y+K7'@D$UU]^`[@_K#\6[T_QU=_Y-ZSB<<4#J;66\"8H&#Z*UY7\S7\@)!GPY,]>W!N0> +M];WQN@\'T:_71O=;4^^@WJNJ[+P@1C?!SN]69>_7996`YRNJ;*XN&XYZ+XWN +MAQN\SEX8W6\-\#I[;G2_=;L3]9Y194E=M@OU_J[*'%T&6,J_J;(@?]DAU'M2 +ME8W598=1[\^J;+`N`[WU'U=E#;JL!_7^J,HNT&6]J/>H*I.ZS,1X-ZNRST87\''S +M7S4^OD2L$/#Q\;YG_?*RW:_+ARA\\%_?G^IBVI%O]KXO!/*Z!#1WCL[!@K4M +M[U;O!?&1$0<3N3INN]&SQ4*<-PN.:WENCXZ/C+YL$**5:0C1E9_K]W7\SS#R +MIK2!7R?LM$4"ZTYBG`^,+M!44;%Y)/)YEL'&.T_T'_0#X_YAT=KYDRDVZV>< +M9^">/GAZ`;WYOBIS<[H>OG.G*O-R1>WZ_=?D9GK6&;1[^VA-LQ1,0)O\1:KL +M$BIS`[IT6Q_<;=I;_T/7E^UZ_&_O3W8%].$7^U-W@>>[;[3.#Z?@?E<^[)Z) +M/OUFM+(%*>2VV,;R;R&?*LW%'JJ+/',,7ZJ;:(M4UIU-,'UV?_(9>@8_6?\G +M?<\$K`R*8D=5$]]N]H9=Y*OF?MZGO_G4?D4OUNU/\9R3S!C*&TRC_(VJ3B!? +M#2(9)?K8?A5#^R'%KT0(#Y8=1VS;L(><51FM<\ZE$_^;CFLLA +MR[2MRW`.RC:5=YC/H-KK8+G%_OJKC+0=WYRQ+'K'R*EVA%MC3=7VD-";X3EH +M+.J8NL[*4D/)MB7J.?&=+IZ+7J,5.=]1YR9=!^>QZ*_51<\MH;ZA8W^K[RN_ +MNMY3XD?Y%)>#+I55<^[ +MYW!*',^GY*<.\WF8,$8YWK?4'(IY^[G>,S0WT$!_UA!U+AW#;H$EODCPZFIC)/K?1,JZ-+(<^J +MF``3/M<@)BQ/BTDS[8+?]+'1SE3H&R;:\4_1M9]?#YEG)&J=[?F:]4Z;;@(VJ07*>[%&ZYB?P&QE0WZEW1NKZ +M5D__."7\O+[>>5U_;R3G.I^;@2Z/?8()!L@]+T2ZDOF"=OS.K80=<`W&J/V% +MSC)FV0S/]KGV!2I^/\?$XYA'5-:`,L2INM]D_PW4]4W#D=0&X'!SR:S*6THC +MUE2L8X]DVLXHQP"0]AA'U%]#,L%^92/8L[NI]G-QS@DA=^QGV=N;J?'0WL\^ +M4XR#GLY;_X'];#>^1:]3\_W[>:]YB.;4[RDOY("`75-@1\[Z%/@X&?4%'3NW +M/Q1X%<2/6-\LEJ1;A%77XO]UO\8QT0_'"OAUN<(O45U3>2[Z4553";IA+-C; +MQ+GF0?\1CZ$ZF1%K9F80C]:_YRB-[1XUWCEZO']0,/#J-:T]_+K&\\W-GP'^ +M?F*TLED,Z"-\(DVVQ7;3F1Z@VY.[74\A+CS%#MR\Z-[OG +MA<984\T+[/?3KU\NG/-P+2ZP42XO&>TJ4W6>TF'HAV6**LNRG&]M/*)FP<[+@@Q[L0]C6N2?_ +MKFV./TV;<6XSS>UQ7+$![8D36E;_\^G'^'X:UU2,<5<^A3%.U6/TIXQVCL&^ +MY>#KVH]"]0?V;IG2!HOS,'`N'.E.64H[Y%)1R,$@2E7.7M!A-98:]4W3=?F, +M0J3M#]'?^?3'-GCP]X$MNFFX$\+8YZ0;!T]T4K51C;,;_7VKL]9J)(0/YUSO +MVH5UKNAT:1RUEME1)^H[TC:N47\$='M4%[YI0W3YY:*%ZJ4%]'A#.*>JP7YJ +M''\",'H(,)(>TTFB>0K^$<0=;/A0:+8U+=1JB;#!/-N/<,:7W=X$G>XRPO'[ +M^]/*?[Z>?']H3_2\4&ML:J@KIL8[F\8[V_9)3H^T&UY&;+3$N'O2YMUU +M`C&JA=>]T!76OD%VYM,DOGSO,_K]?+# +M?>Q#(=;M;>J`O?`/Z!=[972'LH^XHTZ(1?N:EE<(Z2$^S>)]33'\QM4[1EC7 +MQ3M+MRN]'.H?(]ZQ1%W'0$=-]2[B_;,O$_&JDO/>S6U!^7)=SGVA=U;2^R:> +MC=T[#]_`&H'>F7:CB%CGA1S+9!/N&CMTE/;T.U]/AG.>![Z*YP]Y +M'KL\=UJH#CE@/.%)=YK98(MPUIUBU"&'GCNEQ+2ORM;R]56+#+M57[?2]7RO +MV1*=M8+MXCK3!?^",)^'S.5OB%#&_<%B9>O^@VQ:Y6@(21>VS#R.K+"O,OIL +MX>EZP/O"W<#Q0Z5[I3#8YS&$8HXG2/0-NA[HR\5F\`(M@T/S",/U/)O]E.58(:%?%+G9]A!S%I^-[#PZX)P8]J%BNK7VYY#G86.?H6]':*Z( +M5L%>)2QXC0/F/:#OMY_!]-T;J>SO@O9=&I.TDL1#4C]A'[L:[22M]2'4 +MMN';@N9\"3TW31LQZ6^C[S*NT_/$:9[?PO-#ZPAEH087]K6`-^:N^RAR@V5H +M;FKU.P;GCQ,X"Z,KY?[!&#&4WA/[YOU#GW_Z7U*\WZ_6DXF6G +M6YW0T7=)*_#W\#B_P73&&:SOC=^L23R0]=CVR*)Y?^"D9^\>)$1O7N%9)O`_ +M+B,<6IM+R=PAMH%DVWG$IKP1=/O;)1;)HU?`9/0B]C=HA.]]W.!U[WA37D_* +M/8[MDV/-/7333[IQ`=>>''/93'?]Z +MTOMBR`$OE$V^GIR*&*%>KBD\[O7DN=HVJ*/^]:1_[4B5?Y'C<-78MV'/0'X, +MQ!!.Y5-3LS-MK^9UQ8>\O4_E";M:OP-=%_B9[KAS8V[Z;2>!?U=,;>8!STBPA&B9_/S[%_AW9L"U'OYY,!&>C+^]+>=$#ZFP9^=,J +M5-NE$64;@C8KD$.5UX!,5&27V-8RU2[;%SR63_GW#'(0XQ9]QG/OKR37G-R7 +M#'RRV!Z:]@;$U:T6K@4_[7I3Y3X:@92N^A[['^ZQ!]+W^NV!XBF"J^91AG42SFQ/YA;2_K7(3HGQ[4YSHV#B+Z-=2P@/:1\W..O;3@Q]ZHS?& +M@@UAO3E#S7_HU/GG\TV];UK$G_M*\Z3V?/!L?AHR#]-02_N34-UQJY?8 +M_M81?"9V'OPK.FL\,5C%V1C?.8YXDNU-'X9Y&O%@LDW-X7E4WNA%^O$9_EWJ +MF5RN?M_O4?UV77;3ON14[0LD/K./;2)Z08\>JU:V9W]+!+D#F6;)BQ7-XK@& +MH`7P6;D];&.M6_EQKAQY/(7\8$+3RD?8[GA;LY4=9^'\#?%`0(/B.<+!T:XM +M;]R75#X*-5;\J**AY_Y,T3=U%CG7QKX-'=E]][.<-L_D^';3K=5$:_VB/`#, +MSR/F9BY?H/W>['TIV$0,7Q*Q$.\-=>+MW1M%;[4+WP.29HG!<*U(9T3YJA#7 +M!5]%$2*9L7II\^3;9L)G89D\)ITSZ5I4RTRUML_$7C+!].S!)!/#[O'(0C># +MN'IF%^VEBXC?#AF95>`Q2G4L$>JKU6ZT#B9XQ[1/"/(7>SIF&MH=OB1IP=G9 +M_\;QE%@E$]A;+<"%QE6^6B3@QRR_DN/]URJ=Q?V>Q#DDFEU\U_[EGN#X&QB?T6XT^I?L2TY"C,%%*A;F0:)O943C>^DW&L:]:`RU"1?^ +M3,@%)L<)60$X8\]UZ!KUDK3?C%%MPOZAC+Z/G#"(5VX-?'\T\5CT?IVN-T77 +MJVN7C34YT<4Y!$V1D,0O#:-ZY^IZKJYW[L#V*H4\@^I=I>NMU/6N&EAOD)"U +M5.^;NM[_Z'K?'%B/:/LDJO<]7>]V7>][`_M7BKA+PEVOX?5]#:_U`]H[B_$W +M7;"]Z!=?Y'F22X#CVI;9?V-O:F5.Q>KZ;(BXZX]7.Z6(JP";!,+[_UXL^N*X +M4UO_G472[CM=Y0Z[)=Q8W=3/D]<'G#C +MCMV7>M=3N=C<[!]4<0W`]Z0-G1M\S6/-Z(><6>T,RCFNK?4R^&ZEOH:O*^KX +MZ6J.9+_L/75_L[T?NVMXOZW[E/T5@%6^85Y<&]?39H +M?]B;^FUN4P-H[N48SPCXYTQP_07[4CQO+-MO:@[]2/%PO#>W>2TBG\N7P7_J +MCFH79RS68Z:(]NQN$J5N;`/V^[NON2Q&>SCRB\,N&?22VR_#?$UPO9_`IM]M +M^2C@$"4Z7S^>]OYH(^S.RC'FT0H7B#]KP7Q]`[ZK;1-:@;:B(IKPP\QOMU)9 +M)I_/YU"&>*74%ZICF%Z)QJ73/J].QE-BX5^'+;X8YWH3ACEQQ+`4=O??C$ZE+,9XW1S%/V`4[V$\SOVC>)QQDML['MRKXG']O=8Y"3WJ3_>RO:/\N;)WG#U9V3O^[8DG +MGMCT^Z?I?RW?+MR;6LLQJ+N;Y8Y1SA68TPOW<=YR-4=I&D.M&D-N\[(PS]$T +M%WQ):+%//%,ZDQ?YO)4;1_*B;)4NO4MR^\?8_D_U^^/H]W.JWTTH?W84KU'8 +MB75\=R_;CB$1->SG62?\'>J[CF=DYN9F1A*O-(CXZFKBF1=2^2@JKZ/K,?3G +MT+/)]'Y^N"WIVGHY_)"[;FP)?)7^$6*?YU)R%IAN!349)@\KM8-;8 +M=\%.<,'>Y,U&@\HC\)&]2G9;FV=9#>]VD?PEKSB9NIEDMCG(F7&\5YU__)GF +M_RM[DYI7:BQE'47&;=P(7-V4P=[>E]//-BVP&LM +MO](EP<4.=1DDOF=I?%D8UM$6G+4KZ3=&]#O04\"/!3G]!'&4@`GZ-Y]D6JO+ +MM*ZCWQ#]7D^OQ^DYZ#/P^*OT6TGE7]/W-]"O3?=?I]\$U5L`F9CNV^BWFG[; +MJ;R>RA?J^A[]3J+RK+Y']QRZ!ZP7936LDWM3V%LNR&W*%I\]K,3YQ>A:MM\/ +M5^9BGG]X;W)XKIR9*U3KNMRN]5[4_Y'7D]=1>T.C$D)&S]]KZ>@%R@9^)TCTJDK?$?YY@2^-]@S_@,Q +MU`&CY-ZDO+:7\5C^YPC>?]$?/]^;@OTCQQ]8K\?YR!G.!;JOP"?8[?#^[GMV +MD-\*.;F]AP+W@>]"'&I\:YHB8TO&<&O]/.O^IQXOW36KS;PM%!FW@'.D$ +M7=>`=X0OQ(/E'`/=?Z?"8;MAG%]T]J9@_^;]3]3QOX8SH6A&UBI]*.RKI](X +M8$L<\!,\'^\?Y5Q+W\0SCNT]'>QC7)SVKV@$>2\"7RB93&>#NS]8Q2$GV^Z7,/_FJ@CG3S;$LEDGOVIO*=R*?]Y%:O>'][+OJ/B +MSWI,_IY4ENXWY+9E_=)1S@=ATTU]F!"H;5B:GY+1$TG.#?UZM]6?!AT +M2^-"G+=H)>WM:$_V5CD7<5N;HH<1G^U8V)'#5']D3-$`[S=[DM[F?=P&QV=Z +M1%U##^E].N)XOZ#G#^UC793Y\SU)\;"N^[,]27S#?[/*F8=O_":GRA_0Y?NK +MG"_`]KHSS/FA_PD:>+^&^T*"^X/[V"\C^P-=?U>5\VANNH=Y>(;6I+PYYH1H +M[ZG/0NE_ZPL^*;0A+SB:\M:K-L6"/;Q6)?9QG#W^<%\JLD#YZHI9 +M(2?@>74\6?N_``."TSVL[UR8@?VLN5(V[=DXR3/.NO +MMQAVJ(\^F=FL+5\\JG#@C)&.LI.IR0P!_MQ,,&OGF!T923!XNE3%FC!H+WG: +MT/G&(:?`M@XL4*4^CVO9DXH`'AC3[ZN<_];G[`$-C,"F2,?`B`H5`R,^P`:> +MZ>\EDG!>^3`P#2,96)WCT+N!O_#`=3I3.F7Z'>8)GE7QG(0WTT)=*Q=Q_9>P +MEFK=:EP3C-V%2;Y&F=@RV$'N':[W'*T_R/A!/$J"S330S+>J'(=XIX`V=I23 +M3$O7GR8:Y[+.::9=3WT%W>.^$A_+-O[$KYX@!AK@ZXOUBGP\B=NO&KBYY-Q1Y>`EVH>C:IZ-D,>A:'K1'-;6N'&A_\ +MQ7E\/X`OF2=>4K$%:IER*2UT%F;$,L]U^C9/N_\4)U5A_QU(=<:1&V$<#9'[7#./.AH.`\FO8.8 +MYB&:L0[717QSCG5QFVP5,8//.#X._IG&SGVZLTIF:*Q,@_;O3GEC%,TR$WN2 +M\JH3BG\8H^(UR/DYIM%^5U[GZU+Q'T?JF,HCL<\0C4YA[_A'+N4-TK1\YV[6 +M*3RK5+1SSHMP\N+JIR)X--H#YN!?LVJTTOK;G9@-T9_Z*]AVN<94',S87"A=^`BH5AL?[.Q[H%?A)?Y>^/L,XUKO4` +MG"]E@W.9_&O4$7?.L@?R2]S^3VJ<;P4Y>FC-Q#>$;9Q=3@HY?>>7X!&QWCS1 +M.$FHQ?VW=G;P1SRJK".;C79D,*7__%W;#+JAI +M8!_D^II"7%'VM_H\;%(XO]I=W)(H#->MUO[T6U3"\LS"GR^=ZB?%).&>\- +M-"`/IC&TKX^?/2H\A]>0W.] +M;K>B:]?M9EI\UR_HNW?O386(IX#\`?ZK$_05>I$;.7:7"=Y+/".9WX+M1`KK +M]^\CV1\5.*3RG]8HW[+6=U+>ZMU)U/&?'.E,!E_T25H[J_1W/TW?_?;>5$SK +M68)]NU\,JQ)M$Z:?IW]PDOU6I#=<\=Z-U%Z':L__Q&[V4?"Z]K+^C7G#I7M3 +MY@!\8GH]I\;9J&'V#/KWJY'./3KF>09YA$,1ML6;\`3A/72@[:I-Q"1E6T*" +M@[^IAVFAUW:28UZ8`[[A3Z]Q'@C6XX)1BF^^G60&^!Z1S,#Y!*\=PSY8WLLD +M^]E$QT\J/2G.J]6Y:'?3$@)F[Z)RVWMDI*/CJS25&D4RQSB"`<&<^?5=/4HW +M@7/2D/*#PWHJHS*6#:D/9:#KQX:Q?:U<>#(%7QG`0-XVTGD,N=JNW5WP+_#. +MH7WATVJ.&)[_1?AQ.GC6U3A_U6-]%O!<-9+]&N6'AQ?.;NZA_=D,J7UNPY^& +ML2^\_.A>["LMC`,/XRDU#C^B[((Y9A_1\K4_I3;NJ%9GK8>V-K,>;FW$ +ME1>-4/;-HW>G10YT5=D-WC.O&V[4_(_3JIX(G-/LK^L3V6\;BY4 +M.:7\3A677E0C_Q;-\R=5/1[75T8Z>S'.]^].WV14=]-?5[.47 +M=KABQ?:FBD[7K5BRH5$LEHF.$_EDI/V1K`AMWRB^(AK-TNWS(NW"J_ODGI09 +MJG7-ZLUI@1A]M;O[[%O?WI425PE%:\[8G:T<17(#? +MX,%(M@N-$K8UBO9U_%4I':Q/,#'XOL:^@=:)-U2M/;EOEXYOEV&*-!+%O%FUO +M6G9"Z3[0/U$RRQY$[]>(M#T:\WV=<,/00^RJY;@[0[Z:^[.+[%'M@O``=OW9-*$)_T-'UK#WR6":9[ +MV7=Y4S-\EQEW/F4[^_%-[7OL?\)V#N$>>]T5MNH/P:6#QAFT*[N$,QC^:?E= +M?7$"_[(K=7W1M^72?_]M.:?_M^7%?=_V9P??KFEAG^:0VH?E9$O[TIBO/X?E:Z)UX:O<`WSFXA'_L2F?1#GT6?9OBFQ;5NYB&N_?()B^>"?RJ1)MFP]^%_EWY6SU +M3*PR'=9]X$P:^+DX;"7T.2_Z?R:"+1,?!I[+?T@H^]Q;3RA:LSF?\BY3]$?^ +M8%=2\#XZ/3.-^K(S3_UKL@KQ0.6J7:DYQ;$DH0=^7-OKA(R6/;3&XKB^8_>E +M^['>,)?M:9O/3.HONJPT%W/%VJ0KH7<8G6X$;V!X%]N(_56&"6=,<57'2*Y7U_#EQCRL/]2I7.0 +M<"=,_>>\'V4C'8O6!L>KFU?K[-%K'GL"RN1G:QW$P6:9!GO7'_*I`"=*-EQL +MD@F.@Q\WA'TQ]D-!I/W?/P*^D>:>3F +M-8BU407/CZDQ#]+P9/]8[$?(F]:I;97`@ST+F6WO2,:K;^Q*SBGX^A/>?QC[ +MGM\<[(/@%:"[0UP4\#\2.KR]Q]4>?]4NQ4==!!SU6B#;8/[%DD>:A8X1['_! +MU#&"_>8@GP;6.G"F%&G?9_ +M_#;[S5>+:V*`T91(Z/T2_. +M$Y`/]>,H(_[Z,K&,8Q=_`#[JB%'QW;?56&D\4U&?GL_V+F)YY2+ZO7C#1?:' +MJ1\X]Y5/T)Y*-(5IXOM*U7J=N8MM^;%7T3^UID?LTG%!NGG]^(LJ.1]7L*]4 +M+HRX_LF(LC%9MUO)++1WJ+4\3:UE&AOUO?5,R+W@YP8'^XNB5:C+>+UFFCO: +M<]4^I7.OR"\>3]7ANC1IJ7UNFCN&[OV%EUF.V7&D&_ +M*H:J\VX$#^0S*NA[)JAX,"P+OJCB/WIGT)H93C"D=T\W?OD_I0Y@X`W>Q3HC +MY-85[Q_M>(/H_N-YEO-OZE6Q7'K_KLXV%YZKSC9WOO[ZZQ45A+F7$>V+[DIZ +MHX3C6;NXKO,/57>YKGO@Z'%#?)#JA:C=D,)[_Z77]#QN[LM;_C^'4X=U[-]* +MEJU5WG+DLT#<:>@5APOX4!$=ZA+6Z?*7\[Y[VVZ5PYQH?/PWR/,]N1\M'X-D +M`#JWN3_H';:/]$L5W&$O5*GW$.B"BO<3[P^OI0K\2P&G'DJ#+Q#$E\IGM$RQ +MJLKQIU0ZB`?'^/A#A8_>1+7_L(WC@1,I[]>&`WG>_UI>\_LRZ\E86^$&*/0\Z(?L(,3BVNM@.U?YS]JX]IKGNNDUSO/A?1![B?P,\NCY>89WRS3$ +MXT4."V\BRZ.(J0)_)>#@TRS_CW`:0"OH1>\C@VDLU\;81F(I90L5V$Z1O(\+AK=C5;(ADK:?\\K>?[+=;_ +MT;X#?Z?>?#/QO7%'W+N<:-4@9=-\Q\9FL>&)9JQUY+N/BZ4Q83T>ZPWX^*^6 +M.XC9@S;%G7OF(=8M8J7RV5%N4PML&F/ZVW$1L +M3YZD:]BL&'OS2=BB94D^\?="#[.KF6,Y5W6GF=_;A5CL17^.4T!X@]^]77.`<%S\\'7V,;:SZ_!M]]?(2.C:_B3D%?X)]7 +MRNTC6]H^-<'0LN1;_/IOVDQI/'E)V +M]>#AY:TCG',A'P;YK`_$'>0!6HD\P]\:X9Q'SX(\/UFI\SVGRQ4O#+YM-.+I +M4CLWC7#.U^W([\19WW$3\ADO'^%,@W][D,/F+8+GX@/1OP)>2T:P_JTRAQC- +MVSA.OUA;[89HMPH1+\%Y@B"W?;+.`>^60T[H'7H\B)U%8^*S71HGGHF2/4U+ +MMM.\^&&2S:6'^46NRA#)F_[:*AJ[9!LRCOO_GVIN_&/(-V$UL)\UVX4:%K?% +MZ\ZP'T,_OZSZZ3UU."5>R'.,1'G!:WWR7.0UEF56Y+:E@[C83^"]SXUP?@*8 +M/#R"=3=88XP7KOHVGTPLL+6M_O3,+0-R9_KEY2H'._#Z>L,)F?`GHWUB[@CD +M:<_@/<[+_^MA6^E>R%7J\/X%.S!FA\ES=T7_, +M?FW?F"%'XYM!+BGC-8+I#JW7'/E:GXR^?6=A[\<<]ZXOMROU_@Q3#^],L=XF7#14CF.6GSXQ0/"1RD^MVL@N%4X)ATH=DLDB +MGJARW=RR2H)KZ.VFYBR3%AQEIVVLR_JE,6>3:LL$:/VSLURE(/&J?B% +MK$8X=VZ>]M35-1)Q.)GW6KJ3]<(X;^(S^""GVD>I;WH_B67=@JX2,>*6W[M3 +MQ3-HDR[Z&],VMW&<6=+[R#L"_>O$U_*I,M@L0;?3M#_Q'J?GR)\L',0/\K4/"6(P-C;`S3-/9W8!P8[;JQ4H//F2I&*MG'/T/(D;`CABR'6,'< +MOG2K"0?83WAP=TT=T<;JK,=Y,6.P5<`YG_ZV\EN<92,!S^AEPM+]:T![U5'+ +M8GV5H?P&;L&ZOQ=Z<<>==#)B?X7>E_\A'.?V63;J$J?IBM4B45W290#%<+JW]#WTNG*$PET3[X6[T]7+ +ME%_"D,ZGHANB&EZ=PYW[0//`V]G$IQ%M`M]66GI/%+HAB^##WS`UWEO3&7_D +M6H4/S%MZX4;O&\.==ZOKWZKJ\O=-6DN@B[8_$GA=6HI\#U1&]^+V7:S_8SGK +M[%VID'>@K-[^8IE4,+D`[_M?'.Z@W_B37QC.]K,\CL\/5[1]N[)!`(P<6N.3 +MLA)Z2"4CGGR5=8@/_D;I$`MZ[/\\Z76[V0=(=.9(Z]R_`NN3WC--D]4 +MG_%H%?Q1M%W-&3N3_I%#;*LLJMY)B5%J;_`/OM[6S/H&5]C3<5J +M.#X^YU;3L"*CBH(>$OLXWU?O`4^CC_-=' +M*]UON;*-+8'_+\E.C"\QC]9F`XUA>U,<,<'I%S[5[",'\IXJ +MRW<68F_*/[^J8-4^UV:<_^NAE'C[2$H3<4T3+_O9JBOU[ +M..:#T2(.]8+G:!%4Q[^9]H1#]Z1#=]PCS"[B#=8VN)`1X0O)^4R7;[[4P+X. +M/(?>U>IH#'EAULLQC9>S27YI5GY"H6Q&+$EGQ.VT#F@,%MJ[8T]:K)6-5L<2 +M6\22)/F1&Y?)[SEYG*%];_ +MP:LI/M,A.9?EAG;#]H\3S)88F2"'''AA$39M"[[?2[?/,YZF=B$'B3Z=OKCS +MU92._5S&=:*R5 +M%M5?XZ>Q=BMYOT(?.EQ>R\C1UOY[-]Z>=DL6[&B*(6_1JA)7Q.E9F^_.H>]5 +MX/UE=;SV*_#^JG$C>8U4`5]V-BUYF_;77#WB`:7?/^1"^SSK0AM]C.:NR@JO +ME)B'4OOQTV<(TK_.)*,['.!?-H6KVM0">B$.[TK!399W67Y&3E=;/[)VI +M8YRW:I9E=0K;ZDH2+W8)R_(6S7/('R="&R(VW3>2G-/@SZ!OF[2'@&\`_8@= +M34%&%\^\G?*I/P499<&KG-/H`OCM%.6G>H?VW3/`CSX[S$EB;^3<43$^3T(_ +MY#^&.6=H.QWYPPKG'=`+R'C[51W@RSO+.!=LX_>D&9G*?LXD(^(=^>MA[#<$N9%C.]`Z +M1#^S^U2<=.ANY-L'4JC#.2/TF9GW-QKX!:.<_]0QQKG/OXZIME1LET;_SPH6 +M1X+\.K1OR(^7L>R&\1!J6G+CB=1@,VT?">1@VI?EQU0='N\+`0_KB@S\7Y$# +M%_2":!_6R^)_]L441I_\*:.'RW#W.^0?=R_JN%7$TR]:K6M4VWID#7 +MMHCF8V"N=L(5Z#?DK*$%'=SE`W1P_IN5_71P_I1AI^C@Y/2A2HZ]^:3229Y' +M?U._^)E*XA_L*KJ>2+(*>$;0.^#_'Y2OD=%.-&Z1LF\M!Y'OI+:I'+8"B\/* +M5I#+:1_]+GZ]88ZR/1$A[ZX3J8#'+FK3ML6/HMBO.0HWVPDC;AI](V2HV+`AY!5`;/CS +M1CO(42B^MYMCE177P]GH347C8+N"><.<$&S!=9GWV;XQB>7ZK%#;Y>,;&$^E +M^<(=Z(5HN*F!1GQH+QU0\87R*`-\[W0?-__VJJD)]P\!1!^%:)7((XB"_) +M79WI?837+O5%XOL&ZMUV&Y^C,._,.(@X*^6@+?H:O!Q\#(?WC>M:R*%SACFJ +M/5D8F[A8C8VOL1YG]]U_">]4H*WM;'LMM-V3@1S2R.E"Y<@?@G+6\P3P`HV8 +M?NJWO&G]O^6=WW>_B.F*QA7\OE_IG(MQ):%AZ?]Y!^MSV";RLEB__)2<\VPP +M=%XU3+?EVAC3)N#G,_!1SHI3;,968KW^IHIU-EBOA[/W1UG>(+D!<5`X+A?F +M&K9?\._'MV"+1#!YGSK-#B"?R +M2-2)LQZDKX]!#!8_5:[6_7,[DD%L-\[MHGQ)66H[B`^K(&ZN<7%`'_:ZJL;NU7P.N=])U<6X8;O>K +M5>R3B7>J2'B!O['_&O&A=J8J+BZRA].89."37OI.P7?!1AXP0;2H38A['@/P +M+[*#;_`X@F]G]S8);W:,8]9[XQLA>\)NFGF'3LQME\WVRY"5-"S9-XC>"6`/ +MFU7`%O`S*J'G5&?M/!8:!W\3<5^06Q@:-9PI622#+>[F;R]#'BS8)H_NLH-V +M,+_HGW$QR=VA:V+5[:,9L0+\L"[G$ +MY>\JG;.`O]"QX\SKQ]U-\3K"#SD`OA=7.>=J^.(,02[:P?K&0CL_KW3.IG9F +M]^PJV'TL#N(`X,P&M`[?()SQ;^O3*P)_`KUB->0VX!9@O+C/ASD4BA5B/?H' +MXTZH/<8V#!L,W699T'80)U'ET3(G?3C33628R@^'G"M/DPN*QW=FE;,R +M&!^]YT]0;7KWYU+>>#4_6XK:5K[0^%#H%+M5QN]: +MT"#]+=UOU0[R&5N6_'O<$6<*UP,L3^YJPL$^YPVGNOY9!U.(BRA&],VAOUC- +MX4Y=_["6]4"/#@;^0*:82G)5/Q_T2?SS7!-:3O`;-3QAFJ<@X5C3.`C_])POO1%NLAY2_P;);-,`V[O_;OLW]\I-,3]!E[S3!%6_WKCJ3R^6TM7OIX2IY5L*=L83O)4&NL +M)C0[-C+D<.RTD8B;MN`8\PGRV\<+MOH3X3IV9:73H>TH-&F=1_OG)MZHQ9=CAGK*ZEW^EYD@,K +MW,088U9!UL8YAZ1["7L(Y\\MT-.%L([F5#I+T2\JKT6\"-C3>!=;(=@4V^MOM^N\@,3#AM8WRTVT;\`^B'". +M[8NL&BN.OI+,@WAJ6%O(_RU%VB[MI1(\H[)H45DUE=6$:L%;M<`/[41>9ORO +M6TX-_$]&$TQF*AMS4Z]9G/_4SB!>&3$B4`9YL4&H<_FT<$JTS0EHIL/K<*;= +MB6?A2IP7L5WCE@=@JU^B=&>YF;;\_CLISBOVV/9D@..,TUG7KJ._,?3'?GW$ +MJ]0&/LK?V9XJ^-,M'FS_SAC(-L +MJQ+HA2$+EU,[<<3KR:DX-9Q'$MMMM?*!3\)FZR\CE=\]XE4HO%?X.XCVMMT] +M;.^.O+IB5P_;BD"F]8S]RB\2=B,E)U/0$1ZF[\$W`CJ!PYPG>FZF5Y]S!GH= +MG,&4:-GO\(!G?`:.>'&P95JC^G=L0+PZ]-]L=^W%F(LGASIWTGP&9TC^/6\I +MNYD[MO>=<&[0 +M<^);3<2<&+L7_M`M\*DU6"Y=US(-]NL%&X2+7/_9,YQ\D.]^G%"Y?Y`GMFJ\ +MZ_\.SRY1S^J%RA&$_2^L\X42K.;\B&6I1K0EGRQJ"V>QX_K>\7[Q1@KY2.JJ +M9MF3)/QYB2Y\0IWO#0Y%K'4ZGBYHRB+`>=U09Q%D21W3Q+IUP-GQ%[:SCC/P +M^08=@"P'GNM,0ZUUI@'L.ZS/@*9O5WO*CVEM5S]^J?_X,;VWK-/[T.?`9V=^ +M#?R\>:C:9_CYW)9G5,[=%MY?:`X?15P$T`#C(MHCHDK.7T4\9\E%]GG4A]@9 +MT'.J/8-M&T;UG2^&<[0F!W778&Z`^Z#QM=2.^%:Y.E-##*4@'LJR<@?M!VV! +MCYF>%QGL"=0BE_E?'ZKWI"CM2>-U7>1/G>D*F::]HMGR/TY[.NU+^7P,]?SI0[ZRF75Q!_,17P\-^%_F7ZQ +M-P0P<+8GO5:"2U+M!?Z1[E/MY7[V9H$&G9(O<7?">57+DY!Q$^Q#KNSI!D-W +MA;BK5G\;.O]GVU/E[).?M.R.L!VB7Y15=BC9E=?]>+WN:_K6O?=ZM_+7HWTJ +M3C)C!F.>.53E&O_!]E1';FX'[V,;G,N&;"#Z?U*=[[+.''DU?FL*^+?!1PI^ +M;R)W*(5GZZ$#ADW(G8KVPS\L@7/(1TSGJD"?*+8GV?]YZE"B#^/=`G]>.\CA +M\O<-=2PJY_=^8Q;B/Y_BA_5(PBG3/FK\WIE#G3C:.]R=%-^F[[_=K?1??RB, +M-0._0A&JS<`>,;!!A-U0`%.[,VS+L4.=^[$OP%_!?"L%F'BOJ;:\GZ.M#--N +M]J$(&S;R(8<@$PSO22&/O?R@K?P\7M;O_+:;\Q_&%XA,+C=]S2GYQ.Y)\-GD +MO\TG=F?"*0UTGT6Y]7A_?*8[.>5"90_+QP!LQYUO1IXZY!KT8T.=*'"+:+6, +M#G4>UC3'\L*5\^,N'4Z[[?2NW^$O-U;`CK;KVGB(E; +ML*<)<2$WH?S($.=,Z$]-[:_Z]A#G'+H'CR*HC^*7"J[^ZFX5+U3GEN18(FP_ +ML/D4V^O;Z^/ZVV'3?;$=-NRNZPC'V`Z;?MD.VYNI[+`GC7`^ +MCC+88>OU_`'@(^Q0=AWHL\-&?>B78%?3I>Q.O5LU#*[N[K-3HW%^$/O!4T.< +M[^`<[7.]*=@V*'_MOO,^G-?%2AILYO&S#79IJ:G6'\D1X:A9.'/T=YS@\]G2 +M4L0A=AM-V$G$I&M1G>K%GCT:\6N6]>G8!IX'\OE95N4<#6)AX;F\N;M@)R?G +MZ/Y3WP\^IGPJCFE_"O9=HO+)F+N?#G&6LYZOW/57*1C@K-Q_:A"O-;FP1_DK +ML^[6(Y;VS93?4?2=&=UL4[$\MRT-6`U#_L)[AC@&?"2G*SB5,)R4C0:-RHV5 +MN'8X*BT+-@\#S[DW*=B8B.O4)5W8*>!L'S#QK^LN^//)]W4K.R`]/NC[#L(_ +MBWX/8WS:WKG8+MF_KX+/A>7:XZD\]3>P]6`?4CY7%@5?F-).9>\$V(,N@_<7 +MNH_2?4)?E]$U>`"NFQ"M<;JW +M]75Y4(^N#>TC=FQ1.>Q-[$'TK(+:#-Z#C0/&B7'@#%J.&L6V]=ROKP]Q*G7> +MTSNGTVQRZ?2EO@EXW%=VIJ0'?VY%I@9_.X>]KFS;B +MF=C^\8Z'TA;\E0Y5MV",;!^,?G[@#+9S8SNTT9;@V+K4$/LVF9OY+)GU2>"# +M?U#F"/#'K]+O[7N;*N[^4[/%<>-4KBYA[&XJ%\I6";HMQ"W$.(Y]_Q+[^)V7 +MV#VW$R].[?@/#W$.$QSQ;MR[.A9I=SL89A&+;0DA3T3:YWG$*_!9GAA'/.YS +M80?QV_VK8BRK(AX&?Y?X&EE[!ML$<-OW#U'[_LCNY-2`/]BR+75:?^M_CG`. +M!#IO*L/^;NM<\\#12KKFVW#L"OIC_71)[8E0_J,6SRU+=7OW9+3^)\_ +M-J+@&Q?R=*P&Y*FBMNT2:C="^^Q;U&:8VM1\*V(*0Q9A'USDQ0P9L-L&W7%A +MWX7OA98Q_^2&:)W.U/97C`^;MBF^$/(GXOG\A?ANZ))":O_+OK:-8Y'\X:>F +MR$#O!Q_2QX0!/+@R?[4K-POB4]9EKLR&K>&()17H&Q"?X8YW4BA'/)!%6I\Y +M_EG652(FR`W^1W(IR$>H(\J[:TJ(=_5.O*/PF.1:^=RV9%S;GGC?5_/"_KT/ +M*3E"WFHPC\1GS;\R5*R9I[;U.Z.4:T8M(YQ/!'/^E^U]_GC%[:\>X7Q2UX$?B-\[6.D.<";'MI6S,OXO +MPHY8'XJQ3R:74YT]NMP_$N4S(^;M#T>5;R;*2R/.SJ`\%'&Z +MZ1JRL\%Z\$W-UQ)_NP$Z+\*Y_8%O(WS(:9U9.IXVQX4F.2^._+[&=CX7L^C> +M#NZ1*XCNA]"\&Z`!6K\)'-A99$=>J=L+MRWDLY^(ET%N\#U%WX?.(C'@ +M^]79)1;\&8+OR^#^7WR_N^C[]87OSU4Q@#C7`LE+(U0L@BFY;=G`1O#^-^I^^E(%7N7,$7UYWZF=ZT4YV_/=0+^X +M;]/W'OWR6CQ[6^H&Y'`&#^?74!?%['_U%VJ7Q`?[-?"1N1[T'.<3L*6HPAPG +M+=@3?&3&QV>8)!&WX3GLFQ;M:KI^;=A.T]S;:R.VW1&Q/6^FY74*&W7:2&ZI +MI'?S>>E6TK-I\'G!62_A#?C[U21/.F(RVT$Y)L;AU\@W#2R=:'R +M^8'/,&C32Z9S!?'5>'8%??^]C@_MB?^ +MU[:O%6H-B-ZP#7AA#ZKV7*MZC;`3589=#5F0UD>"QGYM5;F=6$.X0G_S-1SF +M!W"HW5;P^_?$-IWO!_K?VA:5?VC'>YY7LV?//(OF`'DSA`^?Q#W*[@%\!=8F +M8(MKFMM(;IOB'W!>3^\),VIG<:;CR_DX*[.H_^Q760D?G:>BU]-:V4E4ME-& +M[)5U$;NK/F+?4!5A_H;W\1#AC0G\(')BJG)+BF^6RKIGKT5^FI +M_`K0.P!?IM%[V(=GT"_PYHK1$;L8=_(G=C +MP/7$*SI.N&B\5J^9^<&:V?**]L$E6(<>><_PM<0$RUQ`,%LC,PVC"$9FS+;% +MOJA8L_D:P*I2Q&*U%M=&),C,Y']^&KMJNBMF5]`=X7;^F/[SF>Y'" +MFO+G8TU%U)JB>JOIS[_14+XXX,MGT?R0O"-FJO4H+A0K8K^*WU,F)9=Q_\D.OG-/!K$^NC)DG>7?0N8G,!CMBWT)8E/F>)CEJ&81O. +M4VD^UF,=P!ZL9GN3!]O-CNYF;XG@YVT=1.>HGTSG`/>->^>MKC-LZ!ZNI]\V +M^J-]MX7]ST+-+6VA:*$L_PVKH>/%?-(>'>,Y@0V.G(ZYB+KO%78#::E_(ND#M(_V&B\1;^,PW^E9T13O2-Y_I5G +MC79"0MDN^@?Y/5M\5?7E*KWV6X.U/^>5_\_WR_0E%W[TW?;+..V7\=/LE[;> +M+VV]7X;U?EG^;OMEM&B_?'K;Z??+(\;_^WYYJ89_W2N%_9*8(-XSXWK/?*_M +M7EFT5P)6P,\$[94)VBLK::],Z+T2]/]*FL]*VB>Q7V8T##(!GG_PE;Z]V$9C\-;`CC')X[#I.\C?.XW>X_U-S_,5=X1/W=_6 +MJ[GTI9IWWM^\NZ/EB&\%?*A^1=F]$#RNU#B>T3@N#KZL8/.>:?+&*-NR$?U# +MO#/&9\)EQF/:@^/F:?!8:#S6>_7U`\;2#S_7%^$GU5M-?_)'H@^O_WL;VX%: +M&EZ8%Y[WW,M]\_ZWEQDOSR6\;"2\O)QD>&4S3S"W")]B1-]S9B-T<,#5FO8+ +M,C6YDLQLQMUR:RKA6H*NH:L-$?RA,YI&URY=8SXR-.?7S1+B*O!JP$?ZNY[^ +M;J`_GG?,76>--X?><>AZ$OU-`8]$_'OC3.I9>AOK?M\K["N+ULB,RV9?CC5R +M&ZV1VPB7;J$U([?0MRIIC=Q"_;L-ZT2OD03!>R#-J/2TOR_.[[)%<)Y- +M?80FY_]Q+_#_I.:%?1!`?ZV.QKA5;MOT5TU_$G\$WWK08Y)].O]!`DZ[:QOM +M&=;/L[]G!^*E-[M&>]IE&VD2(L,AM8?C?(SMMA!'*B02O)>.GDU\%V1RM%>/ +M>HN[F\H7[VJJB,&?K;;0GJUA[03[[&":N_?89^:)B+8E-.WP;WF9:0?#XW,! +M/#8W2\29"*UO?NQ\(0>A[GN+MA6D_T[22<'@J[7^SZ<]8.]V;TZ'7\YFJ +M/]);:HEENYN"N:R-8NS-'N&$0(PBUA-U9-/""MMSJ&TIOD#MI^?+4+E=[\VS +MZL,FS2V5=QK4_EQO3B?QLI6:CN./WL5[U?1>?O&Z^3P?7;`%/%BF6;3[Q&`T_^!#LP0L_IH`Q.(,LQ3HP4TA7*/@O/,&;75..3M*8@^TVEY_AE7&A;Q[@A +MNFI5#CCZ1CW115EMV/7$R]>':.\>A)@/U'Y7UA75ICV'^H(Y%TMDJTV_DF1, +MZ*6JJ:]UT%G1O5T-^D37P"6&V?:F<%C(V1Y\;K-ML^7O?-^($LQ#+]8:6ZXU3^HC^75$E;-DA2*X7B,O-?9:YK2S' +M<[^?WXHSG!;>1\1[Y_O4_N6Z,S1])9O:)RQG/"(Z!'3=Z9)FYJ9 +M)E6`OF>\>M!I,Z`WL(VO95K?\4'0&Z)1(=J?@1O:WV<.TWM%^P.:;YZ'M3[9 +MXOUBC13R7+7&`WAW[*"QUJOV\#[3K473B6[=1'A"=(MD7-`I]E&/$<_1Y66P +MQXJ;:Q.F?*+Y4>P=/I&W7&V7N%DR71)4;OI2Q^7.$,TZ]1GLQFQZEM#/LH/1 +M#J$!/4]0>7VX;PP=9P`>M=Q_]`?]5S8_M86Y_+_,"V!7H">#:A/0"R!.NKE6 +ML`QIMKWIA#O__#6I-6N^VOH>J48(_&B`\MA8@P>B7W1_QJ^U8%ZT;5W_#X`/A`>-O7DW,U4_"^SN@9^PF:HD&@ZYU5X#&;G6JJ1?V"Y`IK6) +M/V=9%GZ\58:BQ9_9VA?G];S_VY@21;I6&^-;K/A0X6483W#V`W]`Q+/E;^.[ +MEZOO0M=:R?J'JRU["3WGLV17M6$`W_!L)NQM;5I.3V7$O%7,Y?3-Z^@ +M/_CP>U,5CLC16]6Y_(W=3:C+=))D67GA5CZ;1K^/L4WO)0W'\D^EB>=HD:4J +M]QC6][0-M'_ZI]D_I^13+-^\QWERL1]H?$%,Z"S-2>(NP;@`7`OE^G`-<,$9 +M/O#,I>_2GBT!5]L;3^_O;4K3_,(>N=*[R*KL%%Q.+]AH#]=H7]`O8%W!/"?R +M6$79)E@XRR\+T3/+6Q9C&9/*P>O&O;W1Q-HHV]C8=T?MQ)JHHM_C]\VK,V-3 +M3>B$WS-NCN?XK>P/_W_8"WJS7^!X9!W=^>0,30^-)W$61G0??B-ZC.6$,S6$ +MT!6]LO_Z-=/OOG[I6?_U&]7K-VK;=^OU2[_^GGPRT8DR>@ZXT+7<1=\>9R@[ +M\;^_I&(PK-B:NC*W;LV4W-R.IT4T!G[:;K=93ZGGHV/B5Q4G1F>$^[GHPA;.6K7$J.(GT[27VU_6P=E_S?4&=2N?5NH +MCK@C;+--];K=\P;:"LH[ASHC@KJ]$>360[XA6VP@/!D:5O&TO[*5[;3]5U[J +MBZWP,S7>';F%';`AAK^Q6,2^J"WP0=Z`[X$?@W\9K3W9T#\OBP][RV\/=2(Z +M?])GV#^A@GV_Q6B5UTW%N1^7D=>_EL;V(?MSR/R;G +M[!6AS6G_2+F#MKD?XPE6]+R5WC.(AJ6_7>[`YYECQL`.*"A?K +MJ]B9`HR-`;'J&6_F#'6^$^11^S[!]VZ5ZP3S[/^RG'&(\>D7Y2HW]=(^O!WH +M2PU?<=YO>VD-(C:/O7FDZ`WK:W^DS;&%5T:_[*_,=MR_AW]1+<>XYAA0L'\2-5;O +MHV9?O)+)+W$L`.(Q.&<[:`7BN_C7OL0Q,[G.E)?8[]D_^I+**W4TKV-Y;&9? +M:'^*5:`S^6Q-HZB&KP')/X=?4K'UFU\J^"'_>W][Q&C;U`R?=/C:QVFZ@9]1 +M[0?.?`ARR'[XY4*L*3'G9?9I"9YAG:N5?DJG9T^K]$GR7<#8*\YA_*'B*WB2^[17*J>YEQ$N@O5!. +MJ#XHF\(6Z+JSR&TZX/NE[)LRW*EIMU1]Z*UZ]C3A[,'391S#M;A-DA46MELM +M1`M:O++^SSK8KU[!L01PD_H=C+/HNTPGBLP]PZ`EQX_T_$'7DHA'N9[B7%0B"FA\<=[;4]*K"<8\W>DFN=>J;X'';O_ +M$J\EIE?WY5.GBP\AM[R8JF_O=EFO132&6H@RCBW8V03:-HG@42U\BW.\E^SD +M?&D!O9GQ--&;WPUQOJ=MT:[P'K4XCLZ2YD:QI-85'77N]5WT7I=TQ6HO4<@) +M==/VIL7040_>.:^6YLBP3.)!=S9-((EF&$%KS:5H]WR5_OM\=S_NXCUW>1)&E?1?MB77,%XM99\!_:WK0\!G^Q<9[H6)06H9FVZ!C38-Q!^\U: +MRQ:1UYK@TS4)>P:?]\]M$>''TR(\MI%C0:UV1_;[[G>'.`\%WRTNOV6(\W!0 +M3FUV\+J8VP*=H,H97--BWM)EBUMJ:6P$R\JZ1@7;),&V>Z2Q8"_[89M+NFRC +MT['-[V$V5;K,O^WRDV8-,\FC=.D<09Y@HW<6,S12''3:TUA +MMC,?ZV$>K_0V1\6M8_6WQQK;69OGE\4=J. +M$LQDR+,'XHR\88ASHGB>OD7X077K3,^.#IR?ZX8X.5VWI'W[QI+<-,)58EW; +M^$Q$/+I8\:>/+$LK?73%AH0(U;F/T/>I;XFRD+"J0$?7O9@4G:8K[W@Q^4@V +MK?C2:X'[/L?\$QQJ@>0ZX"[)O_1>M+84N"^C"O>W-YV"CW.'<'Q+A?LSHN$% +MKRD\&_;:J7CVB2'.Y<&\KGJU$3P+8C\9N3&8MX3XSJM-X2%4MHKN.^H!8\O, +MC?%P?:7G62)4KVS\"9_-3@\V$HV%]42P6_E./EG10S@:!H[6TGL=:1$'CM:Y +M(40S&[6]R5CIVG'DP5M#[U#&YN43[HU[P(N^A!#^K3/M]HOWS_T"\3*EA +ME=,]^F#3IFL<[]D7>_][;>/U_.]ZL +M]JW!6,$3?9,6K[2'%&P>D;<4MIZL^RD>,^'N".1(*AHS]G7.CQ::;AW[*?L^ +MMY;B?2MB#84/<#$,O"4*!E:D/PSHWJ(_/,>OG$(PH&OFH\P7E0_>`%MV]K<[ +M/KBPCJE9ZS#D;_H]B-\.V0AY'/'8_<>&<1X,X,ZQK-*3;*&QHTP.&Z9LBC%O +MY[ZHXM%SC+\74J]0V[9W$^^Q-2!PGXP[WL,*!_U83,<:KLF,^P=D7ZJ;N\3U +M?U;&\9T*>9G6*#\@^>L7F:];C?B&E\:=P]@_GWB);4_C!+?+M1T]1!JT>T5@ +M5T_7I1POAOC#D.))X<_"^KA77E"Y4^C]T2O"5CB[Q(9_^M4D#RZ@:_#_;2B# +M3%DBG!OHVK]7.&&JNX#^_!W$D\(GQGA1Z6Z>?T'Y+.DXN6CWEMN7V+?2WVWP +MY?L>>-JYF6_?/M/V3[R0_-;MRJ;=?TJ_I]^IAT_WK2^E.%8N?;LN2_4/OY"< +MA+ZTK6.XU(1,*QA[@NA`[\),QL39YQ(C`UFV)MQ@3RFKM2:5K2=:O*/I3^Q7 +M;;2*CNF-N(^9RL[,0-D2T5HC&NRJTMJ"3-++JK/K'+Z0\]T!?3EO$R7WQA:281+\OO*#T +MHO>_P'F`?ZQBG#0%<`#>-RP+6S-IW/"=GD'7IHXU\Q^ZW*5?T.#9#)OIF2C6 +MXI'!O!8Q3V>O&,>^2SRW<9D`/,^FZW.USZ5!/.A,M+ML)N<26%$*_I%PA>KB +MG8OI66B9LF=?03S#1Y:I>)B(N_H1>CZ;[O%>-*9S2=%[B/TY\-U[2]3S*_'= +MT%QKWWV0D[:KN)E%WVO4[3?2-7`2:_PO):J].6AK,7TK;B0NHO?"BVE,!._J +M9>,4KC_P0M+_N'"JJ:[W(X*Q-9=QF?-Q`!=7""M,\K+(;F^*#Z,M?UG&.IOV +MI]@0%=\JU&YXM<")N$BT45W8--RPU+-+VVD]TO/HZN9$G-9F)Y>E76$_DO`6 +M>_:M*WQK]3+/6KZ"]NIE.YJBPG#C(WN:D'W"Z@=V$_@K*Z=KMOI^[)"2.2*7T+]%&*NM?-GINA8)BQ\G_,8V)L3 +M'CU?N>N_\<^R%;:>VE-\WK^+\)+T"*B5PE+6,,1[Q*Y-$"G;^JN +M"1E+[44$K]%=-"_EVVM"R(%;&K'.CF*M +M=&^C]M8P[(4+W]L5O?GD+9&E]JW4CIQ'-"HZR_YVZ>,<(\!L+_$@9]\6H7=* +M"5:EVFZE.N/>MB)-N$EP#ZW/K,%U*:ZS&>B@H4-''LD5/?GDK=&E]BUEZ'N) +M"]\D_Y,O)+]MJ-@5?NH%)?/_9G]!UK]^34TCXC%?B_UXP>ZF'KJ&?>M0Q+#6 +MM)IC:5+?HS1O>^.%%-Y'NS@G\L^/%O($CEJL]A^.V_MJ +MC/JVG6YZE>CVZS6M?MH;KR%557GA4]92]#'$GY8JS?7N9OWJ]RIFQ[ +MH;"7^5\K/.(YU(!1L^6L<>YT.X +MD/K;27VC( +MSN8;XDM,V^HT[5"'::M<-*:-?:6-WN48<6W-K9`Y.7]-.'V#$.D;XITJ%CGQ +M2$H^O3W``\+9T/KF`%;XEBPO<82Y^1KXY8C1R1N(?[H!]L:A.PCFOR-8(TP?LZ_`CSA9H8S^\.;0OFH7J'Q\D%5 +M7Z[8DDH$L9]['^(Y8GT/]$6C#>A^,R'"%?CFRH-YV*:Z1FYWNA+Q^&IV-Q&> +M--[?`Q_3F1;[^E8KOR)1K=[U-])WZ#[(187V+8Q5Y?)1,/G&%I4_L8/V2:ZW +ME?L1$KNC_FMF04^+-8HXY]2?+K&NNVD<=35\AVQ4>$HX-!KG?6'&Y<"GF,^< +M[MFB:"--?YSC@Z:5OKM-Z\"%T=BO/U=KF`3P2"E8AJ"36^L2;6)?G4:B$9E0 +MSO78[Z:A7:]S_ +M63YEYA9ROF8SEU3X#U^/=JN!_?W6[VDJ/Y9/^B.H;="&E*9-%PWXQX*.(.&K.5+(P9YXQL"T[CE16`3=CV/J?PR9^MVV*[=-`"!4,_C/9J +M$6>B)82S0,1B^(>*0\`\NS?;5KFF@KYC7J*V-#6];]:TYNS^<^.?V,)SH^;$ +M;>0Y"OK(UZ[K'Z'^J9*W\&^X]QRB_\VRHGG;]WBXK[-%NOT?HM*7_G +M%KU/N40?]W`.+'Q77.>G.?_E=5X:=IBA#83/B`^#7!)AM2[93WZTEX9^3]2% +M&6ZBTW08#^\@?LG#G#^>MH-U:NQN*CM.\[YE"^=#%%.W)!4,KW35.C-XOT!< +M<*)W;K^U4+I%Y0VC_97A,E_%H_>>W!+$1F^42Q'OFV1XQ'X7&QE/>[,'"![$ +M0)DD+[1MSN3S^3>1#R6$^.DK!62I&ZR^6.A$YV`79R)>44(,VM&$/>S[1Q'; +MO,Y3[633ZIR#VA'P)YBEVZ_E&%'RX2U,U^3$+2I?!];7[N=3R/$PM+/<\N7A +MU$+B%[TG2&:$_8;6OP?/P8LNY!AJIS[SX`.?5;H`$_RJSIU`=2\H";G6PH7I +M#/6CE6/LFTI7)E]ZGO"G.>.?4.=.)9UARULH,B70S50&]__^/,>O]P\C-E*6ZAC\'E&M5GGB>:J79CEU"BT.N6%+(98S1L$`=6[>#LNVZG0>I +MG9WY/KP:I-MYE=K9JNK(7SV?FA'$:P&]TOE#]P?YAVEOMY$+JU39W1*_D"DA +MOL[L(+XGE/%R>8*E=XF[/VJHG`2TO^\WLK:-'.7(61.*6%;[;,^B-8WS:JQI +M$WHTZ&DZ92OT\Y+SL*6)#\%YR$W45IW%MONT7PN;\!?Y8CEF@G`?^`6M+\1` +MR9FK"V6_0AEBHL@;1$?S#6*UD=@:Z2!9/).Q%FQO6GPXG]Q/\@/6NXH-Y+J# +M$-LO1+R(G4F0S.YB#%MI#+`7%!ZM,6XCR_;%'ISIF0`N"A[EU!9XM25I^L9JY+5E7QW8+!%,_$W/)P%SEOUHC9O$^HDNHD]A +MQ!EN<<6J;`+VPG'0C2!&QD4\?;8QX_B.:3O0E=ZC_<,_1M/H?VY005=J^FD[D$DY;Z]7ZY9T(D?1 +MW6GP>]`S+89,6FI:0S%N6C_X!FR%93/L+^9E_/=I^OQMC:M7$ZY.V:+.3I'7 +M[$\OJ;B5A3Z;'#L7?2Z%CLWT^.SH%N0!,3.NT9D&368YCK]S>07SI;ZC:)3H +MI.]8KA7JRI#,NUWY3]"]&=R#GB,W)<[9B.[4$EPYEIV*8ZU\@#['=**E(M0= +MK4)=VC,X_J>]N6ID9Q0VU2TEB!O7R;%].>9=O+V[Y6"[^$P,.>3>S*=BB"5+ +M^X]?;RK?5^QK-&:1SZUK\6M-)H"WB04R2?:%K*J7?.O1WU:N-L9[=38^P +M#TL^,YSJX=>%KPH],Q?L:XIS_7WLTP=[*I[+FU^=Q^,;NY=]9-](?[$2A1[$L*T%_&:+7 +M,CA;QUZ*?>$-P^$XB,++L(P*.XD>*EMU`=%66D,TMXA-(@Q3\9)W$OX9ILUY +M,&$+%"48@<^BM2V[\=Z8C##J5%VJ)UZ"W%EC'X,=SV6:GHU_7M%6S$_]17I^ +M1!7L&4)':2\]0NV`KN",`7LZ]74P[2>(.Q9:L'V>:%NH8A42;'&NQV<`P"G8 +M(-)SKWU]

Y6]I)X' +MV$KA7+*!OG6Z^1`5XQ/^'ZF_B,D#&.JX)/(?\)N>I6%8TZ)@J'@AQB?#ZH/A +M<4/E[2,8^K\TE.V3H?,:43WOIWTP].H5#/TWGTNY[9E,.)==+>FW-->\6G0U +MNZ%2[IG=!T__?/I2[(Y;/`!88?:#Z?.6]J +MYEA?X,=?Q1YOD)SV>)2_C3QSI?`W53[Z0L[.F#U]9^BS$1_GO@K'RB5U_.IM +MT4YD">-V59ORA??>IK^^PAFFV_3^9#AL)TK]+?3SK_W;K.O9U12&+0#R;%%[ +MP.N@?>2YZ]??6RN<,4%_B\N_7>'4Z7*TE_W#<_V?WUSA3-#/&0^^"SS8%.W" +M>&D]T8:=+CZ'XW%T53@G]7EI7/N:#JPC.RN<$T%_B)=7Z_HQR +MIU3+C[Q.$0=;1-@_E)^[ZKD5?..^_GWWOU;A=.2F>X6^WZAQ&&="M.Y>)OQ: +M_Z<*Q^!W-C5[&!/QQ75$;\H&]O>+%'?K.7 +MOI.*G'&Q[3^V-P7;8YS/XGS*>]^)E(>QUD79-U?<9;D&XJUB;T#<7=#J[Q.- +M'D6X?9?%^2M@L[AL,&AV=]--QU7>O-L^0L!L6Y*^^Z,@^.&I^\TW2M^`?1.U +MBUQ.B.F":Y_6VB\9R]&>WZH_SGZH_?];]"?WYSP?_O._/ZM\!V@77=*?0 +M%N?]H[;+B-^8^).W4F7@V8O\$TK:K=7@<4,AP\I![O%J&T'#Q6J9*$,L8BHO +M@3X2^R;Q1LL`2]-P2T/2BK1;&3X;-[T6[%V3[IEI3UI+N`#>PV3;L$SW@+RT +M^`[BB/E-SR4G>ZJ^_#A=X[T@EO"DYX(8A"V<(R/W1-9RDU;<5?%"P1,*L[L9 +M?K[^8HOWM5O_&#[%7I;MCX=6.!_0<3R_\RYU_(H*YWQ=Q^A1.3A_!OYO@>5, +M1_F$-]@VUQ*12E,_?Q#/OVHYL_#\C?V\A^'YB)[=2TM*]?/K+.!Y6.?7P +M7-[]EHK9O[*48_P-1_V0KG^MY5R!^@?>3%EUD4K1\F;*7UK*\0)=^B[X"<0Y +ME?/4F%W]3<"%XZ'2]90_CK/D9RR.AXH^3\G.K+3P[B#%L^>SE]B`%6,17N2^GCIVZD\Y#NCNQEGRW+B[A1TO/*#;W/<]@#6H.]L$PT9 +MZ%@^R>VJ/%3<)MKS+Z6^DJSNUS_7%Q?QZ+.I/KW\^F;6PUD-+3@_L7*&*W], +MM*)B\TC(,_ZL%Y6L\"[R2VT@OY#LPN=D7M8.W9&V2^]*V^%[TG;D[C31E%H5 +MRQN\`-,MR(XNRUR\=RW>W;1,RRS@L2"SB$Z#_1O]/\=9CR_7/:?T8N(Y16N? +MHC&L>4[+Z2K.%NC2];#A>?EH:@YBE1K*'SFPW\!ZN)QX(7]S>1\O=,MS2C_\ +MQK.*!_C;LYQK;51N[II\OH;SO:%=["'GZKC8H)D1FK\5-/8)B!\\UG+FP`;A +MAT\YKN/3UEA.F-[[`>;G#)J?#4X&;>3X5T?8[86B+=^23 +M_[UX'.(0-1F(\]*MX@ZK/!\1CK]*^Z8%>S#$W?,_J_K#\28;!CDZ+BW#R\]' +M>(SF@CU-Y6W69PDY@7ZKH(^\#3U0#O[/W?U +M\UI+;%;MF!P;P5#VRB9;#5<6:.O7GU6Y>AN>*\C;+"M\_B3K%$.P;PCQ9048&'TPD-,4_LI[GRW$D!77TMHP-C?7L2^]W^QU&@YLDKWK +M#(=]M6B_P]DN8IV*(%;'S83__.T!\+:+X+U"K1'QJ6=3WA=?36$/0KQS"WZ' +M)HV5UM=A^$X0WM0WT-:\Z-FDR)(\<-*SV7\DJ]__*+U_]:NIG?3^:XCE;LZU +MOTZ\T2".O3G7OH&NO6_HNHW/IF1-3TKE6W\VB;,6YFEM2RCZ7__F=U +M/L[-)$>NSW#\*<(IMNN$;%$J'+:;))D2<:TX-S=H:'P,?$`R5_DVV)L,_VJ%R&;/OH +M=6^T<].Z\$XF5ZWTW9!!D7L*?$&X>Z.9J_9P;2/.-&RKP0]B/&<\R[1!]5DT +M*CL-D8@O4#FJS3977/ESV/$3;;CP69:+^'SV<^7.GXB?]1N>3<:QKG1\2B6+ +M*UT%R]KP3:MH3B#VC"@3B5`<]%J-&?[[,Q:['&,`[Q?>9;^7Z587Z#(6->)/ +MAG2=$E5'Y6^9;BV]G_O&]!.\(<>P1FQ_Q#4O5;9O?(]Y@$V$SC<&FWG0N)4P +M\$.=8/WFGN&8X::VNT(_3S^F=`(Y>42,^#;P^["?+E7?+1X+RRU5TIVQ.&,5 +MQK24^EM-.("\/D']D![7@/I+@_K#GTV"W^7QT7L;*I]-> +M8;ZQ'GE*(5?PVMS4C+QS3'=@Y]=!/$W[XVF.=^BILYKP<+T&H*-:T:MRJ:[; +M/0^Q4\VHBEG*OO(A%:^4Z=4[`^3,Q^+.J"#6?7'Y[^-.E2X/VK%,R^[7UH$! +M)KRP=-QAHE7(B[TAMRWK?[2WD,\8 +M +M!SJ3X-P&9SBT1A'?7$2$$_A'V`-\+X)Z.E\E_$+>M>XI_E,X+XOUA]5F/M,.B2E"S'R6_5J0?TFLE?/9GV7F +MZ6&$[_`[B`_BB0*].9W?#.IYY_>U37QT*Y])G__L:?UCWJT-<3:UL7FVJH2\P7'0Z#[,?^Z3VJ. +M]-P?_M=S"5JVA./M(':3Z,.!`^_^7C',$H![V;.!KY*R103WS_Q#+]?F'>Z_U_"Z%^N^=/.QZ%G,!^MA?EXZ]]_B]?VOYD+SMM^ +M\-^M/3VOK_\?YW7G>YC7IY_I\T&#T@UP??K4L:)/-N:`]@2>"YU_=]#?V*X& +M9YRTEFI@/]9:0[Q4('O8NJ[9_J^?AT[S_%_-4?">,?"]P)=0Q<&VO%]C'OO7 +M>=>Q!3F%&0[OWI=@CO;`IK14Q12Y"=\$;X7]_%-YCCD'WQ#O$_F4IW-S;X"> +M]<&.0)[:T +M1.G3Q&KH_6HRK:^P[XDM)E$YZAA%=61)OSH>21#N`F7OQ\\?"/5_/H9@5/S< +M#?=_7D/E.C?F[QW$[EPLV.>@@WC08%Z\8%XNI+D(YN4" +MFJ-(H#>8GCD#T_!V6;^YB5^EYN8HS<5A^@M^K4\0A-%>F6[W#&HKJML=1=^( +M%,WW'FJS5/6E_"3RI:NV6W7;Y=16C/Z"WYI/8"J(;_H2\1MZ3D/?$QRGW5HL +M[-/E?B[&2Y?[E==^(C49Y#03L%7Y%W0$[WBURH;I?_N.=]/VU,60874?!7(9 +M@C>R^^!>6`_'Y]5$R^@M^/TM_:,M[,Y?B_KZ1 +M.V6,#+?9"FX!OEX;X`OC5TU_'$;9E`E<=GUQF<;3^;KLW>!07[/P`G\5AA9=G":$0,_\JL\HV+2M5.\`W6R56H;Z`M]&W@G'F/ +M]LV9>*3_G(E5_>?LW'EJSAZE.=I$?\'O/S0N>\.$X]G]QS+PN\$:]9[.%=:H +M^%ONE#7JM??_]@/ZV]WTK9?I+_A]*UBC8<('P)%@@F_V@]6BL#V05ZO6/"G# +M2N<9Q+W:^VHR5VQDN5?ES7V7?6'SYP7K7#DG/?&U\.TP]9ZT^4M"R>[*I]]# +M+D3D#X!.*H9?DG'4O$_/7"!$U-OQSW^_E].>6(HS1H*A]]P_4Z6YF1R3`7U% +M')B046O%C69+;&9[Y?FB4U2*9_[YO^.]BMH6?_FW;;>B;>^)4]LNA9UZ;]KE +M]XRT)=PTKP>V:82=+N)7(=9<6-$/MEG0Y:7MAD?%;3"?524JN3YT+P.?N8+U[`FX +MO24;7)%M(1AG>;V86!/6HYEWJV.T?Z911%0<1]&V0<&V9T<3SJX'OF-G'[7X +MO95&94F@8VK;H=Z)Z;FP^MHIS;5X8GESHYEKQJ]KYK9WO5L_N.WR'4T=)PBG +M,5?6CHQ8133;I%VB1\WQP'>K\6XGL:8=M2[J>27O4B=X?GM_7A?G-5BKX(VS +M$;SK>L&Z%:+9C6>)5Q4-])?.B$[B\4(!CR?L(`:$JF/:`8]J!;PAW;,^\/_' +MWIN`1U%E?>.WJSO=E8508,"(@50PTHVB%145'4:J`P(N:%0D+CAT`@INB("* +MB*$2`@9$1$4'$:'`?1G'<1MU%*+(HBP"XHX:@@(J*#LAA.[O_,Z]G70".,X[ +M\_[?]_]]J7[ZN55W7\X]]]Q[SP+Y[1+(;]N97N@6P#E=^?@"S0\==*8M[J_* +M%OZ(G8,SP;*PS.2OU$>>#\%'=( +MXV*1O-3*M;=L)'Q(-PFN5 +M.*B)K"RLE0&CANU<+RS:OD`376-^YB/((/\WW](8_X*F,`NW6/4V9\=E%[,> +M(]:9HX-O;RAD47*P!D0'Y0/7_XA[GAM30B+6A\^<; +MTFZCM.[@AK1#5%JW]^'3&@EI=Z#<@0UIA1/2SRMW];1[>QL%-'_2GG3LY#K' +MSJ,E)\[CH_F*A6CGL;L&;)9+'$OPD$JX'/&G]J%QFD1P4V?;DL_=M44`L.78 +MS(/"NC:$7>0'S5YIBTDM[)H6-NN(3JJE?.K`PS$^4@-=NUBOTQ85B+2B +M3Q=I/<,MXS:[A%8@_#_0O.MIB*DBO,GG(QRPR*X/=[0"@\*0SE/R@\WVH^/I +M)FWD=$A3[Z_B!\9N++QWA[3-4W?/7_2:>TY*WG]/B^3:>[;I!^Y9J;N*3Q2Z +M-X3_7-L\.LRR-UI)&>O".PKP3;3'MG);;UE"\VUL-<["[7LADTKO+Q)^22OO +M=8E.[_!K26X7PC5IOEZ7&,KO*,0#?T]YSTLRE%\'Q/,B7L]+LN%'W9-++NL? +M*<^GNN3;9AO4)3\<&/M#8>G/L>#Q<*D/MTVRJ9WAZ8*^&^KR0^&+FV/!M/(A +M5)8ZO*#J@O%JT*\P507\ON.X)78]X3U..^J>8^TO9&*.Q36&5AD'Z_D*5M,[&T03H,,=4%Z*;U7 +M55GFA6N#>7'=9.W66M`_`5DDS$_8,`9<3?<7)3_@#R='_![]07].,I439MU6 +MS-_V760$SANJ52]_3Z=M+,!RB]QGTWM$/ +M_8V"]21DH.ZX8Z`^09T9YE*J,KWC/%@[A?QV,EEO-M8ZR)1"KL7Q%MB>/H;( +M]=B0Y?1@[ZU@EOEJ")X+*!SW8!K!7P#Z7T["6?^&\+SRID2OW=(X3H8=%@_W,AXZ4KA/3Q%M +M(RRO8?RYEY&6)LQ-Y0$=\Q!]06M`OH:U-*$/TL"K&=5EVTI[-6I;?/[&VP88 +M*J`XB,]W?L)78#*O12]CWJ0`SL7RN3^@XRK%/$9,618VJ3]F41C[9\#?/D:0 +MWT-QO[94%NI+?B^"QD^)'(,Z(TS6N2K,-%I"G9-7T3Z6QB.Q#N::6#"/\D`: +MW#DU&F>:OXPKL%]#^S1AZS0$A*OLS(#DAT@G>B"E>@W?HS%NI;C/^HL.B3/E +M&XK#>#$[DO&HUJ`K[)DUUM\9WGM$^B61=RM?"''"63C+H;7CN'66+PH;?&LD +MO^F\AOC]$3]5QF\;C]]^'>M5<#Z4\*8>^4>!GRZV$T"'7A[X.:;E9)IC-B>L.:83U^&'>S?:K]IEW-_9.N;7@?%23NFQ?;&83GWO +M*S%M'^8&[BL39)8U3YGAKEA3K__,N6^-95ZQMOY.W=W^Z1%YV#-^!P^[>Y?. +M/.QFP5K)'_*";+\S98UU7[1'?EP'&O-"T7P"69=GA_2NI4N2N])^RJWVACP$ +MG^R'[RKYW15[4>_FPNVQ067IS,L5*!#'5Q5.3!9F-]JS`K:9+IHMI+]?^N/N +MC5P#>9B?>UFV$7FYG\I\N]&[N2ZAC+*`@73N3*JW$Y`R.M>O43;+/:'KH]^5 +MHO[/KM1$]Y*`C7:7QWK;;FRK"H0?YZV7 +MVTY3_I/@;RK_26N"KKG6RL9=O+"+S;<^M;I+ +MF"SFL9N\)9GU&X'G:-;2,.1YA4GK`F3ZP)/M]86Z8TS)?P;K0>MM>$0?0YL5 +M$-WCXQFF\7SZ^HC9=BW+A#EW*'B^<(VRN0[9C:HBM^5:E@.,VV#G.9"5S/9; +MQ;3>F6S/==A^RX',.LX;P1LPA^KPV`[+$QT?,5/6,K^4\T:UA)=>:Y3-&I/Y +M+MV'O[?X;E3/UJ%'DW5L*?V9T%/?IN2YTLPZ?X:!4QS6N^C/./54>H6>..K? +MKA\K/8IG>EF/(O@X-/`?E`PRP%^*\4F'#%[Q-F7;&O>1V0;X:0_AH\U.#LV, +MZW.:7LMRM![*!_I[V&X[[LS_L;_>QF[F.^#5VV6U9+OL9@3WF>Y$;^ADA./^ +M\J;DT#-L@Y[\7]O/]Y[F^6FAY))D1_3*UO.0;YS_C_)SB,X6#\?81F]7RMO9 +MM$?RYBW98Z64='98!F2Q?(=,E[MH#Y]U83TWW]]C5:KVXWS)'*OT=T;]&7SV +M![O?HH>.NV?DF5G6H\"T&_=)^6'ZQ#RHAU:I/G%[UC*_G5/B#Z%,]]4]]3:V +MS5?D._-_O*S>,198"R[R2WZ;>^3=K_GI'HOUUP45#MFSVL+YT\;HPG!2@OUV +MN#SL38PMX[!S#9R8Z/BXCME/:+VZQI?/^]4:>Z=ZKGKW:V +MK+;,5]@M^?M$V`"?GH=<;9(0WOC\ +M^C0@\>7S:R2^3%+KR^;5ELWSJ[((<.+V\(:4??$BX`#P`WY.^QV64&?`<9X_Q+:),.;Y!RPI&WV2SK9)X_*1H-/ZJ_%G_3#@\=\<[EZ[ +MN3`I&@NVB2:7B1*=5OV0[EH27AE&A)[A"AICR,R(;!WP8/;8)N=GDWQ@)\*A +M_8Q+N/`$U*M_W6'CH3SDQV5V]H?2.E*Y]'=4>;BCU\D%3T8:NT(GHRSMI[5NR +M7XUIMLZ\\YVH'?-[&QRO%:T+V`_>OD;RE<3I4?)L[:NJS7A4[;& +M$VVK;X4]:V6+G,?'[PUUP9[V=5EO\Y8]%F02LVC-V2K'IX#ME:MY#AN\KIL: +MV@K>#KN'WA7EVX/T;N0B'7"G`7TKO=83/"Z,<+UKM5`J^!,UU=X:+702^O[I +M&,.L\U6UQ?Y[-!I3@D/5=\ZZC99S]49++*ZVL&>O(3QK+H9\6X!MU0/O\OO! +MJD+PI`_[9'>3UH#W5NHA+]63 +M^V6C%H*]+_?UU4$[OE^Y9[4\6V"Y=Z(;"/?#)KPW^EU12HE=!O[W."WQ%,[[ +M"'[R"9;`[S7UB=[&?4_(N>>NW\A\Z4X[@L6SU["\H?O).@NZVJ9#I]$1^'*U +M^:6&;W;8*`,?D!,V_//#1F`.^'+#MNC4N:!N0C]Z%Q4'2_L9!KE1SSJ9T,Q,T3#)X=B?Z]50E9QCGV37[!WC==T-KF&=WVD0)MQZJ +M>_B#C3Q/T3ZXW$;:X]U'?_/^U?5[/.>[NQP]B[8C8I+)9V+PWZ+\C2;^8J;T-YOX^Y2_UL1?5_Z^)OYIRM^?X`\= +M<"GXUK(-8R;O3R,9*EYBVDSEE]8DSRSEG][$O^;/TK]U$_\ZY9^1X-^6ZI"I +MZF!BWPG>)(J;B[S)KPNYN?"C][PF=>M`_IU4VI"J?]?#U+^;\@LEE'L"Y%!H +MC+KSF3_SC=IF_NH@GRN"!FR_VF(==VSO=D.1NV%UO7X4<^PZR\]KT7BY%DT. +MZUB7&*;U'+L=PO12@NE\PRAOH;`3^^*S$>3@;K;3VX@ +MZK'C^S[AXWHSCSR?I]*:.!/8SF*'P*A6L7OS;ST\T.- +MY^4&:J-W=3NO3E/E,.QT+_(B[*PKW +M)<0QMS:.XT],OT6&.;4?2SKFVX]Y+^$^2FV!'`/V#:>NLS)^8]\`F8NF>P?W +M+BV4<82]0T96#,"^U]F$]J5RWF(VJ[D +M\%;<=1CYH/L#(:\*A_[\.#W<`O2PA^6=#Z&).5U%@/F+699QT1JKY=BJ>\HI +M3B76[5V>T'+9`_9JF*_O-A^B' +MOCX0^J%>]O&9Y!2B"6%+"'&A>Q9ZDS$O4R`32'/RJ'):5\LG&7%]KJ%RQ^A( +M:3+!6TIYISN.$2AOL-=Y2KF`#-&P4UCW:P_6_0I>$LP)>5]C9[8DW`H^AS1U +MCX/WWZ7G]I)`:&^BGML#?I;7KF/ZC_"P%>!]-G0X8'\->@1Z'4"/\+Y[Y#X+ +MLM>H?W>J"W3,08X\#6U9E1JJ)1H3W[633]*Q-X>_^>ROK"/(G?@QZUIEW''N +MQ[Q7&AQ=6-I4Q['YQP#M.^1^*4T<.G>X'=T"1'?+.)H.VW'5A\0QNP:(/I9Q +MLF!W6B_26Y>;>EK4C.`>7(P+\UT(SA2A?PI[(IS]Z.1"]Q_F4QKZ$#(:M!94 +M>PF/UVY@7?MB\H;"%*4;U"G\."@>(7>`G)]NSX_5?LLM[@DX?\`38OUT+_PT +M=$XT-NN0>F8'0H'HB;:$N93#PIS;CG"^BN,[0ARS;2"4K.*D.<^S3=E#^JU5 +M()2FXDBX[9V"O/)*)N=K6@/V&1)%^V\);HCG"7A7,A; +M45S8ATD?NZ7PWH1UE>M=ZP^=HLH0==?E8]RJ)R;KO%^@^J=26S3FWQ6B'>]C +M:_?$G*5*P%T'-`ZVU;HCB!F[;'J!(=Q;"V8DI]'^`N^QNJ +M[X'Q(O)-Z7DTIU+T]>2BOS#7X:=1^F]+)QN^DBGYOI)4JD=E.]:A1>77S\]_ +M^%GW`>88YF<+PO^8HSP'Z;U^GA[<:XGGSX]X2U+M.BJS>F)G'?G@[`)Q/>G" +M;$VT?5IMU:'S9J4_-#;>+\\&;7=%:BBCQ+:KJ2\9ST%'&^657B%I2^`OY!G2 +M[7J96BY/@VTZQ\!](<(S?)(W_Q"X7>@/W:/*:W.$."ZM_Q4J3MLCY?.&/S19 +MQ8GCGEST6:;$/^A_7>GQAHV1]83O^1R$<+1[E(S#-`ET1)"?V4KZ72&D37?/ +MT1(V4UH(LY.N;*U2VT+8QR)^ZJ]\_M@4MML3;$-'B:_3MKEY5OR]VYZVRNBC=1L!59IVTQ<-Z--2=WB'P,=E/=$MGA:\.E2?F\2KW +MAUJI.+XCQ#$=?ZBUBI,&_6Q-;"=Q/G?Y0VU4G"PGJ%^AY$4.B7>[/]13Z0%( +M*9?K=ED]/J-UKH=?ZINA=`$5WG2M=2_>+6GR)Y>&-R0%4S#GS:]$Z&0JOW[^ +M74#YS.]+\R_09/X%&L^_^VC^S>H=2:6RJI.">I!@L6Z\6R3G7T"?ERKQX)'F +MH#O0'SHGWC)O71T1>XZX?]G,1Y*.=:X(ASS;W$'^JM\CW2 +M7#/[^4-]5)PCS36WKS_45\6)SS66U7O^%YXS$O;[V'$8[Z0K/=VIF"\>.5^> +M^J5AOACQ^=+';N_SU,\7AMOG1*@(_!#C5@495A/K<:8_=+FJ1R/_KO[0@+@_ +M:.;P*K7GK90Z,"=YBI-HC3"UCQOVD;/6_N8^\IB$?23VOCC/P3ZR%;TG17-L +MS5%ZH8XD8YV4(&/==%_8(4GN"W>NDC`86,WU=H+Q>LN]K[F5PB40;H)=.?Q'JM^"X&^`/C>[V$!?.+5?(^YF>U?TE=)?6%KEU5 +MKR_4O'&M.G>(]WU^PQFX/\<^%F'^TK#4$Y8=T9@VSHY8A,.]JLZH#_HV:0[U +M.2KJ(^]D,]L4?WEFAVHAT0WD]] +MFQ3Z.AXG*U_JJL:>7K,-KY_:&"VJ\)$KRCO9'J)C-8*O)`KS8^X1;*4%<&_9 +MF6A:Q#4K/!K.93H)A_#+KNAXNVQOX[,*\:,?'UFE]!C8 +MQ>[):Y4>@^_4&!]WV'Z$[2AO24?[.>93H3F2V(]O)87>C$I;>EK'?,,;3;&] +M5&<>?W*30M1O?KDG2E(ZV?Q3T!_S*P)3L$?JJ_NC$5M'&'24HN\FY41@[XK[ +M+WH^ZW+32\(5OG+TM3SGV15=:)?M:=)_SR:%WE=UF9'DE7H3$OOO"9^\[QRS +M2MYW?B7[S_G[R@3=#^%BZ&$6NE;LCJ!X4]XODG(EL:*(2_U2&@#-4CB)ZI8% +M_9ESJ$^/%B%?9\*8I;0.E&P@O^ZV7BJ,K,>%D?:,,(RGA)'QA#`RYPG6MTYY +M&.Y0!?\Z`GD-8RE#4[RW:314C/$88ON0_Y +M45FSN]MI5)8Q5^5MF)D$7X70*W^O)OL=[_YDJ=O93^_F%;)LYW59MEF^DOD7 +MS"MW6G%;:NZBEDB[OP`%Q>#YB>BY[()/=D.A +MIQ8Z:V2YIM*#Q^7?OM)B/6G1[XK<-.2SL*@;=+`*19,0;.2_DQ0J(IS3-=&? +M;+ZJOFXJ/<*_4[)Q08IRM$O[-GV/!`6JO+/E!(U*GZB2UUF%.)6\HO`^\,;"K45):8<9Y +M#(7--AK`*^U3>O;!'YRN])#%V\ERP=!I#5T2E3CG[!&)ZX]%>%>,5UDD$L)Y +M.//#FKKY9BR8)\)Z`+H0'/`.-L#/(6F1[^NQ8"[%YS":T]R_Y5EV5PKK@K6; +M7/=EJM/(L'VX.'DJCOFBC),D>2DBDVB\$\OK1N7EJ7IVI?+AJ5NJ#AL +M'4>P3>L==.^U*P^#+V\HZU$`'SC.4);ML7RPDY1HW[XOP<4T/]M]<,R55IP? +M1N;AUPVBH=AV/&1^:!_I+D0>G>PX_6R`;^K=/5:*\O/0_.=\>U"^Z0&9K[&2 +M[9Q$OM$$\PA/$"'GZY52%\3`C58R[@"[;;1<^,&&86D5WRVM!=TV,F;MQUG3 +M:7+>NX&5K'?#&>$/X8QJ&K8`@Z1=2>;Q^`CWQX,BS@`MY#A:2"RLD;P(#^^S +MV%X/=/?$>D3<$VNE?#KFYV6U'`:>&H29(1G&> +M+D>&X=OM*\-\\73M91CKM#U7AB7%T[638(WEU@1"U#^.F5EC03>-.:2&X>8_ +M79[92N9?$[?INQXX))8MXCP8KZ^PA,1'T;ZT+^!&Q1N&>-?OD/TP8X72?=R07^F[*X+QMCA#=E@^R?,P +MM/1MZAMZ-Y6>'@_;J)+M%W]?(>=XQ8IZWL04Z".X&GBM![^[5ZVTH%_-K-G' +MZ[XXD^#A@Q4-_(/."JL^7?^$=)?1NDM[='$3P6SQP+MSQQ3/9UE"L>/6?.=Y@ +MV,-TP1<+6FE;S'+G2WAU-^RSOJOM)P_K+2VE+;(<#[^Q>K[7F?=W4AN +M[#R[5VFRL>4]@C>*LSL.=\X&2Q#]C+L1'WA1G32=:*9VS`\M^AI*1F]H]KY8 +M`+C^$^".Y5'K+=S/#?E:\DNT"Q@X.V9=3[0/`?^-^ZZ0?!SBI^1ZN]5'$SZ] +M;Y7%\B9L3V*5M&$%&Z<=J=YO_2)MN:QLJ&]]?J_*_.)YE3)OL-1]"[IX#>KU +M9M3:@'7_\6JY5Z-PZ"A)5;#/JI\NHCI##^S,:BN`M2&#RFVC^NLYU5_O-NDO +MBN/>#AKYO$N35=V=T;0O:]#G4ESS5(N,FO=4.SM1>=0?VO'DTIKBS%'M>N4P +M[9HI0A>2GQ`I;-,6>0->I)XB?Z2^O2F2]^8XW`$]%K76L^, +MOR?KIL\3VHXU"7V@=&2]\V?(I4@]?Z`/Z9WO;TZB/,T'HM9:E:=[?T.>YC3Y +M[HZLYKU\S6,M,N+]"IY^,_=KRX`-9[P/K^;U5CBI2I=@JN%L66$Y/ZZ0_7NW +MZM\'FO0OQ8GW'>.BVBV%4]N#5J=U_5LUYX\5)L<9-ZB8]4DP;OLP!?V%^IEW +M1JV_X#[ORQ76=NHS'^9CE\H;_M-X6W1)_H_HEVV4YP=HO]315SJ5UM-*PC-; +M`B%N-VB0`0I^;DB`'QJWOV'Q3-X>C" +M8LSIB3?'@NXML2!P'/YF%PDS@$?W<]K*$/Z+UV,*X"6DX.5ZVL]\_17#D3-4 +MKG_N%\NEC07F5R,:B]H)O7%8$[E\1?.A?:")4EAW&_7'\?NEW06<#V-?I;&^ +M.5EOUD\!RH;VF_J*!EUHGR^WV$8/X=\WOY9\7Y1G<9J@W>6X'L7FIYK(5[0UHCZ +MS1.UC7F\3H\O;H5UBOR=7U=:?L+!$X!;[MULU:_G5/]63_=F/&Q^\A/3;&95 +M%9?;BM:ZN27>/DG,=]>9\E\E\@3.[ +M4+T#"6TQBV5;`O&V4)X9"7F::Y<'Z^UBO+'B$\9G&]/0):!P$3 +M6^G_W@W`;0'#O'F[!1A#OP]<0&/I">B[F2\P4J!%^SK0P>,2?5'G@=V\\<78 +M^^H4)_WIZR\5CE.`\-?JPV&GNKHP#>%86QU)SRY[&_S.&LEKU&L:P$P^PS!^A-;AFJ=@=-_'%K*\186Q^U< +MNY>NP#EQ,>L'1-T`KW5[&`Z9E_[`'J:[S9=6,A\IQHOU?[\HR\&ZZCR_DM<3 +M7A>?6VEAG8%>+X?>FB4-9B^P!I$ +M=?=`WX)'W0>Q'1*):SQ^PJGJG>LC.BLZ4\E&4M\P/7)20CFX2VPOU],TV%OL +M;Q\9YNH#N[]"?9W;+)8MY1A9H(W,Q833-L" +MYX,&A7TCV%H-C/V1=Q[,+9)4K_;5N1S4@*N`$\^ +M]-[/#QBPP;X]OAZWDC0STVV^'#VN2Z\5=%>,$TX*)277%A_$8BNY;W4C1>F* +M%.M0:]U`&H^Z$Q9:V.!]%Y$H+2!370L]<]`K)5BG-_/_(XS>O2K,"WP'>$': +M=KIAWK`\R/.O)-NX"31_R2!C/?2UX8R(_&YDVG^0\8WR8]R7M]RJ/\]#6\JE +M'5S@5>S-3\98XSP+>MQ&>T/W@O\'^@G`1P1ZD<;R"JFGH,`-U;#>1."(@8#% +M3C66&E>=[0F.,PMT:JQKU5C,,P[[=$+L97T)X`68U2F2WZ5&\9ISV!O<=OE^ +M1CS.^T$5)XO:?(F0-H$)'B\91LW*W]5H[=/^0/B)VH0U9^I9R_G\!C2TX@VG +M%!Z/>X;$8=#9O/Y9\.],"I]Y`YKD[[9QPU=+EF`3#/QF++>ZQ=WS<>?KFM@S@J;&F5?G`MX[:B;MY^T*44=[KCJ"*P=[GLX% +M?L!6R;PP[=5-V"`V/?*L`O@5O"4GJ[-0<^<^"WS7D!-SZ_;Q?&48ISW:0-;K +M8,IR:&YA7DTCG#0&]..+O\+N60'O!\X[:(VG.M>4]M.W4_[P,_O0W-=R"E@F +MX]0:QH7N-7NM8Z*ZP^$]#UJ`)?-:Z<Z5R3$.^>@]3CB19K$:R]U +M/$LX"$;,@_NX;U#7E!)W,I^3'"?+!>Q?C+8<(UAN[0-JN'-P)],TYJD'K<5< +M=Z)S\@Y*6@JRGTHG-L,MP88KE@AQ&%GYD9:K[ +M:O>O^^3YT$O[6*;*_"7LL7[3'3/>'??*\"'@"M@P(KQFT2TZ" +M+@UR83/:_'"?Q3(M.S\*9L;OQE_Z2)Y-4?[(F\MX494!.*\E_/"^3"<^^ZB1 +M/L!&>A_`_TASPAF]7)Y?G[[78KV+/#]HM0&M>!"P!9M;@8@8N?R?ZF4P#Y?_ +M,)5_/&^-\J8\L==V;OR5ST.<&\@M!6]6"Y8/8)Q(\RD)NCY.V"OO9XH/+=\\ +M@FXPU@ORI^76X76,"*F[X5_0,2(&+/^G^L@X7L$1RY3E))9_F#+KR^M[:'G. +MG1]!5WE^W!9&U5P:(N@B*"/:F.8FO1O"%]3=S^HLOKN&G2/"0U=@;7KT(X(H +M)YPT;I)GV5\D'(^\4<+Q2>)K_G43?Q#G\%N^\BD6UXH+Q$7B$M%?#!2#Q%5B +MJI@E"E7HC6(T#=4$,4W,$`^(.\2?Q5AQMWALR?<3A\3`[T7Q=_$W +M\9IX6SPGWA65X@/R>UHL$2O$6O%%HYC4DC&_6L[;7CZO?:^+U-7JO.D-\;[G +MKH^"SA3:NW>6>,+,4_<\8SX*F@_)\V!QQT=!\!+*\^%.$7$;I7E9YL>TV%]E +M7MI(2G.53..,^"CH/JC2WT+^LU2^-]/[>'6/=1/%^4S%OX'\OU?QKZ?\SZ'W +M8>1WC0J_CN+6JO!KR7^^\A],_C9ABH^#W485,SG+BCRYE$X$0%X6I(E@"G2(B*=#=B:ERZ`]7U:YKM>5F!'< +M>8+FF$_[PJSHEO!%R+=_G?4>K76G5H1T\[(ZZR)>.P,1]]VO6&9(TH&$LQ+L +M0;B78E\I=1%,(KHQ$^>LY%=0*W7&)!--#)MH@,-DZ&?&_H'V&UT\R9R>7`-W +M\^#E-[".+ZB3_"-$1X0HCLXR6<(.J7CBE3K+.G,/-4GN0:[@G2YH![ +MCF!]WGF@=W;$@C;<&L+9L.F)>I$?=%U,A_\>\J?_RXIWMI(R+_TIQK9]+D#_ +MY-597Z*.?U3V#%1_9";V1Y[L#XY_0IWU+>*?V3B^F1C_!!G?//OK^C@7`A<= +M5V=]SS*./2*AQ/BY,GX_Y-^ASMJ"_,.-\^^2&+^#C/\*XF?66=MPCK.FMNE1X[;SR_JR9C"QO'@`8O/3T`W +M?^\)71;K;'MJ-Q66/4YC-SO&]#U@'F-<^DLLF$SI`0_W[HL%2S^2,%&Z!7IF +MR*UJ@`'/)Q(V&$Z6D__.6+`2_I_%@JM5&K%=W<<\^*&D7:!G0]D"=FL^M])I +MOODP#\V`8=;](-LT?UD1T_1GP192,$64TWS[X8!U)O./Z'HZ]@.F?BGO36%C +M[#1RLYXIBN?C4KU%UN:B=A6ZGA7MF]^>;:29F5(_=A_HW"S015CG/;#ND7KK +MP`,.N9$,E`E="*4&Y$-B29$4V&-JT*/TQ#S9+6F/9W]08 +MB$'Z[O6\;Y&VPV@<^"P@-SD"^0_>WV$^;H`]Q6S]@5?LB=MJ4V +M>M6Y5)S/'_JK7!Y7VTBT.]:?:#OS,D\#GU>YTKGGE327FP!3?$>O8.W))K`F +M?)WUNJB(..K":92&[52LDOW@ +MSDPH#SRNH/T)!GVS:5Q&?QB,[S6%(?5<\?V](?@N6ESTH<5ZF=B&DN*'2_FH +M@1^.UO7?XH=C>4R]U-9KMQ1"?NTY@LUVT?&SW%0>J(LGU#JJ^`?';F%= +M\>+X+8?*#04APZ+BM2-:\/A#98O,XSRAC'@7`'D-)P#;O.F`-+@G: +MTIZQX#GU_IUU5E94V.<#SN\XP/2<>ZT\LYT2S;;=T0>P_M'>=8_%=N,V[;3< +M[=](V[V_*GWI/AK#U?17][!NVH?2SA%T/T"F9=)[176=71 +MN66,=\HJBU[@,S%YIE//CUHM0AU+3E"R*'UTYG45P?Q3&^7SI0AU4?GT!FYBG1]2YN`E@JF7*GA//0SO +MO2B_%PE^SB7W+^3"!L0,&4FQ?%$K[-UV#T/;"B`7<>`WTX'-P3Y2+B-)\![S]#QO5%DVTC +MGKZU],/8(![&1HP,V"\"'A">+L-3J1_;*5R*=B)N7Q7'399QN.X3I`TDY(>P +M>'XO8WWWR7B=B&:,GQ^''!G/]/S(_-',0\V\G0E\T@0[[2F_>KF"57/SRYC?]2\U2F_/=T7/+M7$A50N[J]F +MC^]CFP-J+88Y6E?CNFLZ$HUZ<[1'<1KAC330.S-JI8Z/E&R]-:U[OTQFF]-V +MM/0^PU!Y/0@]-Q?*O#HIOVBLGVV>+_U.5W[@H7?[2+^;E5]ZM+<-/AP)^X-8 +M]U)R5'@88!@EOJHZ3Z?Z +M-:VS>\9AZMNU<7VC:-MKH+Z6](O74U!?LFX3\@,=[LQ;;<7[>0[ZN;,, +M,^^DNT=N/,!#PGL"$$GED?=-E/:+#7%9>+[(TSY?-%/0V!^+`S +MX-ZQ+)BD;(^+BY996>#;H/4DC]:+M!*;[4KCC!NX9'N)I!U.\"A[+S0&F26V +M?8JD1^IMZG:$#CP5#IR4ZA"N';5-R:!!-[Q?ZB^D>JYO+PS/]-9_8QT7'+F.I?U_NXYN04,=A;G, +MJCO06-["@?Z9=B)TBM*)4WG7AD/#VXK0J2I<*PD[;&^N)^$$-3Y.UC+)'TCK +M$^`^BOJ?3[13>SF/:V@-!>[1XO?9N)N"3AME@]%\[T.K"]OE)1A\Y1?>8QX` +M'7![+=^=X[Q-4SI;S0X_66DQO^VZ@H]T#BG[;HLV+54ZICV02[Z +MF)\D_O%3WW]$S+;(%1%-Z4WM,EN#CGO#ERJ,%GRG;CK0 +M_6I>7FMI)65.7G1AJ4OTRFKJZR>=ZZC,4AUW[^8EM2RW_C*%K:.PUQ+"W'ZU +MN%^/%%!8)87U3TQ'N$BCL!*>]5.>19]Y4YY +M3GS%3GDW\E+?334HKS'?-*=5\$VVE5R;`A;Y:X +MX7J;8)K$5[0G8ME#EK?J4!6&_1X3O.UC-Q=.2EX6=/;'[_67RO/Q,B8X]FWE8LXNZ/H;OL/`Y$1UZ7,45X+=U]32GDL>)""B^+\P@5XSTT;IH +MVJ)B@NU&?[1$VD;>GVA9(F2V6%9_5FZN6OH;8V@S'R2/%\$FQLSM\-MCYK8[ +M\IB91Q]YS-RC_OF8F2WEF)FYB5KB2^7_\F^U]_`PFYX`LVYT_V^WOW;_D=N_;_^1V[]K_S]O_Z_[9?M] +MJOU>U7Y-M;\J9HD%LIWN0TNEK;S7`B'>G\?YW+^+6<.PCMVZVW)F4]A3M,>8 +M_:EE[H%M(MI3[!9\ILEVV`F75,W1V*YL'+= +MI7H@/U7F^ZMCT/L7<7YM\,M?%<.Y1\1Y.&:9FT6(=1*M_]'*QGK=^B=Y[Q-/ +MORR&?5'$W5B6D6YT;YMNV)GI1J]VZ4;?,]*-"ZG/"D:F&_UO +M3S>N&)-N:.[9A&\M"-XF64Q7PC@@F5]"#8`%^[;^PG? +MTAC]-68-*1G>D^JD9XB3]4QQD9XEANNFF*;GBI?TD%BE=Q&_Z'DB/;FK.#FY +MF[@HN;L8GMQ+O)1<(*8E7RA^2?64;/IK?WH7.^N&MIZ9W7H@O5\AIK74Z#U" +M[WW%\%0OO=OT;GI:=J,^Z,EC/V"I94).@W!^1306ABRR^>9^:Q#&YL0=UF3: +M\T'6P7F=8+7?+JG[S*(QO%2^EQ%.DXB&,9]MG(>6*FD[=^V.1FEAYY-Q[_3=C?S9KMUSDN>'=7>H +MNSOW_-WR[H[RMOBN?'+6E<']A6YGO]MR4O%/M]+L]'MC\+7AEI +M7V'@VWQ.-(:^#?/QG?+.L"1@B*C?J$`]5L>"RT#S3I/](SZFOKIR:=#\WP3' +M1?NM',#Q@/\9.![Q[_1#%O5#!^H'D_J!^N0*ZI.!U"<1ZI,AJD^&J3ZY*5/: +MW8`R2MP9HF_T6/8L,8?ZIP/USYPC],\?)9X_XCIPUF^L`V?\QCIPZJ'K0&O8 +M%HW3+2?+-<#MJ6PQY^^0=$MX!Z\!YI-++2_VF[AG?P+O(=N=MY3QIJ=VT]`1 +M-):ETC["4,_=T)M.Z%S1Q_4VCW#1,)OHD9*@S7<_LY9:9T'?30;L#OSK<-!7 +MK`(<$#RDI\BQES`128")8?0^1,'$3?3>OPE,$#ST_-\R-\QHC=468[`S^C\R +M-[`.KY\C]XXLGP">>$\.\Z*`1\JK]I%\MPX>`,3S>.0^Y=XEEM/^*\OYZ$/+ +M?6-)O?U)44'^NV,6[P6BA(]>;0@S[U_"YPP,7_?O8ISH7/JSLAF371P#PY5C +M\YG>#+;C(^D"S*L+O]5$#GCK)K9@/7SF/;N8YX]Y9T2H@'$KVU,-&.[&&NM+ +M=;=E=B18Q)Y##.5Y6<`\-X1SRW/XWBLEZDX&WUDBOVMJG'[V-05KJ237`OU9A?#WF[BQOR?O$P>3_;-.\9 +M2^K/+MW")>K\5=]+-M^0[]S>7)?FAH)N2;4S? +M`'[X?K:F>&6=DF4,`^`E=M[Z3O)>:I(7B^F\=:NE;`+NAQ2O%*^;,Z*XM[.W +M,Y^1J'#')]2UQQ+)LZQDW`94]-:UDIP*\$&E8&X1W*8'Y/I^+/CXY]=84Q4< +M@+=Y`'1O4-@71'N"5S!>=_,<3TB4V1%WY)(&GN6N2RPW^ET8_3(%X_Y>AGSH$Z$[=F!RYA>F$\TR#`* +MZUM*^/J>#2Q[,`*ZHQU3U\JEO@6<4XV!#FDQ2!\#6IG:*"9L*$Q/D>J]'T%S5WH-<,Y!NU?.'\Q\C,+[^+A:L;QY&>,H+]YWY=R;_HCT<'A)4'H +M&ADS4=IT-C.7L'XL)WVK)=9(O:+,%TYS1_:YM,&1V(=LQ_RV&NO/D`^@]L-& +M.]M"AVZWUIX0SK^`:[[''7S!?FM`15#G\=*JGJG9)<>`>OEWN0E"565ZK3G"BMI]B#S-E\2=W<%@:/RW4UO#:U@$Q]M$>Q=A*U +M?RF-79=E2JZILBB@=.G!CKIVM#`YW:`:JR6E8WB(SQEJ(\:N_LZ+PM)JXF'2 +M]GP\[/:)`1VZV_!]._@9E#[11G"UB_8IN$\D&@^V/6"?W7RSULH`CNJZ7O*; +M;5E'^W7=N7UB4(?.J:E'R7MY\.PR7^&V[RWPYX(GE.O=M\:RJ-ZPXX,V8=V% +M"X:%0^!RW4'KM!)I*S>`^$W#5Q^T3E?A;L?US/.9DIBO!OO+FPO!Y[J%QLZ3 +MN]MRYRR1/!;#*:]YM9836\K]S'U\<)/L8\SO5M3V=&&RO?M3:JR!JJ_7)=XW +MUE!:]#/LWI]48Z%]*83GD$\2\B%75V[RX=KWYD%:-V7]SIJ +MOBO[U;F2:!3`T,+%$L^I^8GYD<9VS(2]A7!%&Y^2J<99(,W5NL=;&&YMC34" +M\XC6)H9]/<0P`CA@^'4D_/*XM*FQMA/\8]R-:)#EJ:"G:8"NZ_AN!!K4U[''"+_0WERUFG&W6)>"5!Q?S'$[L +M?^C0VAWMD9_32<*VNW6?U3<:LA$VHG1),H]/1],&#@+>2B]OL$'MCOW98OS: +M/<9\@*O72'N3F#>XQTXKE?8`,5:&(_TS'*E363RW%+(@DK?KF:468!%Q(^ZPFT)L.&N +MV6>-HG9A[,%O;(Z(PT9`QW:$>X-DF$XG)$ +MP-WK1Q%&J/S"0GG.V%\MK"E\ACEI,>]-6=<\Y(`@<]5R:3`7NF1P1GW^8M9) +M@;M?,TV>$?BBG5C_(\/= +MT1ZS`).]4+_9NZPM-$:,;R?LL]((-K80#6>6[5,T7%!W'?F^!30<^-$4#4?? +M!M*:IPJFX78KF17@PJ8XUTT^:+56]MV*QYQI@M&[B.: +M+61CKL3Q*.ZP@!>%`WZDI6'[G6#F?/$K6IU%]=]59$Y1>,(;!KHN#Z#OA.+@'TGVB4D?_ +MBI1B6Z01GKUW0Z%_\H;")%H76#[%+W5(^`1A!=9'$='%Q`V%L&6F01:'W\=' +MTB<5%?C`AZQT98!70\,=J%?*ZZ>#OH6.RJ0-0V%/35-\=TP+0[\EX6B61U/Z +M1N!B/\[C_@SR/FK]#S.P_P'M&4GAL1U0P7>W%',X3AD[;=THZ+B#1O +M1!BY\NY@2C[;A/#4;BSTX(Z07-P5FK$/@F(:Q<-=@'"H_J[L#__[!;"]!=T< +MZ(L8-K1I#7W!]5KY@9(A=(O/V"/5*-TT&-\H0O$]2]F^EKX +M',,H"5=H/O`,2)T72>5A72\I=7S0?:&'Q_A\T(DJ_?S*ST]^R+9I>'Z<"<8IT,=USIX!.[>GDYZ=Z3L\YQA?UAGW3*>V#3?,,)\?].:_$ +M?&9X[M14/IK*1_\OYN-3^?A4/FG_Q7S\*A\_Y^,YAOO#/Z1)'O/TN/\A>4RA +M\LK#MC#"F2(M;&,,\$[];XMI[V7J8S>R73]G)>&RDBII7PXZI:>\;_MH8193 +M%]E"GV!XHF6$&^=G)M56LWTYG=89X4>^I9GIR+."YIL^C^J5GRE\I3;SM6%, +M?66V+_E]78^631?Z?+M^+"OF4_WFZV+J^V-\NDLN?:>@C>]G:A4N^XOT)S*I +M+K8H1]QJ@J4GIO-W/.VT]\?X55J_2NO[%]+J*JVNTOK_A;0I*FV*2JO_"VG3 +M5-HTE3;ED+3YU&?S*&W/Z;`U1W.'OJF_4TK'I$-OIR_?YCZGOD_C?@^/$5HI +MC6DXTA+WR7HI]2G[VSX5+YWB:=!'=IBX?HY;:A.%1G%I_+1Y%)XOPZE,787K +M1PA/4>$I1PA/4^%I1PA/;),>#4^''O?Q5#^S)#S,0^^BPM0Y3KDYANB03.`U +M;_RNO.L'5ES?O#ECL<4X72Q--HBN,TH"%3AG,A]8S'0%_(01R(2?.VTQ=.DX +M[H`/I(X.G".<^H%5%NU1)GD4A>);?*\(.M+=:7NMEK2V04??(??Y6756*[7. +MBKLV-^)/Y/#,.NNH>#CMUZ`6.[5)'#.CSLJ(QZ%]'.N;B^OGH_72'?`S\QXY +M^XD&,H9F)H:9;_]L88T3>RDL?E^G=,_P&A4_[TOYP'*&;[+,,SX(]J5^XOYK +M%>\_40S^9-;'X68372;Z_M;?5P)[]VXVR^SD;!GJ(6K*%G_1NPO0(]4L/]R- +MOH53QOJ>/3C;PQH+RPJT+S&C9D&+61$[?=9U$3&;]C(!ZA=-,XYG7O?-8>'3 +MC$P?;*D6TWZ<\J"U32.:#+Q,I=3Z3$?JJ#2<]_0R\`\%-A;&8IO#8=!^Y1KM +M'W+T#,UK&$ZI;E3`UF]''?LE[(\R14?)OT5US$S1*`[E5:89MKB/ZIM#;=BF +MF[A';UE=*,H\1A+.O-([%M3%G$@WM$\C7*CRP)F907$RB)[((->8A#UR1SV# +M7)R595;`C\+ICW?AUPP3?,9I@_G>S"3ZR1>=;T_[(A;L0GE[2OH4$)S;7;06 +M1IY0LLE\[VH6Y&DX3W6SA?:!I('7+U(T>&71?WGL<&8`?E6V7=+CTNXT9MP/ +MJ?$QI'=1S/M2R$[SV$P*1]@62/TXFC2.!(N@"5'7)ZH*_>@S]0[Y8L@.&^#3 +M#FS@<:QO>TF9G;X3O+;4+AK;?*3I2$->HAOFID5!T(T^R)+%YL +M,Y1.?;/O`2FC0G7C/H4]'/#6>`*ZA_84V%OR>!"=Y%F]B'E%<\!JX&_G&@+51[*PEF#QCHJ\*BI+?4HP_^?F>2X:VE^>`N:N"AN1-Y.1'&X;X- +M1=K8ZD)/>64R;,-!SR7.Q)+YKH_&O^29,-N>ZR#U_7IF]S'UU&_ +MU1[:;X^AWR*)_4;[$1W]YM`./*'?HCD.S8=AZ#?-EZ/[H`L4\O#H1W+]Y":1 +M:TZ28\4Z8PA?UN]HRI7VCN@J-K4)F'S['2P;?LIS4T'::$2XT,\#T?3C]T]P,TWT)*5_'A +MX[AG'K""*D[;(^5SV@&K6NT!6?\V[NR/71PTG)MUWK>G2-LIIU![H=O#/7IQ +M\!311XY?OH(KG#V-&U_LJ]%$78E;U!8\U-`)\1K?&0T%__>\;/!NV1'LYR"? +MD=@7D,O-6:-OX\ +MP&@[V.30(//69:OU8*P/\P"+IW]D'91B?K*A-=GWHBPWXX!UDBI+4V6T3"@# +M>9H=&\I`F:B+F]VX#-KP&P[.9+$&]EK,=SK0)R@ZSC7R(=-BSC5ZP?7*MB`? +MKEO;K9('V`G(]&?3G.BNTG>C=R>@5WB295O/6!0LIW<^)TR)SSVW2"?1QLR*+< +MXQKC2G-[K96CSH\11V_2CXQ/?ZZU]JDRR?#CW^N..8L\=B.S$9B[C,M,.4:7Y3RW<3OU6F^T6M%5/U:J'H6O>;]X/U +M=.VB]RTG.CZ?]18INZ&P,62.(_C4J_E>R:.XL0=^'R!O- +MJ;7ZQWGU:;ZPO-$SFPZ5-WJTUKH\'F^^WQ;!P\@;/5QK#8C'07]0/HWDC6:! +MQH$=.NA`3FXL2>AI$ +M^TK+F;Q?\H'=5&.YD_?+.\T+'<20N)70LM\8%@,8Y1[X?C_=N6RSG!T_("6@A<]-FR4_SPV;):_G]9B5;`5D3Z&#? +M)FU.`O[2MUFL;_2GK;*OE'X*-W4;ZYRX)YIMFW_::C_,VJPEXTPK^C^K99>$G3XCF3?5BN9WLVO +M?I9R7Q^0N^QGEC-V5__,=$:4B<+RGNN%A15BV-=[H(L=R_J.1[>J'L-4'?LI,C^4^U +MNH7,5[>>QC\_ZK?-\3NI+P=)&4/*(S-+&!GMB-)7O`&SI7PB\ZAG$HPXC@@Y +MMU#?#/W)%"4;%)W<`G3% +M]*?H&_+]L"&,O8-Y8&&][DOWG86-]+%Q/MXXGV0G.SJYGR[J(#.)\R^']9J+ +M8S<7LOUJK#,9#666$AWK"'GGXVY;6,_38+ZR4.DN65CDX#X%^D:H+V5;Y+T^ +MYR]L:;=KY'M2;^W&F.35(-1B_D2XV@E(6Y)8:U93_U(^^:#';Q8A\(;:L(WB +MK2I,2F@KY`JYG;/B?54%^KI(ZK-2/`8X(\2=T.4TOX%C!HI07$8=-*I[J?*_ +M4OK+/_E?K/P'B)"6&/]"Y7]9DWS.$VSCRBUHDD]OY=^O23X]E?_Y3?*QE7^? +M)OG\4?GW:I+/V9CTM[Y4#TNXAS"L']62J/J=X* +M3XE3GY=Y,J71\R/FZ8WS,D]4_J?*O&+C%]EB[,;">+H3H-N>PD4G$7)/:E*_ +MXV0]S*`()?+A=LR2>C_<8)-ZMU?USI5EX2ZO)>X,VU&].S;.FW9@,NZQ,F\Q +M1>-]&9=AB$RAN<,0UBC_5BI-9KPM9=26ZOJV/(^]/X4[:51>1D-YK&,Z1;6E +M54.>[!]0_NEJS%+*60;"G23G*'3,$"TZM$/4C-#>+)//-C2<`8%W;GS$AL[, +M,M.F>,.T$H]#8<..)EI4TAX>YB7A.+@C@FT&RH?#*`\^BRA)S^@!^0QR(8?N +MC7:O$':ZTA6+;9^_2+`N=L<'"8!='WOV[YD*YMB`.KFI@%SSJ +ME_:8Z=WY<:/%LO?`?>#_OWZ?=3]XB2JEWF'6>_O#1J(S:'RA6PXZ@R`[3OUN +MK*5ZQ,)L(SX>GW6FTSOTRT//9@MK%:T0_KR'5?K[22H*?<6BAQ6FP!ZRUG +M.7_89U]?957%A-2IWGEAL-&Y[;Z]UD@EI\4XN6:!W"=A[8&-Y$^KK/4J;6G. +M0K:K"WN@"(^1X_ZZM^&>&.FW+[!"F&-7[[#RD&_%6LMI)^ME_AK/6]J7A@UE +M\\,JRXQULIO2[&RG_/N]5D353=(2@PS8O'1;T1I2JO@XJAOJJ],>RUQ89;VF +MZ@O[:W,)V<\_99\%>@%P];V"KRIVYQI;U/M) +MKA-;(&%X#=6!YJOS/?1%#XIDO$ZT'NT5?1Z/X?&&C6^O=4:\7Q+D24W:'7A>VQH4 +MYVR5]5I`>2ZF]7$U_6&/]1WZ/T#_'R6/2NXB37Q/9;@SJV39&(,?&LKJCO., +M5_=:O1+AX[4%EJ[V*SQWB&QU*F.6NT+2C8Y88SGK99OZZ:$,MVG&OIF^XM4I[(J:W4KS^^ +MUWI,I07MBGJ"%\?G)>Q#?[/G?EFG9:J.LQM@TJ3]EX]H,O?V*BM7V2"(GY-- +M5>=D@W%.]D`#S,?;9[ZDB66E-N/HK>36T7\K^O;;F%5>*@QG$_5Y$L$(K45. +MMT^Y_[.`G\"/03!1#IZ)-Q9(F\B*CG.G-[1;_(W"!U=97Z#=!'\AAL=!Q@GD +M:O%UZ)VO.#[KL:4\(Y1GB/+/(KR7!YM=X[*+D]@#-V\+?,V7Q)!\TQ]#F3 +M#'??F/=5/;R@;=#;JS5-]Z>]UEB53NKRS69=OHWZ@-M>&]L"/F]/PYQNOU'. +MN;X-,`JY6,BRFAVKK`+@3:+]TVB/V5W)L6+-RZ5]),Z;G+T$.S>%&B&3Z_9NBXQ]%!M_>()$<),L<1 +M'1Z-Q3CM--#]MIT!'0D567::3U!Z@MV*V6'A)]SL%Y1>L/T5\.M/W2=MLHL] +M%N[?TOUH'>]'/=+7IW/2-3>QZA1Z6"[71,%&NU?H&LS +MOC=Z<:8*?^3PX<:C,ISWW4W"%V.]FKC=N@IP=NX"GM/N;5_QOH_Q:/8"YKEC +M'4`XX\Q:>DDWQ]_8S@[![%38J4GTAYV=Q&_8V4GXCMO9>1#X])J]T!^6GUFR +M-.R+;@XGC=U2..G,!0UV=LH2[.QHSX1A9R>>=Q[!-FB;Q#JQ?9U+]UJCZ^MD +MZO5U2;2O<]%>:TQ"G/KZ$6UWWS8E.[8U%AQ'<9KJ/G0N_SE!YR&-&^12'_S1 +M/!ZS$+LX +MNZ)2B':=,"D[$W341+@*7SJT-G\P5\F.7$%NIFA^FI_FI_EI?IJ?YJ?Y:7Z: +MG^:G^6E^FI_FI_EI?IJ?YJ?Y:7Z:G^;G_\:G0A-I@_ZG*]'\-#_-3_/3_#0_ +MS4_ST_PT/\U/\]/\-#_-S__+C^\(_N'\/F=W._F4D[N>S#8'1;^B.\U33C=/ +MSK&$&_6\1P^MTLKJ!?H1A` +MO\M%?_I=)BZEWR6B@'X7BXOHUT]<2+\+Q/FB+?W:B`SZ'25:TZ^5,.C74J2+ +M%B)-I(H4D2QT$1`=;DJ&WFS1X5;EWJ[26[/[K')?DV[:%UYQT.,1:>N56Z7<[Y6[G5R-W-W*K5%NBD]X-4VDI2DW +M7;D&N5YR6RLW0[EME9NIW"SEFLK-56Y(N1<2%/B\(JU`N?V5>X5R!RHW0FX2 +MN4.4.TRY-REWA')'D^LG]TZX/I%VMW)+?2(&=X)R)RIWLG+ODV[ST_PT/___ +M>OS*?7DF!$`]HE*YD!'TD0L9P21R(7/N)Q>ZE>&/)\7SMI@B>HENM`YT%7FB +M"_U"]/M*S!>.Z$Y^HQ-\0\*C44I=\^D&ZT%N?IJ?YJ?Y:7Z:G_\G'@.JN6GU +M]`F-UL4\VN?D09Z0UDKY\*I:*UVLIYD(]\4#A-CB%0*ZJ_'9+1Z.'8^F,O`U +MI#?CX?38(B%<2%W@IJZJ?1DUC.OQO>3),T/\W/ +MO_=TA9S_"*T>[]3[?PEDI37@D[C_5]`]K_Q'R#CXAJRX&]-$+\AKTQ_9-?T[ +M.Z$+HV$*^R!?3O]R_!/\T^A;IW\%_@G^&?1MT'\J_@G^6?2=2?_I^"?XY]*W +M27_H2SGFW^FDPSS_#NX9/6;4X&'7#AET[7\H/Z2O..I?;\.0ZT>-*!I-51DY +MJ&CP:"&N>NJJI^#O\?%#)7C)45_"YTG31&O-DZEIN9HO3]/[:D9$,V_2;,WC +M\7FT5(^O+=4H_BXCD\^A\?_]WO_O?SQZ6NO,W+R^D9O4-W5':MN$\#1\-\0Y +MY+M)>J_'(_Q:DCC!.VK$H%'7 +MWOS_6?DH\);AHZX=-'KDT-^5P"L=@.6HP47#+QW3OTE"3014Q(.Q(V?3O=%7 +MACA6I(JC5'.D^HZLX@7X-#]1+M"&2E_7Z_8Z&'.[Y]\^N/)K6 +M0'/_"\_-UQ:-NFTD#4,37-]U!)'Q].__)R%VG"3$^9<)49TDQ&%H>QB_)Y]5XC:<'W=4`_J-&%XV^?M3HZP>/ +M^CUY_V^AYT>.:;0T-WX\7B\5[!5>[W^RR,,^_\E;E@S=>]5F&KS067V+[YSU +MM[>?/^'6K,O;=$M_/B4K<'G2N[X6+9,"R:F>^D9A)&GU3PJT..YL@@SGWI// +M/3HEX\SA'AYD+_R%./O"867/+OQ(OHN":VZ]ZVX9%[F?>W1B_I2V1^N,-%UYU4[A$VW/QA('#=E_2=8V^_Z'J42]<5MSCA#3]TH>O[?VGQT-Y +M\\YLF?*ZE9Q^1NYCQ_[QNTXKK[]HY?BY/QW;>D[[T5> +M^V2_VXO^ONKNNRX]YYM;__3GH_8\/>PM(;J\%[&S-RZ[<]L;"];UON_+H1>, +M_';&NIE;7CY_XHW_.&'Q#Q>WW;9XTN>S+K]N1JN/IQ@_^GVET>UNKS%O'[_Q +M@EWSH]=4.E.2_M+CG9R^(WP[OAO\WAVW_75P?I[9[H?T@S7E979^Q+R[;_/:)ISZ\R:V<>.?N*Y72?\7_C`A +M]:.IG9=^OF3O\W5][ +M/OW!LV<]>]Y[Y?"_?S75,^1O:V=7G??:%[4O!G8=__%?/YJV +M^\<^F<:GMU1LO^7\D0-SN^TH7#KJDC\?MWSW/K_BB^E)?L^^UEE/O#_HAOTOK;[^@:.O>#1X]EO!;E\>]?.K)Y[6\1]K +M1SPW.?#,:6^[GS'5>UZK#\KKIG/[OY["Y+GJHI_^71O??%6GSV[K=_>Z!_I$#SKGINP-V; +MCWF]N-^FK;/N/S?[\HTVX>-C`2W:OZ;I?KW[HA5'%EYW00T][^-+>US[^ +MI[S0F?-26EJOIR?GGG'L8]_]<66GBZX?O_*GN:V/;3_GBM%=3S[CI/6OO/;+ +MU0>>W'M[O[\7W;WJTKN^.>=/MQ[UYZ?WO#5,B/>ZV)&-V7V/;N@7W]1[Z +MY<@+9GP[<]W+6R:>_X\;%Y]P\0_;VDY:/.OSZRYO-6/*QS\:/G^TU-T^IM?Q +M;U^P6=$WQV^P=_=\=Y?;\L?;.;]T.Y@^L*;2R_,S.AT +M^B)KP8;3YU>L./FLAPHOWUE7-K;/LA??WGSJB9L>KG2/F3EGS1/C>UW7O^0/ +M+Z1.F/K1TLXW?A+J_LR=[U2W;?^7V[_^PY`!HR_*Z/#@UVDI?6]Z\_NYU[P[ +MO.>O'SQ]UK.G//G)F3OO_?34>WL.O_*KOWNF_FW([+7G57WQVHNUNP(?'__1 +M7W=/Z_.CD7G+I]LKSK]EX,ANN84[1BW]\R7+CYLW;LOL^:9H?8M)+2=6 +M31^7?^L'*YZ?_H4_:9\GJ_7[3]PPZ*7]UZ\^^H%'KS@[&'SKRVX_'W7BJQU/ +M6_N/YT8$)I_VS$EO=._8YL$/S7O.>SY6,.:IL=[[KZQ)=MH=?>U7GY]2OF3U +MFV6+.K]\U1T=6MVU_-FZFS_KXAH^ +M).']]Z[MB.<+I*2DQ.N!_S(A_\AP-5%G+]-*,=TCOX>H>.1/>-KWNY&JG=WP +M_K)<>9Q'9G)VJ,/OI0^.]-S,'81EU1".YTVQ1?PH?G9>=IP)KS[P>]*/OFWX +MM9*N_J]1T_$11"MBZJFB[^/R99C3Y/>O/#>!YA]QRQVTCQXQ\I;!UXX:]?LK +M.;CHINN+1Q+$W#*<$MUZV[7#!U\;3UWJE,T@2L/1)@AO"E->OP]J1H^YZ9;! +M-R;6P2/:>J$3'$\J>H%S2OW#U:-&/;'HZ\/E89KH%^JL"4*,I^\.M*VO+]WG +M$5/7?UM5+;^R$[",^.3EI&6D9+=JDMS4R6[=KT_Z8G'8=CSWNV..R_;6[-Z] +M9^^NG;MV[]R^8]>.7W_=L7W;ME]_=Z,US5^+IRXJO\G===>NVW8-WS5L5_&N +M:SX9_LFP3XH_N>;5X:\.>[7XU6L>&O[0L(>*'[IFU/!1PT85C[KFLN&7#;NL +M^+)K3AM^VK#3BD^[YJCA1PT[JOBH:^X:?M>PNXKONN;J_\/>LP`W=5UY91LP +M#P>,,5C\+[8Q-I:_)$`@`619Q@KZ.)(,<5*'/$E/UD/2>^*])VPG:3&A.\UT +MV&RS3=IF.KO-+MML/UNZG>SN3"< +M>]^39#YI9MJ9;&=T-9+NN_>\<\__G'O];"L/)1Z*/#2X7EF?6!]9/[A069A8 +M&%DXZ%)<"5?$-5BGU"7J(G6#I4IIHC12.IA4DHED)#FX1=F2V!+9,MBL-">: +M(\V#,Y09B1F1&8.WI"WSXHX78R]N_Z:*M(T_-IX=5\83X['Q[<=V'DL>DXYM +M/S;P4NJEH9?$EQX\M?O4R"GM5.I4_-#PHJ>W?L +ME?9N/[_S?/*\Y!IU::Z4*^X2ZW;6)>OB=8^4[BQ-EDJEVY.99#PI;1G=HFU) +M;1EJ'FG>V9QLEIH?)KZZAM>OGV8_UR&^I;78OXZQU5=7__KUC_GII6_^HM>O +M.[B_^>;3)<1AX^/+ZK!/S/$Z8L$LJ\<^B]&^I;0Q#]_0F(.GM"4_WMB2@U^V +M_/7K5\UU9U9CG]/#X7F?PYMK+<_#<'A^+^?+I('Q98XSOA#^XYF79EVIO#:[ +MO*IB3F5U[=SZ>0TUC?:5\QT+6A>V+[IS\=HE]RS=1&/+$K6INDR]L7RDX?$5 +M8XU?;7IRY;[FIQW/MCS7^MVVOVK_FX[O=]YLHIT;9[+G^JY.=&YS5Y7JE9J^EW45.3"!<2WM=KE=*$NS>C@Z<17P='76Y'LYBK[,39R^Q +M7EVNQV#HZ"<-WGZ^%5-() +MNC3Y\"UG?`#FNSL87`6I-3$3Z%55?V[_9>USU#F?HT73,9Z&XZJVW3IL@J2^ +M9*<)4,9C>VA4IQY%-FA8U)-P7:[DY[$FZ='$M$1[1266DC2XGD[S\YBAP@_0 +M$!Z<9/DT>2F^WAUL)&-\[H'+;FTH`8Z#7"G +M&5R9F4FL/OZ+J3S<"P#WPC[$Q>$X'@ONF@6W:<<1>.\K8_=NS,T7KLM\;^S` +M/D(.,'R%=%GK(SYKY'G23OX.WJ^RG^V&;7WP'8;WR_R:_"-\_Q.\7S>O?5## +MI(>TUBC!L^Q<(U-L%;:*DOQ`16E!OZP`$KNVJ145Y=;EM"GY&:M;45Y>7C&] +M8FKN+H%_"OB=`\*&YZA(3%2)&A9=:#<"U`C=LJ+B`+,A;83-8;/EJHJIQ$Z6 +MD,RPEE:&^'12&MT>5=.9K,%JK=P]ENRPZ1DI:FC9="9IL/GP2!\6=2XLT2;= +MD%N/:P#M$4\K*UG_A7W801U^]*\_>2\\`BA3_.Z_>.KJDP?_!\IKZ.._'OM9 +M;EO1UE[:7DVFL<^-9I\0>R6!:`2?F\HVP2>K@5$2N\E7X/5E\CB\;OU\MFX^ +MFZVRY[)3)$EV$!EBT_WL:>S\L]A;V+/8'M(+K\VY)[#Y,]C\*6S^'#8^B3T5 +M7E.`KU+RRTG/+)E;&]WZO\0>4/5_UHU8]7':A\\>E_*7UYT2<@ +MASTE7P?[_EG)STL.DCWDZ[;G;="W'5QT$-8]"%'1?L%VY,S1D^,7&L?7DA92 +M3UK&UUYH/#E^YJCMB/U"5=4%^Q';T3/C)QLOK!UGTV3M>..%\9-'SQRQ7;!7 +M5?TIWW^M9.K[OW[GG2EOKGBK_LV)U]Y]^_CYB7*Z>/'"R^6OC/]BZM'E9];_ +MINUB^;G3'YXX^_&U\84?M[U+W[ITYE>?'KYX[KUI[\R\=(?=7MM2TOK:G(.7 +MCUV=6K.XOD:H.%YUN.%$"UDP^_K7O#+WM86_JZV9-^^3\G=F +MG6@H:VZ>M>Y2V_6:!G+OV8:CU__]TANSKC73AH99,\K/S7NOYL/?G7_M@U?> +MNGA\_J<-TQ>7S#T]^S7RSHD+AR\=/RN_+??'#MS]>B47UQYY_>Z]??7J]O=L[G7<]\6K\\?Z+L_ +M&`KW;]WVP,"##WUI\.'MCXB1:$R*#R7D';9*LSN3_;371LI*L>%C8$*>E9*R +M,OLM&BWL5R^PVY^!=Z7Y%LRW=6VGBQ;9'?5V^W*Z>,&:YK*RV173I];5V!=4 +M5U?/JZZV,?F60!S&6F,*D(W/HMT!&JF&B$VA$NPD&R$+Q""+_#7Y3S).[K$] +M9?O$-ERRH/2_2\^7=4P]/.W5Z0]6_/FL9^:\8)^VM')%2\?9>R_ZED:^]MC> +M[_['H9%/;82_7L7L"74,(?="KQY664+FF?HU"O?8-L'Q\.[=#SN$6^NYU![> +M';;G3]EL+*_@>PY0O1&NH>(Q3QB0`X&=,WP+^##/IT3\F2-?U^)Y&G`]'2!G +M0&:Z`W+:+,`T&]0U!R#G`I4U4"/,)PO(0K*(+`:ZEP+>9:06=%I/EI,&L@+D +MU$16DF;B@`C;2MJ@4NJ`%5>1.R'/K29KR%IR-UE'UI-[@/L-0.$FXB1=Q$6Z +MB9OT0#[MATMB!SB[`/@1S7R//DK\E!\C/R2%RF$"T(2?):7*>?$1^2SXE5\A5.O__M +MYYX@>YZ`_MBQL>-C[X]]>^RYL6Y7(![7)5:L?>-[/SBP9^P?GG@6)_:,?=]S?[Z,FSZCVHZG:3/@&_<:CV651&1P6]!_G[MKP[HU=W:0R;5? +MUV:3YH(QIS5H-J]9K_8E#0,KTH^AW2ZD%5NQ%5NQ%5NQ%5NQ%5NQ%5NQ%5NQ +M%5NQ%5NQ%5NQ%5NQ?6'M<@DY<<,OH/QR^A=#2K$56[$56[']_VYQ64L/BYK4 +M)F>&.SO;V]N\'I?;'W+_,==HA[:ZO1V_.];<->D;6N>:#NAWM'=TW-6Q>O7J +M5:M(>\?JSCO7$-K^^U'_X2VK&Z)&*4E(6D32C-O"#6F2:"1$Y7;SG)GVW/>? +M2*.?U<+NH"]$G?YNZ@KXNSUA3\`?$G#"X^L+!,-.?YBVT#ZOVQERTZ#;V4V[ +MW#V!H)MZ_*&PT^OU^#?30)#VA[`3[O6$8"+L]C:ZFF@HT!/>Y@RZ!:%;I8IJ +MT*PN456C*56,42,AZ]0R3-IH)"1:&U+C!E[6-M&L8L@I.JIF:4+<)=$HC,:S +MJ=0HQ3]B)"!T7$VEU&%9&:*&I*5U*BHQ&E65F(S/0NBMM&N4+80`L&969Y!P +MG[6(@V$70>628*ALBB-2XYPX)TZE)<5HI9XX`XYQ-H9E/4'A%EWEMSNL"5D! +M.TNE!+:>-&FU5D$PG +M?5U.!:TTC)3EJ(9^2HY*BB[%P*RX\IC@905-:D=6B:)1@>*-!/!M2"D!N5(5 +MY#VCJ;%LU`"+Z\?;XI/4?DL,BJJT,"PTAT6PL"`M:$HY>B!D25F0LM9*0]G( +M#BEJT,^V5H?`<0]IH@+X`)C9`*XJC413X`B[P&+AR@``/2YI8B0%`\.JEHH- +MRS'HTJP%=;11KF)#=W(/-`(%@?84*Q` +MAR:HPPJ-2;NDE,I-$+63%A%2$96H1#-9+:/JDKX><%I($28FZX8F1[+&9+\2 +M.'\:!<-K`;UIH'``XNKC)(N6,+FWLE69'LRX`<(&9P1*=$&3]"3'#0$424EH>8UZC57*="$:!@B_K($(LLY\7K&#W`' +M[*75F!P?==R638LK(:9&LXA3Y&:4D*,)$!O<$T4;$I71&V);3@9`LZCK:E06 +MT`N8, +M]I>&U:,JZ!-_C_*F\`M7"EL6^;",D>$%67`_$O+0@"F59=$+ +MI9&)4X9Q=&+%NFHRG4`#_4;EC(P&8+DYB@=$J,68\7&S^`S?0F_?!4X2HWHV +MFBC`QTR+>5M$,ATHHH+]T2@>`:ST!CL'$K0*`!DE%$D!3\I#B +M`.01TV8=S#@E%G&15N"=@=/A0J'!)!A.-(7FFO,^0Q6X78'O@N%E<'4!/!V]5@%$:,T>26IQ$ +M)&`T;@8H6=FEIG:!!,'%))U)R,JN<6%R'<;EHT8PT@))PYH,JF6Y,RYCB8&/ +MN0)Y^0C.E(LA(D^3N:H9KW7NJSI6@]RQ\;?BS/QY"X(FQ1OP#7`\@"C,"+@S +M,'."+K$08B"/-VH+PKC`,FTN6N6,`M7+K867);ARW+0\TWEX^FN%=!&5,IB4 +M*"#+`!DZYF0K^F`@D95"T6$@R<6`@A`&_CL"R^.OKR.3P@W$FNQ;:4U!DS+C +M3(8%(6:32&X,_1R<#F_3FGSJKJ`?R +MY32W0EA0R#L2TH1#O)0!_<:DM*@E=;Y]&%*AO!4"V_SN8*C7TT<#/?F:F&]D +M^@:"GLV]X5!KWL%1WKELB9I)@TMK8%?`C!S'4.E@"1`*%.[I?&V,NT"3GF45 +MJ\;W&3PXJ^85QE#P;%".`>;%;A9R]9$C3SUD#UC2K'G8*-A1%#P:PN0P&S2C +M#XI<1+9A-XJE/!6L7-'*P.&E(!1$X3*,K-&SP$)Y";S)L+AY86M)V%4A(8(1_AH@F1VQ]LN^@ +MDMEF((IEJ``4*U8,OZEJXU8S+(.U)R4I,SE^QP$(#1PH`',U*R_35I$>SBFX +M038=T3#9@U@9/H:>EST8P-.J:8TH/DV6#%$;%6`6B&&,M9GNFA(C4DK/A:'/ +M8V>6;PB3?0+8![<&A>4D"OL4GR?LQ*TXVK;7X^SRF`'<3_T!ZMX*,9V&>F'[ +MS7?;N`/WA$,TU-_7Y_6`5S`WX+N=0#`D=+D9$J^;PM8=Y@9HM]/GW.P.T6V] +MSG`H``B#M"<8\+$YE[,?-I6PL--ED8##6SS^;J'1XW=Y^[MAL^^@VSSAWD!_ +MF.:I=5!O(!2F?<%`#Y#CH%UX+.`.\3.!8+"_CP,!#0@G>/Q`CH_=V42=00\[ +M0T",L&*XUTV!#`?U!;H]/1Z7,W>KQV^*@X8#"(*@`A>#%0487`#&@]L\B,,/ +ME\AY7[_?$_9LA1%@@V5&I]>!YQXA]_W]/$_BK4*HS^V"?DY*!1)P,.E33\_G +MDCSM=:+TX09G]U8@I=MBK2\0"GE,-C!\];MZK=7`+H$1GYO>UP\BZ?8P)810 +MJ+UP1UAP/P`:"#'%!.EM+(5QZ_$A2=T4)!)T`G/NT`V\(JMY05CKPZXF0%WN +M8-@)UI;''Z(^YP!(,DR=P.H`>D^@GXTYO7!#KW.K6V`BIU[W9L#&`S`PZPS3 +MK<[@`.URA[>A)":Q!;&MD*&>`F)A!914+K)[F`RV`K7=M-8)-A6J9<+FHO0. +M,'L4>IS]7HS[_7XO&I[[@;X@?,,L.R3I+K0*KD!$<9,&A;P&NSTAE]?IX:Z! +MP.AU>2K9T.9^)UZZ47CFBHZ<^$'(DQ8U_0><(\S$R40,<&#-R&\!:A"'SQUT +M]<*EJ5>'X`_XP6V"@("?^*`1@+,Q+V/.3?N]UHKT'03IND"1/9C%5 +MXL<+$*GP>`!/JJ#JABT4-?]D`&Q16:&%50F&-8AD6:BN1C&*6R +MQAJ092R'8$@CD"6@^,]`(09Q-R4KR7S\AR0AI?6"[32&0S-Q%>Q&!_AN!&@2 +ML*Y)R2(GR<&VI`IL9%.34HHCM[\U4?*BW#QKQ#]'H.KL3%"XH>1O%:9/%]"6 +M(;A@:/0ZM[525TJ4\5!`D]F!(3]!N*%FRM7R0Y`K-"6W+Q#^CWVKCVWC/._O +M'2GI=)*HUXIBJYY:GAPC80I9H14IU@IC/MER[0*.P\8RY``I3%I29"VRS$EV +M8AN:_>C^?[>5Z^<.-,F#W(1]D9T8DD +MT&=\-/,5\MM>3$C>$CX`:\FZJ0C%N?!W1]B#42\41-)D]XZ/TKIVJS#,VD;I +MUKA*$\8M+_2=]-FU)S/&`^\X?'AHDE/[@=XOD7%GP87`])'0=%B[#ZO2@QO? +M@898V9`7$3Z90;@[X;'8#Z,I:E^)%,.//3:LHN2CXQPX@['DX%0(C'09>:TB +M5(;ZP<`\@*I58:*8T&.9T;&C*A,;0GK/I8OA8\,3@XH5&2\$0AA%I[TX!(6_ +M'AYR"SV5YW:83[-QX)$I6QBE\"5=%GN$61IP`]FQT4.C?O4B$#I5JCH34U3H +M/#%X,,,2.#3,(9`YB6[&,A.!:`#)U2&*`)@J%,@C_F!RJ("%8WD!Z@?? +MG#21,8X/928HV'A\_/"38\-#(X?Y%]X`0R +M'KPZR/17W$2,O8A6H- +MC:IRJ"J7J!1S@DH,)/SMBC'%08JY,^+4D>$ATP^5$0@3_:@0[]9>J(;!P=<8 +MY[A@F4K^1Y\HYOR'W4*X61S"+:E2X8:Z@!WC.)UV&!1_O`B=4!`1L(-$(I!A +MKJ0;"DQ\H,Y=$E-//HWA,!YZN-^"T^A_V/>*UO8,T8!S\B*#J<)$G"VMLK(H +MN95ALQA,4W:`,%L-=HPO(;Q'QUQ3XA+#-3!LLI0XNZDP>`>V4)%^U"LX#A?G +MQ"4@-CT':&L%&M_NY0Z#7/`MUNOV=NSI,+>K"?0.'0+ED`VK4D?OH)I>Y:/,Y:Q,<:/'=&T2 +M$0(YU<3Q+'/,S82+XFAEAI1IS(P52RG4J6GN>`BF93>Y(U_T$01Y:7M_F83[ +ME0^>ZKKE;ZPS]U(L,'0T.^8[M6)9E/R*6[S;P4[;LU6!J0;G1YL!)7GJ%WL? +M[N[LZ.S;P$].?Q['2YG1JEXQD4FI,"\-50>?E28 +M#U5'CHP>.E3UH`XK4`S#OY+MO=%)-PCNWNY-8L6G2EC&R +M,"_KH*C5WX+L<$?AHCZ\#`PM"T^IDU!UR"=&#U,5V:1XB#T2"$4U4>\]9N)Q +M+^E'Z(>'7X>+E.0)VQV'%+F8?L:(4ZK^=D.SZ-KTPQNN`=WVJFLO,5>W.?P]]7*P>U!S59ZU%"Q+Z.H9/E^U#%,JL2:F\G +MA9;I5T2IRG%SY>K^T2,J_%C9A)DJI)P,BEIYE7JY`_4+TK0;#=;XU6K3]4-> +M\KI"4,AK]6/"]I7*U<>+0?5D.??\TJH_%\LKK"XKH[INQ*2W#V4>]V+_R?+( +M3&V,MU?NV\U>%5SM$$RV!WY@ +M$=A!4/LN;C6E8JU?O=)A/E*^KU[J*=EP/5:RV5XT<'[Y>G18;2F:)<5ME0+= +MY,:WEVMVE)7Y5*4P4.O"T^VI?JLW4.3KW?H0E6I7*@*:7A'0JT-3@>-ZFW4K]3;3K[=5+K=9MU)N,W]>N_LI<7<5*W>]&OU-ZC4 +M6S=;J3>75^KIC?):O;5"K9[C;]*5(#-+BO546W[DH;T=RTOVUHU*]F;EDGV% +M!`!J>6L90,`PT^YK(!NP?JELP`R(=FEM=\]M*NX6:[JW7M(-.%?S%RSI!EVJ +MFZR7_'`!&JX(Z9;G`D4-%UZI3.+Q3/E#L^@/W9_0^;]/\#=C)[U"+VX?]TJ- +M%2N^9@8)63'D`D-W9WWO^`L+H_A;DL^_M_ +M?OYC&?]_C>=_%/^[^?Q/]\;P_,^OXB\\_Q.>_PG/_X3G?\+S/^'YG_#\3WC^ +M)SS_$Y[_"<__A.=_PO,_X?F?\/Q/>/XG//\3GO\)S_^$YW_"\S_A^9_P_$]X +M_B<\_Q.>_PG/_X3G?\+S/^&/?<+S/[>P]1B>_PG/_X3G?\+S/^'YG_#\3WC^ +M)SS_$Y[_"<__A.=_PO,_X?F?\/S/_\F20'C^YS?A;]GY#_=SP\:.S@W9CL>> +MO`UCW/#\1_>FKOL[.\O._VSJPN/P_,>OX$_3=?'26[I8%U??+;1X3PM=+A7B +ME9JE4"L\]9H-E,%]W8G_4^H=I[%'3,>;="%JA8;KI7A:+&U!VX_V5#KK]OPB +MOEU&NXI60(MG@$+;C_94)N>A\.TRVE6T`EK\`%!H^]&>.I#W4/AV&>TJ6@$M +M/@C4H)AZ<3#ZOB[F&26GS^T14_L'^[^O"VMR:P+O#_(ZKO]TL%`H_&Q1]36# +M&5__Z>/X$E77C6F^=E%2\U$.4$$$KE_&&/)W8C*I4&,B,7=I4X)&1MOFG!06 +M(82(R:@>DRE&&<#SW)[;0,AMAOBP3N2%91$=\3C+*/[FB":?I54S(T)W#FH8 +M-7+BO9&<&C$ZTS*["A?1V19N5;/QZ)*5BDZG4WI4)/.,BN8<(YJ;0WL#;<&( +MGM%619]!.XMV3ELUSZ@_K1)6],2[(UCU4^MJA!4Y,3,26;)L'G$I8R^J$361 +MU)YU#.U,[RJB@-\W^FR[5KA'ZCPB>J?WZ>G6F8%_609%2P'Z.G +M05XO0'*FMJ1?P--HSC92C!(GWAV(YM+&C(;Y1<4JZQ/T5RU6$9*XG54C8J8[ +M]08)CJ<%[NR*XAHRES+P>=*RL%*1PE)%(8D?X_)&^_Y/O[/ZYZN_,"] +M^[?NYS^XGV_B_WD?]4_NW1\&=<^Y'"<:+C**KJAY=\N_R\C-H)(WA4K=$%6- +M[U(T&-F(HNK"P,P2*.FBZD6#C(JTT2+`$W`[QRC061K"J4L2%46'(:XM#.BU +MX`-DUA#C=7E&U8O==5)TU#6+6%V+^-!L%6^:EKAHKA?GS(08-^<9U2YVFTG1 +M87:)F-DC/JS=+-ZLM<7%6@O<[X,>+*H11G&N46*T9G$1 +M?8_789)`M6)$"R.NQX@)C-B.$9,8L0LC]F#$)*,V8T0;(_9AQ)T8<1=&3&'$ +M?G&N=I\8KTTQZ@Q&U*87+CTJ=M>F14?MD(C5'A0?&F/B32,K+AI91AT1YXQC +M8MR8$KL-!W,[B[>:,,^3^+1F8CTY1KU,6@]-QUW0J\$X5HU/4'HJ&I-MIK#R +MC-*F!0QI@^QOB:83#?%Y)",R8.QF)QGU%A]3&;-F#QBQ*0^M[\V +M,K>EMOX8+`G0!M"+:O83,7GVB9@D>]'\!1Y5UHL-!O5-W))5A*)1-/"M?"1O +MC"2C5AK)&R/%*!K%>%WPB(;X>AU]TKH]2UH,+03Y"(:I-9`$E/*UUR5 +MDIPB=SVN!/F19U0EK@3Y,<^H2ERA>4&R#>+!(J,2XD'C6ZVX@%61XNO&.E@5 +M4;LP,(LYDJ3+ZI\GA33/)*/*9UL^SQ2CRF=;/L\LH[S9&F(!^@38B6[X; +MD:VO1:3U%Q&98]3Z?$0F+D9D^RL1F?Q.1':]')$]WX[(S2]%I'TA(O.,ZIN+ +MR)WG(W+7"Q&9>AY(K)G62WY7PWKG&=42%3(9@[2@B6\4[LD-PY5_[ZQF0%;; +M0;-%1M&[+*]XOYUE"]X+$MX,5`ND6]:P/D)R+,C1>LA3`G+5#OE*0G*Z($$] +MD+TDHS9#)NUC11D3<_':/B!V`KD+;Z08E8*T]4/:]GE^\K_9HVY+N93.,JH/ +M]-X)>N\"O?5GXTV1;\:;/C/]_AGA_`FL7(>18U0SZ`VK8?2[]&X%'V"9C/7@ +M#NR&D:]1EBE6"\M4VX4^83U@F<[!,IUKQ%J-?>#Z/*/:(O@/<8UVHC>5A'?1 +M04D-W[O@2VRB5XV2>YMI/>,^A>!;?4!L!AVCH"/,*:&J%@;P#O?1@R2MH +MJ]9(#V-&TE!2V&$86`%%&,XSA?OZ7#XF(+C;@76H^9BP?0>L8'R]&+AN=%Z1TK)7A>4>>_ +MV*)(.5XGGK;3LE9%?%O2B&:SUDYQ:F$@QZCJ>F%7G\3<*2[4%D8L1+@SZ`1GN%^D%;9-1KN&)/A4BFCZP),A(!NT62:4`R91W[ +MH2Y<=<*J)6'5.F*RM1WV[/.P9PG8L[MAOQC5OAY7ZV#5+%BUS\7DYE;8L[4Q +M2?I#WB]5YTFAT0/;*O[<(/\HKKW'UJ!5O&$DJQMDEE$M]?"@2TOWU.,.R_M2 +MO(D^=]`G=#57I[3#25E>A=!U&<5( +M+*OD/S`#+-:U)C2J1C$T1O6^M^$[S2W)J+E/U)Q\C;T#&FLHC24)3S'J%/*. +MZN:Y%FB);3US?D"8PID-R'VV?IG<0ZJ#^D.:DU,H5W\*AK]+N4?@LK3?I4H"REZMV1Q7I%^QE;JR)CG38P#T.<@IU% +MEG&!K`O9^P9%K_=`GUE[ZW50!$C.[I!`%TY91J%*&$F%BBP,4.]U>$H(C3)I +M\B=3O>G"%L`;5,R$%'Q*\!UD&RD$/I*3<;Q!4IU5?;E6MXML/62T&;+:`IEM +MA>Q:D.$S;XFE'B6AJOL'+*/1J)*XOM"6N%QXDZJ;$JVT)?@/V<)%1J265XPU0&>$_ +MNA/._J7[A)C+?(0W/BYLL&7,&_',&SJY%.`TN87>HG6V_MV7C6O_.9!D%&G5 +M1S,JNJ,8D_PMO9G_+N8:L9M3C-*VJUGKQ*7S-6GGC]Y11J.Q#BC0RO+3"21Z&\0JU`)X]"\PKU?'7: +MV;%TGS,%>LUL,)AFWPC0*Q:DUU>)7G_3G1"M-;#F%VN;D=77'X`NT)=[<9='H^],NS;;H7A5H9CFQ5'+5['(*/*^ +MP;E482[UZ,/YP[4)Z+PEI=_7K$@'HXU@K))D5$M`=XCKSD/@#F157/LQQTTI +M1AT%A_X2DN?\$;BC^K4A/;8^#8G%3+*,LG](10WP<.;';FQHV568]=>NP2+@ +MC9R:5^`]]PVHOX7X:ZZ6.)]7J.\@K2;I^4H\X4<'U)"I8@45& +MD2U05@`68%:X5N"O,\*XD!$/M"7D*C>J/2!._(173>O]JZ4MMIC&>J.]*1%M +MLY,*==*R]27+(6W@V3MDH'ZBUCO=:Z<8505?P:O&>_X;UX5-;QABSLBN4K&O +M;8H+!G0/^G=^1UJTCJ3%\Z?3SMUUK+FY5H(4#K&54;@M8U7^)5<`Z_Z**4%M`:YR_JQ#$? +M+8"634P)1]T-\D!I7CS]CV_!_2A45-F)V1J2V2WIK>^@OY-%:Y5J4M$CV3Z; +MX_N7K^C^6T35&CS+-GD2[7R\-K&21.<817-HG+8/"MG60OW]#ZT@ZOA]YTOF +M13D&/?F(4*",\TE5@M?-J/R/=.2+L9(1:14+%Q7-%EU*+*>"1I5AJO,A6Y%W +MN+&O9%G"W;/07..4S30WL#Y:9U*AB,;L$!2]:*+..\4UIQA5OO)F5_99<\]5 +MMV09Y?SSW0GJ8_/;1'.++8BFJWYMW,NI$1W+<-S1%E[1^3LXGO;HG[_#\U8? +MT*K78G!(HC>?9G_*+LFNIVLXRROG6 +M)_>QS:E:RQYJMCK@;]%#KEG9+U=.?T2C@5:P64XREO#]):->O:)67R;%W-L,Q&ORKEG1Z'/%EO)'WZZ%[F_LS>&7(IL.!9`KR952AD:_0D>LE[ +M$D_O>EN]19*>8U1DNLTA&TAQ>!5E)K"#_=`*K=J69#'SC(J"(W4_@\5T5S_O +MRII&;]!W1KU/,T:64\-S4KY1Z+VR&NO51*]<]&=O7%)(CW<>#?\%UW*UHJIZ +M^N]7=/^:9=5%)AF5#=SI<]>FZ!]/OP(.I51?KGUAZ^:BR09ZUUE&;7.?CKOO +M][W#\LJ(G;C.K0YR^]7`K,F*>-=Y1ET-]/YVX'J7.\;\:H\278$5;`Y<]^!Z +ML802]MM%2GP0H(I<0Z@/WBK>.1A`CKG7R35>S'0"[ZY>VRM_"^VSX$X4W/F< +MZ&5TBE&OMZM[>FHFD^$2!AC"0#H0 +M,@T&NU<#1HVF)D`2$-P"D8G*HV=D<4#45ED7(4RJATF8\+)T\;&((;((Z(*T +MBH_]="6N#U!1&W65ER0!)$%`FG=()M/?^9US;W5U3T_PCYFJKOK5?9Y[[CGW +MGG,N1AOZH"JH5+O(OIW"-9%&QSHSG]`\IWL9U=^;M=3>$N@W2S?Y9#NWFR*]:HPT]*+D..9D;3O968H1CN@RX4&6HDMX2Q0<\*QR]]`8?E_; +MWINFK\N,"GS2\;HSO7&T6C_D0\NXDFBB)-)0PE/=A7I:D/XIG:MVUOK1XWHNU]'(@K9'^IKE^[E6&D+K58S$ +M$G%VH[_YC.*V8?U:39/!(#$4YUJ:,.FXZM.S&Z4B0H9SK3YD:8!Y:U/OEQGU +M0(P&,MB2;.K]"J/B-#!=SEQ6J`K*2K!:VA^4S-R%M)_@6[.S^N#7DSHR5/H\ +MHV9CIQG]1D^NA38]'KAJ;"F'OTN7!I1:H=6UB5Z4^BNH^WI/AP?;5CV>:K`X"*:U/HSKK/LN9[GJP +M3BF.D93+IGQY05TBO"&X@K@DI8MTZNL"Q+\8Q:L#AB:L9`2T8]!%1MEOXN@; +M##I%Z%!RC*38>(NFO +M@^@T^-PDP@G[U;Y()CI*D)[WF;6)4C:A@A79'U42"KCZC\,LQ3Y-T;:Y-\9#7X^2'4)N%A\S( +MR8MU*BH?\KH:Q:XG!RN,@FYF&>;Z,O\H='<@5PFZ4U&Y,WC8U_XC,J8[YYX +MI/[&,\]\0A>GI^5(6F?&T@H%A;>NO"V6G=A7"KVMRH=:NL=>DYT_%O^E3J:D?:4O.]:[[W[)>0O^8!U<`7S%CD\IGQF9]G.3G3 +MY5&SLZW&@#]OFIYV='J:1EUL0%E:V&H:#&UNO@:]D&74-- +M4'U_(,_*C(KK&@VS"W:\"%V99VF5=9@)HM4/I%@3APZN>J4VU7EQ3MYJ7*.< +M.L-I@7+I^YN-).M,+8Q&QX'4TOF,S+4+"[V.R(+31LG!L[-^1F@US7P*J$=^ +M);,5N)6FT0MN5634T'SLA'M(* +MGCHB:]%ZOO2C?(.WZH:$ET@UKL?DYT=TG\:\2'/(V#F!E7\5I-.4&O$%59)O +M5WV+BHL1@G6/7Q\2R?G%^9E0WC8A7 +MINX>`-]!>70BP7OZ=-6H?X51/F8[13+8]2M(/]Z=TU,K?/SN4K+^6V54FM+J +M,K))L(7F"4:@MVG_#'EY/+33/]"&C +M^IK60;FMQD@.IE9(J;PJ,RKXY6Z:X3[D)HBW@V=H,^]R;Y$,7&$4]N(2L&J< +M7.$M_3[-M1V0:@LC`>9?=\RO'B8<,_9V;*BXNS:?^&N[5C_9S;.H/MS.R'N3 +M6?.,BLOR]1J0!+]Q^ZG0IGQ&)4@#2U-+7-6M,NE1Y2=1ZKE[WU%B6M +M==L'.[':L['=4X?2&]7NM:5D?'>1G!,R"D^ZZINRJ/, +MJ`T*+7'W4&**TNK>>E!M;8)S0AZS7J[U5R1'DA_V5L_JX7&*7C3#OI5>`)2L +M6$-_4<-)HH_)TBEZZJNG\#Y8C>[S"^S2_K,LM&!0I%1J=%M@0I^X:KN#WHV +MG<5!AN;N32/J!N?3(:/<@+21,'-QUUA"IVZ@T=7]N*>N3.KDZ%"`V:\LY5J_ +MB;A)P5,W)9@?7GS&XCFI,8=W=;'J4Q%4QX[!:UX@:K["4$K3&G>54&;4_C8#$?.SK +MW-I!I1_F]OOD[EQ/D"5-[,G!(J.N99$(LXQM\\V>17=-W>:%)D?B?33*H$VD +M@L-T9!:\">V@L8%8^_*1N<0PA3+DTUT`N!6C95*-B2+PH\F@FP +M3E?`?H7"Z,TO%!Y-O>VX6GW`Y&+;;5NM'^WF+Y3V$HD8[>9L$2TUWH_%A;8? +M;1\N:.I#[-Z$"ZU,'N]#C/[)VK,#.VMW#*B3=N?*"PW=2WU4UFU5DXJ@;'W& +MVC779"RM@Q.H)EC!V=A?J`J*9H/@)[7-VGH1H_1_2(IQ#23OG;B +M<(DEO$8TAZ:X=7=TY/OCY0J6$+4HH98XG?B,JE.+H+M&;_/B=%+LE[:?3BUQ +M.@FE7"VH)4XGY7[I;:$6]8;6(ZW2'Y^1LTV]L\J,K2JCFD<8.!4L2!9E9:== +M9X6BU?!D[>CEW&]]H,`M0])C_=1C7B&?M1*,]-O6#EXI!F?:B*]=G5+S7=^D +M1?UV(/JMP^7=:O38O]>H)H5AM>NIP2*CG!M49B?Q0!VLZ@Q&79;8G$-4YMUN +M!W'TC!=*6B3!OMO9H"?<(UV>7Y/4AY\7J7F-ZM!E4ZXCL<.I?D5R#9+>E9F%&:GR=(UG3M+ +M'^E4.W;EI)2]ZO$0R`,:S]:"H9_X@/:,NW\Y]4CQ*J'!KRYZQ +M?1(*BGC@3+P>?5(65$//;*^/WHTR>BM'11Q@8YW7JU](FP7[J@Q6BZN,`M4& +M^U".AH*/0$^=1/.:^:W?P#F2D)LV3[@O.V1O%;_1CWE!M:O,/-AS'$>SWVA0 +M4FO6)TY^`Y3,])+13F(W5V.EN4M*B=66:"+<'; +M5*9YA(2,*ATA//75RT_1\9'RZCKIH3*CQKJ%RT8]=*OM(1DU%Z@J +M*(R=_IE[2"^:WD-F[)!,8"DJ+RA+5ZL;Z:IK/BAJTT'^(JN!<:FO:RRU+6]Q +M4>.LT%AJ+F\/R:N+_I%9H;RH>59036VGUN_*51:)#C.]+/%25!=9Z3%>EF;J +MUD>+#C.]+/%2Y(\6Z7'Z#!5),A?OROF,`HVK6SH*,]D\%!D%OXM%ZMI(IE@% +M+0RYHYR3R@L9Q6OUI,N"LV&%?C/)*K-@HT;4B-7ULN0(;1?ZE-56Z6WU]OK^ +M7(51+\6>%.^HWW_)W%>/MC+YXMA;_/I.5' +M:=T52^L'36D57S\M0H>,5XWW\#0[,H"GKHC2;]@',%Y]N6RQ;SEA<&^V'N;SUJP[P=M3-I?C6@#K +M_NXNMI_$'DAPE-2S(CE2;9OKV1:K8S4O/41/^OH+P>]R;%.FG'H941+]3ZR= +MQ*PS;'GB.F7^GYI[B,N6<4]SIFI#P2NO<1G]?[+T]<#_H[(=KWBW8$Q698=Y +M9?:5WFR14<'SKW'_P1Y3]=3[S]8H9)2MUWZQ>O$75"/UW[EL^9^BMG_ZM5R" +MM/IH-^_I7K&AV_%:KL*H5CT3U\BJC(JW0*:%5JW?)+/[)EZ;.!Q^K(^@)EN' +M#DWAFN3?-%,/02OK-K7Q35H#VKD>JT<9/SDUX'5#8L#*,,84?55D5*H- +MZ_(#/*M`RV8"0G[0LD1-G=?RHDM[*]>FT:SE3?%]:$,K^\1 +M__F^HSK:C&T`^->;;&]O?U!627OL;CBU/[1%]+A^L^@*,X]^M&R>4=-'/]%' +MWSVG@L[4@A-/\QD%N2WHGYV%/!<<1O+RKAUL1X:<@P6SLT5&(?]@'KU=<_?0 +M(VRKF':U:W802)<)WVPUL*T/U5>^9?&LP7N1+:,._H +M/K%/%CU?>;.5?4OP5YD@_?I0M5QO:M=GCJY:#O[8DYK0548=0'=>:A7;]AR7 +M7J4Q/H]5JWCFVD7MJ!>;^=%=14]/)>3I]`=^[(Z?YY!%1DU8E`7`!421:]9 +M.XP>[RH=R2T3,@K6S88<^Q*C2@NDY8JU*F54J?8R=K4ZB%G@WM0]:]!BTZ/5I +M3\T5>]O\,=-R##+<"BG2H-`*:;KZC$(KN-#Y4M"'?GQOJQ/VEQ#1HFM;SU7C&L'E!,HC[+6Y6,L%7[I4:=1HTX9JP%"5ACE +MIL3^K'!'(S)!/"@QE?:JDA;)W?&:-]:97A_+*(SAAXDGH!4Q8L$)=NTC]K[T +M19Y1_-TZTJ]6@QZF][I_K&T)]+T:C/5ZVO3ZZ:_EBI(CC5*Q&,#HDC)UXBNB +M^W'8?PG*[.>5N/'4$MBNH'P\UG_4E2T?&W&`[W?-:!5<.?8?F6NKQTZ;:SW4 +M\^ZA'_S`46_]R@H=T&_]%J#>NBX=V22P_CBW.\NXBND:62_Y8X7[4[/TN^;W:0#)T5&55;2[U;$KG\-9FL]/ML-&>68 +MW7A-]#">]O0<>J,HW8Q\=5R94?B^Y5XAI8415V$44L5\74ISV\?2).V)ZEJ- +M\.D, +M.J5\YTX$;LI-N"KQV&"54;#S'J:GCGD*2Y("_5;FMWXKHUIXDMCZH6;YMQKZ +MXOJ57II>OR54,Y]1P<4SUX_WM]_:JNV)VB+?!_AQA8):JK)L\3%'94[&R"49 +MQ5F?)JG2(\Y2\LJ,FL0NJ7(B+1/[ME=3'_CT11OQQHK4,?9=\Q<=\.]@%+X[ +MG;[KA$=H],6-!?["+0WHMTD3I:-ON["C15^M'D^[BRE-EK_>%I5K<[JE+0#J +M[TM:,TAZK'M@?8)1.VXW7!?M3_3OQ#R65-^M`Z&D=<,M`\[4+27FEM@%'TM[ +M<^UN/XVK,J-ZIK8.J.O;/Q5)B]JZ"V\/V)4+V,/B +MGH$D\<-9+XF=5?5M=NXP9=/-_)#E^[=;^5[DN+6%,[]!Z-*`FRH-N6J]8M^^ +M/*,2[90+:6V8Y8^#W9WCZ>5T3=#U!+KZC'+HU_'T*TG7E71-T74%7=M@20#[ +MK[=;B8]M3"BW5():(/:;9E$WC%`SZ1SHA[*@UFP9DN]N[6BC7G9',T&*KLK) +MC+`^Q*@^MO8,],'C8D5RZ)UB5;*S]NP`YK?JVVVKJB=J+*6SG\C&?NZ#X)L[ +M'KB6ZYAF5I%^C]"M%U[5T;:/K&KJFZ7H9 +M77U&M=.O2U!JNEY*UPZZ7DS73KJNHVMQJ?"<3##.=5(CN+\B=K^>[D,IEZEQ +MQEBVGFCJ^LCM\KO,J%5(/2$VM'^\5VQ/WF7:[22Z5AK2VFJ^_9A!?-2T;'6I +ME>]_L%D05QG$E;&RZ7<`M2'V9"+6,T^8M/.,^HSY_MH8^IK8O<^HJV/?_\CD +M'*?LXCOBLVCS7IJUE`@9%7EV?6O_R!X9X[++R!GE=U@>G8)EQ!I5F-P\3]FQ +MZ(ZV>\$9R6SE'9',I&0G''XFS7;;54:ULMM6AQ^2O6QJV9>">*>EKP?` +M'^!O0A)>HU4C\:]W6FU.G2!CI]4H\=]IZ\B6`K`2N/I@\5]$76DL3I9FZ^([ +M;3]N@HSIUKE19)U-'"I\9U1'8U]U\J-U2R76JFE.*0LJ(XB>'SKLH:5VPV=D +M.^\=PLNQ(BC2-V&;$/SPX*R5BF"]\PZL,OX\EZV^4Z3'VI"U([OH?RC'9$!U +M;,]:/4TOXSEMMSQA'>_=G5GN@[?.8QNK`/Y6C%H`?OPO'=GFNI:,Q:3/J--) +MWDK8EU+:/:#\Z6!=6T*QRG7>9?C-JYQ1'YMZFW+457E\4INDL9.WR4$5XX[^SF +M^5M[5OX*3IHO*R`_[,Y:M+-;2I)G5"O?G#C=^I+6>6I&KS.@BE[4$J"<-FGK +M1Q\4[LN2^S'[9T//2C!MUM+_S?NS%R[+4+MH1L5X9%1B$G&+9LZQPBC'I*,6 +M[=^R?%7/SNXS6T=L'M(#4GKJ[2,Q^Q']0^,TOFKNGQWETJR?9U2D#3KB[ZBG +M,EX/S9YM5-X;G';M"XK*1=]HRU'8GA)?S9/5@R*C@`@.(6JNOLJK1S>H?K6J&4*U"=V.5?27)O8')W5;83ELH9*E=94%C/T=VRGTEEN\C(A+]. +M4,[GY[(5@W(+P3BA;G*':[5;!MC+]>5:?W!+'X^C*J,6?-M1Q9)XG*-,*">O +MN&U[-<=2[G+FODUU,TB.X45:YTA^>51'*NF>M8I;A.57:/I_)?F5KCZC2J_6 +M^C]I2OPXE3@X(]>@V149U6K%KL'^BU'6^YEW+]1\V>-V$EI=(-X;Y>56&F). +M>^WCT';9RM*9*GFL;X\/Z,IRJ]>J*V_R53!0X#UM<,PQN0$T^K.BVM9O]KM?'5G#Y> +M/B5-!)QV_0(SGQ$?^PJ-%.,=GS_^]?@7TO:/;]3P@P+62C0-@"ZUW%TR,4Q: +MV7RW*#FN5SY\+_"4=;,T;.;D=\^$XX:"2BN_)QC3C$@5/*P68"7CY'4DV8!_ +M,6IL?R5K5EAW-/Z^B?V,9D=27X51SD0B\M;$?O;)I14ZA6=K,AS[H2HYPF+C +M\O7B>6C\6-)3"0\E3T]1SY\@J$PO"359Y3J%X+X:K]9\*;9.E#_!T#-/(J>$5MJ,PHU./T4GNTUB1Q1`9TT"&K4Q6I +M8XDT@!->S9W^E78=K*"Q`YDP)>FAG-45=A;%:$TR!Y8VXB]M>ZT$*E\C;77N +MW.Q,-IYY1C5[837WE,^H+H0\(.I5XUNILHIZ:7,'CXR.9#9(=V:+*^TLJI[= +M(W9W1)&'/N2H@X(5>B[]<7LQ*OB[([M:D"?N2V:[C2RWW4@?Y956]OT9UBYC +ML;M2A_9+'DYB227*<:_VJRMGHL)(XDZUNWH54.]%SQQ/-XL1T[)?_*0'8%,I +M]WE&$<63O/P1MC>=^)&C>@(JG\>CA&=Z?Y4ME\.<(Z'[`HX-,P(%AM3A'H[7 +ML-1[I4>B22&E>0U=K/_1'0E0D+95>\IDY2KV? +M_I;0W[N:_JJ,NL#\PO4(^FNGOT[ZFVV>ZY.`^A#=O<.@+HBEL=S\SC,*3X*[ +M=O/>;'SD1O$43GJ]4K/77C$W4 +MV/.REUEE5'.=FFNCW\5U;.)$S3PHSZB($WW&R097=V29/WRRSH-\1C5SHN"B +M&`\Z+9DM,JJ9$S7SH)!1S9RHF0>5&35CW:A6J$F%45(?C[+*D&R#G>;`<\9E +M#G:(RJN,2J0.9.0YR./E!74M21W0F&B^#I*2AHS1986OT"CT!66]BCIE#+YT1Z-L7A04_(;^ +M9%9$C$4U2]]$&[V40GBRE2?$_VL92QJ=ZV(>2[]>E"V?+/SK;I+(;K60O7;@^Q-\XI5;&KV`KNXBZV=3O4$Y)*/B#3U1KKT?\&`;K28*%_N,`]O-ORP_F1IADR*KYRWLH6O"RHYH@EQE_W/C/6*^^.YL>X +MMY]9L`?[V'9:]7_S*C'T\R-@LLZLAE<_T,L9E:9 +M-;K\/T=I'2JY<)R!^"R(>#",0M0!UJW^.$?T/J.MP%L;>109%=R=9LD_^)=Y +M62NGDJZ9L9[MH>1HI<%9?=%.^LYL=QY%^6!^'*"^OF< +M*#::FI!T$K`+>;(NUYNH!AAI +MP9ZN;%Y04_5UN69O-JS&^;ZA'*S1%A&G3G8QY*UY/E(T*'F+2)QV=9E[?)?X +M5(2,6C)!_`&1J1"-D'1W_';DM^?0[[))2^QG.)(-I>F8JZ7$BJ#VNK*U=:@J +MJ-/VR#R[9MDPQS`*7.F+?U(9>'CI4X&Z)F\LS+N)8V`M[(W43B?NR?'>W]$J +MDS]5]$;))/,&+O?KL,\HFPM\U-H(V6F0/OQ.J"^+IQI^'Y5G +MED%V&^3IA`P%U;GIH-7XKG-3[YE\#7H+?"WTGDO7LD%M[E57MO>JDOB(.J/9 +M`+TT*1%S,A5!)1X;O#K=]':G)07SMGV9Y(=*X.F%0+J$@+R'-N6E= +M/*VYO;KMBCS0G0F6+4)&<5GN2K:TC.#UK].L[MZ\?@99(GCS?KRN4SG-SK7H +MZ55V76=X8<.Z3C5*J]4:;7"!I*7?$T]KP*;U_L:T\N^9*:U5,0KW&363]TW^ +MJ&Z]>%&W+C)JR1M%>GVI-%NS137X--8[-FX_%;LB(:.PLJ_N>!DKL,/HAY%O +M.'!NEA'R,94IO\?*)JNQ:V0LDQ(?$3Z&9UCUK#`J->H%L)E0*<^Q:2FDI38- +MJV]T#EG,Y0PWBZ>#KQ8:=)Y1_`W52=!;IJ%] +M1AV>VMKA!IUN[*V.,1K="5(/Y^BXI:@&T# +M=^T8++[7MCW/8;$686HBV&!7=K*G@U= +M[0F-V*N0:,/;2-\^0^0']AFE5K^<0\_8'K%]X6+]G/JCR*C@%_5>@3\+:A+OCU#2BO=* +M;(1AQ1(["&5&Z1CU\KY";'R";BN,ZC)Q'2$9J#L.RS(7F-L?E:+**'"EXPU7 +M4EN.R-J5`CL.]*"5K*P'7)P3./].LLXW9Q7R@EKZF[(>1:_ +MQ5D9#5X<14;M+1X)8N&&C-)!NK[#"0UZ+K1J0_NSB'\Q*CB2RA752:*IPBH[ +M=3!1#OU5!(4G]-:]7FE^$_L"O5]EE$O4%AS^^+&L529D[_-7QN<.S<\>W*6VS'QWTO)PKKK8RT][BWH2, +M:NE=7[>@<,TICT\GP/C+L3O3[&'7I*[EZ?+/:4,#76P:2U-M7D3R=?Y^M8]S> +M!_MR<5KS&15?+4C`.WB7B>T[GNG%"07%]PG/D3>HIU(B@=I8:1Q_XGVM>BAA +M]URICNHRI572 +MBJ6.=(/OB0TW8BRH4MK5[X_&H]EIMCG&X_+F!357>7VP/<+Z('(VMIC1^A>C +M]A:/!'U;9)0#+DXE7_43Z'@_&5`)L_].VI-+]V&]7/O1S/:K@[.]B7X7_K5M +MH%4GP[I'F5&URY?Y*LAX.MFNF]/M3;3KBJ1%/)UKG9[ON27EZL1*5R5(PH4$ +MN3[M51D%OP"6TM&Z5`X7>[=V->KO.W/Z`T8#XU+:MVRQ_/3.',I$[_P\H_`6 +M5.<0U;4].5TW\AG5:J%$/_54^8.:.#.(S +MX"G>ND3-QR!2RU1FY)BQ%;K:4*ZE'9B9,][29$E_8FR]5DGDNJR@SQ1:'=!G +MTK?E75:+$UUTU2Z)VI-GU)(VX:5G(1>.(Y+AB#C/U3*%LRA'GU&!X_`>9D!U +M6AFLT('944(I4.?BF99R'$/1VV*6-V-&SPT%-=F>92GC-#?+?TU[<^4SK1S- +M>JR)&M]\K9P9<1,\Q?I9/TWZKN>"YDYG+6.^6Q441R^E=H:61V\K=\A;-2'/ +M]5E`'6#>_K'I;:]YGF?4`TUOYYJW2\QSGU'V;9]YN[3IJR*C#C5OO::WCGD> +M,JKOOQWUI9*\_=+E"9VBMS>8WS?0[S*CTO1TDWFZB9ZZ]/MF\_MF^EUAU&UX +M0JUQ&SWIHK:ZW?R^G7YWT^\JH\KF:9F>ZE3&O>ORDMZ7KM^C:X:XE#X;J!^4 +M6,;QZ-H0VS^*7\@H&U%Z*[RICCDP:[4EJR?Y9PM%SRL\\$-'+3AQNNT0V^<( +M2A5X/?J9V8IY;`HVCX^\',WAX=E6&CK-2D-/+Y`Y/!9'O2SE:F7C9M+O[%:J +MOS^&TFG+98FKAHA;WO)S+GV/TCBB7 +M]]I:_*F>OG].?'YL70NO4)2TQB2G1=V8J>87N+U^%&NO3V)T<1(5R#G#U09=6[L6XG! +M.J]P)IYY\DP7@"J9B.,V/<>DYYCT\HP*DG&4)@W:9Y2-07KAHT;J +M:*+78L'V4"2G4IG>"_3Q*M*<0D'13#Y",YT+VX*W)[(*U[_/9X1,]Y/>[,>[!^P?C]D-<,^JQEV*5(^1`<1C8[29E24VY'S>2RJMQ^<96LV +M>@8N[`_%Z:M9KK"R9Y%1\2BM6=+T@^=>Y'4ZK..K.3MSX9`MO7@1%AJ]"-=[ +M'LI6%A1B#04#>A;OVPYP#R65>!2ZB#".X_DV44] +M]F*#?Z`>;I8QXW7T;7SRX7@=`ST_^PFS8PI:ZR':PI\_+)(H:;L#\R(;T3/I +M]R\@G[SW#>R/5!QN&!WC-!KH+^!V]WIJAE9#1FU%O!7H!7?.S>ZH'>T]`,T7 +M-?J_N=D'2K/=,J/>A/7&W;5^-U:F+MX36,:]76$4Z&G!Y2NB7>$_UC[B6;O1 +M6NW&0E7*-;Q_ML_8U/0Q3372OOX@U]%8>:A[:[F=M=\,<,MNG)NUXR'/*%5; +MZ%5AKG^R,SRHZ_ +MGJD6_LCO.S);EASACWS5BXW^R%?-$6ONLLV9.^3$9O_E_VQIELNCZC@G]]D>W';F-^OZF#>WU< +M5EENIV?%?S%ZK0X^2KI]P#M#8,2BN=)J\9I*L[-2>HF#2]D%&S'>)\U&.`X +MHDX0:&<"'B:!3L%^0E#T*ST!CY)`NQ/P)`ET)UV[Z#IG?(5;813.81DS>^[' +MWRVKPECO3I'.,5FZ1E<9!?ZY'VDE.\%12(IUQRE'NG;2-457_2&@NN@7WG:; +MMYK?*G>.R3'/J!Z:H_<;3[L'!.()M#]=]Q]/1_.N_R'+[_'F`/,&;;?_N((- +MT@B>%QEUX'C=XQ)O4^9MKWD>,LI^ZYJW!R%^)RR\''E>_I#(T6I$=:O>C$&A +M;`?2M<>D59%RL08WKX`W!]O<2=<[<)SD,9*;JE(N?-_M]0)AO2\A51UH3G#1 +M(T"Q/X[B4A=L'9%.8)!Y1J'E\,WIPD][#C*_WVM^^R.6F\#".W@\*V=:'0#. +MLKV^?L^H8/\Y[,^O]GNQ90R*D%'Q2()YXW]ZGY7K(*^.-/,'\U6]-V4D7FGQ1-E5"L;D3J?\(;+DA9' +M*/G)D%H_?WA?S#_;7\`Z,-W3:.Y\-5`5F9?Y*MSI@";LH6\HP*;B.*07R3AU]H +M21/^!XMNCK-[N$%5M]61@KZ[='TT6]WYE)VMK]L +M_VSY@M>;%<"9*Q?866%OT?:J4BX5#).N-BSM_]4AY2X?5E<>-LQKMC^F>G_8 +MS`K#K>6`&O/L/*."_]F7Z91EIS[5$^E6<^D^VUGP):U;CA2YZ_KS"I"DU(*O +M4YO?6P@V[,PE=FT?+#+*CL[@KGVE#[[=V`')@]AVI"IU_-J^8M=&?895`U5:P3LM&PZD +MTF(]^4)&_7!G#CH:O'"#?]Y?M!T@<=VX;S;/J`5?6=^3+:6C?;[@BXJ1F(V1 +MAW]ALYS32F\H7FCUQR5[&6TAHR0J"/7V3=G3='!B)_-#C)!_GYM]M_M41YE1 +M9Z4ZW-TTKL]2)VKP_0GW1)?CX6*'@^:`BJ#PEB3&D*/L;6=-/#'J>E3@N+H9Q=['^B,RMD_D&'Q/M;'>Z..-AW3-S)<7U$9Y +M<^;H+PEM]Z:#N&SF[%Z_(:V_FI53>`Y87V>V)V?4B39U[*G"5\U5F4\@ +MS36J4*TI%4I:6O52:4<^H39H1(+DW-K$XJA6(WU04'QV1SU7M-U?$P/Z3.1! +MSRN"HK=/T%.T+N9;(,ZF-)],E'2*^%"54:FIM(]ZJ6=E_X1WB$W:/Z>T]4>! +MVH-XOI>?HG]&3]BRE*AF +MX3-*E>:[[I07K*6YEFU84FIDM>H0__!20A<9M7JTPXOLX[!?\1\8Z_4ZAY*6 +MV4M[@LK1@+YN7]:&RX)"O"CS)OCLOMD>UY2-^@*44_FHI9SK`N5^#K:8%GTU +MC3Y#8U5&`0_D!J(QST8VV%GKMW2A/P84:FUULL?$BEJ#HJ^$G0AQESRC.")5 +M)HLQ.,RQFO76@RSM(P:7_S$K3\RT0PD>5/Q87%=8TB)6+?O7?BRNX3?/BW+> +M:&*X+#FNWT9\^7^'@NP+K)VPE/NN5R)YN"*H%E+Q/C%YN,HHYR9/)S=Y.G6S +MI]LVBG\AQ[=ZME^\$XJ<5J;UC&?GNGS1:IG-%G[QO5:_*)+5"ZR9*'#+ZZGG +M#GA!3DJ;HUA[+1;_$=TJ+`HOW-3APV<;.[#H.U#2EFRT]E$N6@G9AW6QG4,, +M/[7S9B4J_33MQDAKQQ(WKTKISYW*S;3BR5&8/OYZYO8?L9CL>T +M2W1;]%!P*!5FQ6LY7U#0Q%]^7N+3;MS#>I`SVA&HP/4F$YG.HJ!NZ2@$+Q(* +M?L,'TH-WOL;69NP[!?WQXZ+#/#5X-=N0/378$;.,X)6'/N)?C#IYU/-.QGY) +M:^K:K0>E1K-TI7F=ON!9@;ZH,HI/ +MKNPD?GBEVPL;B@UMM8B*D!IPJU-#A=344*BN'>IE6>`; +M-5Y+R3/J<*SKT4T_+'F:/&=`D3ZCXF.O5;R:XB?L_+@WK37\1,/\R.-O8!CG +M_;9-@=]L/DC]ZOE<6=(B/=:N;/)H*XE_&<;B@5A?952JA+B1'5Z:KNW_Z6FW +MYGD2E]]EZY(JHSI!Q>#-=D5Q],3ED$@M2G\2*(DY:7+;L,(]'O%T3([*&?+R +MC$J4D(;,=,>75N@:5B9AL4EEPF]?4%,W%B8WG*+CZ<73*@IJ7<+E60;(=6:6 +M(:E!K4EXZ@I'A8R:/$S1W$6\N<;V+UX*IT2$F5ZV7LZ,%,J,4B]JT:W^Z_D< +MVFT5M=>*_UP?126H,*H5+XW+ +MAK3+%\VD/VZ,[6E6+K+Z-G.W$_:T+%_U(DOW]D3-X%V-2%Y?_5=.RWC684]5 +M&PL76"SWF!WGO*`@*UUA]LJ3=(4=4FP?V6<48@7C+?0#-\C(?G(:]^*Y492T +ML`O?)GNVKAIPW7&)I#*6D)*$C$)Y>F+[T6R'G)I?P!=`EQGE[)P>'S.N>588 +M5?=1V#K$EHQ$-9-?GJV#X>?9NJ?*J)=@W6W/?<;.]5PY29E]*]1\5W^*ZVC\ +M*'JO]_1L^E-SY:0"^%2\^\N!SC/JO"][.OC`\[EXC+\VLY_315>?4=@#2UK+ +M-:-7,6W\/,4QLHJ",M_U&/OA_>U>#"C@6)4)I5RQDG(9%\#[PZP+'$[S(Z." +M$M/H,-L4FI@3D(+X)(S_Z3TKV:5^M?P[?E%-LN6DK`W$53OGERP +M?TITHLE7Q7M`[9%8=3@/[-^:RY6&+_YGQ?X>OD#HV[R@'J*T;CS81!JI?V%; +MV1=4K*W1PFQO33GM_+)$F2@R:J>I4W!K3[:Y)J]234)&!>5L=(H?1V[M>D\JRM^O5J:R^&"C,S\%5*=$&KTR9G&+TQ:AF'ZEF[R?_8JLC +MS^2/`0Y:O-A*,,@EV#/)I>:].E?H%9)6>+'TX[)"P9SB%X]=SR=BC;R6*U\L +M,TQ]OFXEUU4N;N!,)@9<9+'Q%L4K6U5&[2WF"O.O3P,U8\P5M%^.Y(E/2[G. +MX?Z_R.Z'XNUOY+2VX*?)K/]I*SVJ;[V:X^OGD]EF[EO\=`/W_9:T5T,Y$?_K +MTW96B)=V3#>6L_QI2Q/,2YMR2IC5P,JG+7TQ7:T3NI+148_04F54K_W6>FY\ +M;U)J +M986BH!`CB#7"ULB04>WFG`RW!66S?UK:T/T'WVI[<>+FDK,$N`GI#9Y1ED>GS"('D.%V.,./J(R?I26^`3&H^LL +M&Q;O/=0GDTZD)!@0+GI;+!$_ME[1J=S&`F/A.C +M[%JQY436;H*_[DEE*Y>VXB;!^^EA;(:H2HYFG@@.G,Y7WTM2K%[#])7)9N7$ +M(WKS#J&UX.,RTM0')G/Y-8:;1+7&R4D!_-6Q,Y66LOF,8A\#S-4V@A!6`SOK +MN1<99GQT5I@U;#-1'WI?G+P?SOUUOT>(X#>LYP65#TS>P%GNY= +M(+0?;U&T966-[HY:@3A;\/W]&N9>?1G+T?$9^,7]IK5L +MGE'=F($G^TW+GH/H>L,\Z]R\2L^E/_\R2Q,]P2IM(TIQVY](;8]]$/B["VH. +MS;4G)+-V5OGPUZC'P=,,*A14MWCO!K.3$J$*]KHTL]O6+5]FVZO;1?1LHLQQ +M$N13GN=,J0E?09!:6--7++(\.^I(2V0BU/SHI +MLL4QPF?U*%"[>*21X(BXJQUU7L8UP?D=H]'HN">9[6FF[+G2\SZCT/^K>8]C +MNZS"GM3&/!_GS^%DLZ*DA9(>.4>\X@Q]QN-:A:-V=*B?3>^_3Z'G?M.?+=?+ +MI23"1:M5E@JCIN\UQ;@FXJ6-SJ0KQ&=3O98E9"MQ=+7@OATT/S(J6#B9FVF& +M1V_[:TWIW=X&/MC(LXMK(UX8X]S-W#A<:V6`O>T1E4V.B!;ND48^?UC6PIQA +MMBW_CR2?KEUAU,G?(9EM;;OLE?QYCOA[;EF8_=$1[7KSX>VZNM:.VL=1MD,] +M;26_;::L/T^NU#I@%(V`>Y,KN>:/X6W&TT?B]R[9-\PSBODZZ-0\=[SNSZF%U+*Q_J +M4B0#4$NDS3KSLXJD%L +M_/P;"/)?^WE<%AGU6(R"K6<)6P1OD&=AJ3[SU=]@QQDG)UX.6V*U4I<9Q7,L +MHB(8>?XQWOJ:G",90.D%5&V5.)G0[1%WRWQA5H]9/A'0+G2MTD5'PDOTH_8+505%=P25.F+(B&EHX)MS7Y&+:;"FU&7%<;VDI +MT)^@K\JF7+><>B+J1:UQI>FAWZ&'3NQGOEH9L[K[$GNR/;7568CN,JI&SJ+T +MQ["?QJB5L=Q64&YG4"[OINOQ=#T67UP.U'MC-7_L(>D=]"?;NU/9\I='W'KU[=-T(5XO9%0\+G^KU:3BY1'/:2'U,>^FO@TOCW2%XZ=R];CP:5<9FQ/8 +MGI0E1V.!`A1+\4VH2@,JOE(=UYRJ4JX6>\<2GSRM%ZU+NWH\KK%JV(=^>@[/ +MCXM*];.@\^.6F\QD9)XU!*G$)]A7Q_1 +M[`\B'COW4-&&0RG7&R=ST_7M+5R#16WM;CDJ/2A&$S=7_S(GNVC>R@8*K]11 +MK(E(#`N6=4Q:H/TJHU8GK]"@_?3RZ-0% +ME/C\]N61?W^>4<"+7^R\PL.VMV/K=/YZ*P-,BV3WGN=R=@06&=4P#HFR+S5\ +MYS60Q/T+L^%Z.UO=L$6D%Y78'L5=!1=MHSFES"CX=;:QO^^RPEU`VQ4R2$>$ +MJC`*T5S$@\W3SFA_@++TL`5SQNNE^:UJ%+9N?*D%&W,TK&#\^5)@V;?IE1P0&( +M(/%<+C@0MEK-+5%P*U?$6Z)5*_!Z#J-L*R2G$C[:K,U0Y;WFN9X0;B)/?V;; +MC.[OB^Y)'V)4U-.6-]^@=/#K6G_*T(;/*&X?8UWV(]SW&0^O_:65BQ,R;Y/4 +M>.]!V6:?+7O*0,BHKYBU$FL?A5GK>#-"0-7EB3B/QKA.I`J\NU+%6%POO521 +M.N)-^[;!3H[1D?$KT)<+GDML%99FS?C_%$Z6H< +M+JSP32BY/J,.H%^PM3LP!6M! +MCV1]V/-Y)#MM&P2@R*B#Z>DAL30.H=^'TN]#Z9J9R+@AHS*.S'K7?;=.9]Q3 +MH.PK=^?*&^(S4*%49%O&%,^`*XRP7V/!W22ZL;HI'V2".O@*>].M61 +M]:\K&77=KEP2_N1]`Q[UB,=^6]#ETSB[/./FKQ2:(+Y*.BS+;[!6VK$[QVF= +MX#"=^(QZO2C`Q2NM?*^N>3D7_';_*.IRE_&]AEP<"FJ\4=(`K37L#UW96N=K +ME'TKC!JCN?%M1FKGV;1DVLJLE589M:UIQ92UIJ.=>A33JU@FWXO.P>&O'F8CGSJBN4?$`0IDF1U5A%)5,2/%/K +M]^MIO4AIH#5>K:?ETA?PUB\RRC5UZ>R8T,%#K^74!?5R<3R^J^WH8"W,:.;! +M2GBVUUNDS*AX.7AEU\ZDE#YJ5+EZ6DL,[9M50&"D',;K)\/5JZT68$L:+Z/E +M\/J:B`HA'0PVEMK*B7E&B;38V'_Q\ +M=AAE?KC\S:>_E?3W(?JK,LJE.W>71-ZP(V(L+Y((6D5?&V_[B(H/<[+!8?6V +MRS>@P(@MG:%%+V9KX8SK"\J,16Z-,7AZKZ)92EH5*12OM?UH)^OKK]E91WU):Y2BMB,Z)2VFUB6:&Q[@/.SNR;B4J%^\T_V(R +MAW[LX+HMU]R/\_;-5AEE:QQIAI:7):4$^C,MZ?[5EW+Q7L\S*J)1IUXO_EUZ +MC=<>?4;9UN-VZXZUVVSIL>)GXFUO*85E3="(*S02,JJ94F[[C-#(E40%^"LS +M"G>WTM_#YN\S]&?3_&]*L\*HX+8CLLT1#>)[?U5&-6N]S?:P.I392B*R:K6= +M.'>[V\RS\XQ:%:T'W5B0/G58ZAXS>PL^H^BI%CZZDOK.\8*JCGA%\*U4MAA& +M\Z-)IS,QIA7)PCP.NB7],*Q3CN-:W<]2#G2_SH[#W')H*8?+<*7L.*`$=>IQ +MO`JC@L=TUI8K/BKLWGXUM',']R[1Q(1I86X +M_-E(DYZGIJ\,F]7B"J,:]C'-*F!\O[7**.O!$.U6!KL:=BOUYZ(<'=E%;-BM +M_-9KO%N9%]2MQA[ZTW0U,0(OJG.3@O^YJ+V[/0>9/ +M@FO2_,@HCJ5AWG:;=>V.V.Y!^7-V'MJ;S%IA5(,^2S)KL%O#CZ]PPUTT%Y4. +M/-1@@B12G(),^I'^=Z:OY.AF+27/ +MJ&;IVM=V;#^)=H*FU +MPR&C',0$@DT;S1?65X?GWEU/L3Q6_O=(FR,=IADY9I`51@%OD'.1H[7$YK/5 +M2?>H_KN9:XMV +M(\V26!SE&748/>VR3XD.,O2[T_Z&O]5U4OJF<\5X!UO2SFYPW:+D6)(5ZX4; +M$.M)>>"#5\^N(T-&-9=8O2&5C9>U;%"0&I\:A(T4V@OVY`F:E5&V3&E"5QB% +MDA]&OU"O!71=]&57Y[_NZNR-$WKA5R9TE5$!(I@FMP]NL"LA\RC'7I5!_R)2 +MN_X\4$O<*V&[X,/.$67L"DZBWT.N&O^JER_MZ,@SJF=BI6OCPT-3@@6INFSK +MX#,)I;J(&_N,DKA"J>RTNLZ1NA8_'^]'KBMV%3L1U^@+^'U!%Q$N4H,8JM!T;7R^:A56UB1VEV6 +M*J/BT:7LZ%HF'>4:]#6<@TE-[^B%66-ZV+N;/QRC> +M;WFSTW+E@<^;DQSC:PI\!N0YA7O!8]-BGQ8RZI>\RC:@K605''A85H]F`LL; +MRU\PH\-%Q`WM%K!;[L,B5`T\QYPWZ'LM5_G"WK1RF4/N+E09=1:?:3G,*Y0\ +M7T!+F5C.$=7.I7?ZBYQC(*N`!2Y?$,GV9YI5P?P7K91V]D-U;C[R4-W^)*1[ +M7U"NS'Q8L5&_/C#;;-%89)2=.3F]\;I,:&/.A5^,\0E!!=XT#ZTRHZ*U]A_O +M4P!7JM5JYF32NX?`S2N,PHD0X\:3G:XZV$[:(?MR+>-Z5K\8U_"9BW#DJ_H^ +M)$JAOQ1I.K:.WSDPLC2[U^Q]Y+]DVZMBGJA7$[P[]L1#]95LGU$[S).9K+&* +M7[(4W?*\9K6I`V<9A(PZGUNS7]9Q%B(R8<;.$MZ2B15N6=)2-$(G%DJ45IRL +M0?3)/>_"GW[+4(51U^%)WX<*P4L'9%.JW^65/+YFB`6O=*N2%KZY>F&VC=H; +M9X"IQ-]SBX,5A$RR>G_D%8U93I`F5C/*VFR7>G"\IRU,T85D>-ZI6%] +MCC)=Q+0FD=HN^B;1EZ2%)UP.C[^]6"A(I\RSXG]8G6^->E%J97\ +M587<(H) +M6X+0''LE9,4)XC_!O"`4%$XPH?Q-SD".H`36?ZLZD-N +MGE'.U$"`-M_,I^XE1,KMQIE-VP:O)%G`E[1V/2DK;=BI,7M6-AVD4/RRI2]) +M9WYT)HL]&0M?A(R*?Q?/F3G*\R_ERI(6(1)8R^2]UEAN*!?I696H7&-:Y'`; +MIR/8*F<;P>ZG&J4ENTV4TGN9YLGB# +ME7U!1T)!R\0>$^V60KSR0(=2KB;^'N=XX+%E0?TX5T@$YP1-Z8PHWL,EGLLH +M:P'![=,FM@]\3@.U<)YD@"JC%JQM]W::R"?8PT'DDV!>=]:B]%=XKB745&U9 +M@<^V/KT[&UQ*G*"M/UHOSW]%)-&[AP*)%6UB^HBV:D\5][\2Z6FQ4Z;QYN08 +MNL@H6>NEW-I6ZN`3SXC=7:ST852NR::X+<$L*M_1DF[Y*Y%N9KZ(3XC+"\HXNN\JC\^WTM0CLXHZ57I`8\]"<][+>=OM'2/\]S&=LK. +M2H-=+;52D5%6HW1,6:#?!F_^>\[JWZ&DM6!G+IAL3"?2<8E&RHP*_K8L5V-C:'I.Y58J=%SO/YUHXS:`5_MWSU- +MQN0S;:$_WMAJ=-C5@CMD)\_U;XQT=W.2S%U;8BMNL^19D5$W;(FUHFML8+]: +MR]G]OI!1=M=OIOV^LN080U2V.-/T[\J-EG(:RL/4?(Y\03-^-4+=;]+@-E.- +M9\;I39;?QZ/%--2&.&9^DTWKCEB.-CY9V:#]3;:](BO@,3DY-U[.(J-@+Q04 +M%O*)+X@?Z20;TPJCM,98[#X\FVB!*C,J85'G'=[R[.;*IKBD,.TT!DKO/RB] +MJJ#FRA[R]^+[Y*Q+TG/8KW[5SE;?;X$(3!R$/*,V`W&]R/.1O3Q.04PIKIG/ +M*%[+PUK0!^4<-NPT7Q2S(RI*CE32B^!?\TUI@1^8%H4GC?-.DN\9M<:LV/U? +MDG+XV.'9>%NQ?32CQFZ5-&Z/]0H\AH./RO,*HR0'CS4;L1HP<I<7U"X;T[*Q_:U5 +MF\^H[\;;_7/T`'2QCR#0XL6;K-XAOH$T/Y*FTPE?*YY+I#:A09DZ4W;O_5)(04^:57GIDVH] +M+4(DL7O]8*T?5#T&/7*?P[.8#?5_VI$6M;_QA:F7@K@>HV0LFI9%-*?OSJ$> +MI[)U*I:(?$GK(P=DT5^VI]A:_^.$SJ@,Z*7XG[;T[\!Z_9N):CYJ/+,,UX,5 +M02@H);8--UB^93V"MHA65HY*?[]YPM+VEKJ.]@#=5_ZS/M+F%1[BMR)I/&+N +M@]IAV2JC@G/DQ%<^6Z&99F'Q=;-("M+&MG6#]\G,;ELH?[,=0U'I41YC1<6< +MRJWE_)LC'?F+G5D[Z_58_Z8WTUR7FY,MWFSKN./;]9.!@P_-SJI3J-=1UN4T +M'F^VK>H^["A[$KRU2+56QF5&Q6=@H?5ZR5F>8%3IN.EO,#O;,5]EU&_`6U*' +M9^W3^_';$4Z`>NNO67G"SNX6^4?T_I[#&)EG5'-;-[>RSZ@@)"J.C?B((KOD +MB^+71/:E=NJHC_CFL1Y^+;Y:8$=\PU@G>:K\-=OV_Q$OFUW[@I7%(0=D*U^+ +M](Y9=;[0S!&JC&*^@!-C/@LIICY*N'4^5^O7MS#'1,VK^V>QNFA;X?MVK&-^ +M9!1&/#2'96&I:9^=3,_*C`KNHUYM-]_'.$EPO/"+"J,V)X5KJ$DY +M9[F!VY$$7[TEKI7/:`%R*Z.:)"F[^OUI*MO3I#WE&17\Z+!LL[21:*O/\/ZM +M<=G7GLH=ER4P[Q9OC3A`MY3ZWB8[*=ZOE;2,!4H<(51X#LMB99-C@ELH<***Q,>Z(\9C0>'^;7&^^KW8V^]&]UN&BK?5Y^WV^MI<$S\+&17\ +MM2NKYLI^X84_)`U@Q^P&F;K,J)DL@6P9*U*NF(72989&OT8T&JP[C'T#JKLKS**^<%_O)K#"&NVN^/Y\>LV +MQY9V=R;-(J,JL3+='[O_HT&'45H/Q-[RW.;4Y[;RU^UJ0;#BL(:57,=H.2>C +MO005!!R-\X'_IN01)3KY&,>&3[$6JS)51O68-VFC^:YB*@S<+O-DH`L9.9^M[/*,XMW]\81VS(G5[)]..0V[&7>JEBGXC!JFTG_4]=R" +MG$-5+-!OA(OGT]^>J]6*C%+F.T13;_IB!%^$C#+?C6"E(\6]$MM[0GRY;T3: +MG%F56>V*?>%I*#TBY5R^;;#"*)C?B*ZXMG!1K&[,4:A654F+ZH1R829^E>J$ +MW%Q31K9$_R^F^U@9;,_\G5=&D/N-A3RCT#.]'8=Q&3I-SP14I;GFF<^HSH1I +M>Z+[/O.&385,K8J,2LR67BG&2L[GGYG^"`5E>R4IK>M,92X>CK5_F5'H!55' +MC,00W-(51K5J[_@(KC*J>170,>/H0FN_>KNE^Y'8&"K:>_@=0IY@U,76&K57 +M2;31(^E*=7X&+7M#2?NWVWD[,<>T3VK(.QO>`Y/SO2?8%C7019.C^6YBONS/ +MC94XGDB*6N>JUVK]X>U6_JJ:[Z(^-/?Y.VD\WA[-"E32FV]8SSKR3<%Z7<:] +M*4%%4*C+^K1W2U_`.2%>YE63]5,/JHS:FV4DVW_=P:,6+8$X`*"8WSS-.O(+ +MC\JS'GJ69Y3ZM;P!G;D)D;R[8MS)O\.VO8ZU_?&Q>W"#XAUV38$M&,S;:?$Z +M[HCKR'4+_64RECA:!>F/C(*E^&K698F';JFW*,J9W>"Y%4FK;>O@41LR+B*R +MJ&#KK4QGXUMO56%?[[G@]XP*[GTZ%XUG1"UM*I?^9KQ+[T&35B9A36<$@CQ!D>*+$M'-=(,3.F=37/N?)5 +M1=(*:#96[3YVF'>0+';M/L8WS5BE5!M*;WVN[4H4:H&HOOI.VT.6W3_#R*=UH9`'8^EFJ0:G*[F/:L./DEFPTO$[;[%*%>>=.#L +MS@F7[W'N$$YKPWV>4;->P5E!RK^.^.GG..K^O,*B.UEZ9W[A?RNB:.._PA+( +M#8IFO.V&NKU?K!PH5R3&0V$ECKTJO!\IHPF9<5K^]=TXN5F/Z.R+Q;1M2 +M__-43KQO;BQ\"1$))C9Y/0')3]<7O#RC%@3+^91ICG6+^#O0$/5`+^_!.U\] +MU?].U(\<,8ODBFYI-YMFEUKN%K]C=07UY:TL1Z?[2,=.#16ZU("<8T?/0T:U +MX?0K\ZW&><;79WSM..(O1>4K,TI*F?%ZQAQJKYLZF";&$KHKY;"[=>4[=AT@ +MN/6I7+.-3J0_,JK/T!3V&Q$12M-?FK0+]O&G9_HNH+`CF7*":?8<]@R4_%U2 +MQZ#`G%))#[/>MSY14"_C;+:$ZS,J8;1;>'%2BQ?*XR22%E$3QE^HRTJ +M95!5025!WTZTNI7J)&1GDHC?X=5Y_5WAON;;SGHZ67SE*(^N.L^H18IWY+U% +M>(+[M/+RR!GW-!!\20M6B^:)QMLKEQ>0(_A@FGALD5$=HT-!0[THK>`WM9R] +M#QG5GO(TGG2!MNAI%_6V1711VN7O2@\->#:'ME<:HU_S?L=WFV6Y7AJ'B#6# +M\V_:T"=_JN6JWXW+JS-YO.CO,45;FR\3!2*=NK5#7;9]$'V1AGTAHQKMA<0* +MZSI8)"9)WH0\P:A!4.X#F>S.VM$>QP&!7?3W:KG@M*Q.LH1VU_RL/=M"?U]H(J6"<]/B +M'?YM1ZTR>_IT90DW_WTK,S6W>T,\44D+J]0T]P=OTIR>Q,S.N/"F[H^A))OB,:0D3EOR%%83)V=E[9_(&F)S[#8])'I?>:^E7VK]^7Y@QU#K>*E; +MV8.L:NHXG\^0J-+(>(E&".3-"2I!3X"8F0FM_QNH978/8<&)IU5+LUEV2K^5 +MXQ8MWUF[8R#/J."U'3G[O0Z.=-4-&6\9SG'$"NB/'.4S:A%)!LFI^0'BRJMQ +M4'@'T2C.BTWKX*4=N2*CD-/4NCLZ)M?-YAAII:,H-WN*3&95(13432,%-=:^ +M1)E3KTH+18;CF1GQD`6U\EF.\@K_6K84W[XCUX/R7?XDGT%;$13[/4I)LU.; +MHY;HFOJZQ^>!_;==+;@6L;8PYXZC?IE":BJ@GOV@R[$:_Q^C8%U.\S1SSG5/ +ML@^**[.T[](LG?]_TH\R;W,:]%0]1.U']8:MK4,CT/]_=MZ>J7?0+T5!F=Y! +M>SEF[9(X)_$OSV7[>T:M<22VWT[4L13W%X5?DC=<9M1.1!?%*14TMR&]A+7+ +M,.O!%VK]54$MZ)C1(ABRK/YAG**7-E&T9\?C +M#_=*T8A>1:WC_U#FVK4%M%$J&'"?J5WC80SB_"P7J[KT5_RAG45Y?1961BIP +MGT$-7.63]#Z!E8204>LXAA)T/<71CCWBJ<$>].4`VU.6)2W"=T<>I4J#3ID+ +M+*(^J!V]O,*HEVH?64[]N!RZ&>=*&AG*&=RT@T_6JIJ6:'>3-)>E<-*QXW'\ +M;Q70",&JO^K0^D="A3M8F@(ZA9F/T<3I;LH6@L/^ELL+"B.=Y%395[U;ZDHR +M`7+E]1Q&I8P[HB.RL%,Y>3FO]/ZRQTAU&@P.O.I/> +M';#_V3./5P;SC-H;G8)"_?^QLZBWE[.?BHQJ./NI29Z&+!W^CXRA0%M9NF=4 +M+1>[QV5"'S?M&"H+:LT6H921'3E7];O+J!_:T*KG[\@M@O[(*!L//DA2BT+O +M(&1J:A/UYQ6NZESN54U+9%TU61B!3T%*))B+U:;,Q5W$&=P,\?L?A9_L>6)ERGG5&X!Q]3^/T^Z7E?TD(?INN]JXQL +MHDHR2Q<9A1'*IU:O\?CL\Q2?5$^,SO16R*C+4,?*O&RKGN+]H1_;'EHPPWHH +MTY>4*R%K<@@ST4IGJ/XX+M76K976FEK,=_78/%_?S:U:@O4M8D_/8RM$]>DI +MCCW$)\K3-<^H$EN-R/?\!?9,2%]NDI&S3A-QK$3A1OMR0%LH#2V`N&\GZ +MF.=4N\I6[K;]F.`]8]@-3?^B*BCZ#K/=3-;P>C.C(GE75C0D^IGT +MCY!1TWQ.[+H0:[$K=3DJUV:VKY*]\K$#$=6NEK/GGU<8E7@[/.`6\OSSLT=E +M%1PG.G5<(C[U54G+Y,`K%QR%B7KG&)69.T%(&B7Z)XS2A=X^^K;+6FQ2/^#W +M)'N-J=X\HP+K]V(L/US8)-.7&&4_0CPK2>MZ$Y^#:O$#]LE,7OM#O$=! +MC27\J)ZJI)OK'#(*'BE!OE[SQ'P9YS^2_' +M7MAJHS'A@+\\HX(SY_%^D)PDES`>C?6T?$99.X#;S1E049SL,?&Y*3(*)TJI +M;W9FX]]'7V&_]G^E]+(:$EQ>RTWK>7I7_M_X/#33WDY%4,8#X:\Q2V#F-U0" +MCH/'J'O-&=!8B:IT#+FL?^",:AK;OZ7?^J>LP]BGU!OW='L]NC%&R6=>SL%#&R,-XTO_+)XC4*LVN#@B)7/2!OA4 +MRO,\HU:4)O09`>*MN>[Q=#V6TGDOO*&)&Y\XME+[C!HW)>6]A?3N7/#OV_ET +M+FUJ4V04[TE\V=4\LZ/V8(*0;^@9RAJ,*IYUT?9Z)#&5KWZ<\,!(AJ-;-YM*?Z) +M^O@7TA+UB/8]AJNS56)2=LKROQ#Y2R0^]84]$3^,HG(?2?.`I(7=A[F;!_0- +M:7WFZ$H^(Z/'N4(?0'^>LU(735IK"\>E5^IC#UT9BSJFW%7$F=Y-R)!1L"5$ +M_,*3Z#N?_DZEO]/HJ_?0]73Z*S,*JW^7J"MT'WVWBN[/!'=#/-Z$G&!8813B +M%*+=SZ+O$K`3'54C"5B+V_;Z1=1>Q)U23HGCS*7I"A[FTA7/]3W<]N;M''Y+ +M;<8SEHT9J-P\HSKI*7QRN^B:HFLW4$0?W([K:CG_GKBR)]^_>U_I6I=I[1@>85X]_NX3.@PWN,C)E!',K@_^K[]G'_LO(]EA49B[W8-6PSYIG5+,7''IF\5_JUG`^HQ)F?ER"-V!* +M9MW\!YOE=_%>2]$['JE;"O"]L>[MNM-1X;U&!N"W2V.YV/0]>E:^UW"F*)>M +MM]?3V?&@I%^IY_B@L>;"2NF=CO0:]F.PGB.E'U]&&I(YEYU/6"MYL/YX!N6; +M\+3^I8P.1`DK]&(]!SYXZUZ3/2>+S/]2:&*ZAVM82_M*TUQ)U`568BC_ +M,J[#6!WH0JR1_ZPCTG@JC)HI.IB5A:N2%M;/#DMQG.:271/*[.)14L&ZWZ^B +MT0%.WB_U*LLXNES/$>L1 +ML'R"GT);*K*4O(\HJB(H8^MXG(EFRW)<:EM'J;9?44WVZS<#JM+ZH?PU[:'6K6YM:0N,^IXB=KG?A1MSZ-+[!]A680= +MN\SLEQAXR/U-_C]"G])7.67?\\5(U2V +M[/`,J`Z5LY(OH:^"?Z?[3]5RX7V1?$_(1WYEK93F%389;SNV9[K/2AU,)0;1 +M[(]7N:^N=YBT)CA.\(BU?-KZ[RE5O<_VT,G0D9.RFF+1CD'KWS#J"O%>+S], +M)?ZXE/YTHN1@FYQREV=4L5POJ=5Z,4.S;/*A5W/^;VR.CX"7;I9O*]^4KX*# +M)=TBH_;F8XCG(:,2QNN#?0PO?%+.]7ZDKL^4&27?GE-8@MD<)YMACQQ1&,ZG +M+ZY-]U:D7+"^7?-JSOH;.K`+R!W,/8_R5AF50LI!9H2IT,Y'8P=PZ^!49/U; +M*W5$\58,K6>Q#X:VHFO^M_79:EEAD7FS^+\=8^MKXF,RBNL3>#/'!Y"TFCAN +M<,KL+*]`P->=6CC\K9EA7)[WH?D>B/5?<[KI_BIS+MV7!978;M:CVR5$>I]0 +M)=-)*>-6&-5&LPHT\.XNJ5]H1A[F(V(!;O6WEE:567WB77J3#J_.0O_X';_X +MLO@.PZ*%Y269:V5EEK[."XKX(,;O.;9D"V[IL">EHR;^[RSW'?M;75Z: +M%J_C=_$YK=E>]',3O^BX;F*A&_[.:BP7TI6C2_3U%\J,"L+M +M.:L!?`&K#7WM#3RG\KN9>$[IR:V=@03 +MFSMTA3.B-U>#U^"D5KWUH&MQCV@O.`=OU_;!/*.XY'WM/.=SR?M,R;%V?MGV +MG,\H6_(0)6^*3\;Z=L66GFT[V!K%S,CI>FR,D%$\&YL=9T0V0`SD)/VETF;^ +M8!3[\YLGM]E[C@J!_8H!KR)UY)P2'D=(($2:_MHY1\6Q!JJ,:J=1/FO7]//% +M+#?7]PO/N7M(Z-/0NSDWGNE,S7?SC,(:GT27@#QHOL!*$)4-UL>^2>LQPSOMZ,VOH...E^T?KW^`OU]CO[*C+J. +M[D+Z"W;\-1>U$UIG?(47I$NZPJA/T1TX6QM:!#[.3_XU%\^]RJCF/=_FF"+Z +M]SS@K?X9C=9-,M)@>T5US#/*KL#;T1KY7[,5-?$O1G$KWB#(B$=@G&-%CZ2C +MHJ3U]-QLLPZJC*\ZT@]_;^3"B"=8;J#N?39G4>4(9>=_K79T--M*5QBUB>[` +M:+4Z@JXS"&Z1U,Z'P]B:.#:\\I(.51OT'H,I8C5RP +M/6?3!!\#^NRQ]3ISPPJ=9]3^=-=-?ZNI+.^GOS/I[PSZS7U*9?3_(/-0VEO< +MYW%?9M"7>VK](X2\DOX*]%?\@^6%?&;!$8DL>%_5S#9R#EJZ$#(J^++BL?.R7[4\*]@WISLA;!"1'M%.6*T!U]]=IH- +M]*J,:]3W;XYG(FU;_4;23@NM.>&P-A_G1H=^=]C=I47E&I>AIEWTJN\SL +ME6#3\QEE[?=FTIR*C&+^;JS[N4Q**-IJZJ&4*[<[=X'PT@*WBIEA'&,W7Y:T +MFN-/-^5>^:,=VZPQ77F3'^6*>!ND3?3^FN2)/\;E+]5A]%KX5G8*;P1%Z_]C +M5*>\C9]G!*HI[8=U4A7D_\_($QZH.)JAS/6N48]MU'Q&(6_E#GC4!_07#*A4 +MFF.!['_E@,[07_'_1&/->+-`?:\@*HND%4\[C'+DG-S`4[!-`Z?$*4-YG8HINL=RI]E29;2G +MXI\C_K6\ECO`M,!6TP+=X_([9-0.\W2.057Y=Z!M"Y4E+64BL:1E?3!81QP* +M>CL]SXQ[NO)GX4S*W;-6%:R]-?W6A?&`[3)@%5=E5+#VV5S4_G/;9:?K:\EH +MQU@_P&.HZL'S0YNG;?,6VT&W0LXB*#H^<% +M->85+&]WGFZT$T5_^@_:45N451]M=;,$?*[AFX'U"9,CZ7?PH*9KFWE[$6M2 +M`SI%OT-&X2UB;3ET102N9"!Q%$[G/2<:CP^*SB=Z]LE\SEQI2/5ZVAU=OR%A +MKA5&.>97DJYJ?6DHE<+O@8DV8_E7?3"B:&JGM#GQ8*OYW6UT>?T0SS!&R]7F +M*6OE-'H[S>\\HUXQ8[J]Q;HAI$J?42Q;FAT5]%]?TN1L5LZ*#\7'=M2ZL9,K +M>3PRZHEX+Q\@;[;&5N#*C'*<^CI:/4?I*?1)Y2$KDW,[(Y8X]]0*[@.'KLEQ +MSZT^)&T/.P[/XSY,D1Z#6-)7'40R#\DIL.1\&*BIM<*W9-5BA6B9923W3>#\;VH2_G[`Z._["9._R9I':T;)%1#5([N/EAIC5^**T1/FQ;%3P> +MJR&;2!8D?8VXIWA4;:!6*@L*L=8.1@&5C]V:SKGTAKZ")'_E+)6I,`KIW"2> +M("Q]6IF5YQ"26:N,@N1J95;(I^Q'G'XR=S/ECC3U(S*[XVVF%[(OT@R<)UEV +MQ:R,K_./1+,HI&&2&$W.OI5[D:O_B)4![%/D%NSZ*Z=ERU=\Q);>2M;3RO?R +M7W,AHU#*O;5]F5$+1EMXU6%G5VWOZ)YH=RN,[52D7/5T:M+LX[5,;&1HSJ>Q)JA']%Y$ZE$2DQ]SQ*N:.M.Y2]W0HEV:> +M&PI>GE'N>,+M&"]%ML@'4-J=]&R6>>9+6O1F#LKR396U]FG(49NYN\BHKJF$ +MA_--NTS$E[%NE9EM(OG!]S;\B^6%7['C+[%-]FWY#%JB'+HO,XKM"9U-GC.^ +MG&=17H?$0*8O4,_*7V1^3+L94P9+'_@RD?+8RJC*J*M>E9W<.-JBG-'YGG[4 +M:&!<>IP!":N_,8P.LV_"?J2/ROH$Z24;B-XQ8[EC?KVL$!%TEE:%4:(-FRZSNAAT&*]_!;3CSIH2H-+3JWL0!_: +M$G'?%'M2>[8?+"I)J"*C0'5."O/."MY'L'YEDYOG@1)TN$5*W^\Z.$^/=XXV +M#TP:.]UK#R')KX?H2W*DE'==?HI.4GJ[2Z?H71N.=GO![3!#//W77&5+?(8) +M]H,DE'8]VPIS9+:H;K$47;:K2&;6LJM*\`_36X%J,SFFZ;K[783K^) +MM7?D&<7C\$N9D3/I30>]Z:0W]MG[Z9G/*'B8V?;!:E+BV5H_HC&G<;^CUE\4 +M%#VY`SKL"[5^Z9W&%@X-:OO@-=!'L??[Y:=SEA)%SB?IG5'?1GU2VP0YHODF),I7?)OQ>4"(G">I:LWH-F<#?9L:V;D@/TE'L +MR^(VHYV0]'/M<7=X3:KE<W\9HB]&@:^K[9T1YP;/%C_I +M6@Z\N[)-N$F<@U-[3](]\>V2B1E?911'])PD*0$. +M`O3@T[DNM=+$VTYX731SY1^SX]%QQ;^'M3#8/,ZN4Y//*%`-_*MGHMDBHRSE +MSD2S(:,LY;:B0.1>9M0U+S1:"\0IB?=9&24[/1[-Q//%]Z$#N]=F)QOGBTJ. +MA+\AMJ.B"0$.HT<3!="O?APHMJQ$R^Z2B#C\UMB;L'S/J#GT[1SS7?/^$.C$ +M?[Q9T^EKMJ>\_I93BX]+N6@TD6R9.,',C_/A37)T9*T?,JH'7-53D=U69.=# +M-.S3E^7'+6=R8(EXH1N=.+W8^``I-5]5&.7^3(%G%6P$&H^CO7H]7?3\;I(_ +MJXSJHB>R?R/E\Q,#/=$]Y:B?L#DF7C+K5@W(>85-WW54_@DC?W&\O-EV=]_N +MKQE[!9]1E>@IUE4I&?J"CZJY(<6U*9JTYBM%)8V7+4$Y!J/M)#%[/>$35BMO +MWC>)Z[=E0;6*MMMWSZD)DL<19;7"J%F'XCQ$S"I;9"]`'4=R?=I-TA7>7E5& +MI>@7ODN8:WI4HNT%?WTBEQCU//U76<5(\(H%[Q8@FB:?7'434=)C'.DX+RB7 +M9LL)&A%CYY&^(++2U=2ON(?5A<^HCEGR)#W..X$^O'"ZB6X[7'E>E+2NI+2N +MI+0F-\L.1.HXC2_2SG&Z??U\-V14._U*3!'RVDV]"QU_CLT+S3I(]I5D_&>>K +M<4\7>CXL?L4[!O.,8@T._D(9]S1G-!OS0I.5!%]0L#HW,<2[1CX)GNU@[["0HVF+G)D>[??4V8_G0D;9-R*S>NRUS#%`2#-< +MG`YT67*<.F<8MG;>Z#T#B:EV3W5O/:A]U_;!62_6^A.CKE=YTK3J7.>2'8.S +MGD%K/C68.(\>QFI2952\/HFSIM=$;P>J/]7O>O9DX$$E_B;7R_F_8Z<3?6V? +M7OH"GPZ(D]'2HU1&['T^2I%1/-.]2_%NBMU'B>^. +MA(*ZOG&')6[5@#FJ+"B2T*#M0%*#MI-R1=M!K2!I5;8;/8WEK<7T%IK)(KJR +M'G)FCE/B.X/B>K2OS7(K.6G[%S;2F:U.T(51@6/_2TW;<1^348LQFJ543QB-R(J +M0>.^8<+TH_X;IR53UHRQ+/)_B_/"YA/7K=3@_ZU1QC1VCVON'H*/\X+20A?[ +M:T5&747Y?X):];:I99YZS]QL\+O'_R9:YH"7&BU]]N#1]1M4:J$W#WY-7\KX&4($]SZ6JS`JB[.? +M;VK+MI+4,.=6_V;UH0`N!R:>TEW&1E%..*79X6F@^*F1"AB=5`TK@OFG[;P] +M+8X%]<..VZ4??$9Q;*$]$HN?+3?^K3W+)SO<]3COLQ89]<"OC(X09.!56MCZ +M*_A?"7W`=B1\VD@P?I=9;09"V_BU6)O^:'NVS"BD'GQ#4H_2=;8.\$Q*,U;E +M:2.;>&JNV-9+YM9&?+J,[;T4SOYO>4'UW3IDBM6ZA^L)NVMX)&8"]&=HTFJL&WQ9-7)U +M/.^ETM%NF5&IJ?."R=(=[L[2;UR'/<9N+*A'.DG*$FVGPBCT^W%L@SG@J^1^ +M6<5V3>>P-K%()=RJY+@FP_Z%"^!/2T7C.LY%B_:[P3F/Y_3?.<"R'TL-;&Y299Q1+Z1M)`G5<';R?^,VO&O4VGU%Q*^I\$Z<#1149 +M-1-=,47-:<^&?[?:'.@JVT17>4-1948M,'2UJ(FN+$55_AYO>_TP1GZ=KIBB +MCGL\5Q74#'1E*4H_QXFN%[I2=S32E:6H/*.0$W+H:J(K2U'^7G1%XE>MI8IR>)[EVGG,IS +MK2C'-91#5XUSS71524-U2TB*A('?I83E=MZ2TMQ:E('?)8+CA4 +M9_-5:0FCS1-=+;64_;TYT8SC,ZKYO)IF&BLRZN37B4L62KG,676+%W7K)6_L +MUDOSW=I[4S?O':)URXQRE8F__FF1C!=]MRX'E#ZE,A4I/=L?RW?P7D\1W]>* +MM#HUL-Q-G>A6&97&>H(C'G_L-1;W=CF?Z.MY3FO!D07P^12?&;2V\$?LTJQ+ +M:%=B+!?RST<:6`?';/-LSISC6N*B1,,^H\9X@,\O-*15LJ?=)'3Q>:&)6P9L +MZJQ%(+98A/Y)1R@Y0L\XZ$GVUT*='+,6HW2V%[4H,XIG8O;QH7)-43KPTEZP +M$U]]$'X9%HN,"+1HU/O'T+,;_S989!3SAXW] +MP\P%OG'4L`JSO0[BN,%Z(]B@PQ>D])!)-L1*3ZV;#2ZPN99?L#H,RF9I(MZR +MD&PK+]A16Z-Q/?7U4_3.;Q&77/2&@OKFTZ?QJJ`[YE>E]'AJH@C%1SZ?@W?3 +M2$&_R/SK3?71CQS?:49;\+XY65BQY5^TK+]HQQ+F@UYWI +MO:Y?8HK^M6@`=N1'-GUKY@WS?,2H/*)2J,T=V=$=`^I+VW)9E16NEQ2NYS-* +MW0"+R':MOK@MUYP;2E!\RUR7U6`951L%'\:WF]`QXJ;S- +MW,-F'?8C^F5.Z[B7<_B+^QK&K2/RC)K9^V83>Q'ZC%I`&LWQB8*KKGAR,$&R +M5_#);3F)9D?MN'[(+[XL/,?C593C6;-(*#N6$`^&S]-Y67H(-J=K"^!,*:)] +M1++E2&V0$1]^+E=^.>)R']Z6BR+:4;I<"OB877]>H?*RU71@*78#]`64A7+J +M4N)'C-B/U0AE:T`*MKL@+1Y9N%^9]K1^1<9VABAYP+5IVG1P$AFO1S/*VC)S +M>NW3+>Q\1O$:MO56.LVL$%.K](%>1U_(%24MBZ`T5GTK=L["0K$="AFU-Z]L +M]%CYE;@LQSXG?S)Q+=#^!TOZ%4;!=D*;\ZT0;=\-ZCX'L,"I2KF"K:0=/9]&FW+#S@GR*C,(JR@+H:=KED%MTRA!Z[*'%K1UE0T1,CTYE>AVZ*MJN\:CE3XA"DE7%= +MVP('LQ4BWU=?M7PU99X@BEESVGIGG%:IUE+?_1KKF]\9\<)94FOLJ,3KJ_Q] +ML_[.EJ6?),+_L[1"\)MTML@HO`557Y1LUSU6QJ11@M_8%PT9%?7?\Y`2ZOUG +M>ZZ\T\Z/RHOU7ZP$R*,B.=J<$O69X_TAF?49U6!%1]].TX=>:Z4/-9^H +M'`IJ[!K95UJ_;4BYSK">^HB7M+V/\\"D7(C9#4W5N8)DG161=80*2AKH2E1Z +MC!NLENJ)HSL[F7K6FEA-YPQ7&<6QD[9MS?6H(Z,X/`']?@-6='$>V"Y.B[T. +M]\T&\\!QC^1]"D1"2TW]),@&7W?S@KIZN;OQ^G0.MVA`T3=AZ>0J4'( +MJ.S4AN6H"]?BOJTYX;Q'1E'(RKM$W]Y*7?8K5W4?Y]GON9P3MXVH&YQ/5W:) +M%E!RJ0,N[G*EM*K[<4]=B7(&04J=Y%:E].Y7J?0E*JVC4YMPTN20)[&DM@VN +M>Y'TY=V,VKPUM]?U0D;9V9PC&A+U@(I2=H\:]G*[FV?1;`NMI\@H2T\1!2$. +MWOH$4=`I3$'A[HCG8%_4;4U!94$IH2-+07J"-&!J91OEJ[([HIRO$>4$]0A. +M`?T^VE!.=7=$.1Y13C=D8(G@E%4;.(+38NHI/2FZ58%ZXB=",5?7*<;&;?:GC'HL/4H3M!>E3XJ3T>@PL58@ +M`_?%9.`>N@\%Y=0C-FW$+F!W;\/Z:)E1\9Y%7V9C?0F/D,JDY='5/XGEB#TC +M_@7^'>@NM%>$>LF@6GH0[&FLW%[=G\'BO?PRM;PS,HN77P +MVL6H+\FKERFE$6](4,EZM#>=$.O9&^ZHK]\6&96ZP^P^((8;UGUCB)$RC4=) +MR^SYJE2&47W15YL&6+YG%,K4PU:[*WPJ'.^D?O-!8[F!_5I&E7KIWV5;!]]` +MPM[5QCL>]]9GM,HH_@Y[:&J>?Q*]/10M^PN1()W1]D!/B<2'517E11YG=$V/ +M;B[9%LHSJA=E2MAX'?6639J=>I]1[+W9U\^[UAY\+2"U&=]6_"Z:'%<6((D& +M_:_E;"Z]AXB6@_N043T')_@THE:Y(9_RE)VMT&<82WR6MR,S(-+"\\I4)#WV +MO28QZFR.U)_1?NU4?+9JEO86V_W:&I=KK[$V,\/YFN3XDZ&=ZV;+*69SK^"] +M*Y8SE[E9Z*0^H]@69-)=CI'U\S;7W4/Z^L_HBM.%)R9_Z!$3W[Y[8X98%I5.GAH10 +MI<=E'VPT!=O.@Y*CJ4`%KE=A5`BIFA!C\/[`KIM>@$A569*(L#_D54U:BKW[ +M;`V>:N/(A#Z>>90';ZJI:,?H6GF#6C"J:]-!X*UY0=&;*5-KY`PKG%IMH:>N +MWG00TC>'T&-"IEQV&QMBU'-;8E74(D5&9YG$:>-[?,J#/15J9^3U!.MG7_2O=G$[K"J"<3$UK=];"= +M:*_E"I1.8NI(*J?7FQ?4@B/K:25K.;1`8FJA#P1:PD]$+4&MH%0M%[4F4:.E +M^R*C9HJ!B+&PF,9"R"C,+C1$O#`U3)QM$T>K_/FZY2YB1[[;]=RRE*M[H%>- +M_\1GU'HY(]89'0C4^'+OF-D#NI)(F'D(D=1MFAM2R]U@=*#`%K,OU?JKDM8, +M?J+8ZYO\IH,(S8Q*Z^",&OMSVG/POH"=P:2L,.9%*):X1875O*Q@><2\PI([ +M98_.9]3>[)DA^Q8E1^,QVS8J_%Y.QMY$TOQC@XC[%PH*YZ6OGU\P\6X0KXA/ +MV-X`#DHR09E1.*L#%BT;F&(P0F`9'P1.&J>M.UZ%49/LP:LB?]HH3>1!Z58E +M1^SWDM95JSF()MR;1$1:*M-854[1I7G-IG7SL],\7"*YG%%16QN/.*GOYJB^ +M?E+J2!JK7?M%2\Y%]'?18%7J<+B2)P:[<-X< +MH[KI5P?:1J<*ZK>BN^^PUHT!R:N2EK%:4Y.'2=R6T(NL>OB$6D9IXRM,73V" +M'0/F("7=D;>ELU4Y`O*M/%,)X<4!<71I&`COZ,#M,YQJ.%KM4LT\U!0 +MJ"W'W3%KM)\UGAQC*S3L'LL&M6R8K5G$\Y_O\R47UG$>774E97DA<_)@A89= +M+9_,`;NFG[[`,W25428W;7V'%Z]S><5R<6F5#BXGWMHF:=7+@!SBY43`[KR@ +M1N=[[)4G9[I$Y3HV%>BEP8=W*-"(Q_Z:C*CFZ*ST';V*YP,819RS` +MNEVGA6,&-)[[^7NLR>%[_FV_8A2^78COZ(TS)=+:3MXS_$T'SMKS&<4[*8A\ +MW?537WPHQ_P$K%X25#8:<47)D7@??\?E2[AK1PL%K&18R_U04"4YH2TQ-B]@ +MVKB:QE+WYEY\`8O[;F+[?4M-6&6L,`KV^VS/3W65^DF9KF+. +MM&RXRBC;1F_M]/22+D];I#,J]=7M0,5K[1A*C*/RTU!)LT;KQ%K5;[>M^G9H +M$T0ECK&Z47-)'C=466R/EVMI2LJDOO(DZPO!44BSW0T9!5DB2;\@NTUM.+JA +MUX\E"BHS*H"?/-98/_)XSNYA\>^GM_+O"J,@[5FOK,C"WD2HAX5]M5WXET3: +MB\H'U'PJUVR2=&GRUZYP@#H'J=7JX]R.R[R@S.C$^2M\)LLNZT]FVLNU[;5Y +MK1W7]9S[4QG7F\J,%!F%L8>SAMJH-=`JZ:96"=UXJ[Z1VJ:=>L9-71&-N#S: +MBU$=]*8S]N9-\"CMP*Z9]&6E(:TL.(H9@^CY=K3P`R1/,(H]!<`I?R\KRW?@ +M_N^U_CMQ?95T^0ZAG$:JXUWYTI.#U[PB._YY1K6*2&S/Z6%^WS$3OP=?9;F_ +MVI8M"DJ)I5.*M)*^4CHZ+ROH(N;00_Q>4+U_R_5]16*NG(R16E*(9*Y3&Y1; +M+5VCRXSJ*K$MF8]ZS@;/I]8(UCV9TZ6%;/]3Z;`2#%L!H;U(TGZF-MM374_F +M$`U*]4_FJHP*L`H\&I`FN#Z1ZH1ZF5[R\>5*74Q_E]*?YF.?)N@N_BR^I6T#KG2;:O=]IRX6UDT6,D)CWO-?$M'_W4)%12#E#]9S$^0`E +M6>->4#K/37%$FVV#(:.PFINEIZYYBEC#$G5:%6K+E"IW1OP+M39OJ%PAVAY7 +M["94.H4FCG;M?N&BDO@$XMQ+.6]LVV"547S"E*FY*AF_N9*<^Y2BJYYE9G?? +M+8E'T283;PNG'JR'5/-9G8O?$;A.T1IC[TOSZ@4O"&" +M3?-JM=K:BP*1E4K0^^"=K8/O/OZ,X\<.4GP.Y$7C:;T&7US^ +MY&"14;S7DFIGRU;MT#58X0;CBE$X52'L$@[0[R(*30\AEM(;R$VP/<59..%8 +M6I<9E55'\TI;UIF-NLUCR\UW.5EK#UN1T<:]22".<=I3Q62V +M:EN"2[R:2HSV:6X)/;M5>\5;!NGG9UM-9V\[7/[L!BV`>B6%Z#HVTC[]]<#_ +MD5&(N-^J//8O;"A70WF(EZ$O$+FGS*@+E1EI-/;Z`L_MNU[I7M(J^JC.O82J +M,`JZ^H5S9^O>Z].ZC_Z*II6+II6KL^,4/:-&QTM[K=:-ZW;X6X?RW4:'&99U +MXX%AY?[O4'-]_>Z9:#5>WZ*85DUEV?K`#582[YU?*+%ZO4/BIM%]V!UI.KC! +M65X*='6WV.(AL`5]6194JH/XBZ3'JX*9^447*[H'"NU7&(6885T**]7+"KN) +M1U]$+3F^*:VOOBFM)VY.ZRJC+MZ(GC4GK%,N:W!*"VE?P9@\U_MPV].3-=0K +M>!+0%7VAKV_7:Z@?`OK+,ZK'K#!CM1DC8NE8FN-/'4]7C`E_']$59&2LOB'- +M_5:[5"1XIGLGF2WN(Y)[NA`,.MF01@9RXY8P8XGW:_=I-2/;%6=K=5S>Q]+$ +MA<2)BC%N%%_GJS#J]7:DJHR"]92"IP9.DTG]9!I-:/V/T$2>43.=QHNQ<\X_"^H=X7J-7T'=() +M<85D?'>"N67")TGFK5MR>4:I?Q9NJ>"Q87*U_C$]P4BGOZ^4?J)S&@>.]5)Q +MW[W-,+:70D:AK_A$C5TF9C#EVH5V18WE?VU[JMN`"UD6I[ZY6'R)]3>R9 +MN+TDQVQCCS3W1951MD?6P*<2O3)'9;@OL@E$,2WH.1&?@.44Y:Z +MY/;!_!P[I_$J!DI^\':.G\/Q7>D+('U&\2Q'OS#+@;YJ:^?3")9^17\6&<4] +M@W.+>+5_Y3#UTO`:>H:QN:;/U2&CUDC_#:N-]PS5:NXMUG?;W+_5"6 +MTB_XI9R\0-HIZME,&Q4IUW=HQDQ(FS-]-(VTZIQ_9*3I_5K.R/"/6DLT1N5$ +M2?*,XEWYOOE)P;!!DS%-1W9#\Z +M05?0&X!JM4:H9RJ2#4@23G/J.>KU:JUJ:';JH+$]^._Y((7 +M:APIU&>4?9.B;X/=\]AWCI%;_B+G!33DB+?GTMN1)EX=]EA)=";)$7U2[GD] +MZ1&]5A'47B1'R(Q509'D.'#*">]I)3FRS+@_2T-&SOW"3C*>- +MY)@VDN-L(SGR_+A_?'ZTLUWPED0D.0;?>C17W-_RB5:28W"FC)IP?Y$49I8< +MN;WV;VZO9LD1M%?9W\ZU,TF.D!FK^]M9U$J.[KA(CUU&>F3Y_H!_2+X_H%F^ +MAQ2#?H#4>*:1%WU&06KL):FQE^22'I(:>RG7'D@Q]/),DA>+C.HA*0628\%P +M@H)M82,OAI+C#%*C]RIRW*'G2"R'"2W+O-UGE'-\AO>6LD-]SZCK/S6%9/?M)'<-.5>9%2Z +MA?P6E]S"`RV7B\MOP>X$G[>E3DVPY%8^T$KNLYODM[A'3N5`RP'Z#`C, +MX[O8*SQ:-$.,;WQQT<;&-@M[;7M-T_5>2[`DM)J^*$Q=3C +M/HVCT]=+=-7\02*)$DU-T.BZ$G3A^%C7QKB>-WI<80FA?4;-FTH6<"9/;TAZ +M&OV!$\#Z;"D]\^B^R"C0%.:(ZTY4JD!OSH5&A[%-?Z#ND%$7TQU3-"AQ?%YP +M,B&S=+^(_O+0'QF%49%;I21F71>U4?-X/.@?&H]16L>?MNIT\)F>F%[Z)>(P +M7X(&-!>HZXC/?(EJ?)WA,SW$9ZZC&GP)7(:^RL^UG+R7^GZ:]&%\R_VY5M-1 +M_V%Z&2O#^U$-$`_4U*(X]Q^AZ'!NG*+C\DB<-LIS6W'R+LSJ6+7A4\1FZPJC +M--WUT5\&?]1_"S`>JECJ.!QS88./<9]A@F0H7#\7U4KSY84#A? +MP>N-XE?@W.O4#]S8_+@'W)5Y18=1L +M:.*0"K""RM;9RZ0&SGP%/Z`JHR`_9]0I[LGXUIE?1.NNXOMVO8HXLNX3;G(T +M>T@ZW;!*/<7EG-:96-[KGAS,,ZH;MJO89X_EI$V/9ZE/?4;9R)GJCW^9-C*8 +MOOI:T5?#W$OS4=AGI8[>O7#R+`V$+;!^N_QZE, +M5I#TJM`U45!X038E*.Y+Y&;,U#,I&;K!8AI26F% +MC%I`\P-^D=I6'W:G,A#Z4T\*W](U%TQLOF&6^ +MH$_R@C+?:?JN^0OX8/F"2MOOZ$/S16_LB^*A\7+U(B>B(EBI+*#Z,:53RX:, +MPMA90$\R9B?*86MQVP<953XTDGUQ%B]];_L3,4F6.K+Z4#ETFAR--85VE06G +MXQQ)(ZL*RHGI94AW[5\:+%7U/*;5O<03Q4R:GV=EWW@DG&GKA?/^D7FH.,]J +MK):#'V_BIR[%C$\R'B*VA8PJ'2+6ZR5#4\=#NX",,E>)O8F@#L)!,Y(&4*BS +MY]3;K,(H2)SXM817+P;J[>[.Y_6&ZCP[AA;07)CI2^@%-RB]@"@Q@QRQ#^*6 +M/)WA.O;1R.AKUPOHSU*U&L^,]'&/G^+F,Y:^(&?I/AHW:=((VZ7W<5)=FJC* +M9Q3>K((M\@9Z2K5?HF3?/<&<]"-ND5$GRUFG(^"G2$_T;_3V*2XB+X695KV= +M`"^+\;%R)BXS-6LYT("19H51I].`\N&0Q5&O$TOP)F_.4RM1VE6I(TY>W@L/ +MT_/C--&H?678$X'39=32E-+'TQ]X._:'LBPA2SV#/I7UY\=+/]-)\,7Y1A(= +MZE+U%E0W75II=5?9<8ZPN8-I5A* +M?+(Z7T8MR5_TJUEF`FHU25WZ,*!6XSR=.V0\DUR>5<\W1O+/,VJFT]_9WXK* +MZQ_VC^BBQ<.:==&&L6E6#T)&E>#C>>5-_O$D(2^A-YE@/='MDX,)C5&SPBTS +M:@'F#7J3<7$R@>SOT:%46-8Y<09S1,)G@7L"NS)R)$DARJC,I:' +M0O(X4:0%9W1^E*8^G.NX7N2YX(08_:^DB7J%R"IY0:T9\K@<5R9DU%).\;G( +M9Y0M"VA"C<\OH`1]*(&9CXJ,LJ?;6+X/7H](@JZ9&<+#+0=@S:9I+F+T;)4I +M,\I^TPJ->:ARN,RULWE?>R9TE5%V#F)TLCX/H==T)[7E`JNGJ2/AVR$M.[:@ +ML67S"Z)YV[1LU"K40)9V?4:U6H-NH*\%>Y,Q+:V%45J96%LGFEJY+&EU-;9" +M'Z="`HCOF-F/ATN?#TJ!$67%S90-.O;M9QJ2KUV_[Y^IMQ=A;H,MVGGPLX$\P2C2I'V,-`]4 +M..YY2UE^)DT8(]>9[^LL4),UK[#$(-@FUNQ?::QJT,C+,PJKI!H1S`C1@SWW +M<3E)65]/*/KS&<5/8>,;6T>(MTPQVTR%S?,LTU?V]>9:M$Q94*9]>C&62,M/ +MS(+W)K45:;[0P"H&-5]FO7:1?7%>,ZR7>J@->R!/,`K?:=*^."WS!63.WC3) +M$GAW)*W.E4IM6PH8C5S>HS +M54&U.*N9-?7+M@XB/7V4U0)FC&":&O#SC&)?F+V-QZ-F&H],W42GDY?/UD5! +MF9W2R=HI7N^X6(?)&%`:UY!1*6I1C[C34LP[Z\0O`.,`S_!%F5''I_8^(U>. +MVMNHG31V855&E=Z,2#;T9&S3D,:<9N@+N4U2_?4;.*T4Z'*%VS,.&XJ%KB;Z +MM#7![SRC4%L52-2S;F@WB'X)BD1$1ZP7,LH-GNSH(H[),73QUNP>[*P=[8%^ +MBXS"&%:F'#R"4=]=AK_2?!)*N<;:]ZJ=E-\P4P_U4FV0(UJYPJ@Q6/?;TL?X +M%GQCP;&JC.(^<^9[MH>8;XUG?,NQ]"+.T4%4,$\D*O`M[.FH`6J_-%9@=5Y0 +MA.`=G[%&OL6_B9_YBR)9;B]U+"Z:J8ZVI\?NJ_6'C#K>S/W8N4O&=!>KM909 +M-5UW(2WECJFIPE.`Q7LW(,TJ55D3GP2TU/C#Q$OA'O][,!_FB>+2= +M^:*U#JS@F;B*/25$+$YX(:-Z2DIW7B(GT:`<^*W.3V0MNFQ0GDC6XQG$@?-P +ME96?M86)/SBJ(J5?3W/9>I*7E.P<2,1#Y<[%S$F20Y51)9HK#ILBK6F,$D5D +M]#%04J`[Z=Y18UJ_$:@N^I6B7\-\3>BSZ7H4I;,:$3KIFF?4^^D7SI`^$Y$X +MZ1K2%2=/?P$1.NGJOU$XDXV:46^!>&V*@FJJ4]_4@*<<@K(%>FD@%)1:KSMQ +M"@:5K0NG8-#U;""H[EG*LW#,)JI_GE$XYR]E5@_$%Y4KS9%%0:SR/8YO@O#^<"U2YYM+;Y%\VE!:K*OS!K4^L93N8&-]P,E* +M/?0NI7;0W_/T]]J[,&Q9`Z,W>-N\OQ?I0XQJ/E]0 +MGAD[9=U$$RKH?P+JOH>$`P77*HXR\C/^+?P?,8SRC&*:XKV@Q)+`K%D]\I#Q +MNX8]`*,2AM?PRALASG^HSAN15O&?I.VW#%7XC43&8P\)M5*W&2H/&17LV"[^ +MPSCA'EK)&[?FXE%HRO]D6\+:P=A(0MV7R"J@NN?97,7DV!B]QNK:-]SEJ%4E +MY5:E]%06^C7CB=_Z37$IS<8ONN$[E.X/)KFL'#WA3:*+3E\%;#BO7-(RG@A7 +MHS4"\23@J.8?H)=G47N]R9;^S%A+0B;'KJX:>);/O`PCU%D/R?X@[PH2%^'V +M3TMTSK*@T(>%%/?T2#S-A,14JC`J.%UR"-ZC,A>;CA+H-UM].RH'I7,V[G&6D5D'SK_9S#`-;ZUG*9YNI +M'#R3OBN5Y5:P[3=`[650RPH3#PF]JS7*WYJ0+X(34MG@'41?;VY9^OF*(S"$ +M#XDO8_G-5O:U:[07/F3F;1D'6CVFLQ5!'2/?"KTG(DNSX%&=9?O"*$=07":I +M]`)$H_M+Q8I3?'^OTH^ +MRV/G7)NV::&B1<'[P_"%6'L=D6+?^5!0IIT#$VDIWG:.JS+EQ1%]V9:@>G'_ +MO?R,Q-,)TKHB*%/RX.!45FC5T&[:X^@JU<6VO=88[L0G:CQDO%,I_4?^1!UQ +MC*0UY'9/#+AZ8LAE[^Q_?5AR.U5.A,T?8],:,:-#W46]TEZG["MH!O,9%>S4 +MV2!5]\(9.49FB!MH#O@1_149]03=]9^BV!.Z%:\(CVG6RH576/J0-8$RH\`5 +M(QJ(=D:D7*#$RC&V']%F?*;K[F2V>?ZH'A/G3-/C&-\]!-K5QTI:LO(AIW)M +M&1*:,%;H\V@\,BH8I-D`2-D]\M3DIE-!%VHN=D\S!?]8TX\!CWCL0QXL/#Z> +M9E%0UV\:L-_9+W@7@[X8([DEE!Q/>3`'22@XB7)N0B/]LJ35(I=X^I6&S!GHWDCTA)K=I"*WO$@KXWF +M&=4JRC'-Q#AAS56=PYXO::4103!P4T'!51-#7BJ-M9V2R\A.QR\*"M\DK,=S +M@B,4BF]*Q14&R%H[#BPTN#[^#'!\EV%GCWM]9F^U!;O49%2P1VQS,YL'5.KL3I\?H3*\>]28@ +MPQ8EQT,+7IN<<>K;4TWY3&]$`-"%WE!0[&U6J^G1S$3;:"(@WB7HE*#+@G*( +MUD-%.9CO,<:GU`2?>D/R;T50[H/38BK%UV&J2YHY`.9^U$T])B<*H$;ZK9S6 +MIU"O4]B[KFUT:&+6:&)"I0M>%U\]+\^H@U$_DO[W-]>>*2EY=!XKHUKMFH)! +MJK&M!97Z:J$H.<+C'Q'4?H(VWUQ0ESS.:^3,E0-'AV\5'<;1[)]HT&S)?FV2 +M8Y/`'J_,J`1]FY@D:9VN)40OP<,KET,#SJJN9*'RUK@^I..C8F+8M^.A:E`T +M*M+#OHP*@]KPV""-VB[ +MTM2\X<53RX;9GIQ1C]PN$G_"1.2RDO?Q?Q&^6GQ[I&72S>'@$^^$#8N)&@>) +M"/(]HX(?/L`:I;KS`9'SWX9=+I,NY`E!??T!B83K-L0H"(Y +M3FX_GWD^-_'V(5[A!X]>LXR_JDI:+Q)]?M6FMZPPCI[YLISXV4$HO911WWB` +M=2B:%48X3?,VN.T!EJ'RC$*JZA93EDG*B>C2CFNBM6%_:4.Y8F5!">:-NES/ +M(J,2L%[;M6,P<2"UCWECZPN[XE#*=?WTW+#VL7;4'>ZD7BH+"A$2OC`=R?M/ +M.-^*45SS=6SI6#\I)-:&55OZ:2VIKJ&T,ZX7C*H+]#N`0MZ*1RC.LLC,M77C +M^03GZ3#*>8K:GLIC[T?$3:")\RGIM2'$)7&N;U?!>()C +M&U>ECO0D\F^&)L&^PP/L#\;G@[V3>YO'3+]W.R+8E1"9`N>"W#+0311]U:?QWVM(WVT3=AGJ23-!-HZ_(J)&2[&+(V>ZBK_.JV7J2^6F. +M"QG%+X@Q4IO3FI>(SJ<^$5E+O)"7FXU*]5*1?-\\'SLR-I]K;F'EL&U%[]1<49%4ZM6,YK]9"&;LJ>QO1%,U[/1+J3XW\M$XI>SW&4GDHLURIS[Q`BA+/> +MQR.$OO43Z.)URDYKC>4E:>L&0^LQC@U=R +M!(YE0ZIS##$:?:6W]F+>+`N*$&,)01!?&,(LBJO3?;E6USI^Q:2UJ5=UN_2M +MF@N)3W47>M6N)P9+[="`W:`J*"J'TWFY1E0=G!")<\%4IWR%FFB/-0K0%]7< +MGC7#+<)U?8(Y<)Y17::'>.2;VJ/>B2D7T1?G^HSJH=$).?#]U((/0R/\PCY9 +M[/,AM[&MM?XBHTR="MRJ1+>?"];KSZY?H<.-*_1U.*^)4=0"P]*JO_1>:TNZ +MFZD&KR6.TQ,;U^M+)M)N6=*BN>QJS&4;J?2'TKQV&-:'5*_MN0JCGFH[C&.' +M<(X<_:QNUX]Z5R4MB]BU768JV_OT-6*FZ`%."XA-\WP0Y+Q1-=',6?*,:N7A +MVN"_S:CX[NLL2!R3*SC'GR4&>%>PR*B+_X2AI<12#`=YC;]IQ[I5QK/H6;N)OAC% +M3PSR/LHE:*I)R*B,J<^IEA::4&5&N09U^@RHBM31H$Z;`55E5&!;D'CKZ8_2 +MJ^,E\B5V@<[$^=O'\;0ZJ@I!B_9/F*_SC#J)\-!'ST!D'#P84VRK"YZ,T\G\ +MX^+M]0OBMBKHRD:_.Q"W216*C,);]#UZ9Q^L\F._JL-0T!RBK^-D/,XKW(O2 +M[RN:'.X1USII[LN28[>L"_+;KD8J1+3(RG$R=\AZR5;ZA?62QWREGJ"_*OUM +MQY515?,$?W^+W=L_?7PSZEGZNY>HT>9X+[5;_OB(HNDF3LGOIK:;,">(^XQB +M3XA8B1])EO35\`%J$]HM2EHED5?Q!FW>-U&GMT>H+4-&X>FCB=*T,[A=$V>Y +M+&D9?K!DAEFKPJBX;[L]$T1?.5OW7#V;Y[2JI)7:-J36?W58N6/#-'..D8"] +M/#GJCF'M`_%O]0F,RGQH.>D7]'?BEIL.V@G)-3A2`5G$C:'8DRP=$73SR03HK26(M[W" +MRDPX?7?&]8D55N*KZT*D+^"TG>N?'%#7;Q]PIK:7_!5&7I6VWN@N5Z=3V1`_ +MVK0KC&K.@=.F+UU\B?@`C/*( +M'F8A(MAQK5M5K[2M&E_;F!:??&5=7EU6R"OB-"O^/&V'RU\9'QWQ'3)\$7CR +M17'E3#)Y?&8-&14\3W(\YEC2"]3AI$F\7&NP52PS:J]VR'^KY2J,>:DOB" +MTE2>1UNGP^>G":JY/'^HY9*V1FT/Y$)!_7GF=)!">56S!*/NJXEFCG025)+? +M47LQJCF=:?83@D(OF[B?3]AU5:PPWOB4T-N)W(___9>@L--8CE"\%_HGT:VZQN6,4O9NP'D4 +MC.+:SY5ZW6?V8/JPZY*")=JR0E5:XBKQX.5YOX6UGSZ)WR[<(,\HCBTX02.^C?3/-GM2`4DB'/=TR/,E+5A\6!2EX;QF8EMA59=: +MO'B2S.Y#[)'"N^KLC656AX&<*'FAI*4VO3;3^]&)%2YB +MX2:QPWX.?4F:NGY7Q)EV_C6GS!E$6%%I-[MZ+ORWWV6U)L=:%I-&WD;\M8UJ +M`"2O3TA:-/-"(U^2D)UKNK)\/@9M&O:K@NI^AG<,>(?K[.>9LJ^+[4<(C,@6L:;L3)`>D +M4'K/=5(HO>?ZC$K1+S7[^9S=_^UX=3) +MW4*-XEQK[)<:F5 +M^ECZ`_*7-#ZK)QN]UEVE5FJ?4'W.%?I4NIY&?^\AY.GTIT_AMJ>2GTFHL^A- +M[;/S>@OJ"CU,?^?2'U:!\HP2_I!P<>KNA9260]>/TC5%UR)=_5.DA\XI7(>U +M.7>^>QZCYKLCC)KO7D#7(J.ZL"^'4Q-P.K=+D_HX;*R4VPG*F9HW')X2<4R2 +M`793S1/C"8FOF-@VN)Y7I]86RHS"6V>[T51L6_ +M7_>:G+*&-.Y_2-*NGB)\HC$'O(VGK=_-:37ET)QVGE$\?S67"='_\"RU0OL- +M:=D=8;1P&GO2YLMB`RK=(DW>WV94\QNDQ6<(F>?EQAS-6](GP_B7%4F+RW1C +M81.O_3MU^P)3MJJ@&G)SX%_HQM/2_QRE16^=IK?V>9Y1R1G>ILQS_Y^GY6CB +MFSYL]_&I_8N,ZH2G66K(4^/T%Z]%6GEMA`S_N75["<*V?WEZC@;1GJZ7M?+/ +MK6BBN5Q51K&L2J/V)!II[\;HH+X[1LFHA2V2]B5'L\*9,#,4;)$.=3V,&@?V +MA8SJR5RAF[VHXR<]^HS"G@G+Y#2?7]078`XKO/-%LT1=-FN:@CFV#UTS* +MC-I(3WJ0QFQYB^_9AYCND5Y54)WR!.G!2P;W2!^V +M#TXG31>G`I6^Y+'!:]A#9HQU^"P]A0[_3Z[>1G]OH;]WT)]W +M.O3_P$NDQFCTCGG^J9+C&/7?3;WJJJV#&UZN]6<#X_]`\E=R-!$6!:4W]Z9( +M3IK"J0)8^>S$JFG0JV8]/CB+>$=XJO`).^PZ$R2AI0=\ +M9WQ,X[>BW[ZDE1Z@429/>UQ!]:3&M'*22R`%%@7U\6=FE'LQ(X>GQ6<^L1@D +M^9"T0O=GGMOU,Y8S"V5)JWOS09G1]FB'!M$E2)_OT>99A5%\FIVQ0N%T")&P +M7Q&M5"4M&G>%1XUT9FWN(!R!3].7^CTR!.G[<:_'B7W/MDCFR[R@8M\[33F[ +M]*5?1^TCXQH1CMTF9)%1P;_NRMG3?//4RS6248(;GY5]/Y+K0D:Q?`0KY3[E +M!1L>C:10Q'W`OF19TEHLEE-EXH&)$XRUTXNU_MHZ\>2L,&KL>3FSL;G-(;-Z +M1%75>NDI5\^T.5!WTQCH0NOB_.W3;:LB-[_-ZXESJ,@?AE'-$E!,\V%9QY>T +M`AQ\B[,"86]2XM,YG:"D84D-.BDRRIL[P+;IQQD[M!N^[ZCSVY1[K!K0)]&[ +M,"K7+F-AN8K>O'MNR7#@`>T3JBSEHJ>GTJ_3**W3Z?H>^MO$$M*`/HON*U%: +M,E\KEH@*3HDEHF&Z0B*J,NI<^B7R4LG(2WBKW")*#_IZ+U`L+TTH]SQZZM!U +MA*XINEY`UUZ<%\"H2_@T1E@!#WLXFPPMPS9N/W^6)5&?46/&9W7R]D8^P=(\ +MXD^\5TJ_K'!NDSUMPISQAEX*&17IQH1N@Q]2X$4>`"F<]_O>2']L<>H;YMT$ +MH2J"2MW$Y^F^Q#HMZ6HX!])9KL%GL:=3C[_CT#AHU+U]1C67.F'MU(DO[H1]H4E+3G)R +M'C;V=[LL%Y#RAH(:C]GF-N6N^G?FRI+C#'S0YEYAE"U#E75MR5W9W!&O@U$3 +M/XRU5:(Q5Z#UH-4"ZGRKL851UOQ@R_;J:6JOP==KKTFTUV"\O9(SM=?@Z[97 +M.[77X-[:R^YQ5Q@560KRW+%E"%:J:NWV@<+:?@^[_]7!2*/XGU>9MUX.JWC8 +M!0QNY]_;('^MMN6RYP3P?OD-5"Z].Q=`F\-YY8P";:OQ?I=/UTQ:Y$K613%* +M_-51CDOIVY?Q[3G2AZGY_!72+PH*W_81[^I\*J>>%Z030X:2X\>E!5,/Q_HO +M72]C>;7E3`T6\#O$%4D+G`26\'^%+O1_.;$+6%OH`NH&DK],2QBK +M2B-]R.C=U"$G=B2T?I_5^6R]N*?9;LBD1?))7E`Q&F"JQMK[^,)H)/L1BGV0 +MUCUIK)8M>E,';$>+)D>3^IB<`>8TY1XVHJP,9W+?:7(O"RI6AE:Y5QBUTY0A +MR?RO,7=0>572FJ$%;.[Z_9;+3;9H`9M[7E"Q,DR:W%.QW'U!C26TE59D7'LZ +M^+\_YBRJ*"A3!K:1N^ZUG!TA?J)=+UK;[H6,X@CMP:NY('PM=SI65^!C]LO= +M.3Y9;LW\0OG]AD\(UP5O/EA\R=I&MVW@/6I*O\*H8$,]E]4F%[6QOZ`^]2I; +M]E0%M>ZUW)G(22'&7VU(J-#4A"A:?P"HV92RLU%.6+POH$HQHHT*F? +MAN$^+.NVOJ"PGG2A^)"M$@M[&K%>U*K%#]CV2EBK8!KQ=JQ;3^CP`]&HQ8B/ +M1@:-2:R8W4_2VU6U_O('FJF01[VQK;'EK7S`TGW)N.)\6GI.,M:'/J-*GZ(TM +MTT\ZLL%%M?XX%RXR*FYOQ%+H];\84I_Y8VZR=HV'?9U0RA7M'"V3?1UG"">< +M>7B.2&1E0:V9[V%'"A;`?&+N>M)-'8=TT7[>$:HP"J="B$]?02P2:1QTP5=] +MLC!"6I2J,BK%<7U4C[K\CPW[0]&<8L\6C*%VV`$Z +M63Y)#/IMRLGZ@L+*/(V,8#_SEGK[S<1K]S4[E45&!;HMRWY?9M=Y@IY"8_4' +ME7H/_86,.H/NWH=S)6S,1^II:04Y%:-LG35*$G^ +M[+BN0%R@I?4:EG*1(M2K%ZPFIT9NH?C4Y?_G:Y5Z1 +M4:Y*N*\B!Y8KZN6Q=F`AHQP3'Q`>8[L-NLN>=46M73[;S(]2-W5NXWES5#Z4 +MLR*HU&9/77N8TGR>-%$@_!;A,4.M@])7!75ETDLIU"#AH0985>FYY+'!=7_C +M.7=(GP-4E!O.3D>+Q'.E]/+GV'F;VTF5!M0]GS^;6, +MPIXOQ_]`FO#[/80DF-P?14/$>3J,VA=RUKC+/CEB73EO>`Z>]:UB.:S,*,U/ +M/#D9\J@_,E?*0#Y,OLKW%4;=]VU'?10T_L`K.5ZQ/I32V+A*5C3HRZK4<8%\ +MC_[KM5*IE?Z^^UA.%QC5_AR?;1%\[K%<<,1S.;L"/KZ%2G*HTGE&!0?9^IAS +MQ5]\6/8L\/PS?\_Y!3O7GO)HH[P;M0P]+PH*]=LHTF>#-[2Q#@X9!;Q]`T_A +MX!YS(A,L$K[U<*Y>CIE51\UFBH<=SKC(* +M,GTP-<\+SI8H-LWVHGHH+B&WM!=]].^Y/*,NFUKV)>2RZ-LR'P8_W"G[+P_* +M+.@SBEJ9TP&/+DE9T^B[-^X\( +MG[AN2WVOM<*HX)EG6)Y8SGW0'FF'P6-_R$'FKTJ.(/\]"^Y_+"E'(R=Q#I#IYB=*:>$L;?V&<6UGRMG +M2''O?C.VFD2`8I16I5UQ[,'F?E"?VYD+ZRC3&ZV\LLK#K30PWI&-44Z%427C +M=V=;-(RU*._72HZ//),+#A3DQ'Y*-91K;&=.?["Y7-'Y8B8WMB=G5&C.&8)\ +M5+M4WB#W!%KFE-TY_X.6R]W^0_Z^$87RGK@[5VQ$T3@"G>U#?Q_027"9D +MU,7H:7OFZ66/,_5MBJV/EC_X>E2(-:?*!RT5HFV"_WHF!SH(/O.7G/J8FV4. +M\U$W6_V@U730/FMIIEDVE2[L@[43G`"'>6F8VNO<5OTXS7Y"4+$^Y!R#O^2L +MK4$9ZU^"(NUY&L4,UD=:\=Q6=51CA0+B8UPIUF->**@0Y[@%!44S%.^F$^(J +M7O&79^5S+<_A?7:L92(N+_MML8;BH[4K@EI_8Z"ZDW1 +M/%=EU%6[93^!XT:.G4-)#A2BZ&^4A_X7'MO,DS.\"PYIM&MW;`^?:I+_%]&' +MZ`WJ,SZ]%AU[:OV^H,R;EK6`_,6HQ/C:@&3?0K3+$B;D'$)$&@Z]WI!1L`&8 +MM;O1!B"^4EF6M`PGV6I],]?DM.UM!=XK[!$NJBT +M@NFN*BUQR$,Y=2S+M>+SAG)0BOQYEG+4H*1UG]%T@G,F><:" +M#N*?%R_]4G-*.LMB^SP4V8D4&<5^Z?;MY*.YX,CM.L!G5+.E4F+] +MO%[U\HIYQ@W?\(=(_>'V543-%![-IEQF%^5_]L)X#TN9G +M)NV*H-[G%NJ04>U$?9.E4[3" +M20C:`L\,8YNIY+LCZYD*HYRCS*Q' +M>M12JSU19HN-]E1EE&MRW/GEV5K67LXI7/1U7I&%M;+6YXN6F7&K-<1;S8SP +M";74=_`1D550TK<9];.K')JQB+\DMPY>"ZZ43NB7:J=XD&K"VXC?,ZH7I]G0 +M+(KX_$EHOX&DH_GYUHXBH]S1]N7J^=_G;!1_1/N^!FENA!^VJT-&J>KO=2RR2F;BR4&16<76^;L:[IK5*1M&)M8WL+?<`G#5+YJHS2 +MEQ@[+>I9=ZZLCME^Q4FB^@*\[$*[W)7*1O9,1%\GHFQ8*_UT,IMG%#2'PWF= +M4;7@WV5&O5YLO\H%5IY`.L'/?I^;Q;58WX,RM9,4B/NJU)'>LM1YWRLM +M+1OUAYLE!8S6!.P#[J7RX5S*J5HM_V$K=>!-\(O?MY3>_0];#A!/)]C\>^:8 +MS`%*U%X?-KU=M.FI'T]/+VPH5]QFL5?E5?`-2C-8Z)8_+!H%6I!XUW_]OF4= +M*WM/ZR9)J_IAF:U,6O_9.BU]X8SM=1NW%_M#YB]L:*];9FBO"UNVUR:33D)Q +M"D5&<0XWMDZ'Z>M"JS5%Y?F/QG:G<3Y2;BS7%UJG5XG*U=Q6ZG)I*S69&:E> +M:.1"Q>UU^?3VXG@='Q&*SHO.LB93V.>G^&(>3DQ@7R+(/OF/6)G<(GFEI0GE +M3T.E6J"*TU!N"U3XD69-I\&JUWQ=EK2@KS]J1D=44M[%!1+[P30S="64F_^HE$H/Z2AGP$LEYKM%1G4EACAN@DH/%!&S4)WV^T9YXJ/_D#S1 +MF..JUCE6FG,!BM\`+L,K+N1+MYS\F[94! +MY;)_K6/67A`3`?I?\)8_Y'R#2O-N@1JK>XLWQ!/]6#/EM#KO)Y2T./)<;2B% +M_EN$L=/O[JX5"FVC*[E\94:AE"Y&Z'KP'I*(CB*>;6+-)G%>)J/&DB:*UUSE +MM8UNV@`$SX23M[!//TAE3HI65BX;N/4:R%%EK6+?B\YJ*EG(XPLB:&WG\"$W(&%)J +MR*LRJJM$)5;+7=8;QVG4INS(4UP2_7&KL0K2T59O;&@O1BUM)8&2UK3C\MD< +M3=/_N+37W4/8?>B=NL5#S.8G:M=X''6/)*)LD'"+'[<\AW,S?DR^^I#[!")[ +MI$G&H/*%@B));QVX$``D\[C!8=('D``1?^+C5L[Q2(KBW643EPF109B'_4!E +M*HS:69N]_*7:LP,V1UO.X+'[/=%!`'$>:*.H6]/Z);?_0> +M3W^"94RJ&V2M%,HSGO'@FY2:"FA8?9#WK_*,XC-*'$?#&AXGAN+4:-0`$3G= +M,4?[GQ!MCI](&O14_>E^6<6`%'^URA09%=RF,J^M.]JMRX,L/WLL">[_2"Z4 +M'*]5F5WK9KNUM1EOU^6GB.YQC>+=K46(]R@Y$H]*3178GE]CSXMM,@L>_&%3 +MB82N?*)!$J6RI)+4]N,LJQ;LJF[U$U;O0,I$0F('0]_'2Z`_R2BD]4*M/QA5 +MF9=*=_!I7XG+B(2__7`.48#SC&*>=0!\RF@&GE#N8M94`[;HH7O?%Q2LX=E; +M.>/=5RMX^'[G!L41&7?1M<@H1)&'C?!98'UU!2ETSN:\2I2QU#U +MWGN)>._VP6K)M)V:JO4?X,YWJY^TFF%P_X.YW>MPFIRT/]O$SL68=[2^R+8] +M^+V&[2-\*E8^%VD8SL=)WV:4I"&Z3]YH-QEU3T?P!:(@G"]ZD>38K-VTZ^#S +M]^=V&>NU(J-*[S'V]S^:J%_;=1^9:^J +M]`X306NRGSTX\XS:9"))7'R&4C?3/6)15J$-;^S'3I?K,RJN$^\@G?BEJ;6L +M88K6VNX6)<>TTBE5(*UUJ)"B^ZK1F1E-.G,HJ*Z?^NJQU^K:X7*5L;QP*?'" +MLBE]QFC./*9[TJ9J:%7JSNK=>Y +MR*BQ;&/-F^LCW&].,Z'RHQRG;A>G'#AU04^&!R2S&*WN,*HG40Y\$"_ +M9O_Z+O$SGX+2D5[RM3-)M6?4/73W%?I[["SYRYR%J>U +M/*,PN^UM7O/_3>B+N-=>YK4BHS"[[6U>"QDUME*L#BP'9GZ/?8`#A5^4&64M +M&9:9%8+@%W+BH97^*O\6EYGB%O!+X^M?_Q;7YH(,C5[V'EA6X!VE<8_WC?3% +M5@.+=H\.O3^7,NN85V^1=7<&H99O,_-]R_L56T[$1DEMI<\6+IVES +M^OZC&G2W5?7^TLX4]K?+%HF_7[3A;R><51F5:24-8SYR: +MQ]&2JHRZ"#L.&:SJUH8DUW8WOB*H/RUR=,8/SGL^IV#MW[Q'AW@=C`I>JXAD +MX*S4:A/][:KD`N-UIH[HS/J?-GJ:K,IW(6I_VEU*[:9!11<\+?Y6C,))AW9U +MN?*(V16)M73X:3LC\SX89,+^K3GVOS/C$7ZW92F7V7]FF_E8&E$\9$8UTU9S +M+*KJIUO+Y+*^:O?G]"56GB@QO%UB\IWP/$G)MW9TXPS4MSZ=RPN*8T1ME[8V +M,8R#)Y^1\S+H2U]0+_U-(B4A3I?Q,^3(HVPUNWVPR"B,*M0X>..#T:K\>(QF +M0T8%?WR*VIC2@R57KYG_86MBD&5)JZG=E\*7R]AD]+A#;H51L%]6)3FY9`X] +M=>QOQ/YW!]RJE'Y"O&,B_SDSKEE*ZR3DI4`=:6)8.*;FP6+$^;U[B'L*\NJE +M0H42WTY]JY:#ELAQ+))2;]7S8,Z_U(Y:[.IJ$Y])\ZQJTL)Y)XQJ%14OKH6% +ME\:Y"7@8MY&:+ZNQAL.7&<7MI,0[%7VY8I=08#`/+)?X_:7_")^H1CDVK(28 +M'@I,#^DU-JWXJ-CZB-V9.H@]P82?F$:RS=)ZQ +MD;(QYILTNLJ:?Z0EJGMOB=&_,>?4EP$5MT8I)0P%SMF24^<^G0LNI_%X6;Q< +M=MRH2>);6`8T',5GU)B)8-X6BS#9.$^^766^8BNH +M@VD\CEJ*YK,VF^P=$L;.H\JHKS\<:T5(1&<]SF6\B^6"906]%JC;V'HTXZK' +M)/YW.5X#`N376MU*?;N60P2;B&ZM)0EQ45]0Z-UBO7>9)_[3J]&.<7&MR'+4 +M;V=MRZGMXM7#HR+FZQ$R"ASR*M@NG2YS*UJ&HQT;6BDS*I!X@#/*%)6U<5[( +M/34F/16O0951;$,#*OS`EEQ\)K9SKSBN[8T/\GI.('J:[/*(7%+WF&3Y:VTU +M)Q/ZZ\I?08-<&#[')6?+.-OC5.8PB(\.UXP.%Z.CO3Z>RH*RWQD+''P1CP98 +M"82OFFCT\Y[*!1\3;A0O9Y51>XTC0K.69G8U`LL;&]/*1#)3Q]9I),\HMF5F +M7KI"8\LRF/=T9+V&+WQ&!?DMT^2DN+1=9-3>3OA`V4)&Q:/_,P6:^!%,%W1? +M+MD>8KX\U]/3I$?8DTNY_OJ[7"OK+H7G&(^,LI*PY;K-^])ZS$K(,Z_,*S\O +MH/\_+F4"LB@HPMOTSA@7 +MBX_5P7K]?OH[D_Y"1IU-=P7Z&Z:_/T#VNP?+)7)E1%Y@GZHS)W$?I +MOGE<5L9$@BFX*XT'J8,XV:35'S,QH-\X4>):5!GU".F@[+\V6H]O.F>B_EM? +M;CGF<1/BG8J6."Z@N=ND#>O_/*,<>N+!AY5R&IB06.!7M\%K%BN+8Y[/*'I+ +M>J?CG?Y_CGJN3;D#,6]5C[XJ,HJ_IRH%78V`2D/S*JPU#R"W@ZCK@'\ONE/PEE^XQ"C5%'=9#*O(MR?@N5 +M`+EW'*`R(Q,9MSANQ]#M#TI?PI=8=7N]RDGV\KD4Q!=#1O&.F),H6`M5-:8B +MQ-ADK;\L:>TR'G6Q-/\_8V<#)U55-_XSL[.[=Y=E]XJKK;C*@,@N2M[1L.B) +M)^\B(97UGY1"GRCN\I*@B"-0D1&<71=<7L2QS,Q\&5]2,]313%%1IR0Q?)N4 +MU`QE0!3(ET9#-(2=_^_EG#MW9F?Q+)_#O7/N]YZ7WSWO+[_3I&J'R3W#K6Q/ +ML58XS9OKM)$_.LJ?4&+*HY/3N@=;HU&24MHWS.5 +M=%O&](:L:CF,]UI7[YA:CSI/+N%KG"C\7I)LM].Y012V@X6VST,X,3\DB*K1 +M$@CF"I6ZOPHN)/UP86H;LUD&-I=UXH=K&EM.]3>;]]`JE2S5[1&73R3B0T0_[?\]07 +MC*W0X;)HYF>295W"9R)'\&2A:Z-NY!9AQXFRKA>X[[X=*?T46WWV3=`S7!IR +M$^Q65PV?HW/V\T[P/$G=*TX25:YG2[=PG\)05$%YOZ)2JU;K%9>C]SFH'3V[ +M(EC#5-('CE\IOZ+8)I].9]3@VD1YY.Z2.7/[,G*KPOO4*IH?IC&[&%&9GRHW +MFG977@]P6;"EX-??`=]%W6XG<9G?2D,?S@^1#Y![V>UJ=CMYV4"UNV[CH^ZH +M-%&6VCDBQ?N5UP.4A$OT[''T",UUT`3&O1FH73#/;AUB+2RMT.JENB,X@N'K +M#(8>F6J?Q'HYH^Z:6G^L.@6[MNP9"VWKJ$VB,@V/TP8 +MFD0O?^TV7`%AV3A+#[([!6=)P&?X/XJC.$FB:)Z1PM/?-_0G[;L5W)$2=/L4 +MJ-NRO:J\)ST=Z-,I>)*X"ILF\T2-Q!5/_][C!)^@'9]B\9)CKV2W4,=Y43XH +MF4$[H.6-,^VXOG`EMZQ>5^-ZA4[20X52E:J=`VW^^$JNMZ'VA::E)8:#+ZI6 +M;L!V&-\GB,*Q$4I]OX%:!D_[0%WZ +M&N@T4?EJ'`.ZK8/TP8#OM,)RUFL.QBK2MZLCNY+["KNFKGZWT"9W?.CW-5IP +M16ECCF9X\T25CYGT6YFUJMARYS3N:W#\0]Y?_1PCRE4K\P?L/Q)5:5VAUJV, +M^BD3JS@_>C-0]K;\:QVDGAEC^ZP)T;[='2/EY/J67LM*$D5I].=PH_06ZAT< +M3]2``]^H:4^S6TMX5F;SLW=,&_+4_RD2O4EJ<^U6KM%90R4).X@5=;@B)YJO<=6^ST*((E0I1*M +MF;]\%XWYQ5?KE@*%(2SMH99E-?:V632.;Z>.LGHL*[$ZV!K2?9A6I2N`9LRP +M_^B[%<4G]3CK.=KB>4WA-F`KY&?0WR;J,L@"8;6/]9V72MW!O?U9/XZ1,E_0 +M?0OLFB/M5IZI:R=YR33FF-!O1/@->PVE0N#/M^I(BRJF]U5X+W"^ +M:+3[(PACC"CTY4=8SL"W6R16VI07;QOMR4=WLCX%HC`=Z'/B#L<='$?6M(O; +MZCR1@3XW7!/LULEO.CI%AW6*/@]2M">B&)HD47Z8ZHIA:K$@)A`NB?K)UZC^ +MHRLA7.7$CTBC>+K-&XCL/%&!`)X5P$4LFS6P'9T-RADJ98]0_* +MQ?;E2"7+-$&0FT!32PUZL['+N0V0F[I:S6-23KWQ;4?+#E-1G"A,4S@/A/5/ +MH[R,I%LGS[`;X/Y(\#E!E(7S")!2+'B"MG7X6PH72>Q])HFJQ[0);F'K#M.F +MWT8?S*DI3=2:\G/A]'>\G+]C]O+R[_A=_(YO5?-W3/)WS',<0Q6^XQ?RCHZS +MO9:HY6\[\B01Q9`W]'+(,7ZHYP?G[&)$#6KD?-VLM?^IWA+&"N,;7ZN^4!S? +M61GA^B?")W[-P6\=P?I145RGA56MB5(E'Y5]DBA+/<6QJ\/%9.KM7*KNL99. +M$X6A_DS$(OE_!IY0+156M1]((KN62Q,H09;U.7C:83^)#,T[>0Z7385KG'S[ +MI-!6I7Q#K4YX;U^!%#W]N-"FY?\8KH%]#.0/^>!P"$F,J`]0/O\MM+V/7QBN +M6`YV?5AH6XEI#O,C4:';\:06>#(?ZK./"FTHNZ[W"VUY?/N#0EN"*+F7:U^: +M><6O_+V/G*!>RN057-?VWU&GM>_2^0I7Z%9:>3T6"YZO<$6P31Z<:QW9M\)M +MQ[4YA0O=_!6ZQ,09UW$TSRI8"XJ::UTLSK/L)-7(@95$_>9:Q0@KEN0ZK;B2 +MJ-)<:YPH/>,:FHEG_/9?0Y0@BC0`'_:<@Z'%-41+RM80)9/?]-OW.*[W!?@,<<[UN";`IO/> +M,G7VE9P[4G7BX+.T]I7:.U5JUO\Z/@$YQM0!(-2\NU`S]"(P0Q^_TOQ?4F@RF^%LX+C!#1)+MU"-]H/0!3RK=@O#!&\BV. +M4?9*SH_]XR7??)97CP_^Q,FS6WKN_^32,#5@N(:(J/USDW#%?G[(<+W$X8K_ +M?,!P_5V%Z^!^)_'SDG`-AU2X?+"%I_J&!ZLP8ON>*-Q3B[J3_%U9%^RDVY$6BOI(F2M>P&Y(XXG0!;75PAL06(K/*Q9IP[2X@-8&:I:T_@FB=JH-RJ +M\ZG]"Z0&RJTZG\:(&BBWZGP:)^K35D8DB`I?#T^.?=M/8UB;?D7OD/A&GY,D +M*C@N6VG]0YJHV"'&$[#4ROZ"Y97AU:-+U%E!:?B&6-_*QZ&7[>! +M`*]2]2//0.FY.:C=,?4L5^-/":90+EB/D5:"9=[N1W#_5\B?L4DJMT+^&==: +MWM@R_5C=IXFB@=']^APDJ`4C1?VRM!Z`J'[GUJN^"_F,\X_*Q_YC'5KVU4NC +MTOXE4ZA9'=^]$E)*KQ` +MI\*Z/B?]RTJIL'SD)LMQK)#Z4`(Z[GDM"0AYAB1`Z>&SJ#<8:JG7>7;>OIJH +MUF)(/X8<3/LJ3PO(BZCP*`Q<#>2_T^CT,?K*X4P'CE_ACMHXNS7U.=HY6,UK +MM_D\O:'J]#U1&T\PI=S8>^E@&W>H-K)E'.N!O7A^&E&HC64MI*V]F$/P:7W@ +M2QTIHFFBD$?RS\^'1+XCNI\B_S5P9ZA;"Q-$_O5 +MCF'[5TC1^6UZ)OW?^TO2!/H1(TJ^4WRB3X'_&KPBJ_2B8NR@F +MP?4`3*G<)7>_[^\`C>+X1*MH%\.>=?*_XO)^L(LEDOBQ.L-0K?T9I5JV]C4D +MB0T''?G+2#OIE=G/:X@H]?R:WXH15?ZN?`#>NB+2+HYXUL$WXT21C&JYY4+[ +M#-38%VO<*PQ+$(4K\@J%O*9M3%2^!3"W];U'1@_YHS@IJE5GV%UX)S +M^(>):(RI%[=0*+O5_';J=35?H=H"\5_K%O(-97HVQ'^>(<-/N(_01, +M+!L*#L\!/-Z)\^;R#?`5GF6)PC0@'U,Q"/>/09XI+`O_6-SS4+YVR+XV6!:6 +MK'W`4X6@17,ZIB^B+K\:_EL@_%58BS>KM#]WKR._6MT>)XK&K$)J;SG8RB2$ +MT2E[L2U6JHEIX>O4>=O3X0W;GK>21(E5_&:NRK<384^PA>>ASY^N;H= +M_4D3U;T"-:O6N&)ZUA'+P>)+_!1K9_G%ZO8L4>A_N!O'A:#4[AOEBEJ@)3SX +M/--YHNB=L1S:\,\"]$//.^*GX,]O*/0G!WQP%+V8PRK^^9P3(TK^")Z.*9+B +M1":[%W)XX^S6LU#>HU3;%9F`MT:!%"Z"Z_'5[8G?:*F2&R.5&_/@Z0W/._(" +MN`ZO;D^64E%%S5%A^A#\.`_*>Z+01NZ$=V>KI\]`W&;!@Z$<@NQO?$FTJ+AU +M,BD364=.!_LCJMOSI3XV*Q^G*3>?!Q^_"_?7D8_X=9+P[KGJZ>]!]N\4Y2UOA/!-`9_RSSEX8KJL@_1U78F/EO(Q'O#Q_T'Z(DI4![Y0E8K% +MF8J\\SDGR3Y^#?,=^/!5]>3;$*[)Q5"DV:UWP>5)0/X>KE\!BT\B[57:[?]& +MVK-$Z9./:7T"V&+^^5^5%VA^B-W*@!M?5G7U8^#S>'#C@PB%-?PE",7UNC2A +M])X.B[U5KBW'`?5>Q(]1['H.5X0E<&I`;G>`W#ZGTA=1,@M?]Q05OV?A:0PL +MCX4`;N/[-(=K +M'#P=%<@[\(6A8>[WB;)$O0+_8Y]H+;04'SZO:'ZK?N>)2N,O,!O!/`OF)3#_ +M!/,&F'?`V#<@A?R_X=<'8#X!$SFOU,V83]6"J0#!QGPJ: +MML#]"6`2_:B3T`YG2YQJS,88C"SU7VVGX]S +MP%P`9OYYPM_]G2>JTGQM<&6U?2/U%0+KJVGOT#*PO/;)3DO>5H=?/$:4A;LB +M)TI8N(]ON(NS2*_<&Q9C+ZVUPU!MZ3/:$D2M +MAK(F!*E8G,\MC]UE8Z1)HN0\?IHO>RKG@OU[>2=]HVYC8FMJ/(TA0RNF3`-Y +M]D;5FZ-UX[Y.9,P[,T5T;%>;U=SK67FB(ACZY6I5,-B&]6]<%8SZY5(<1V'I +M$\W*5P5W_1_DQY3RT=-2:.TZ@_=13OV[K\\H3I15%EJBUFUQY%G8FLD[B50P +MCN-4'!O*WDJF!HSCUXMQ3*=,XIC]]#A.$-'\P''\"^DRG$'C]SIUF/<;U]B_+:\[NB5\;)VGY-E"G*!/)Y#_W&% +MT.>9&KJ3WL61:AF"GG"46VH_OH_;/O;-1%W")R>1;Y_[.TOSDMU3PT>S78PH +MU/0J]W_HX,H;ZF>5I8GXS;IE52*KFJ*LL%6:(`I'Y.7IVTBR.XEV63=OB.68 +M)*H>XH$Z>3&=X4F%,73O^D(;3JWB^%R:J-"O\1SB0IN+3W<7VN(HNQW07OUO +MH2V%[0FF?L/O)9%Z&Y[N*[2ED5Q7:,M@^XNI>\`M'"O'%P5_]3B[$LC-VBR\+R71$3`V5A_)9@61B(9@@:MQ)C?;X6*/M +MGH*EIC=#W#?F;)HOW[]G:M?%$*M;.'<49C3WK9Q@WU%G-\C?U0D\@VAH=(+5 +MM[NCIM>RTD35T4Q_M$5TBYG0NYE!N7C,TV>%>^LI16:):L!11+21.!<:;?%/ +M_+AS\XP&>6=]GBC]3AWVW=4H9;A[E8VZH\[%^8Y;=6F2KH+$,JRJ7?2>8"EW +M(=74NX5JMSY&U!&W3K+?6%J':[6&8LAI9YQ<88?Y/AXG*@PVH9XVRPV<5Q[% +MMU2.21`5Z1N$)^4.#8-OXM*WI]+D\MTB'I:K:(XU251AF8I3]XGQL#6(YGW# +M8C7/)HE!=II#?V>])]MW.!:Z*1KBS6*5'>ZQZ%Q0Z&M<S5(;Y&LSUA +M=8_KR[%-EB>*GM;32FQ^:O&I#&0/O6+[MTB=J^:%3D--B85PNXP46R]C@8C] +MELN)FG&GSH7F#I@O@?DRF`[<6X\KC*`G%E>4REFX_P57+-TVFO1QT'8DD15JSG'=K`):9FK4*SO#2JS[`XEA%'AEEVKZ- +MT[U*"[4!&K7C]]9:%M`QHH;`KWKXU0S7!KBVP+41KD/A:L,U3E0KSE_B6%,@ +M+$&W$A7=JE=N-2BWDD0UHEOUQ3!%E!LUZNTT499R(U3%OJ`[0Y0[Z'Z6*%S# +M5^X+NC\$KM@RRA/%\WNC9V)M8HV"]M-M?^T,?EO[=DH3U_Y@!I8'"?>JQ\O&@?%B7+%28-TKWYBA979":(.Z!'`?W],8Q)8HEA] +MU+9JP?'I)%%;[PF+2$\(?!F@BE\OZOT??TFEJU)HJ@7^'&A#4NBT/N%-G0# +MM4.)T6\[>)]FMZI8-P?K@GVSWUA,EJCR=84M96-@>78+6AO8]A++_M0Q;AFT +MNK&>Q#&U:]_E]1._0VK.^?"M:5_::PZ>5RNO>-D?VQ(D*ZQUK,Z$5]*^7:0>-G`WW4'_3^7R_X_+KMCI_;@]+/'66F@YO +MDJBQ52&>.VG\T)'_+M7;C6NPTK_3+9A7H.=+YXA4T)&592JX/G''^SS^BSMO +M2-\IM.^96A'R9F%X>E+0`NUDCMF3[O3C5\^J`^9W2J+D\QN=F2A&-<$NQ586=F`LUM;-SNL +M#3!$K<'DG?IK\]AER$(=TGH/!.NG[K#3/G7KZTQ16Q!74,/3ZOV\;BO+E!JU +M\T_`"'?8\F?;'=O')+N-#2XQ&(5?"5JME7D@JN-_D]EP`=MEYK2CZK +M4VZTV['?LU0/K5+YHAQZ2=JM +MN,:RN#U>HJ^6W5+Z,84X@S0;0%AL/#]>*DW^>26)XE/<`Y'!=QU1 +M:F>CGL^6HKA;>#ON?URGRE7_W=$0^A.6\[G;N,8)=X[%B9+_>8'6)8Z^=)): +M(2[#^@4L'V^EU.C^BRV)9 +MIL-=&BV6.2.XS,D2=?4%JLS9L)5Z%5=!#P?/;Q"?9UW2>:)V*3G7*&F0A%>\ +MX<@'^"PI^R[N#_')#30;#F[2&1JLV=C?^-K\&H]J?>XE"E>"J-UWJSY08ZC%3U>XVW[CR]332!)% +M9YN`;#X&V:"<<.[C8Q5&L?U=)WV7[LUA*'7X7L'P_2O4SCEF6V>6J&-?#8NC +M(/4,#7,OFM)%U[=XOI5HK8']G6ZKZIY,.PSO,#KI.)W@L,3R>5_?L`EY#A>MR*Z9$4Y=1KE5J!5_MH2V&+;:[B$?CX52 +M$F>:HY,]<2:4O-%-'0UR5YTX>C?I78DQA>N]28L*Y(C]J@Y'?50?0,UWL^7% +M[RF6JR]4U(9.YV_?HUM#Y=K0F^G$[IR'&H63[-:2&^FEJ@#EW_##KI7XE9U +MR,H3=;#K&W8?DF"#I[_1K.D!?7>J7R%MLX*M<+^P*@)2:8P$7?/<<<60NX";'L=2'GY@A#ZC313^CT@3UG= +M99>[EV4*GZZ$5DMO=,XIE_:G\D0E>FZSD(RM[NA'7-P#Y?V]VJV3EZ.6(RBW +M,,PYLGJB34 +MHXNAQG7<&%[[/DY?`>KX/33KB6[BV6G89XX1U1RDAOU5(] +M#-Q5HS5(9N_3*7HEM`-ML!U+5RG +M+9WAXK,$NT7M^92+J7%*F'73?"WBVM^G^F2;ER2*SS)\PYK6Z-HSP(TPE$9? +M;0!Z_QM4VZ>)F@KO82NJ/;*)3OCL)AU+P[W3\?0]<#]+5!Q^M8:[[6^%)Y!O +M9T4FV%/`G`V_X[B?C\/5TV&'NCN@_S_)BO1T0<]\DE4#UT:X6G"U[^=R=9LZ +M`_ITJ[X'3SX\W6KHP9,/3[<:X1I35(%'3N7I5DN$3Q_%>7@;W#\,3)RH(7!' +MJTE`(G9W%YTG/:2[B\Z3;H9KHI];C?#$ZIX`.3C:6P?7>OB=)*I>V0Z":T/? +M"!?;7`VH)1I:#7B*=)JH4$\4-2^[8BWT0??OX%/##HQPD2@L=ZTL4;0.8U74 +M!1N[4!CAT^%/>,=]GB@^N3H*:=YUZ8WP>:_%_B.'_C1U#G5EGV-$ +M(8'^#^1SG"CMOW8OZ#.>.9-@'^W.EBI/+\,D4361#BL,3S!, +M54JW?XUZ"]-:FJC0&CS_\70+M;H@K>^MI1W)*OB=_:.JTRCF$>4.]F502WXD +MM!U:16],S;-;1\)_/:=;%"ZX8KC"<*50P-5^`"ET-0*_(N@;CBE`?.FL9=0" +M<.F.J3&B5N$>J55_=D7]$VZ);VO><*M[JNKB#_C?<8WK5ML==DW/<5"N=MBU +M*XZS:DD_R0@W013)N,R7U>I$/W0W212ZCJ$.+^72&[\PYNEP39?=7--MIQ_P +M6S#7;*>V_#D5SN#,$C70"A)?WQ!1>@4):XM[7NGV>;SS+=*,,\FV'U2MVK@\ +M_._<#J_;RKL9/GJ>-87(27:,*+)]]9_]9W_"W!:./^BWMJDG<1K-X=2H?I4^ +M(2!!%*U&&?^NKVL(^S,G5JG3;OZ]Q4D^J.-X*$W::::4+ME6K+/5;OM+L+8* +M#X_CGN#L@[HEVHS$M:,\N3-/I3#Z1NL>#XQR\P_J%LS.+@'UOSI1"TJ6:5!' +MYKI<^WMPM==3KETFO.U@\WV@=G3)DI-1Z?Q:HBJ=PJ!K!,Q3<:+$V=OH2[^C +MST\)C"E@;S_!;M$Z4ZPKHI#@<4PGBN,E?BV1)$K7%0/U!-+K=6VETP6&)Z1K +MTXG;:"UEEJ@DKZ@L"0^=86-1;]W-K]=I=5_?=%>IY@F63_#]^!J`94E"O4RU,,OU,W0`-=9M(_[-$^?W9LGZ@MA]&:KYR(P%7#"V&,T+E*J?*&%'4[XS48@MF3@AZG"'=E@-[ +M:VG(C3_,);G;8L$3?V\49_CX61!Z'&M*/*SS-MJTJG2/\D()D&0BPDWZ;N&7 +M7;\^+";6\4[20:'`?.W#NC3YEI+1V7"=`N:;2@\%K8]^6+>L!BJ[,'7F'_;S +M-HX*O*K*&]R]1F>51"VY]#7'?H1]9-U`LS0U-'<[_IZG?L>86B+B.>BAB@6I +M#LSQ=(_K^%_E=7-QHDB_S7%;:3<0S3!_[3_^229K\/S:1W2*/E3IE"1*]]/O +MVA98)5FM=#^U;G72CVAYB=_O\D<'<"2B&=MQ.`(QZ>].]A'^0DH;E-(N59Z_ +M\^Q6V0A!B<_0GK8W^"7YC;O\TK?$Q__YNQ,CBD)9N[5XYE"9SW&B!MJ?+G#H +M]-$/G011ASK3&..?W*!+$SEXD'_N`Y;D7]!KAT?_UTEOT"7YH<8ZLAN*LH=V +MUAUAUJ2MYO?$8TT>SHSDB:+5W$MPE0!F*(A;W[!KQ)T?.O*.@]23MA_5/>F! +M1DVQI(H]ZJ?";M<;R- +MMY[AB<'_=9+LUEO]5Y+BB**'81-0WA/5'(:R-`*]_!KHY5N-]LCZ1KN]H=$> +MTP@AMQOM+%%CAS3:XYH;[?%'-D(N;[0G0CPG0WS/7-!HQW\$Z8NH*8L;[7#J +MQKIS@*B"ZS2X>DOGGR[&_S^*M_T84OG;N=7BQWX\RUS'._:82O=)H?8J4FMA +MW\>.?!YCU&@UBY.L^&-<3GS3:A7SK:A8:XT4=UOMXCEKC'C/BHG&NK'BI+H$ +M4>/$-Z''-;]NHI@_:+)X;]"98FU=:.E;]X@/#IP7A_LD44.N&39DBEC;=`[8 +MA.%^&ERKX`I-Y#J0V>EI#E>H\IX,\=2'O%^4J*Y3X;^GV09'`^7"#_C^9!'] +M$LYO$S4#OYF#(Z>#77$XTU@"(W$A/+,?IQ2=*3C^/CQT"\\AP/O13,:(6H1N +MM2FWCBAUZV>X?YO=6C^`6\.93!#5@VX-4V[]=V^)6U=@_C69]"MS])."W'G?TKP>E51# +M]_GNV1E-/8[4C47W2-/;R#TT6Q8CBN;0JM4Z9KU#_LT/B_-I&5V+HGN;,7R_ +M*M#HLA]RW#]$E+RJX,B?L\R[-_,JEV".2Q*E\]U`.2Y-E,YW`^6X+%$ZWPV4 +MX_(<1Y7O!LIQ]I_*2CFI@X,3^Q*UMSG<#Y;@X43K?#93C$D3I +M?#=0CDL2I?,=YKA9%627)JI2F16479;=0@E"+IT,4CP33Y<"^4T!^9VCY)'H2I2=C!>EF:*:Z6X9$ +M7OEXFH=?0#ZWR='Z(SKP]S.;G"]BK^<)I(9BWD'-"]^%]#2V6(+KE!0C:J`2 +M7*>D.%$3(6=-AC1U)J2I>*`4GZ)24X(H2$]-TU2:\@*E^"R5FI)/&.7')XSR +MXQ-&^?$)H_RXL2P_)G1^I+;/%T%^0R`_;C3*CQN-\N-&H_RXL3P_8CJ(H%XF +MU!A#Y]A,]])$L>UPVK,Z.(QGG'!ZQ7UO.':891]#H7YZL73;\.7!0N29FO>B +MO\_J?R`]U>D]2<>`)'#]SU^(^M9F&G48A]IBJY4VS8.\.X[F._XR4"N-?/Q7 +MP<'=`'&B0DHCZ+QT:9M':SBZ' +M/RJ&)1B*]%^";7*_'8'EQ8V#:6]2%\J+J=?['#F^WK<56^'WI.+O/%.O@BW6 +MZ,^_YLC-?8Y/OPSW;T+.>Y(H;?MWL'VY4*1>[*.QAAA1N[7V&7P*TF2MA[R^ +M&?65Q=DMR;I:4%,9KEZH@5[KN$M8.QIJED@P!01J+$-?Y!NL;13=P#XNCETE +MG^1>`(]-T/P_^V[+;75^'-/LUI_['*JS'T,]S?]R<-9Y&-96C_Z+VU]$D4^/ +M]O&)SL=`NV1#7\D)5GFBRE?Q8,_2;U<U]8G*/Z5%TX +M=@N^HQ8_+#N23^DXEFC_)5V\_.84>#--%*;'*5V +M>K*DSYS8K$-_J!5_278+5\2(6JL1=3.C3#M),H1[^_]WA"%S+A"M) +MWLKY)*ZBR6[6:=77YWN)/CT)Y"66_??EJ7@'-9 +MV-;I2FLUCQ'U%.<,LEG/6L;H?@/>UP@[_C3GQPIUMJK],+R)IU7*(6WQ2QZ" +M;[DTY.Y<-MRM[5OF#>J[T9/Y@I-\FLO[@4_5)OV83_LE$ZZ069;JF+<,2C>4 +M`K8!)NSA]4Q$Y2\6O#)EZRN.?`]JAK!H+RGOB2HO_\K+,?L9*E<[WZ:SXND, +M;MQ5=<,NVM.\594=L6=T+:IW\FX-EBI87D,ZCA.%(6_'U5TWP%<_0^E61,U. +M0U'C:(V5*+JE]LR7['X&]R=VU5C)9W3)!+]L^=`G//<"N7C+/U!312UJK;+3 +M[!:>6?2#@J/STK2NM^K$UXLQRC(%\0(YM6DW:*W[#?`6OCV]X.19$E\)2@(U +MO47CT[IXG=MR'"]\5I5,<1T&8P!)QRXMHMZU!:+Q),D<;2FSIIMN;B38[=%Y7VTMI>&H\&NR13%_$3 +M8=?BZ=QN?=\H*>=![TN=")LF:J#SFK6>IBQ1A](1B!+*$W7'_V*YOFS&2$RO +MA3T=BPNC79((Z1?9[=C/Z=IJRR+!,K_J%6=RH=TNK_@%,AP +M/=`&;GW;UTK0*CEOQ8E:@[J[(WSJ,>YG%=]]Q=&CN>*L)YT$NX4G?(1KQU$Y +M@[["$RJ9<%5PS\M.DB@\Q4^'?B2$Z4#A0A='^C^O9D;21)VJYJ<*!=>DZ`LHO]C%JG07EU`P,J1_&;LOOL>:9&OG5LRAW-4(W!DN1J;BBCD.` +M4K&?1^H4]#^_V]?X#K[/H-/6^VIQU\I1,:*L_;NF#L)5&I?L*=&^^(=JB/Y# +M!YTX4?+4)YV2,-T<3=!Z6+`/+;4F)(@2-[=/B%RR>^KJMPMM&+^(CA^M3ETV +M(TF4EM-'!>C9H];>JMV.W/0^]47P3(@T4;95K(5#2Z6+DJS"4Z)4/+/LEI*W +MI:0K-NYR1-5'OC3R`8I]$Q\#L:ELY5^6:JN*9_-`"N@6,T)]VSIC1-'*T=0P +M"WIPDRN9.%/J%YW%*E/#4*,$[O#J&B.@*+[<2A`U7D#+LVH':=49![8"]19! +MBNQ"'2K=KI=DMZ"M&@5;5/T6Q35J4%>C-$3K>1YJ$$TS=<-PUJ!UV2Y:W>=K +MU()K"URS6>[]=K`OT+H.8RK&D76L0:%W5MSDM:@SP5J%P6X=8 +MOH/ZH[0^^F]<6X5M;,LU"UP3@F>"=5KV"NQWL_LQHK"?WB+9+>Q=M/0R*6K" +MMBLNM.)_\^.HSG`AJ5RZ?6HUZ'C]0\+P$4>/P27>58EL(;S=`& +M;H9KDB@;STT%HAFN+34AVB5F1X`"@[_3[&,//%DU@6+?#65J9&FWB[I7HY?L +MFMJXI="6)2K4M^M;8]#7&Z+NF/!@.R8^6]23=4,TGBD:K7E,6)JC1>,A+[;5?LIC9!XL5#M:ST&TFB@K-_6&)> +MHDK,[V-E_]F#3II##Z7E%M+#PZ>_"NP1J3$9:G\1]0H2/8).H^.]PX&WA'#S +M2A*L$^YOV\+^F1MT?H3>B;M%UX_:/>YYN7;0+D;44`C#(*49Y]5M/(NNM3+C +M_J8X4<>J7I(>5]A*)YE(UCG?`+7$%MV"\=W!48B`;[CV/4E4737[MK6";[/` +MG_0674Z$U,Z#J8C^+ZT/G3D +M0:X)7*:"[N#8RP=AL093[N`/';&WX'A%M]!VT(<5-8-+IOQT@V-=86J7A%$` +M:K0[1=3.!!2CZ@S>]!K!8Y@1E\8B>C)AD6&W(KG;K_I`^!KLUT@^AS*)(ST? +M?>CD2L/UR5ZUU@A"O7.;'T9Q!%+E:1O;\BVTUD=Z>!IPE"C<+3?G4?R2?W+# +M2[6.M*+>,)>I`\*=?"N>3W2<*WHZ(%/,I!78D]=@1*'`(,H2MU@-X@F+-$'3 +MJJF"U]P(/C:\X>=HXH?:''00Q:`CV1%%'E?>'RGDB&*"HS0>X8 +M`TMFZDC+F/H-;>F.'/N(V>P2=;80]HZPA[F]X.O8$D>26_#?.#U;?O!=!U=% +MHF9UT9KIH#*+J!HHN:H_Y/'*2J>8N4=6"GVPA7Y8W^-=WI$L^VU\-C:4!?:^ +M,.7KYGV<@JP[H,QBBLJ$8=Y3=Z@1O]![COC"H\X@&F]L?$$7R/*5-\D>]S1(U$F^%L<_Y%<-_"]^>! +MO3P>[C]#/OX#VMT_K/)7&X25KEJY[4V2;)0I;%D,5NN?7GNSJ!MM$.^6<8F2 +MKQ:?=%MJSO&5HIU'5%B=L$,:W411>Z-?HA!%NMD._JM$@]JI^KL^_:Z38A^I +MGA(53['!+Y?Y3+]RXGM5)2LK/@]NYIA"E__\+NF]$I565K3TU' +MR5^'VG5YAK[A6D"7J6%0YET?+GE:2^L;.`0>4W)W449'*!G]K&@GB>H>HN3] +MTP!M*XU7BW<[*79+?QT<5_SNOQQY4VG8,D35J;EG\>?2L&&K'7>NY]BM?X3; +MY1X@]H)I$+Y4<6R.0G)46-5R..SFU$B9*+("S3P,P$\>FRL_AR +M1^D:IGW`O4?1&6(HNY7B]B.X`7TR/$KA+*%FQE`24:+DUJ*\PS]6:>(909H# +M<=S,'>JGZ%<"7V:!RL%/B7:\>D.Y]%6S32\&W)RO4LX3HEVR6\IEVHGW0)F;?U+DT;ID +M"D]3$KBWE!2/0GOBZ))T/U5)X*Y2WUVBY/I`:,]6$KBCZ*9W-(<>7+X_((%O +M*C=O95(>72+5>P)N?DV%\T;1GCI:2\*7ZN\#;GZ%?<]PZ'\CVFNA1^M_@QO. +M\,1M`7D1U>VJ<%P-3ZZS>D-+V%99LZ7*:@]U"?YUK4]^7JXEL>4=TQ%:X514F29*YD4K;ZWW&,6HNS.N#S +M:-9"FVK5K0XL/=K0O1-5Z)<40Y]I]=-];\"-$2KTBT5[$\@QU]HO15\:H(]1 +MX3V&J(5EH5X:D-]14'X11:%>''`#5^A'>;<-AMYEMU!K030W5R1KAY(/]8[@L#/C0I%+A+)8[2EP2M>KM@-PQ7/,#;]6):.H8/Z=]GV.@2Q!Q?I', +M$-6M3\/[/PZ/)N5L)G/'Z"^$-6:GW@TIWL7Q9P[?V4`>RREG18D>X'[]/**P +M!&\?H'6%HW]XMXO\'7+.J@?B<)9#M)FL"[LW[?C.*%(U>&])*K]_C"U +M;#FTM71:0@2N>#I.#<0F-4S5?&Z1.L,BWT3(%36X*C_J9IB"=ZH_X5USXNFB +MK*@E"&WS'%$X`\]G!+)[Y-MAJJV_!=Z*!DMR)&?I]N`&2`&#^4.H\1)8@S1Z$`+6<\ +MX.30?"M;%EHL0.'H$]SC7"-)VB5I+.\QFN)$:J%AD:#&69Z&E4.^LS$V]_$"AS6,? +M*\R=21O*!SPO$]?W,`6M*8^T-/`IT+/4?81VFDWW4D3A/N')M5WVI*HN6U1U +M-(?`X-,IK-^A.>.[]6UE@_??"=Q/@_L<4^$0V9S#/C7W:]^/"+;>H(,EFF^8U(P&-6\U7`=7,"Y1$G5HI28U']9W6K?8LH-Z7U74N^MM +M%B_L<+P1I7V^WN9*:]OD"&Z)%E>XZ=5JS6JU&OJ>(@KO=!C09[EI!VM)W,A[ +M'S(C_+X[KO;9"$];13P*OP=C3E,QRC&UL;A?(O0)[^*B66J:!P7R.$Y?PTO) +MFJ([D:=JK*BBNNSPT@[<`^NV[N<54\&W7*+"^Y4O>,Y&=8A/:(=2O%7U&;SC +M=)V&6K$*-(['/EER4G.X>CB=QR.)&GE/V-(1Z%BFB +M/FTT,G-<>:V@QXA&PE=ZI2!<;`WFB)*GO4YGP@XT*BE&DH_J_<@C8;$5WJ<2 +MX8N!-T?J^G'@$VVAOTU4Z@%>F6:!G%:`A?SE(SS'?M:+M"+((TI:*>& +M'*E[)SILYZBX4>W5SF%+$77($=264&CE%&B*+^L?,2AW1K+MSD0?`AUZBBY"ZY# +MQ1R7W0(;<3*41&!#3Y_EIW2_I^!XQZORGFS$LN)3K%E:'X(Z:5FM*XF:MJR- +MY5//\M%D%(A%\"S%;NW=JMP0+97&*#+'EZ>O<8%X6FIG2NYXG=,:PB[D:8X; +MQCZU/BPVZ%0TBE+A)Z_1'&KD39R;%6X.^Y#0/]V)5Y0749%=_'2W>OJ.>AK9 +MP_8N47FPE?!K+U[[A/NQIMYFRB.*>JFH=;"QM@5/?<.GXY='K?#2,Z3H^88K +MB'I'X/Y^N'?;5`U#-NG`TZ<"]QY1SP1LM@3NL^I>^CZ^$GBZ-7"?@_N4\K'# +M/^OYMTC@GM]`;LNT:4E0.*3HMQH5\U6N+=AZY',L'^_$';NQ0HT[KS"*TU<[ +MI:]'7G/T>EX;GBY13^5ZMH\2U46M;>BQ0IH@'0=+;J3]54/"$^PF')\@ZG"U +MB[XE,L'&EN,1-1/L(\%\!LS18#RBCH*[H6":P="^:FK1LGO"&NY*H@J7N7;U +M"M<>!*:`.LC6NBVX=JQ[/Z]321&%<3KOLDGV'#!:;ON55AT/_=MQNVKL<==/XI/M(!5(=JM5V..OYU-VMV/::.6ZDO9$ +MPWV*J/^!][ZHWAW_$C]IOK[&ML&T@,F,UBV8OXR`O#JC0&V<@\=!4&?P*AN4 +M2&ZTSK6'VN\H3D"JWYI+E1IQ;_06D$R4J+U:/C]2J1$J`-(N=>THZA&X1,F% +MZBGTA\?`4ZMO%-77,L'V'E'8"Y'PM+E/N7EA,87/`GM)U$C]]/S7_)7$G,(W +M'47IBR@,Y76%MSIB2-,*E*W8PH+R/W,4_LZ_H;BO\$VM!ZFUULN= +M4-XVJ2BS$W6]75HW/MX9@U04@9!/!"E%F9H(/D$81H+M%)3=A$"X(`3NB?H[ +MWOQZL=U$)S?@3NHE?-J$QQ0^13U?@1..@W6:/-&/HWI/J%V5^/L6]3MU8K!W +M4KF=`_F1J(;[`[7Q.OD3\+4N`O-_G2/1/SYQ@. +M/??FIKQ:7!EX3N`^2E1X5U>6A"L9",L[`3+%U#^+-J'`_79%9GP?JP)/(X'[IX#,C?&_ +M(ZXZ#/BR,^"[^"Q2N[6-JH&#+4B4;O2SVD?2LUXE^HU^XS=UB:JT8D=^7*"4 +M*7X([:_/JI*)TJ6\MU!,HU\OWDNBY,:`#8Y3:7(UVN?FIMBMM9`[Z:P6UETB +MKG5YM[]T[9/A6V:(0KT9,;"MDJ@QP[7U'I^\TN.7(ZI:O8?C76$DU1LX@Q?! +MN?N3D#H2^GS5*=<>@S,]2KLX:AFIQY0S[V$G>I*6%VF/4&,+BS!7#&4:=42X +M3$799DF`W/AJ\=XC:FO`9O'KQ?LEZE[Z/LK`TY[`/>I=2YT4'.OH#3Q=@_?' +MKGP7 +M)!33W_$#L!'O<5U[Y0RXW\WW77`?9>K?!>=0._/=F-\714DL?)YWQ-P7%D_I +M?`DS6J5R:N`[N3@[TY71]M +M5/OW=J:;<4R<%W@_H_JWCU92^*NP--LX![7T7@G!\M56F6C:L^M@7M) +MU`.!=Q\,W&?4?LENU[-,@-6\\4K_5Q7ZD +MB&KH"YP10>.8I=?,*>7];=X+A7-.!_T=0;E3=,N]DKX=3)'2_I,C/L)PA7J\2[7/E.=DPK7$LT9+E`16K4:4-*)21E3&B,H946*)D;R,*->( +M\HPH:42EC*B,$94SHL3/C.1E1+E&E&=$22,J941EC*B<$266&LG+B'*-*,^( +MDD94RHC*&%$Y(THL,Y*7$>4:49X1)8VHE!&5,:)R1I201O(RHEPCRC.BI!&5 +M,J(R1E3.B-('Z1[Z+VI$N4:49T1)(RIE1&6,J)P1);J-Y&5$N4:49T1)(RIE +M1&6,J)P1)2XUDI<1Y1I1GA$EC:B4$94QHG)&E.@QDI<1Y1I1GA$EC:B4$94Q +MHG)&E%AN)"\CRC6B/"-*&E$I(RIC1.6,*+'"2%Y&E&M$>4:4-*)21E3&B,H9 +M47AFQ:=342/*-:(\(TH:42DC*F-$Y8PHT6LD+R/*-:(\(TH:42DC*F-$Y8PH +M/#WETZFH$>4:49X1)8VHE!&5,:)R1I18920O(\HUHCPC2AI1*2,J8T3EC"BQ +MVDA>1I1K1'E&E#2B4D94QHC*&5%BC9&\C"C7IQ9_9^R0@2C/R"UI1*6,J(P1 +ME3.BQ.5&\C*B7"/*,Z*D$94RHC)&5,Z($FN-Y&5$N4:49T1)(RIE1&6,J)P1 +M):XPDI<1Y1I1GA$EC:B4$94QHG)&E$@:R494=*(2AE1&2,J9T2)JXWD942Y1I1G1$DC*F5$98RHG!$E?F4D+R/*-:(\ +M(TH:42DC*F-$Y8PH<8V1O(PHUXCRC"AI1*6,J(P1E3.BQ*^-Y&5$N4:49T1) +M(RIE1&6,J)P1):XUDI<1Y1I1GA$EC:B4$94QHG)&E/B-D;R,*->(\HPH:42E +MC*B,$94SHL1U1O(RHEPCRC.BI!&5,J(R1E3.B!+7&\G+B'*-*,^(DD94RHC* +M&%$Y(TK<8"0O(\HUHCPC2AI1*2,J8T3EC"AQHY&\C"C7B/*,*&E$I8RHC!&5 +M,Z)$RDA>1I1K1'E&E#2B4D94QHC*&5'B)B-Y&5&N$>494=*(2AE1&2,J9T2) +MFXWD942Y1I1G1$DC*F5$98RHG!$E;C&2EQ'E&E&>$26-J)01E3&B( +M\HPH69%*?1`6J4*X^)NHR6#K@ID()H3OPE4&J`Q1$;!%C?65_F+P+T=4,^KL +MHZV\_$=GYNT7Y.Y8?/8[I%KP+B+8&O[LMB*%IV-&BQ3\N:)(R?S^<`W)8B"N_0M()M%,Q(,.U@QH")@N\JAL*] +M4X=KC;)-!IX>`/,Q:I'TJ:O44SQO[SHP*3"W@KD#W2=J'=RE`VZ@N1]^KP>S +M`=\@*@-W&\$\548^HWYGB,K"KRU@7@&S%>4#9B>8W4CA;Z+R<+<7S,=@#J!$ +M[H8O!L8"TP!&_+[\:]M@.QZ,"V8BF,E@HD2="7?QNTO#U`R_6\"TXAM$1>%N +M))CV,I+.PL0O191[#WP_(%[9#-\P0(Z!^Q@82=18N!NGGDZ[N_1[>O`[1=0L +MN)L#9AZ8Q6"6@$D$Z(P?1PFV/6#&@.^]<%T#)@GF*C`YHJZ!N^O0990"4'?` +M]58PZ\"DT5QJV*%%/P9-GP(P%=V+WE$HCB_):IU/. +M%I0$F*T8#C!Y%>>=_$U4,Q#[X-?'8/:C +M>R!=`78M8")@4D19<#<.#&H\13VH6\'DT#?,HV"?(>I8N!L&)@H&M2VVWU,: +MQ]RZ8,H)57Z/22J,^M37#N&C2Q2>Z'NXLMD*-C5X2$&:KRUP +M]8BJ*?-K)/QN3^,3H)Z&_$A4PFKPB=X7H\E?+#E8>[1G0SS=?%"M:4!@[$@NBIWP^>DHL +M-I8L;RR75]HH?0U(A43Q6WA&;DFBOC-[P5?G_^`B44V.Q"XNIU)&;F4J4FFP +MQ2?Z+V?DEKBW$K5@]LS9_JBSH473#]]PL(H4;,O/+13+E$%^AN8\BKZ +M6/XG2ZA%BQ?.G#-[UO39`0+M4D3A$QU2#*.FSYZ]:.KLQ-=G9XCZR>F=\^;- +MZ)QYP=F5XY$S"I>XSZC\NH]S"O_A%=N]9_]DX;=^V#D/_.\4"W^R<+I+U,5@ +MI4->Z<\;T,=@#I5&X4H941DC*F=$B3\8R&BB1?]>#[:SI@Y'5^D%+1@]KP? +M2*(N6C!S=F)A@FSI<3`9P5_**%P9(RKWJ=2,F?.GB_N1NO"B^7XH.F0+Q?-OC`ZQ25J +M[H6S%T2GS%DPNW-6"86Y#;GJY +MZ:VF$6*"R!#U4=/:IDQ34FP6OV@ZL_':IG>K"K41\9^FO4V#Q)%B?U..J)>; +M]C2UB1/$G4W#F^YJJ@HGJ@NU)?%](%@R#?07?6"@<,DOJYB`<7U*C@M1?SWX +M]T*G$,><"?(B:O%4(1X$&[RBT4_Q?B/<2Y\J-\&_U(#A"OYEC*B<$24>#%(+ +M9B],7#1_X6R=%SL7S;T0[Z,/&N5'(\H;D$I<]./9"WZ8F+YP[GG3)5&SM>WT +M"\^[<%%)]4A_J8IN0>E90F:,PI4SHL1ZI(:)6C"%IN"#"W_<.5<',;K>2%Y& +ME'=(:N:%LZ:CQY*HZ3^X:,%T_1'A:><\;.6@!0K +MF3.?$BYN`^>(PI;I>$%G'>"1!Z))'":.@/;W4'A&8V$/(54ETN(I<<[1:(%F +M%KC1#&S3888S4:(&-S8=UG38D".;#FL^<<:).#60?F7#!G@!ETKA!;(,>=^G7(CT3A7;GY(ICI +MGA!G+01Y$?7!="%._CX;M#T%?@^%^_WJ=X8HO.M1[U5Z(^=3^KV@N5*](1Y& +M2K_WO>FBWQM?!C^B#VNWT)3[I-]P2ZBA_Y^Q'7?1VY>W?>&9Q(. +M]Q&!N'O.&!,5'=VQ;A(>"3[Z0J+A1J6`2TA"N$!P!IW9/38AD#CRB)")PZC' +MYBPHQS/'N7D`KOCH"#O3UXG1V8F+NTN<%A%'_L#Q''='W57VJ^Y[\\#$^:I/ +M=757_:KJJZ^^JOH:SKE)R;8!B$>A-!/>+T#*+(K7^_K!R3VE1\.C.JFMZ:*& +MHO0Q*IB2=JI@OO*W5H>URY].4P__.#Z=09/`Z:G:XO\@FY&R9Q[IZ?3)1_+M +M2-UV##CLDT%=`/JR*#7'SN5QJJ!^I\>MK5L>WK#^X35;=[2NB:6\-LVB&KB; +M-M']N2;HI^TU]/W!_$Z/7#\!4C(9>Q7E3XQ1#S_2LF7]IBE4"H%^;ULMF]>N +M7P.;-[,HV,)!`>LW;-_^W;;XWJ&.M14]QG\,LH340-0MZ6L(@S0&4;.HLZE< +M#=*C$-]-O2<@'>"U+&HDE0U^YOO3HM,4V.U5*#/`O&:+?UEJ'-YK_V%>*3DZDV&MI3?#<3>EO:*<]G^#+!:KBL-];5*`& +M_'G(O;EYG.(^W-+6M9LW!):OU2PJ'FO9T`JY6[>/4]E<-W6!5?Q#4K>H']L0 +M^:1UG,J%A'_2@7L>,"TJU2$IVC1.97*YX.N"2T->YU2Z\+/:<8JOMO(-:]=O +MB0?N#EC4EK@M/Q^7Z,R>70JI(#J<+G>&)S,K.X>^;I\*$TQ%['^IO@MV=@CI +M+/8ZRK]'41J*TE&4B:+(&ZCUB*(HBF(H2D51&HK2492)HHB.TA>*HBB*H2@5 +M16DH2D=1)HHB@RA]H2B*HAB*4E&4AJ)T%&6B*/(F2E\HBJ(HAJ)4%*6A*!U% +MF2B*G$'I"T51%,50E(JB-!2EHR@319&S*'VA*(JB&(I2492&HG049:(H\J\H +M?:$HBJ(8BE)1E(:B=!1EHBCR6Y2^4!1%40Q%J2A*0U$ZBC)1%/D=2E\HBJ(H +MAJ)4%*6A*!U%F2B*&"A]H2B*HAB*4E&4AJ)T%&6B*))$Z0M%413%4)2*HC04 +MI:,H$T61MU#Z0E$413$4I:(H#47I*,I$4>3W*'VA*(JB&(I2492&HG049:(H +M,H32%XJB*(JA*!5%:2A*1U$FBB)OH_2%HBB*8BA*15$:BM)1E(FBR#!*7RB* +MHBB&HE04I:$H'469*(J\@](7BJ(HBJ$H%45I*$I'42:*(N^B](6B*(IB*$I% +M41J*TE&4B:+('U#Z0E$413$4I:(H#47I*,I$4>3?4/I"411%,12EHB@-1>DH +MRD11Y(\H?:$HBJ(8BE)1E(:B=!1EHB@R@M(7BJ(HBJ$H%45I*$I'42:*(N^A +M](6B*(IB*$I%41J*TE&4B:+(OZ/TA:(HBF(H2D51&HK2492)HL@YE+Y0%$51 +M#$6I*$I#43J*,E$4>1^E+Q1%411#42J*TE"4CJ),%$7^`Z4O%$51%$-1*HK2 +M4)2.HDP41?X3I2\415$40U$JBM)0E(ZB3!3%_^+ZWZ8"*(JB*(:B5!2EH2@= +M19DHBIQ'Z0M%413%4)2*HC04I:,H$T61492^4!1%40Q%J2A*0U$ZBC)1%/D` +MI2\415$40U$JBM)0E(ZB3!1%_H32%XJB*(JA*!5%:2A*1U$FBB(F2E\HBJ(H +MAJ)4%*6A*!U%F2B*?(C2%XJB*(JA*!5%:2A*1U$FBB(74/I"411%,12EHB@- +M1>DHRD11Y".4OE`415$,1:DH2D-1.HHR412YF*8:OAMJ*\M"/A^4!=*4SQCWM#4>&(I2492&HG0,56M:5.6XNJ8<++DT=5NUE5!SK&K@TIBM^D+3 +M*HQ.T];DP%"4BJ(T%*4CJ-I*TZ+XH">L/I\UW`GC)9],HZ\RNQY4J&QH"$Q# +M30X41;%KJR:>I'J&41#K +MQ<.'.W=PL6HKV:7TW)E>C+<&6Z7T^O-S>;/"XN*@CG969F9D!FX;.O+*TFY.=EE +MI3>6\!(I-RMS]LP\;Y[/*U]?'`I2H#S6/#YZ]=';";DNX22SB)/DD.O)U9.> +M4P=._5"Z3:I7:&$])?EDMDYU_)%M+R@X0>IRVDV27HZJC1$JV4,$7ID(>Q!GA*IDT5U375)-F6NV5?%*>-$.BBNAW +M#GG\8G+1&U3YJ78IX>Z]OG=M[[[>IWM/][[?^UDO579KGR0R>JMZ:906!&OY +M"(O#8<4>LW5?P>_/[BM>4M7Q`HQ3''TFL1IH%>@G$EQC-*H7/)$(U@]O]9!` +MY+I5( +MJW%0:$T$(W/\_<-7-+N_XW!UIB[^GK[;[^D23F6,W-]VUWEE=+P5Q[#O2+J5 +MSE1+QR>T.I^O:H)]>W6YC75M66>3YW +MM#6QFQ*VC+H9I:T)_I0Q]E2C?)-?0SW6^[RV/PZ4GO"=:#I1>4)5O(4J;3M1 +MKCC].<92)7ACIK%3"2YV&X0UT:5T-[NG=\9Y5;D*MM":*(@X_-\.)W?S]Z^, +M:'3'@6XE6"8:[Y\H.EG3>_7\"IF0N9'\520VASB3;4JPQ&&T00NMB<_'R_QN +MJ\1G!$L=R5U0^L')8(EL=,EJ9&MX9V1;N"W2&GY2?J77]5XP0ORB$8JT)I9! +M#=&8U[9,$0J7T>"-OJ1\3H2G;,:M#BR.6:L@O%L!BP,K;TV(YUL3-;VK>^>U +M<>U"_=*<9-8Y)]0ID7.M6FG2=;Y$>A[6*-?-S'.VIGB=$CEK`D=&.25P2JZ3 +M6A.KE;G$L=\U]O5T6/S14/N$PI74P]8F@RV51>=0QQO?SNWH$\HJ*L6 +M2$%$J8&<884*1*%$>DA1"Q^BP5M$@\AU,+H,T/@#]$$J#JX!8J(FOS`>4!Y< +M*?B"/W(`0]X:7`/]"X6:(H4AS<<;(K8HTRQ]3;[&X'7XMR.@^FG +M.="N`V(H\@(-U?-V>0P&7<81JBG?YFO4RED5##F-H_18^;-]=4QQZ>7HB^ +MUN\;)$R(A1LX,0CWM_NV21N7;5RRL6)C^"UAFRP0,?;/"=(\+_Y>:U.XN4+P +MOG/P<[X;>.(YLC?H<&;Y@@IO9?&2 +MG+NC-3GW[Z^[<74PNJ!^1)BH_:\,/N=.&/$ED$EC1T"FX*YL6/&S)[POG/"\ +M9^PY)+N!>WY"64@ZVC8P-2Z@20 +M%DC\!&B5[P1M\=&E]FN0R@52Y<0'6D#C0O4A=YQK_IY#H4@Y=?AO'W+Y;QL. +M12IHL.QF(WB+"VRGABZ7FON#-[F,&D4LK*'-_;:U7V7'8=8J(>X6O/E+Z*ZY +MT>H=!Q9*"^0BD*%5JI-MVZRG#]$UM(XZV&IJM@3B<,8)'8=FLH(P7SUND,8- +M\\#7!Y?<;IMK+\.R%X=_QO!<8E][P+)<_MRA7'_VL,-'A%PNN_#K0QYN7="& +MD[H%Z4"UW<[K_0>JZR3":BEK#L2Y-3:O$+QG#AV(WMLQ>Y#?9PQ62T>5 +M8ROGAO,KJF7YS+7S6"=+O/4SW%9>Z7/&[[+T=NG0W=&F%;[FYA7W0.J%]-XH +M8<&`:'@*@T'1)J19$+,A.F".O-!R-;0[%][SP]5R'KRO +MD&>DUNU<6*_Y$+V;/=:)O[3;#6\9$#UC:WAFBC5;_!93UTT%NRP]:^NZ^4I? +M"3.^BMIS*\">L2O!S^'K05OBT$\&TOM&F':U6+8E_&/W,]3ISX8=V>%K#V_? +M;,]:1W=/RX$!"9[W==M<5_%@U&N=V?A3MH#NZ,SM3L>Z3BH].UKIRI3 +MX4RK*'$F524`)Y@#K`Q61"'?4^>UM294)7CS[4DB==1TWG=Y7W)?-E0_?QZW\&[/S,5+[+X'E>8E]9O*S(8=AO'M(>Y2=>AK'],?ZV +MQ;IO@OL^NK_R2>ZJOQO/L]]2N$G31[)>$L%KU>%'<9M;()VWH#2 +M3;T/@4PY20%FHDMY!* +M\O-M#;26/N=X36$6;X.7\YJJXBGD_65?J%:.^3T&;\65M#T:@:C*9_D\)1+, +M6*DKV0ZGI)@D+R\%X/*EPBR+GIUB1A;](SY3"OI47&+Y7#*YW0)UA1P&%X +M8KQ'+J%'GRC=72>GDDZVGC>CP+4##Z7A, +MSHWS=&M/1LN>.J?LB4//L`?RM;VGCH9_UL,E\29!0PO_+OFX\G-K+MUOYQ"[ +M_(D>IS1RTBFI$0J61L'2:/@7*[D5ZODT+'[[@LQ;Y?5R2)%5XRC4<,9W`?=B +M#Z_);<"[N5RH$`Y&7_V)EU#PZFB%.ZZ?A/4"WUPB62*0/+I"[['EX_W^KH>W +MZ)F5EF+8DL+V7T'213-!IX)\$/1_K;5=JOOALB,:+X,<* +M<`(MI4VTF^X6A,YV6(GC.>$PSWL<\FZP/%<'[),S3@4BL_R+AD*1'/]U!M]+ +MQ\^+7\+S88B_@O@TY3NF.[5C\BN]5][R%&'C>^&1CJ*3>Z"'<;]T5X(0YW\1 +M^!*L`G\/7,_Y\Y+2_()A(AT7YI+=@AC?)L5W<$])\$:?XMX2]S_6L9WK>!YA +MWZP;]Z)X*!3(\@S!LWPQI#=`"BZDX14\1C&DMT(Z$](<2.^`-`1I%J2S(0X* +MW`]P2OS+;D0@C75PKX.^[-38^YM]3HDT+I);$[]2GEXY-Z9'/?,]QB#L="YC +M?FQG5"S869U''J<_+^?EW.IAU`LS#9C!!>ZDQUH%`C`=M+-<(-S'`+](+I*W +M24'PI?9`?!XBL?RJ;7((OFI%72AH6N&!$STB-RV1(&U:)L/=ULKE';:G>/&I +M+TYEY9#`NO"NKYN]+0XY:1`("\B@<8EF8P(V8^T +M"X-"D22_+)-,L$XG<;]9#26V!P+^B\1]J*Q&D!$\O3T0GX?H9;:^!T$O7&>+ +M9*X9@?SU]8%&^>*CHS_=[Y__=5*\<.O+XA^^_.B2\@GL4Y?H)^7T#5/Y$)Y- +M^F'YRI3O?H5&4D^?46[QF2VEC4YY>21&2QN7UV^H+FV,C))8EM^7%&(S_5)2 +MC"V&T\$1B_N=21'\VT\=>3I_2#34;[VM4SN[;2K>5BY+$=^JAFV*9#?S;_:+R,4AWD7Y<+LI5 +M^V>-WKM_U?XNP>UK$]:P/#B<[VC,_+^LT6_?O:!\!-P%^E'Y@5..LP=.K>Z] +M.FJ?+&UP)K71L])MF%)CI511K'3V_[/W_^%Q5=4> +M.+S/F3I/@\[_O/^SPO/*=GZ*]]<(/$:=8^_8/K7_?Z7XZ0>WPW]\?Z;SX]+5G?VC]?_A+'BX$ +M'R!JFZ'^@ZC-V;N`TX6G8N;4]P7_<4[WZUOWKCS9N\\_.;'WBJ7)^RA-^GXZ +MH]H)@U1:Z:\+??QJHE_O]Q,/'WO[M[^//$Y/OA-#/$1_?]?\_0`C_H^>?"^&^!G]?;OY^YZ' +M^VYON@A/]]#3LS__H?47![TD92Z^W6H#TV;V?_4#MX___Z'OS[GSW^^\Z,ZK +MZ?_6\YUI__U]M$L7]>^Q/[\X./7DY^];>7+S7H^L\=+M:^?^@_[U3WYZK].^ +M,MCV59E?V7G[:7><>L:KOT'<<=WZ=?C]/??Z4+?Y]QSP,[4A>]\DO#O]8-[OG%[HAUS$]1[X+6D +MF[S7;V/$`SM&=QS]X_<2?W[-7D&`&T,#2^U]+VD"+\U\KX]T<'?N6,TS$@E" +MO/:.4TG:)JC-#M_><<^]M^.ON_=.HU]($7^Y>__^X]2F>M'?EVY)S4O_/Z([W7(F:''>'234W +M^S[Z]^3DWO\(ND^9AW]S<^\#-OGS[I-FW7?2'=TG';OWW6GWOHX?I>Z=<3=A +M3W+O6W.'2VF`1[QQ6N=%H.K^.UK/O^G.8^CJI"O>NL'7\G?8_U\TK;O[^_8) +M_K[[=J3PH?7J?1\^'>V6W9MD&ETP/=-["5.Q.BK3^['HUZ71KX]'OS9%OSX1 +M_1J(?FWVD^U3E3>]3?WW'3OO^.RT[C+*/I5$TX>N;/H19D@_.^V3WW7_^*T[ +M6GALMJG/<@G^9^?N'.[W[RNZ]IOV%:AWFOYB;W7NE`;UEW935X +MAKA'U7]FI7OW?TT[\\=S+MR]8S5_A=JLO:_[E:OOZUZZZKX/!XG9VZYT[]WQ +MW8UD,=SD8R9)$6_R5=(W_L5\4L:\_.F[\7[+0YK1G.A&4&S@ZXT35T8 +MO/^<&>K7_O^MQ%S72'"8G=?:^:IM_?S+;8G"_XSK8K@?X`E3.Y%Y3YV>]33[_J +MO7N[EUY`EGEWKH5'UODYZ/._ONH=9,GJMTSOFW'V46^NK/K5:I2GX^RCWWS, +M6X[M^XW_VY7WKWI@M5B9;YRFSY[^YLJZ7Y'&7?%_M1)?_'K=_[WU*&6_^8WS +MFW6_I;_QW3%G'_OF^]<]0'_=[S^P4E(XK1U?7Q)\[!S2'GNGGXJO+PT^?LYT +M-:/WJ%/EZTW!)^COCMZC3\77`\%F^NN8WF-/-2E,2^03I%YMZ=\1FQC]T +MY;$_GBN\F/KZ2U^81GW6_.,G@Z>H39_TGUKYK>__)?@K_?Z+_U?Z?<^=,JL. +MF38:U.CYJ%\C><$CTXPU]\=OX)$A8T+HZZ8[00\)2OO^[^OO_V)'(B\T\'OZ +MHH7>+$>N=QY_S\K`F4N:WMQ7[`6=`96DTD].*6@_]#JTXUK4ZQ\LVZ^EIJ>W +MY\]W[]IS_L:W61H234#J^\GO/AO\D^KVK/_/E?;+_VR@ +M/O>G>SGWY,9#P4N$/>2_M')\2>\V);64>?8U3KN4\)X[D>>,6)X'@N_V+$R2)`5B]Y+[:VWF;3+T\'?*)>G_;^M!&](,XU\ +MZ,J6'X-.FA_^]C6[=[09KO#OWTB*=+LFV>Z1QK2^_9/?M7+>X?;J7M%TW^GM +MTNK-A/C0>N!_X\\C>8A?O_5G/=QE?M_O'VM^/>!/>WBZ^?T[O\W\^KW?3+_< +MAQTELOS;WU?OJTUZ@/'(VG57K:]*/OCWG^)Y;9?^(W=X[[ +MX@%^_H,QSW_*7_R4W_QPW!<_Y.>[QSS_!I606HQK>AN]_^K#9W[1UCQ)?[^% +M_@*O3**5IBE>J>G_XH])W[\C^(W__>"W_IW!_?X/@@?\'P:_\W<'OR>KV6F' +M_`?U.=.@'>'N[&U3[H^\'4^]1+/Y[FOK3]!T(/8HM\ +M\@>.PAR5\+S/?9%XW@_4H1]-U;?_2#W3^X\P>W_R"1[Y[O$65USZ,ZY\D>A3VG?G+K?3_XY0]^ +M_8.'?]!BI)^C6J([YA@U7S-C;QN?NOC]UZI3W??J-=W'TWE\[I;,_]>9/OQTRRIGN*-_Y,EG4 +M-]#U%;INI.LFNFZFZZMT?8VN_Z'K%KINI>LVNK[>BZ\^1+\NINO#='V$KH_2 +M=0E='Z/K4KH^3M]YHZP?>&2#IO8V +MG[UB;N*7T(I^2M;+6]ZP:=JF=O6^UHLV37,/O.^'A0',%VQJ=_3YUYZV"C8@ +MT0K9,1[F$U2*+TVI[F*;!5]M:M]\[=SWX>LYG9O:<3_.W&>;^['F/HWN'YCV +MA0&RBGE5+D$I-U-Z2=5$+=I.]CQ60EO4%,IEKIJCNM1QU*XSU6PUB_*YR)K*HTU0%2\))U'XM)P4O7?9RE(&3@IG6?H-^0 +M?@/K-M,O]T>M/X7LJ@2)WE\%R=Y?!TV]3CMLZ7=\4N5/]ULW;GCXRX%S])?] +MA??U3-OC_,8)WM[=/?L^_#NZMZ<]>1NO]#:>]7#JL:-^!?OM\?O:=\_< +MN)IMN3^2+3=_=^N?4K\Z9G?3KWK('C[T0W_W]Z_JVWWB]Y+MJ]_WY=,[-I[T +M<*+RCD^>O!MI'J(T%?$W234YB#3NO.^$QT8J7^'2O.UMW>GV^V#Q=)^4>]K;?O4;IW?WOW]C??N>F$7N*)3@M.#D +MN3M^_L(/"VH9M?(49>^[5$`],DUU][3N1>J4X][N[K:]2/_*W?+$HRU%_)W7M87X/__W]C_WO/>#[[_H_T??'?VO86/GGQ2+F?O2TXZ\>0E[SWQ +M/1_]_T(>.?KOE%P.]Y->_:HQ=WIQ4NZ44TY6)^5..FGIR:]^Y:M>?8JBMTM? +M^6J5SKU\TO^?__?A#UW<_\$TCB?YX(9W?_#B27$7?/#=_1=O[+]HLO><=6>N?)WFJZYRSKQ<[0V=Z(K+:A)WMK+)Y3':1VM$`F9OPFG +M+5,#X"+;KT._1N7DUNH*N\^C:G"^8E*^COW;3]0A=-;KF]A.*KO/HVMQ? +MLBCZ:S==C]!5HVON!D+1=1Y=FS>4+8K^VDW7(W35Z)K[+D*]2VVZ[EWZ<5=5 +M&*4'KGJSVG3>NS@&[X=69NC[=W$]1O[QKEJM]E)5TBI2B4?^@:#`2?D]+<^_ +M#4H[$2HD5!Q!OV^F//3KVW5.4!>JS*Y_>VT&.=-U:CBDTD`HU:Z3;KL.&.41 +MGLOV[BR0IWKJ[U-46:73:$=Z76`4_Q6RLG2+KKVT+7/2PX[TY/;Z=I! +MUU7.]`JCOM*DTLE+'[V`:KUY7K-*)RXM7I`83?NP&CU*6/]B5+>:_H4/F2:GKZ,*67(E%.2/1V07*DDJYUIVKJ\3P. +M\SHC2;^)Y@*/[D-IOQ2A1FKI?!)(M#!1\AWVJ5^V9I6M[4N4%>U9M1%K15&+59GM>;4 +MB:U+57OK,O7WEN7JERV^NJTE3;V_BL9!57(D)<4-Y\[P*+?$X-P9;>JJ:9IR +MZU"W4=H73:%"$JJ+?@,[/OZN>JLEKPZL>5\U=ZR4?W=NU#]TBNH +MV[P"HRY65WF7J(N\3>HL+Z2R[:"O9E`YA^B>+K8O*S'J9HQZ&NGTE-IKJG=) +MBN[4TIN2[;J[5:7+C'(&<(SJ5+VNLUVO/Z9=G]O1KO,SVO7YNEUO;&_7%49= +MV-:N"ZWM^F*O7;N[SFM)[%K1TG8)<1)">X2N2ND_V*YW?*1=@U]TO)9SU6UJ +MB8>TT5NZ"2CDXE"_->9D\\@Q:K*<;!X!HY"+]SW%.7KJRBFXH]Z6D@I-,CJF +M>LZE$!%3M3,5%#.V7TM-0CGUWK6]$N^/,J,FZI5X?U08-5&OH%Q$V1[ZH,JH +MC#K3^U(7_2"NHM65WCSB*JIE7]\@E1&4KE,O1X4H9XY1C:5M+&?`J,;2-I:S +MP"A;6D_MH_%',G)'0G=^)Z&[OI70Z6\F=(E1"\H)G;DMH1??DM"YKR7TTIL3 +M>MF-";W\AH3VKT_H,J-6[4KHM=DKOQDD:.QR/:'4QM5F54?B6Z96^7\RT1=*+*+R#4)U$W;J9QR-1 +M3IKH:`'14X;H:C'15XXH9RE1T#*BO1RCEA--^I?4:4SMFMNRBA!K"7D&?1$P +M*B!J6T?4MM[*R0&6J*<&IJ4+C%I%[;V6VOL,:F_WZKDS$I^>.V/FP./#*OPR +M<;D3O1*C.JB]B6MXZTQ[=U$_$&?R%E#O$-_PRLW"F=I;B#.U+*4TB7L09[J* +M.--5TZBNWGKJ]0JCNA/T#^DU9#('.9(NI&*E'?I[* +M8E0,4@DP0DJ,ZJ32HVY+-TUE-]?P<[4>E,>6I.S%:57)<=!R;<)1&7.7)5W5 +M49$;G=8MH?"OR +MI,_@<*,TGN+OXG$JO:`##;!O3:[%2KXMI`U-HWIA#$V=HM+-]#LY>MT%4^GK +M@%$)>I+`$VI!AWZ[^$W-EG;18]==4)`<4]08L2MT:2@X5/+!]%JU95]?B5&I +M-N6GAJCLT`N=?1>D2<,M4CI)N(`3NLPH9_3ZX-0:M20]29,VI+8/7K`+?(=T +M8(>NBN0XY`=*)T]K*JH`I4]36>*Y5@5%>4>YTGA.7/IXGQLF`N?2QR]P!^<' +MNM7JJ[4MM,6,*ICAZ,[Z6G7MQR=IOL"NC)T+:8K1U>!44OIUS*ZEM/ET[6*KK5TG4%7 +M0%>)4>OHUWJZSJ4K3]?Y=&VDZT*D0U>941?3KTOHVD172-<07<-T[4`Z=%48 +M=37]^AQ=U]"UBZX;Z+J9KEN0#EU51GV+?K&D(DUF%;@)622*^!8HTR/*U%-8 +M#BVE7R<35\L15SNQ77WD7\ +M;%:[QOB!]`NF6"KTEA%O5;=ZD(_JT&/,#;K4'B^7FJH+C.IL(PDZ.MK31D^8 +MWD?GSL!]#>XT5DM39'2$^:9IT,7W78#?#GB0NU)CS,,**$N.FWO]E:3+X0UH +M70WF\]"RU=9^'U=%TAKLW^CA[=9N>3N8]OG:FMY(=L3,JJ"26^H78>E3-&(/8I&K",&H+ +MV1VICEV=-$K\]/9K^U2K"@=C=%]H&T?W1-7Q\8.14Q*4&3^UVNY\8YK(LO2":INT?=%WFL"L\QZ5PU-; +MB,^2E7$]N`OX_51IK\>H?0;]E2/4(H1DZXX,Z-J6M%=K4EY.4(E]?4A]"KT% +MPH$E#7FRJ3>/(WN"J:(S87)5Y>40'R<@Q4>S,4Y?@*H+DI;ANDO!ZXE&.XA6 +M.XEFNXAVTT3#)48M6`"-T=]`+;%!)1_M5UN=#6KGC6?3W\'(95-U6=(BR0(K +MFHU_\%:6;7/SH9!H4)EJ+0HW13]>,3\S4CL3K1N$KYF?X2^('U89%8R*C=>' +M:83_7)8)SQO-*K6K_P!]<;"VQ-?M-L>K][@0*81S]`I\A7IVW7NV=VA_7XY1 +M&%4'BJ+=0<>$O,67Y>]061-^1\`HYPU2:A>]=&US7BWLRJ@WD/A?0`K;]9E\ +M07),K\V'[SHFPX@2O04'-PB\*PDJ3PBUIQ]UB^=D6Z@LJ$G:R;9015`[4_EP +M#=6^B=JKN,1#FX4S8^W5'F^OR]%>;UJ645W-Q,UO:^D@6X9LK18]3>RA=K*X +M3B2+ZZQ6*T&7D@2U\C?'*-"#F17)W_V0JU+);K;HBC-4VDWV>P&CW"0IPI<] +MVC=($C.1[/42^#M!?Z-%J-X%28O2.(-JOS#1JT/Z/OJ[J9_2)/XUS8RT--++ +M$`KI+*([J37I3%/1P_.RI+6-VH7&RR)ZRKGA;VZ[;C^$OBHH;O-ZKHVUJ#(* +MTC=>EB8J2QMX11?U.MVUCM(:5/FXMA'757*,ZHR-'>[UW\W+@%;5H2=8;PH8 +M]6'JH?\ER@OG4^](NCY1C^\.$,5220J,.N-^5XZ9*CYA=,.TWT2EON(0<03Z +MHB3EBGUGOJ#AGR;]:U<+>K[,J/`#9/02]:@GTAE+"[8FG523"J/B]P.5 +M[/9S@AI*^^YH.L1HX-*'8%!/27T'>OV`44TD*[C6]%WTQ8CR\86G=GF%Z:+[ +M^JWJ>H_&'HV_:]?D5=<%>;5S:SYL;^.16YHNLI9&_*)YF?B(B(^%LJ1EVB8# +MG9):%B>O*X_HS"UJE^X51KGT5])3U-9%F1NB4=?Q=:X%V_!5@Y)1@#I6;G/1 +M8Q$:Y\7K&=P2H3R-]X&,O+GY'7\@\2.HI/")P6;0[(K\.7^D](;JW"J8(=HC +M>)_/^OWW'G*CK]"JS?2N,".BZ&)79C**+C$*99@VX&]4NKL3Z3V/&B3#*.WR +MF'+!QL";`T!1RZB[4QFN-Z,N1EE^.&U,CJC%OMNDS:JF)<:W@H.984+>3-:* +M/LKHOIIIB9[NH)'K;?&YS3VJ'^J9$Q3:F`6"M!E825)CV0I/;OEM<_IMZ/&_;OWR4E59/ +MHM:S*'.B1%N>#E.2RE%QBNEHRB\P*OS2 +MX2SSG*MFLX0:3-7E+6):E3J$?PF=7LBY45L1SPJ73,M$\I)1=STDM9Z(=W%[ +M=<3;:PP7AFY"Z5Q#8Z@JJ%FQD4&_IS%M/=+/-)N\7.NC;0]96I^&\737"=S[ +M!YE60YT3E-?LA?\G;VY[2-[@2XQK]&UPM(S'\_)1CR<5(SH,XGQJD4*4XS[+ +M'T"K.(B0GB6_+L]*$>KWD262EE0Q!T1^=1)^1I\-$D] +M-.4EXJ"F-2J,JA@*M.4[(#VNF[F7-N>K1T>]/=BK4]0*3MC+I?>^7J^)/@:H +M/:8U\>3QATSY4&?S.W>,+3U3L$&&L=_KZ'<@*,)/,V6Z\`]U?L/C9=`:..FP&8Y#[(-DLNG"K +M<%'="0#2:-EBI`Q)O_#6F1E+S>BM7&>\A[X8ZS_;6RU4JZ`SDGP_(:XT:TU4 +M/ILVM,A"IQVU+5LFYCG@8Z5.VX_>U^M2O9$#EP5%EB"0Z+LYKK0*MX21(Q5& +M%>F?<&J#?#16`>NKG59#MMR11QIR9MXJ[:]G`O7X0Y;NS\MW8I%J&&*0M!>Z +MNW3/,2HY/%9[X=$&'F9J$LR,]W97@TZHU#ZR:_;T%P1UZ7YN/476UN!17-", +MY?<8\Z69$;\'PC46#I7O4Z!NHMV0I$Q94)MV]W\:3Z]J[DQ!4SZ+K)[V=*=% +M5P0%>M_:'\#VV`Z-B+BQ"K>2AM;LN72O2AWIKR3]E1JXMSF.O,^KXJCT? +MI:5G":UVLPUSQ<%:3UPWM'V18U371#*6VJUB-)A@EJ4)YN^J3E-B;\MH+C`J +M/A*L'F'2\<)/M&=*LQKE-DO16.^#MY9G&2M@#`T\&>O]-/5^15`--!#O?=2J +M.FN=XD_0MV43J?]O'\8G<[,:TTE3ZJ5AY1H_1[ZN@ +MKPIJ*/342*^?`9UZU*?X^]+'N%6PLEB8+>.1I%SSOKXK80D8RN$O4L5>I5;K +MDJ1UE=.)4M^*%M@J(VT5U6"IDG6VM9'':(SA0L\9%1T*$D=W65[HC:H\YH\'FT1+OO@/=1K),>/G` +M%1XC_DCI!HQ".O79@A4R6V!H`G*MT!6--/K&G01=ZK*T>HO1KI*$KFNUJDJ.I!.V$)V&I9&L]*/8 +M06C=U%#*T\=Q;U]J+7HSCV/24(1PAK:VY!CE#6PMJDZUT:4GVOQ.T.].\SN0 +MM`;41A6NUMZ`&G;,W37W!-T+QUGYV*B'Q^FW=%PC)S]N`DY>/B[BY!\8/RIL +M>A5&C:$:,T-0H/IN!-?\P"F9JN2(7C&]T4;]D$!_&CU@-G%`/<>BDO3F:/!$ +M^NV-2CDW/BP2(A>AM'E3MK(#Z8_0,WH=S+$TL>[A^MNT^>*`^:(0I>6;-_F' +M&]*B/TM16AZ'"J%4/Q^C4:E?\98KG +M-ZN2%A%JX_=GF"\]U'^N+5=@OV^TDVD4YB(42AGGY#P_=T([SR`$<^,\>B*J +M"9]-90IC4)-9FR5&31M(;U0EHEVB=[9(!K?JL'!\9'N4I5S@9L-4Z\N.'V=[ +MH":5N7&K'"W!:$*R33-,-NKQU-X._=T9&R6!I&7&"H^2KO:,-YIB#@74DS\E_I6VT@H\2]/H!<_Z +MQV;01J@MJA2AU%>G3EARE+F*'/;< +M">?WD$*)46P[3C#79%NGW%V?!Z`V.OQ$W]/4`NTT(IX?W=T+OH.25!BE'8=7 +M^NFNN14@(Q7I8#M7Y]6S+V6K@AI='>!IFY)9X12EU69T$Z2EYS6F-5$-ZD11CVS.Y]6@XWOP-R#]).H?TDL/[^GY$)9^"M57JR]7T +MK(TT/[PK2%K0>4D.LEZQ206H)]I_VV&>7\V7(E2\G1IUX+*@T%:#I`U3*R15 +M3H7WOD2R[0+/(:X.GE&1.AKIBSZ##HRU.0=>CB.K_>7?)?G(J&0+M-K\QA!2 +MV!L,[%M^/MA?T/.!>JG635RV6:O=+[$4;=19<_.M!M.HL\9K$#!*=/D]_>K: +M_6?#IG+(`DM12US1KM*I`144&)5`J3L/9]FWH]WO5%OV][5B]N?:9E_-47YI +MOK1$L]^4E/'=1GH.?K?3[VT)^5UF5(IHG=(),'O=CC97:(G=_Y$:LY)1G1_GJXWU7&SJJ1=8BHZO9LD,-NP7M2%!])%CU$CQ +M3#WZI3-Y=:Q&OS'*1NZDCMB\IW>DN*0U6&#'XV_H:69T%T;$!JP[J<]0/U!O +M:;7(*PCJ6M]7ES[9=Q59-2L&>O/)@4=#%=[CJ?9W^3P>&85TEH9IDMV[-JIK +MW(]Y(=DAI?0E;8..3E[CZ+*DU?XG7VU/Z,1`?\C2;^LNXB9Y7UWO,#^L,.J2 +MMRZ=D1QT>:T7LSZJY+T&]'C`**RP)>G(T?`'GJ?31H/UNK//BJDC+1VB5&9T3UH/6[SMM&;?9X#IE$&:R(9SO/*KS`2 +MQE]!NDER-*0!]RZ/M>/AHH_U:;1,15!;GF!KPJ/OU,YTX%';)>4W?UUE%%HT +M?)>TH+47L,;V+,;#^U^5T0N!"M]!"%,N3358,9K/VY(O#GTOMU#&$&;K\EC% +M4!B]2?2VZVGU[Y)^L%`XN;1>\=%:3]1NCK2;^TBMI[!PLGZT?;B`>J^TL%$G +MGVA-IRPYTN@?J?VM]V#MUEZU%C69*S514I/*PCC=HSYC:C(H-:D*:C"EPU,I +M#R8[J:\[D>T0N=96SUSB!!M^76 +M%ENN\!2B$RI;(*@)J$7H1-`%1K4-C*>6.)V4)*T)J"5.)V5!34`MH!.U2/JQ +MTC-1#\57E=C>[HEK5FLG67?7&:#`K^!7LCACU]_5AI':DI7<8[->RN8RTD./ +M]$N_]5"_^3$*W->"F>(@$W&F:]%3GDXJHD#TV-'HL1:/U[<%A7[[3(WJD]^@ +M#CW5YUZCT@>)!^IP;6LXX.5+@H)6?)Q*G^6U$$6^0BF";ANX*:*1]@$:YXM$ +MPHREE$8:*2P2*[-.*>H2>O",R^L>[L?I-TG5$J-.3Z)=E'^Z.DV?P6VF_#/4 +M-IZ_#>_LS)2E]+;-/TQ2D]Y`+HT4KVP]6'Q_JWKB4+:R2.@+O9S.)[`>RGVZ +MKU?=3&-QH:/#QP]EJY+6C>\]9QKUETOR%KYM4S.D%M"%DKR%>EP?SZ@B:<)= +M[($2X/=@0GJKD\J&WLH=;^PTVV<;?TI:*)7+^TOM_=+^"Q;E`T:%QW5E4(._ +M7"&>%CL6H+#[9MI6+@CJ5[9G]IN>V3=F]):.C_=CO6?VCQF]948=B==#>Z@P +M*N+UU\9&[[7UT5N5'.\^E$6;A=-5NL70:SA-M$C\UB<`]0K8!Z>37+,43>IM +MROP&,L6"H(N+1:I$"MUQWBI4%[\/@1 +MH6YU8TND2Q<8U:@/8A_&8G55)+5*C%H+:Q)E0&E'E,^S]$E8^K`*TIUE1NTA +MC64*/->(&C]E$&Q)06>B+RM++*U6;ZFOSQV(_2X0_Z\N,;,8_.1SM];?+HW] +MUBZ*_;[:_,Z=&(V.V+=#,>0M]#LX,9[CCMC;';&O"HRZ.'IR7?X2 +M_,:\-GNW4)^0I5F2M-KSG?"(Y+4%TR+)V)=E1GGV>ZQD8`XXE@Y2J#!J3#KL +M^S`WWQ5+J\JH],NDI;.3I75-+*TYFT2N/3(K0+ +M/=/06AGS7UG;0_8[^&M=@;7MF*5>$53,"IS(_JLR"EH5#?`-S"?8EZE_@VH[ +M=4,XYQ#>;]`Y'AW@WJ>.9GEU?QO59+/O6W^^U2UI+Y<3NV-/KP9RB-YB)K:T +MIE.EB8?M7)A72T[)!(QJ'>TA2U`%2=6LO5G-NBU-=OR-S4'K@`H[Z%F!49KL +M`\X5_._$DS/@A>'T0UD[:DNYR4:M';&PX/S$ +M]:PR"K5MBM61UTZZ2,\_[F3V,=,G25KUDDZTXIP[R?90HV59MRGW]`>"2GOG +MN*.U_O#`BUD[[WCQ]ZELJT@_)#E08-2@S,UNX/G93;,RX3]>Y/YC_\R.T6SI +M),L!)NJ_HTR-RJ;TU'?XCNH5IDS;/_5BUB%[GN=S#$H%X0=F<:W#)U[,-NK[ +M548UVF7QODBC[B=S;S>T@,PHJ0WSL:_U#R]F.&?3V+?V'#OB]G*R4>RA](\0TFR@%'7?-=5+4W&[\BLA]WT +M!YD?[:!G^I6X#UXIK4I4TG7OV:`SM>"TX>PHGL8-B!IQZ3[%K%_99@LZSEJ +M9951>E>S/G=@[4IPR8[DL#Z&+C^Y5B/]4U-KM5X*%$;I*22]T9IWF-9<2W^? +M3)GIU+R'?0[V"IU'&AAWGW"PF)M>2+Z(ZU +MY`+=4:,"HZ[^CG@=O,>@-AK4^X"ZZL5L2=+:M'D#>KRMN$CVBJ;&MEE94(>L +M1;(YO_CRT[3:3J.MUN+S>N2/CLM4&(4>"2^G48_YI45(9VS:5485%XH]!NN2 +M>VG!V!SUJVR.F*M29JX*K7LZM)&Z#]X(\I*/"#HZ:+%[#]8@O95V]],,Q@'&U>4/I%,M-6O$M=,$_UE?RBCPHU+*R +ME.M2*26/^!].S3`'N'UJM)92.>5?D;754UY6UKZ>:O!J::_=_<'MKGK-%U?K +MD)Z^9DLJ\D9@^U%0)TS+,.>ETG_SCV-]%M854U[P:MM#]->$ZR8\'AFU[+MF +M!G +MXOLQZ]N,LFN%2`LC#NE!7A=3W/;I*J-LRC.&;D7PTC3/"!ZN]22,7XS&/IIH +M5P/V3*H37IFQ:P&H*];[OC*C;"DG;:]E1VHO[/$,6ZF]3.G3WOG# +MH9?T'$\YC['?]P;ZVS5_Z],BM=O +M&=4O=,>V?X%1\?I-N+XM.?HJVA&!W5UJN43 +M=ROZ;>PAYD969H516+W=03T1T'=-V._9\$55THI]UV*^6$=?M)HO]&M%/N*[ +MZ_*/HE3T51M]E6-4&WV[?BCE+:4T,289?6-SM/H^BUTEXI +M?U9L_;AC=%^OVMGL0P]+$7>O".I4LFBL#]FU*=YOU0;>WW$H&Q)]5%\KW.3> +MW@3QPRD'K)]55#;F,/K?N+,VY\_]FJMRC%+%7B]9[/?45L4[_IQFHD*R +MUR#E3TUV>X&@7%^OI+\2M&)/28IZC7IAF5&--@?F8>2+FUJ:J'\K_R8<(!TFZ2_EIC>RK/23^)U5&S?FZ^)8,_NV^NJBM0Q#/4;34ZGQ]+:9[ZJ,NH_#>*B&.+N/8*X`OY? +MK[-MOSU6MFVQW\-HK]<)Y;]1O";!X\(S:I_,B>N:KR.LM],1:] +M`1JI74G9):%D)1S[3JJOBUM-D_EMZ]=/1-'6TND8V-?;1MPNQZ@V[`H;OM%3 +M.P?]],"/>E77FGS*F^=-']WEJ]*\SH!1[O:MFE';T\0C%OHO;%&M?QK(Y+$F +MZ695NL`HM?-ZWQU>R*@7:WO\DT9O\@]N27NK,#Z3\[V2H`97:NRI=09^[.-I +M_>_Y/NOW$4K*54_S,*6YA-()+PYUKPQO2F8"28MDA#M$*GU1;#Y)8Z'G#C/-^05&P;LY%S;+R#?>I(O# +M'@\^+3A=NR1IN8Y.JC4>=AE?">N7[EO8UB5D@NQ'1DW%$^R6574?M^H?W6@W +M38515:,Q+@K7L$5!MJG_0E/=H[VZHE&KC=.\`]\^Q(/QV:(X%K&>]O5-A?TY +M32PF_[:Z19'SK441ZOK;I'F;Q'.J?R`H\]8S;SV\;:U_56!4FWG;AK?-];?: +M/"_Y1GO485)64[".5AQ1I^R+;D)*&7Q1(3DHG>6QDJ/,%=_*CG'^ +M>V^:D_G$Z(K/A8D7L]6H](__U)6=72'J%M_--C>O>X'B?;YO&"]_K/=-CE%C +M/>DQ_^CDL90&CK/\XVNAS6&.%344ZZ^/!IW;//M3F1X[@3I[PQU2!*_W!OG.7$^&/>OJ3!JHMD[]B'Z +M:X*"K8VE7ZD*!%'RJ!*KZZKZ)668U[WA[J%8V=^>/<&///(2=0* +MM7X[CB[Y`>68"'6)4>&/FS/17,[E7L9:3^&^U@SX=%ER7)]F/TR?:K``;?Y" +M2R9>UTI4^J+QK5Y'I7;,:HB:/SN#70[5J"5L&7C&ITEZ_R"U'W9]ZU.!.FCJ +MINZLU^O#UG?XOI,RN5-M6F@?-8=0CXS?V1"<:O75!89ZD_N,C1RCV\*IMK<; +MI5Z;,GMUJ(PE0:%,^]I%Q\>\Z'OGR<[C=T_+`%T^->K'E^KE&;>?[]3)9>TN +M\30B[E<5E$+TD\UY':[V9J6*9#V]Q^-5A]O1]BL]O8I1R;O\^4-?HC?O\I<] +M0F^V%V7E3/I5@:1E-%G8'ZT8 +M=0VH@J"4P_.H>(NG_)4C7TTY1/J]H&"1X,=5!WD&)!?M'][?Y\Y2Z?(JX7*K +M/2_)'I+BR]\B8_U;9J:FLLK.`^!;;\#QU6_G9N)SD!OA?[_*\.@QO`'K,D@_ +M3`A2OP&H:R;PO\!JT#SHZ<0[0R.6OPK>(!R`^O]* +MQ2/D?;GJ&-XQ@4K'-4W6%M433^&XSNP-7X( +M9:+["&+A_6V*7FUSG&@'+MMOE$*.46'+,9/N"0`G#1@UV6H(:**8H?9BE`-M +M;(&A5?#]!R*)RC126FUM=]"Y)DKL(`ILHE)?XS9K\'W(W3*CK&[*GOFHVQR9 +MAV;)W$7M):5_PPM92*IK2(:TA:1)PH:'W`Y5*SS%JHQ:,T3%,&7P5*85NF\: +M-(%]^6%[1J^)=%_JPXLIET='5_CAZ2=E>*7LN7:LMFS(,:I6N[$7N;C/UWK" +MH>.8@A9\DS2$HD0P"1B%\J"D/+MX"I6QM:YMHT:%*$>#Y,B0I/EMY*^H?(J/6P']X+M9X/43G_1N4L,RI<=M*$$01LWU88U;C:T\C' +MJE(NTO]X%5R)!S2BE_">BM^[B+CFZ;6V]$X'YJCNP;Y@JO@:?8Q[N>Y4E^M% +M]#NW5OC$0L\9JJ\^N/8WZ5Y-T"<8M1VNV,GF.C_/Z-,NC +M>9YQL#=O.6\X^HC,?[7].,@):F2EOVPWU;J)^%=;[T:5E$A)SNB?V%L_8!1L +M"X\D0_OS6+^7W)VK>DT\4!443IM,>XQ:EZBH)&D9S3WIAKP>I]&PH7B*%0E0 +MEK3^GIN43R#=BJ`^7O\N?'+\%]73XE*4RW.E"Q^ZO-WE=3IV^IYNVUZ=MBAC +MYP?'[><[_4C6;WC_\[PR&YQN=8#PBE=(W!OP?KR-1:$I,&HR>]:F73K=:L@* +M<:Q&'^G7Q!C:U$IOV?`&S_6Z,:L4E!F%W8QXRK.=*8PA^;MCV,7?0472"DFB +M`Y$D>V_3[GZL#9RQ)>5YX$5'JW3U=*O?/XU8)&;L.$=)BV"FQAUV//W&B']- +M%0^Q,XJK=9+>J$UIB;%44ITY1IUUV599$3/[0U.CCH^2I\@F5:5T9R!IM9%L +M]-Q\^/-:=B(966#4<#'%3^@NLX%$2:TF=]2FQ"C4*5=+^6K&[#&1?VQKEQG% +M;0YZ0*_#3H+W!WVY@W7.?7T51NU@S?,BXBB.L9/1LNW:VLU5*3UDO8:7_KZ^ +M;20;DXCS%QL+^@RK/8[?/PP-LH?7$G.""=E4,SW5[`6, +MU/D.TPREB06UM=@HQ88Y;+->)[T)>E./%)FFKY4O;K$**S%6:L"\A^1 +MB;#Z`^\_2/FRI-4Q05K3ZVE5I/3#,GN+-`>QI@`:>0$\0VI09=2Z8G.TAB/Q +MNGIUV")ZSQG%-5J?R1SS$\]GUWVQ6:O--'9@024E/=?L5LT)2HFR?B5EV!44?:Y=)&1GI)TL*X&]I'S$]1+^UA6:1:$IEP +M92O;DF4I5\]AL[=S=_\?2;N:&:[6L^AB*_;O;J9R9J078A;CYXE,N[&^;OI# +M?1:CRJAA6("Q&)G).3T2X<9U.-Z9/NM?L5AS9TU$A<*AT+K-WEL@'QE57$7_ +M+$7LZ!Z)1]*+O0KRFV@]76#4"/P3:;1>?:=+G(7*Y_,H$8E*Y2J=)9P)G,/1 +M72''8-N(*4&2\!U1?).S[&R!@ZA@)O+8X"E&#]ZJ,B&5I/(OY5C]EW+4;XKG +M&)Y07]O9E"*V"-T7V$#31+EFI +M1L_`DP%\U24>67B3M44W3;`"R_8NYK_>9*RY*,8#WH8I&7GK[Y215WY3I`UU +MBB15KD2]^,WWZA9U15!;9V94AY1+W7\HJV;4ZWH_U;7*J#!'-2:M^%A*\TJZ +MVYDD'.4NI>NO[0<+U(5XY1]J]OT?59NCY/US4&]?Q14%B! +M^KE!O1A+XU>QOPN,4O\XE+56=",7!V67@B.-6F5V,)4E+43!,WVI5#>Q;^K+ +M-W>Q/KV#>%J%48M)UM1J4XF;3XO6Z**]H[.(WS,JO!%[`L0:X0AY&,5?$3T1 +M=*'/9LJQ,?3^6>NI62_C9\0["+7),:JQ3HVU"5#[;TFJ<$S7RH`JCQG&B!AY4/=M: +MAA/%C;`UT>=PCD,^994FW0:^6Z'O#LG<@$M4[B3G>;ESK*WP?2J7D^SE&6*6 +M<;!0,!_@KO0#1CG)?D^-^'X=^6@?:3[I6BWMJZO2G85S[,S#(,EKMOL/R4CE +MR`E_%.^+4H1B&X]R/@"]1'7SO@[,4P-=9M23]YOY4+-3B75QHHU.&]^$444S +MP\`^&5MB>X`_>2+FTO)5R7&[FY],]^4=3&^>R$8&16(6S^[YR3&J;>#F7G7[ +MA6[NJAWVHVNKP8=WBF!W>=E1F$? +M+/;4JO]Y+ILARK%^T>&,3(9&6KHB*&K%)'8,;GD,$4=)[O>$V*_`^SU@-3(* +MI55#]/G`J:%*%4E+ZU;895^KU?ZA4OV^7B>S&%A76$E:5>\EGF*_\DO:V'M\ +MOK]B=$\^M\Y:.B@I!78=1$>ZSB5D5U79QR;-12MF]C8UV_!:AX!`[>D4UOWA][EF,4EW2GS/5R +MG"S$T#'1(,+.YDSP%FE5*O'M+9DT[I\7W]KU,6^>@J0U1W+AR#UQ*;CID7Y$ +M\"F]Q=I6ZK]D=:!XM+03HJ`P'WHNE2E'J/#$=,;JJ;(F8^+"4-J5MU@I6G0D +M!T2)"9\3__1;33VK=51K/2>>T?I+*L.]M?6HC'YK))%AU9\MNF9 +ML'5&)A>ABJ[1>TM-8U8\PW53,X&@('>L=FSC!*&<9T_-J-%:3^&M<8UOK+?3 +M>68&F^A+T@J):C"CPGX!];?T?".>E]]J;7=$O+;KM=SC9/&C%LN&>[V*H!`! +M$E%_R7;'4U?^]EW8\MA?^U:KDT\S'JGN!)ZIN@^HR;V>]_6'.T:RN3Z1:7NP +M=V4#1XX+/:&)DU0:>Z:OS)$VPRC>L]5.?`/S@R?2@Z&1+/O4+$%Q/*_0%^\A +M6$U8/SR#=-[0XW[E]$N"(CSV?C<1LM4@`^SD3`JRS"A;GBD&V6Z0ZX!LW36S +MPJCU\E?GN7P/._-\SW>>S_<]G57)<7MSIRI*U`5W(,-\AOUJT`?P9UK/MFBJ +MX>T0:>6IE+:ESZVWI4=9^(0;>#ZW.3A^GD3/8WU((6#4N'2\>CK<7HQ".FZK +M22?E:&ZKXA-]]NL2HY#&#L>@/(?7(CG-69)F>7V\O=KM^A70K4[D0U1A5/B; +MQ!%G%:N,:IQ5Y%7*`T=%\SKZWYDFJ#77\;-Z^08-='<4GA"1Y16 +M$*75:]/*CT^K,&%:C?M92XQJ],#&?M;<\>UZZ>)VO>S$=EW^=ZO+'B-C5]S$2Y$1LA_"K>J,NI\^&$87U_G +M_?(&SS`/G!SP0_TV+CVO6OBN34LA+;5K@_I:ZP:U^&?GY`1E^3+1Q2N2L>A> +M5$:T2O`VX?>8M:BG@Z\6QM"%MUF=/&3>]\@X]/SDOI;2VT2?:/5B;W4\GEB2 +M_BZ_S>J%M@7@U^DAB@:^-#,D%48EC/]?B]E1BN@$SALA>FJ\4Z)J6J(ULL_: +ME-<*5!%CR"/^DPY7ZK<#=>`K4[6+)T0I%J46YE=RV=!>;[>\4"WP5QX@G2(Q +MJGS$ZQ@IWDJ:U2\\E"9@E,H+K\BK.^9$E.>^1G1.:&D%1BU7/,.V$0;N +M4OQ&L&_*=?`?D%HT'AF%5FASB+_?J.HM@-6D0[)SH\PHWN7BR-P)RIADJU#: +M$%]7&*5'5]-+9^/T@35\[QR5>U*\H3=4WQYO+\=X[B*]5M/"!_]GJM;GQGN( +MRS88;O!(AVY+@`-LSM]]!?$O1EV"/4W%?;QCL*W9T8AQ#HVV=+-+6JKG!>=: +M&]E3&8^ULE!6#+3BOFCU!M:N+#`J_-2!+%"LK5_V9-^5>'@]I%>+#DL'LB5& +MH6?B/8*^\#";3OT1?G).IFQRE%[!/E';*_'^J#`JZI78"+/^'9I:J,HH2[V\ +M]F*0&)^@6_AZZ'=8:07-(/SF_`SOQIV;&3-SG6/4*L.5PL<79NQ,09P3!(RR +M:Z!Q3N!^AJCFMBGY\.(#V<([+,^9+#8&/+U+C,*.2#DWZI*)BWI9[79MY6G\?EFB);8?Q;^ZUA_R_<;>!/7V%<^)!VU! +M4#$_6JQ4-LX6E!AE9PLBHE&FAC]-'*>8T] +MY)AU:#[M[A.*=V)6&16^1>9NX,<)#1?^":Q]'Y(8^SIO1P?;9/B6^A(K;J'5 +MS;&^G;>T:E-79\C>*,0N4D79W1`PJFC6&VV.8^+?SU)^@5%=\-[%_"!R,+L; +MXC128M2DZZO4MR[Q[W+>MOVZNV#CW=6K'..S0M:39WY7I%Q'4?-_IBO3Z8BO +M71-HU4VS[5&[;$50E;3"M*\3S1JIQ]/M=)J9F^M^EE:H=:K;]XK*T\X:3SFD +MX4*#W)KRL=,NQRC6TF%#4CD\K&F;V2BUZ&`6&G?`*"_VEF(JW'E'SJQ`!;32]\56#JYF?Y3;8TCBX"UKZO8*&V0,[>M[!W(!#Z6

%X>I4"=4?\RHUQ#T:<\$O-@LW;N,B]3811K&5=Y +M&;XF6)NK,HKM6.O?/L%=OTNHD/["_%D/A+[O@?+6L971S1PA)ZA!:F=8>?2V +M%TR.];>SS-MEL:]*48Y=YNWRAC3G +MT/-RE*/?\-8U7WV+6K?"J,\5Y>WG+G-TDMY>8_Z^AOY.T=]51NTR3W?14X^> +MWF#^OH'^OIE^Z_,Y1VJ3F^E)&[75+45IHUOH[W;ZNTQ_YR)4F9[J9-K[UF5% +M/9WNWZ%[FKC4]XJ.%PB*>!7]->8,G;@%51`4UCNP2_GY8S-Q:\GZB988=3%B +M=9PVWD^45^L5\?LH+9R&PYX#\'DX^KDQ,KS"J'.L-E1]A=AH#>>55,]OY``V +M%Z3?WB[IZW<+K9*$:QV;RYNM''_B%9GWV%H\.+86I7=;^3CA20[W;]"I.?7Y_J"]UAI9=-S37JN20^S]84&E/)&-JL\WB8,&M14BE"; +M;.SB">BUS*A(CZ,RO1OH52JRG"##*XRZF"2=5TOYX=N=C(*/P7=GL^;P\SF4 +M\K(7LU5&A;W_S%J?M-MX+<'7>,8Z&:6E+V!+!W/(X5;V7%@*;U=*#UZ\X4>. +MY31SC!KC*\SS)C,S/OP?[/P]H[JL)=*FR/@0&R1I7JU5/HB8N8`U2VA)*=^AZ\4T>4KS=R2S3LNQ^SXY[T +M@ARCL,LH?/4)+%W"6?_,CO/WW1C7,<>,U/C^M(U1'8^9E_F@63$%K740;768 +M.?@2H\+6=.1_?"X]O0?ZR:PE&4L!Y8W1Z!@BNJ0KY';W.VJ&5O?5;NVM"`IV +MT"6S,T_6EOB_@^4+;>C:V9G?%:=Z)T._9U332[4>+U:F-B[/BKRE)/U>H!9< +MMCI:%?Y-[?V^71FNU:[+J_G'9'*,ZC(^-5U,4PVT/YW&XWLCW7=O+7NP]HM> +MGG^_8#9KMA@/JK;0+S"JBOU?>(NSAZZ8G?$H[9\7I^HVNE?H7F+4S[&^BJAX +M\*Y[P^S,"-7M8'&)S/%0[F7)T>]E6D5&&>*#;KP\JC`I_>)#W +M[=DQ&'ZGEK4K]@KQ.B0ME]K=1&7Y7UYU0"3R>OOI]P'%O&4.689=M6Q(ER)[ +M-%SD9FRKYA@5C=*.8S,3>5P$C`I>)G9D@5%C/%M-A`_U_SP;1?@H,2H>YR,> +MX4/UD:7YTV>S92F7B?,1_OWY">-B5!B%\=/YP@?54GK[F>C +M.!_<\V<<):O$=SW+XTG_!W/,(T1>9'\Y1HV;!X`7-7:&D&T#[XB`45NA%7]; +M:A[ND).ZPF]+;KR_]C\FXTQ1NK<]FRW]A^7WWV-^OZN%>WU(9EGNE).B=%E0 +MMU!NA^1<,<[M^YEH5A>Y5A@UF45N"7.]&_/L+1;-2.KQN +M;*[JZ_5<*K3#Y/$`._@""FB2BAXV94I`G4=EPBN`]C=PY+'R\]GRA5:?&,_-2>LF"P]>8Q5!I?I]<'/X2[AA +MJ+'_*TGWY##V:H:ZRJC4,'9JAMH;QM[,4+?2O8WN,X96>SCI3+^?RV76W(/= +M,BN,6>\DV1PCQ2LU.&>.44>157(0'(6T6&^(\`HO&TW;S6_ +M5=X,DV,'2>>"I#64\HX)96_MT70_>B@UYDS"$J/PYACS!FUW]!#[`F[$\V/I +M>?G]5F%=X +M$2N;OHAI@DJ(-[/-&\S8'#M$^ACI37B>NTC2\CN!L%$-7//6[FT-+K):6M+X +M5:&T2"DJ"0B2<_SB>3Z`+SP)GV1]QEO#^ +M&9FRH,"[WOCLN`A"=OZQ'&LZDJ%X4YSGV]+COQ736P19JK_^T +MI=\3>R/>DG/S5YO=5#E&A1\^)C,N#>.[C:^#_QRCU;XH.R+BYV9`]RT(BG>U +MV._KNNMAH[N6_C.R:^$Q:^O6\$694?ANU'S7J-'"1Z3RGT?F$SY'^ZI*CLF[ +M^M76[@W3(7_2&/V*?A,W6"6R1!?JNIP_5I<;RON>D22.SQ0DK;27#X^:G"9*A3A- +M9,SY,+*>OX(]ZM!^Y8)MU2-%`JX4XA(Y'AL;7#0)+==]-ELU=:36:^"E<2ZJ +M/\"H[3,RZO`S$H$+$J9[K&3.?<#.`W!K;NMFKZ>CQTIG/Q#4'.4G,#Y[[_F6Q@4&J2'JIQ#Q4$]E7%2W94>(359AE$0FI-Z^/G.. +M#D]KY=.%X:OX;[,S9WE/M509]8YDB_<2\<)WJ-,T9.6P=YK'L?FQ3D1R4U_, +M*+PE+;N$&,_%_3Q[X0QX/A5X5F+`"W,7"^4L\DO8]T"(0>%*'-N?7G$DE$!0 +MFT[CZ,U/-;&M'>"-CW2-1"X(ZEIY<^[`?;V7>O2V?==,+AN\A4DZE\:D]6^U)2J2%I:=5)I-WY0;=.(1\VY +M-8D_6:VF_*J@^!RQ>JYHNS\[O?I]L5&,6G0MSXWGRXM4B +ML6J*CBXS:OU`BV]]"K$6$[X&8[U>Y\J'(RV-9.OC5(XQZ*4S>`:A*BCLY#)O +MU,DS,AV>*1OU!2A'?\12SM6A\CX-_U6+7D*CS]!8CE'``[F-:,RW\94.UGHL +M702,0JVM'?OJ1XQG'E'T=OC6$'NCQ)=_U!_ZS[!%Q[M*W_U< +M)/WT1QDU@27!7F/&AL@QRKW>UXE=OD[>X.NF:\T.55BL;UG$5F(@:2T[LDPK +M?/1E91J5L\2H<,DS;,U=`]FQDWKNQ&?X%-=PAF*+O_S1?\4RK'Q4>.&NEF!( +MSA3C2).@))Q89/24*J/`.P-X9%NMV/!3*S?U)9-9OU;#_4FG4CE&J56CV^AAUQGJ7&%4TZ5/]>U@O[NG +M^EIBWB2L8W81_V+4&0.^?P;6F(I/]FU/83\YC0RL/W5Y_GIZIS_&'``GK(SV +M^.JJ?3.3`QFZDURG+U@JT!F>JR:K4I:I,G:V6`>;479DX>Q +M>"SH[%*FZ")B6+?X*;HW?]G77LWWY70@CSURV+=U^WW"XQRBDA#)-VJXFI=PVPN[U*=F\??)4&-7I/<$'[>4@W&\]$Z<0G;TF-AR[%_(J,E&OUU!*S$J_.OD'(#/8_VX +MM7X/?(]:L/WH<6MS''_BX^,L:7"F[L-CTJZ.JZ,MTVTQ[VZ]B7O(:LBO.#QA +M^7*;+-U'IWV?,!;)_A.2EMF-B'5H;;R"X.7=85;I"X*"KG2Y\2](T!V^6[&U +M]Y+DV"9O81]X85K6X%/X+;M=RI(6/!>:)(Z5IWH];TCBN0TZ4I(*HU">CM@: +M/OMN)[OS^`+H*J/<@V-C=3?:H_H33%_1O@ZR0^&;0%0S\H6I.KRTFF5_`$8= +MP-E\2=,"6.V?UIBPWG[&KF+:V)?DN!%E09GO.HS/]=%V_0K( +M4U2Z(N6*E93+N``[9LQ97&16^,))5)R7%)CKF!?;`"A\9D8BY.(]UH+%<*41S +M^)3L6<`N*O1M0=*ZG:3=VBYS"G/]"]O*)4DKUM9H8?91IYP.?D&BV909==#4 +M2:T].M-8DQ>H)A7)<=WQT8G"'"/6G"R(M!=O45YU3$N@7(LI1TW<+KRA(SHM +M6F\&BG>ESO+U+)P2#9OJRQ)16TZ@5EYN2*_3H>5,DYW_S/N1&15^,LDK1F?\ +M+_6(G0EY]V2H#XDJ4]F=Y?#R7AT/)YNA5&#KU;IB2)4V=A451S(]EA&-'J4?721N4T>W]*C!I3VG9Y$Y=6948Y9C;8COCP33(Z9(PKKQ+E +M"/NQ,U8^KD$XPC6I,BK\9D)&QA9SMZV!6)=4-CTH5'A>OMXK,B-O<^/]5H)* +MU7,K)L>7/ABTLI9/*T341;9KQR(+@_&QW6Q.'O,:QF=IT%HG1]0G&!7^X]A) +MXW5`CZT,'LGNX'%$H[DZ:&G"QDH;BM7-^I?KRQCU0:F3E52.0708*LPQ"CX. +MX?L%*;M!Z[%AL#LE8)3LWO0B"F:O^`OH1>UHWB%<8!3V"?O6BV0AC?-"A\@E +MZ%+8GW;9F-%A5@DL/[4>,^7+(KJ?G1RWZS]\&[TD.5=A5*.T4U_N&",=JI=9 +M+O<61"7^^J*,G"&)\Y4,K2T?R>JA:#R^8H3/Z+/UQ2F4X>\.\YIDCE&L0YA8 +M:ZQQD(2RLBG\KXY,,#21K/T0HB9=ORACTRX(BG*(1@9)81?[/1X\.MIS76+4 +M*MY+<-X&H*<85MV?,0J7@#N$*.43-O6*MGT87<.L*UVD;>X[;O +M&,D&C.)9>7"1AZC]STADK&S\CZ_X[,%>&(OZG=FWW4%(I`=/;=)/2EM,;T?] +MU^[A)!*BR2$R1Y*^[XZJX;*@Z*\4_<6Q2:PDWI;FN$\<'X!1X8)$AB.-@??, +M3TB$+U#/*X4C5P55X_,0S:D)I/["-M)U7J:W`L7U*1K^_LM$IJ.!LG-;91Z@ +MWO_K390W,,DPW\0\/V`4HB)INR/X6S,RO',@1ID%1HVAS3=UC-.;2HSZ"/KO +MW$713'5S@]91WFJUCL9S0'/&3Q%'R1AU@HI,P2XP: +MZTO@;R#K8H/,Z+D;H.>4&15>!RI^1/2&IY(IK%$P$E^:Y_C6.-E1MFH-\?IKUKEMD1QZ +M/<+"[FWA>!:Q\?-1^C!@5)AMKCDDS=X!E\#G$)=8M1E +M\"57:S3+6,3#,%8)ITVV2)E1KTKV>,3-\C:GL[SFB/8/UU2^(BA*)XYTT4Z4 +M7C"+^A;S]U)'Q-W[8(;7Y<+O'N9>P9Q`TI1$;[=Z#MJ%UU2[5=JDNQ%Y(,W< +M=CL>3S$E;=308.\&@B*^?*%[N<;^Z(OH#G^3@KJ3'4'Z1O48;34"]JC>VFA_X?RKS,J/!WF8S]?IDYXP(T\8YD +M,WN25!CU#LIET-3:HE=3;F^E],^B>Y51J^BO4Q`/R-28]'E3A/PQ7I>,&K-+;`*MKW!%I,&TF#T%V5'FFG+& +M3LI#Y/42HUSC>Y0TOD=`L19O4.4)4?'Y=HY?*.4ZP@HXQ[-B5%LQI1>;TTM8 +M?X"'M1%U$,+O5:Z-P\M](ZR)Q\\[69R5TXTIS#.WY=1DT6@ +ML5ZA!49]_P_&\F+_O;SL]T%D[:&\PCQR*4*Y*?BOR-GL_!;[U%Z2V!'E".50 +M6DE3/M1OAHFOX;Q#J0JCPI-'LHW^0FC#`.,*^V&N%)YS'3^]P%FI-R96QDZP +M\O5[FU=J?95HVQ+?`4CLBV8KV/8VM!E&. +M[I/6ME+("?.])YA56;=7AXLDQX!1/,/PJK]GHQ&+^9R/SXKFZ@J,FFI7M4Q+3%1*[!^7V*4:87$P#RJGZN;S+Q.VCS/E>JS&"OR7;;- +M$*\V^GU>/F!4U,.'C+_6+$>'1_\]&Q(%AAU_SQ9*H@U)Z^E8NW4\8G@&M7*) +M42Y0;YF5:>2O-I)364H?^MIZUD'JK3(C+-HO*BC#%^PH*?]A["BI"LJ,E?@H +M`=*.$OTI1IFQ$HT2*CW&DDTWQZA6M%?+WR==L0D8)>LOZ?S10[YGN0\ +M9\\VG"):K?XT4-][:"Q_0(P&=;8KDF_]H6R.40E$(NCJ]:E'?/B%Y#$7P"=9 +MI$E;<_S@T];ZY9T(\-FZY:4LI_4&-_+8+S!JTO-$S&I7B5'A%0>RX=N/B:+; +MMYE=^VM-A-3RIR-KSMI[1&OCUM,$-<9FK&O(W!HD5:N,>JW1^HLRESIFKA6Z +MI_Y,HY7)5M<2=\P,7.XSC39?>@*;+_A,O8>4>-%A7=M;2Y+TII9SAU)>VT`Z +M7Q"4&:TC`RJ_%F4Z6Z4WA2FQ84XC_5Y0^'[3W`VH6UO+6GU&B^>M=H9UIR/S +M:V5&\;XJ9S^O@7:V>'RB(':8*JRS4<]5)*U\4R;DM3Y)SZ:%/)!VE5$V9<0E +M!P=)V-VJ+_*HVZ"O!@K?=VWV?.7.R(13Q(YD%/:H4TERC$),?I1''9)ON19- +M9F;P8I*/5UO[<.V+6?6^>KFL["@SBJG-6/9J]8%L8XM4KHZW!,\,.\8#E-+G&M$7U;$M\<1T +MB2*/O5*OX?D73E/_%UMSL9+:,MHR@0IS_Q5)J[[QI;9Z9O!?1EJ-*6UC.0O_ +M96WD>&FC,$<1O]\@`AJI*C2BU3KZ".,E>&KK/HNHBN:73ISW)['9*8+79$#.9$ +M"V&JIA+D/FO;WK9">)*;">?5VX[+&:'`7BV=H46'668*-RXPJFCZCD;N,H5S +M.)/2JK:^)4;9W,"=WHH=@(NP7[W>9F5&A6\GZNNI>YV=4I>YG%;ELV-&&DXM +M4;NH+(]Q'[:V9.1\44;!M@Z_-I)%/[9PW59J[L<;IO.>0_W?0)D:BV5I>5FB +M7H+U6^&_I1Q-QL3W6;E/K-%+Z;]OV +M<4KY%FC$J]-(F5%Q2KG[OQ73R*>(%NQ58=1M].LQ<:.?E$7L$Y1O&IB6H_<>YFYMR-/#M@E,PG7;$"9%> +M]+H^6>DM?#HU\2&[KB;/RY\3RG$C +MV]%2#FS'UI9Y$A]3R@7*N4AFOU&..O50"2Z8GJF.*5?CJ.#]R(@J\'DN%WJ7 +M:&+8M#FEK51K3\:6*_=YX7*NH9A!/5&$Z.#S1[0?S;QOX?-QB6SW12.7P,S) +MT5V7/A_-8AB9K38XF<:YVO+G&WM[PO5:1A7GJG$K@(Z9;>;UVC'ELK.(8U9` +M<1[83FM1V-5.M>K0F-5.7G]DU$2KG>K#+_)JI[I)98*=41T_IC+6(AF*GFTP1<:>WOI!%I:@5$318V#Q:G#K:UMX4*O +M).4:YJ@Q*X_Q/&\:/(S;]\SD5:31S1O<&]][3MF4/DT6C1?M\F+9>^@I$XN2 +MY.,7K`W3B!R,(:M?L-H0(6#QAM0K'8:35[[[A\JG,BXLWMZI# +M?Q%M^6NM9+L)-\E=8^R.#4"J4U1ZP;:,U^[)J7+PNYI'?P>,:K-/B0[2]+35 +M_FTHLL"H4!E]/%HKE[0SVSSV[R\Q"C/>"['--_F;?=RPG*HW+H/3-1TK;P +M=$]Y9,,/?XP5?K--$&E$D7!+4XF6GL +MG7!1O:ZE+]I^1(T5K+=61(2:YV-_3'CITUF4H,PH/HNW"SN5BAKE4%V.WQ%> +MSCPV3".V6^FY+K!H4!'6J.^%)+3;7DJ#L +MG`)BRFTZ+[\#W#6QVA[` +M+S9\W=_%8V;?0;;*J]=.9I6+#-F=[Z8<]760$K97@E1V_*H'PA +M\:_KK%18P+I\&.GVZ0?KW#Q@U+S8D\4/UOU7UCW(*U6Z<)V5"CQ;L[XST^C7 +M"9E9,CFNR'-Z0W6=T$8K1`KEL2@SK],X_UAA%,_5_W!:'ERI5JLI.2M^=S^X +M.4X1J3)JR,1`H+L.+R3KD'>TK9!Z8B?N+BMAF(MPS+3Z.J:M>V[7F#KZG9&_ +MW8X'Z^M%`:.N-D_"E,OK:C<_6)\)OX5^%R2M66I3[9[)'^]?2[ +M*FEU79`/B\=FDCBY!-$$^9XFIDKCG-#Z2\Q].S*9)FIO/COR\-/9I2'G=$YX +MZ*]9E";W)>&85*9CE(D2OD9G*`WXWZ/]EU*.@:"V*@T??)1I&;>WQ/B[^#;Y +M71`4E\/G;Y=+W^ED[%F)4?Z#]9G)''[O4GHQ=J?2WZO07I+6D*^7F*=OX"]\ +MS37`S`_]73$HI9]G%X%3_8$W7.,&F4?]R4\@_<;KKWQ1Z*Q_3OZ.Y"T0E?CC">@+K3S:LZ? +M^K;C](JA7J\@J$LEYG`[W5M8I-65`F?\H9R(TH@=W%AK0JC(JG<\7!6D]BM-_GTVK;]W3R^C:CXB6^ +MPNPK"Q\_$*UAZ2\#Q;'(W?I,V[B=I5\>S^\Q!_E(?PEG+27+HEF1?.6UVEAN*-=T*5>545A]0"[1:9H'Y50L]ANB +M+_0-7'K.K=OGW*@\SX^NX+C=[*=#]QRC$%M%MU)I$8M,S?.G8GZ:FIGZ0R=& +MG3`05`H[!I3VMA-RD/1"8_$:<^HFC,YFA+]_0J"''.1[SV!]F\Q63UGEA0SH;.1WC(5R]P>A,(LV;Q'>"3_B@ +M%LY]SU4+-C?[^BM`'30Q<["B@9@YX0WM&8M*$BK'J-':BKR+-OH]O;V$.$%3 +M3S1?#H^Q@%&A1!DWT:#$6G7-:;6PTPI?$6XB;VST?[;3+!KS7U\1FJ#B,B9']X1Z6:)29$B__XH='6/*0C)$ +MG7XPJW)M++WTC4!]RT36]ZR=8+SUU-?E>8Y1/%>,V11SPG=B]#VAVMG/9\WQ +M^A"C>%9_J-MW*$<74:!2O3[ORSS^1:YS@5$X&W'PH*RLC%F?=L1&+=UHY;9K +MRL+V;>YOV%6Z*6L+$73L0C^/6+-9T*4J+U_2PM<;4HLO\S?/1C%K0@,C8^4*C +MBU4DK889C#%E)-Y:C7)LB[UQIXPMH[XY:GM/9DO5IVO9)JN-FI+D;HYLT882 +MQ\L:W&QSM"5NC$J(DA1NMC,/7!X>8>?)%ZR%S,TOPGKMS=$LAI)3T";21,LW +M1YIH8[M/EWJB52IC63!N?35>S\)7Q\E:H_L^^T>K^Q)],:K] +MD;INSU8F]B,U"?^91N_*7S6:U1A$:*)Z=.)K^KOR5=N/T5X%G'6*>54S:A&! +MO,JH\,URJB!6OB^.^4:AC!=C?\S7&'6;M(`V+I3>9^<,A-\G7`J/C*/$97>%$\;5\7OB:EWRS]-V2B]N\2.GN&9_,-,2%L3E2 +M/P;_8\N%WEF/G4HSIV7"C88_F_(6!`5;[^/0S)XP*P6"X+3H78E1">*TX>]K +M/:#J0?#!X049U_!KM']9T@+7-KN4;%GB+5OY'VN=L)_C*X^B'B>]M54QAPG_ +M<@Q[JE099?N+=R!\@.J;KE/-*XDB]2U,7[<0U5QD]LQ-%7I@;P988UCO8!3S +M!_`M,WXR,5]#\)S@%K$,C:UMO2'P?0Q98-3)_$2TGZ7F=WC)@DQXGISC7&+4 +MH.%"8VC6K;=NF5&VC<-_%VTCHD!3SDJ]]"B/\0QC3O7BJ.RR:YN2J=YB1RTD +M<8?=>;;_A:SZBL1B>?*;5/E;(TX.;?;AJ1EUIIQ%.;A2J/'GI(WD;A6:J/O0 +M1C'/8W(\N-52M-#ZV+%3/%6>%1@5?P.-P?;AC\%5/K$@4V*4?7HOGGY<.$&< +MJY<9%?_^IUA!^H@@;2M7HG+%VSIJY1+1+XWUJJ`:2]TF7_!8?W,RHV^S_#X^ +MXAO'>HY1C2.>QWI&*`"\.K@M+H>*=CX.UOD7CF$_?$CGPFUVU,;YPAB.@/@F +MC`H_):=3V%'"DNK3M9Y!WIES3*8LJ%GU5IAF6@&K21CKL+X+&%F0<:60G]=ZNA$>DC$G5IC_)Y1_]9$]5]+ +M8Z:E_F8E/0O?0.DA7JVDUA/"+`J/"C\D9ZF.XW=5U_:[$J"-Z +MI4#>?;U.JRJ*)_H.$*H\#S1Q3A"+>E?C!*_NS3'F.>]:M&IWX(N2([F +MFP62YEA-#?%]RXV6X5AKGWC.U:V90W6^PYSI8\*90-T51H5G2K2WIA@O +M[8S]KI8C#<8\F1K]?J1?*+S9T]^(QK;9=P>N%O&SMQ,_F[5&Y[YA>:&&]O_. +M\7H^KP]]H[&.$^G2!4;!:^H3AD:_`!H=G1]Y(`)=^D:DKS;PK$'+J_.CV;*@ +MT'H?:HU6\+C=K+_B62]D*XS""&O4P^,:>-7D.%8/MVE:#5Q_T[;$HIBGW^*8 +M!@_9EOMFO/0LV]R8;*/?X>[YF>";\3$$2G&-Y;6+J2CDJ+(%1A7NH.01"3WQ +M&)]TD&3+FBPY\ZS$J)0]L]%\WV;>8FL4=(WR-R.=:;IH07L8V?^QK,.3H +M"J-<E5%Y.56MD(?W,[0#G&7XCUI-F2_T +M_PHO3&^TWYDO-L:^V)AC%&9?DMPKLDM&V3CZH$3X`TA:Q-/7>^+S>"-*CQA& +MESW:!W=M6*Z%_[7ZZMY8W9BCX`Q(J@W*56(4)/$+5"?DYIDRQG,O2UI\-IST +MS$K.$;E?ET>?=+;,\RJ"HC*TFIX)J6*SX"U@GJ'MJ_]KZ"O=9=ZP@[FIFS-5 +M^D-_"P_OCO=*JY0\WA\Y1F'N!75Q1].7;&AL?^SO8)1!;(PA-L9;NO`M.P]@ +MVWO"\]T996^?FT'VHZ#0/LE^_YW8$3'2[2\3RM;V"_UM1@UWRYKA8)$CO22I +MC:Y@C[H5^548CX(R.RQ61FE`<@J_1AD#1MUPS5;FQ]>'6W49OTT)N!9;4WZ! +M43=VA9P38L!>,3+^#(\2HR:3BQM1`N(L94;E0#%W_(5MY-7F30?H[7ORK/)M +MRP$\1_3O?`-W.A_\Z]OQMO]NB?W6WP%JEWDRZ2YH1M5W':R0L<1Q1.3\ +MVO5DQ0;?L;+VAEB+HIR+M_D4__^XA.*E*N=J*P3^$TAWT<,4&] +M4F4LG4*65!G%%@Y9A/B._5C-N9ZH1=Y1GOXN\XDY:<446-S7US9;UE59=NQ< +MG0\/SLWDOBLM4>O_%E(_5J*.N-[8M()Q:>U@F6N^"IL]I9J#@J3UB7U]3Y)& +M=M4T$UG*S)+9TI<89?>1VYDHU,(S/<3ZUW1_EXT:@TMI+;EO4Q1>/15AD?GOA=I'29F +MWL\GX-6!00G'YF@-Q.E`03K&JPO?.Q+_6FSYU_'5WL7#[_&6,-?;O*'"J*_Q2-VFY_/3\S;N9PC$WE!DUK-'V+--O!VKYMAYNGS:6'X_T8Q_$ZV//OH[7PN4C;#L!36'Z7&=4"K^1ACY_P*5J>_)[RO)RH56'4 +MU<1//\UG2)"^]'76!R76N='"JU(N9[_H(=#SZ-@E(V/!K[<9DX@YQ4;DKN(T52^PUBL+%40EPFHVN9>ORUI5J>PGX]1 +M;4IV=4%33M)O#V="@XNCM^E>O2/B]UO[`V\KTLI[SFBWWT;/TN847?U]2E$?[/%LT4BCN08A722*86(4F/*A;1#HJ)`4%ML_"G?XYIPE"ESXA11 +M9$%0EXNF[H7]GI>BLF`MDEXDDU+>$J.DU+$6@/ZZM3>/K_!%F5&#+P@=A0UCO/+]B:6"V`^AX@-P[O\CI!TL9UY?T&XDD]> +MUW<"Q5&@$64)UJ;N[60?`_=+?`(H[Z^]T_()![2*Z)DFS3:O)_GR;ZI43'NEM$TZ$@Q;)*'RK<=+WSG2@75=S.:/RI?T2HSH&76JO +MZUN8OH@>VI*NMF4*=SR9+4NY)O`-M?R9[4=&83T5<;\T72FR5.S:*M9:DW2O +MWFEUWPG/(!H,\^@3_0-C_6J[`Q%GB:GG<&JAG#.&=SE!I:CTIF>Q`[%1R@>" +M:MC9,HW*U4PRPQW=#+^:3.$'C5;3^/+MRIOE&(4G&F^WK\PC1_#4%/'KE@'QY`Q^ +M:"EGJ4DK_$4M:W\W)WV-WX4?"@>8QT_!&RRB3;FLPR+MDN1(.30]/[YG(OWK +MAU8O[*1QB%@\.!FJ"3US?RW:%U81U`11".+>;%7)T43)2"5O:E&?V-^'ODB! +M,QE/*+V;.3G[0XF7V=7PN$R0[DHEZ`/-GC8ODV/4P=H2G^.D8-?%=VK9\-5/ +M +MDY_,\MH3]7CXH>>RI=U6ZPA/K\=S;?28*>]NI&@[X\!Q8^Z:JUQE>;[F.T9;V'J7"2J+$\UTT:1(Y1ZF;- +M.\4D,GK:PVXQ=RCE)8:VMG@#6XO!'F.G;=30R>E-DWF#9RGZK>EW(4(UTY-. +M\Q8VE4=?M)@O2A&JU7R'WU-B7R01_YY1[?2='O##J73WX`67]/TVG!21E--I +M*WML2Z#D2K,+RMEF449=%ZC4<=VCEP=JMO>$?]V?QI?X1ZW+TO0X7>>J:M+\" +M9Y]27_SF3K+[2"=(C':'N1_)&,K[:@ATJ'\AC=,K-GJ^47IM7UV\D*=.\K"!IF?/@B@M%'V3)C/T=)S[-47Q+C`H1 +MK1>>\#_?G^U`^2Y[@FT.V=&Y(E]F%$J:&=T3M43;Z%=][B&<_X#Y^Q^)A)G' +MYPZN&$WGDZ,A]>^[1++#;YXD=)51S#^W/,&[L3R1U8%'4CIIY+;^,5"VO5PS#TJ[^G:E3Y+!:JO +MAQEBOESQ7[W;]C9V13V-&G@J($M@&',36SBZ%.GW=XN>(YJU3SPU/(R^[!5_ +M44*VPY_I;BNM@`2=,A=83'U06[+R0.W]*ZD?5Y8%178>YTHV'DH;7KZ?SYQ+ +MDH6=("E6D=+C#'#7YRCO*J01@A4$U:(1O1IZ5-74L9EL%Y)\C"8-`:>.-#\E +M9R21AJI_PN3-LX>[\Y+K==Q&?/JDT4!RC%HQH/+)`3)LH.NB)AR]''L^TC[. +M#PX8M064#)_X`15`QTG*;Y^_IK\+C&(9^Z']LB9A]C*%']B?G0-ZO;8G7_I) +M-`_P^YF9NJ?,"CE1R^P4+DOIJ7T#^NYSD(T?[<[$45BUJ4A:).D.%&]MB?S( +M%$XE3Y%&F=(8!U5&N=@U:-*[%?-+%W5GXOJPO@>H(]&IC_W(]S1*T<93T7@_ +M,J/X5#1JZ[@^'=>E"Y(6O!<'U$KQZUPA]'']D^PA@=XJ,2H\"NJ- +M)K3J6?NSB['GRJS'E`7U;6I1V!V$3([NHOZ\W%.M*_VV,..ID?S&"J.P9R(I +M&LPE:E?ZDC;B#UZ:>$3K];[:2OSK'J'H'N+8?I@,J=-QELLL0JD>.8G<;=;Z +M7HO"$_`Q14_5ZTW/7RI[P7/W6HEL^XTU_Z)8^!B;.,D],"B?3Z%/ANSSV&%[ +MZQ.H8V]WIG#O9/9V_-2VTKV-/63G5NV);9C9*S,*@L3OBS]"]H$TF<5*M*4%@4&3G45J(X=)6-.?HF%T(2+/`*)LR +M]%Z+&/P'+$Q)JR2H8C?O'>*RD:X/::>:5<9J-&5&A5^'#U*]%>)?0,Y5]MH> +MFLS'"GU1W5MO+_%,#==+FW'D*]++D;Z^C_O1QL5.L:3*P^L_B=C49%FWI:B] +M[A-[6_R\O&99?>56IB]KM;3?1NC@OB-9AG9^H,"H,;,$=IZ)/>/6<-HE1E78 +M7TO6W@>A6YQ>D[@IL/PW47M)6J,+60;]QOC#X+RSEDO->:R4=H51T2HU1ZJB +M'OJ(2L\:)B1&BLYW5AG5Q5$,C%_9U\3 +ME&`GM==/[3P`ZK*75T_)NL&.B6$TXI%;](IW1/V/4"FJG +M(36F)6T;PLK/_E#`J?@D?V)?7U_("[:\DH9VP&CY.1$Q^S^K)?)>B84 +M&'6W6;&.(JL/2I0CG-@6'C4E4_J9;7O[/:^8&0JRY2LSBDMY2KP%*'><2KKF +M[]F0RE8Q:6TV9TE.7+9J5,<[CU`V_7-&):9D&LMVIRU;#[47H^(M^K@I\0'3 +MHJQ_,>JAN!>I9CI8AK7X&T"_H*^?V](?J65+/[>E/U++E@7UC]9QI8]:]BAJ +M+T992LG!2_(SZ8R:/K:%JY+6\M%LV%ZGJV5`7T5HLQZC?\$ZIJ$:M`A&+R+0 +M3XWMNL\Q:MDO4/#4LI^J`!]9I7*M8_"[\82SE4^Y6U +MK.5AEL.4?F'UU2.=<57^1>/\!.KXE9AG/7JL$N6(Z)1[FXS4HE:IM/1[;.\2 +M5ZDR"K/*OZ2GKGD*W\>?MW1[[/5:W->G?\DH&P=&&:X+VH#W^MN>X-7`'*/B +MY8"]9]?@;^#G?D?`*+7^B4DC$D%K*S!JHFC.$C5T3[\.GV@I25IH1;/[EN,- +M%+W(M^Q9*F^94=C/'Y)M_*JA9IRFF;BZ+B`=51F'\A$SODB-0:[=Y.'@I?3K=]?]C-"M^N[HXK-\:(OZAYZVB^RF4 +MSENH-+G_Q^H`IPVNT4,FY@#3PJV'LN$I3_`YB0&C=+$>.UI_P=.L2:+>$+K$ +M10N"HCCJ]P3/Q#[`7`GR_@TI3891'4J0#Y4&472?6!WA&-:O^/Y8#U.-]",*C +MUH!%C("0NL*R(_MLEF,]SGV"1X:LAPJZJW9S;ZYBY2.O0:]KS5BORS7H4T@^ +M:KN`42Y;2B;.]N7/LG;%IRJ3V8`]_05&X;OPTEB$(T/9D;]D]+D#:_CDG0[W?OA;/C;NL\)GT?!J"-%+P5%E7\]$2^T)T.HY)?Z<2I3A5'N:$^( +M.>8HG!Q^J>[;P;WI>^#_;VVU? +MK[\]XV%W3/JE"!4TY++OEGKZ94;=_(=Z.OP;%`1:,+Y#%4D+JX"(O3>T@BQR +MF:UT^-S&H@_/I2JC1E#*8>RQ0H3*?"?F#[&G=\F*V:TJ_(/V1V@3(G[Y%>VF/VW>K?"A6:^.3TYJY8;+Y!<8VW:^G;TI^UC^_K"WYKVPMM/]A-(VU1/<;3FTU/W@NOSC[(]# +M8@T[239U^T_;_1V_%0[0S7/%T?P7?"GA2W&2G#M3CG+<`;HR?KIO-ON0F'=_ +M[<5LA5%I_+7][UGUKL-9&_?9>@KCBZJDA33@I6\BOGKP3_M;K0=WZ"CZ?I%\ +M^,Z4=J?D&F^)W/VV7$!0^=,6)MS'SY(U'QI._M;%1A5_CY1 +M2&I\F]O6+MUOM4?T^#HY<<2["&W/XTI\=\OWB[TMJ\&H9_B?D@O25R]B)\)U +M^0JCPJ.>9TZ[JR%6O8V>7+W?>QW-RCB-2?_GR +MZB,UF64CY),_->FAKFBO!XQ$CN1]FE<*!&'WMY8997>YVBCHG-:PG-J.+RH/ +MV)&V[S-)[L\S2+XE$S)[9]%51KGFF_";#K?[QW8+@C([=QVS8XGW +M[$[[L^RE0WL)RNX7=L766P8YCO,2X9/A]NJRH-KHNZM2'$U(S7^!=_%B_Z[[ +M`NFLWYZ=J?PNXDR4:Q)IANF-;"-;>?3L,9GJ[^SH>.@6*5L4O\A0^=V(7_A[ +MB_KY[5;*K,COQ6^TA'F6^WW47J8^X#&-,W`!HR;=8U"J-'M"8;\5HXI'J_3Y>.+LYU40^`>&HF@P5989Q=12Q.D>Z1"S/>UM +M4K^2&7D5R9&D$K$`]N-39K93]E&L8'JK&A11"UDAZ@NR%Q_>6*POB:SU]!^` +MBO9R$!^$+W)XV=^R\%%4X8V\/I#[@]4+;7T&_S+>1S?XPT0RK3$*0X%1GQZ^ +MI^5JS&99"W%08>5&3CJG>^D/9G2$./$U?.4366L!?!8S6UT2-:_\AY?C.9BE +MK/RA44M#.;93"=2/'\]2^J1Q+_2KC/K(\+Z6<'@/O]D!7H/SG_6^F5?A-\ET +M_2`7`V=L'C(E[VKFN$I<M#3/&HXB]GXP, +M2)%\?##2?:TT-GX.B!2":.0)NDJ,2J;DS?O-MZQ+V-_PCY9R#6*53';5([8Y +M1QPA1(JN9KHJ)D?%$3R::7Q/.30^TG>54?&H^$*?YHSP5N$(^B&@F-J4S"QS +M_!;6!\T7@RF=>TC*E0[8(P\S([SJ`"]TK"/"DV1%/F!4^#JB34N%SXU=Y<>H +M+3S4.&K'>&Q0G2_>NE67&/59^O5INJ[&$[K"*X@>.!J-SZU3EG(-K?;#5%%_ +MA"YPMB:T"&(&;'NLEA:='F=&JBKNDE4X,N;UPV+# +M0":J,2,UBF70=>_9N8?'\)QK!&GY`X_WG4H'@H)^]/'9F;C]R7+C>.$JA8>C +M'@IE?7`,)SCF;^)//@9E9;\.$=WKWK.MCW^94?#TWT47^&N9[C=@["CES\?^ +M^3#E5QAUHQOR&Z1U`Z'P]GH^IT'Y2*$JI=>JLTQ\(KSWSUF;)GC8.RG']#6K +MM?XC4$?3KW:ZUM/3M]%U+EUOI;^Y+]%>?Q3Z2OE+NWSNPS3Z\'"M9R,AM].5 +MIRL0%'1!&KGAV4X&W*YJI(RS$_D:5A@5\8>HI\V,(DK@Y;TJ +MH[QAG_TN(1-=>MIJ_\:9)_2W?@2H-OM4/!E8\[/IP3LT]XC1AB;=OP(Z#@1E +M=J-PF910R-H^`4:U$S6ES9@WLV1F4 +M4SH6B;'`J$=J*M]*^1^#LV_,]^WT][1DC]<\N%J7)$?4B9ZBGECQ01V3H9SP +M?`;IBN48*C2HT*!"O9'21GH5027^EHTTT*\])S;1!<]E[>Q;=9^EB2/-@.M' +M&16W9[=?'T3T@>A"9.7E&+7@9VZD':L6F0\X@!FE5I%$IH:93QZ.^FK +MC$K3+_"(*>`1SR,&U=BT*X]&NHG-R0M]!4]52#"W')I=11&0]*&8,CIL7]0.4L"*K5'=>B@WBQ +M5F;_2X]9GF.C](G?_-C];N7')N,3<>_Q"J.B4VUP/A9XQ!*5?BQZO(F0H;_,HE_Q]28%1_(VQ^7;1VQF' +MY+QR=6`Z1WTK,>HBRO%]O"N"6_0VZA*J.DG4SREE6,4>\K^\.ELU/ZSS(E87TGP_N3@<:MM +M3S3RHW@PC,+(YW/GO_.T<)!_CCW/N_1XHY:&+_@\M_+3$;(L:4TX2[;92,%> +MK\(HQ*KC5B`;"U:3BWAWA!*=Q?&JC]\=7D?#&.85G#]+#SEU>TI) +MO+.Z5NIX.8/"#@M9+=WW4,PR-WNP@C_7=2;C\T`#*!7Y(=/S>6ZF\&=#]R2) +M_;R5PNY?QWJ-EP1EO&Q#F1_2UF9V$,V!#IGG%48E +MS5O$%W3ICGB#B5`BM$#:5"5'Q%$ +MB/?R,8*NFKFZZA-6!W#=^BQG/4?I*;W?M&HDU15.3N"^6,U]X-(]QZC$D.^A +ME^"OS7V8)"L3>LH3,S.0\H%)*^6-;A:^);-)JR/YC]FRPG[+<\:=C@8>].D# +M/#Y+C+*6ZF2^2&5):YP7/''S>=(:CW_?597]\58%C\=\`HI,RVK4YWPCKA-"]]G*T+2.4"HVSJG";I]29GWL6, +M=$N,8OEERF-S4Q^4M)!"^4DC'[F4DY6OPJCP0BGE9&U??=*V?:/O9+3NKO:W +MZ*>`:B<-SX/V2G=HD3/HWH8R;IN2.1_RD5'SAYJ]=]+3Y6&SA[.1M=%"(4DQ +MUQ,\)71/-(6VX/4E9XR?(+?S$!9;A,_N4$SJX39T_)38@50ZJ..CW.@VTQ$J<%VE9XZU,N^ +MUA5&.2:.TJU1Q-!'954=8WT+T1>CMK>*%[QR=_GNT$J6HCQ+C(%,7^B_`&5G +MMM)&?[#T@2^=I._E&(54KWA!UMGC:(L*_B)Z83=L8RX]3LR%)_`@1H=9SRK\ +MQ8-!O9RN5V+4YH$]Q$5L[=L?JR)ZYJO)72X6@;Q<6&'3JKCV](\9K_ZKCR!YB%$XH= +MJ1.4WDO%,_6A;4N\3G`[DA#Z:49M>#P;29@GH0FE/-_40)&>DGM:6M5$@;!S +M?$9JV3F_0-(BNF\R.:;H_M)EDN-ZRK$9Y_,QBAB\C,//I3>>2V]:Z$UK[%F) +M46]#*9O,""$$YOJ/1?LI82P?VJ3TMOGY?_$>KCB=[%,3O<8K0^JO_&MD),OX0_AT<< +M#S5(N6=IC^XY1C737U-QRAK=VS#2Z#X%Y:)[*]T#1B7HKY1W%J\:L68$73_Q +M:%\+;'BZ%QC%4>R4H$1/$M159FVAQ"C6#&CDC4D/VI'YLLPH_I[T)BKUJ8UZ +M"7AWA5$3<7">!<0ZY*7[^ZJ,PFP%^#I\\,"Y+<^6"`RUK/X[4.,Y.$F;$?I- +M?!LTE_N[U4TX?O&(X>B@1NM72^B`49:_(P<^'?VEOV3;.+HW3A=P_`*CV@9D +M9+F>[/9C*PP>T%.%FDJ2(_4"J`:1&R:BV3*C+.5.1K.5OT>R@]Z`9ALI$"6I +M2H[PJ7YVK"]'G)+T/X0*[3J<3Y)8[`;X-#GFU)P\%OYAN>\,^G8&WA3'KMZQ_B6H(UC16&LJ"XK7 +MC<_+ETFW=-Y@Y&,W]I8M8;_I"J.P2Z`#7-57D5<= +M=#[[4A/92U=%@^E6WMT*/"MO8UOY'-O:[VBCYSE&[28MM(V>R+J:E"]P>CNB +MW]5XCLX!\=`8BYR;+S!JEUG31MR/J6:=^S=V]5,1OZ]:V5&)GF+FFY*A+_CH +MU&N2F7+5]C9JH*BD\;(YE&,XT+RQ(B@J>7SVM=&^K0IJDE4MS((ZV&?Y#%"( +M+#UE#DZ/A51Y1%9JU*ED:Z6\!-USSX@%1GHX_87O''-/#9@XGN_X4S9@E(,Y +MH':'9RQX+0>Q@_F\2HSC: +M^Q1YDAKB==H`>_+:B6Y;:(R6&<7?;J>TME-:(WMD?2AYJL87*?=476%4\]9N +MKYG^=6N3F<`]["3HU_`/_J9R-XFR\2^18GA/\%SMC0Z]+/,5[^6R%AM +M(RS)B<=V9*`_][HW<;,'(*C,*N,+;@L'LP[9WC +M#F1B>T_3JF10)AZO.3&A;6!/+Y^3B#G]ZS/Y,J-2V(NQ^D\L[>"-LI#/#A`] +M,S70XU>DCK]]-&O?B,[JWN=T68?_N#- +MA_;W3?DG\;5_"DUX:-59[J5/]DW!N8/80?@>>F%JDONG'1VV/ER3=XRM22`H +MJD]/LL?S[3GJ?4IVG[U?3DLO,&IP7;U>4OH\GQN,.IGST;OCE1[-1O!-'J8*DU6`CO`;1.2--U_=*@G*--'#':K7H_67) +M9J]\P%C2K!4CC6F#JW5\50HCIB(H6/,O'01]JOY:'.&S[$Y +MX;%L^07+Y1[_J;$1PC3OHG[ZI]B3*?11852[T?#:S&PS$-I&^T8\/DGK(DE= +MS7LL.R9==U\O)*D^&&E\.ZF]9IFU').>2OG^K&2WESL822O2/KOX_/3]?>U\ +M,H',1L"6#!C5!FGUGL?$*P5:R^B-O0GBQE.>$ZE<8%2TCFE+CIEAZSN']CIH +MVFO2R&6\'^9@O.US$_O@!Q5&'2`='I%+U-G-D1:Z`'HJ(I!@O8-1I9O1^8BL +MEB?=J9EUP38E/`AQ//6+IESB5Q4Z@?A$U?K/IUI@]S>X0HY1'>&]+?`N4H>( +MUD-)@WO-O9VD +MC0!''+3$*(Z=T."'H;HD>O5(\4Q=9M3A+YRI#YA:H[X=7$]XQ6-_ +MSRCUOI:V@>:5ZO_V95%Z1'`H"(KHD[7T:Q$=P=/JU_NRZJ+8W1E*4J_)&U?IZO?/(B1 +M+W1E*2HGJ.]/3%>6H@)&,1W\;!K35?C,M(BN+$45)"V3$W)HB]&5I:B2H(BN +M4'-G#JSPL52TE&I3%A31TF)#2W$JLC6I,"I.2Z.@R`9*JDKI+3W=*/3$:U?3 +MZI2C1R:C',]0#MUUCE%M,5H*/_]HMHVH*&>H:#%14<"H\+_V91<;6FJDHO#J +M?=D"H]2[=%0>A^AJN:7L0S-8XI1&K$5Q)!HK2UI$:6=,0&/6LJ@P*GXRY]+% +M[7K9B>UZ>:Y=^R>W\]IAE5%H8T\9"_ACHADO_G9=#]"'@2I^1*6ME8\O$,LB +M27Q?*[+,5._*'*.\Y&ED+SKPWNFT*_1N;"]2P*C!]T(L+\J#SR?Y-+3-^0*B +M)6QQ-/97%@Z+16'TR1:.!NG;G#G'S4Y0.BR:N_$22';GQZ15E+.]R@:%&!@W +M]GH2&UYF0IZ7O?-`5PSJKA:VHS[S..^F0VU<,Q>C=*:S*N5R3&Q_W@=&Y1JE +M=+`*^MT7\-6[]*AH[F3-O95^7/ITG_,6^"D\U:*N[7G7\Z.[5RIU7VM.4+D+ +M-W2,MO@Z;-'(+3'077)&PPTVUV#42CZLRHQ<=J:<$DE2]/A=VW3FFFT2'Y-1 +M&%UM88O7`8M0Y3H4J;3181(^)M(6N$VW<$ZR;98Z:EU,^'[D&MU-&[#H&R6)N(M +MJVM,7PDY\:U&XWKTJV?J@]\@N;OXA+RZ[:_GP';/,8IG&?#4Q!2+RQ"<^AD( +MZOJ-^?"U]=&/'%]O1INZ=D:F(*@3ZCQA(FY0,FF1;7W]U\Z)3B&]9F\OVK^V +MV5N)&I5KMHZ\HY':O6/TOE[N9>R3-CZGE9H=:4D3,X_N6AO_*M0&?U"OVJS# +M]GW91AHK,\KN4XCSF<%M9G\4_%<9-5F\(7NV:I512]4O6Y>IO[Z4;#-[B'*"VB3G9+]F2WT/T6O-;^PH"!C%7B0_/)#% +M%=\):G,N,&JRO5%V?JYD7/!!^STO%$:^?8@.56$4RI)31=Z7"(VTAEK$I:__:/+'.Y +M/SV2C>);VE)@3Y^0Y,[W\#P0/,6N@;V`E1_*J4W)+N\D7"8W +MEJ(-N6'EI2PY'I)9E`6PTZY*2/R;VZ;+&3%4WXJD==7\O'HJE0D7U\LE4O21 +M?O18E5$7.S>UV"<7.T:G,[T.VU0G'=:L3`L>A[32GF?G^F:S%V(^E[2]S6NT +MUCNU0UK`IATD93S&<]BGN+Y'U>M;8)2M-7;IH;Y82XG7MR2HJZ=GQI5^1+'' +M).I?%M0O4AF\!55?G&C6'5;'I%&"ORN"FAKKOV>@)4CI;<]5HSI"/H;?BO5? +MK`2Z2<9V+">GGI-%YIJD[7LX(I[[`$XSG3MNY2!@5*?QV0:G6U8<[ZE48!1S +MRDME_YXB&8E^X%WQ7TN(?R&CU/\EQD9=@I==W!YBU$3V4#SZ6X51T%7UX)6R +M9W3KH_W*7M+8R]6SFR%RYE(S:\S@67[C^D6R'6E2/RO7OCV1/0'R`E-"7X1Q[IF?" +MN>"XBWB=`G$1DZ-WA05&9<*O>FK'2G]IN,U3\P8WJJ['+O&8OB0R5TG2ZB)> +MNN-'OO(2.C':&RY&#,.A4%8KYSBZ+*BTJSLD%[_#;:$ZM>@0T4NPCPOQR1DE +M40ZWK8QJ<2IQ=.:\BU@J5QDET0WW49?]U%/MI_JV!;BX'_-P +M;IL>O*3-(XT#Y6S_DZ^VHYQAF&-44N%,]R]1Z8M46E]^I'LI/.%C(I+,VL;QW`)/-!CT5WZCNN8NH9@=0C'IPJ'7#U0$5CE=2+_J#>&[HUDCR +M==*/3^SK.X&4O1V.:#+XS?N16ZV^RM]A#4W-#4ZGMW/@(?&Z?:Q!!HQR!YIY +M'Z""]Z#9#XA[:F!/$:4I,`IEZD29G/W1Z1*V9;'F76JU.B;OK<4L)7WK3U$2 +M%\%H]&5&\5.RQZ")JIAOGSN,DKELERK%CML/GG#7FQNMIC+)GQ*'/./J" +MV125%BS*$B. +M@VGB+W?U']PR58;+4[Z8[ +MSE(O,VIXV(NB&1S:,M7#N>I[-GL^HE>GX8\I.;+]>GD^7%;+OF/(X[6Y=X1K +M99V(Z+[*J+.&GR0NGCR[1`A5_).L@PTDX=LY,S&0#'6;C`[/+V']C!"#V/V! +M%3B](*]>I3*D$?DY0;6S3ZBV: +M66@3RI%T4#>N+^4,+YQ:;:&O=NR:69(<32Z/4BXO&1]BU/-19RVW2)E1MEUX +M1S!:9'8MBUEKUJNIOA5&Z='S-B!7Y&AS`2^[E'(GO3RH2H[:GW4N:F!R?IQR +MLJW[9_JMIP+U3OKF"6=8JQO?>XZMK\Q9;-ZP?M3SR9*.XKDS:BF-"$@7E0R)-C809]O%L6M_ +MLF6EATBR54:=Y9$AU][;J8;N"ABU54[$=@=Z0S6TTM?,2E\U578LX5P%F^:V +MY$HO'.C-\_E6C&*/FPE.*;;[=P-&C<@N7AV^M<;[;.T)FY\=7>$C,FU!IK(O +MM5'_5^37\[2"Y1%S\\N^[JI2N[$R)_5G9GVU/=)]S7[FI@'A]^SIDMQ%VOQC +M?15&<4309#^U0'?>1"-"'"D?=NTVXJ!5R?&0G`($CY9M3#$8(?",#T,WU>_I +M:<+)7;\-<6I22MN1$J5)>>0$95+?0597K>8BMGAG`O&IJ4R#U5I/,,U**Z05 +M)OXV8=RT@J#B;6UVQ$E]]W!]2XR26N_S[-PO1\29A;,@Q((M2UK)^9X:5/U. +M,B$EAG>J\WA?"UKHTL?[*HQJ(S[?3G^U0+KH9%[=+[;[0>/=6)6T;&0=]@N< +M)U%R2G[DU:.UE:+:[.&FKMZ(%0/F\$ +MDK@,_#M7].`=Y^OI;($5O8BNL!\#?K5\Y@_\FE[_;#8WW;:JR4W;?2-+MW@\ +M8[FTN%8'C`HOJY#D+T\568$]&G_?/RVE14;E.(3%48M3R\`)/\]EN +MH9Y!=\18[J`[HBG/'^KQRHQZ+>F")](W/?!0,G$0H5'VT/,V=7-+14H/SXB= +MON^1S=^2+$:>FS;GJFT);RFEWDJH*3'48GK6-N#X>@90F%UN,V>ROW@XX@35X(90H48J2&-YQ[^'G-R^)+_IJ\* +MC++?+J3O\,8=%6WM(*\9_J*E-$-&6K-$0$&LVK8?![*'I51I^#L3ZPM8(YU_Z-9NX;%?[_K +MD:SNL/H]M+UQ'O9F/UV.47=9K[QX^8#JII>/'/;DPK`XZ2PMD( +MTO/-F%]E5/%W9J<`..6OB:-3W6[%[[_7>KZ.^55&.2_8\2?T9"D)J]=7DF0M +M,.I(\_!5Z/UE*?W!)H[,@UY*DE7254Q%)_&%;61O,ZH=\U-] +M3V6[OB@1<=9CCTU1X5P#G=RFO"JCJL4K=5N1?#[\D?_]SUE=7.CI +M8XP492G.7D!H+]*TGZY-]<,MCV<1I2LGJ)Z1;(BX#":*[5IZBOBU@V]0:AM= +M`:-VT*_/-UQB8TEM"HRB,FGK[XWYA&5U#VA]L':F7V+4`8O8@U4W-?8$#(Q' +M*9=).4WU',%I(469XUY0?(^7A#^FH(AW838W0T\QU\Y_MW"D=3XCKLJHV@HE +MUC3:R+RA)R6T/>[Z6):U"=#3DB@2[>*B[`G$N;I\GN&Q,FK-&;JF?*IH]LT5 +MY42Y@%%)^@OMX^%.=;6>XS@#92NU=H%1X6]Q-H^DXYETXE^4)$?S'[WV[ +M,V:&5W>:<@47JZGZ$KKX!%_Z>Q/]#LW?N<[&T=&X_G5)>$]+(&GMFDMR0JV= +M["H(BGXEL1LBW#6W5JMMOC@47:D(NX]T@A*CBK.9K#UU>%_?6:O>NFIPIN(3 +M>"\>2NE-]$59TKI,O)UTLID]6[5+]W"U%PXI1E48A?-6.B@MQ`CJ(,1R>@.] +M";ZG.!FKRJC28(HZ<@G/M&7\98I"(H^/M(*5VGF."N`>B4Y +M:&@7.^OH*C.JPYS",5E/5<:5*UX>\#+T1550E,.%RHPT&G5=H>]U[52ZDZR* +M+JJSG@54)TX2HA\7SIJJ.W>F=!==!=/*!6KEW"Q;1TO1$UETP2Q;Q\9YX_B\ +M3L&D%3M3:6OO!N7]J#]>W]*LR=H^7M\RHU!K=S3#=HR'B$3I[CQZ6B6>9!VE +M8M-*1Z?WX'P_!;K:+;YX.!^&4?Q]LH7XBZ3'LX+I[H(WV*QQ#JV>+9QI?Q]B +MN;4IS%2OR+>M5NIB:L.A72F]X_J4SC%J^(:4ON1:]*S$9\":WR:T-%E?(=T# +M1N$MGFS:J1@9TAU]H7NKZ)[B5'QD;'^FA2/ +MCMK'18,'W9>E]&Z"SW`)^]Q,B48&\IA9T:?-+D76-H(NCZ5VBBT!71Q$"/H8D,[V=6 +M.]-Y1-)6QZET2=+:F=Z()SJ\F7RCX#,]=][37V84N-H.M8:T%YE- +M&<)N.-?2V*-]%4%!LXO3&%D$0F,KN!1502'$-Y5GF--P--)U3+I(3Q\'%.

H;#V?5FX1;*NS8,+G:_3&EXX0S;6SUPN'6<1S8]%+Y +MN"/UD.VEBJ`,O^)3=@Z9B,Z4:QMRI;:OQG(DQ,WA^]@6/0Y]<0'9:\:?:4[4 +M7IEZCS3V16Z.\,)ZCVS"GDJL^L]0:>Z+C*.#.=*JW9$?$W*.]\4FDD\%22NQ +MWT2@O_%L7FF>O5\\XW!:&GU18A3P+.7HSO*-Z*NVN9M&L/1KF5'H5>X9G&+& +ML_UK-E`O;=A$SS`V*Y)6%^4O_;=!77MO?ZWVWI7JT%.\^JQW>KHZ)^+1"^Z3 +MF%ADEZ*><=K0:C65-4>>OU)RBEAEKM4QU?_*>K1# +M=]`9RMB&MO]&K:9,QD?*,O[EC:>[\XHZ'#A'U0FO,G-A!\G +M9CR-?G^XE@T/CF;5H=%LP*@CG[0ZU2LP"OKR,]5JU?K4T,^J`G\]Y:%L^&PM +M6Q)4[$T2M?_0'-X[Q\B^A[+E<3GB[?GT=F.,5U?2<4UT(LT1O59-O]S8QJ6[ +M.<^88W-VJ.T!D#1F&4M1G-L:U!<\28*G2+M!+-41O- +M,64TQZDTUJ$SEKH;Y:.5=N&KG6CO85G*M>CA237'\%PW4^F.](E)-$=Z) +MVFN,I@:=<5Y`42^KW\^SY6K4&M$/T!?/I58J +M"N%5T. +MFAO6]`OS;4LTZF]M,0KMU_=MN +M9I4%<:G0.&+5BPY[4%49M9Z^P_>E:R7"@?JY.:V-J#S\P4-9_0K1D.%J4#^U +M+V[YH&5SC#I2%#1PT>`5<8K6X=26CO`7+1B]2Z']TSA:MY7T^U=8W<0#30W3 +MZ-H.NG`#S&MC7,\=.#5?8M0R^F;N:"*/T[DZ2V2GT05.`.^SY;`?&>73$]`4 +MI,-7SE`J3V_.AR6!L4U7A5%,XW0Q18,2A^:&9Q`R0[\7XSPP1N4&97;,?Z.2 +MG8F7/90=,QX7_DOC<:$=CTAKU3EKUX'/=,3LTL\1APD8]3D:/U<3G_D^KZ3>GT<5\?\!*,XL@5Z^?.FEUMPV@?5`-$^J!;E +M(Y;>7I6%C11M]9%,C,M5%T[&R=L@F3%K0WVL>YA/T'>:KBZZTKBH_Q9@/%*/ +M/;;75;D>H4)?.P.ASSX8.`4>_A@F0@6BFP:"2F)W/4Z_\#OM6^# +M?J%'M-I^7QTFJ\91:@LBM"!6UWVN>)-0N4HF1Z63`\H'.GWHT;XF2J>#RL>M +M3%=94$>(4@%^41$4<^_Q5EPD'WM>3CXN(ZZI,XPBCC$5ECAFDC"#RM[9*Z0& +M;K?*&=1^UI_3ZDSO#/!]M[N`UEW+OYMUP*BU.[$W;0GOD'3;X95ZIH><$-T) +MD=8+DM:6)_K:X;N*=?983MKT>"DC^L34*')F^,:Q(X/MH1#E"S\3Y +M5E*ND:(O?>?J+I-6[;+-!97JSF/TZ>,EK3,]E>K-(XM.T5 +M/#I=G,$-_]`1/Z]J2N:I,1X9Y8V208EO8VAZYH=3Y(N"I(4/S7=Z@B]*C.*= +M6"F3$SXQ7W2:+\KCRM6)G(B*X*6R`/4C2J\("A9K$^A]B99^*G+(?%)QZLP"G';BL>)]WK1 +MT-0J6!?046:1/G%"I!?.Q#%`D@;'=4/L#E?:3"\&BK\AC1/W93Q[T1NUN_*( +M?RV.:]L+2!:FNQR]X!JE%Q`EIO$U<:I`4/`&[J*1T=6L%]!EJ5H-I3>"H@N+ +M10[)N>30L'07C9O45$T]Q+V/'-6O@B;WNT+T6U7Z9DW1VU*"^6 +MT?%^RH'C/&T$/T5Z8G^CM\_T*E(NY]%QO>V`EQD^5EUL>WLR*P<6L%["\I'2 +M6$&FJEBI3>J;<5 +M]/NCL"Z'\SS-WO"JE%ZQ_]*D?%J?>*0ZPN<-IZW':4>WRG@FO3RCGJF?LU!@U$167-P^+9WXK]BBY:CTDVE7J[`^=&(TTK#' +M<_OUP2K2D)?1FW2XE>CVB3Z'VJW*J`5D/2R`W*`W:0_G1O@<+8%'6HKD=];J +M$X.8Y<2)[<,.2QD[`WL&I9L3E-$?1%N@7CE-M`5WH)O3#!@E6E2:-8/P#3'Z +M7T.-M)KT"49).?I%%FUW9-123E86E1C%^J`I"VA"#77G48(NE`#\/FMEK=W3 +M9_D^>#TB"4+Z5`1EY5=B+!*R".BJH*;*-Y.A=<[*(<[!FQB=8U1@Q]!7[N5T +M3*15R8E4D+32IJVM[+>M4644R_ZVL:T0[PM]DD6QS&^>&)D[*=Y>+.43,:1) +M*XC20HLV4O+:$)$*SO0*C$(LIBV\MBIM=0;'$!'Z97WU),OEN,U-!+KPN[6> +M\/@'LW9LET^:;&S'Y6_%I'5K"Y_],,D8KYYT),ZTW,P*ZI-Y'J`-*Y,+O4XS +M$\)CW1%_'3S+,0IG;:3#]\C.36K99336UR*=A)QW$3!*1N=YTDY#82\).0VI +MQ[H.M66!46@GCE1FM)=QY_,QZN7.,BHSBBQOW@TQV#(QGZZ<_*]08?7D<10- +MR[6MEE6Q=/4K7\YB1;HY044SL/>T6+N8N0K2=9N7!:^7&03[Q)KU +M*TVT6F!4!XT_S))J1#`C1`?6W#%?BS&Z,Z5+@L*L*9["QW>"U?6RH(X@9]$R +ME:4O1Q/<7HR*MT\GQA)9^L^B^.!<B`49SRD.QI[AQ,C:MGX563\1S8M)VH)^GZ)48M +MG@5?A*EZ*5VK9LE\R=,/NCQ[QN<_,DK-LK,8:3[G![,8%KF,=+H*HWSXSQ!J +MN9EW8>T,)Y+#?PCQ.ABUXTQ%S7=JZ7GT*Y]CV +MI[SZ\^'L.BK3>OA0Q/H0]DR.48UQ8,?,L7YB7U_`**3*D1$GB6!:D!R3O0'O +MA9EL/)YRI/'(U$T46F;4R&53M5TI':F=Z7<.B7>8C`&E*Z=(>R'^2]KWB3LM +MAS3>(OL",`[PK!J5:U5R+50X4*/ZPFMD=)MQSP1HE\.FOE@R1%2 +M.'RBI8TX)L?0Q5NS>G"PML0O,ZJ3QW5*0D-0.7@$H[Z'A+]6)"VL@0XV3VJ= +M5,>UQ-BQN=I#CGH9HZBM!^%E;$MO^!9S+*I%;IG5,;G/W&[?]A#X%DD]YE@! +MHY89!)]4"!T'?`MK.JJ7VH_XUS*Q86C$$H)7?`;K?(LY%M;3I%S,W2;N:=:_ +MEAVICB/&`[#"J,&?UWI6&=GO\OG@8KM8JZ7*J(EM%[)2;AW-JEO)2GF-6$U4 +MIEMDU%]L3QB.S5KF!-6P_^7).PBY)16=X1$(BM*XSL2OJ)_]-!>[XE1X[&/9 +MPFLB.ZVX6EL/X^6QLY)1@I)%>4?<#\.H<7,=F,$S<14[BKY7811.I.THDCI] +MJ3F)ADJ`O]4''-[G4664_8:UHJ$TXL#YN,O,S^:\?BU05_\?-&V295M)7U*R +M<"_Y9NI<8=0S._XZB9M1; +MP-:F+.5JJ!-JTS7:ZRN7H,,IKR(HMTAUVZI;<0H&RHA3,.C^3OBH4]VKC,J@ +ME/3$0_GHCI/(SZ6[5A*C7/\;2[XCZ$LX%SSW;S*&)EC+)"G%)T63A`D8Q1%& +MDL+MA+-1/W0YO.Z!*$H%1B41H>]0K2=I9@$7GY*8JVF) +MP@V/Y2OGD'#MQ!>IL/QOIKT"M[&)Z'EF +MDFC]FS,R7'+S=;5>>EZ?:_;6N+YNPA='26X\A[AI-1?SU+J1;I<^EUB5"O] +M.HHNO%5J_,EFY>56-VD\_5V\-20>8D7*%=\Q^[UGQ^T%JPIJ(DO"G`.]`_&V +M7B=2U,3K0*21,"%K5]/,_H6%SV9SKS-<3B+&F_-AS[W5'1,E-WB=Y5^E!X4' +MAEM!V7==>IV5R([A-3SS1H@E#]9Y +M8SE*"Y$RKN8W$AF/=TBH-1IGNE08Q;2^=K_L'Z8WO+IXTQ^S-@I-=4Q+6#\8 +M&TFH'<^H8/KU3/=G_RWZ;NP7*_+7?,M5.4:M+4K;T'W<>>P8Q<'K&[4TNS/Q +MFO^E=+\WPF4M".IESF0O,2KBX-A=^2#OJ^2=!!S5_.TJ76:4>H?4+1UK2>CD +M6-55=SZ=K;R^3O=S\]T/RMX5IC/B(MS^J5Y=?7TDAX#7AQ/DP!Z!9<> +MHVJ=Y!"^6:4O,>/\_@1]?]J,3&Z%M.KXE>;5+#/D2_",Y.9BJ3UN@E*WZUXC]\Z>E:5M(SU9N=HG<1@-/\QC(V+01'X!143LIQT09B[77$FHO +M7[3'>CN'L\>W7550GHIB`7!+4+V8B@IRSIONY4*'XIG$'I?SDQFA$4.[*5_G +M&,4Q5NBI;[@32KS\0=F=RO*144\B9H7J]]J'>ST]W._Q_NV__5ZB]Y0>SQ9Z +MXVV_V(R.\+O48\UURBXQZG*28VID>B9,UG?AW-(K$N)6D@%E1OV"?CU'US+B +M2ZA)(Z^H,&JBU8LZ?71[U=[(AFFJTT!]943*I5<"M4YZB-N,8W<6&A"5J@*C"K.)=0S@WHJJ`FR"6>OCZUL5PV%TX?$=OHB]RI5MOF?>J\MWFASW7#F6QFC`>" +M(NTG_.X#67L*KWJ0Y"U>X/FW'L@6IE&,OS3Z,)4;5:I0PG[PK3_EO\`CL +M424+OUQ'.4(#L."4.3^3Y#G.:?4J4J[6#;Y*(1IAZ"7#O*>&^_UD"O-$10_( +MJD&Y`;[!SD^'TW0XVJ&D%WIZE8Q'X@=-A*!QZ,+C@W^?EV\G?07IYU:)3$O+ +MRI\])81_K\BW@W81;XA1/"=^:5T/P%CB?C#/"S'4HZ9,4D^)J#V-M882HPXB +M=J@SUC:+SXZ45UDI&IV2,_P`QUH)#]:8D@[6IOH51D$3#I>)GP\T`S4\/7,0 +MYQKI=*<>\(>K@L*3.7F_2P)J7QZ>TKY^@U<+9WOE)UKM9H>2`\W#3@A +M\4%!)Y6?8Y2<54_CID3,P'S/_&)4#?/Y5I(6UL8_^L"X^$Q1_$)&+9A`CT#= +MU&,UUNA+C$*]P@^@7F?R3KVF@?[A*0/.L$KE_3:ZER7'E._/1OW(DCC:W#M& +MI>1\GO0;K%8[(0\C9JL&]^6KDE;R2WF.'G#5_'QX%]I\3UY=^B>>;^<:K1;Z +M"HR*1D5J0R"CPJ"V/=:'0%REU3+2ZJ.AT49C^EH]CKX&]_6/ +MU'[1R_P947=^G*G#YQ.,O1B<*QNQ-+C(K39:/% +M@S%99M1$.WG0=L71N1N6CJ[84%EC]9R';A'KP3'1O:P6O^YATK_66!YM8Z;. +M!Y]X/?QAZJ=CZ[5,.?CGA`?8.@WGR%A2K\6*F8GWR"@^"7VF\`>.R@%O@04B +M<6`G!8+B#MC_7I8?\KN?5PM@!9-$+C`*WX:(K*9M>BOR0^CU+\CIH25&M2"' +M64`0Y8PLW,AITEM^WOE`MKS6M@2G=[0IRPCE1!1L.55EK>C1ECN`FL>JR/ +M;JKU(\:)N[-9A4-.IG"ZT'TZCR?17FG2'$N\<[F7]Y:53K?:HZQ!]_AECK,- +MCU"<,7)C;SM1=)E15SQG=RO74?'Z5L:4OM&_ZF;4DW2"*J/::0QN+,J*")_' +M8SQN>`9NJ^/K-XJ$,7'-PC/]PF;,LL&Z&-2M=,?<6HY1;?079MC>1_>/.+UZ +M(]T_2O?SR1:YQ"GJX(U"]_V^/?5XD&IRX>64.^5D\R@PRJ/>W0@)7VZ/-..; +MX_MKI5POL_>T+*C!7?VET=4K^20G:$/79\YA7D&RKF,XU5IY8V0/C6SEF$Q/ +M.2NU2N_M1YQQMB&I)E5)RPU]=WB?EQCU2,79UJOFK"9>>)_OI$[522^A]1FB +M3R3/)CG8KS[Y6-]VCN:QHE^U#B+>8Z#TOLXYG]R3FH`AH&"11,+%*#TA0N016XP80ICL&2:3 +M"7G8(/@`#.$5]-R#]O%Q]*CW2_Q$G@$*D'<($)%$G@T&2#)A^J[?6GM75_?T +M1/[HK[NK?K7VVJOV8ZV]UUYKR+MF:*97V##3\TX'ZCK.P3I]@:W%WL8&=PO5 +M8&_J)&]XPY"79=0RK-S27+86<]D&XOXPFM<.5YQO#&\N/%W>$**H'1.[@1N;S.YQ+NIEY0$M7Q%;OG_HQ%N91&C'(+[//WT&BK'F_KCO^W3'-+%I7#7;QUO)V/8,>@650;7K\/&359WNI]X/X@ +ML>3P&S&RL?J3913?G83XT>9N6W4K#(56:V7M92%=P=I+PUS27^ES$'WRC'+- +M/_N94/._P*B#:JY.HL]]U!IMB47AJS$5M_%D2SZ#9#>,_2'AJU].520YWM;0 +M[ZW%>2)JB25&<0ON%WT5=R#SJ<.5]N:="=0VDBBN;D_UCXE_AURV648E9^$3 +MZLQ:(:.2Y^23^46\JR=Z[6LG>ODS[9P&+W\U=,L"Y0XLH)ES@%3K&0U][@!G +M@&$4(NJJS`4SR+*@SZDSG+Y3<9?C&:LC/C&CR"C]MR=\G'R.H^R^^H1_"$87 +M$U\W$M29;C>OX!WQ"96&;UJ&E!!$R5WVZCPUM3LH,0KC@:L#EE,;5B&.[EFD +MIDQ;JC9DEK8-I#QO-K_M#2DO?0/9:?`3H9(;1G,ZK4\EZXY4&7VLFYTM6@?V +M'7&*^E@W[3B>:T[T\BEY^AW.EC%:8O`JNJJ??&*,W9V?73M&)[,<(+\!WE:! +M42>8R+K(Y%MW?6)V4N.KV$)D+R`7U`VO]*@;=O9$LT6?V-F/N$HLZPWN#/U' +MX@UKF1MV]:CA9J_$J+3K>BY]T`J=T9E:3>D)&O@,RHH8R0A,L?S@_T] +MRFWB2&V\!K/\YER646DUC=Y(3Y!V4UZ*[DJ$NYMSN`[:H="J*2&F34^Z]&1^ +MCI5J0.UA0HELHI^/E6IA3E*J27^5JOUM1B7WSK)*M>A?/5&U6Q;-J>T=M4^H +MXA-^:V*O?+ON\1PB+X%JR)-XMQWZ/V;G6"CB0KU4HM%XM +M^XZEL_Y)7[]1H7$#]/U:?#_A-?K*?!J*UE +MLT^"V;=?P?VWT8K#!._IM?$!2H?V*;KT8^\&T> +MBK3D3>&L$T5&>6:<4O?OJ1N1,QK+_?+-O?]A]N=85T%^/D9)9I8FB<_HF;7, +MAK_YUL_#.XMUIB?MGAQ)<T: +MG$,T0K=QANP-T"Q?-"7*'35,/;Z1[,]&F_6`-!'$]STKMM/@:6%11,/9:RQ/ +MQ(,16B1W!UDBB2;OT//)+K,Z#![G,0JGNY0C/@[(%DFT.'>*/8\\+]E6J_;* +MWRGY=M\[9%2J"^M`38'^P2N\_Z5^9G:38`5@/8=1\Y^7?26.DKL^T[%X>";' +MU6W`SM365_R"E`A['2UNX5]]9?(982VEV>P0%AGEVM-3UDN9+/)&&E\;J09` +M1HR2]8D7>F&1GY"277#Z9OU\@+2DDI2(]U=XC7+?LK+>Y95]G]OF\LXW6 +M87;NIN<^7Z1WR#E=M?BR(#[YV6)O-[EI^J>^.N+;DCTJL8,^^O8/_/!L>=O4 +M(S(YK&F[ +MPZ0'I,%]X#KT'1GN`S=-_]33)8GBB-D*:RB\UO=7OR32*BISBKO3/J>39\YA"PP:B[]TL3Y?$)]F>Z4 +MK^GLH,'?6T"?A?0I2HG+SS7C`^FM;L:]F&AA1VDQ?6._*6)4GOYQ-@&LS;G3 +MW/,9-A+!:&@O*`C^?S* +MO29C&SU]/4DISZC:$NQ=2[L@M&I*J*5=9!1*X/FKEB?DU:%KD=!*5^XD)=R$ +M_6U"E<:4V%2'IO7&W@$MSD=$U[-?JJ5E[Y(]6;!/AE^2OFUYNCFWD?<5 +MG(JO`O&6%UIC2G-P5M&UUPO5M.BND[AKKQ<-7X[;4.E2_1!,K]6;3 +MTDN"HK?0BE-K:9H=!NF3K`7VT^8#U3A.:4!`_MGYX]41B.8F>3J@UI>FK=NO\QX;:.;1/]LU4$J/>!& +M0HMDPFN@WJT=:LV+\U:_6^[JUN8L!?0O1C7TI0K*V]*1)CUI%!D*L/+9BE53 +MW:$F_&6>]Q6@)B"V+R$:8)U[-.^G=G#T=S6L@L9TQLTRJKDOE4OI3NSWYHY! +M/F.>S`?"8X9[O&-H5`F_8F<8ZSNV_*?5'G7@+\^HM,EM>2S1T0DZQ]*'\^E\ +MI:X-0^/.,(\[?W"QBUID%(WRF3:U$4:L>X*[P'6&9^`T>N@,#GCX'PE?:V;WJ>:>FY(A1KGF>\P90OT:T +M9#>!+`F*\/J2?;[-#)REMUS&OOO1;_"^GY>3.NX4_0@>SU-5H+<\'VNAB"&1 +M%10\_C>+%U:1QL#49\W>YM_+7>65$]TP9^4U\+;D?TS*7*2M.O*,"FP<<"HU +M,#(':C/U@3;Z7SY==>A[ +M$7VGZ?M"^BXRJH/*7\:9'>%1O"!`GC-(AJVH:]_PH][X/9KSK_O_HWJ,2O+PRT3I=YO2\^?9EG/,;Q*R2E67 +M6F#4W4EOV\:Q$BXRJA['NBTAK_,^E+P8M27!\;WUY+7P0\F+4:K\_KCRPHP1 +M,JK*ZY#GCA=ZX?&J5NSLR:WH"O)""SX`T!A_];[8L_"PQ[4'7N'_!4;=D?`3 +MELB79'_?1'RY([XF:ZXHM):7>[E5#W:YG*FSP2)/85LT6BACH5GU.8Z>Q8XX +MR>ANXXN)ITJ,BDN92O/VVEV^>EN0]QBD]U5&08+?$`G>EY1=DSR=911S6N/- +MV[]+O!#1@T-!I;'JT,DQ+/1?RUWZFX_[XA>P(A?!'C*TL/IMX@0;[4-Z[\86 +MU*P@J`')Z&7KQ6^:_8:$5E%05HLR;>"7,IJ0_75KQ@/ +M:(O>V%(22?`()-1MZ?*@M'3TZ>[[P5>&A7NGA^;:G_=[PT%"G +M]#RC[AU'`K;TPOD5K6-Z;DN-!&SI14;52F"+*3UM2V>4Y4'F7-NOJ05\EMXG +MH4H5E.&!?>36[O5M#PE3S9YW`5#'K&@..-K[TO=]/;S7GXO5%9Q7NW_$1Y:Z +M[`4BB6F541=C\S_)N;3&OI=68X\Z9!36271_I92SB1;HJPU=.;7X?3\OM.!U +M>^5>?SY*4H@76.Z55B@U*5Q@6_1$HNQLD&SMMC:.>5-%PU=-"W0JF36VTO5( +M4([,@^HG07T2*V;W[_.S +MC%)KQG+M&-\:\!L**IWP^+ +M]S_P]14T?@FM!`UD;G$NES''MN%(4.#I,KIC:*A#6[OUDG*7'85+@JKQ_68M +M](9[>O7H8_[^\KK`^YKTVN3.T739UW%Z27N;&>!Z5E!\=UJ`'2GX_G+VW2&R +M31V';-$N'7[-^B]0/VG!R8G]N45Y0*4Q\B!&DVO4[CU7M#_%^ +MVM?&TT23J[M%H86]3-*]^90,^A#VH__-Z>:L9&3?1HS2@5QAK[30W*6W_3]I +MK#T(YT6%%F:$TQN[=6+7N>W"%%NLWSA'*>]"H);0KV_39]DY*MX#@.8-*;#^ +MQ2B6@LX$DO$B6(2VG)95^7;4-V14O371JOV."^U[9+WMVB.PWM@["VOED]/< +MNI'9NB"TAHW7C2LC$[)#(],$[D!B_M-(A6J]*\GI#NNY7J5^9K*R@)-.DU$TMK,Y=!T]]1C&WZ2V!6G^X\C@W-;5`G('$ +MR4223OXBR[VZNB%(*]0@%:`&6%5I7[9CWLI7RUV%BZ2M)DI#'G9()%%J45`B +ME#/3#D??\,$9M_;FC +M%F/$C=[S><7ZL%F>VC"+5S3R@L*^PG?E>;R_#JN5&NVOP"C=ML-7Y3HF(DUSG*S#J +M0'O;Z,U%H?7DF_Z5H]-_P.>1?B[[F/H7>T3OI5(C05'_Y96+CSU?5^LN79(< +M)QK-_&KIJ?\K]+S%0!6>E;EU/.T]RZCJ3+YDM6Z3<6+7"T(S7&STPE#]]^NL +M3\R&W-+-%>MP]F-^?K%=!U!33HFUH;7/&FWH3&ES!4:]",I3`L_F(^:S^.#> +M$Q^BHM#:MXWK@KZ36FG:*4=NW71FZL;`BQ;;]\BUGZ(XDAW^1S^MK":5&-6? +MDI$R:E:\%E;['KRO`]!-9;=B!_70':1_5=X,9,CY:QGUCV+5A5^W?*U-M.)^ +M-C"%=UI7N?-W7'Q?D\$>5*GR]JHYH,4NK^>)U'D9Q]C)3&LO: +M9#R"EE2^XL5Y44P+/*2:$)MT1%:E?L=/,JI4C:*K^I0$BOH4VIR7!^HC])9Q +M=@@KG1AWEN*MVURJNW;XV;S5W#?6K)@F6V3(J/K>#-0O+WN=_2KR0NM/VWR] +MQ>UF_X3-+N>6AF16T*PS?;0I5Q"^4`KRR]'<9%1>-,8W<;S9HCR +MR9X&'O0OJ44:3X2\V;4O,:JV/:G/U[2>;W`=_\'IX"RC8OUM8$MO6OSO=_'\OR!Z +M3+/;[D*G:PJ0&[H@J!$9,8'@EO-\HMUVDGXOW"=X001,[M_P05T=N!Q/06BE +M).J60U>;L!^-_^BUJZE4^E\25']BO]:>=0/G[<*!=RE0UR3X0)Y3Z)S7\C72 +MWHANEE%#\"< +M`%X(X,=R4KC4UG'EW\6BCWE,241'O*'BI;+R8-Y;"J.:RB77AU!B9%"=8Z*, +ML6XXD,LA4DN)45>+!R)G\E5:$ZT=XHM!B#7[RUW>-V7ND#M<"KPT^'1U2D[7 +MJ4PN^\VXCO#^&+I9*V>&Y)@!TG,Z4J,]02@HK[((I@/G$LD> +M?B+/J+@DGM$S[$,!6Z9M1-;^"H8O/"_U:4--!JMK4104W6WA\TCU:Q%5:"&> +MPN`*3993+MZC*Z0X(V9)^$+DZT+0`0^2"2-C\QM[2[BGF7YGK=3;[4K9\LV] +M6+W.,NH8&_NEP9Q5G+#=]\K4?_:_R_9,**C^F3)>S7[:UX?OB_V0[-R17Y(< +M`6K]P*R/4V&)'7TM+WJ*T"I8._F?]_O%)58W<1+9*ZN\C4Y^VH^DCN:N]3+B +M]O[>\[[^^BL^YM]27.(=<>W-VN/+[U;\F;X%U":#&%>?^-88?0(^CTW[<+:, +MO?1U:,&\[>P337*SK`SF&86]ES36Q?N:0[+`0I,W4'/=]Y%^ +M_RW;HM%*B.:8O'KH2\5OC3_#;.Q-#75VJ#^I[DAH&:\N7KW`'=Z/R;@Z_RB_ +M[=*WK#4WWKMDVIZD[1Q+7N9G1^YA/,?C>WC).WPLEKNQT@8 +M\Q&CCH._5FIC"]L)/Z,257-<(JX5JDL\Y]$Q%CG'EV-4K6Y3FTDYNLQ:.C8O +M]4+DN;1Q[XZ7&:+$J)/7.5#[VZHU)3R=I=/#XJ"@C_UC\FF0EXETKN0*:(!:R=:-)'HV])RO>88ZXE'?YI-`W/EU1+,DM#8@+H!+O?U1?S>?ZKW+W=/_D!O[8RX5'6`% +M<7QS3AT^$ONE#;15I))E5%(V5BKV;>$=A$MEQ,12=C>'Z^7,[+_S/GJ%95'A)%1ED_B63VR^1X +M&"VU;=5!6YTL;75,_!Q!U?3K@T8W]ZMRY*O[CL3*P2+OJXH_=&5;9?\?+:$2!)1_\]XA$SNCP>`?H1Y57E+3WU=H5>B5'C +M^45CYNM06>4M`TH_3Y3UD8B1NHACWFVOEEUV6;TZUM(*A=830BME:3U932M? +MEU:5O)XC>2TS\C)G:HV\GJF1U[(#RNMQR$LMBH162JE83H]%8VSNTK)D^ZKB +M9ZO('1+WKA"M-H-,NXMBONZOII>]8MQYR,A*_5?DAT(+<0;WDZRTXFR=N%,E +MKRNLO'A^QK,<*R63^\@?\41GB),^!4;A/)J-L&"1O$YG4,5Q4>D$*AH7Y290 +MI2K4>'.NM]QJ'99&*D&#G\9Z(:-L#![VR+J#9#ZE&ADNKS.4Z)B[C$RZ7$\,H/ +M4V*^4N+`QEZ<1[-90K"RWM@7\!Y!X4HK+VG[&;19/IWMF)4[1-0H,@KK!OI" +M&L6Q(H_9-]W"O$ +MV+*V&3269EEM_EFE1EE&U=8+/B;H/](F.G/ABKA-J-Z@K9\X5C->E +MI>?E5YC^Z%F[6)".1(@RO:ZP(BFO$^MY9I/55&34KJLFOC+Y74![[4Q"GI1MTY)5G241EH;]L%"=8'[L-^^X-4#=H66GP,R@GV]*C +M6A<$I<[C/5`^3^$X'E8QD+L6^SHN3?]52\2K7)'0 +M@BZ_EKKECU5F[\ICW8J>SYIS4-*B%Z8\_9'G?+5>9?:MG.B65V2"?5>=+N]V +MGGYL[!G$9:'1*C^;X-,B?$=V0/7IS0;9?^%(T?B4T4>(EW4"R'^33 +MKKFPWTI5SE((3>K&LKI(3X*#/*.2?#COE+MTG\KL[K^+\\ZEKE29@M"ZZUD? +M\:AYS#H8)Q)I[AU6[G%LHVJOR"A'KH0X62%GW3/!UG(NP)-[5BLW8A0BA.ZC +M?XADNI^^$2GT'?I&1-/=]%WJE]&WWWN/_B&^Z9^QMJUZO"?H.T7?3]*WQ^X\ +M#OU[BOXUT'>;B>#4[J:8"_C>91DU2G0Z^C(<;^@^J@%.?4^%SYN172@!XT;+ +M70?#VQ^[,S]]VA]9B;R&(G\TLKR@IJ#G.RQ[C/<>/&?12QK>8@NC,&#;A/,- +ME1$:8O5DC5V34?>V%!FE[W_$EQA=%>M&[)IF3]_WB!\Q"N^*>\@P2_C:2 +MO`0%+G_]B!_SYQC^_GV4)9&_*I;$%Z45QKT"Z/]MSKL+:G\7GP+>:.*0+#U+ +MJ=OI-Z*BEL@V+0IJ0UK-4=6:V\N +M3;]+QF8N,8J?@>7<]L=0W[&W8AW.4+R*Z@W:L?!$C(7+,\8ZY#[=WF3XRC(* +M;^+U&Q%3&6]8[&*>'>`_019QR*BE?0F[.-WL[>*1N&(1YP>-[,?8Q4F+N,`H +MO>Z1,7:QM8CUVD?\(J-VD5V,6K^>L(NM1:S7[/4C4Z*I>;?4O+;.)4;9FB?M +MXJ1%[*WD_FAZE.M4[&*\<9P&Q`B8990^M*$;'@=[J.4@?L&ZCU5\#.82(EPI +M?#6=@%687OI\FC[+>^7S6ZQOH7VMC-O7QR3^>KUYK2`H4Z_QYK4BHS"['6A> +MBPQ?1.,`\UJ)41PO#:/E*>*S8D=@'N\1.7R()?'8FW'+PPK4=+PEFK7T/9)[ +M,SMDVL287,M6OS@1ZU]#]:PY/8=Z+Y\]F9[#?F1>:`T&8_8>]9F/^&FSCEE@ +M%.\_.D'5;J?=B4.O+0[)/$3ZZI:_^?$.)>RAY'GD,7S%%LY)Q)OQGR\QBG=, +M;QC+F^IYA.E[JV*^>%^TLVXFC.RJI#94]YP:SB.O$NX[%S#GV)'*H*[E7BE5 +M]FWS@C+K@OQV#W_;5[S_4MGA+:RRINTY#M;"HR:A-VU^UXU$<9VRNJKB::M;GW=+TJ)+?*\&C1(1'DSIU3A +M#1))'=GS6LX9\#GUHYZ.5^7ABU$26J;EZH747EN)'F+5=*B,W:WT5K-.'K?Q +M:KF?B).`.$//*/B%M+N]+KS?5;_LYDVF_X[Y'S(*>VF>V\-Z$N_QI:IW\_*K +M8RVM566.,A%0'%-G?1PB3F_N+:R.W_:`R;H`B?QGF:W$M-F)*S**W_2DIV.? +M`,]$]_)X5MW<&U5HZ29W/"NLM+K>:((QC*6CIO&LXUTM4I5QGN6DY&PSWN7, +M?:*99AFE.S'P5K>\JOWMJ\<=)]C>,_O)C/KS"Y6>4-4KMLF(5;C:ZM'2$E,5 +MKW.'>/+)"H] +ME7CL=K^P1M[0:[Z:_EJ\=_^TI;V?1BR:Y(IK;%O%6QTPL?0;$_%)(9E(N$_( +MQ];>^@(P?VN2XU?],QE$;VWM:((2<8I*;S%Q#!_;[F?72AUES$N9>FD3$7+. +M=GDZ7!OW-/9_D=[19GI'6[]$K>IL\U264>Q)]T_8OT>L3D$D?6-"037)G4L2=]!; +M]'=W,(]Y1MW-VL'TW,7X'LRX:O*+?OS&X0^PSM:16QUFP)^7?<0_BMLMM8)B +M!67C?V[<'L]E&!/U[O?\2%!FWY@4)$]_ETK;*6?"N#]HLA^%>^M'0\^O@1[G +MO19+!KJPMY[E95N,DK&YMG]GU]<;"_E-+9::[;Y]MW@7 +M^4J)XXR#O)ZS/MERI#=8;:ARWK:XWNI?ZC.E\?6ONMRKS[_%3[!?)4=4"TY4G$$LR^QTK>T24Y/Z#$>5GNWPU6M$3P^]8 +M>1TH"DV>47;M?Q%\M6Q$-!,'3YU/X]=WDB,`>\+S6#J3-BOYQL8"@IWT>)J=&"[+YUGE-W1MS&C:Z5:*,12Y;A`FWO7/L/Z`+\M +M1%]F3S9&W<4]/W"3&1V[BXXZ#MK;P0_[4<&VB1AIZ)TU*+X>9^LAK\2H<^C7 +M?/I\A3XY^BR@ST(J#>OEB^BW=PU0^*=G[/&3=GS(H)CCN9=+*\T.JK^!V= +M-"QGFR&)DS3-W42[<$W\AJ@7.'0EP`EH*JEG6*+2KZ4W5V140Y^F9C2`=06R +M19T@]X2CWFI4;H\YZQP)+7HVH&?Y>?I]*GU?.+S1G76U9`0H,>K3],SGJ0:G +MT=W/T:<;9ZWIO[-,O,6\:X'"#'RT[N=UDN/IB2PA4%(+M:"C!_N]+*-PQZX- +M\AA[O-1QEI82PQBECE.9TP9[W.,A5=)9UQPK4@47>4;-&OR#"V[5>J=#37QQ +M7JNK,N#=QF%=0Y$#]AGSF,F:"*"7Y91:`NS!J>Y,BM,S\T:J-0/-0N%U@'JAYKE +M!67J!RE^SK0O4A]"7#MZ>)I;8-11D+>FD;(0=!PSG'(;=:>]K/7V1'@M[^]:SM&D1.(;A/U6%RC5_$-%_'< +M&76@,15G!/+7V9%I;%RXS`+.`95.+2@P2J][R%B$FWM=WOF9Z;HD#>3E3O=- +MTT7AZX9,D+Y->>Z/%*(V=`.%N[@.K2^2$F^!]U0J4/U-DM%IZ"$_F=FTQ*C: +M^,?6DSW6[Z\'ZC[PTC!V3]1&I<\R2KWQKH\(^^/Y2(>,XG.K=@8E.T,A3])0 +M;Z@W[>0]\_SU=BRL>^+5]D=&Z<4.VT1;KC`T;MY9[0]P?3U-H;;T2+B'__(/ +M3?XAQ$3"J2`@#A':)2GQ^IUUO?/C?.7?LRT'\<=<>P;U]Z5J?X#OU>,+<ZV$F'_O4KD#= +M)-G2BC'W?!9&O]CCZF8YH4*S05IWN>`F$NYCGKIP2T(EEQBE +MX=F_3'*<"#^5TKA]?1\H6YHMP9YGLK2SWY>>EG$_-6Q\R;V@`R5]"CGM#6_A +M]V7\$EZ.H&_][W_SD_SA6IY1?`+AF2=\B9!/;RLAF0D[RET%H87]=D30R#UO +MUO7*O1S%#%(ER12_'\^BB.5/SV=(M735-#?V^VVC^9%1:>L5C%-0:'TWTBR3 +M9@]AK?3$H,2H4LIX%*>,7RVA)F!DOU%&=N\'PGV3/-,(;713#^],4NGL6[EB +MFY_]@>BK]_:D1W?VI)?MG+?F#:*QZ=W8.[4#^<`8I3[[0MV=:^N9E?_!6,U= +M6K>-_ZD7E_R"H(R=_?EGQ,X>8S]6T:IMKW9U=@R;4U37T@43]=*>__%^"-1OF^C=MC5W(R(ZQ\]=J?A$ +MVP/]<@8HRZ@./>SI-:(/[JZ-X(#U"48MMG/U,NMS1[KK?7(-)Q3SC!IHJ.3T +MX1&.1I)@@HPDT.`+C$J;\TL6R0@S*N%\19%1^M"=\!.*W8]CY+5/$<%W@U`M9G\-*NH +M\3O&>MKSI-`!A>P-IJ=YRIRH3M]5N1O+BU$NW6E/=[OJAIDY=>?3?OOP+%YS +MS)LG\D(K+<\!>:';(E[Z5(.K\5NIH"`H=51PV;"4-FW+=JQ+?KPDE^2$G,J +M4\532X6G#G>6Z]UH^=+#[&$9:.(KB<"]+*.8P`8?Z9I%>Q=%OT*5[$J#:Z +M-F@KVB;1@EZ7;)7>36RQ3I16L[:&>_L>LXS2S_UES'N7R:6!/F3G-,?,EI(H22X(R=UUS%VM7'U6S +MV-JY"I;PCX#"%A+?W5/NLO+_%;Q?KVSJ+@B*>L-'B9]W +M()^]Y:ZW,9XA^AZ^WRUW%1FUFO/\$.).Y/FA.XMI+GJ_W`79];]-^CVC2D#` +M4V,W[!A9B45M=.9]/EE:8I1.Q#:MS=^!V,W>!J`0P7D\#^,LXFUOJ*>3)_=: +MCQ@="D*AI8]T2^5+^#00]EI/X#>K)(;.\A=Z\XS"CNM2=8%;&F>OM;!!QHF4 +MYRKQ)*JWUUK<$,^BQI.(6]YYU3Y$45RBY5:=O-7O-CY$RXT/44EH)3R)X$.T +MM._>X(B$#Y%WLT'%GD3U?(BRC$IZ$M7S(0H9!4\B_>FMLN:.=;U/D_X42G^' +M3T">41[G']S2@K@:*KO5>@@'JD%V_0O"UTUF;\@GA-EW5V:''K(L"JV$OY#L +MW$SG?6F[UA$S'\#?9"+7MR0H[`Y@S:5.:>P/L)'UKYK24*]D +MC;*,TH>,K9>MD>[8ZH=""SUK8H4GYW]4>`(W>4:U@:_)X_-5^%!\%86OE@/P +MY6[UHPI?'^RK\#5-/!N07]JAT:'$J-VFC>)$-N>^LZ>R_IO&;AH=O%OPY[W1 +MZ4&:M!::OMI_A9KP]3KK;:?%A@U7F^U_;1XB^FU!_2,B!AE>ZOS(QK#GGFURO_A +MLUC_NL6.ONKT47^\</^(7;I.68OC/)K-!W +M)L8>ZC'%VVQ;W0P?8_<]FNF.#-BG:48%&3'*X3V^%WJU1$R43'(^4,VL#Y<, +MK4RXOT%)[_W,2%4KO`CZQ.UQ*VP9VPKC=L>HVO6;9,0+U#T46E42V,(2D$RR +M.#V^N3?/*.9:2WX>R^,>ZL$\(D\G>=U>):\C\0BAU73.7BN?'&P4WVW)QDB2B!C%V1@5/)^%QNZK)GHXH3I)"@I+PA?-!KO[C^58 +M/NNI;>U&#\$N5ZO(SKN#X?O$/]0BUYE3KLS%QT;\[!U5W)OL*/MP=W+E'82, +M=39F>= +MSQF8E;AHD[5^4Z/E3GCDU_N4&(5?FD>CW[[2CKW,0O8QO/RYQ`LS^=G&[K'<4*ZB)GB5(Y2LN1#_J1H&B6PCOD +ML>&Q9LZ`R5Y4V"$\XD&_=*>=16$]<+3D__5XO!X*ZP?Y1KT?6RM`=Y(T8">@ +ML?R>ZI8RZYDDW:R@#A8$^Y&=9VK@5&H0_MC8:97HL;^JG'F(SULQ:MQXJ?!] +MH)&JP"@:@<*3H-=\C_YJV.;UY#*3_NH#ID!=][!/$S`-,W(]RRC,T7I/8S=*=@:P+M3D>J-'!NI$0FN5"876N_(, +MH_]NT%=6T'E!O?F0KZZ`BI5`OVG02TF__XE8`33&3R+N+Z.[KU60ZE5!%ADU +M\$W#M2*:D.I.@\S34W]M[(X8I;]._UY.T/B+T!BXF*X__I!?$M1%]._%_\_8 +MNY$/B=>843$80Z27AZ(! +MG"!&Y"-0NZZX*O%.[O4FT6ALC>_X&`WQA8\VHA!%,T:B1'DTOL`$S42)<@WN +M?.>O23]WZ8C)-E)P#=[=$0GQ9ASA;D1GE5QQ"_+Y. +MYS,0XO=TB#Z$>";(ZZY`7O)>N/O=DKSE%I#?3`CCR!>2.17BZ?!K4R3$C3K$ +MM/(S7PKQ.V#9$$G%'W0J3H;^?1BBV+XY*4_"$@" +M^1\PO]9N6:*BOM\$=VX!8!0P +MV/=:7%F=4525]=6T=V@UW+SNV:XL48:\K0'?N(&[(G!UZ^^WJ].!5^R>U7T) +M].^)@D[4:8W82S=P']]H&[\B;;T_+B9=6F_&H=G*$Q6<\W<5U#4QR,7B?-7S +MV!/,W]^C1V`T4RH7J;N%BAE4\U[*7^=!SKVS$/:FIM`<,O1BM#:FU+U1OX(5 +MXZ%&;2PU\Z"^)VI2=[O1TN<8"8S]97I5,/R.Z]\9HF@LAJL9##%`PPY**'MO +MT%/H/BOXWJ&DT-9]HEK[>]J69$[%7NO!,BIT1Q%U^\O)O*).@S3^K)3&R3J- +MC?JIPF>G\3\@SO=QTIBZCY/&]'UA&J<.DD;OY63F/EU/S,78[J45%CH^4Y0_ +MN`(C>U_02]N,(X#_>C\IOR9H]N?`/:79GYSV*X9GS-OBB3>3`]((?;`\4:T) +M/3LS1%C5TEL@*IKJ:NDUI6*_ +M/Q+[=*XL]G>]2<_2W/TS^)3J^V2(NOB!R(I94X1K0)DG*CB':=S68C?+.!H&:N49:4\T'J%[M +M-Z;6]1E&`WWIMUI%CY@'M>Y5I*:+BQE#*EXTXBXAVB:=]6*VQ5?7P +ME'=8FB@QX:JYC>+Y(0'=\&^U3@HE%(]?9684!3WM[^E1^4TUD%EVU'0(XVA# +M^VMG%26&VL5:>\@AMTPWWUS5@&NU1M:L>'=6-Y2I-^&:(PK7-,=[#4.,'>^( +M.U]*QA(=AAV<>`^]A3Q1%CZ/[_%H/+5=V7O&J_PZ&_)K0848J?\DSHJ`G&@? +MGEQCQL%N_H[D1;M3UYAE(4&*@C!2OPOR1*)_*)[J/#(.:1.7_GT6+?*_%YX6 +M5YEIHO"+;G&UDJ#H.3H=-X;05^:XN))F(3)$-8HAII@PU!$_W)4TT$_1F&Z1 +M5YJ8;NQI98D:AG-Z0U1=.$:>1.?-Q+4=5[/GB$H$=X?0NF]UUU`GB*`]K^)5 +M7WI#1R=`,`_4=,A$:8==@:C]OU-]I7<6"?$NF+U@_@'F`S`T/[$.J:T[2N68 +M5F9;AH/?';$$D[S6!?6]@7D36WC98-+7J%.A/!T#(S!(9YJH(R&&M?H+9P?8 +M8\%[U7.D&:(L3%/%G='@AF_H*+AFB0K>WSAPF>(.,?'DB$)@^]_DHS'_H5:*+#<\!#N@[W[QA&89WJP5QICH!?0^#:`M=&N+;B +MV@*XXO=@\_=J%'"EV89?AW%F*^)OX%?J]X/Y-43[U0C7=.A7$_HUI!2G!/S& +MIR%O&QFBT`]#^Q&K4:$T:?_1ARQ1&`JN&(R&$O@_`JZYWZLZ9[?^FCA^'K9: +MQFW06[OMW:[@W>9U[.$-7W?.7*RAXI="'?%`8YGNHL+O@QISL'-B)XOWAY@/ +M(C5%-$&1F#@TJ%NG57Z#)"I8!7_K:Y$^0+#G#?H`Z0?#5A1R[BUJ]T8+K=S` +M->X/OT??\#-$'6S%.<[]91\,1R=_W9^D&72H*8U^JE=:<=Y]VWUQD5-^]>(Y +MUS`IWG4KKHE5>])H_2KV/GHM)Z6HK-]Z?M^S#20GG(G".:/%O2;+7[)Z5?RALD7$N +M];_>&C#'A#/M!:(J1R.5;:_Y,$E"S?'-Q;ZE6+VI<_+J#IM:>YPS_.9[R=3# +MP1OJ7")HOER>OBTI?O!*4BY])9Q32Q,E;^I/XNFLU+/J+WU[EUVOT.QZ1OF% +MKC5Z)V(/C')>>(5V",E>L$/_)*OC]6Q7V9@(VGU3G&@TXC=IR"7SH^8CI9(VRMF:BPO9]=X`?6*I1RIE3T^L^:>:*\?U--`BIQ]19<@Q +M4"OE?&P_>ETHJ5U*MSCDH/FRT\@HJE="")V&M:J3M&;2VX>G\/Q4,?2-65FB +MFK2K,&YV`G]Z,#<%^OA4[*OIQGIK4U(655KS*L2*%7J-.'=?V)14FA-CHO!( +MT'9@/_P&O8L0M;4'^T5HI]"C*HV=M/]QW0Y%40\$5Z*#>RWTG5)$]02GHZ^, +MG#6#NQ'OAO<`92NM_)J/L_K"AEZQJLLF_BN)9XP&+5=&47I?8;`NET+6YTFA +MWUE%'40')FJRBLG@@WA&<,58@:C#]1V'N?`RI]IC05UX!Y&HK4KWB@SU#G$_4E91P?>20..K.)'VH$`LS!;4#T"4#,XW +MB9?NXJX>#U?:XW[DQX(\$<9V16F%BM3?O0N/!7GBIG`7J4K]>(C]%R]3FHK- +MQY'"M7NT+_/FEVA=S?A+I^L=/<(>#U)*/:[\4L_/*-;9`:U,FJB#?=7% +M$I-1?F&9@9`.7#HLC)3P1,Y +MHC`^E%=O49KV;]83JL\$XT2<-_Z$9@C2K_7=MH7BY +M.E[R&E5RTT31&4\@B?TH"9`*?L7;K^,D3WTOF7DBK"Z.1),J'WA=W\)9VUR3^A>6I@+HWN;,>:'R>EFGJB14NU%$^^^ +MG@Q"09EW8-[X<3%9T'[Y71U:CW&W/OOF-[KNQS)O/JG&"GJ^"NOWRAR]I)A, +M/1GX);ZV*7R[5,H"_Z"N3A-E=8\S'H-R.!:N'I9''%%'ZK$,44%I>`9C6T'@ +MV";[9#1';]#EN7LLIJ#DEE/4)X%\BK27?`/X62RJ'4NH"S^OJ%[HZ;:78C\! +M2TF?RI$"6IB"3F-D#1/NFL'37R/S1*87CL!BI;=#NQOZ7R%]H&+MMF3*"]LT +M'=K1E,[R^:8T49C:ULAWVD-(JX2PFH(]YD1%SXJ/GH01UZ=A9HFJ/#TC"/U9 +MG0-R*D0ZS4G=D:C/>C%(X7IP:X`^Q3G%9)XH>5U%3TKW*TY^`)XZ=V^RX`4C +MBL%:9*I9GJILD4N[GY2F>RP'*:)$QV;J;U%.Q/8LO3-)>Z0^V3.KVX3^A*)N +MWJ/J!NS]?_K.K+TQ0?VHC_I'346Y911U7=WX&TB6%/8<<4333Z4(_`ON:Z(":]CX`>=UL +M4`G.*[_VY0><$A+=554@JO*4$!R?0;ER2$LZZM/[`U)X?N?TAC'&M-HXMHD. +M+J$55]IV+-9I8E\L113VR*;%III%R*^X7PY/$L??4/LY!W[Z;3.M*/`U\*_, +MK]J8\6GWM\T,4?W`"W#!4U%)]@>@QW=Y7!Q("#/1;Z6SRJ]BG,Y72/0?21KI +M#W1_VQ`W[`GW-N6(JK8+KDQ_-%&E?"#FHC;'V?W/=HJVW5TUJPPIY'2[0%0V +M`;WB-=V.NHZV\3PJ6FUT8-Q4W,EA/JU*VD)[4C%F+\41UP'7*12%B#Z1>EJU +M,/`U6T.\`_\5H&*M8"X^]=""5Z;W-R(0AIJ[J'$#\J!=:?+B7 +M)>J8RU!_&_84H.0V36T]!>-W-?2CXYWI9R[K,'+*KU[+C@'1AV//VC=F]0P7 +MUEHYSJB+2^H/YXG"]9/A?C+5*A%@"[Z^_WC8C;BFBY`_W)(.W49E."7%,$Q5;-<86-;MFM?6I&*,N +M"HQ]$-_,AJ"G0/&96XHUMCI!?+/EU-E[:#T'^DFGB4)-C/KL<^746=7CE]\0 +MOFV=P%4CT)_-6GD@=DFJ@KH.4-3_/%M%E&V3Q3AJAJ>S*C92JKJ,H=?U`_ +MWZTU)IC";<@]$_1]<^`:ZZ4SW>R6GC54QNW>Z:3')4_4"=`G^0J8DWI5B_RH +M;I%G@-LIO6O,PC-*JM#3`YBI<3P,S$\SI8,QGD;*!F@W4#\"E^+/C +M6QT(<2Z8^6`6@4D1M01L&8P+:C&C4WA'&^?TX+SV:&,A7--$)>#7^?"+QK-] +M,/;N>:HS.D[+$$5C%1J/0AY`76"XKR]Q(EU1)UOV626)8M=ZDL2)1DO?&@/& +M/78+SJ3C:1\],3NG*#PI\7L;DTC%<0=MF]<9E6'^6=43Q3&QW4JC^^!L5VJE +M8W:QUC(*RJ]$O5VLLT757Y5K!TSA=@"N+\!UG-X;]^\N4OH_N +M'PF+SI2`8YX:GTJAG9:8:LX$]&NT +MT0+7_`"_FN".T3,5ZE.KKP&N0^!W@:@AVG4H7!O[Q]@X7FO$TQ,@CV!.-_]( +M=33DVAHZI<5M%9^\H?+K@3$V$L7+;"-%%*U/O-*RP07ZSV-"&O,KC;>)6J]+ +M0;S?MNF)^&@*5=3AR2M.:^:/09WS/Z_'!PTY2Q02&/Y@(>>("L(/_(N&C"?Y +MY56(9E=K#:[YUIH`8[VD^RZ488&HND2G$8<[&*>:?BCU\%2=?@KSFODT/S@6PM-C$K%=,(9X,=7R5:EOQ#6.9CM=UFRUU/:;Y?#C2.<^G>8`SJ]1,J>>C +M-=-@D+>N?KDUVWD:ZXZ6;F^;`N_,[+:OS>_1J-ZFDUE=:2 +MDR6*QORGOC9P580><^6>#T9SV*^/ZY%77<7).?GG5(=_]! +MM3"&1CL!#HRSTT1A_^:M;@&]1]T7A)IE-O2P_&X;VM\Z(T,4[JC?!2YG`_5& +MMPS/FP_BFMU>.8[Z@1<`RE5,AOK&=WO3=P4ETD?ECG-G-*[]H_P6V%19D +M>*':[UX9MA(%HH*V8K!QI/E"T%H%^0+C$^X;>7D[C>=31+EJCT%9?`3.>1@T +MYV>G7PCRZD?]XXEFD% +M2>>("G7Q-.)*/[]!]+4;LW'U7T^[?01(*4^4O.C9)+ZO&J!K=`J.T#D2I50@ +M:@7VE_K4#EPPNN!WA1QSZ-_1K\0H9?U&?KN:(?P!5/2DL1A?J* +MAL`OU%G4"-?YI-_D>-T7$T::J'-HI8$P4)M1`J[X/0S]6*2?SA"U1/N1@2O& +M%N.9H'I5Y#3IT'L +M\;M"_L6@;*-+F\[W*"^4`$DF(>Q"Z!?M[7DD+J8U*-T*0V.E=5OFGX+:Y%0M +MH]/A.A/,*5H_$^F_)^I@\]J8.]-_"LLV[MQX7=1T!-=*_'7^G].^LHE:*M!^#WTO=3BSQ9,>ZYW6]GOQ/JB<*^?Q7ZOQ5*AG? +M^2`9G+"9QO.W_Q3DZ(/J_U*QU[,\M3LCNP=JE4Y$<_DZH5Q'G +M-5OB6O]CS\O)5%Z](14'0VM=K"S?:>57Q?Q26<@P&LODPYK\5^^$M6]9B#]^ +M.9DEBF*Y^K4P7I4AYXBJ^CT-9P'Q,UG_OF2>J(-I><'T%_)!;2*[C9+N6ZC) +MOQK,7YV_/VF^%-3D!YLI2[U4DCV4]#OBZH2)8$SS1+.#7Y;21-$NIY60Q]'/ +M;IR=&?5+\?=]2='PJ=*?0]3!3IO$FBK[4I@+>VQGL%!SBH*P(Z&F,%2*DSJ/ +M0N1UO+QNS(&T=R6]GW)C!]K;3G3$*?N3!>77.P-W6.`7"0?C)J"^_S.U'7&H +M2Q--9EM=DVD93>;8(4UF1V.3.:&IR4R98(B:-*+)G-S29$XYM`E*>9,Y#=(Y +M`])[\E+(6S\&0]3,Y4UFW+VQX4P@:N`Z&Z[.JB4GB"G?H71GB"KJG +M*)D'Z<[^6>?[K-![^*FW\-7]2?DG3%&3T2(F&KD_JWKB%*--+#$L<;4Q5MP+ +MF>-%8X)XWTB)IH9)8F)#GJC)XA08<2UIF":6#)TAWA]ZLKBZ(;;JG?O$!P?. +M38.]0-2(7XX:,5-]>>77>$5FB5J&?K5KO[Y;[M=/<#Y'^?7P('Z-5F2>J%[T:Y3VZ^OE +M?OTGMH_*KURY7_*$_U5^':9(_/H]^J5UQ\MX/ROQ+$74S4G=4^+=0 +MR8_FHXE"_D[,"TW*/^IU?/]?H7^9D'H2J1M+_N$Z06GMH:]=6:)HE45M^?Y` +M,>Y?X?>PW):@%47_GL/X_:*H]CAIMSS.YQ`EKRDFYM-B`K* +MW6`ESOP+4D&Y&ZS$I8@*RMU@)2Y-5%#N!BMQF;]4U'(R*'&T<^RUCY-R:3&9 +M_8OJ;:MR-UB)RQ$5E+O!2EQ>Q4N7N\%*7(&HH-QAB9M?17;F*U3[5JFSHK)+ +M$442A%(Z`Z1X,K:'(+^9(+\SM?S21,W64G3@.A_KK0K998BJ5F>)8(^QG/0)L[3K5M+:B%SG+R +MKZB\JMX;G0'VB=[)%O38FH554)3>AT^]_P/V0K"(!(T$1$L;7,U7B=)W6O2= +M"1%Z+-A3BH([4^B.1727X/? +M&:)&8MFY;KHCKX?\-*E4@P:(@/S7/UGG*B=3B\W5N*KS**H];6>5Q*ZL\;F65QZT5Y3$3E$?J^ZP`^8V` +M\KB551ZWLLKC5E9YW%I9'NG;*&HJI!/<\/<7(=31I<1BFU^YA?L7] +MX#AWF/JK:D5C`_5%ZK[AZ\,@P43)VU\*]^I^'?)30[!7]VR0!,@MH_S:N)%F +M'2:C_O1:_47V4[5K'&OA[%\'ZZ51B'\K)G%&.T=43.O(7I0K[Y/+1[=03/)$ +M87I0Z]D9&)\/^\,^,#T%/>6"BMCI=]I1;T&<<$6_>QM2?E0"L;W@5I*FW`:M\/ZO',*;^DTEZ&NCOI/&\8M4[6*PE) +M?Z&B@$!-GAB*'*O.'D8_$EK#8.$U-0J06J/P\8X.W92GE])HODY^_:$_26WV +M$]#FKGPWB6M61N%[>%1I=$P112$]WD\]8W$V]$L>ZR\[V3%-5.7ZG&`%+]5E +MW]R7S+P>U*N3,&_%;$CKKEGRFX)R0+#'/$M4S%0Y)R#5K&DLC=_KZ@#(:;^$ +MW0W/4XX!J:"VA-H:K7\01J!YHM`UN%OWJ=Y#091#*_8*1*U]`L>OHPV:*R0= +M1E\*9U4VA:D,8\K7/OW5#T!-KTMFE>KGJF'^VNU7\4N +M=4+$B30B7QZL!>OU;T_(<49641_@UTU;DO[/D,!1'BJ2\;IRBI)ZUN)0U/N% +M6I>4'K"?#H/W"[W`_+:@'N**4,4:&L:M4)).+Z>C.^JEW2;G9<+Z?]HA88Q]B3::9M +MA=I+AE*I@_R1(ZI'KY7<%ZV_U.-I\?;+R?SVRC<41VVV\$1?<)H"7`J*BJLW +M$<2-]")'XF;NH+%"Y#E\HO*;6&I'4/M6SN-$Q\CI'2I>3W;AVVCKGF[44+QV +M=KV%9^U>[]B)[M%&ABC2&`._:-XPO2$9TG@6%Y!915T!)1(,KHTJ%BU[[*5U +MI%\KL:K[9X>O6G-%3H68&`>U!_2J?FFEVW`%U4D;RL;,^3#VE75%-/8%Y1?( +M"L_9:L+<\N^=X4@B./_'W$D4KH/Y^JZDP!61N"KUH9UE:_!2.X.\&NKC#\9J +MN`KNT5TT+Y,.J>"LCF!M:)D^A9U!+8>K450IBYM!O@I.^\@2U:=*AM)_J/1N +MDGTEVNN$F5,A5FNS=>N'\MMF@M(,WX'+^'VI$440:6*+PS\]6D?!_: +MM+CH**OOB3K8F:>T'E.%>#:>=[*S*TOR5ROK,1;7!_HZ_*`5#31<7!^M53Y5 +M*[YR1&',.W#=%W[GGK9'C8]1X^%(:+,OJS/R);^T+ID;(GYA*SJMN\XH^$'- +M-`U7"8[\M]:<7.RZYC74X%2/VAQ-M"SRDF@[(TN_N=!GEB*44I14&Z +M0$[M@1^T_N[7\!0^/:>83"MJ:E02J`'52L_N5JME+\/Y0NT7MASG\4\4;Q?9A*(6WB^W2QQBHG),+_!IPGDNTI.4519J\ +M;^K"KS7R;2BQ_98T5]7WT7PTN!5TB.J.,.M;\5O!2G_6CW3,XH-]EHD28OF[F3VC2#?'_5EK%1>2LK6OX5[K]ND*ELYHM;BF1:) +MT6H%-O93_ZSWG&!N>O;I9%[YA:M)X_63J9[!^,`=JID^@G?P[[\D"T3AZ;9! +M[,="G`X4%]LXT_\5_67$?!.I+^OO4\7BC8YX^QV:80F^NG0?`O474;@/&>JI +MN72*4A#''B,$*#0A] +MKJ!UX?6XO_*P+%'&)[MG#<4U/BO>+=-*?%6V5,S:MXW=PQ-;%BSZRK_EYLQ_0E@O31J4"KYQ:("N3T<1%&]OC]14`< +M-Q?"LY+,MRCG&*56.+9*VBC)&J@'@W2FB`KD;6CI2N^=I)CV42B-=(12H:(:KZF760`WH$[>K-$D6[-=Q1!HS@9E0S.47I7W1&N71)`Q/N?,:] +MM;;XJ9$G:HJ`GF?-&[-0S]QD%F/U6]16 +MHS1$V[D.:M8VWU;UUVBE4_'RW6IM:*!C$:ZM<$V]K4:_G2H4Z%W'/T+]@+9# +M+>A(U`W>9:257VMN4V*BL=-[,NU"%P3@F=E +M=AGF&AQW*_^S1.$XO54JOW!TT=JG2%$7-VVQV,B]'::Q7_7'22J7[II52V=( +MC$X?*#I.GJC)>*>G"_J4RC\ZS1&>:($^<`N>_ZC2B.>)`]$"U]8ZD`"N;DD` +M!09_F^]0B+UPY\JIE/H>J%,3JWIL7(EEK=@]JVE+L3U%5*Q_]ZD3,-1?6_:$ +M^#`S);X467MMI=-$I>)X`JD[:K#3_#)$5>Y>KUQSFB6J?,VIUT7ZHK"LZSR7 +M>R>:OZH9FO]25)CSU*K@8O'XN91S;NXX#65?>"?,A2!OE0L7&X%TNVE7].Y. +M<[=J.R"G5.;$ZRR5$Z'M2"D*M8J@Y3?^K#JMBQ+M=/)JCS4WO3O,A1@*Y)(> +MR(6)_BX;<[(%[Z*I4&S/*+\@R>%ZYC&&/K\#-5\:U%YFM5^#KV?&%8DYHJK- +MEXS%<=M:=9I"?O?!>E;!$P6BHE__L,9A6F/%[`GZ,&$_N`L1"0TW#E3(*I!KSR<5"6T^1".^6Y03]`7U/C`4/%W"JC& +MLCLO/JYZSH945.0,,?%AG/HE<12`GNUVB3IP$52C^FSZ +M^]<*-8>9L&VU7R(N/.57PK_]F@]$>+++6JG.9\[B3,^E^Y-^>;PN_UC-*L,= +MN6A7&$=Q"%+5]B2VTEH?Z=1"3"RB<+WKLL?Q33YEQU<%FC-+ND1M11T0]HQ; +MH,5>=:0M>CNA4,RC]?LSUF)"H<(@RA"_,1K%TP:=D$"KIHI.2Q.$V/BF(_;O +M2LI#@MC3CAL>&/XI3N6[Y2.4@XXZX +MD(JB.F&4L^D./>/W(L3MJX\GA])\XYH65_LURJE'?>C@HG9/U;>(W^RFOM:I +MV$E6U#/*!?5QREN5'7.F_*.R^T1-09?[E4O/,K#?H>RKP5T\"/;/DU_[MB3E +M137A:H.XUN$N,KM)LI:BL&H]IPU_2[HJ +MQ.#MX+QBQ]ZDO*D\;AY1#?K;L_A#>=RPUXXZ5GSEUU_C'?)=(/:!:12A5'%N +MCF:N#XOK5@Z_.J)6.RUU +MJM_=2/UOW(P?,UVB$EAJT1AQ)]"3CD_A$TA[*HWZF9#69]0&=8=_6-#"=`QR +M/@WM21NI_')5_Q'\@#$9'C%TFM!?QE`2%E%R6TG>\8MUN=F,;NJ;MCTRS-%; +M(V]FJCOBY1.L0?5IT2.67]IG\_%/$S_.4GZZBGBS% +M@<9WST7\7"`L3X<(/C^JXA"0XMD2Z1/5X^C<^V"%GT]I\O"@9HK/UA*XOYP4 +MCT-_XO"R?#]+2^">\M!MHN3#D=B>KB5P1\E/YW`5>_!Y740"IV@_;U&D/+Q, +MJO=%_#Q)Q_-&T>$>'D@BE.IO(W[^7Q6ZIV+_*]%1K_1/78 +M.AX_ASO7&WVQ57[Y$VV41C<2GV_H^&1+TK"((O[Z2'R^HM_%6M%17+VQTU84 +MC!Z&%%0K&H;R\])3#E$]*1VO-25)JEW>BI1MX7N;S2SNZV!;T. +MK#W:T;^C=>Q7EF+OM87YOB_BQQ@=^^6BHQGDZ+<-R-&71N@OZ/A^@:@+*V*] +M*B*_PZ#^(HIBO3SB!Z[0M]1>+8R]K?Q"70Z6?Y[(UH^D$,XKQ1S]=HB2RR(A +M-.M<.%_)'24NB;KR[Q&YTXE9D:<:A.5^(2QI9ZL4!#6(.+]$>D3U!'NUSU+Q +M"4BY0)'^%X(WA"UFEVZ%Y0OOX_RSBM_I0!ZA45B#=PS2N\+9 +M.YNH_D!S^H^*9?V`N3H&#E'RR??INU3_%<-0CUD6SPJZ=47D9.LPL;>@GM$Y>@DVE>E[T/0'_:."/)]$XRV*7[8_W7*X^<3-2^0T[WO*^TD +MUTVG<<+LN_#+*8P*1U$:(=:B%T80HEN=NW;X[EG#/BKU3"VB#K;'`>-I$U7^ +MK=)7IZ#CSD$(=HN"9VG^K/9?B^9*LJ"<(?7.? +M*#K/AT;;RC\*;;CNZV^!IZQH38[D_*`_>`7D@&'J28NH(#Y35\7L.=AK&24Z +MC-CE)KK9QFC#5G[IDZEJ@[3AS+[>_8[2<12E3R5&">*7HUB$EO.?3DHKJ$T& +MW2<';\BUPIHIT=02':.!Z4,W83<9GJ*Z_5E-^"4,7-2<@;J+[L-@!.P3E<`U +M*K0F!=I[TB5/>S'[8OB=#[LIHX-X*6JUHGHL_,:[D+Z'PM4BZO,X\RM+/1J#8[J@0JWP[DR;4 +M#WB.-,Y^*PIZ4QG2R!.C691EVIZ@G69S')A3-E'Q3W0H>/Y4;2S4(-2FQPS.D4&;AIJ&BC2/ +MIT(RY/26>.UHVO\JB1I[7SS4;F'FXN+0U:/M6NP]/K:>1A8N49\U&^D=6=DJ +M!'-$'?"6MA:%C;U!7Z5QTTXZ*WVP64DQED+4S[OKXV(;/$\MQ%.1)\<&[>-@ +MWXLQ1391[H-J91KJ-%L##O)_UJMO[(NWT(H@ARCQ-/SN +MZ(ZBG14T2VD11>7EBO5)VJW1M"L)T8=8NX?)W7`=*1;:RB]P +M$<=`300N=/<%=9?L[Q:3SE&ZOB<7L;IT%UN6=8]`F[2ZWI9$S5[=KN3SWTH^ +M`6D!L0SNN43)E3NT'Z*UVAR%=U1E_IH<2:>A=Z;X1P4EK3%NM\B-*FVT"PCB +M]%CPIL81U;N3OJ&:;^.W66'[.(:$\>E;>$5Y$67N5G?WZ+M[]5WS7>5N$U4` +M5PF_]N&U7]C[`^KOBG*(HE$JZG9JJF_%TU#Q[I3++".^ZD0I>K]M2Z+\6*>! +M;=">(R`A\YZC.*)$;?`'-3FY1,G+=]+YN0;TL(;J]82B;5,R6/7AC:OL#4VN +MDA/]<4$NS#T4%V\%\CE'OZG@G.9VI#9'VJ!-$7N>[-VFU1ZT,(]%[CXR^MLLPQ#V1NWLC]@+871UB)^U,IG,4D>@M +MUV;GM0>2H'C(ZF=0^>W1WJ,ZW_G)+MRQFRK6V8N*XY3\.LBO:3N3P7I>$^ZN +M#.YV*G>+J&ZA=-IAGB`-&2MOI/U5(^)3S6:]?0?5?`[R*[C7TMHP;UIA#P#A$-=X`L;^BSI@. +M=^5-_TS:W77FY!N4KJ@^R`52^=4FS"DWJ-/GOX+?;=I46TE[HL'N$O5U>.YK +M^MD9KZ@[+3?4F2:85C#>^*`'LWDLE-6Y1>KC),9!5.>J538H$7]\4&H/MM]1 +M?!&I`6LN=6XD+8<@&8NH?8%\BDJ31!P:`-0)1_N:<;Z0*'%`WX7Q,.KF,OK' +M47LM_E>Y.T3A*`1U5K7T:S\_VA'F\/FHT8NHL<'=#W>$*XE5#M]X&.4OHC"6 +MUQ??Z4QIG7;RM>W8PX+ZWSL,?WM?5#T8/>O0OB-<4WUKH(VKK=[QOUC9-ZDJ +MLZ.#=KN\;7RR*_4PM%00\VD@)8LHN1GB`7$8"ZXSP54^%XD7Q,`^.GB/#^PH +M]9OH3";<2;U2G<+D*`KOHNZQMOJJ\^[RZ#"-^CD1[*IDJH5L>->75D6KYF1N.0BI$O4AHC+,Q'[K=KNA2%NC-S=%+&O!;L_(7R/ +M.-Z(W+TC$KKX$E)W!RZZ!8[V(%&ZUI>"$)7N73%@]AO?J4U4M14[7^QE$?_HV271,D-D;OG0)\NL%^%[OYYKO+K:BB=I-E8Z2X1 +MU]EJM[^TS6/@77I$H=Z,%+C62-2889O!'I^H><6>K%4C%0TZHBP +M%64IE[X(V?=ZR>X0Y49<^G:4[&NU788A9B-WKXG845>A.S$ZU_'+R-WKT7Z$ +MJIF\B=5&397G/?@3HSWWL#RO^U#UR9_Z4/6)DV&?_#^C/>WC58BHO1S<+$5) +MNWH.1(WA(!U;4Z71!,DI^AOKKQ(5SHH93_\'-Q(0]0_BLF#[G;RCJ03AKAD.,3A=17*&K2_`?81KR3EMT6'3'W6R)#J+Z).G`WAO=E/ +M_GP(;T'FBV5?]+Q4Y7BH4J_OP]"V^2I>,-):#B,M^B8T;@?EK3/!;6TP,CN& +MJ+$[PKP5M$EM>@\_U5_'!&G\9Z3E2^PLV8>!W3XF6F/61NYV1.P.4:F("ZVT +MT2WH)&V788A-$;(Y8F\%NUL68F/D[KX=I1K9.R9:'J.M<'!6,^[K\)5?PC$: +MUPC3`--*)SB7M#?3B33'4KUZB+!:*N[6XRSZ"#Q]3!C6L])P +M#;5GV$`9(JS5EFOI'?3/8E$VBW)8E&11+HOR6)3/HL0E+'FQ*)M%.2Q*LBB7 +M17DLRF=18@5+7BS*9E$.BY(LRF51'HOR693X?RQYL2B;13DL2K(HET5Y+,IG +M46(E2UXLRF91#HN2+,IE41Z+\EF4^`E+7BS*9E$.BY(LRF51'HOR6918Q9(7 +MB[)9E,.B)(MR693'HGP6)5:SY,6B;!;EL"C)HEP6Y;$HGT4)R9(7B[)9E,.B +M)(MR693'HGP6);I9\F)1-HMR6)1D42Z+\EB4SZ)$#TM>+,IF40Z+DBS*95$> +MB_)9E+B4)2\69;,HAT5)%N6R*(]%^2Q*]++DQ:)L%N6P*,FB7!;EL2B?18G+ +M6/)B43:+2S*8M% +MV2S*85&21;DLRF-1/HL2?2QYL2B;13DL2K(HET5Y+,IG47C^SF=3%HNR693# +MHB2+B_)9E/@I2UXLRF91#HN2 +M+,IE41Z+\EF4N)HE+Q9ELRB'14D6Y;(HCT7Y+$K\)TM>+,IF40Z+DBS*95$> +MB_)9E,BRY,6B;!;EL"C)HEP6Y;$HGT6)G['DQ:)L%N6P*,FB7!;EL2B?18G_ +M8LF+1=DLRF%1DD6Y+,IC43Z+$O_-DA>+LEF4PZ(DBW)9E,>B?!8EKF')BT79 +M+,IA49)%N2S*8U$^BQ+_PY(7B[)9E,.B)(MR693'HGP6)7[.DA>+LEF4PZ(D +MBW)9E,>B?!8E?L&2%XNR693#HB2+3%HFP6Y;`HR:)<%N6Q*)]%B>M9\F)1-HMR6)1D42Z+\EB4SZ+$#2QYL2B; +M13DL2K(HET5Y+,IG4>+7+'FQ*)M%.2Q*LBB717DLRF=1XD:6O%B4S:(<%B59 +ME,NB/!;ELRCALN3%HFP6Y;`HR:)<%N6Q*)]%B9M8\F)1-HMR6)1D42Z+\EB4 +MSZ+$S2QYL2B;13DL2K(HET5Y+,IG4>(W+'FQ*)M%.2Q*LBB717DLRF=1XA:6 +MO%B4S:(<%B59E,NB/!;ELRAQ*TM>+,IF40Z+DBS*95$>B_)9E+B-)2\69;,H +MAT5)%N6R*(]%^2Q*W,Z2%XNR693#HB2+^DW4#'"UP4P#$\-GX2HCE$=4`EQ1:WVUOQ3\\XEJ0;U]M)57_=&Y +M>9\(\G<2WKL3J5:T)81RAC^SO43A"9E6B8(_6Y0H6?@D7@?V*7#/OK,RC47X +M([\N_^^:ND!>`ZC@;\-5VQ#UQ88!I!&.":0'3"F8OW'.) +M0AN:-G"UP(P%TP%F`I@4&*^,0C,)7">#F0+&!C,-C$_4#+"=#"8-9B:8,\', +M!N.`F8]GW=V%U$*P+;JGNNPS&`NBEH%M.9B58"287C!]]Y1B8=\5Q&NM=LU& +M[AX`LQ\U28;4-?HNGKEW/1@7S"U@[D#_B;H;;+F('VC6P>^'P3R&3Q#E@6T# +MF$T5Y&;]VR,J#[^V@-D*9AO*!\Q;8/8@A;^)*H!M'YC]8`Z@1.Z%-P;&`-,( +M1ORV\FV;X#H%C`UF&I@98"RB3@9;^M[R.+7`[U8P;?@$41;8QH+IJ"#I/$Q\ +M4T39]\'[`^*MY^`=1L@)8$^!D41-`MMD?7?VO>7OTX'?+E'SP;80S"(PR\&L +M!).)T%Z81@FNO6`F0.A]<%T+)@OF&C`^4;\$V_7H,TH!J#O@>@N8N\'DT,^[ +MD5H'MH?!/`;&P[0^4!XWBZA-<&"R!V/^!!!P/0!F'\J+J!8@/H)?^\%\@B1(5X!;*Y@$ +M&)>1O_N:,Z)52UK +M@MXXGA9T\#_K'E9]SZ(<%B59E,NB/!;ELR@LGY]-62S*9E$.BY(LRF51'HOR +M!U!5Z_/[.+G0"JF3#A*B312>ZOLY[;(-7.KPH(*BHQQTY,33RNY$!QG+9@GG7,EZUC4REUY\9*>>58^6M0 +M*B9*[\)A^26)^NZ"I=]:0L7 +MS)^S($*@FTL4W@EBBG$,Z-,7+)NU(/,?"SRB+CFA:]&BN5WS?GAZ]73XK'B) +M!UCUUP.JI*@_O&*_]_1++CSUHJY%$'Z7N/"2"^?81/T(G(*85_MS!@TQ6D(E +M*UXNB_)8E,^BQ.]8\F)1-E$7SNM:LG3YG&5+SQ7B@J7S%RR%7''Q!4M_.&?Q +MLN5(.42E9WQOSND++UHV[8*+EZ#KW'ES\$'*04L7+#I'$G7!TGD+,A=FR)5N +M1[,1_+FL>'DLRO],:NZ\)7/$.J067[`DC$77O&7G_?B\99>H%*L_:QU+7BS* +M85&21;DLRF-1/HL2OV?EKS)*5MR%8L7++5F+ERZH&M^&86E +M#>MMARALYX:(,P8-45:-%]:,T5+K#AK[`\U_;WZU^9WF,6*J\(CZN/GJ9J\Y +M*YX3_]U\_5%.L3XL/F?;WVUN%U\4=S6/;KZGN2:> +MJ2W6EZ7WP6C---B?]>!@\9+?U"D!8X>4G!RC\7KT;Q$4JHG?`7D1=>U90IP* +M+GA%$]Q%^]FH)2ZD*DWTSQTT7M$_CT7Y+$H\%*66+K@P<\&2"Q<$9;%KV7F+ +MT6X]Q"J/+,H9E,I<:0_MZI?4'N6 +MD=Z@(>*4#*KWQ]SN/U3*]_!WF#)VG3)6C6?]7"U$#-+ +M+UBV8-ZR.9F+E\Z9#_6V'5+G8$4=K0`C?TY5ORK_Y$&I49#*4:+8[`Z@%E_< +M=5ZE8#U6B#Z+$H]4H^8MGC^'`H:$SX%,9Q%%60_N=BW"OAGF116Q^6"Y>.EY +MRVRB%J@G!^]/5`U1OU6:89L"1A+5`C;LX3>+X>(0,U#D`>S,U(B=/.+1Y>,NAPX8UFZ@]_6$POY@@ +MQ'M@1DT$>1'U9_B5F%@]YE=\'_Y[E.(U6X@\_%H!9B&88^'WOZ"NF'Z*,A91 +MP:_`G`3F?^<)<3[T$];"U2;J^2Y!!ETWSQ5B'=BOF:M^HW&(.F)^Z;G*)_`J +MB8H^%YBC(T^X1*'KQYJ,/K%5Q\T+J6HA!4_X(;5./U>$.Y\#\QOXO7*N>D*L +MIWA5I"E(36"L]8%?!S,VBW*(6J]#&^Q/KC]8Z0C:)Y>H91\>^L6T4XSDI#[&>"\<"X.L29PH%?\\%LH+3-%"Y<;P&31S*D8"+.VNQKZJRU"3$:0CM>X+46STRQD*@A76GB<:3\/Z#+K9O! +MK`W(@$*[110]*R&$#7CG;T#_;:U*Q?%*7H\'X\N%>)>\ML9 +M2`DEC4M_K,4#S99\/.CG0._.^M:2\Y99,Z%O#[\/+"Y1KHX7U`]+NQ8OL&9T +M+9F_:,%2^-VWO$1Y1`U%"9UIG8Y#RXL4)(H7ERB?J&'P`P=YT&$/`A1G7%"B +MQ!-(-6"\8+P1(O!G?J]$640A/G5!U[P+EEC?OD"SF*)X8NBAQZ*\B(K%:Q*U +M=?5&PY"AC<.:(EDF_KM[OY^%\DA4`?X.EA/E$ZS^/8OR6)3/HL23K/+(HFP6 +MY;`HR:)<%N6Q*)]%"8\E+Q9ELRB'14D6Y;(HCT7Y+$H\Q9(7B[)9E,.B)(MR +M693'HGP6)?[`DA>+LEF4PZ(DBW)9E,>B?!8EGF;)BT79+,IA49)%N2S*8U$^ +MBQ(;6/)B43:+;$HFT4Y+$JR*)=%>2S*9U'B69:\ +M6)3-HAP6)5F4RZ(\%N6S*+&1)2\69;,HAT5)%N6R*(]%^2Q*;&+)BT79+,IA +M49)%N2S*8U$^BQ)_9,F+1=DLRF%1DD6Y+,IC43Z+$L^QY,6B;!;EL"C)HEP6 +MY;$HGT6)YUGR8E$VBW)8E&11+HOR6)3/HL1FEKQ8E,VB'!8E693+HCP6Y;,H +M\0)+7BS*9E$.BY(LRF51'HOR691XD24O%F6S*(=%21;ELBB/1?DL2OR))2\6 +M9;,HAT5)%N6R*(]%^2Q*Y%GR8E$VBW)8E&11+HOR6)3/HL1++'FQ*)M%.2Q* +MLBB717DLRF=1XL\L>;$HFT4Y+$JR*)=%>2S*9U'B99:\6)3-HAP6)5F4RZ(\ +M%N6S*+&%)2\69;,HAT5)%N6R*(]%^2Q*_(4E+Q9ELRB'14D6Y;(HCT7Y+$J\ +MPI(7B[)9E,.B)(MR693'HGP6)5YER8M%V2S*85&21;DLRF-1/HL26UGR8E$V +MBW)8E&11+HOR6)3/HL1?6?)B43:+;$HFT4Y+$JR +M*)=%>2S*9U%X]O-G4Q:+LEF4PZ(DBW)9E,>B?!8EMK'DQ:)L%N6P*,FB7!;E +ML2B?18GM+'FQ*)M%.2Q*LBB717DLRF=18@=+7BS*9E$.BY(LRF51'HOR6938 +MR9(7B[)9E,.B)(MR693'HGP6)7R6O%B4S:(<%B59E,NB/!;ELRBQBR4O%F6S +M*(=%21;ELBB/1?DL2KS!DA>+LEF4PZ(DBW)9E,>B?!8EWF3)BT79+,IA49)% +MN2S*8U$^BQ)O5:/.J?BSB`++&=..&S-\N(*&#Q]SW'%G1"@[H`[ZY[`HR:)< +M%N6Q*'\`=<9QY8F=!HD5;W/\LC05%5?)C^#/9OGEL"C)HEP6Y;$HOY*JFECQ +MSF?[=<8TBRAX/N(!^C&F3&`VPR^0%XN2+,IE41Z+\BNH,RBYT=1B1V,*LFK:KR&TU_IE;M[*FI?O`VYX+CC*`=W^XI:O_ZN:_OZ+L;\-0W\P1)55J;>K1)B]#[]6=6H,1@QB!=&[.*^ +M:Z^]RR9J_>;MV]\?[&_[]LV.HNZZ]MJ^BS%:%*\QE?&2E2%6_7,'4D'$2C'K +M\XBZ]JZ[,&I5_S:OO^LN7U%]D5CI:)7Y_[=J\6HPZNOJZVH3ICEL*-HMHL8= +M>>3HQJ%#&AK@UO#A9E/3L,:AQQU[3`K=FH8-:;"!:A&'MHPP1PPWF\=WC!F- +M;^Z2XB7?$&)LKE:,$@G1+%+BO0<_>O`G#WV]Z6M-WT_;AW_?%N>?=])/'OIY +M\Y"<<(0HOMK1>4CVY\UQ1[SZTD\;.=F9U_JHYU9SX6%P@ +M%DW,>4OL1>+\VE@RV](4=[[;.;II3-.136.;CVH>U]3>]*/FGS19S<))=\:< +MCM#$S^_X#R$Z.L&G +M^,17+T\U_7&1'1O>:<=&@/EBN%BWVY2VS@0+BY1V4%DJM;"+5:-5W:VUK*8;9&&)`H%MK?:U2C=9::[TL +M:KW5"EYJP5J[;6UKK2AXM_6R*BIBR/Z>RSFSLTMB^_O\_OK!9S([,]]S?\YS +MGN>)L9Y&,C(Z,B1P4<5RSQ7K";C%W?&NKXZX:>"47WG+H +MEHXM&[=576Y[>\O86QUT[\&JN>LMQ6YSESL36+V`)8\FDRV6FO\?CWS=LIX4?U$^.DI +MBX68\N7DHKL'+LXMN^/:W+6YGCMZ[XC?N?#.=7=>?B<^GWD7_KWUSF?O'(+G +M3]WUZ;L6W?65NY;?D;Z#6]P0U7"-1U\Y`3I`KSEXT&((WAOP%_];3U5U/62< +MGVM=/+[ESB??&N#T;H+__>H_/NN__*R_(*KZJ:4])SSK[BS%$GIR]'4ZEGX5 +MTTV!6&ZB__K.,47_(E*+'0QM/GGD==?FRL/?I,)SJFWN>N.M3OZS]9>[K4?6;,^XK9\);Q>ILYSYSMK425L.>M9SBT`+Y^]RM_73YO;'?CGZ[B5;BL\>WR!$T^()IXB5XX6UH\=M382V +M]T`,Y^?>*7UK"=.7T=M;CPKMN!B^/G%W:Z)A>[;!6YQ.9A9_/=FS^/SD]QON +MWU+UE];%HL7[!V(?Q1=3MJ_V9!F$1#/872R*IG$Y$;H8]B +MW33^C6L*PR0::@,XL1-1!J(:ED7.SWW);1+V"\+EO]TLKF]X0YC +MTI<<&RBM`6AKV?+Q(O3[H::)=Q@3ERTRQ,3%[A)X\Z3K&,)U1.0TUYMTFM-Z +MC+E=-"R#TE5#C9_J?,4Q'UH!B&!-[ME^JON5DXW1K9\+`<;I!%1[U4,K('UC +M$F(7NZ)EU(Z3W5-./G7)5[XX7E0]B;D?FSKR'J3T*8LOSE&?6GQ6Z#7WTK6\^0J1OAU\^6__+. +MT0^)E+$R>08B'H*_O[_CZY$S%YSY^3/GGIE\W/AZ@R',E3_)B;.;S_O+^6,"S],#O_O\WU,:PH"[,?!M2N2&.YXROAZ)GGWF\8\;(H7Y/W/QUQL*$T3+ +MGNV&"/O8:$2-`)%#(C@"G-\P!VH+2Z?X->2J"G(UYKS;SH$:-Q;]8,KB=D>T +M?&9'5!]=:0T[X +MO'-QT_)%CWUO>N20AJF0YOF190U,BU]V3G-6.,N<4.I+SJYSHN?!F&:L^4%C +M:F(2>TL84@]#O6-_P)QRO%A;U40?H9:#GFP2_+\/**FJI?Z)^I913X9&"Z/^ +M/,SS#3^PD9H@#@OCB4SYLA'YWB*.Y^X[O[=H642DON"DSHZ>A]1W]O&&_-4/ +MOK?\OR\9]Q#^/>BA19$;W)^>W)2<,'=10\,CE>VVK"&"L3^"M''_'=9Y)U`] +M/?>#$Y>?=?SHL\\^_B2X2[C_SW*1:HV:V^U)K:WF=FM2ZQ1SNSFI=:JYW9C4 +M8V@J;8"X%D:.BS"]TY6B['77VY`BPNQL.$$R(M1.*ZA'(?A +M:N!>"]F$?YSEX?A +MJ1HNV^^SC0J[ZYP6PKB7.P9_TZVV_'+LV2=#BY_B<-L:P",NSN&X>RC4EOG$ +M>7=I/I%TLN>$J7TNN'RS@^,"Y'-T;_(;YW*KK;G\"OB^[JX(//5=SLAUEV]> +M7IQ\`W +MO4E9^.M,>F@YUKPU*>-<`?S04OSP>Y=IUM*0]&L;D):X?G1F',"@&= +M01^8A%RTN>?\G.>V'OU?.T3DDB7]7SQVT^7+6Z?6;]^V$NY3#MJ16MF[7$QN +MV+YM-/Y_^RY^7Z/>5VW'=U+P_UK\-C6TG9]LT;L_]\'>C +MLZF=`1ALV0^JC=D3$!/4_,:%6.$9O\J)-Y2.J!V.G +M"?D]$V."T3#86QJV>ZX%W\[84CZ&>^['$_"M1^/\U[:6.3^M,7>CK%4[6!IQ1">^_8$O(L(M,U153MZ800T +M=XB&7K=QY99+KMRTU_T(QLN]SD?M=Z6>=3[O[G28*KC=;=7N%M'#OWZIV[W4 +MXO?[;?V<\WS[L^=8YWW><([_^(>/GE-'O\05VU(80VB'N2V5,AIZE[]XB47T +MV`,RQ-`&S!7F!U.]S,4_=PN6N@WZ?<#;%^IGX[OL'OVU9:V\1D$THG!::S#>1\)ZFO +MGS;4GX?WTZZH/J=OF=5@GP9$[H`:FG[8CG7N>FK+\._K +M!'__SA56Y.&[K8BWV`&:V%^"K57M@: +MYO:;048U8+29[YSE7.ZL-=Z^I!?Z7.E-,HGOUL&[.$FE(>")QCW1Q6-;VIZ8 +MLKBN9=IVY)NEL>%*^/TCN*Z"ZVH'>6-8\4;\K[GBM/\3J1+7^]XEH^_N@Q1* +M,N?%.2&L?PC0\CX#LAR(E9.;=T0F3WQ21&XRFL1:PSSOZY%3OXU2D"$7_A]* +M0BA;=*8RG?A.I/9WEB0D_#?)$`NK#7OA9^`>ASN(A]NE86^/P7T6W!OA7@?W +MV7"?`O=:N(^#ZR$#QWPK@EK;4X;H6@9_ET%:?!_:,+31BHBNMH;SY5Y_< +MM'+;OS"PW)V86C1'KG/7M^!VI'DH]O68[M.`AX1TV]0(# +M,)V&0'D"9)Z&J0U?C[2"G-0'UXUP"9*9OMXP!316< +M]?D(W,]:T`!_N5:>_C9+@7_ZOQ?NJ:T3]8UP?0:N\^!ZMLZN![EX9?+ST"_H +M_[XN^QRK886-D!6 +MB:"\5-L%>00IK@^N&^&2*:[OAZ!>L,[:&K!F##%_ZUU=#2]]9^>.32V3]^TP +M7YA^K_G'O2^^XKX*?.H5Y]7V[VW=Y>Z&W[NTG*[G\+6>Q^O6V@Q1?<\Y1 +M75;#PL4KG:.Z%G[YJXN.ZEJ\4ZRL;1F]PUC9V!+98:[\#(P#H97GM5@[3)"Q +MQ\EYN=ULN'+3V)W7;+I^ +M4]8(C^XQ5J3&P#`\NZMFL';G4/X%]T7`O>"\V'[1/:%'+[KG2UN*.WD,Z8'1 +MI\=Y-')L0TWJ=)HC2+HKX-[EGDI/*7<9W1UW"=W'06MBV7N,A:XU8:PXW5F( +M[QM`#X11WHB8D5"D]IQO`*=8^.5O+#M[D1,-03T\]JO!I@L6+5S\C65?,$=,H?K1,C,T]V_W:R:V?J]W>?I2]PSDJM/W2 +MF=8.B!OB&4VH"&`PMEIX.L?!7U7PZUPGM+/FOI=^A?WA2UO,!GS_$;QO37QZ +M!^2KX;8E.(J%(OC^37A_NWI^;2>^>0G>Y`*(9^%YBWK^&R'^#&_N""!^!\]W +MJN?'=AYW7]5Y^'8;O)W[HV\LN\!-PFASQGUZ_&^8<,K/3[_OP/]C'UC\P,8' +M?O+`X_"_=J71\-BOL'Z:H9W'/W&!._>H#W:T'U6]W0:-N^>^A2UOPU_GJ#>V +M&Y%V][L_YSF42^_[U/V'W'_1/?ANK7KW[GWOWO?^?1>XI=0O^_DA]U]_'U\W +M45=M;+[_+!CISW*NOR\4P=D':$/DN""+ +MG.7,A3'3VE%'J/J-[:[9$MHQ<^/#]R4W'O0(8Y$[H^P5WGX62`8?3SC+>>:^ +MLUR\+WGXF?OFT_Q#"##-]V-<"[.Q7]^&O;=O;X5?]QID;\6TJ/&)23O@[U'6]J^YK<=,P;^)EAV(M9YH +M/7+BCH/N;SUR_/:O1LT=C0^'?SOF4<`>:>XX]'X3XD!><'Q#TWE(O>WWUZ[< +M^<`XN)K@"M;?43&B>\R&%*1/_0]"#23Q[W7T]_IDO;`@+/YF>;3/`&&M9>J. +MRY.=FWX#4L"/%E]URM7)S7-_`ST84;'D%0T_`/ET"/C$&/7FR@:^\U_,CT7Y +ML4!W_N8B\^/?WG]%0VL.:[0>!L:'-U8]C'.O5S1`SI[;?7\-<88Z<07%\O15 +M[V^P7ED6"6U<=<]%]QP;N:&A47T7+=;VC09*33_96'#?`=Y5<-YI-Q_]8<.) +MCTP^Y_T-\RD4UO+"':V?GK^C=>:\'=]T0Y.>WFC^=M4]7:"9_,S!.2H!_'++ +M)4^E\B!M_A&X-=3:E-';\?M:@^2R%I3+4*Y$2:U!G..>>_(8\2?GS^TXBS;H +M[H>4!YW][?ES:DG"//)JE&M^!G**B$#JGX[LN.B>;X+^_L>-@P^(%/[%7,22 +M6W\K&N2YU:3U'7^U8SR->?WTUR&?UG;L!X_\"NCOZ+.VM\X\$_3_UD0-]>>5 +M"=0;6K_W%="9Y1=&+QVS^*!3\O/^.!_ST[AX["GCOC!^Z5/.7]K_.N]O\UF? +M/;Y!+AY]2G[)'T'>SSM_;,<0?UKRYR\>)'28IXRGEOP%GC'Q$\-R;'SL70 +MW>X:>!J7'#]7Q=`02H5`JK&254GSH8ON6168=W]XX_A'6L[1U)B_N@':K?J1 +MU]S7H5Y?=/, +MC>8C;=1GN;?-%D=1*\Z%M*[N6 +M:WIBF83+-/A`_4:\Z[1#D)N+[GG7?0]*^:[S7KL.^V`%+9J/;Z=4K:Y][L>` +MW>=\W'Y@#A]5.=1TNG:S$>&<#3Z@4QWMI[K'?1]BVN.\W^X`E[:V8YE'WWW1 +M/27L%!_[@?LA8#]P/@1L%?26B^ZIE.B%T#(]RNP@XX`$O^H>`;'-I)K&-J]_ +M.`0C10CT9VS+L%_;V.\QS3?<-R&5-YPWVY%;1(EB'MY8\PA23?7.?VU^?T.= +MXA-?VF+1*/O!9BMB@P2W+'+1/5KN,*C.6N=4[5@4X;JO!L0WEB'^*6?*WYAK +M_<69N+-9_?ZK,U[]^IO3L'.T^OVT4Z=^_=VIAE_F3D.P3/'2K^YR;W)^Z?[< +MN=N]V;G'_85SKWN+]OYQDC8>IR\W'Q#B07K_B[+W6RC$%OIRRP$A +M?DKO;RU[?R64R6K@NODA?,_NW/QC75<6/-\`3\AO+:S7!D'K2+D?/P(:RUWN +M4U`#?X$:^"O4P-^@!IZ&&O@[#"5&!$4[O!O;ZX3YL'&>(:^-^'+ +M<6ZXQ7H2-9!Y6X]S9\-X%WH"97U#\-]YRT,3K-M&/QAY<-2#]H.A5.M4&VBQ +M=0J4.04:-6JDHO&VI@;%`SJH9H*+OC_U/\K]GD]^>..ONRXQ]J0!GM3T9V +M\?=/N>S+.,X9HPWA&#]).L8-+A2 +M\?5(XNPSCN?5#1NTZ/#VZL5S6D)/HASW..A?7_C\ZH;5$7%V[7FK&\P]]SVX +MM1MG/%9'#'GG-K^R1U'Z_N#7#_>L,_N]<:!JT9AB#F:HC/$E50HQ$!JB*D4R-&02HM8K)H +M%@=#O4X0D\1$2'.T.$B,$>/%.-$HQ@K6`<-E.N`V8SB],`IEP)'TPB7?"8RD +MJY9\ET92'$=7+[D(?N,(VKUD#?PR'ZY]',>_O!M*_M&UDG]RJY)&!&<#;OF> +M2"UR:KLZ=_[$-<;^Q)F^HZUAF_&4X7ZYM772#OP[M+TM8CV$NMH[&^VNDW:& +M7SCHCZB!OK3C*ULG=,TG;?0YT$;/WUK[8OB/7]U:]<W +M1B,[4&=K/2J\O34R#?KT0F=@:VO#M(@%OTIY-'=84#($Y.,X]JF7#$_.WIL4LJ.510M\'A`LMTB!:VVJW8^R0XO;6UKKM&/^S +M6_F-#6_"]&9:0RO4%Z9O_%NKA?^W_\XXZ_QSO]UQ_E?C9Z6_?=21B82^'W[D +M$4<=<<:W_WT$_\&_!/P[)I'`^Y&?.;KL#A\^G9@Y\QAQ9.+((V<>]9E/'_V9 +M8P1\/>K(3XMHXM]'_?_]WS>_<4''^5$\:.3\SJ^>?\&(N#//_VK'!5T=YXWT +M/<'__/O_3_X9IA#+1X?$MA9^CL+5,JL)?PX56X:[HHP:X:N^'$#9%-=8@7Z, +M*8S7,$MTMXR!)&N$`;^'6E)B:`Y<*^!:DTJKF*^%IZUP/0]7$:Z6#D#!M0*N +M-1U9C8*GK7`]#U<1KI9.0,&U`JXUG3F-@J>M<#T/5Q&NEM,!=;I8?>WI+[UH +MBCRA9/>F4\3J%:7O@T(N?:XJU1(B>B4:Q'^)PF%#UY9!K"_ZHR9PK3ZS(@U="J%\[,IKHJNIIL8:BKM6=;64'X-H&UR[;ZC=&6^OAV@#7 +M)F-TGE`_K1)1:]7N,Z'4:Z94BVAH5>;,T%#4H12'.IP"IVB(A'&Y9QO]R=%8 +M`W[<$&?KOF*;-"E%B!W#X]>!O<4V_&I`O@S(%\:0(%0P'GM6O1PL`N6LGI/: +M#%^MK&.[A!*K=B^ULBD[8T#^+#$ZNA_B"\-0!TAL[32G"#E=:-9+:/$4'LMU +M@@6_@>9<&^Z]42?KHP:+T92%2*QAH.3[J7I;9CTHZ"@JU5<>5F\?4_?'U?U) +M00Y+%.I/ZNU?@WW/V]J"=5@@%/["2[^M?):A_P25^(]0[B>BPO`L1;V=#G&M +M[EJ:&8*:5"B0*Z0E4G:3@#:!ULX2"NI9VL(;E*MVF;Q9&U4W%8[36RJC8GS:O.$FB%.JDV((VIG +MBDCM+/%6S6SQ9(TC;JN)0NO/@WY0X!1A$#>]EC$VI!;J:1E3)S8U2$BM4=P& +M<9\W2J*O;9!Z3AH5A12G08HQ2'$&I)B`%&="BK,@Q02A9D.*#J0X#U)<""F> +M`"FZD.(2L:EFF3BOQB54/Z1H=.^Z_51Q4DU*'%&S4D1JNL1;]CGB23LM;K/3 +MA+I`;+(O%.?9J\5)M@=YVP"AQD`^>^$>S41F90EU$_9ZZ.GP%NJKWKXP#'>H +MZ=561+;6BFB.4$8W'HA:+Y2R<1%Y:F-$IL9$Y$H9D5V1B,P3ZIRZB$S7 +M1N0%=D2:`RMJ0@-S:NHN!$X":!O0!<[]^1&YX5L1B?RB\;.4JJP3A]L8-[:6 +MK$(4IF)`NU6FI--($&JDE'0:+J$P%?M>02G:8N,HO&.Y-26EJ[AWU-O&*APB +MZJ51CQ13WJ[9*J:<4NOJ5@FV1XY0P[5*L#WRA!JN53!?0-DVMD&!4#%QHGU= +M,_P`KB+%1GL*'Y,R;0G+6C2$Y +M^X:0=*X/R1RAY@V$Y,)K0O*$S2'I7@5(*#.6%\==4"NB>4(U64(F(D`M<(GO +M%]NR>*;/_1L,&VAU!M19(HH!7?"$HV)@9::>8!8",@3((1+*!>H +M;0E0VS)_G*01=:ZK:CI-J'E0WPNAOD^`^C8O;QD3NJQES(3NE_J%]Q/@P!GV@2<:5,# +ME-5>!JV>)U1K"/Z`7`,JI9N`T<6$FC3@>2:,)0[65S73O4-UG5%?@?"C\P`Q +M&^K1@GH$=HJHJEU+(0S%,0N^.#A:06\U&O!CQ$[83(5'V#:4`"4,;WTQ/D^U +M8PSH-@.Y<6WF)CU.#/GSZI;4Y7\UQ<#8Z;X$,A-"I&T]BAJ0E^C.TE?L%3V0 +M`^PA64(U0>ZQ;#-7UY.1JG=EL0WSHW.2LX.T*OA@9[Y6XU$7+;,L4S3F.<4O +M0*^'G(MCX)IUWNF5Z(*M1U$,$W4%Y?,P2(ZK1$K8->"1(T>^=:"--0`Y<(^5#]*1*OAMS5T[9GU$-HE5`C> +MA/`-U*`!OTW\#2)BU,06N_;,-*<8ALH(7)X)7<&`G/=$%XJUNY9F"16N$TZX +M%_*.6FE[(-5:]=*;9,]65M5I> +M+:YM:<*Q%>M*PL@^6.Q(W3O4X8I!0R8(17HGY!BD-6G#50>7A$L,;NN"+W4N +MH1HW&+()WC;?9<@HW*?!%8-K!EP)N-*$F@F_9L$U&RX'KGEP+83K!+A7+UP]<.U`>.!*T^HR^'7 +ME7!MAFL`KAO@N@FN6S`>N`J$N@M^T4@%DLP\Y":@D0C@6TB9-E"F'$7CT$SX +M=11PM01PM2,BLGD&\+/#@)_%@)]-!_Y%J!G3X-<4X&I1X&J3(W)V,_"SB1&) +M_0='/W>4ID)[%O!6<:N-XZ/8]P)Q@V:QS4Z$ZV6:4$UU,((.#;75P1NB]Z&6 +M,7A?@'?HJ]E1W#N\5%4#RN*[SL3?!O(@LUUBGTD==&3 +M2J&4+?HZ'+SR'%=/1Y>-7_M:^6M/U*&K+]H%>L2$`J.LOI90=Y(1IBDM2(EH +M%<$H0:V,]Y\GOL0=!C;>ZQ2.$NH=:"WA%N +M'&B"7N)$UU^S5-0*KR=`]^FZ`^@>J#K8?[#G9!FE^D^QN#55&2>FF"-43T5? +M+O6GYZD_Y0EE"M6KS*GXS"W5<]QG'J$)FG;(A'[98"WP6 +MM(SKD;L@OZ_G^GH!ZJ?':1^$&@$D:7>@0!?71NUBE;`3C`KM6HJQCX*OB#!0 +MD\;Q9'4RA0?NN/4L,^'DHTCQ$3R&"X*/)&4<0B!5ISDNQ75G(J\'&FT$6FT" +MFFT&VHT"#6<)-6T:2HQ.)]1$I[!V=X@^HU-<=>-B>'8'+ZZ7.8X+1A;4HDGY +M1]Y*8UM+RF,2=?/U6J,PPZ"X/C,M-E@\$6O7%6]/BU$(X(<%0KE#K.,MQ6F$ +M/_]7S%LQ%!=BH&,/A-A;/-R1$9WB"0_A7A><;C#D'`R%Y6S^[6)[WZM+$X3" +M7K4GP](=RI@XWF+(/7=#7D-.HTLHX_.<:Q-;Z9KJE)@P.>9MJHZ):2"P71]+ +MI3G%Z,*4&#T^A@CO7OB*'%PA\%N64%X](,2V#BI;("5=0SF.:X1ZTC649]15 +MX92W8"CNW0_UE3GU7&QO9515.>E5"M+ +M42`4CK[!O%1!7NJ05S1,CD&?CTKIQ]4C4D%I(RBK)`C5%.@[V.K>1F@=H%6Q +M[Q62FUQ"?1-:Z$Z@/.\2:!V.UP'J<4;!AUJB#7 +ME^X#C@`ALIRO0#@5`KI_%.2O@1IL^1RC4*U&ZKEZ2DS3@BY)$Y0D3ZA@>6+# +M<($"H9`7,!<`#M`C%!=XJ$/8UW>("Z;%Y&@EU7:*5:]3J;&\OQR:XXCSH+Q6 +MTA56JY-@5&_4,8>B'O8&RKV'#.IU+F]WTG$)505C!94:PODA!H6#(6PQ8*=' +ML^SKU(KK;>A[T/^N69`2S6>FQ%5]*>^04=1SLZ-YK(5Z?VYJ+-@C@GTAQW&I +MNHFA3`DUBV>H"QOHS,Q($^YY0IGP9-D"ZCK#Y#.UTS\ +MXD5M3Z6VZQ9^AOZ52A^D1RO.5TOJ-:R-B4(B%>F<9`G5.$P-:-Y_#J21X[A, +M1WJS0[&12I$G%(4]<614X:`#>8Z3JFQ'V4CT58\Y?[X#^9]H_ED'U<`HEM*, +M6A%-$,KHG2]G#H4=[Z;]<>07HO]@&EUZPCQ6NHV:"M$+%98"?V]`6D`N#/S& +M.SL22S>6N&]+ZCJ%K.0[64(U#5=?JW'/Z1RJ\1RA,K68^VM3JRFE3AHO3!OG +MB$S2@O.<>Z35?@$R=(\TX5X+=PON=7`WNHVN@LJ]BD>TRUK==Z9.+M7R6*K[ +MBGR5U3+(.XFQNB9NPKX\T2GU'_C=@"L94-LNH:CO6)?(8&]KP%%^7H*H,DVH +MO?C%@WYH5]MB*7]9_ZQZ!R&SG.+M3'D&I:`HT1*$:(1O.48!8J62;78APD0$ +M/..AA/`N3RCK=OVE)85^N6A!&/IEJ+O50SY;&*O:T:E"'0@X[D+HO4;8DRV9U7^X'>:4(\&WIRSLX1\0X7*CM,M-$N5K4'ER?U[B>/E"$5< +M5X6_-]">2KI>1.8[KUZ&8US:!1@+J2Y`W+4L?"S62'Z^Y +MW'#2ANY7A?%!&1-I00[-\<2C!Y=Q/-E4.8H&^Z*FLP2AJ"]:CBP;60+\T&W2 +MG+P'?VQLBF$OI5:RJGE$K1'1=),>%3".FK5*-L<16E$YMF6V*=A"P[5E#90H +MUZ1YH7T6FG0[VKKG*@TNR#WE!![YHE0O +MV+*33:X1J@4U^B4(E8$_WJ/@G2%.;,(]2RCDQT%YB?HB5$KM6M'>?A +MVTW536&4S=M!RXQ$FS0ZP2CL#7T=+FH[ZY$>D%=[?2`35MLFW%U"6?!DP5.X +M^[?)\-"-26/(<$0DY<>5YKA0"X%X+MT+/#0@C?KC(Z&:AQT?YS"?!3DS-U'3 +M:K!UL5W%3^K]=LU/U&,:T7Z@/1\-M&=AHJ9"_XMJSVB@/>4DDGU5JP;;LTP? +MFN1+,)`W2TO%DFOT#/([F9'N).X=,-[_M7Y$.2?MQQ6%W-?CZC6V`?S>A!IZ +MKV>+P:23)50,KDZ@]B6J0)PBU$;4)10L4(IQ)"C%?BDU& +M$]4NH=9A#?1QWYD')9CIE4O)A4E!N9`D=:LUY764ET0VZQ:B<<,[L->BS)H@ +M%-(ZR:S>=-L88EF.1AC@:?:02+F$PCGHGBJ61'O_7IIE,96LGB;40%!/P!>; +M@-M!O!@/R?<;=4^S((R6KFG\!TYGA:#, +M$++0K#4PL9]I7M=34&J6!^M10\.VH?BJ>S!3M)H+TG$@HK>OQN[NRX@FT94FE`EOI'H3@M]-ZK?1+;J$-U]F +M"65WBWX#GO!NJGL([KHT.4)5ELGON8HKYPF%O>#@87@S<>7+ZV.%@_\334=. +M]C4=-M$<+V5/UP$O(T0%E(7X0:J][80YS; +M$W;JT6:Z+>%=>K(>AS8\6_HB!@$=%;[$E664^AI5<>4#(1QXE_/CFK>S(BZ3 +MXW+A?;XL+OIJ\]T<*URO)F^D&\9;K8`2X-H1*(>4F!4/VB]"RQ?J_?: +MZV/!TLCH<'IMJ6\"W6'M$"JKI$]S:+HO?8PW43:@/*>J8M5MD,N^DG2(^6^=[J=9Q3D +M93URN-[YM@3MIL[DOH1I?`/(HD`H[X)C8R;HR!@N-`2LL(?73%"21/U(MA(W +MZ6[#=1('X_+:9L0JT8E6I6_;8K/A&%:YG$JM!2.R2R@,:_2L\+3D*%!RM(`K +M93A4FE#I+9!=I%6<60FW'C#/EVW5^C;&0_K>,&-1KO7`.06HH_VO+'T#:B`" +M(\P'0UN3>#9 +MX3#$50?RA9PR4ES!$B2F:+[:I.;D<"9]84VK/3^4D8-K4J#'&XX[1?%H!R6- +MA0;()?MW+7T8?#NS2AZD`J(P1*HC"6D82P6KA83AH?";5N/\VV +MIBKK24NF.4*5Y%.HJQZ04:$6+)$0WF,?P_ATIITGE`'\&4 +MPABZ-E7@FAB<[WCWP*A9@[)FJLO#D=3NK)0DL03N5"UUE$JPK4-<\^IBU'0,T(G"V!\)=6E$1,/=P@UA +MKL?OCY.-1\1I$FM?75H[2D2SA!+75#MB,GP1U4Z5Q?V[#F05_!V!WSE"K0OQ +MFS#0.L3CXBQV!%):)[`FMG;DI_*X#7%%=DTHKC'\E$:]#^T!,@"6LT"H2KGY +M`(EY&J)FC+"JQ3/9NSH2TY0DVAD"*AG,G"B'KCN15LF*\!M[V0._!GY/J.B: +M;KN\&@$ZQL`;I)R\AS7]0;)$A=^<>88J\>D-5^UV;6C\3EM&):;B'L*;39H>0SYNX/M1F +MCT6;P"DB.A9IOQ5X+*%,ZV#_I4C%.H%EC?%QEFL.2!E6$,>=+C3;9)9^S-.GN,R39K)$FM? +M68H:@8TAKHJZ-M0=ABXPZBH5![SU.KGNM,R/:VUR.J+>Q5Z1GQ7S3@6$RI>$ +M$LP92M'XD2`4YGR&Y\!(@#-L*5S-$-A[+6QMTY8NH<0RE8JNM]W%-K_>4+XC +M%-:>^7RY[JC;$5LO.UUSS&D5;1A5IR4XQ-GQ/TWVK0*A81>LLK.!4,H:H(+]"^Y(9 +M,;T.+SH'BX>W)PA%[38!V^WY#J)`T08MYO@MYA)JAK>KAN9XD3-=@[5L2TNH +M%FL$_A7C7EMCTUHVMML/BE"25*?8]_I2<[.([@7NER64]!;6>MTVR6WFP2)Z +MDET#'!U&4I!=3S+7R1RA^NU#;1I?0]"&/V1=>;6H`6YU**Y\BCRA'@>Y!L9N +MBHM79>>D9MU*<@K)!`7.ER=\?CS-*-G.?5@\W,'U/WDH]VUC%E,*UX3W\3Z@ +MD3:?1A*,JJ`4C:[K_AG1B,LHH)1(]\@<)%^=6CJ9"N"Y*;;HK*6ZJE@6.:[HAO1?WQ<6-9YW<`"UEPGB+-F[U,6`. +M<,G#$(7Y^0*V>`9DX&:R1''Q=T^(6RMQ&,L3Z_PV4ZW5]3A(H9`O^Y_%FR3/*&X95XM\?IK`KWWFJA3.,SG`/!6/,)UYHT6T1I% +MKUX#U->G=`OAFT-0/U@$XYJF:!!O<28[02A\@TA1P^NT^(SM**I%M`7N+J&\ +MN2)J=GL9L;K/6/DIG,X)S^JMA8$:KD?A2A-JNWKS.[C^H'Y[)X>IAE%FRGY* +MRY@]GQ71`WK((8)F;'*$^O#B$Z7N+]A3/ES++=038?Z:_U19"]U0WG=TKRE\ +MZI-;"'I-&]37C/^DA1(S2BVD^@Y(!IJN-$6YA!(_**>KNE:DJX$).@=I0GG? +M'S[7.K_9&<$REN6ZL=373AS +MWP-'J&`N$H?[X^,P?$>/32ZAAANAO&\R=8L;:U+IPWET'UX>Q/T8,\2FVNSA +M0;EP(6IAF#KF(-FT#B6446K`!-9ZK$*A)Y0__1*U\ +M]=:.UVXQ18'+Z/%\7@8T,9-F\L*D9=X`6G]C=[4CC]`U,0UGKF_C,;=.5(/^ +MN`#G=4B/3!RA=86RE2BM+^/J':3H^#T(H7)E*?8&OMX2^)TGU(;`FPV!%"]0OPLJQ6M3%^(; +MG",G:QN@#;4"@;:9,DXH7'E0+6/Y<5V;LE7(A(]:C[/*P\2#WUQ"43RJ%IL# +M<4557.G_**[L`7%M#L0UH.+*_4=QY0^(ZZY`7/>JN`K_45PRX<<%84R4=Q7- +MYU1[8(A$@K6Y5!/:CUWZ,:`K9@Q0`W43E?IVI5P'M-N93OBR"=E6=72*NKF= +M7L,^S&]G$_:!HX?BV82F+[$.\K$&QGUE7SB_!O3NWFU)B>N/C.J%KSBKFUW0 +M)*+`2Z^:GA*;CHW5#K6!+BK(W8CT!#P50+ +M'!>.[.\='4.>[)DH?93S#7DDZ1T![C&<+ID@U('S<:`[?O@1V7=B7W<)Y34/ +MQ4T=R6\G8?339OXIV/*(_9(X?E`!6Z;>[(D5J(\A:U3S:' +MBAUYSM?+G%/B``]`WN8)XE0]O!K463B2>2'D9VISS-OU$;4?692&2R621U'N +M*\IU$(;2K08A$HR"HU7@%%;;&I.>8R"BW]_O;1`2VC-",HLEH@7./?0L#&M5X1Q_DL8UU!VB:BR1GU8<,ZJ1TX9!)@A% +M8P_JCV@3>//1;*M[7ZEFW$^S5%NNET5IAK$EM>L>4]1`W&E.$5NVAB6K_-]* +MJVXX3]MD"3OKHS(6H^Y45GY($SC'UXCV3(3"U;$JORMYZTNYIYA,TN=ZP(\?`NRRC(/8HAYV+X2O7&'(S=7_$N%!SPOA('@BC +M.L5QY@G%,=^*3@ZC-)\`$D-(V4;C3$V!4T3)M1K$BO>.B>F91"QKH\J)/)ID +MIA'RHW.2.)I[6B`_-K%0R$_4/K67-5GW:)\F0([K[:O(W\>[-D4IV;CF'O9#U:&]":'J(.RRWK`]$ZW[4#)#]+'5_MI.^AC-ORI7IP#GV%-Y[?)T*I7 +MEX[:HRT1_+RQO/H9/5H-SYW6I$Z]&?HCH40F:5N9#EOT"=I7@Y9*!EI(0A[G +M6JUVFE&F(]OAR8#[Y^%NPGT>W$-P7P#W+*$L>)H/3U6X+JWVB)#E&*1F&<+. +M<5R!MP+>5LHZ>4)-J[3>`:F=0_RLI@K:M_`9[FE1SX(G84:[2((DVR9/3NKE +M=5:)^VC$Y-MY]75O\[Q4I%$'K;,3A,)Y1FP)+_91O*>75SI?(KL` +M1UX,SRZA#'CRX,F$>P;N(;AWP]V"^QJXIPE5!4^KX2D,]XO@7@WW57"WX?Y= +MN&<)50-/%\)3+=S7XEY-"I_VX-@;";PBD[$'*6167D,-9.VE))'?L +M)XY\-TV((<_-'ZME7^R===K^!75E44WK^(/;6D3A6'_L_ +MG#-!VW#YV:#V.Y)LF/CLZ'DZ)Y +M02IL3[%'#PTX(CNE*4THA_W3FFKG&-73+G'GFM']B(-O2\]3<6;>SOLH +MSE*4[Y7\R_0@[9?,-;C"LV%'5G6*8=4I:2"4*) +M,*YM"]O$M<)PRA&7[%JZ$9>INQ>F,"FV8H,WX4O=4,K\W&%>-[X3G' +M<9F&M,0"&_?R;43=#^YK218#9&C7TCRAZO$-6FZ*DA7(]N=,W^Z]0*CM2J(Z +MU%M`5D[""SL?5I6L..7LH(RI97!-\P;:Q:"\2JB>\>A19=?2>MREC#N[<:7^ +MMM(,N#N;.8"0GBQ]M=17"]]#^=.SM9R#7VWUU<:OM:5064+5J:]U^+6Z]%6J +M]SE"2?QJE68IM\_F64K<2S8.KCRAFN'7%+ABZ*L-XID=R#GFN3!;CQT'V$5E +MHK&+AN9XWHUT'[L'PL&P!"U6T-R$4[:;[_('CC]ZSYA)JUH.H +ME60<&K=12JLQB(IP5P/9WQ.JL2*WF$H3U42K/07Z4/:_69N#T>6T4(RD=6QM +MLX?&29V_'*$J;7LJ^4:>RXCK[/^8S/L#T;(8XAG,\+[\QX&J"HRR2Q*';T>N +MI!"?T[R0[(ZMDE4Q:;^3.52"4?>:;'^W"%(%Z0-7WV@7(>A(N*[O$LJK +M;8EI_0#M7_X;:?^QHZ',Q0[L!VD_Q<]BS88\Z26K8WK5QG-L7N\@%&DX5]?& +MD-MZ/ZV)Z;+I4N4(E5'6@MM`QS#TG-Q7#HZ%5:_+$TJGAG/_*$]C?>V%^L*] +MD'NA%`7.%^I['TSV2_!-90WG;3F:4I=S=$V(98#:/;SU;8)0TQ2U/?V\TOG^FV)2.D@JBMW8._`>32,WP,J3#A^K[WU0"3.WDT!J=)U_#X4#L4P;*.= +M)%XM5>_#;7QI1W,YJJO%@FS;KJR(-TLH+\QK+\B=:-4,UZOVL>YGHKT)I[B? +MK4:\M*0]G3C_Y?VBR=6P0L;F>A$'UWX_\7J&4[B^1-I)H1>DN$$DYSLS()MS?0:A#X0WR +M/4/M1$1:,-5OW"V6)Q3.8-02/5V;.N$.4\PS3$:',>Y6NT"H:9@'2.5\93V] +M!^=.T*/`8PVQ:6M0*6&:X%[OO=O,+=1GI,1Y,@FX#\12BQ_GK06Y(I6O="KMG#OY$7>4//I]*$\FCX>\05@^U.`?>J +M5T%MU"6[A,7>$K(J7R^2O1Y*/C;H5)$/<,Z<4S'`COJ*ZDGSW$A +MY>Q3LS[0NA9H.7B7N%#_+3-6:/=G"Z@1CAZVU>54X4 +M]P(^?Y@:VX#3X7O(.X];VP&9U^`1N)Y7AT_(S)<6OEL=3:4)1=X6T`KBXC[2 +MX-)JQT9XR'`PSUE"A4%N%MEH$R@-,;'>3'E/H$Y;XG:Y>2QM,\_;H&;KX,YS +M%4!)N(\O.(RM(XNVOI +M!F1236@3:]C-4-Y1$P3MED\0BJSI<72Q,KXUO0F_M1V]2Z@0O-'6](ZV[Q@- +M.>]-DKZ;)M02B*O.Z1!-#HQL, +MN.<^S[IHWSI3O0W!7?1E.BS<0]&=[*^">UZADOUA];8:5R9IA]!YMH"RKL7] +MR(3*O(PS-.?96`.LQR!M1:36:^1\):4Y,!@VH2>"=>B_$+T=!;A!8K[NM0+NP4+,PJ[G]B+JAY7+S-<\Q#F8:QYETJY\M-U&*Q/$MSZCQ +M:K?Y.)Z_1&TE&%>A%-?84EPX$X7QT0YWB%,NH%X+=;3$J/;GH=ES25)Z$1[' +M$X0Z`6<_COTPOJ2E6GJ?!0Z"4G(-QT/[.S@N++F2CGMS+*F96MY!&VY"U:LP +MHQ!ML-3@URJDDUW`$@R_2:RI=L2"@_T96"T?YA8$^]!P-K78MGE"Z1:N0Y<, +MR*5Z=R6AN:%=M^$^7+=`*.\EX,='UY)&X7UGO]K/LK7C+9`O)N#.DH6(F@B_ +MZ,M?3)8<4;ZX-A2+Z-T)A+KS[R7M]$K4!@*^Q:S);<)=R&-:"UE]D-0XC.R; +M)M1(9?/Y_4*63:!%K&K["]B.\^#%3/2YV<9[P9,BFB.4J=Y`'P%]XURR>#WA +MUZ9H!&5!.(:=9Y1N,\B72:.I(9L]\EW3A9,\!4Y1&(U!;RH&>E-1'EMZC@%^ +M<1RU$-;F5T7,FSE\BHGC_I,4W>-&2M'[5&FV/DVHU6$`KIP9$V-+LP7M/%O0 +MB/Y.LL=IK0GC.$'9Y1C36$>@$-`F.4)YK2**8Y%9SU2][+G2>A..]'F.RQ0T +M"[LD^!5[&;S'_E!0*:Y(-?V:>RB5M8FE#V'RSEZYB%K[OH#F]>ZDF&CD?'D; +M/XX+R'V"4+K$?\6R'@]E!6EV/,2Y$>XX-^`NXA3[C%,7\0S!EC'P"-=RN,Y5 +M5YI0^FE#X+X`KD/AF@%7EE!Q]74=7"L4:D,@KARA5@;>>C=^'-=ZEJ;N_*+_ +MI-<6%NE>*[3=-WH/4FTI1"NP%:=1'D\MM'4R:247_`WM8(4L%NL=<8'T5UT2 +MA/)WW$P4CGV4.%$E#Y(G<%SEG*B2!R4(]>]L^5U"#>>;!FL6YR?0RC=-*&7KF_2R'\2) +M`X#.)T6_O;=XJX-](LLHZ!E-`O4@N'I-VNU*5EGB.AMME'.<^]JD:X&4(&IV +M\SRA#;VDUZ#Y/J<[Z>0)Y>U'RRLH)UH_K]VU-*+D?-%CD(5D@5"T?RP$F@1H +ME%[/!_$8U(!OAS1V1DR>2"F"[HYZC.4]!G&]@!['HB9::UP3==#.,W&B[MN8 +M6]$+P;OG>B*<`?FD5>`.N6*Q^+;+J'"'@WFP1#O($\D+;4'V9!?6D=785"=- +MJ#E#VU*HY6!.,<6J/6AO54HQ.WR*O<"/5D^AU.!W,L$6`(O<%S0[\2C`&X6:9"\&XE&9V]S_9@N.\YP2AM*1!F>V, +MQ)`S:EE5Z/WXF(-G(K$LIS@T_/P7^J/$=9[<__@R)N9I'^\@F-4/O1?],Z%/ +M/M"J\X3"MR:_=4S4M96E18.RM"C\CY8>*_7VX'RM=*GN*W>YO#O(W'SUG$[T +MP9)P63.TN;Z.%%'^[A,H<`2WR^F"<5N0/QZKA4%J:3Q,* +M5Q].`,G*LZFN*15$XHZL*D!F"56+JP4H">,N"ZL<.0KG5PF%^(A"+D%D[<"$ +M97QO.A7N>4HK>III5TW]8DUE6+HA +MC&L#_%XN1A1][04),(S6FJ4\82[0_WQB,8]#CB/J##P$%JJE/!Z,P54HC[E( +M13PFKF9`#&E&A8&+8%UE7ED:C&.#P:@LHVR#5C(HSHD'QIDCE*G"B%JC9('P +M^Y#/<_*+@SRGJ&:<9$G4^^XX%,'S+L$9UP2 +M)Y?%M;\\KJ2*R^6XSOGDN-)^7)5[38+6B%E"Z;TFB<,BW"= +MXL:S3LZ=[&L!.!]QS:N+<04#9^7%;]]'*[%.VME)J*Z;3=S*RSWD?YF#-./Z +MK<=C,$E%,:#8:<'T5`:1C_?D3Y%CWPZ541/M7;5V%ZMK=]G +M=5S2CP/KG_;$,@++GB,46DW9N,,5PRO]G6:Q!<\FY0F%NSUPYZ!Q/,H11;(> +MU"&0MQ8(58>.K@"%,[K"!DX2]=KW_+1>FO@;:$0N":+$]%0[Y0WJBVADFM.^ +M!T;\!*%"0\+!O;2#F5M!^OF]33IR[+"4F'%I2IPQ+>8N8;)BRC./%:3_HPPU +M6]#<5Q?N#$D3:B:^08>EL7[!99JO4Y[*.K4A;#]UJ0>O=04%Z)E<&87[Q\B5%VU(=$/*4J=V9M0 +MDL0ZQS\Q&V4FE^/R>"9>TM=HK=V]L%U\X_TXHM!>,1$TKW,+TZ +M+`-TB\\%%5>IER+=XDJQ[T%I]*$Q^45"X5Z")SY5QI7FZ3GE=PZ+)0C%LS2E +MWA!<9\(T7$)I?F#^`*CFME$I\<7WR_;1I;]8R7V#^Q3X5(\GGS +MPF%\&.0(Y7LR0/D$?0)YX5+>0-/)<^XG4A]DVA\%_6PNY,LO3:M=X)K8Q_.6 +MUB2@'+B0DBWX:E\E)+Z32X/D\> +MYG-VK`V74"/YG=`KA&E">4>^3WJQ]\/RL<-1<6<9]2BDH-:.O2-*]>ZO;Q.J +M,J5*;3//N6?YZ`";.VUM5V`4KH)#;:`EC]1S%*.87X/.YLAE/,)H3Z&,%+W" +MM\5#:31!J$9MC9L6:RVDBELHS:I_S<]D:;T%L_?L%W6$[X;N<8!1+H8BP3LXWFH@[8+LOS@ND&@MM8J$*YWD]4?[P(%0\DLLN2==7!'SM)1=$6^" +M4-Y+&/O6#O0K(#**YM7Z)J;H?DFG6.:C=J)PFM'J#^>?(.XTHY3M\$C4F/W2 +M:&<9Y9%O/$A^$4G,TUF2TV7E&A4`2)AN,*&D1 +MQ8OGN,*+.C)4+3'>PI.G/OH[Z*(X2-^9/OW>7#+4)Y7O./88+Q-?W +M(?<0O:(AOTP\9Z250)0"<7V(4&B;_MDJ[M-F,_!5@WT]9T#7K:TQ;/?+6ILS +M)T!-UO"JM6UD)/:%6O3.T6>DTE_F^AJH:3389YJI/)A)X)J-.$*C/D0H])N` +M;_&K#3WN:/2=,A3M.KIG/HWR.3]?LVM0AH@ZLT,9>3YZUPEER(>A&4K*/*%. +MA;"Y?5K39'N.A?O8C\ZL*N#W7]8\^BN8"GGVB+*/FF(T]15,L=:,R5,U+_2@ +M3`N\^8>Y;SA4]0@DP;"B;H.7Y-:@GI0ZV\_Y%1/5#/J(G"U_RMZFM_ +ME&:5QL'[/*/@ZU,57YM4J*?1WD2E6/HZ47V=%0@EOZ)3;%9?9U?$.1G>)[ZB +M4W0JOIHJU"#4KDNH*S/\]3,\A^$Y3:@!]78`WMKP]@;U?`,\ +MWP2_LU_1G/PF>%,'=75+ANOH%GB.P',.GG,^*@=OI16U[[HX(T?#_6ZX1X&3 +MWILQ[#RC@)_"4YDO_N!*?4&5L24U^P%3>-^=&*O4Z&C^_C22MG&O[W$C6,*) +M5"IQFHZKK5[0G*V%X^/+[_L2#>T_(-3)6MKXUZ$L;53X/4^?5LD!="H8_^=5 +M_%E&H:W/,^6IG*+EPMV'QG*G:?G^D[RKYPD53&6B2L7&4N0Y_L)I09GI"[H4 +M?RTOA5R!#T%OEQDUOW="8!TE0:B,LHC$.V3#^M./%H,?1>V7Z\1$>PC`>L'X,)9&.(\GK?K9#2T-$I[U.(]!"HT?U[C06%:WF +M"+4+_8B@!I!OB;U6/-QY&G5<+-$'+;&G,_5VGE!'X4SDQ\4V.Y"G.IJAGT.M +M72`4TM.TB^<3->,JXU/%ED']S2A\O#T +M!*[:H6^:9D#]N"4V"&7;FSF7"2-*(LQ-_;.M"Z@GH96L[D.$6T +M.-OR$>WOT7W0N[L8U^O`>8[K;EX-UGN2?^][]N3Z*W!K=\=[I#&F3]=]:+A= +MKB2;%,;&LH3R;GVOM,OUSQ\>L"LTQ[E7_:^Q8IP34"721`*U]S[T(;Y2BZY=W`] +M6UO\B'NON_(_TK<)Y7W_/;+DRA*_'ZBA5N\5[.T3Y?N5+"D(Z7T/D/OXE`\J +MV[(9OI:?6ZG+^$FIYAF%95K+J5XY3*H%0FWF$R9`ZB]/59S`JG]E +MJ@E")3[1J]I`A_M5I7=THE[0A.?R7O`>[1T.4E.:4"6:>I[LF;TMT-+_BVBG +M$RDA2RCO\B!-!;DYR*Z@T>4(A39+M.J)ON7[<:>7)W&?B`5W"^YY1L%3N!]W +M='G2[L<]7)ZLA7L=W,?TSK<+A,+31WIJ66*WM_'\+\YO6R"Y#V8V2GD&HI!_ +M'@2R_5[D*"`+VKV0(MQKX6[!/4&H.GC"KQ'U5=)788]1*;J$:H0Q^J#>L#W. +MXSUX8^$^MC?LC[OI,S2_QR_CU!>LN[&]9/G4A>^SA!K?6]H1C%\M];5)O<\1 +M2H>UU=<)Z)<25^M-?I\_@^4OT24BHBFJ4)BW\7!O5'$5.%^D![6D\,LDG3IH +M3.-!KT2Y29Y)^<+P$:<)$7IWL`E?Z3W:,Q&*=L()RK5O#XCQ>`KI$@IK#L,X +MS$\;)ZCGI'I.GZFY">[4]*;$^22GHY"SO.ISEBRAO/\=2[O$1?R]8??/YP@5 +M/#4IH?9'WQ7P[IP_57!KZPE5Y+ZD*TQ^PB^D(^'V&/ +M^\$X>M3.B02A@G$8'[&E>4E7F)-R"76"SJD?OB2[#H'LFB84C4$5VD30\B+; +M53EVE,X&0\\5#W6(OM;.'*%&HV5&#?9ET3D:^_81Y2-#ODN/,$&O`79@=#!O +M2,H"H4+*Q;T#9R]>(*<)]4DG)]'Y:832_B8U3[1P->I?[S*7 +MP_&14`>.LXHGQH`Z7WDWGN<4<9S%\6)4Y3B[ANJQ0*CYZU!+]9RQY6,M>>D, +M=0M/GDUQD<].X9BB1YYPG<&S7-A;GCB"O$TD&/7LNV5]QILPEOO2W]_E\9%0 +MGU2C6)?ILT<>D;=VH-Z.>`$2K0 +M#OFSAZ/5DA\]#V@VU5G@%(ERK^L0=GNG6#^ED^:GM[Y+M$OZ]M>&;Z$BM]!@ +M(_71Q-=\Z;%9T&EO)#U.A-^QVI2X\5"2.=VOL:YP1HJLL*?]'.AT>\J[>F_< +MV%>JY32AO/<:B7K%G>\.RYFR7].<2:^$!#F4OW_H:UK+/-`.F6W3-D1$-$^H +M"#RM0PO$R*L3J`^!ADEE?*F1[H6O:?T19Q]$9CZM+5TX7M#3O%M=T8!2D]R`MYPF5)?]YK])>(:/;=H!#3`QUVU"(0YTLC*(% +M3A$0/&PBZ6J,!QOA3>D,4F%'J;8>E4H02NQNC.G:Y+F=-:G9N*LPTVK;0X[G +M$FH-2!MDM6.)KF6BACU49`RYK+O&04N]-,>%DC6NT#R-/9[SI6L:Y:8LH5Z" +M?/C6?8C^U$?E_VJ^.OYY9:D)%+T>J2:J_#;..R*6^%^E +M!722%V:Y:X*F??)MA7XVD=__[TC\/NCW*4VH69_@A1;[:)90!\H2>,ZHT2GZ +M=@-'?K@C1RCOT'=)/R,Y_W\^.$`CR/]O2*8AGKDN'=)*W,)=2J.'5=!RXU_ETY9 +M\\:(,K_U:4YQI/,>Q$"-VSO=SA**5INQ[9">_G"$/_N#7-,%?23'J`H_0Y6: +M7?Z`W&MY]1#@YMYQ0W%$%])ZK*V:=05A]T +M(MIDB![J+/G@G[C(*N+5WQ7Z2DO[2P#Q#+TYC34YN09M6G7!*L[YHA-,*Y#"!H5(`2=55D;;2HP +M:KW=A%8CZZKXS-2&(2.%8TD(?;%825N>CZC"4$?*&NK(BDT=320+W%RDV:2I +M.*<)@`2AVE!:K-B1$J1(EU`C^5S34E'Z_/]H?#R?=7?L?\E./.>W:@CYS;8) +MXG?OD`Z/=9@[7\L`U-LRO-<-^^)XM&O.X-D/-4Z>4&%XJOZ)(^VBX[#'?9OL +M:6J1?H$K%S@N/:?:?5P[2O$:Q7XDMW;(;_A]>]U\>]Y:]O)"O=_L<(P,AA9. +M@E`X*LW+S)=%G)NEW9\M*7Q&;_N#ZTZ4[C?*J6=^)8 +M>PNAON;_I$]6MF>>4,/QTJ`L5_B&EN5\7H.]:Q_;YDPE.S?HZQ=0?2'/N7=\ +MF4>IH-2KU>5O'\Q!W`O&(D#Z!"S07I/$\J[9?P!ZU5E]@"$XC4= +MX$R?W1\?#IF[0)=1I[`CX,',4'PMSZC/E<=!"-S'HM9:"YRBHQ5[HW$9 +M)9*VW=;P31Q_&\EO/]D[3RAOJGFZ7^'>V;N.8)\6E`^JV!L +M^J(5*W"*.+)<]2%93GE[!^-TPD=5*7_RV\SE6NTPY,O[/N\'P#TV-*NQ%>+: +MU1I+,$I94^AR8:L$V\,E%+8*M0C.YD)*>W]<\HF!I4D3RGNE5!Y=D@^A)-YU +M(#5`.MEO:[F0]OLT.W(B7*03W<[>'?&7%]\B*40*_H8NT^Q&>AR>\0JM;B?2=? +M_#!.]Z=#L2#W3'Q'IZC;T,MQ?07SZ1**=K]7>IZ1I7RFOQ.D">*:E7P:=(_L +M=X+T17259KH*>M/,$0KUIZ8`C5$);A[DDKP7BN6_H[03*'6(YQ1T;:!O-\DU +M5/!3?$*MM%6FANT@5Q%]!6P)AQME$H0BOH!>QDBC.Q#I$@KQU>H<"WL8RDX3 +M:J1Q<99>WR;42!(:S5L!E>=6Z9K0GH-2%3FG]6U&Y3C'97Y)#>:K2&,%0N%* +MO/<+1OX.D(:N&9HI+G;([R**:A%WK>_CL&2]_M,2KTT0"F>7O;LFQ'1>B$=< +M!^_NQ9-76SI=0N$>2D?8;!%Q!O#F0Y$W1W'G0">.6NGO,GW5!&:\UW3R2>)* +M7X9>D_VNK@GQ9>O`W8A?@(^@:>0(Y?/ZZYG7>Z>6\\;\=_68]@7TQ#F^Q.O% +M&=S+O.6#\8)"%3MT;1!'W[.?U]74GBFY&E&T(P+:R^?+N!KAEE)-K`Z.,-]` +M*_)1P)<#<6/-NJO]7COT?(>)O/0*KDFLPWE8AX!,$ZI>CWI&J56(\U%O*79D +M"<5[.Q?(B7`UH@59?VXECQ9E5M;9G3F+O?>A?[B*_M=M@5%%YPU.% +M=)YZ0%!U"74"A!VE:)STO=,41_D*\8G.-,>%^;D!N,?Y3;$3*.7RNL]>I.O> +M1-&\:X*O:U,9FR`7=Q3;JV#BBM#* +MIEA!Q<6MZT*>O$LGQG0;D"T]Q"6[=5SD@;::RT2YQM*<2ROBPV$9^'N;P7@SQN?(XT]U^W>N<&XMDJJ;67F:LEYUP7P[W +M+*%6PM.I\%19(^9ON$9RA`K24L_#Q3;OU^.8`^QCN2Q/J&"/%1^-.T":*1`J +M@M+978=3CZ5<0SL2E=\`5`Z77*-S3_2NO*!1:88^CFOZ3S#J0>CM)^+(R>4\ +MYY!%9,^O42ZC[@?4*IXY#5)-I!_]DSM>FE&](,18CF,.B7Z\A^D.C$_%G274 +M236'V>0?:VR(?4=AV68I?W-O?AS/K:FL^W.@[NGY+XSRVD?%\H1JK.B+WB$E +M7K$,:*+`<6$-T$[E,*W_>\O")"G@>8)X4IWTF/LF7?'IL;R#4W&VH.^U!*.0 +MJSUY8,M\"]MDW>$QU].Y_Z33)M*$"JY@S%*VCOY8B^<9$FHX'30H@^4(Y5N/ +MU`TSND-ORQ/*^RN=W36L7(AM6M"YMYO*QM?RD5YF$!4<[X?=SY?1>NU(ZX4X +MTKN,(M_K3B=H;VH>U.RD/5(WA.C\\C2A+KC3%#/65/,*V>ZQ3`O?FQ%[X)!J +MN6UJM\XS%@@"X2"MYX7WTMG4F$>"Y.JI??$8712]V\A3MGS[VB" +M[)EZ],Q#I>1?9L]$J')[IBB=D26]UVHH]Z@_]@3'VL^C.#CW<-!,2GM%L':S +MG"\ES=X1D)E,/7]8"_)]CY84R`_[6K4BJ-;TM>Z1[_%Y-*0?5N/&L@S3V+(, +MTUB!4(F_!6CS_6(;649JZ>AXD%9((]+)O(]D>?GCL:*O-3ES, +MNJCR;P(]=D%OM5VM^;[*KTLH4^6:K.I!1CGZJ@7RB*LND'%`DE2XVOHFP_T-1WG1$?F +M"87ET"=/8[V=9%?[O6Y_4:0*C()X@D@:/2$^=R+D'JWC>YDSQ5+B^S/XY(3U +M^[FE0]R.F)-$K];=J:YQ_O\0$57Q=F$:%&>O[D/C5$X/T"@@SC2C;%"]S4LD +M[D#OA#O:^:P4EU!>L5VRO;[.5T7KSBH\>36:@V,I+(:-8)^M)\X^]-H[8?V7QR7 +ML@HSE5681?-5?"B*C@&HKLTYSID\Y(3O3YX_8HI;%.4J<\KC295]_^ +M?MSMT]S7GXJXI2RB4$)`2EX4R +M1(G+X8Z4>*K:8Y,CU!E&LD3)$YD;<2U,M\/H3X%0Z*<9J@%J8;I="_?JWNGV +M0=I/?,&,%0A5J0%4SIW(2WQY0FF8I)F3G6**=P?A?CY"F;W0'5<;#J+,,-KW +M\$FP]!Z0+J%Z/F:_%:RM.C*D:\1%:J3G:Y7'L!X[RREV +M]P`7>8&M$*@_74LASC3:95>H7>8NT1S@<97SLZO;55PK"(D[OO,^ZO9GE!XT +MS,Z_`J%&HF3LU]]%.NO7W'.A?HB5-4^/NNL2NUQ +M?X/B4ZO_(/NX'!=JIS5*MJ<3<^;3'CR!EC=FTDD3J@GGQK'/8!Q]0LY0S\^J +MYRRA'(/]M^Y25J7>8-C[5KRR)MQU_TE-I-<-5Q-5:HY./,_/V74\PO#;06V%"[^MY_7O%:D>RN>)Y2EZ+P0J+,]SZD>C/.%A#(1]73+`2>C:SXM +MUR-JGNH1E?*T8:6H5`E";<,>UL>]E;Y4[UY:2R>X1AWHD[:[GMNQU4&DV8<] +MMM41FYPF`[E3:/?24=!7T^MU:_\4>P?$CNA:K)GGW_)7<+*$&G:=24138W&7 +M(MK+K=>S&&,MM(5U['%P1QO1\19:N3H@JX,\0:A)N.]QU6XZ97H2O#U8Q8&A +M#X;G`J$FP]O)\!0%[2UJ\HCP]"]-_[1Z>:D_PB`M)3\>=MTJ<:D>K0XXWZJ' +M^SKQ(4)]K4K)3*.89LM.@4=YE5#H%T*<;O+8<=J^>*A[@2>:DPZT!5G\90F% +M)]"SU_TH2"[`+4'39'N3,U+B1Z`_EN)::AYP1KSVPYKGW`_KZ152']Q#HVGA +M4E]>[2WI0X3`6=AKWJ)U?+E!MS;O!E5EI1GPK1TT2N!Y%(2J4M)UG=(L&I54 +M2ON'KC9C[@9?2D-?9.CEZ`KH%7O+2Y+>H$?D2K^R4NVOQ9QD-Y3)JY"?SRHY +M&'L<:'$L3Q!*S\H']V6:>EYZIAG+$VJD&5U]*DV!4)5>R\@2%&T,<=7?7B@E +M.8&0XFIL1/,XP6?$@W:/9:NK62A/ +MJ+%MEU#SC7[99-@EJ<]XE5:(FVIL.BTM32CEPS*.54XX/X\KZ +M<6%*F((?Y[YB&W(F\M?AQ^5]1*,RA6]>8SNBIS'FC6(?V?D2"O??0W[0[SGF +M1^PKA2H0JJZ*4^GY%H\L"WKF4]ETJ>0F+4<;;ZBXWH,[UL:'I;@2A+(A'/M> +MX5+4UL#]1Q_%O7,X7^XFG2^M&Q-U*SU>W+*'3L1.$TK72[!V:?7`8&TXR_F" +M5*A3Y=0E7FU@-J1,K4R#2A0`R1 +MZY2&DK`$GML0#74+%[5A/+,T^SV6O_B$B8'OX8`>GO6UJ4)\0UT_@"M'J/O@ +MU]_A6@67C?8._\4I4E_X-.A#')>JF\I:\'X+7!2TN\+W]"Q&$.5-*=$9S>=D +M$;621N1H:43&7M*#_@\6PFAHVXFLKM7*U#)*ST(-S&64&DEZ0%;ZHM=E/NMS`*W):2X7*N6@D/7YO>H1WI>X1P3I5GZ?>AK2 +M@UE>+O'?'Y&TAG69^#[K0ZI&(X$:K2]1C_M]W=."U'.7A>ZZ2M23)A32D*:> +MWN\S]0P"?>@K2ZC)TX0X65T&7#K.^Y`BO_*I6([S5>'[H_+\K3RA/LD#"G+V +M`L>%9\2)5X&;5P_+S>5E-,(H/_I8UB;THX\\6GGV@&>9(%2(VFX!M)WIB/<. +M*O7+S['G/?E66WZ.M7E(.Z8VW-%+:?N,P? +M^8[C-2_,1XEZ(`5+MZ[?KB'.7Y[SA:T+--&OZASB!AGC4S&=K\)E +MS*--13$]LM+6C?3M'^C1O=+V.SC_F_A!<*Y#]T&:\U*S;G"7[@^T5N[IT?P, +M(U8Y9YO^065K#S?3G"54ID4<.,.L9IUQ_3Q7EB\]3UBVVE\-_.L'FI/[:^6Q +M?0>LE1=^H#6=`];*.S_BM?)?B)B\W"_C=T1,ZS^I@,Y`]<4HLWQ&2\>K2^1> +MKG-/

/\89\!".17-(:DM?[H_(!J\(XJQP3<6\0/;R3Y*9M,R9NUS+3+[L +M/'00[H--/7H7C*89H-6>E)/G%'LZ''.HPT-ZFHDEZ`?)&$_'%J:TF@U9()0- +MNA1:=#=GS&'/NI0_K&SMF]KLXJFY/*,@ITJ4ID +M3P"9^Z$O*6QR)F**)3O^71/0I@P]'N8YKCM,LH69D;FI5NS[)TOO-]>FO,>K +MB)L4?JAF'CH1*8X1T6GK8G;$YC.XT+YM"CS+*TA*TV^!#J+PME8_*XI,$,H3 +M2C_P+2TX[M@ZFW9.N(1"B7_Z.O2-)ASD@QOJ2TC,:_H*GE,HY5C<6Z6M0!3* +MEEF%>ITL\K"^<#>"`>,UYBV:Z9>8YQRAIL`3EFL:W&=<;JVGL7V#+_RO11-1!70WMC\5%NY:^80A1%^;X$X3RKJN*5;:.N+94 +M5O?_=#MBB07JC[7H`6N*@[N+O/8WXYB#-*%,//6B&7=X923F0S0;3J-W"<]U +M7U$5RW)G>-;.BCQ<(=<`9 +M?RUOTNFVI"W^>+Z45U**T3?]TVUQ;>&S:TO[8>F\`$)Y_Q,:4:?%5-TKM58> +M'<%^4O1LZT@SRKJ.O$D?2;R9I2SR.`H\[`10JI$U +MK5*`>V2_$;,X7+C?JL?E6DZY$^NM.JI:T1>I<='*OF=!\?TBL9F +M?T4#ZI)0-Z@WWE2VIKOWF=)\^0/PV^6X)HI/](26OJJ2[G%/!\[^,>4H^U5" +M&3'@,2A-\1CBS.J?;Z-]>2.>F=@;=7.<(IX@`^&)#NA$K6*J"W]O.CTE/FR. +MY:]BF2G$]`2U$?.FDI<+HD:1M"T8&0J:8W +MW\[YJ&4J'N_F-^)^ZU]T,-E`Y!EUTQOQ3^(FA:LU-VE4\TKH`[QJ*.7@65FX +M3R`$=[D944.X6VW=X33?^-1M`0X`DLS3Z#]Z,Y?1E'0F%:`V*&_CPGAQZ?HQ +M2.Y)VV74*O;''(%[#8VOUY*$17,>@$HSRFI-X9DU9&,"(_%ZY%#]PC6\%D]( +MIRG+*)4^I(S(+LR!WB.(<>4(%8SGTKW%MM!0AT,G@$:V-9&\2*A@CB]5N_:\ +M/^[QO:`4"$5>U*'?C=0[Y(\/'!4&Z/R;A7A^K76F;0XEO<2/=3OVTJFV!O=S +MT'+,?;N7KD>)8=\K2UU"D0R"?AII9:P\'CJ_@U`<3ZL_,K.O)R%UB"RG&`BG +M4Z;R78]^ELZT#H3GDS9RL>^`NKZ%\K;_>E;606_1^)J8X]3B;#M6,7#TT9'@) +M1H5Q/X:0]GI`HC=`I1?MNBC +MGU<2LM=4RM'!,9=X[(/Q5$[%M<*KB*=+[R1`&XK\-4JR8OY5Q384O-/U^8[- +M]YIBVIIJIT"HO>Q[77G.8IW65*>&HC;G$LJ?SU&U2=J<1D-\Z6LU7Q550!.??H/M +M0P.YQWQE"358X1U)U(Z.>8>70.VUB;4RIFXG=_+`&)JSKH;#SR_T4H +M6GWH;74,2)$\3(:3#NU6K?J(RNP2JEB\,=FSE]=LRU:Q#=9DTP-ZW#957D@+ +MWO-FW-?2__AA/$LH;[`\'E\3QI6RC^MC.3^NC*GMYK4%-(SL(=9>\P-:.SEP +M)P*OUV'=%S@N96^OVTX8"R2VGVXU>1W%==#H`R11/KE]!:U))JY3/!I/MTV3 +M3X8*:0A[BWN=EH;*Y531*7I`5B4)]?F.-*%>IAD'99$-9YV6"]\(KHF>R#7\E%I!S5WGU]@=>MT5 +MUR0+UVD)F3R\M(L#5F11,Y/7^[W#CTO7\)S46\JF/W&]EM)(9OY#&^[<)Y5T4COGU5<4E>2M0DBRAM!U361EGB*B> +MO8X+Q\/_:XZ)Z:4='&_I\OYF?*R@XA+. +M-IP9:U6GK(5+:,R%_(FFPLH:"-99XB=*9B+]5?=>81\:,P.A7$8%PKZIZCM8 +M]VE">7>-CV'>1"V\E"7Z6HGTU0KTQ7'AJ=6XXRG"'M:]KQ1IWNHI-<.5^XGF +M)CZ?`3WO`KTJJ-[E":7#:!LI,1AV'!CHJ:?]J#E6^$F)\$DZC+]>>X.6Y?3<7IGE@*(/EU!,"X%=$6K%4TN1:4)Y_:XII932HE&./XLH70JFE*"-(*GI>4XQ2"EK&B.Z?[# +M^71D_J=Z=#^,!K3WIP-9.$RK35-Z&1F!^`G.?O3$X/Z'KZZU@JEA?C%*SPI2* +MB;8K:#,WQ/9I??6Q/*-VC8NQ1%0^&N"\HW=9+%:XD>75"K[/+`5Z-G#E-*&U38Y(, +MSI(>28"">TWV9UIF>D/Q9`-WX-;H]2^VN;\]<-\YQC5)_N6:417N<-RY[W45[UOWQMW-LW*>9-YEI`>BLP"LIF +M*#F\LA:HOG[NU]:"4@%24_CG7ZAJB +MIDCX/ +M*A!J.!V[;.[IYB`'R/M]<(7B%Y2-Z=M!^T+XYG)<@/#4/G>2 +MBM1)DWIG:?IF)>?@'DJAI74<"<1%0S371/R>4!=HCSK*WNJ"$,3U>T&V0T1? +M'%=OV,9]Y.;L`[F3N1WDKYNU[!LQ2=$6FS)[A+*5+49K&^FM15$ +M'VF.2WW)W"%H#@'WS`7ESNPOM.Y>)GT2ORZ5)N?GR\"2]PIU0B'4JMDN=8KY +M7^AVU*VQ;(WA>`_*F,@H#0S>%W[A\V@\N?=JG'MY15D,,(+DU5M8!DBRM?_? +MBVT&6H/6`6'^JRU&-JA0_XE;_-Z!]:].JWC3IQZN69?C4K5'4LS_C?.E4N)K +MZR;%THQ2[84M159=WX<406-9K>36+*$^C10H8C%O$WL@,-6*[!ZUBIV[15.. +M'AN]IU6NB4XX7_GR?/4A797R176&Z[6$ZDF(`_2@C%FJ,WFK+V-BK78?2%O4 +M'PEEC!IF-`[0FTLHK[6\,G(5[=D/,^T*):FX!>DD3RGNT +M+29.43K:0AX9GJ65#9;%LIPOM9LHN(_,;RG<#\/YJFC=#-KS!=[E_=RC9J_S +M\@C2[MUM,5WFPFU*VK8KD8^CQF:3A!*7`B]=1CJR]0I#U.$ +M(CUTMS4BC:5O#_*OX6C,@#Z1O5WWM'PP;WK]$=NV=5(LQRBDDE$C4V*>4,3_ +M<);M.[37U.<&E`MX5[C=U\K?FQACNR^NA;575@/5';+BVV +M)7+^**IY*8Z"XYE&>^JX/5U"!6O2M]@XI2ZF^72:XU)C#U(0[;3[]?ZXIG#L +M[UE&$9V7EPWU*LH%[D\CE*:#_ZJ"3'^W+8;[8O2[=GB7)Y1W(5!(]8&]U:MB +M7E8@%,Y-D.3^X43:H1H<(<0$D#ZV4!_ZA'43\M=!J`-F^7NVE6G"[A:?,T$M +M?`=R_/K0',<[HT3S2.UI'V54E?-#(Z#K9K=4ZE:Z[K6,B9;ZN2U*._$1:(O$ +MO5?9\J,_/C]%/3,PR',EM+[SM$J]P"AC-Y_OAWM7,![<06N70LD[.$6'?,SS +M7@"0S:W6%/FO123:`S#J*CY-F*11I']`>K4^JBA-/2`F] +M2F<2IQG5(U(>]@ZTN]M_4*;ZEWNAY=D-IM6Z\=[`;Y+O&34Q,#-#OY_O^$.`*^0)I7V1E(U']T5B8B);VA4( +MM0SGH!]H&-'N0=Y%*598K@5G'\C_!*$N4CSA:N03H]I\FX67E5;@WE4F#07& +M,>)0\[A6TH3R_C@JAK19I<]/?YY'91UG]BZ?ODP>&RV%\/XQW9^ES-WERX4X +MEW#IV#)IS[N(VS%_5[`=3:5Q>43W'O6K>^^'\9%0$D_M";U`)X=9M"8CHHWJ +M71C]?_U24\YJ%;Y.?5VK:(OD+T+1>100^X#?PW:S+2OT2]QIXO[2UYI6\?IC +MIQVUAXK15*?IR?-LQT[!<_J72LM,IW!W':[VX_G=;Q>+0H7`$ZRRA`J&@Q!= +M@1!=N&*7(Y1%]_0M>O'NI1N$GD-"TF"^L-?)NQ'U(90)4[,AIYC'RM03A-(M,X52Q-2OI99I0IM3 +M2-TE5*UJ&>1.$]676D/5/=H7$JI9?>&M%ZIL]=P>-T#\V;N9%ZI6J2VUBM\> +M>)X.H:@L0]$+.ROK/\3UGU>YY[(%ZSM8TX6[?3X1.&OK`*YR#U%A8-33M#[P +M?*DO)`BU.?#F!OV;/&BUI&Z!9Y=0HIE\]++7TD/A#C401?3F#(TV:4(98U0] +M61W.:?UA*$&KT\043J-$EE`4KK^5;=-Z,N2)$6U#+J7=''-2.4)-\\.IME2_ +M$[?3^"CS*E^_77S#YCZ:%[_>ZY,Y_*UR@-\*C.H+.S>B[1*DA&W7?'GXW3TMJ(>0@<:^6OQ)()6?_D^:2IV/>X%TC4M.9_XR[]VK^A51G&U$^ +M-T#7K)*NTH2:%ZC["P._5ZO?63\N3[T9UG_AO<&13\_ZW*1W_*%\@OXG[N7^ +M**@_]@9J%/,Y8YU#OI8+A#IB7=1&7Y;"V_4SZF&]NWXFLLU-*Y&*OOK/N+Q/ +M\Z\^%<^P^]/NT_GZ1/\3C"(_O*)36+L[O!6L2QIXE@=2X@UV*GV?KUNAS5=W +MM8>C,^8<;4968BT#96;O4U+'+'%]K!T]]5>M>G5I%=(5GG&L9JYSA**>(-1L +M9V`'PE_4WH/\?7Y/.YK#4>_`DR*4U!:"D(7[@AJ8AWHWKDS%.<1F%4+>3PQD +M%4M49_>'?9_N-)N(9Q^VP?A(*%NU%_IO]7*38KJ<*:/5-D$A=>_7-$&]PF:> +M6@,,(XKG_*&O4^"@:4:%V/?[6[EI:AYSA41DK +M<+[HU-9BQ^5$/2"/B&H7K5-?@XQLPK-Q?Z7+>*6J08VX=Y00D5K*26WB5ZP9 +M*NN6J^:G1&)*C/)HO$:[J\7F:NG^2M,JEHW:7\L`2FK'Y_2OM*:CS\@.>@_0 +MJWI90@WGFUGW.JR)'*'"ZU)V+,.MLTF/>'I&$,\X)-0M_V;D*Q!*PKB!>9(C +MC'SR`:*O$;PE^_;DA"KWP8LCP_-T)G'F&-8"W`=X3+-BV?[Y]@7]9]B'4\]8 +MT[F>.-TZ.177'Q]0$G+G!JK-=;*64',Z-Q&J7TY`>W*%:NG,$JJ?/%YA' +MUT8U4P=ES''N(1_>.!']7.!+"//6**(.O,MS7*%=='[JX:L8@:%P/7BJ>BX\ +MP#0!;W'E;Q6/ZL1%H.=-P&>@'OEK&JT05<.E%E^R8E=`>=LQ=4AC`_K_(I3H +MKZ%36]?MP1U__+L&=Q3VV_3;)12=\6OSFU$?\&FFE\-X=!F=>`?\GE`S;C?9 +M!A8H9;/2\]#ZG.2YS<#O"65J;TEP)WD.*!KMRCLAKK/[I]LY0J60SH%P4_#6 +MHKU,HB3/H?\)0N$)`CJ<"M$5"-%5X#*BE.&%R^@J2/OR09*&1O"]KOT_)QX\ +M4`M8P^.:I^PR49X@E(E6<(KSXA<:'T6K72R"3`#:6)I0GM+]YU5\U?%F'_3E +MKT''6?@\SY?0N2P]K-%1?R24C7OGUZH]#^0)PN"Q46G7>4Y1M4I)MRVECC:+ +M!4Y1@$YLJ7BT%J!VUV-)Y%9&<1A$!^/1YQPG"(7GH_BG'JLE[DX?-WP,)3D8JC=I"-D1U.>43V9"9.[^]:) +M\'P8#9(IT00ULO9B*N]L"%G8JNN+),[;E8R#LBM(0G4"I`[HDW(;]4?R%A>U +MRN7Z-,84<4U22=!J#I+V15"''4BQ;Z5%3K#`/2SPG"44S;^L5?Y((1XK+-`;LY^O +MG)\O3,&K5VA#^6O&_*)_.4+90IU.C',NE[#-B>UUV'889T9V+RT0"EHK:EG! +M7'-*5';4'Q]BJ3:9PK!T/K@Z05F/7*0//50Y*@RW@]#EN.@\)9"]]KP:-[O; +M/-2:MJ'7DOX!I]&;8J<9=57*F>:U0S_:S>RJJ"M-4V(^"XQ2N<03W!M[3*BOZVN(OH`>ZBQ3RH>I;^L\/?]J?+A=?XF' +MM1:`N_XP/-K`HL]L"5<89$*TXW,?YC)Z9"5KFBVAJD'*P-5ASQ## +M6@85'B[3%<0`KM([(KS-T34\4YBV?$1+VRRC`CU%Z8O4*`M0B1(JA.JJZ:\) +M6+6`K`T!\9O2)91'\:BPM:5X8A@*N%^:4/`D9PBR$G?@+A/X.PR<$E.&WUE. +ML0[K"G?6P5?X+?'K^O84IHCC;XY081CG:[H[O&"Y,"[O]\4X_LYS7/"FVG(D +MOJE#VH)GY`H:77B$:=4DW5&G4/5!^;EG\M'*GH:UVP3]$'WTXOG!5=`F"4)Y +M?RT.Z\W#M\5+$?U5`<<"L\GK4.^TVS( +MP-)7(XYG?:#]PCNO]]5X@5"X'H'CK/?">W'J +M=8^]7;;+0?Y&4W1T&(KV_2(0BOQV*HN=7RB+6?+5\>PAY/G;_8V6[U&T$A-L +ML@3:>X(\!MT-6_$X3KHU="A)XX=_F?C:VY6^#?6CX +MTT=V=21^RR.?8*^7.%L$/6,/]!#4=DZ`'#1Z-;;[6RW!S-%KK-...[F0J2?) +M/7PL>7EN3Q-J+YYI?"2,+BJ\]`ZUQ>:H,V6C.XMIY\RV<.@]34^<%Y1D47IL3U73#* +M5,\2ZOSSS'36'7!D+C`*>WOF7W2ZC4<[JH#"6UZ--V+^+GYEJ=R.*'+M09Z# +MYJ0PC[&A;7Y-U`W]W$EL]UL(?8"ACW(<1!RYYNNXS"D1WW19N* +MR7J1CO\,IK&+)J[VOQ8TJ<)TMU>7YH@E/%;D%ZFU8RXE]7=P2-?29^:74'1 +M#O;''?^6HG%]B%"#7$\Y]S2K8E)_QM:&CFF_ +M@26PA0M:8W^>456[EJXEC0EG&EBF=H"G>ONQ+9-V@5&HQP(RXOMF$A+IE+C` +M#)!7'^?><7C[GN*Y[=".[3@G0*FN+G9@/L4SK\03CW.^MG587K4=@K',`I4: +M^#UJ2Y`&]!"0E%R%JI'DN=E"*JRV+1SY"`VRP?6Q5)I1RU_CDX!!3NVA>?NM +M7%:0"3#5[..Z'2TEA\SI%BFK&Y1@E'*Q).$.)\'^3WA+)!NZ^# +M"WN#B?Y@5'RWXEA[R+18^G?,R3]YSW7V=\%1U!G!2VZ.4)5T6BE/YQFE=IAI +M6;JQ6[2SK?H[TC^E#R;`->[7@6GD6`IYM.-&2:4:*-=!7;K"84_D8^)N#9R[X2SSZA>AJM +M'/4HJT_=8B3S0XOEGM`2#/;0.NQ+JYTNI'G+HWUJC=A:>4)AFUU$EA%38\.U +M5.&)8`M-&V$U0_[>IQR#Y[/1K6:ESI#X?:546SI#=8TJ1:OM$DKVM+AU:*-K +MX9E;+;0S3GQGB'S@XDF#Z=]K72%#-H4?I+BJ14S+-=[MN).@/$2"4#H)YW@E`UJY3'.)4"^T=>P#XCO@5/H[+];V&&Q0R^P?=TV[`?.#YB)@*E&*` +M;`U`K\'Y549=S#N@18_A^N44&;_,>4;9)<^G(E&,^V7NY+Y>(!2E!GVY#O?Q +M7R7*Z@U3E'F*"^>VL2;P(`9,"5=<<50`;1,Y0()0R+VY_C/2>RB0HL6TXA)J +M0-G6O-I[MMT1KAG*+\^7+MY3A'RI*VE-BO[#O]4 +MLAY#%O):5\!SR;U)=;%2Z[3:.I3\(Z&P+P=:NN<8K@'5EG:"43#&>@>_&?=4 +MWK(5>7/_&*POG;?+*_*6YKAZ>!X3\R9&'9BW+*$NUU:\;>4U^I+*:XY0>P(U +M>E?`T@6Y)82>E2>4!]SR!J3BNN%KMC!L[BMK5O[I@-Q_..J`W"<(M5GG_B"F +M%)(T0I#H<4`CHZ&F_Z1G"W0]B]E#<2]20L\"=)I0WCP(4U=.-5@CV'OQ;+8L +MH>H#7M5N^!-F/#PK.E.('ZDK1RC\=6;@+5[_$_B=]U&7SQ3,H0+]6K07Z?R, +MPI\T1?M\IF*M@^8G_JSG)X;W_S4GM07/FR.4OV-3,O7A^0/;J]2H!;7B$BI? +MTV%;:JT6YY.?A&=3/Z-_$T(]4=-JTP[T@%O+<9T/?Y^( +MR;N-M8RL)\DR?\23&D"<4^:>'IV,@'U_`,H),<5S/ +M`MFKRES@?&'Y/OU1W/->5F>Z*S_(2IJ7?]$IRJN%)#D5:Q6'=.#1^`[+F?B+ +M'M,PMSUHO8"CU573.VTZ0"!JGPHM[S(*I$Y7[1^RL9?U`.`?^^-T%@$`TG_A +M=HQVVLIO'NZ.Q_IJA#S9,"XU0JI91N$Y,T:@A:\NV:V@A\@OH#. +MC;V;"G$\$3#/J*Z7^=R:FE)\S<6!))8$K4D*C#IEE'_F$)XY@'%A'9JD@4$M +M_151O#+_#LENN`])G#@JYJD06$.)O^I:'6D=$Z5DEU`CG0"@9V'3?QU.WQ9Z +M5[RRLL_^U=>D5Y5\"VA*IEP<"?S^KWI,TZ>B-6K+8#5WCB7+_Y4I1_GI6+3? +M']GUR3+HP[/`<>%*[L1M2;DY+$_M7D`GW3::E\AQ<#GF`BG_QG&M2Y6X1#9# +MN(7P^U3DG+AS'VD8Y0E"?07>8KU_!<(9;"_?98B2W__LW_SZ`MYGF7Q>0-C$ +M\P*`9G$-$NXY0DGU=8S)IPDTDNRESU<0=IY0M?`6?:/5P=V">P110!]DN?G= +M8KSP-\V9B&=A_^GGSH)F"57W +M,/2P@R%ODP2?G1:-I;S/O1ZG^D=]B//5_+,.'),K._,T3Z@#_6M`R +ML9TE_EH@E*'DB!D[>KNQW&Q[]K*8VD +MBT`J.OZ9\,[]N^),?BJ[;BG%<]??.?ZTGR*]45_E[>6I9U5<'I]ACSX,>UI0 +MA^:]X&3EE7)R*B[#>1IS'#CS`?7W",[O?%1LRS.*^)Y"#G/&0H%0PWD2PC80 +M!HQKF5>6RF?T:$4V33MX=()W#JZ]X[Y8^IH-]!$D9HE)U64^ +M)-UG-'V-9*MX.9YG2"COC=H1_0-@GK//!+F<[_UR?16=P:7]#N0X7XOV4K^Y +M7/D((J[>QB4:@-K),RIPXA5^N2[@9Q[G/PK/Z':,!T9U4UFA/_5+EEOE/Q!5 +M_"Y[!<6Z1\\!R/_TVA"&3OS#'X=HC>+:U+UD80%#'.Y26=WJ/(+V)HSR<+=K +M*\U'^S-M:)^+UECG5L72C%)>V>Y%&E/V\W%E/X_.!0)U3&_ZCV":^-":6>%;7??H!T*W"Y76NTW`)A76N]YTD +MU/Z,\[#N<1T?6BM-*)Q-;U0KSEA.[Z0Q,1V_@#Z4?9;'H6M3XC+VYS]0<>X9 +MG0]#J'^WFR=/J-(,U-:./1@7CH1?X-W_>^&YP&5$RU:T=SR3OZS7IT;W\TGN +MB/J#PP$E^\@;E+98S^63EV>_'F6,AZ@P(Z_WB_;AW09%GN33/I!85U-Q]>-JGNC*,LKC$^ZUO>(%.%,6 +M$E*C^7X\OU.W]K/`);WW][!OW]LXG][GN(P% +M0OU;_TS/43OBEWKEG^G4EY@;/%O2/Q*$TGOO5N,X;;72G"CMK_T2A-@4;G*? +M\_GJ5>^3QR;TU62B_POG*\LH[3=$T:N% +M%E"`:KR?0^2>T_J0K;XTJ2^&TD.P%/GG-)_XI-7%`J&(T\Z3I$%GJ48SP,\[ +M4V3?@?OYGJ=\>4H+;.)\]>M=1Z#SH:5\@E`KR?I3K9V843Z^T./=<=CR+J'J +MC*1=U9WT<*8T4L-!F[(LHWH,2?.#N.ZA +M[.1FWLYQX0QACE%J3]0&[3FQ+P,4K:R7<#ZZK(SF:^46$;Z]"<=UP`D?`QV7 +M]3]6E1.;E>()06JZ_`NF^N>1#7:?N$JJ2 +M>U3.::9W:;UV/>3#DT";S6T@1T]WOM6_J\;KWT;OLH3:@%QC,LX][IJP"7^C +M+UVY;0)9/T&>'_7N2\0BNR/ +MR&)*QC*\<$9^*YRA];4J2&W4(,A?C'KMQ?@G]D=" +M#>]IE_5NI'WY`J+LS`"OC*'MG1>V[0Q;2!#M>[MJ$H32)SCJ4^2IEVUF)/YV +M7U"Z`G"F,,_F5C.W[->\M7AP+/V"IJ\R#4[YTM,I9@E5+%;[NS_U%V/HU:2X +M!B7XA7:.XZK8Z3(`%XV><+\![7U5BL*92CLDP\Z-ID=?<*R]`5#XOD"HZY&* +M/>%@/#C+G,-^./WE^(`:2^2+1/=8GLE"G2\:EJ=!ZM'-\^58N")P)0BU#-XN +MA^M4N+ZX6?E5P+KK"3LSFQWIOL@R0-2)8LON+[9U`7(]7"FX<-;F+D@U_:(> +MK8HA(>[&?*!4!9J.N,F(H;5R`;A\]D5?FR.Y*9SRKA(Q6F=5;>"B_WM&@>[8 +MQ>5,46]%U*9QL?,4W\@3ROOVN-@Y:!^M4JS4Z`HO,I<+:DR*)CPU[X?^Y5[B +M%%.VW>^0=22.128\U^IGT#T2A++@;9U^RU8')#OI^%Q":7M./O6M1%NZ]Z4Y +MQ:#DO_YZXA>4-_32"?)PEE#/_L[TY0B[AD=0VN52RYPA1RBBO%K^2C97VB\_ +MM&=F-/`O3K&M!3*>@:@)XBYV"RTL*"WH)Y&WL^J2,KF?K;/DR +ME]%P]D#N[5I!<;F$:E1<@_R3#Q-?FE#! +MG'(>.7\8#^8FR_GZ:(0\8>J0KUPI7Q5UU8,?7N>YUOS+6D\;UFI369X7"(6G +M9^"./Y*=<-+`53RKIJ=$4WV,YA9`'L@ALE>0I4.64;@F +M+@S:4P"C7A?R"NIYZ"D!Z8M0)*W;I-.F<`\1V;;_74G@FZ)-^5<47Z6O*J@4@O/[^FGEU"C5&H`KWU_'K"57_LM>E7M8:/ +MLV%BS;_BI)/"UV@O^A83]OXUP+\X7VJG!KR5J5Z/[=0QU'?^12<8YPA%L4^L +MYC,(IU?%*J6%_*N:OBK7*`(Z4JI`*.KMO6;@3-:MG'MH,:].Q.1KODS>TRZ# +M7^G="W7D/RW!*&^^'05Y'FUQL$P6KJ[@*J.J'9=1:.F!93J=?6V),55E?NO2 +MA.(S`M$<`LI,F*^P7IUT4II'R]U9DBMH[3R)M!%O9-+J[MI0F42 +M/.J)\#_)2J#G"$'S`)[RY)@EU*,!753O>8RB+?\BCB_WNL\!:-0LJM9>8*.5 +M'LH^N`,ISRF&.`6AQEOQT>MLTR%H?KNSP'&M>FVI&<7Y[%>79I`#-Y7'*_^) +MJ+-QSPF.PNC-`^K#ZYH<\R4DT)H2_^1V7&`C\CR;VY/\I]&Y34")T*=<0GF= +M*FQM>4K+;#XW,TTH;.4F7,O)[%Y:UR"BE3G(]U0*(TJM8-U]&L#:_L +MRG_Y=`\E_B):]!KJ%,Q>D*IPM%G=ZB0(A;,6-+NEYI@T&D_!Q+3=?VGMEY#$ +MJY.24#I5>$XKU(K4O-O15IY/[O6^_E[93HDLH3[)QRGV@1RARD]0WDH]+KK. +MM,F33_U+\3RG*%,T1ER/^9CHL=1"?+6=N$&!4?OX)("!?F[+]2$J9FW`J9CG/P/T*;Y2T3.0<&9O'6II_8;Z1 +M,>WT&VJTDO;%9D!R5W9X2IK/ON'+T?C&GI(21CDG,8$*]`=_VM#H;<+^H.B$5 +M][ZC="/?1-1Z0N#L3!3B<>S+V=^#(RA;A,(7#OM$NH +M'K6K;KWE*>^X46>]0F$,:8X+#O/HFTT286G@=\B\\H0`]7@+3Q16XVHD@3Q`*]1_4 +M.]>/8HGH>MXI2?H1:E#R+:U;D;Q4H5NA!H4SH0E">=M>C-\`><`X28.6T2;4 +MT2C.7[\8=PE%FA90(L:!\5*<4",J93=-**V?4:IF25\C?R>_?#&>]>/2\0R7 +MOQSG7H7S;N?\5=);_JW*NJ\\-0>]=!48)1:0QQ/L#;/7XNAII+1FAOZNY=N$ +M&A(I&F%P;FXHFB*=#6D>1ZVG7HTG".7%^2W.*7EWOQZ?W0WT@7HR^KTY3$3= +MMW7,&65)DKVM-+YE8IA0FYTF%*8B2)9>8*,\3:O8O=$NE)CQ]+`LQ]4;39,, +M#=PNG>-Y+YZE)$G!SODI]J#EU>0@)U&6%M!R>4*A)E=G5Q/'19T/];U:_0PI +M%@AE@XQKX]L1[#ID@3B356J>[`;0H +MM*?,%92T?-SG?:SUUD(:A[YH+9!YSCWM +M)MU-)_:9N!=&C^-]R92WXL5XP2\CVA%@JE1&0XCG23:OEABG?)=0('5PSS5P +M'!+:?C+:;5`^$XRB>$#ZV5]LP[`S@V5W?#!S:XU+**-W/NAZ('%, +M'*"RH7=46A^8PCTW_:[BF"Z>-8-H4?7BTMJQ@G:"8CQB0Y^3)91IM=MKNJ]+ +MB<&D4]@*9:O"G=HOL"^\OA5>CN.2US6)GBE=M$L90GBXVUCMSQ">V95_5W,Y +M6G%3NY0MJ-51>Z#<<+\4REH@E$Z_+!Z#RVUW)[OD>T035C6,G',AGH>:,(0N +MQ:A_%=L:Q`*9>$_+3*S;0JX%Q%6UJRPNUX^K#&D:J2Z@'!UOFE!*T4LZMQ\*43D?%=)V0T%)"$_C!=DU3ZBH7B>$NHD@ +MK^CE\3(3YK76PGMZK$7^,C/D$%_`5!`902L0M"_<4QH5C*[!;2W4G[`OF=!K +M:45[\JYD8@_'M2:UF2315BAYAOO1E=/.,N$W[GES&05O0O"F27UUAJR4GO?# +M=-(J+J,+XN;45+SAW@X[M(\],&4Y7_!DJG`4PN,0-/<(;9#;H\M(!V7-$VH?G;@4MC^&^[YU]783]O[7!>M&C[\<+^SQN:\Z94]\ +M_L6X[FEZ#E^^3^.VMBE0ME77Z>?=,!)>N#^>>%_7JJ-ZJ/>BLXOU90OEKLQ"N&7(^ +MZD\B&FRU'*.&:;M@J^7?U^WHMQV,1[6]TVU[J'2F9(%04KU1YS6F^BO&(OE! +M@+Y2Q:W%(M8&ME(8^DZU*E6"4*(IV65#*OY^RBNC7;3.@.,V<%&74:'=2VNP +MA?;O6EHL"K'.4JOT%NXB0T$YC2\WOD,WN303-264(9=W&/P!:I#M0P +MTA;N[,P1*KB_$VE,W%:J5:39/*$TY2+-]MS,\0)_J`FO>GGII3=!?1&JDI^E]IA>!5.:^:YC7BV@8:L:OKP^YA7!]E?-A]1IVE6Y7#`F< +MP"54S6;VEV8-/0\ZK;68./NF%UV<$PT/79M*$ZH64;M@W'BTG+Z#%)FX4.NKP/I$W^+,3S?)/GGI!F"18I-' +MYZ$F"%4'Y:H/E`N].*QOAMKI[J20KHH+PE=#FS6R=$LSPS`2FD,I#U%I0HF^ +MZE>NI0];0;VQ3UUVB.4)\4#\:0W^O3A(J' +M:[6CW^A;XXD-#W5AS18X]U"_6!ZQ*=.DZQOE3LPYEE]^A*C*6B!/.W@V^(O% +MMIUK'DDE/O);:,7(+>1^],DM-)5:*$TH8QE2X;24MG86UM0N2TFWF27`[SFN +MRC8\!%Y.;$^:W8*1[\[1*J,A[= +MEN90,HDUG2:4YBWBA[N5WE%,^>W9O=+)<`!1(6REMMYO^ +MF.D>M'AS`6DZ4?45N7&5"I']6%-.W%P@1Z+HW,?_CJ)1,\Y_K"4%0WF/BT,* +M_ABWAL>X`J-L'@E0IEN+(1+%-IS1P!/J,N.+;7*0:@*_3"RVH01_*WZ96FR[ +M7<6_$^VC"66<7&SCNBZ7'/%LY(T@*;N$(GWJYE?C>O_<@-U&\X4T3V<;=II1 +M&57O9D8.9PN;)93VD3;<7E'4`7.$*JU1;6-_9,<*LHK/S,*SXU^MR1/*ZZ^+ +MK?3"K/=YI?5C+;T5"*77C[TQ0_$ZK%$Z']EPZKJYK'(_9=JFG9\.S8GB3K]/ +M\>YZ847M6]&>B5#HZ[X*WNR[&&0NN']\,4I^A]O+>OID-3R[A+(MSYW=?GGT"* +MY41=P664?K/65/M@VVG'N&&1EU0GS2A/T2;NIWRJV':7QZMPFY4M6)90P]G1 +M3%,K]60OQW'U.Y`2C_>X&\'HYG'#4+ZM\X3J#]BS24"@WB"1$RB=J,!Q5?&H +MCA[[I.(3/;QS+SH&0LDBHL:H<(:V_A`EWTRT7DNHX=9K_;4BW)]&J#U05\;G +MU2[+5O0Y<;B_I[\1_9-S7([P=]OX^R=`?G95R"RA:"]9G/VD7/`WT.JTYW'1 +M*NQ'A9TCE--=DLF=(3RGU&FL@Z];UXA4'?S.%YECLJ]ZS)]K)!O]WRK%`J/V +M*&N&,F1+ZB5M[RNPBE!;K5?K7X,YI:TJ2^^]R.\%5R3-X.#*G8LS#AL!XIUF +MQ70)U''BD--@W@Q(T>NN!MW/:43.D"94Y7Q5Y4IJEE`'6'YY0&,Z`)PK?S2=HB+-WQPVT3(@8307. +M/7K@^(?)I_;@B;O8:S,O\!F]]A1',DGU`^_J.<.IZDV2IXH-=:@=)FTZLQ>D +M\`2A\$VXEV8X79R[1_OV&IN18OT4Q^6XUD-<@]O8!LR:*S%$V)PKJ_M:[6JX +MIPEE#$T!*6&@R>C&N]=$'A1-Y;\>1N8LH]17S#%:.]/>)NP=YX9HEBQ'*)J/ +M.R44"_:,8'OD"36<)7!P_K!`J$I_&!!=)WL?>VVI`5*:Y,4=]"H2M4\VNV-> +MR1M-E%>7&J"^&*5.P:[KWI84U[RZF%;SKH^EPK@[^Y3=<9=1V`^!:TZW%A!] +MXIQJ3?2I\=ND,53MX#[1 +MZGVO+AWU7K'-Z+:Q5B?FV*1SU6M+1[V!M?GZTLR96#7E) +MLYOG./Z'>2FODK&UG4LH`\\`#=C<994=N+:A2ZL42Y:HVG.BMCX3=K6=)90- +MH[L)3[7HQQ+N=7#'LI%/2U-TY0B%86;"UW'P=0;\AK%\[2` +MIK98_'$3Z@[GNMS +M:*Z/UA\)13-8'GEM(C2V_BSTR6^)5!?DT244QM'0,U]JRS?_G!*4:KS!>)I0 +MXE#A6[V5V[M%)^+.ORRAO`O&L-4;O!&GC2G9NZE9P9SE\]7,*S0W6#8K"'+T +M?^'Y,(S*L#RH+:=I5C#C$`-'5(%0$6^^/`;JO`E2.0+NR^">@/NI<#\*[A(= +MXXOE\/19*.=I/2PEW."56SWH7VSAB+:Y]Q9=NV0IJ12I+*"WC!J7;(&7FJG3OV*!LA"I[[Z4_`7U(Y8O[ +M,/;>2S>C/4$I'I*_&*5;5K"D4"E+2W(I-)S?X;+S3@AUH-V7VENV>FL'>D5S +M"34M,]U&>\Q+X>%\J.&;AN8XXK'FF'?R\W%$I@F%^&AFOAU"/WJ#K<[F;::P +MKH4Z_;&0&$,VS"T4=:9='&8_[MV9[T]"?Z#6=*<%-?,KHVZ.P +MR_'](5?KL?:U6]1\(]+#?CY57JASV5U"T5J7^%F-N!.H!GI)6,ET=33S_'Q' +MVD=)?>H.KN_<1MY_.D'7)7DNRRE>%2:MBSV^/M^!H42SXTRTF"9RA$+9LAFI +M)/3:T@B>(0W\!^5A\F("8U&>X_KV+O:P!_S=&+HQ&0*..PI]$2O/G(5JU;== +MG9)4>]X#Y9;2#DI#(]EW)`CE4]OP-M>N2Z@](+6CST)O7+4O9TY#?W?H>Q#K +MBU#9FS`_Z/\[9=/:%;1EG>!U4NP864[1$VI7A,%>-%<7.YI_A[ZMJGE]FU"- +MWF]K:*=`[:XX^13/Z#T5OR5OI'F.R]RV&.41'`:][XTART%Q]YA8`;7K2:\N +M+1`*O>'@?DJ=$L9M:3_EN)^O!E'D+ZW"PELTLRX_F#E1)@BU_^H3Y1Y5:BQO +M(Y43=ZRB9Z*HY]:H,CJ594.?5A)3-1TG7<.U>CB$.0-G$.V]F=_;)GF.N3;E +M/8B^_:*I+,>E9L?F(A7C7N*>1N6%807I"SE"S4#/#:NCY&=H&OZ&K%$9@3(; +MO38[SW&]"B->#^Y`Q%SOJJGKKFX7+SX7Q]RCU[8"HRY^E>1P<0UZ1`-Q_H7G +MXN+QTOY825.#E725J.1?A!J)KC1%N83R_A;VZ2H6H"NLX03D-5W+#9*RIRFZ +MFA&@*TU1648%Z.JE9]`#$].5IJ@R%JCH40YV5$C48ZM*`?N,D>HN@`M>3]_/EX'5)105#0# +MJ"C/!TS\]+GX#$5+E53DW?!%:2Q +M!*&0TD[XI/,H"(4>]6;$(,QA$3ES1D3..B(B9R4+UG(6#]Z$IY/66.L\K@2Y\UAH2/:L4ZI0TE-+G?DBRSDTMAIL(2:&(!YLQPL^P%"G9SDN/*L#-!&QZHVEQA=PW?;U&G%- +MV^D?#&UM%V)';8Y1B7,Z&X=J'.G52$PMU-V:-8:\3IUJOEY+VVCU-'CQB32K +M@E9`APVLD['-ZTBS*!`*>U>=5V,WHJ8D4CA>4PD,-;4 +MM?[1H#^R^\-K_\G\X9JV3N(/-Q_6*;*Q)A//$0"IU.6XO'6RD:2,=8'<0^W& +MO+,QU73$US(-]'Q6X^^;#]9LEE`LCU^;*D*_'OKYB7+OEGHI9GPJ)6[[U\FH +MG>,"[?GZFT\6^_[)Q_HMK['8L4:)!EY$T&ZCWQJ$=26IE](VD3@%U +M&W1/LY2?;+0XEZMV^6,N/J<;M/ZH6P7G)&S7+$!;.@L-6LY)H'=*L:TF +MUOU:TFMY+AX3,>9ZH5>72HDHXGUT2EZU]"8_%Z^DL02A.!_E?*9G'<^O(2]T +M924O#'IPG"$VU2;$;;5I0LT43];.$F_5SA:148XX8I3FFBC=Y=CUY;V]']6_<99XSRA:)]#[;MQ[ZQWXT$K.'__(Z$^ +MZ:0\&A]':PWL!-!0YADI6USRRE(#9]0_WAEG6[*HFV!47X=KXMXA0#ND+QC^ +M#C+T"^N.UEIF@JR>U]#:%UJVTGE4N-L5\ICFN#K?B!.7>V]GW/=LKW,Q2<@L +MHZXZ@V9Z<)?29H_WV>)I`G7*#CE'J-K:0%@H`:C0]C3<:P#YQ=]Y0BV@?9A1 +MH.2DK>/4\5RZM]A6X!21)M1^48JONGP?EQP3Y":TNH+U?O3;<=_/`VI0A$IO +M"9P$^)9YP)E_+J$JY^1*>T[F4![38U@&4+L0(NC>H[2_G&:@O8&:[!@MY^#9 +M:=(+VPLL`.K9*3Q]'?4A0F6J@O45M=G+RXJ4]R;[',@3"M/&'4O>KZKIY%#; +MNY%FH7I`)T(O.X4Q6M,IL[56M#LKPQX^Y$&5^J/>LT6[-AXP:?8R02@Z$?WF +M$&L2?PZ5^]M`?^X'Q#6X0MMF9)90<.M<)J3JB +M,X/P+#74/FR=4+=HGK%ZC?/&N +M(+_*XB<[XXWB4/*P6B`4^5F%MY\*>E@]YJ"8UX)]Z%!;-G**41<]75M##WDQ +M[^>VV-#NS/36V6)*3Y=H?N'"!*%LU&DWL:]5J]G@ +MC]?E)@,J:DK,#_:#1K-&RG"-3!.*SGU&GSFJ!+&A=>U^*3;MC&<;-0?`7/I> +MIH=V06,];HO(7`=#Y@B%X2FW_3=UB> +M9XE%MK"O@]QG()^FM`9,65`UT>&PK^#=2]>^A[L)=\:#\SIR;%`?JN3/=!8% +M^E\E%-(2T-%@'*?8#YH-GO\4].)\)E".Q[YY\V-]RH&WAP%0:\ +MF("ZKP6*H99*01L\="'1RH;HA7(<<1--,TY>NO).H7:I5!(`85Q +ME=RD;&Q4WH7D>);XV+MSZ)T;/;X0ZJX`HDNOX(&N+:PHH;*$:O;##B1U +MGAII+]Y\%S+7E!NOY0F/_!=ZTM\+<]&NI9^"X7L#`/)^OO"-/LN00N"ZAVAQ +M%\'[`J$F8TWV/T>2`9T=B!X<<+54^6F03107/(6[MV5TGIHP3X;V70?C(Z&T +M]Z:06F,E&S6<=X)0SBBHM";-/,-?DR@-YUAE\Q!^]^J'S6K$CE2RE"JXYD +MJ5]H"DI\,T?0D^4$1`7/4H"4@;,\U+%W;3UYHA<3+Y&)":P%V.R-[>11,9X9 +M`\2@W8Y]ZC=5MNT2:C]H8(_"4Q'N_?VV[R]JW]IZ>PC>I0FU;8WMX'DD4 +MQ2].K^V?ZRTV\3LYD<0N*`NAZ@8F:-\:0[J\D'*"4&C15RQ.=\2&@0DZE=T0 +M/YX`AVNL+J&PM+N-A;*L1O`$1*R12<5X>J*B:++3PM57.;2B$U/%%'7\64(A +M1UL%>0`M"?J?,_%4+(%*^25((T=K,N;GUC21==T +M+ANR'4OG"2D1M$]O5#%>X'SIV"'WXJJSVL6&XYHL[5T*D'(2H:J+\13$8PP= +M"KEUFG#>PX\K5(PG)FF:,(:FNXCP:P)J08AB',OI--NDX\X1:%]B!0%82E?[E"!7T>C7(.[.E]\5B'%=4<6Y( +M-A/EP)\K[KB%:$FV,4 +MT+;9[7EF&'?PFDZ!_-X(WPM-GE`Z9DI)Q;OA@V);L6CB.3%-!4*%\,01M$0L +MH&8.4C_&]=5_EGS@'CRC8/O1RZA$(?V]33 +M<(>+-17/^.LPK!#G%<^W8I3QTM(:K*=5+RVM`SX?@7L-UHJT4F)H5"Q[L![Y +MR)>B1]ZO4MK22`Q.(3^$.49E43.<0O88.B^TJNB)+IP#SA_L<[F(F.#G!?.& +M^S$@)W7O@/YX,.LPR-UV-86Z'W'(KO-?4&]81I6BG,QZ+<@@4*O(V0PUBR>6 +M?NCO$$X0:B1//?I$4I=0!YP.09Y5MW5(\5H-K3\2BLX90G\,^_@L%RPG^1]4 +M,R)90AG?5SLK>N9+M/##LR/(MHS6/.9TY@B%;T[(V#:>7@)WGZY`ZI#HX2A/ +M*#SWDT;,W[P=#Z3&/@-Q/8U0[EJ;9J+.L8M6[@=2[G%`YEP%R[M +MMN-3(SL3+<%\'6-Y#`>4+56WQN_?HPGK3S^QIA+W!,?*?B+Q`* +M4X'1U<$S](QN[*E>DX'K^!`29UED%%$8GMX&\C8=0]`>1N$DHEI*VTMK09": +M5\MIUUG +MZ#44:"/+<6V`'A79UH3A/#VSCO9,Z_']0%,NJN4O35,X>X2[SG19,>5\E/D7 +MY^E2XDRE6HKZ`^W)-2`5EB1#<46H;6G>X +MG6U5_,L/?PQ0$.WF17OBHW:1Q46.4"15X]M;=\:UM*?W1Y$_494OQS^![#IM +M216(OT"HV8AJA1_/?XB[B8=Q:)PY!0>8;BW5_9+/%D33]M,,&J?]LU8 +M2F7;&N[7^,Z=$NRU;5;4=H:B7=CK\/3B*E4K:4*%`W43C.\(J)5J:),LH6SK +M$M]..`%?:N!+;>!=CE!'H=>9&EP-*6_+&'(4W,\W15,.MC_:@F>>+K:M,]A* +MW/@3T!OR+T*A=;CQEK(._[#85DEOG_GNH8GP"^M6,AZ"/-F;"=GLHJ)Y_R[=5!8^',U+97XLT_#I-F +M)[>!/L2HC,"3JJ2U3MB%S$99EZ%][BZ6LQYX?FZJDCJB7MN+<9G!'?&L?^H= +MRVA/GR?4&\5Z1RQY(4[>4,\8C'OHMTN=1;`'$`65K_"L-Q<*L0>N#^&RCBN_ +MY#1&L7=0+!/D209M=&N?9M9"9U'-(+M6T+<)Y9]F1K3/<4:A +MG(.9PVGN-TTH$WCQM,P9MN4Q[T*OMC%XMM5SEE$U='8.GQ`]1Y1V)ZIW.9VO +M+.T4@SO:,N,9: +ML3/L(PAM?N4ANB;P5+L^'-G_-3JFX[&Y/9T$H8+A=`@\?TO7MDLH#((>GDA7&2;A/Z&"+4:WGCJ[7"S-H5#2KUCH.-"[[$:,=`"(X18&+SD +M=)8>R]]::,'N#;04B\4U%WC3[<1TGW^AWH=[)]#;!?*+_;N6GC3OB_-Z)HBH +MRRB@JPMZPW(U6M1?S/8KTJHF:T1I5LLTH3QOONWU"D+AJ7F-$!=Z"&T$Q&QX +MER442D]H-8AGG69[PC(F#J>9MIA9CZ5JR7&*N!?V>#/FK_==\BQ;+@$B#7I, +MGE'JZS+9E`^QQ"5:,?#+2Q0N<5&-ZJ`<["\>&L8(Y3C+:F;9S1 +M':]H?RR>^H5SU'-2WP8>G2?4!5"3O0-AN>'ZL.R_(2POO`;;E'VXH;5K@5"K +ML;Y!^_)Z^"O^7@WM0;_Q?BCU#NPS5U7+U=`:WE7ALMEF[`O_#V-7&!O'<9WG +MEL>[)47*8YM.:.42'6-".MN2[VK+,BU3UIU$D91#RBN9"NE4CHZLZZB&ZUY0 +M!RAD15Z>*951DF)_"(;*&JJ:'W5J5\6U09$62.JT0-,F<8HK8">Q@M92@UIN +MX3;K](<3A2'[OO=FCLOED>:/P]S=?CLS._/>FV]F9]XK,*J_FF+?K0,QS9AX +M,<4]YC%J\5GA\2SW#LD]UJ_&G5P`#VW@][J,BK^1PGX8WEW/\<+_?C*\?3TRH>]H*A.GMAJ9R+%WCH*@ +MYK)ECE[R4^/0FK]B4U1.Q%UE%FX!]` +M\G)ZRB)C5U?*&,T(`D9!TM!?/,M$6!6JSRQ.C9'%0[XU*3'B)P(EP"L*U_/E +MEP_KEUU=9U07?7OFCO0*&UA1LBLTO,/*_03\M[SK\'O#";H#^01(X=/X3J[7 +MJ^)5).'1D/3+'^?5P]+4ZB"EA"XP"F7;DPU=_O%VUY]MCY;NW2GVB^Y;HYQ%ZFGL3$')R%MOX[Q,CYS$B-SQY%0/O=3YR;;S`*-[Q1-+KTWU`\OA&*8]OD"]&+3[70WHLO8O^Y)XY\5_& +M,_#05$5*S*2G3M(5:.C)#)4L_3>E+OS3Y.+B;^T-!'6=[OLA<>@Y5VQT[W(QFC +MVO*>V/>(547R+VQ?SYCF;;=C&DH!.["E=-!OK3J%KS**5[&4Q(7E\W)?D_?1 +M"4HA9X&@J*8=:/N_7-K5$K5T-48UV]427;NM;X];.7`X_[+*^2^1UCVK__?"&OKB\TC`)BRN^%86CW3M#7L"`H,#[_7L%_2;K+_V8FY]W5F"L`^2>7\W$F^3AL-:..K\$<8:L#D]?JS!&?VEWQ +M?HPS1]XOQZAFS+$TNO\1V%CPL)!1<>;889AC!^*>$F?4>6[5"'/4ACEJPQQ3 +M5&*!46".G:LP1XQSGN1U7Z+!'/W?_?$RYLC^.O(-NTHCJ'_46<$<\=Q!_H/8 +M(UJF)J@UF",X8ST?EZ\X[O#L,>F_+[P0?R>XW`P"KT!UG@TPAJ[ +MB35V$R_I(K[H,:J;RNXRK/$HL<8NXB=@CF7+%QE57H4U6KX82+U6]2@L)TMJ +MA?58IGKC&://Y1KN!6L.^0@9Q3P.'/`6D<9$UQ*7N_`)FF__FN5RX&\=$?X6 +M96X%1G5$^%N'X6]HE0[#W#Q&@;]IP]\TE9XBB8PRMPJCFO&W*',+)*]?)IB_ +MJ4.)!G_KC#"W&J.:G5K.&`MPE/2^SJAR$PL0[8>048THK:OT@;Y[+0O`YUJ( +M7148!5_?5K?Y#=*%:XMQD)7`T8QY_U% +M0I@0W8'[`Z1HP]=4KB:U/V%\%[O$A##V+XN]?'%S_6ZK::NU++_?OCLJT5%; +MJOW.MB[_^VV\O_`>H'9@]D=Z-'8FQ7OX7/K=,4MZ=19RX7@%1F%=&WJ]^=2^ +M1I]/$;!'F#_63]=*=+W`>,Q6=,H4*;_*HQZG*2P`MVF +M#TLW?5BB(8DSF_V`42.$S]$_VR#C55D=>^6@DAGVOUS.U^Y9ES[>TTP?D=?` +MX>$Q6)@NZKE04,;.G"<[,A=$[F/N2G3E'3W`>ML;T>C?U +MNI6``J,:MMV>"D:M_]!$5FY368]1ZHW+>:S2K?84E1UK2;1E(L'R$F.K/=:2 +MUQC5@5$=:S<<);I3:_IDZ)/%!_'Y=LCX[LBH,PG>D1#N +MD+F".3N!YTNJ;NM_U?ZO[V74K[#[?2_E42UBQQC[@4DH=?I]>6M98-2+WW5D +M+P?>V^)XV2G%Z.SUJ^.ME(/'J"ZJ);>UT]Q>5!BUTGK++*XQ/MZ[KO'QWNCX +MV`?K2[:B$_MSP`>P@KI0].N"(GGB)W!Z^)00^'-6C;HCN,OIJ82,0AL/\S]I +M/3R'TT8TM@&]465[":UW`L4EV?@WI]\>W[@!:[4EWY918!1*TJ;'F3F#OF%Q@UDA3[ +MJ>Y#SQ"RE=I]H>S+KJ<_+GOW-:1PEOH0\RI(]>QT424=S7U)Y53ND[8O5;+) +M3MT+O_>45R^-#$AIPLPE!DLE9F2^I^:GBR(?CLZ8O&J,6GS^N8I*]919!^F* +M2I7*R!OY((>ZE$A:Q<]F]D5!+YT9^A\[0^>+Y5!0BUCU%E^1[@)-)7%7!*W[ +MF'7`L^H&N8]O,7=HASTITXS[LZ4C9.^@6NL-C%.[K;E)2-\H@*:HP"GM5 +M>F%K(.]HV5;(^W8^F8N91<`HQ`=$3T@?R'H%V@Y2COZL,0J]"F\2_<[*U0>. +M=\(H/ZURL'1L70YO]9(JN^/<]^XKV!H2^'^]8Q#WOVKS5CM +M7'(`\G6_'8?Z,>[#-PW:Z*.R0WS:2%/`J`',,3`3V:3$L_"M"+0H')'C#S$* +M3UYTEMH,7!-I'Z];E/RZE&C;W>UIC(*]-`IF,PG=^Z+2(:-Z21ZSR`-O0[`; +M.$.:D4GK7OI`JO4NEGO4829[/,,]/LHZ"8:E,Z0QJ4Y=V&5ZB&4`4;U2)%NX +M,HR]R%^@W_36=_DCW_ZDT@/T@57G]T,/""?'B"?/Z6?4BGB7W@/1VD?G +M:!VF#Z"K%4$ACA[.3"2NFC-)G8V]?#N9WXW([77M@/<]8;SPC +M=KZA+OU.0N8;E%H-#A^(,AB@)HA[3`#'D/KP?8E36/T/2^S:?B.^E +M>4,OQ@WZ+^LF-)A"34J$-S5H6@I,@>8>6.5,$2N:3;#]KPO*K,".H$3B#UEK +M/<$\#I#]ZA>6-HHS3,C@;92"L'#UI+OFSL[UC> +M9C5&Q7N$1_MTI+T:M8\C>90WS"%\L,$Z8BTJ$B2MHOPQ_!5EN(E6VU&9KKH?YWXO:`^]^::@CAL$1T/ +M]JS',M7V6,O4;_2ZVH$WDUO<;K-&Q^N%C((NPF;Q&TJ2OJS_A)S%HY;M(UT/ +M&36,?%I,5#26GF,B/3-^2:526A=%:[>[S'5F1*;8NY1A+[R_D%%KQ8C%\WO% +MZ$P'5H[FW'P.HMJV9*=`G5%9NH+3*)MQ@D#!:U\/G^8L0@IGBL60 +M4?W,GVD^#,UU>KSYQ6*YSR"P)U;OM>P1S%%C;8/T#^NC&O$;"=%%:8%16#EE +MG^9XHXN5#/S&[EZS@N#MM7.^U701+5/9:Z5PM7&6VVMOO+VBO<^H3;-5X4;?()1F--VXSF)\6_;1"R6/COH,[!)5DH\1LU? +M=DS,7YP-L:L868X)B56,RC[+OX#L(TY7Q-L10O6;%1?PLF"?'?G*?\WG%XH:[LO$?R\1&_V^BQ:O,:J+]\L_5QX],%92'3\IJ__\57Z,ZC2!/13T5'5& +MK>;YS_HG#24O.U___)5QY,?G*2)S(ST0S8M]3R9+'I^%B>KCP+KT<<#J(\LX +MR>G\\Y2/>45(IH@M)(D]2B1;)._1AQ3E\9#Q@%G@IMP!7< +M,9!IT2IY)4`VAP9;^=#[%G)!9<1.E*+YN=!/O7-3[NMSW4 +M3<^$$M'65>PRMK4G0)U1#;M%3]&P6TY/T?90R"BV6S/9);M%"$1<9RX%BS7( +M[85W.JI$K4C/!XM$"+SQ8:U%>PG*VJVJB4X;>_/O#:[G&2N#]AEM3U=?6]PZ +M8,9^O+/#O#D8E#E?\[E+8_^70=%P$9P"^ +MZ:C,:7E;D##Q74-&O6(\$-BX"ARK'-L#O_R6K%L,<0=/#S:B)O>;TRZN\3+) +M9VR'9'8BELUZ9DV;M-6DWE!\Y)-WP#3O^VQ7SLX.*XQ*&8\&#OLL7/D>.6!4 +M\Y5`Y?G');_:D.4`R(]/,=QA(@&>7)P\]Q9.AJ3=NN3EIWC'[#LM2FWD-GIK +M\CP0V$U`UT)!$>)O-A!MQ6G<+_X?Y54L)]G7#[7."SJGAQDUE]:(.!GUQ!E= +M^2DP*FXI;6OX8U)[;SA:>[1&2ZPU\']%2HRM5,M)HSWE*I_[5&XP;.=ILG,` +MWFR+^O,+>\ZC3\?^2OJTQBB<+N.5X#?YN)/X.,.(\XJ<@:P/1VWT:AXFPF%K +M[]&2=9R\59]Q,[YX6.4]93/$)PX`M7$6)X*OO-2ZT$^<-=.-2&;.0F86:8K2 +MP@'A]Q=+:M[)(9\LC<"YJ2/K0EXPZ<6Z\P*DNC +M>_Q^>V?U%XM;`\DK?O]\%D*L<+(7:\LU1D6];S1]OWT@+O=Q'WJ0R%!*Y%C9 +MBY-C./-[0:(?=F*'<.%'O`="/P34Q>_)R5EM/10G1%/$/FXN%QZ2EO`GD^>' +MM'OJS!=:39HR:9I23U!5?U+Y^%?-)DSJF+2%THJ@3KY:_A[+DN/ZZC_RO/O< +MK'W-?[%3!XR"A4O,*-G]KJ_L#F'>X@RJ[+_!$KPK7E:= +M`Z1=I-NH%2=F9[,)1VWQJAN]FZHCN-^ +MU^399M)V2NLF+S6[`=$K%UXMJ[/5R0Z37R?RHU)#1FTT_]Y@4FW2&TVI>@2H +MK51VM-2-IK0;3%I@E#:_;J3TIK.#-")\9?9F2KMFZ/NITJS'J%O,KP^9],,S +M8(,_Q"WB,8KC(.!L9G(I>HR3G&Y$I:DP +MJB5IXB#0/PW_XC2^G885N'`U'XQ:>\_>GZ`S9$D^!B\OW_AA_C1+^J"N,2K# +M\CZHG^#199#EOQUM9N(:U$>7M1<\:LF2P("KY6+Z2GF'7\N_A#T`L2)0VG,#Q!;_#!V_3\T,/1$3GNS=:.R-[#C1'9OBTU?HRBX-\0BLW$UJFD]<(L9QG5$?QWO[*F6-Z(Y5L'9?(_ZCHZH: +M<2%#>4;Z-46_X*GLTY3>0?E,P(,UI9^"/V2/K1S].@I/U90&E'91^@(\6*-4 +M[,]AE/B<6GJF^--XC(H^4P:Q\!R"LE_D:7JJ,[K"J';ZAVLZ"Q_U5?UI(*@% +M%V4,=48M\T@\]Z>'G(44O[]G +MSUQ.486>6`!Y,P8FI5Z4_5KL\1#>;:\O;M6'N%7-.QCF$+TF)@).%/:(9^<" +MHSA:PG0G>^OOI&JJ31Q)T9>35=1>C"H*X]2L0_#F\9/_84]?_J?^-_\,^.HA +MX1-[RJ-),B*_<7,NFH>].S@DUB3M#B6+&C,(OVMY:4#6)"_"8Z'&95:.MO6>QB$,-47C"EUB#['Z%-@ +MU''Z]EGZ/$L?7%6Q]\#>X:C6QF,_VQZO'+9:V_#A2GKTC3?E#!>9A;8.1?HH +M]8*O[>254I+7>Y57Y)'O6'D?C[F;IVJ,@GUYLC7G[JP.ZH?X%.>>\G?Y>;/N +M,/U79]1!^(:GI[^7_O$(E:'?AR@]3'F-41HRZA'Z=I0^CW$^FX4%L89GW3)B +MXS["PD>_IJKP,9]U'X>/\I_PBGSF>5^P1J +M02G[ZK(IQ+,+'@*K51CE-?FTE55SAI/$&\M4MY)<`S)J\ZH:!V<2.FH+TH/&=6. +M6")T7W(AO9?`9?]O:1ZOW+U*;2VJX%NWZC'NQ_FMQ7<3G%U9[<:,5:[:GB^, +MF9F.B[YWG&G=1:WHR@R=:S[2,JR],9F=$/,\^>KDZWC6&9G'^^_^-&_]-%7& +MK#Z>_XO8J&ZX$W9R!`W4P*7E*/_U6QK[B6N,&FEUW39[LAOSR%B^=5M[C^/@ +M&CMQ,[C)DRTY.V<.&;66%VWF$TBT8^2:G'J&XJ_X0SS7+E.,]KE9HJJHN$VO2\ +M'ME`\T>3UYXIEL"SP[*2]&=&`G%Q;E@'C/(/B<00MQ[G +M]D()=ZOL6`*1DWWJ^;+;-ULB9O]QK"!X!48Y3E7C7R7_$E.0W_`X`93'J*XJ +MQGPK.=AKXA>/DUP4G1+/W2J,@M3$I24J)P&CXM(2EY$:H^*24J3T,6=)3NKC +MTEZ0EK);3J&GR^Y4"CU==A]/04[*;LBHI\S5IU-+T@)V)'+2X^H)H$1:>HRT +M]+"T6#G!:F=APK87/`J/M`SIN'SXO_/3O#?1F,.TB)2@_?UGB4_<_$9^["-I +M[7>]D:\P"GN.^.KOT55MKM[X1EY-B.0$4F++DI0LDX\;I==K$W9\1-^#Y_!9 +M-_918^I'M:A+O?YQ<6O:V#V4W*BGR3^<6"&%R(=],UPKM5Z_-G[Z[XA_/2IS +MA:42_$OB`_>?(W4L/&KRTJN=5X1M\QZU[+%W59^BQ+\85;ML1BM[8HS7^!3' +M@MA-UP(IT48O8>WZ?\:N!3H<4//#N=]NJK7O;0_I/5_`GX12O;OH?>'ZJOM[U&? +M4VTC![1Y2)MD_P4)0N'\SY5S(>-S!'N=>ZX\UXUK@$E&H0QX^0Y'^\8XDE"N +MS>/F9"]%J*]0R=WR7.B-]>0K=9)*,_T]75=IS,@4L04JQDN64$_7 +M02J3]HU+KP9=QX$^Q&DI:P%-AT\!7!\%U\7O*=F7_)B076[@*=XG?U;?IWH? +M8EKD^5#.10UN#BB@7OCG]7&\G_@^]]',17D2U^(9SW$-%(M$L@#22))0\L0: +M5"?PWF)O-MQ+<5J2(W"P###&_7Y;))WOK[X;&N%38X^`0DT6,TW+MO*)^C'<-U>KR:D^0&T5"A90,YW_' +M<&@BHF:KUF;/4-*C/VY@KN.Z/2NF-'(XVPE"->K9%:`#Z0H-A-QQ\#2ND$E" +MP2][\#<4? +MUI._0/U]\YS6@8._8]A27(5TBS."]9YJ\A$['%[;B?KMP/X!Y7A:?9S+6&X_ +MXC.)H*:-;U^6H3VZ%&@5];)I06D?+_(!UM)]]5X@[X'@*CF.F +M"Y'EM"2O<-*X\]7Z07Z:\X2JULBKUYV*/]!MB.JZLL4('N97C/4[#RA +M.)<8VR+KB)-T/=EKAI96Y+3V*-OCA8%HF-C3[6&O:K;GCT.$VNK[F)-J-17I +M2GBZQ[P/?0Z'A%6]?H@Z49)0U>M4\C.;R?NKW%VBFI0BU.[2"!=GC>1$WG_4 +M#;G)2_:)[\8HL':L-B-T/9: +MT:..$*62W17KJ^\*26`1H?.>DDWH'9K92D/SQ&M\$W>'#HB^HL0YSE/ +M+'R9+`"SG:I?A1H8MB-PD/H)0&-FK +M5"JWANK9K>2L6O4+RMS97_I7!XTT;>U>BE#RN0:J5^%1/*HLN%>-@)=MG2Z_ +M*D2:4&C!Y5M9Z'5N2$,^R6]G&352H<)CDKC:+V2#+1[YV,&90.J_"*5S8&0H +MB59Q%*MLD7"[(<950]_U'21I_>I+6\M'W +M)+7W%UD.2Q,JI"P7Y):W'=VCD*U!B#F1)52OFFL<2B;/GSE()K^!<[U/::OD +M?X)0Y/,01I4O_@FEA'8+]YZ@KRT]2V7/1M27_L1S59C&Q#]Q2>3OGB399QK\ +M3A!*WOT1W=EY5UBY7D@&^W.9PWE"!?EUYY#=,F' +M&^6.=QP=0PTM0)NM=HO6*3!>)J%ZFF%\@+O#U%W4+O:%WTWJ=Y)1RFLV1J^P +MM'?HY;L=7G>']D@H^A$*7A: +MQR.[N%#$LYQ6%1<&Q3.I+XZMFUERY7_D2\#H,431E=!N?Z. +M=RC>(GU'Z!.+A*+9[KOY6\I77Z=O*4:\02LVF+-]%J7UZBY'0EKRF'<=&B]P +M/6?Z.QS!!>/#,&HKH"S.D:QO?E^98Y)0)(W=K'+\C\HQ]`;M1!>'O^ND."V5 +MB_C6.TZMNI$^:V^CJ)[OR)ZEI+3.4GMVE::29=3/=SFB@>_*R#N.MK80J^`^M*\\ +MHQ9R'%$_S2U%;DOXUL#;3O%L_86JZWK%?H5S:O%>>R*_81V7-W&.KH5*',E12BLP5#?I1CSO".O&Q'WZX="I7T4 +MM6N;T^&XLZSU8ZFR3!?-3U321E:I^`W0_^HYFA-!.FAN5;4ABC?'J"G;'"K3 +M2"C3N6\X.B><$0ECI,8?$ZI?N$C+B2&*XSUQ4'__X^I:*"[^P*FF($DH/V8S +MTO+*6Q5R$XYM*4[KLU`/#BTZ%>//W:_Y'HK2A*HU9I3EBIB5Y;3T'.T!):HQ +M\J3Z>#1@"9H?,BW=EKX(;:E(*-E2>_S1;]CG5M="\GD+M;A!>0VQT!Z`4%B; +M=0Z7(LN'V?&*\?'M4M1:C!JVZ9SNZ!,;..'IA,]C]I0FVYC6>M0RJ& +MCO89-?&_G&/V7#WR85W_'$H&7\5=YVHU%F<54?XBE/SE$SQ^7?X$2S)?PAJN +MTH51K,BH[B<FF,`X!]'M>O[6>C'D'MN7][)^W&01EGT61Z +M*T$HB?&++M7I3?8VH(;Q6^Y?&W$/,*-ZGN`1O7_\7$I3/97R":J1*4)AJJ)+ +MT=(/.4$EU?HIU,Y9Z4JZ`K0@!6.Z+"IGEE`A]#>Q9\?TT/X8:96?Z/*B)Z`\ +MTS5O<&YH0;.XRYHU#+Y2D5$HWY\_&$D[QM#W\/F(HI(O):\DY7CL`1XFSE?4 +M#^*DF`-IQRQ7=HESDH3"O/&=4@GC@\=&Z[)1BX%2I0@5?@UX#_1HSRR4U@\@ +MK3WL,S-]OAY%D;:(FL&-=`O_ZV"?G264?+"V%V>_/1*J>C[!7Y_^8XEZ@>+Y +M0XUI03G?OH!TJX-X5Y"V#D9M+KRZ0W`/1#D +M*R5Y@6ZU8E&[FZ+XI.AW!2.NW]C1##5ZQ0>E]M0%W(GC2GH952V3IR\82B:_ +M&WF?4?I/P;6G+">1$(NSHCDF7J&A%/I((]T\U#^'1-IFKU3.S3U9V%\Q3HTS65XIIS?^?.F\/DN5G[ +M;+;0QN.R'=/1DB--J";@?40AT,>R;*K4C[*$DB-?YSYB(7MYT5ZU#[84ECB=AW,8>[ZS7_=E4^T*J +M7S5B;04M"1,7!L='G+O9%R@N+AE!-B<[E[#==I)0V&.@1VX+9V##W?8P.*.% +M2A/&T!+==HI06.J![BOM(GP1&\>0!T?$@_,>Z0NKY9Q:]J)90OE?I2?3F1Z8 +M.H6L-7".]?KX*=C.\TQ]Y#JOI2\ZC.9`^Y>YN,OEM=`4D%0V=&*W8!K04C/(VYXV!(;(Y&X70+D[./L-*.&\;M8'AH; +MH-JEV0SVP*G>>4%CZT("%<>M&MT`OB37Q>\"[ +MY[&N'C,R7B04[I#$W'H*Z(&):S-Q%?J/7\AEMGT1HGZ^;*J=7CO5ODJ2'[A9 +MNA0?U==9.2A!@E`?A8ZS^]8NLQ>B1M@FW)4X0[86J#\(VM/!PDT2"J/;^-^O +M_F"*P4(Y4L2HJ)6Z2,L`W<3O!M='[-G.7(&WTXQ2:6"T"4)DQB2QPQK3)?JP +MA60)-50T.MU"\A=5U]7@CM[A5-^FND4_Q_6A#K*9F/1W&&F6AJR'X'<+]0@= +MMCU?E_'':)D,/UK(\WL'[5L,'\4R<()1D"JF]TA=AUT"U$9(YWFX?A2.XX`3 +MR?F:$UCSIO5&_0BR^LU'ZT-6BE`1^`J/AE@[U4^?@W1.56^EYVOY'K_P#KR5G:_+N%$AT,<\Q2B%=#MZ>9XI3ZAA];BO/0I]@^>71(1#[K\: +M.$YKD5#ZG>$?E]KI6B$W0?KD8?TG04Y@>6*J)" +M^-+T[V),$1K*8'PDE!340G&M9*Y^_Y^A;EM?%PGUS\9.ZWB:S]LZ?26\08@- +MP^(:95^L42(J/'IJ>ZV8*\5'Q-EA2]@)0B$->'EH^W(]V0`E2A$*+6S"ZHX(T>7]!:(DTH>JIJBU\G +MAI5M;;.$N@_^Q]7<:WX@Q&HX;H3C=^J,1YY0>)4)W*T^BC[J]W!L@+JN<]Q0 +MK^+SH'Q_B?Y"NH6,<)N +M63G"UK[2Q++K9N69>JMG%LA)/6B-6M=E]>`L/44DC9TU!>2=*45&B:]/"7=] +M'9]R;-AQAT\18QYWT'\TQBJU%R"*8I7"W0."L4KOBL8IRNRXPT6"4!'T\Q%K +M%QAQ5"Q\?;IHB[O8PUC297M=0C7ARNEA'7/%Z+$+Q-K8@J:>D&VM#=F1U2$; +M+4E2A!*0?]V`)R/RZU"S06"5GZ>H3M$OTBJVN,82K@ +M=Y;3:GI\T%IAL._/$RKH+1FC?^/7FJ@BD\+7.JZXH'I4&%?C:]F7:@F&)+ZV +MFSK%ZFT=8O7VCO#`]FZT"4,N)P@EUEI3Q$=YA^+/K]W1(?H:0`JQ;`L.K(5) +M0H4'IDHQNL.M(W]^BSWZAM%.YC:\F>*T>KL[0+>WM8R)WKDB8BS<[W`C5LA. +M$RH$3]FRDI]6IYTE5$4.\+YEA:@'=Z$^#"^6VO.A2K5$,J3FA +M_K@040GT$?)&OJ:':?*G0*C@>_B&?+7RC>3"O8W;\EW0TW#^GE`H/XL-4"\^ +M*-7T'I->&)20*SQZO%YR2.9$_9%1ZQ]WY%NUT\$4\HRJIN>E$EO?H"2_[G&G +MR*AM0Z=#O/LI23!!>IXO.99*1]P#E+Q0OY=+E'VI[I.#)4.II#GM-#6 +M`4:6<.]4JPYG^2.%F\)XGB?(LJI(J'5L+<51Z-1*E]X%T(3QW1=Q;R+\_>[W +M*W)Q*)YDE$Y#J%EFZ!L) +MJ2PF4XNTODVQC!>&XC7KUZ)@_=(U&]^0\T.^YI0EU)#1&$%'Q?+G51F5_`9C +M=6FQ6H]&KM@\=A<9]4,L,7,BH:(G4YF?Y;+;EQ%J[!:G1:'^%%@U8,[&K`2A +MFO!KD`9P?Z?/E=$\PY*!ZR2G!8IN&]JS19B3X@?L`UHJ.YW49;7J*FHW3.>U +M'L:@2Q/*JI_"5E@-W(=1=+H^Z*'J.V!T+DS/$DK)69ZDF=U.WO^E4?!VGE$? +MJ4A):"<$XUFXJU-BFK13J&^L*#+U=;PR0TCT["G"O.>J"_I5C!??A2B,U%?+ +M(D*/#@E"^?M]L+4]^";/J2$GSGB+Y@>275SOMT\/?0DNQL#YBR(6BS3X]0PU +MGA2A<-;G0C57>P"NK/QC1-S"V`CO%IR[18.5YK1PM\86U4)P]_,=JMZBSH7K +MVX1R_\OV>Q2'=56L]7SK!(K<6H=1F4=M=?*<5LPZA;@P'SU)L+=>G!MH4.L, +M14)9>UBJ#BL=--1E3:D'?;(>.(1(>S%]'!JA9GHX&S4Q1-*R"V?2B7!5.T$H +MFMOX:)NC5UC$?]^D]8"KE&UG0SBG"(4[#B/P2QZU +MV]$Y8PQOC/@LCNQWTHLUOR2G;E,?/T:5#SV8`!590LGU3,>@_37H/P7W/W): +MN$X[#.>@06-]N,#KHZ>4>5=D3@`'Y<*M#LV)[K?=D6,KZ:/*1G&I<==.@UXY +M0/2];_);([<["4+)`VN4347!Q-J4)!3:&860MCK\2MMH#:L.S_`0]PVFI&Y# +MU"]$T,,4US.N2:PWI`E5JD-%0E9$"PON[LE*W=]7V[X$U_GRA!)SWBS;.TQ` +MOD5=<2/49NS7L+\GU-YJ,]9CNYO[PD!M[IOJUV:Q$;Y#V\,G)[IU'RWCM6LS +MUN,DH2IK\\,=]_F$1GXOAUCIG/.-N38"H=\]6-*M\@YJMI, +MW[)1E4^M;8I+WW3LGB#UD(9%:?SW0P?3TU\^T5/F/7__6E\^V1.4%'!UDR1; +MZ"57D;=O#W?0VJD>;K4];DAYNA*-6Z=?V<\]:!-Z.Y`@KW):7=*-](%^`&<+ +MSL/@W`1G3+<5SEE"M:$?3#C&P1&'HPG*V-2BM%?9X^8)9<,3\D(+=UHPC1%\ +MC6]BVRHR)^`.ID>QYN$:TR,;"+C&].TEA`(.AH=)$07-_DKRW-=#^FQB"6NR +M"4+]R1/B7CB>A&,='/\'!Y1._,-#+5BZ24*%(CT6O._B/*.PKV\5*PK3EW]0 +M:H\KB_L4HV!4K^L*I86=:XW`N#N`,<]Q=G$8SDG*UC33-?SEZ<-Q1PH@ZBAF +M.;2,T$L43UKT0?TB5'TD9C5TA3SRD!`6W@39P1ZA@*L3^CKL/*$F](:L\IK< +M9&]156]7)!12B?3@_LS/0SHRD,[GX;![F:NUO-E`3T7RQ`-6@E%HR3B"1X8O +MDSV9\BTSC.\E"56XM_P$[=N;1`85/VNB-M9K6 +MDZSCB>;<`;&N!G_MJD@H7-L&?;C%UD]PSDNU,DS!7DH,!$1((^I9JCWQA;+, +MF2!4-TI0V.4H&Q.BH-=ML=2;24:-9.D%HZU:@9PP#S'_0R>U5(]\\^%K).#+ +MEDHC7!E_S5^SH/A6C*(U"OC^WW_6[ZO1$SW9#_UMAY-=JB7DG?"50E]3NQ#> +M+[67EBK?RN^"_NCG.)AGHE5[OR@R]9"WJWB&J/NAWC[MMM'?`'YMW+V9(A3*IL>% +M>8Z0=X(*ZUC18?.^/A@?"?6HLJB8)O2^OC'>,:*\KR]+*-K=%R[O`,T`:@:@ +M?J#2RA.J8BLE&9;/+3>2%ZNOV/_;562 +M$(XN:N]\RG&FMU[1@.ELUKEC +MSW!?6!09I7D5JLQUL]IU9"_7=%53'*0UL7P0OSY3@U_+]\:OO.;7]XM?RH?@5[/?SR[4VQR/`BYVXITPLWM[A+6YG7S,8[X10\J\[21J[ +M^+N"_7^=NI5^WZ/HLJ\@:5O9_Y$]P!K7EML^0+)7WJU.]P[>,T0M.()2./1?G%8X-%&^6FJ7ZQ]SV.YA +ML5=`U!J<]VVWBHS:4Y8XN/5F&JE\/2&R,;-7($J7B[XT6?FKM)3,E""4K@/K +MN3>Q1._XBGU.R15:`T//L=J[P7J5*\W>0+HI0E'JBH:G:^2>+J,4#3KW38'< +MLRNJ>Y/JW!&=9Q304*=H".;^C,J]N$+SJQ8'=.[V2AH[AN"`SCU!*$U#7G$@ +M4I5[QZOA>P9R3ZW4=*&F*7^QR]$M)`D:Q83%#2Y&BTXS:C&T +MCI_M,VJ!NK]CA"3DV*16.)QFPY+>R;#V2[POJNKU6(O+ +M90IK7JDVE2"47P?"9>OB+7I?+,;G8]0E(?*TU*9G*H7K5?"+4-2SD9T/MWAL +M$=HK,]*9YK36T,YZU3+0L!GTR!4?.6(%TYN],E@+J=5'RU1K>O-7^E\;.8`] +MP9*7'9_Z-M`G>DKMQ2OU**K3J]NCYUC+;Y;?:AD!Z>C:PC2VA$XPZ=BO/ +M#-^UV=$[$FR]FG3N^TZ241=7\CZ"G+F(>RFL^ZE5%;R_$)[H7*^VXN("]IV: +M7A4<.RJD=I1;5_^S4WSC,2=+J/[2E6[E2LAD7F4)=PJQ>JJ;Y[3@*<=4&NOB +M&@[N[8N@+ZEEH,&&PW9Q%6NL[;22@I'MT5^46.8)]@(,>BGZV_X9]P#>7#3_ +MCE!L$M$BOOI8Q5I*XF=!3;K:(LOW_T4H*A.N_H&TCCOD1V"K@&\AH^$XSLZF +M""51%V[D.VBG)UOY&FU9_@?7:PFUC][7\6!=7`;7:>$IZK590CUWIA#_A:,` +MQ\MG"G_F&65U+'_^9WI$)B[(F-M$N\[=N5@;(CP7W%)DU!`^-GU[\G3P.U;[ +MV<395/2%GTCKT8H\X_X.>J76Q_0^BEF\-\FRDH0*^=:+I4[:ET1M:@SO2VIS +M[12GA?.RGWG,WZ$D#]M9L34VO6Q$WU&;'J*=]_4`P6XQP;E54+1[H7> +M\LH#10*`MUJ>8^KMGVNN:OFFPB.PLJ]-$*HEN.,?=R]O_Z_#MJ+,QR2ANEM$ +M++A7'M__$GY72]F3,PIJ7-2W5:Q$H*R8)A1YX.AG?QB8@]Y9CWOJL;YE?Q[\ +MCA/4TPGX]+*GV+\,E"!/*&VI?!T*'].'Q_5;"?56D5");O:1-D[='4>[]YEG +M_P)>VK]@:4CMG_B(]^,'>8;4)P@E!\:XLOUII]9,)];;)*&J9SK]W4;O["`9 +M,_6+O[7NSOY"ZVGRU1U#KI[F">73L74'U2=Y2QVUT:S: +M05C\1;#/J:DOH,[V2^+7N:AM7HL +MZLEU)AC%GE@\[;L;?4^2!7NS:!W5-]Y*$FK8P%17M)WEB39N$3W'PDUXLPG> +M1%O^%*%Z#D$__`U6BX6C5!3>.,&3#ZDV="2TQZMT'WWN?\L\0Q\&02JRA,)8 +M8N0I#.W;EKN\"S&D8I;`[SRAHOHN\GHYY*IM:D)J_9%04N_.1SI:N*\X+T"! +M_2O*,<82[?GT!*0#2'<9VA$M&^M%^J25(!33\1+3`7>C^C?-=L:L)*&JZ0A2 +M@)I4BE#1@4Z7[(Z#]$"N2]]G?29-J.`37)L.\@JC`F9_I>OJECN@QO1-M7!F +M1?-J7_B-,RYY1BE>V;@^H5$!&HN_\GMR12G6A^!.B3!6X=O4FH="4*I=CA`110CYZBLH0:"1H%^E'`?AK'U@6H8:"]+ZX>?/._3OYJ +MS0GY&QX+,U5ST61OXI>1>I,>S\,H`E>P19_6OFUTOLY0(0*VCE +M07IXCWC8([S$K_VZBM%+:\TWX?PJH<**[T)I7#N1MC[7FHOVTKTQ+\4Y0OX> +MCH=2I'!6'LI:T;.G&25(-TO2ZO>R:Z4(3R$?AM@K"3O +MK=-7?,SK)K13KVDF>*OXZ[*D@.\SOYJ07[W, +M*^2(?8U?1GC:^,E@7B&7$H32O")/?;V+)4COGK_7*1UJ33(J3+%JX(NXK;B" +M/OSCRK7S%*.J=L+=K>9VY#X?40U($RJC=:HE_=RS1_RY+S4[]=GWG>(US'M&W*L0U>.E_9N@O%J]]U=^LAM] +M!203O]']1"NDXZE:[$$)&E%R_V@WR:Y)0LD/>08)9^P[.1^$4@S0JY.OV;H7J`H.5-EE"A96-:Q4,BKBU(2';%>S1C'[/R +M3-?[FWR=I99U4/$W^CM66#V!#"7^6D[;7DTY0@[T1.4@7ZM,.[%:4U]M-U2Q +M7W0UUVC>W?4FVH:$,HTDC]\!.8H&RC'EYTA/=([_W52A@:57!Z6A:IY-T/N1 +M5VL-S+?MH!G!F5[;QK!`?8_T;<[Q6#6*7@ET=:,GVC%>?_>W;%&*N=#Y6T7. +MLW*>N/)C?^4Z?!BGC?K6).@7 +M$XQ"C0LR.UII7);*_%MH+M4B&0ZX42QA;,G8W`C\3OU6 +M:R>XXX9GAQ=[ZU>$Q8(!:,5UA>FK@(PTHZ(A>V?I6R[.Q:1O#HM6C+4!8P=& +M)*\#73G+*,GIV/2TT&AU-4P1-VUR=-SR/*.6;)]^)?9[:W&/J&6+&S4N8+^$.PUNJ5IWE1S!>+(U.F0GUVA^Z:];*@FW"3D2KHOK7%.$PO'YZV0_`=)+>YC\'WV. +MYC$%C@+H12X?4C^:E.%3[W\FEK2MFYU^PSM"=-!=)90 +M\N)-U&-2#]"-NY9@S%7IB?F;G'P%74/QKRNC3BNQMB*MTSFMD$[K#$XKN=>T?'ZM]?GU0^*7VE6J^#5#\6NM$;\( +M);^KT@%ESN?3=S;Y^F1^[5#:G$Y'?!OJUUK=TGR^2TA3TW4BIV=?.Q1=0:O& +M!*&05^*+S"O1#[R26,^`7U]4_+JVFE^T(HQOD6>ZF#?R02%2UW)='8,QXFDG +M$,DH`608XQE^*HKB\WTJRL)X8#51U64M$LJWX@VD$<)(4^IM.X,H2F-A>3\_ +M[;J,`V=&,S*149*5O].I%E>2&27Q$6^8F]4E`5V74$0+S@C#R-!$_L1$A<^G +M=*;6Z(YV9#@K+X=M'<(0)=[B1T%BK*=3)_M.B'2GTR9YGE/4I +M\L3>J[7)H9 +MIERI[L>PSM+^9%S=2Q.JA_0>(5'WD6]AS8[2:@35:J`D>QWS?FB[;9S)SE^G +M:T[9VFC4V3J9;OU<?Z%:O@O1"@%; +M3N+WY3K!;4B(3K>I&Z/;3+%01Q.]8Y))0H$,HMH?6[$CY8P,4YU(,:JJ!YE4 +MS2]"D00*&M..)2,H?B#VI;A6T3IPHXM1:K.$>J5TI:O7*.(R1!(:Y:9V".4) +ME11G6:^@;[\H2!I('TAZ2['_"<,CD'F*A++DP?0E2`X,\\#DHF<6U.K0G^@- +MW#.%;/(3B'W8?;B?>,24G:6W.G2.B1OT^(C4RFLV.DAMW8`K3R-/FA[&[Q!) +ME98%6A=(UE![DUT/NU@VE+(BDKUTIPB%.X`B`Q(:UYFT2D:VV^$P[2T/87QD +M0BT%C0E+@#$(K1[TN'>POW\H`K^SG.-*Z"7!.Y]RQ"H1V[-TA%5:''/W+/F67;Q!ZVFA*P6MH9V&G@F@=XH,>&1Y +M_@KH@O8?N'Z%+?1`B/M8(Z&`)`I41.I"=H)05F^H/%\8+JZ5VV25B.[MO;TPQ"MO,9>B+Y"D'XYZ2E\]1N)]X/,U.I0EU-&FJDNR& +MX#I)%J"TRSCF;BIY;I:IQ]B/RU'J[[;WP!ECN?0O%Q0EY3TXYPF%,5UV+A<4 +M,V47G#&VRV;T(2$Z[*?@7/P#RSD=]M-+T6M`A_T,G.O@W*0\$ZIDB8KHOG(1]X:*8T@ZI-;?8-R,JJNC";_`F1H+.V-OEX67']'K1$7"56A +M%T-;LL)LE:*_N'T+/L#]1]@/RA^'XKC"O!MJ#NXU%*%PO-C;N)8F%(XU>QO7 +MLDP74+ZW<2W/*/8V[H]K/2>PC8+N@8NW^/T][O'X6KF_P+FGR6INP+Z5VM!\ +M(%BM2]1:74SP!1^G(LG1^A"AT"8G#'+JR'FW6/9GGM&2G"T]=T1]RIST=%N_4"ZL#5]Y"3%^14"Z\2^_#G:_# +M^9P^:4WKFTK^RK^`,0C^%U$G0CF^`4^_"4<TBN%;IP\#_0"IYWGEF5Z64%MHWUV'C73@ +MW1?PM]4-XQK_SA.J0'<[["_T<#G%`2+V34(A?5A&M`A!7LBA&N_?%BR%*>UE_)AR=*,4N5#+GY3U3&@+XGW#NN; +M:F4)=6CO>/1YE!3IP@&VR#7J/<[:`B!/J%?10^_NAGAXS_;I:!J'-&%$+*3S +MV+53[2*A\-M])W*"C:TC"JV#N!!H'?;M6E+`.O!U^.J(;,!V!,BXJO<)0H55 +MS?VZJJ]8*ROB@1%J*"L>?WW[=BW[WH#M4>T.F@BI1L +MYHH^719I7%,M"^I%-(HV/F,E2@J1WPO;_B.-"K\3N(W*HEP*C3,%WE$>]6F%+D>>T:EDRH!W%^6$:^8N$ +MROU4I7'XJS7M,>P[*,=@&E6YBT->=1*,4GO=Y3DAR@%Z`$Y[+*>=O$-_[:'F +MYM#"+D4H[;5!3GVG)EUIGZX)78-MK+0/BBRAT!.%$-XLG!>WY2.-HJU]UM$# +M.SIB`]:4<7+:L#RA6OLLBE@2[A&QZA;[EZ@014+)JQKBZ)>,?*^`?/_A8N$] +MVLW6.*VRS[:S1-=/N3?:6;W/`,HH,7X:HY2]$<[[XY-K'N'QK4[O5\BR-*3V +MP""_@:ON<,7W",<43A'*]PJ)^PJ',Q+?H`AD'[WBI%5:7#W1?@]5L +MQ2W2D>W,`=DLZVE6>711_6J;V@^!\GJ>J5?EB>&38:AY'E;QJ- +M(2G]1@3TQSLU78@\QVID.PHHP15X+5!F/=1-$>KB/L[E8K4G<+Y8;I.`>^.A +MGOSO5B=]IY8GL![,5YP=ABL'/X0:<&.C)Y=^Y&09!;_$R2_Y-J)A77?[WW;D +MMT$?\JGW:6HLT]3:=X*%=!4))?NX+!+HJD8@S?9=2N(CRO')?.M0G$5RL02$ +MQ/V/A)H?X(WFY@*XAY3(AS<[24X+5Z>K=KM0FKA3",='1J&%!5"^(ESV/BHO +M>MW1O$L3"NL2UBF40E%J;,;)74`TBFEV$UQG"34*\K +MX2(RSSDVNZW#+(OL3(;A,E*@5G:/$+&B3_W*ZFAM^CO>OM6Q_U3K.YZ"W_$( +M]1V_\Y&3^)/_'0GP%$[-_;0&7='^Y%!+0VR"?])VZ/T$HW@SZJ8M4$I:]P1BM=Y/T>YN]2NRW@/EG$4E!'JVF>`@B*AWL,V_5&I_5WD(IRQ +MK^G^H-2^G"(S%*;;=U-O\F>,SP#(Q2!=?5AJ1UVH^]U2>Q'OO5=J3Q!*[H2G +M*G(K\>Y_/G*"GA*2A!K*BPWZKR'[PKOUJ#"A:E1(!'KV]-U!&2"H4XT;6.;& +M09LJELYSLW=K70%UJHFD3PG>3:5F[A:`-I6_F_7MH><*+7&P5;Q;M;0AYPI1 +MF[+O0936J4)G#IXKI/4A0I&_HDL?<>)JKG!18*X0->/D/2P#\%SA@JZ'W7%5 +M<1O1+HBCJEW:^!MWNB=I%1LQ]QM'XME"8N`CJX?6]0%R7[Q'MQAE\H +M#Y/LQR!!*/E8?WD.P,79OQ$6Z_!0J4!+3'):>\D-T2E&J=R"Y<(2R9.X1.E[ +MN3T.+I?\UB.\2GQ_OY/EM+1V?V0E34U(U[[0WQO15=P[75]ENNP_#TG75Q1= +M=_0[B3]7T#669S`PAG9XA*(1[;\(A1&O<0^FMG22O]WJ8!^Q:V"R&P&9($4H +MV8)-51K +MU>VT2*BA6JMNI_9]B!JJM>IVFB!4^'>E=CGP6L4\Q]>T#<3M`TZ24'N;YZ#U +M(4(E]J*_T'K'?I8+MTQ*,0K[@^B7N;5JTV+MM'5IXJ0@#H&UV$HW73V`M? +M:[>Z3A&*K)WW:'_1,`I&&BI\,Z0)%5RO&D=6DFQ=1SD#\=G_&TJWTKRO[XK) +MO$+%DA1+7<; +MI;G+G65DF/S\O-B9(-0,W@%/$8#$5D0UL&2[*);L!^T_22AJPV_U5]3"'^M: +M>/:`D_I+K5I8K2FF"56K]B$'=-FS?U&<`,ISQ`&J#R]"[M`^B5X9M?*,:BM3 +MBOYT*3;[NP%^,?7CD;@HM+_)%'.(OG(XUX'Z\F4#DZ^Q_TIIW?\(60C6\QHM +MQ]P:K>)GB89D@E$J#?3GBU:?S7PSB>/`SN[/6TE"X:ZN55"W=F(+P:?K`E]J +M%.ALA$(\(J_\F&T,D1;Q7;W"RZ[B_'^%BCR0N*?EQ<)"F\4JRS1-*M@TX +M\JWZN(Z717Z;L?;\AM\J$JKZ73D*WMI>'Q>7;7#P3?MO1-<>%<$!=4BT)Y"" +M_&7RSOW2F`2A<,U]J`/;5_)OW&.6QFB:0MMAA$AMH!D:<0/3E?I;3;JB0-0O0NW=$P?4+T+]*Q#C`4=D\33DU,K?-H_QI+F,RI=&M](5;@GL +M^0GO`_H0H^)YWF4QDE&/OA#VYQE0%K#_KB7D1P*YHDP@OK^!/&C@UTO\7<\6 +MR)]8%+F,XO&@W1)!3ZRI%O_-LI[QJ[OQ/CQ"%'Y6D;G!3GB'H" +M5I9U'$."?+`A=[\)N<*S-*&P#LC/J!*$!Y<@RRCL"^\I6VM4SUCF_Q[L"RM\ +M#Z*_7Y!HCL/Z1:@1OX(<4RR186Z3-JJZ_]$'CKPN&K?O)TXLY/TYU`?"7?$S +M>&MM-!Y1M3MQO^9J^NG`MURA(O"N@3=:-SI)1BV'KP!TU*'5%&KD\(7/Q1RO +MCL8QGQ2APDO1STK4%?F-CEP"-W[)3W%TEC^/QM.$(O^^$N=>HI8],-X5"P#= +MA1^%T5E"T3LKF=J>GP;0#J`O!7E5T17(X7*%OIAI%5]]U"DRZB?PM+>,%$L8 +M&9[']-HY0AWSJ$-^B'*[*\?LJS:,@QS.`7YPC?IV/X=W3U=-1FQSY797F*QN= +M(G/B.V5^R_T`?2KD=/*CCC@%SE`"^P%"G:S2>&0CS1CY7V@ZY/@MJ%^$DOO# +M+XQ^/",:K]-?ZGO1N(YPFB04^@S%NUC7OZ+J+#"4\3H0??_[`$5]0O+H44,=`_U5&;06ZCL9!?("]T'T#T$`;4(IU-*,,>P?<2C$+K$Y0MOPGHP_E)"]`8QK6*:8\Z248= +MJJB%VB/;5:O+`@7CN52I?_#7AK*]"M2/*^M!*^$):D!_![DP3:CM*>$?3UW` +MYP*<7X=C)QQ90GT"5U%X,AR.S\#1IMX8`\?!<.0)=3A<'1U(3Q]?@.-+^4M>6,CUAP++>'0&^.XYYSB@[X&MG#[].ZSX4?,.J4)97(+K?/& +MNFB-:*\GU%UAU62Y]G19#Z +MI;QC+TNH?>%N6-^E'7LQBT90M:LPOYY']\J]A=W?T*V_U(GE+Q*JK?L$YN`3 +M>4?NSV6S`G3:#ZDRL@WE6$!-P3Z^7,:)\"SQD"YCTU[*F'RHHHQ?KEW&U$,F +M94P_5+.,1U66,?M011E=\A`]BW1C7*=0^];SA$(?CR*P3]W&^'I=;SGR4$$V +M1$5"]=]>->,S`.?KMSJZC/8_*\H( +ME"93C,*O<]ES?EQ%<=>'&)?E%+D?4Y\FU.Y:U*_:2F_AO'26T[H-WK6Y+H@: +MWS-/*/2CG\`RWEYJ1]="./<5N@6C()7:792_"!4"_2RI9I7E1Z7V#%[_+[^1 +MQOGHAXGW.^'IKE)[%I^N*[7G\'P_I(4ST$!;@E#B%__F[[=P!\O1^$VO?9'D +MR_#/(1]"#36/H_?!IQX.]CG'#[&ZF":4]G,?]'`_\8AF>U*BV7:/@OZ+T\*U +MQ[LFG$IQ8?:\1G:+H&7,:AFX98I]:Z.=)U23O*51X-[?T;$IUH`U)=IG68W( +M53O6*GK$F45.:_4_9Y$_@/@5IX2MX?3EFRC>^'!RA`RX3ED7B24=;AEDH=ZL1PMU3O +M#MOOAJGVRUV-GFAV1Z<(5;?P-?)[^#*>&]&^QK(P$I"\Z#$G%(E;:4*Y>C
0%M;JGDQO(,V +MR*&%(\`-'PVN8?%43_X:<-6X6:[;$J: +MZQ9[(+"W[;O*1Q;X=7/MJ86MNMN]6I!*=+:'02K1V4K*=8Z3WN+RO4E9'MFC +M$[W4U/&A,=DK;(7EUIM.ZL8U(^95L>/AYNIF?.94<_IV?"I=J;5Y8?Y/$^BI +M4Z7T>?\D/:8>MQUCO8Z'MU=OEV*E/,;MD&*=#^^HWB'%[DB_9S3OH\X6]J@C +M$!AC/Q%(+73,]^O8DE1HX;N'DHI+UMK+;X[L+[&!_&:RYB%_R,>.L?[2]1,M1FYF^00 +MUT09U<%P,YX^26'4C-],W,#;!'OYX[X0I#1ZWO:\NRE3..@+<20;)#Y7:O#W +M?'Q]H4X:/40P>0YY+GB,WK=AI4E9(1<.>IJ,GH\VQ2(3AGH@CX`O?GY? +M(1B!Y@^&?@UQQS?'(@\-QR)KAW[)TRR$ZZW*LO6(XWDRDPB:0BK[EY7G9!L< +M=`W?](MR"B2V+YN)21L\PA-AG'#O>NOZYZIT@6]\+RS2ZGY!?G.'/U-:,6;I +MC^D"S_.L3NV(10H2>P?:[EBD<.A'%3+6/T^HCT7T0PZH-?!34@NP\*L.=C;C +M"7W$-T?K_GC:;I1;>;A*Q9B!;VT!OI7D/*C[@?U88$E;1]F2LV1&=>@1/@DX +MM(K0PXN.Z$L\]]N/->UM4C,=L/9JF8?XA^Q6:WK?VU%&G3WK1>3DFYA"II.) +M13X<-E>BGFM]Z,;RB;S.!7-@78M$;]MT$^S^N8O7DNEK0C="WZ:W/;"@H^P[ +MIRB]R5C/7IFL@41EB:7Z,OEAZE9(V_UKL2^`!UH<:?%%!"'AUK +MU?:>)A%XA$*!$+1WT_D`024C^LQ5>_FXQFRCX^L'KBM6)?";LOBZ@NL+\I/+ +MU?%U9U-BW9D/]^1)<7YSE-=$/O,2\(>7[%K7L:9+G+^I!6:`FK$22KA12!,^ +MLFM7?&0_&4!\N3_:3V[:J8NWQ/)AE`UBD9+A%.%#?JQGAN=8`$N=*<*<7]M; +MKG/U!`)KK9"&;H]%I@\C1JR$D!SZ/?>NG;B.!=26CK7XC-HB1F*QM^S!M2@! +MKH^]4>6?C:=H::!BKTY&*I:F?Q.H&!4>'_NEXS?V5ZK27.VS.>!#2D#RZ8%U +M/](XP_,RI_+\@GO+J:IYV;ZWK=6)>-`H_>A#/^=0[ID4_&7Y/D2UAS$V(70& +M*`A]\HR7,I_QZ`)4@J.6&36G?*Q5<7^KRO^X1\:>\5`"S>[SW.A'C.UYL5@< +MJQ?XGUCDL>ACP%\#;;2T--#[U/I8Y,C0#[D?V3$N?7M'F?)D:9/:)`LN;&C5 +M4PU]_5A2JI?2?XFXT>&AP1F>=BCQ;JG$#]D[VEJ<@03.ZO%^#U":?4#5AJ*M +M%8XFF5$.[_LT.OK=:&W#O8ES@;N'/O8X-G2N=6YHXGI\8F1E3%A;MY8.WSG8 +M?-DZF9[Q6_`D.PD<=[2Y,[+OL"7IU%""5P>!.XJ*D4=&Q,@YZ)WW0(JR%CD: +MW^GO@K??,;SQJM-ZWQK"\WGKN5@D-KA:.I]GM1QO%#R=&SO7'MRX4GKW)'BW +ML*E&HDLN?]U:E-?%R$^'1_>;8I&-0U7P;![CGVUV+DO4P#2$_'J\#KR4S\`( +MUH%,V>P'N1UR>'!8P$9I93AA4> +M1#A'N2>-7>XA['(_RN,@20QF\SHVL)8R-'G&"ZR]O7!O\Q)546]>N1:>Z0G( +M#'ME6MMHZH;!"9S6T+J68@_73^:!)_)H+'IHK[6#61"26S"-8S"U`FM[<%.J +M5--=4--QO!-:ZB3(QYG#3TY7AXC^Z7I1 +MA\3YCO,:OPDXDN/[54@3>A*R)E"^*;^HZJX0;>2']+.4X0C?S5'A3<-'*NE] +MQV14[Y,L+1RC9+T_B:4*/02O7HPE"9U[>I3* +M7N-E=/(E(^?Z\=P^VM-X) +MD:[$5]M>1Y*`WQ#:RB<&>G2E60%)OCOEP!%]QX`[;6!VF8N34^\:..OB4>;>-%NR08%W$URMR$:3W'TY*:J +MPIPN+\E%2F3>A)H-7][5=1K> +M#;^HG["<(U[\\D2%^8$6Z!TJ?-L`R#]Z7AEP+.%1VZ.T=C'?4FOGZ62[X]4- +M2U3`,\\;/%E9G@4<]Z1@A1TY;SI8;D]WT0(/O\JY?$5.8**7G4=/):&O/:VU +M5/9$&6,S,&6U<[@)!N+=2VMMG&.6T+#IR"9=(3OOL_X2:3]R>K`X874DOH." +M]NQH1F/C9?;:ADV[:TWVY.3;'>]L6*F2264@PG1A.O2/+@O?H+-QM2:@E(': +MR9=;O=J1+=5/!>50"%][7MCDV80M.UTTPQR_M]X#_!,);6VPSOZZL=C7HTHZ +M/:%1CV980AY)OG;_!==#&#_A5\1MO6\\"+=U%(Q>) +M*)[OB:D,T9^PX?4)D6,6V/!L#A5^3:S7`5^T +M[K=U.#T+S0D-GK^*<9T>C=V:>9!8Y[;ICM>H^(`;)%K#$U:M+>`T7_4M$.2@IJZX/-*$M*0Z_!84"S0IIMW%>;+3$#KI;RE2G#KK5 +M69V)_9"NQL'^IYS1?LL&M`%DV:#.,M=^V3^K]B\@0YRN-#'M%GOS*>Y4A;^I +M%68GU\QZ1B*S1UAIGP;6/@'[L#OF]I$\RO3.HG>XU"`-,N7K>LJ3[7W;?IQ' +MM.23`3YP4M>65>JGA=-P9X%_@4>C_Z1.[WW5CMC-Z8&V+-/:PW5`;Q/6XV+= +M<7N'5#NUC^3\BG^AZH5*M;5Z=N_"$_+T-1Y4IO>KU5O*P]#R7V//=!KQR<(3*26>+K;<&R302HG/VH$5& +MX[C@4552;\`>W)`&//R#TKJ)/=%>2T'[L",M=L)6U[=[D@4Q\LO849#:=D#: +M^T'2'TT7!>J+:34CV[AC/AIX5[2N489V%4*E#2_4TP="C<`CUQ-#"=,$]/Z_ +M!ZA]/EYMK0\F*4ZX[N:..8ZY3B@G]*ZS=S3)3.-" +M!U=PG^0Y_W+$:TON5;JG-CZ]?`;1(ZSP.+<5+;;^,/^ZR@CQZ +M.X=Z!!.%Q5)^1M\2'G(/NK`=$Z/&57_VXYX17!FWP +MI^%97$N3PB0/HK2J"!'AD$#GH%8>!3WK*EI]I#<3:8M#-W14.UJ=U3#V+*&]@6`JBJM.LKK-U'!:E-A*%>?M"I'N/+M +M'_E^7/>MZO@>T>A^$LLF;&,"04#>'V4$JQ6_@<3W#O"X"=)`C8XM/.EKTZEU +MK/EGO+\)OS:B#AJK?QYJ7 +MN0_P='Z2"WK1(!/*W+)\*D0;[`WM/$I=;/!A?K>T4NWV0JJ0+WNEXO'6A^Q9 +MK8_[X==/&PZTXAT2&NO7,/B$(ACRRDSTF9!7M(0\E+[#@V/\+<_]]:5.G`T[ +MA[I<^&T<^^B[G$+H2NC:[>"T>BJ\-.I2)O5N@7*U-,-H0:ZQ4;5&C#PU9%1F +M]&["_0_H>V7HE\Z6QA[@0S0AI?"PH*K%=!A&J3X6<8MK*EPJ\SP8F^>,*F/O +MG?9V=XH^8&MW?H?3^_S%.'KT/A50VD[S_1X2OF%D.6\M(;@S:=`T:H6QC;^L +M88&R4#"JV'K61QF5T":&>@JX*+1*\=N12TIU+POO4X2F0*Q*CSSM$8A50:P< +MZA./)>%G1@XK;;TW\PLK`U[4/;D%]T2:Y=!W^"89RS6(D2>&38GO<&+DK>%I +M@I$QSS(!O9@2PCV\G%"]F[+4.^O=,RH4>=HBA4EVB@7Z_X:H$$C@&(U//3>< +MU^@"'GEL"/G@%4X5AC)L.4E$K6C24=+SQS(WT[P7FAU4H'H>0H'^/:CWPPRLO: +M*5?TWW"]I.FX+(W[:-'NSW@J]W?PQA6#GU997,<=:CQC.V)VK5>V!,B4^QL> +MT!UKNFAO4[6-/=9PLBT5L1I-)/A&@]XGV-]!.I@[1A"!SKS6U-%$Y>XI4YZ5 +M"Z/7Y.RQAM/\.\U_X.BIZ:%TH%5C0W$9(R-4;5%+7]=0,AT#TBM:XG5XU,*) +M9J1:J!T&LH-Y)&(?9D$^&HGL'S:[;F+RF6--G2IBA00YENX:^!3FJ8 +MZL+J>HH]WD#DGH6_E&*LA>V-&*-%G:_N%U''$:0U=2.5A_+3?9X7*R]M'XEL +M'L3X3DO`8]R#5EO$R*^&#F_';Z\?-Q"#1?$,],%O8F:%Y_(>X>-(EZ6_Z-QE"62"^$K_2&3-`.L:B:3&6,=(Y/8!POZ\7PN2B'L` +M97O\;0&1A\-+;JXD0(INL*IT(,$6A^OK;^;U:/5MG6QU9Q,/]=,A5VQT>_$ +M*_GO7&V);4,9=2:IQ?562(6UHKO6QI;212/#1J:6TD4C@D1@+B2.0/49"@ +M/&+D\*#E\IS_W>`((^?[@[HJPEJD458]N^L:RV@;16\3 +M?G,NAM_DX`3\?F1423;/Y"'!%[>A$[>!EA.DC`;H=7/"!AH)SQN"<1J]6@=. +MFM\)O8R>A.Z;+J&;@3IQ^*UU"ZR/<7MIB.?=V?0I_^=%:!W-JE<:CB]#J[9& +MF$D'!M$F+6LX/&DD\LC@%0MIYGHQXH5VG!E%^V@*J-WTP0]XP3?:5Z>B_RW9 +M25/7XUI3&?U9_TG.WUWF.\WEZ]$"69#+@A&T8="?X$G?JTQFIS/L[!>:DY3D +MM`Q7RU2J_>U%J>S1FI%(*CY:0XR??X"]]](`]MXO@"N$=2W()BP,L?4$RH8K +M$9:K:7`X\KP87_A][1SE^=Y5-HI" +MS6BC*,>"7Q5'(N<&Q$BM&&[>R7/U]_-R7`4:47,!>^9W`]^5[!1AS[PUT.5K +MY@-;C`\&6ET/'F\]_""5J]Y)[3TW;278MJ\2?E9)ZF$9L@-/671,SAW*`'G*0TC +M[-.$KY+\5=5&-/C5PD845G=[A2(LX'/ECC/4:ZP5O"7.\<2J/>U1S+3DP +M,BCKLG8(-IF2PE1 +MT!Z6R^U1(%,G3\E7*%`S.IK0:LL7!_IQU_<;D.5=B3F-I?3VH&\;:>*J]NN1X`^IC6[GJXAZ@5!\#Y?K>L((Q^\8% +M%<#[>X$^J4/#("4@?01.-KQF:#BBCQ&#B9D-N9F&?M>O,+XCI3L.Z6Z$=%:5 +M?^P-P"\1U;C>Z=*:)>\M0+TN6+,TIP7\4@;43FBD]Z,M*Y!2PM^"/",CA_M9 +MSG-D?I.L:1)'Y9K-9)K>#BFGRH(LG^HETZG0C54YPL[UU$T[:\A4]8?!Q&P/ +MPFP??[9WRS@!5TZ=$-H>MXH7VI)J(A!/IBDA%WDPM+TMD]\N69V2=+A;UE,E +M+37$]/$'A,4^&-5=P3V54=J*=#?GJCZ(=A=R\S>1\%21T.9*HC';C8[%7G.Y +M+"_34U"^36F=B5]>TT-CLLMM!Z2OJ#+;3,9&MT_'#[[=NE6.GI"3ND6.0@;/:J<4LIL\XX>"IMFUI3O4V=TKY-G1K<=O6Z@M]3<3SA +M-U7<#_)TIS(*M'@,?5DRHN04G@4>+:R)-PVBMN!P)"=AA>_K4INFA2C@XQYH/M%\0U4.K;<5!1XHHX-;X%(ZAG3I1/3-%9'O:'_*LR=0;W@N'(?%%GT#,NN+I55'8E +M.#+R"/1)7KGYR'+7%#ME7NY8ZLOAZ6DDF,.3W$!9CCWE',7N8^ +MY3J1-A/(ZVD71?TP4B5\4,PCJ4FLKM#SKJIP,LF@P +MUS$<21\BX2V#*5RN@[BH<"_J?3F`%XEVO:+M5G+R"JJ8A53B(`D[!VF.=6A? +M44/_?1D.A_$,95?W#=Q]7217SB@&SJE9?SF +M\P[66>-TK"<&Q5Y$GZ$96;O@UJ\G[4H.\6;4!Y5V17F7F81+HT_57*Q1=G6] +M0LARR+^27UJZM8R0VWV-6^KN8I>Z[ZIK8)?&@5S"W>,XDB-W*)B-CFE.ECWL +M-.ILS$8G9;B!EGNT#-'+!)R15G52ZENJ@=Y,#S63*GRQ[,M32CY>/BV4[SG' +M9X[/G&%XW[XQ0.=2@<9UMW1I?I;,R)G4YW^P(.=WK[UWJ*9Q0>T:^:.'U@@. +MI].J(]F''-`NSK"R)W5`>2)5J.FK?<(IT^MKSSMK'=E\;:VS[E#MDW6U:[/K +M*/VAM1?6MEBSU^G7U*Z;Q./NI":*]FT/1B?R!D;OR.+]AN +MOSD">5NJ0XZ'';20XGC$<1I:=EQ5FHNRI#DL\&N!_MD9)06J(-HI.C`H:0>% +MJZ(J`7/=%H4T)9BF/BKI9K]BF4_(LEL)F;^$6]H)=7P2W!%PVNY2AYP!GA-Z +MQ^$4'/CTMZ/)?+)=#Z,4Y8:WW>\Z'W'JBI2OTT*&XTGG1TZ%/5X.*EP&N6M? +MJ9K_K?G%8X%&C<5V0YM8T':/8TZ%4=G^-M73+EEO(;/;-B9$"1:K)OBT2WZ` +MY*0Y9/M/J.;U/NUZP?:THUA0Y9`9LX(,G^)B^(-K?[(NCY'M]\^V..0'SJ^[ +MN-;D)J:DH'Z=R`*F`D35_"%MKZH#'A6U"0)9FF8%^[/,3T#[8'K%N%9/"C&?0ON4I +M\6G52RZZ5V]]R3%7T-M>(<5.0A->)&P02;A==`OW(7"?U<&4YZ@GS3`.PTXZ,=\;JKC)1OTV^NW9RYSN=N7$"5^)Q$?W#M'0XR71;*8W(9/?;+.OVZ +M7(;:#_2\A.KXKQ"]O\0):[9(T^"]$KRG$).Y9)ZXDEQ(PS22YC8)K>DG;.P5 +M'XP5$G+V#T`^`X[5_=BOV,>/@4.ZY<]SDK3I.RE@TQKD +MG/1!`D026GF),VE2:)(^;%F@5O"C*Z1607Q7O2.FE"=$7&NIY0.PJSQ1G$LVK2YWW>2M$U@1MW][GV_OT^SO]QL+CQP:(\$TL'Q*B+\&VS9K%+]=/&#STBI9 +MWM=B:R'!.T4=OSG.\I0FM7%7HVRB_TZ-PY=P4'95<;P[^B[A7A[,_>MQKIJK +M,O*+H.5[5BFYEYJ)KM5/BG[;^'G3BJ9U]G45+YL+_`\W=9"-#2N:'FXJ::BO +M>]F<%5C1=$=U?8V1QSEB14NOQ0ACZ'&S)*#D.\A==3"K!G>-5T-+==#F>_Q5 +M8IL=@4>%\@I2T$'J:VRV%2UI_"%+&E=FNTF-UH3RHU2L7IRT.--2"=)ZI7!C +MZDT@T7`L+TZ=(BF*)2#!V*U7%<_@YO-/F/%0FYJ +M:E(VE-1;+S>F"BFB)`%)890(12##'<99]@Y26_=Z\PK^H%GRKHY+:=D-ZQ(2 +MS!Q71-NM]&>)[2I`@O\]=O7XT6A_]T7M^7/1,8#] +M?QC/B?V%9EBSZMAF]();YJ=U2_P'&S6-)0+1+?([ +MFA$%6L(:P!K.%S2-@TVS;]]-OJ@C\V3^VJ;TAC4-C@9-PTU"J*:@84-#3H6F +M90Z_W)+'+>)G5:`_1`F7RV4)<_B7S.EGB +MY$J@O3\>2X/6&./&-E6H54^V"]MT.-J^J6WKP_FP4,ICJ]K&6*AO;F#0V>O( +MM*6(XPILHT,A:)H.FC/\@TU#S0?,*0%Y10>YNT9ND]M3Q)%&%>+X7C.F5?=- +MC&TLKR]:]O@QF\UG;@H0QGH[U8DE?6=L%;PQJ3R]#W=\T_^^WT$*F1,LMYSO +M`MMA@K)9SF3+X-8*K+/7#'W$RH4&I]W!.AN<2H?&23_;!<=T%\LS.LE99AG+ +M01N$HMD-;\(1:)QZMM=1X$#_T%ZP(SUG7U:M:K:]0P%G28@GR(+>0):HPZQ`9J5$`ZUMI#2[&M,G +M[,'+(88/CXR-??\B"?XJU'9Q_#BN6WA8O[1`W`#1E1[II\B\&QEYO2&6Q]]( +M#CK)O,+`9.VSH[57VK/CZI\95W_Y-?673*E]6PAG9T*P?#Y:!_1A(LU2;;IH +M3QM"J1/UKP^A'^2V\;[C>&5MZ.?PI;$Z1/2?B2N,.O(`E@-V%EHO3%`BI[?J-OR+(R<(D>2P#J<6^9M +MJ=VDV]*T1;G)X:26.1RZYF3HF4RXJAT7N:` +M1)UF^5ER:D!^6O':(7@3I,NE\ZZ>.62F_-*ETF5H$2(^&`.X^V&1;(H7>')@ +M\I@*T,L_#JANO`3?B8:C1?8TEC+5E#&.HM' +MM43WUW/X17"CS7`T!VJUF+%R*GLNKG?SY8O4Z1=4/R!K:M7J6164H=&R3K5$ +M^ZF8/\MJ.%K*2_A=),/V))$;]]15W47=NB%W3XV$DR^S\8LUU#(RGWZOE*,Y +MB5#*X;>)F>.(22Y^?Q`.VCV8^_N-;V10(M8CXK7\LS!NU>3_#^.6)CV#,6Q; +M.!ZB%3U#?12YG$7TEV*8-K]#[!IF_S`AJX>2$(.8:3^/6#6$W#XH%:K/([9M +M'WEJ6('8M]%K3T1Q;A"358IP<4PDKQ3R/A+-J_#O/>^.'F-Y&[Y".94)Y93\ +MG7*8:-ZI]Z='S^'\@?8IER*PQ"0(;5<>:^\%8Z0>%&..EK]Z2(+U,1W_D`2W +M0%V/?Y@9[!OL5TZ6/1>N]QLGZP_Y\PY'99K4#**<>+\BYS#O0$W/D$P\UE^B##U#*DC+HF7+_9[ALBGETE`/%>.) +MX@=AW2$EWN$3A%R.81']-HIO%,,U^M3PU=I+%$\.S\%Z*2@AF]0.I4&>EQ7Q +M.GC9$*^#IPW_N`X"7Z(#DV)2!R;#E^O``^U6P9B+Z>%!D&/C`/&2<+ZO3X_, +M6:B?!5$=4\1S'N]7&1/'YZ2^H,R\=+A.B67M'/XTIA>F\\0$K!GHB\C[X<'QGL=G,L2 +M>@9GX+MP2%4^]3U+A7M6)%R/ODMYUNBS5=`&M7C/SF&M6+](&Z7"DQ?0=MQ6 +M2HC23`CJKF[*&@#G82ZZ%I!'UVV8#_.+.H:R%/!L"7-RR(KXY="OQ-`^7`RI +M%%("J1S2=(@*B#,AJB"J(3(0"R!J(2X0\W0.&Z+WE$"Z%.(*B"9%^W`9I'(8 +M#R(N,O3KC&C_6Z?H+A0.I\;&8,2F>(>E4#<5/!=U*87[&>8I&&O0G_`\Q&O& +M^R@8RT'/F#S\P=B'3T3;B'K`?PF7#X\L1SL7\,68/?%=]#"=AR[R"%N&/D%=&. +M(YYLV=YXW%G6&R\O3)#7[XR7*<\D-BV_)_[:K1WQ\L5=\?(,7[P\ISU>?L<[ +M^>ST/9/'IW;'Y_N/A/ON2:BS[I&$_`GW_P9D?.Z&Q\)T03ZL%.2PTEQ*M*&` +MJ_SKXM!-A^DP':;#=)@.TV$Z3(?I,!VFPW28#M-A.DR';R90;(:=Y"N.ONTF +M"T*!+A>FE'^_Z[.+2C=E4;IJW91)YJ<*+B0Q/D0Z9CS[7?B+$^XO=!V[4D#R +M"V26*IGP47T,4YHJWFD>&0CG#W&,VL/'4+X)DRH4.G\)QT-5)VM6)_F=F3:YR>^( +M2>A)BSCKKG)\6BF?I"7]=Y?IT0E,8:4*'/R#$;'4=16\)@XC) +MH@]\M]+!#TN;FKY3<4;592X4/R-MB=R=$&.$\X"$>16*H^NVT_-5@32UTM9I)/-G!;(JI`4UQ42;%,#?'WT[>BR^-D1Z\NU@X*@[ +MZOE7UXJCA-80K6\'%>BT$$$!5S^]B/LV/81(?3,B?CV(H83[AG&_(;V]=#LB +MI9YT9TN5EG9W=I+2@AA#78Y2-W$3.J)SQ;%?51)&:$6F\S^%'0\GS^)2J%%6NIU85-CYG-QJ5'M97:CEB +MI3S"]B.51VR,2^XBP5S0R)PPZ_Z%U53_"YL\RCGPC.T9J^=8J2.?]3J(AI*E +M.DY29DZJ.8R28'#Y@\S6>;NRV +M>CI\#M'KM\UWW^E6J^-'5@E[PD58KXOR1/)W615'(\C/7M<)5XHF6]+NR<@_ +M1[_BV6.GO8J",F\#W>Y]Q=MAI]O+VFF->:=,0^_TMC]J/]GNW8GZ5AQ]I+*] +MPF-]Q);/R7&4:\XD4_?1G$*MX16<)[W3$_`H[WO(KO`\!&T7HTW!R#T9S(.V +M?EKN>=#ZH$W"<16$R5-E/Y2Z!A&S/S^'3PX>^]<^Y**4=E$:V;XPVV6D-30C +MZ<2=EZV]+GL;X@/]D`1_,AXNP5Q=)=?F:^EMMF^V4F*^G>/YZG"QF+,XEE.B +MD41SDOUT_L;>#7;>2H*;QS?U-D-ZWWA3[V91OK?W/DB;QEM[OV]%[NQMO0]` +MVC#N89(+-B1Q#O21\CF66?OQ3851L]AVVA$>:0TC3C?NL(BQ!Q?""/HC2`76 +MN8ND(*L-X9%WQN3YFZKNII`?.#SRYA@R"2.W;R/D_:\Q9!)&R0%2/TBUHO0O +M(+TTIE6OM__G=J5-H588W/D*8_CF&_Q+DF>^L]"=X]KBOM/U@OLGKO]U_\&U +M#MQP?X_PM/`S(88S&/,3C?G#(P[,/5%L +M,C#;HF^\M#/B0^H-3W)6H!\=VF;$/$8,9-SKC/ZD)(J3S$?QD5NBF,F(CXP^ +M."DS"5GM9K9&=L42(H?G/)E/R)HIY[KAW-[%A%1MNG?BI#:5T'!?VU;'UFUM +MS,86QZ8V@CY^:Q+.H4\?WA=W$@+Z^:VI8\IO3[B">]BKJLNON8#[V_O2(MCY +M,=Q\]).=<;\GW])&,9U;">/?FB.0HAM<7.%:EZGP1Z[^PG=<=VR5%\[:9BU< +MN^VM'=1"*C#K?EJ8O.?W6_WNRU7SU3W%,+-HI>]1C*H5GN.B!`)'%RJ&J]_M +M>#17\9W/=H1O)OX[MIZOGI1NV/9!M6>"8:)F&]A!]B8UT?8X*;\/[)[ANQEJZ5@`I0$K-3><]*)'P2[S>G>_AO/&F1Q_>Q+$FS4G7$IE4O-TJ[%`82_$N(:"T!AM'6LZQM?0I-6:BN +MF;KE`P\QU(%^XC7?\B[+,^K7?#J=84##.NM?2U[P3D$!*VC7H[<*I=4$%N:Z +MW3(M.9.D)DRZH,TUN1EMWKL4E)DNL"I;;H=;6MVZN2-#IU +MIG%[M;2;!)\)Z=0SC8P&L?M)\*F05FTPT.Q@&]5*'=ALU7D2O:6(B*_CM!&- +MST6)_FE[0:NG+GY\[-$^PM"=]UBE183_1.;U]?OVJG3:NP>^=WM2-WJLR;HH +M$2=6"Q9!=H`$:T%O%=?H33JA-^KL!I;JTL!U3_(2T!CZNDF[=!-ZFQ>GMYG" +MPMPRZP-NT_9.,Q-X42V%$A@H(0]F7[HS[6_H,2>JQR43>GSK?;H;$2@F,151 +MCVFA^=?XCPZZD;E*`NHC,C]M&55"ZU"$78+X8S;:E3(S<[E&#VF0H:T-<=!E3 +ML]C0FM1-08O0CPHU[Q^%-UNT=:(O\10;@#:O/^IC*.(T@ETSP\Y'--);GUA%S;U!L-1+YJ?[D^=G!"RJ]>XDO7+@H^2LM_]- +M3>?G69PJF6!1+8?WUZ):Y[Y+11OWK/S3NY)Y$C]A(CXH$AA!2AL)/CRJL"9S +MDML^42>IGUNE%!3K$0&!6JK,E0K%JJ>V[G7/;J4,,]97N=?E4K?N-'_ZOJ1D +MP\H_#U#,>Q)OZ408BO%21>0(+S"LU/\FGSGNR9"26MRKL!PY +MS3-P'T-_RWGD-*>8_@L0GX9X*EU1*B01@;I?HA"SR"CJ#V?7M.CQ0C'FE'D-+^I;U`\1WJL!+FWE7V#4B;"DRWR8D,T +M2958]LS8L[\I[O*-WP+N\FI"_KSJ*W&79U]]=6N$[QGW3:VX#G>Y!_I]*I?X +MI6NXQ-U?F4N\]EO$)2Z_#I?XRO!7YQ)?$9[F$K\>E_CG42[Q>UQD;*4KGDN\ +M3/%-FGIT<+[]1%"];$KBW +M;0G+EV1P#V>D'\PH?PE<_\^M_?'*^/EJE7QHGW +MBN?($:R%^/D35H[2PM) +MVDJ`GT)(TC&$B*1-JFR5=_W/&4EF>=+E>7Z_YWG?__N)X>K.O7-G[G[N.7?N +M.=_B90N**^N*^L/M,.^$NQIF8VE>.&LRJ4UW%?6-6_$V;-H]DS3;3/AIYXK^C?[],N__[M__Q3_>6WQ +M/6['_S#^-&^.%ZTYS*\:!]<8[S[*KQH +M]V5XT2LNPXL&^OH!RFO0=!_`DO7!'UC2V=G_-2QITQ-19EGP_ +M1QF^E^]QWQ!&*!JTKK,:OJ!2;]]FJ;V]["-:/=&:T'+;-I.(V5 +M=PL2]NU=\=T!AOTJ+P]4;J'Z3&OE)FQ9\Y9+B,'8BD^X?'D'K$_\$\Q@.#RZ798#_P7D(/E+'Y;W>M*L>YU +M['7MA-]*Z.E_AAZ\UY5CW>V(??6::#OENB7UN]93#KFB@^@D?&Q-O49"QPY` +MV0)2NI>)5NLC/C4-X"Z\>U&FH+*IW68=-01<3##V==$O_1)RAX(P.`9]X*;H +M8WMTT\&O`&=B8CB]^7DQ/-\/]5=U]30\S>,P.>GYM40W4VI].'[%^JKM$ZF +M9:E2U]?NI]]EJYZPT.`4NUHDCQZ`JSEVF?A+\.L73K03_:0JIGE2=;9)[Z>E +M>I_6GFYSWTQ.YMIC5I4TQM,GF?B>58:@=C*H`WTVS99MFL!&9U?.WF=10QF3 +M@0)EJPA3!OT[`'VM51-F.?QMRH_9M0)^G0$9@N$*<'_E_1J#EQ@F!RY>ABU7 +M?R\I2@Z\R^/>?'J08W--YP1Y>-)@`C5Q[,^WXMB?9VNI +M[FKDSX!05['#E:7=X=CA0N3/'0Z;2Z/E';P+;0KSC@3RY^^J2$&.L[W+C^@# +M9PB7V)_;X?]MU6]J3VB7>29XCOOSF3SKPYY\>9[UE"=?F6>]EEWFG>"58KTG +MO!B?I9Q@_:2%9;45=`\-.P?I@4^:T0[PCD:A\<=5Y=K)SLFNUW-[M$/(WDNT'XGCIFJY\B:'N7AN*Y +M74+QY"043S^T_U<'$/WD2A3/S""G;8^C>*8$<45('9&S2%M71!$5!^FV;"36 +M1W@].HR8N(&1ST-WV,)'LITT[PG_*J5>=T*[9#7AT-9R&'KBO#]?ES]]\,SR +MU'.S9W/.WXGVQH<0<1/:^T-2,_FC +M29LS[I80-XO3;UMX]QI!)63\WGRSP);4>IN40CHU/G?F1H%,TY1\R_VN2M%' +MBF3!!SS,M/G6!]Q_!3KU@$=>,`.NRZOO5MZ9GCV?*6:#I?R#GKIR=>$X9'#>K3#?7L(LD] +M:R2[YJ+WFFJV[&J=#A,]K8`8X-T8C;XTI6%@OP@?A7@R]4Q0JM2K1 +M[B4ZL]*<3@WT-%KM0]L;B*CYPC#9)P__O'Z-.RXTJ]+!P:(X;[ +M`G^02MD60C1O3?=KU<28$N3B\^A*-.)W1M!JJ,[Y6XYO3B#>_[J:LGH8U;M@ +M5/^VH$;-[ +M'*VS-XIHG5G1S^'WKE'$(PJ'!KI_4$MTB*5T3)4E:TW9:`E +M^;;6#K3PWGK0=HSXM#Z3>3TUR<.SATW.MM;CJN,9;1MC")OZX+=YO41M)DGV +M>-5!1%EDV&0SIU.;C3`F=,,Q;,YO";+P&@G?[+?Q]0_/=&R,FISFEK\CQJN$ +M?GF?%/XH]%M891';4G/DB]$M![JW"&ELW9S#'L9P6Y#F>X4?NM]H1-S*>V*X +ME<[*5L;(!$DK$WXJNM&F\5!(U\QK=3AJ27"JSKUXGG])KMN6))\@H5AFVA%# +M2-8WV_EHZ_'<3'O,(N!M552E=5_"M%QG.WAW)EJND>JYQH9Y.:"/J82ES7`: +MR!GQ(A\96R;P#>7^6ZJT#;&8-T?01\S9BRW1R(=#C(3)\?Z0R;ET<6\+8GF6 +MMTAV$<5FN&,A-?R"JO:5J]:?T%97Y=I_W?)3H.[I;*4MR\.@I8F\0G&!B#T] +M3[)53T2B7TK:5U[?0CDZG00(=U-5#^G1;B0]*V^L.NM?!=<^[1Q;:566<[*' +MSCL`?$B%+([9DKOF%G51,PKS_B+ +MJG*=`NG0QM`H;QQB$3&[2:Y[VITE(HU^9[#$26#TY@M)3M[MU0D*?[MZV\6- +M:(^:XV7A^8/7\AF"KT-M3\&Y.)C`I$RN+6/KRCH],L,=074-HE+.$`E!^H!; +MG?QGT2C(6DP=C?$ZN-;O@S7_`+A.<$?`=8$[K(K1DVIX[DFX/L7$Z,&)(X9X3XC0$X9X3^0/&9P#PDLM?@EQ0<,"30XDC[?MIU5+R8&5 +M&]>?U'YLHP43[$DM1;$VT@?)1S8SM(IZY8<2LN?Q>/O\>-`\]^XF.=?I3H/: +MWC4XCH.93_3Y=.X>^S9)[!\EPW^"9_"1/SS#@F +M9DJ7=`2&;MI4E[T))U78EJ-S&H]S2^ +MB?9J_S[XFJ!NRM9U*7LL67QR9G+@R$PU/$WA:2;H\>^ITOHX]K;0-I[J":*A0&\%2+N0=,"L7>(1 +M2)NMG(0G]0/VJ]Z4@-/ +MIHL?JO$L4++X(S6>SU&**9S3JDAB,(5X:XT/ZEXW4QE$F\1TT*>LD#`[%_&^ +MCFS380L]R1:GGU#M?QEJ8[UL;%G&QU;@O84"S5,[5TD(GCU:5A>-S!^]-#9Z +MWON'.)[SQW$\9]"WRMEGWYL=?U.[_Y2V1;$T0QZT^XNA1\K9Q]Z;99MD?]7' +M[$\Z(``WM,3=UJS:AZ@8'H6F3PWCZJ6F:VMPU9#?$.OM18,.#^$$%>FS^YV^ +M*3P71_#4"G=4\/:I@K]E*M`10L8YP50#X? +MZTT)#?]P%,_=EK.&]^@^GTYM_:GP7)5ZH];Y4\'GK]3^E+XG[MWA/G?O:^Y*I[RDTJ[S\$99T.$QZW=;'6Z'1U"6 +MGGK"1G19SB4;@W[6*`^J]\EUO_;`@'^)"VHVM<#W%)2$/%&#:PL_,@0;POU)7<27TT/DN\S:0EWRZARG;2,M +MHB<51?1,.?NS"^D;2=[.C>H\NO1Y7*OB>WIN3EJTA`GJ>>3?=NKNJ< +M_:@7K>>^CG)CV2$+/5W.?N<"4[0N*'MT'XRAT9N=B&M*XC6Y_\)6 +M#G+-U_\#=-,,"=VTG&V^8/0V`CQ9ZJ!8K0OK^9] +M:ZA8!;]-9(&M(^*T=#\*K2(>6!U +MPT)9`5K2O5-99-_FL7@F,[G6ESV3Y;E6F7.)4FT][.!JV[@2IZT5UR7*R0KN5!ZV'_-SY73R9#X= +M6ZX\&FF0^&.2]ZR]G`V]:W*JRWK]29-[?;$14XDF^G(!-8\^ZW65$$Q +M(\DI#Z:Z^ESYVA]:4LXH\M_:F.1*TF;PO?8VER\OQ]KFZ'$&)*NT.-YQ'N#8 +MUZIBE>;(QU5I(..D!)9,33JU6IN_ +ME"[UATSC-A)HT]DSG:WQ/1QM(R!H[ +MU+C[=[9,#Z*\_+8JIV55RWX+$]"XQR*?C<9VBC[N?I&7L^:R?B\QWAX\"+]K +M`_VMU.@(]K=0X]>"E+6;+-XCM92KFPLM$&QN(47JX!/`5R@"SR$"3["T%2W7 +MX2\-D`(J_M#6Y[4W+5Z?(^I;TEBB(T5/5Z4%M,[OVWI:]K3LLM`3"I:($UE= +MTY."DV2L5(A%<&UOTCI?;?GJ>@.T5S3R9!1E-!J4%>,)N;'(ST<9,=PR%GEN +ME.'LS68E.5#9B%:'R8$.+1&32V#%KCHA6VFG]:18$7C`E@7E0TZ4!<[G`8GS +M>:#J3?N3+11ZY(B7S$@+=%0C[JM?VV;[9NT)[Q[RW`J?UA]#?7WEM+,GY_3X +MSA):F-O6)0M/&U&PS;4<6P:M1:<1@R'0"3Q84H#H#C8C+9HT8AG?(1$102$@ +MMLH-F<"C4>`^.A$?-A!>WRAL(QU^W#FLE!`8AT?DG+CQ!\TRJ)=*XN/F1NTM +M*/-A#'#FNK9VAXUI;_-EZZB/@5#=W,A&S._/PT1_PAK#]V6>O95GP@\,,_O: +M4!H':;F=.QHBW,]#%NY(2+!]W)T)4I@?I+";:U_5OM[RBQ:2KV5_96GO(B?+ +MV;DM-(_./+(0^(L\OO8L>33'3":O+.-?\_?XY]9>JYU;99Z[JN.`I?@,L^#APWIFV5#[/<6HM$6VI:N]VG- +MVAG`_RPHX7WR$L2H_:0*)](8I(M'() +MN9:>H%RXF6/=_PFY]NGQ]$]&+R'7#G2_8:/<1*=9^;2?3%-KJ5?._D%U7/A[ +M!J)9-06/V8)H:U_"KTT*OFK;+:$DO=]RTK/?0L\$/>\WORC451RK)S.=P=\( +M%_U)'?(*OZ7^[><74_T\-]'_TJUGIY8..9+E6:EMN1IV7AO9HRV7A5N&J4E; +ML5/<=;B4'*EB?MKSM<&NRRZ=5.RZV5+AN8!'Q +MS.DP=AQ<7'=31=CWCH16[009TN1:!!*@4O>LS +MM"C1(I+.)'$;3_2,N]U]T>^#6JL;L+RR/O7Z9UJAE`VM$)>T'J58?=0#UWS# +MW?SU+'&62@@[LK!I&#%HUXZY;>X:C?,;TRI;-',VUQ*C+8@RN2Z(J,$@T;?2 +M\.EHD[2+-"FP#F7HUAUDJ?9.X02Y1ZB6R[&D&&)_@,W[D)D!)=)>+4I@5OX2@]CE)V@:'T1-0C@ +MV6CDK1$!\E,UQV@47[7*0Z8K`PNKB'ZE6ZVK;%8U?QR2&Z<$HI%/1VX<1ZC% +MW05LGU@.U\=SF"?PGMA>`<@(!GJ&Z),AAV='3/R<<1Q;E81C*P?YPR(AV;XD +M(=G*3R5J0:5:X&S<.:272O;34+A;9[NO:SJOF2?;(]^5F)7,L],$`\S*N8.( +M.IK:5UC-.8G';&@*/`FS>-M0+#00=(F]-*-/OD\6;AN:$D_S]0`/:9K&TWQ5 +MPBB5A3U#2R6,4EFX=:A&["%Y<'7O$"]*9W,8W*O;%Y>M<=[CG,?YG>"=D?>U +M3XGQ`/K),0S)SY0QF1LIR_1!HO-.^X;B^?;W;//:G_>MU<_S,?I?MI^O=KAE +M87;P7$T,!97KBT9FC.'U-PS:(#Z9/H@GZSMAE7^3/ROX.H@X253;C4Y$)1Z+ +MO#=,865+AK$F"P\.0,\JWSF%3WTZ0'3/MU=LP[=_.(`Q'PS(#JS490)UNS"P +M,E3>/1;YQN#O;$MJ4=EX"ZXD8<$Y@ZV:O\KQ00Z9/#6XC/_)/ +MUCY*+L=7S82^$C\ +M.E/7`;RLVOI8`FNUX/,Y!I86_EQ9$D=;'3JQ9_%\J`MBJ%\3.-J(=.0/45>C +MH1%10?\C"EQ0$[98RN#3C=&2STL0>65U?`\&N86I`1]__Q4HK-MK;R;N53"6 +MHQX>]W`6F**1Y_`]S?B>T$#3JL1[R@??#"&">U/`LSX:V1O=P+_:Z`2:4?L% +MR*QAYVVUL=TY19"V0AW"?QCA)'36KXVPP-L*P#W10!O:S=7)]$N5N^VHX4FM +M7X4RY)M0D==A[7-&((2H7*];'GM!#^]B;*MBZ$K[Y"6GW +MJ+/9WV3P]JADIZ8!K:/C2(QCD84#WO6)%OS.`%>M=]:U,@82*`MI6G'L%$B[ +M;[X'J(G*-:U)J9VSSWKW(47,@^?SB)$)3N%[5E,1?Z>PZV&43JXY2X@RJ[4G +M;56.5DO#]2,<4-5)F&^8'U6'E#PBY'#0BG\80UU<$EXU,/H>(;@V[XM_1\/Y +MG9!]7XFO[[BFX_S']1WG^3J8[PW@=H&KGX+?4)GP\>%"(=FI,1^SQ\;P):Q7 +M71SK]1J0P9GPF>$$UBL3/CF(>&&X\U@0[/300L80KE$%TX%W^';4X%S8 +M_"'0XH5NO*\(9D#LSJC1R7`\R%!FTT+@N&YN4C1_WXTH5O;H!6F?\QSB0,9/ +M#GS +MJH60,J?/HYR$\3J_M83U.P*U85='BMH:=B3#J&D8"+O>@'>&'2#Q-/6W(HJ3 +MN%%L?A6>)7*8GC6!\]V.?I;?\4CZANFR@H27:\#^>CD`%(P$:ZT$G<] +M,1B-;!K-$AF(S1`/(FXGIFU`"]V]]@2U0^O&T<@W!Y^U[7(]5?LCP:RRSP49 +M8[?E38_*W+?+)9>P&R]ZOR<`-R+^5F0"%[TJ0TY0QH6!+S6Y:3AUZ**;`%_W +M;4&]]F(X?-RU&N6[B!Z(PT?&KHH[5_0_7Q\ +MY90%NZ15N(U53"&_"#FI0LZ6ZG)N='9BGEQT--!F.WJ +M.'+3"V-TG]D;^S*4>J9+FMU,^.)8ET?J4S>6#?K!_34LFVI^WU'5/"@;(Y5M +M)?3J8J8<>C7LF@PQ88<"WKXI&G8=A>N+(`%E!IAO5.9KM35QS9S.. +MM:(Q'&F+8:3M'56)%UMCV)P:G15B=HQ*^^X[\&Q*[-F%`F(C+>29_=2<+"%* +MMNU`WI;HZ+:V]INDNU&.V8^HDE,#%3S>S0V00N6V^]NQ%-E!['U<]>S-MS45 +M-A]V=TK\YO>ELKP[^I$T[F=`WM6C"4F!ZM3=^'6@K:D71I,JV.M%W<`>:$-Z +M(AJY<21&(E%XO^H$.:%-\)H<5)?HSI+,W<1EM;5M.BI."[M>=J-JYN7+U^ +M&6UM!K=EF5RDK6\M]J[&KU)MK3IKV\;1B#5ZJH;J#_VI +MU\DK>GWEK2`9J'P9ZHWEK`^Y$Y"*2H(ETGXF`^LC[F8J]1531B//CXE;PWK* +M=&YES+`BJ4A&A6^@F00]/H/3ZW_)WZ'55N"7;:_OE[`>Z0),45I06]+K>UYX +MWL:6I,[;X^S0MOD(=Q1Q(G?)Q:,M,7[T:/./:HX(!J?/?[/VQT)JQ3$_!2HH +MASZOB],WSJ-2W92AAK*169\'GX(TO<\M6QQ_'[3W/L^^#BX),\[CE>.&GR +M=B[6W\084H-V3Z_J[5,^U=D^Q*O#FC#AN@%B.!DT`2V(W?\]W'_]5.P^U#AL +MAOLO2U\8:X,=0F>)7\+6%5H01P9W2)6G#GO]AN=@SCYD^$E0+N*^)DHM3X_S +MV*7!'-UQ6/?/C?@$38G?HT9D2?H,7+"QU5M[2\[9UA/:K-)G +M5_^]XV<6?]`'\JC$ +MC;+-M#0+),UVGZ:(PMQO]_G\VZ3S5.8=Z8!QYW`8AF0.I +ML+[HJI3UQ+<2=_[H=,0QQJ]J^=+>DB_77Y]1/[-I((['%\,@1SQD4C@%5KI% +M`78<>;RRSZR:W8=?2/X^G$`;3Q7,:LC/P126@LR"^Y.<*L:GX!XE[DOBGB3N +M3>+\Q_,%*-.@[(+GO\KB^Q>G-")'#Y!E&T'+1S28P+27$,S?DYX0XPCFUT6CD8(A6H@(YDL#9"8),H5'00;&_<<]PYCJ +MVL!1U35];TK2L#QPAB?C,OV?!#-1KSPAX/FB'2Z?=D>C3QL[9X3T-W\8K6]P +M38AP/G\8$G2.<*44R#MNJM:F>G*8%+KLU6IL[^^FIE% +M`BN7'>8)K(;,-&)8\N93581;XWV'.C:'N#@[A'O!'0Z*T1N/:<7$HM!%FU$8* +MI<36V2EH2]2M#/1-NQ*_U>W)6&F]O^J`/49AB?B*Z`>)LF2PK2K'I;9J'8A5 +M+PLZ"OU]NPG<56Y$SXQJ`+ORR$ +M-C;CFB^M]'951G0"^7N"I;W$\.,`.]/!AGON,QO*3Q1YQ^+S!W1PWR8 +MY^[EG.YS36LE2>&:8(,DVR0D!HW;+B30V[,\5Z.WSQK"7F:'D*,#KDD:8Q@S +M82A3I-`6Y1YL0QO,)%S15$'2NA#Z)&*^A^/?^Q#WW1R7&V9` +M>C9^]I2%^W,$.O]XRT&0QP@7""GUE-6RIFH:_@M^MX*XWX88X#*[G`Y_N=:L +MU9H,P$F_$#((,LX/*^TO0@4V+%E*,$^HGWJ\9;=%&8R]@X9?@S?D!*2O']RA +MT!2Q*[Y:X$I!8*6H6#')MEO*]^%0E[W+61Y_^X.A+J=&*-<*_D1^VT.$2Q'( +M#'\S"=P;(KBGS[5`JO(5*MLNZ0T;0Q3*<^D=ZT/J^/G*@>X>H/O5`RKV$_XE +MYR?")U5I+,O:RTQS2%%!H-&K+ERJ7)HN*TH/]CB;F5V6Y*#:K]`ER7Q,I19G +MY:B#M)R>(KO-F),UAH%'+\%N8,$\Z! +MN^70ZG^*)D88[NF62SS9`]KG;437UKS$W=L2PS'GO+TJ^2D"+7/?`"E($J/X +M;1Q"]PXP(#\QX98!6L!YJ&IB@!9/")0[GQ%>:DGR[)#PS'M;?L#?R*JU9"LB +M7LE`EMLP5.(\UJP2GQ!P]!_S$M'?4@$QWZFMFUOB>81GC&D2ZCG6DOD"Q/,2 +MSY6(YS\;1,1S)OS-`>1];NPK]3S(4[:SA"E2!%_S1HM(,+GE>F?NQE(/+FBM$B10#CF6"%,WDC<*YP[S4O7E*6T0@SP,4QTW,'#FZ!E-)YH\2YMZ\*J2"=B][E-:30/@=IL0@K`0G,=*M! +M\JYL1?EE(5`1HHKM%(AX%C^(^LZI`>D:UMR7HP8WQLC@*4BI>%_:H6("MS5I +MN/,AW/&2!0J1YY6_%<(SPY`.5D*B[`N)$KK\=7&<6<1&_WSLM1`B(+XZ)F<1 +M:QP1'W\S1KC?A,J[Y]I(_D0/U:44EXR?+2U6)*5E3LS1%11/(7L\TZM.:?/% +M/9YB\#GPC>"SX!>!KP5_,OC9X.O!UX!?`'XJ^"SX:A%E2KE.#F$.PD24ZX"$ +M!?%+D4Q']"2<,\RQY?&1.Z$&5\+NJ)R]+:"H-V +M#Y*0DXZFQ.0CW-?%[SJF^)G,U32^SZN/G;OJS"?,"AH[ATDXE?)3_J;TGGO) +M+FR3Z\<:/?B54G6F49OEI25Z=Z.'ENVP1$[3$[]F\N7BX]+UU#Y9?BUPO[TEOJ[(\S\"KOFE&ECYIS&&WNJ<(-;M]Z-*%KFS#&F? +M!%:[L#YJ\)9;#=)>A0J_GL&J.!(Y!B/CY*(ZW=!C'!O=S-0:/PF`,)+]% +MX5=FF!R02YC'R7$JDP+K8:IA((AO_UQZ^R?![Z$E..#01R(;QPR>5,/[P0WN +M4`A3O"NEZ(?G/QE[)T3#D;&SH6A$%3T=TG1_IUI>AGSD+\>@G(%ZJ2^49RRK +M&[2T)+>I'FA/#&\;=_MD0YKX2.FHUL#\NK]6;:@.^J'6(Y&*,:SQLE$5:_"( +M31<]G!N_,.:;VH21R#>C19QEC8^_5[`T<16&*2.1>Z-;^*TU/ND+"`=\DCHP +M!A*[,;Z7,A:9-98A&N*XU\G!?J\".(Z[!,%3V620]D[&(E/'3$#7%$&<;?@5 +M9R0R-I;`P?[)(%+D]%&[Q"-D23C8&4'J23.:QW&PYRLKE$IERMSY\^!85VMI\W=&-N/.K +MR#_:&ENW34TZ95(ZU:,%G/6#!FD]#L):WN7^`[3YHNCKXRC9JP=?A?E_@_3] +M@H,U:#2R;,@(DB_FWS4B9T0W='(GT!2,$6Y6BS[-5+;3`C@^_PC*K;+24U==B)7!9L\"8KI=H]$ +MZL>PM>X9,;2N-+P=1`3W:&3-:-B>J']Q,`QK7A+PFLK@!,',)3F14H]$[A@C +MNH_MKX1BWW7S\=P&.$/\6P[2"M2[X8$&H*Y%2WSO!.G'WTCL_#;2$"PC<)/C +M^V#T3#32/QQV$L-W`D]QAHWC>0=F\3X=S'@WGO1JTEA0EOWTLCM-];%.Z@9SY +MXR;*X?E^@I;[N,&0X0Y:;EA+#-/>G@%\RK$MBO&T]$QZ^;%-9'H2O%<5.+8E +MJ]:78]Z"9]DI]W:HTYM1:R:FE7_80J?1&W]A+C<#%>*"X^\[\Q;A7@OAGA)^ +MUS*12WOD?XV?37\#VZ.[D'^ED89O'J!,/I^4S#AQ%W^R5E]SEGRT>JXRW7H= +M*ROVZ2WV"]UGN3\@;KW?:EK8JBB<''O"N]Q4R1 +M]6UOL;S(.J6E6%ED;78\UK*R18IMF=R*\9,EA&Z?BEI3;/\:GSM![[%?7U"A +MK5"T3X/C:O6PG$U@9 +MYXY['O;\\)Y3GGF,QDJM0?ZO]Y@]?[1I2GUDPHH4JTPG*%/L/JW%:;.W.VV. +M'J??D=A-W$L.:$^0EZK"1TYH91TO+[Y5VUN%.UKVV;>V+?=D>XJ9.\S59EVR +M0+PK\Y7OILU?E9:;GJI.4]C(V +MAYO_[LZD]-O,93 +M/,E<#5*WAS"59@,KZ[C5G)*\B@RO!`DXS;N239[,Y%FKS)4=MVJQ7)5MRUHG +MM.8S#>8J\ZWJL[);S3+_<>D.]>UM/=&:Q=PBW7E3ML1L\7=H*WV,SD8F:+GK +MS^Y$S:C5\,QJ\[:52>GGM=N6*HWADSC*34?N%]IL2PE]@Z;C&?54Q.GZS46F5YJY1:N]HO5Y)DF+/IEJ:Z8R*1E^DY.4:NL^Z028^TA]=1MYRE/O2=)^K>HX +M6>=^PGUI1;7,?B=6EN@9K8Q,T&Z5RKE3BLG]1 +MFWWV?U2;TW9W7/\T39H'IP=G""H6>)L2]7(YN&F"2,Q:GVGA>ATKK>U#2&-? +M'Q;@@_.X0\!ROTD(7::9QOC5DULR^7)SJ9J7(YB&NOQ1".WQ;F'Q#S&[^YJ64Q6_<\X\(6#)-P\C@/_X5`,!_Y' +M@U?BP$^`5%^/X\!_%L>!1QWH_TD<^,"4&`Z\=^'_#@Z\YEJ@T]S_!@[\*Q(. +M_$__#W#@]X[CP.^+X\"K!V,X\/>/X\"WQ7'@Y_"$W&J-X!IF`Q,(\-IH"I_ZGQ#@UUV&`%\?1X#_6BC6I]B_V>`^BV/` +M7QB-1I[ZEQCP--PT@#F+7X`!_Q_C&/":^#Q*8,`?_Q_#@/_N_ZLPX)=+&/!+ +M_PT,>//_(08\]P\PX+._$`/^FV,#+\Z(][_B@&? +M,XX!_XPT`C-'_ZY5UP;X&[."763[$U +M-S;R?O8_B`%_7QP#'O,7XV6X$@-^TV48\'==@0%_NX0!OW8<`_[ST:X7+R_W +M5__;&/#S_A,&//(-ES#@B_ZO8<`K1B['@-\R@ACPP_\``_YO0/L_C&/`8STO +M+]]1[LIPSU7A8U>%`]S_)`9\P3@&O+XZ[PH,>.XJ#'A$@,\1%ZO[9(PV8_T!,34NNEBU*XX=[^]J__G/7O["]9V]4O7 +M]KW]RF7SQ<*UWO"OT^_J$.FN)/&%GCI( +M;_S7Z3MWB+0S67Q.>G_1OT[?M5-DP-&N%&C3K'-R8LY2D:7G7XQ&?]GE?J7_ +M.=\K_4=VO=+_\\Y7^H]VO=(?_GK,!BC*HXAAGK#_]<:_@7G?=17F_7?_">;] +M]GA:3>#!:W]M_(I_JJ?,K^23Y\IN1(+_7#)?Q]7_L2_P)5?D'D)5W[!9?G^(USYXX1\ +MD+#;]MNX+;B$#;C/3/]>?8GFL0O72IC>5,PB2\ZG0)H7-%>VP=5X\$^:_OMM +M$/P7;6#67&H#L^E?MX$?ZJV%,9=HA^T03HP#M"&'?-2I*3%>`-MG1KR-*?&= +MP^>U)5>/STOM!7GFIL)]&L>=_RS1+MRN\?8,0QEIO$PJR!OMY9VZK'U@&.;V +MQ''7,;^KV[+KLK;FT":]6'S%/$-3IYWC?1F;'SX8[RL@+D/L[)^`<^&0=M'E +M\RP9GIE_U?WX7,I-8,]KH0ZL],RV"P:I?+$ZRL7'WI5L!M],R,2%A&#;!2[C +MK9"_.1WGL7Q38^V,Z3"]U,;_`B<>[VL@;QGWTGD>VAK['7'M9X,O!Y^`KP8_ +M%9P&7#8X+3@6'`"7@YL/SJQIO[``?#6,%RE/Z/<) +M\?'!7]:V(]%H<4S%7(VJJ/ZW264D^VBNQ5[F#VT<#9;89MW<#Y/ +M'F;"FP8P51XK(;?.CNH0MW5WR>[9,CW96\8S>7@.H^Q@J6V7B0E_;:#L8#G/ +MA.L'YO+7'>0@9LU`&5]QT`Q7*P9H.'6$AN>/%/(/E'^N/.S3Z(QQ/$S"'?:1 +M\+?A[D\&2-@8G;IX)>>\2;(WL/'[&TG8/M#9BOHC$SA#6PR7.8:0&7!,XRM8 +MXJTK4;MCZ)=,>,8`$RX%5SZ@&T>_'&C`,`D+E^%?&MK&0H2D3;T2]_1A!6$^ +MO.Y*W-.K\4U1C^.+\$V_"-LT<9Y/)J#>69N/Z-K:Y%>/X:\;WS%22/&-1G%M3\:X1O4I1ZYI]C?/NC_U6,[_)QC._\ +M+\3X_GHT@?%].%K^;V%\3Q!HPX0OP/A&FP\QZ^__'LHW(2.YEW"^>;[7Q:3& +MK!M.UN^6_(2U0WDBG!KS+5(Z+-4!%Z=+MAYPS*LZX$HV'W!4V(AN=WOF-JJ( +MX4G']!++>+.7*-6G9@EJSN^(E0[U,;!LZFXU5RS0\/FQ8D'&'=L8TW-6=^?I +M\OFKT;\+)*N+!1+Z=\UH`G_@MV,DW#)*PT^,12.GH['GM56KO*N4J]*9Z9I@ +M"GN-P)60Z=E!4I04G&"3YVE*B<'OD0?W6?UNPFF:W8NT<%770@R#02J%)=QO +M#Q-$?5?W(HTU9OO>'+>GCWI/.`<0`QS/^TIZTFAWF0\+IB-J^]]L'PL:^]]X +MDJ^&'CRNDC=3NYK-=*KMBH(/F0=];_A2F]^U$0YUE/"\:Z7U4?*H5LBA)HUA +MO^_3D^?X=P6Y[QPO]R&V]3G^O,#8<_3]_!ZZ0ZNV:^#Z!.V`*Y.$'4!T;_%? +MA+G]QSCFMD)_0D+=/B:A;E.]99MW_W$<=WN@^_>UYVFPMVF2>+MG^RP:?+DI2_R!9R=D +M$C?G'%GX:M/]Y[E%^(_W(PF=JKY'27.>>`$]^`^)2X.E2 +M=RJ\$4-R",UV*\1I4HB918(E[ML7QM[[S>:,>&[MSD\[ +M7+4U$_&^YE+/'OXE-[9>[)2@Z0C)2W%7N7>Z7W=;/22?Z,GTW+=E.8]ZUBCO +M3&>*F6"*FY:FB7*XJH(KM9@"5SOA2B9>4TR#K\.5U4/+#EG>?E*/L<.AV_B!<=OPI&"!MEG@6*4^`ZUQA^\:E6S,QS6".(Y;K=,E +MK4%]:26;/9.>(-S'H:_PQ/F2WUB$H0]">DC3HZ*G"/=N*)_++\IYF^;I5A.C +M.D`E^_"NA='(GBCJ9)P*Z;2"![^P$^X/(;66,4VQMELNOB4KED..KX883F$= +M"#DA_=_'T*Z$:;2Z6L&)36B=MW34%L<8BYORD$+&'MW?)3US"0YZQ +M6+YOWDV(1"S;324;G(A$+-M/PV_%-0;?#UV.1DQV9QNQ1=X)Q3"(L45.AU+X +M_'SJ/.[/-RY]&Q&)F=V(1VP*4`,?-.30IZ,1.;3-PN#+H01>@J0/71`[_XTX +M"I^I8I@)B)V`>GZ(IZ".G_-/Z/\D;+RUQ'6E8>ED9N7\+8YOC&7=&SK*,OOQ +MW'>L[#M#E%-:$ +M,9XLO&?D3+62O1S7F(9OEG"-L9W,(W^0<(V9?3BO*T;^N!@U:A'7F$BXQO++ +M<(UI^-:15^*XQC2\:N3E<5QC&LX>F=^DX`:D<3!S!$_W7C\BWX?6#6+(QC0\ +M?801S>`O&J':C.,55)X +MFUNIU['));?YOL73\+/#41BE]J;.)K&):[8WXSU-R0ZX\[WAK36%FQN].O9^ +M/K>$*Z_?3,,/#SN]-`="UR*^B!L9-H6^D7W!UTM4GTB^%7Y\6G=*M=JE-:D<<)15X'&IB=`X;=6=V0#KX1?Y' +MSKD7R:1[%'[-VGKA>`=URSC$S"&0O#Q;FT5V4IT+*^QR*FJ< +MLN4:)UU3M&:WA9R1+4_H#N%L$8>4+,F?5#,R;1)/I%&WK9PE*2 +MM&:'Q7!R`F]TDC7JY<4BSNN!N,T#$I_7R%?*=\5X@;8H(:F38_I^+7'L!<1A +M0'T@U'&9!SZ/WYZ\:&G"3-2Y>A@=$2$:>2QJ@!)6F.ER6I8^X^A9G%%[QO6U +M_W89UG?^].\NS#M#IR'6=TI`-7UB'.N;GOQ(E=276"40XWN>%3$YDL0$_O=Q +MK>PR[.]W3LO06BKW7@AQOT\#QU4Z]"=>9?^$_6CJ$8OVQ(0U9/K$0&9.C6?% +MU!C.=\K;?ZR:',?_1O1O:HK%?_J6K.R(Y;V3QR7=1+35L"1*N5^&--VO(G*] +MAX:7#[TB\"WJ9AI>,730PT"[5P_U>Y"*\4..+9G@+QC2;47NUSSDV#H1_/E# +MNF^PX)6(1NX;2H;[/8//\-2) +M.4P?>AJND"(4#OV`?Q*$07-Y[WJD5U.'GH0[.%IRA@[!E1KIV=!!N$+N,6.H +MDX^E12JF'HIRG\,:_/!@-+):RN%;@YKXJ$,4JDX75W#8VNGH=!G@%]_YC<%. +M%\9@6N]@'`L'>/YO\,GE"?TNY@R6:\\@A5Y++Y9!*#:2VZM%5V&JR2HZ1)M7W;FU[:^%*SI;FN9(<[1AT'(.43@W@NGH:O&5Q1S>CFS3^XD>CZ +M-W*;:+)C$TT]N*E>(.GB)N1#YI6D0QOH![_&?[V6>&C!==>"!!7D_,@?>GRK +MH$S9@U_E%6Z/G_.AW4IQ:"E?9U(T*72]T@HQ)6XCCZ"V;=Z-?'I/>D]JS_7\ +MO'(9R\W>O_G,YIQ[D.>T"4*-']8RX+*W^6%M0S\:>1?H`UM,-$TY30^9) +M&JX9G%=KDG01;Y(L>_1[03JLV&'6F)E`IQ?6+Y`393KLC8L#L9QQKG\PH&(/ +M>F?P9GWFLKJY)>[)M67Z>3?N7JYOH2Q;G5MR>(J"K6^BX1\/(-=K8.N]-'QX +M(!IQ19&_>7V`ZI]PT_"?!DK&5\'=`U,%+*=&*J]&\G']PYR?'>@-E7?/$G&^ +M(\V81V(T`'4$A^)Z@`]#?!VXU>"6@5L!+H!V7^/VU-]2Q/3.4+8N!EY"#;1E +M`1/3*48:A#ISGU?3@@N2A0`).V40=?0_YF]N2E"YO]5@W>^`NN-\JQMXOQ8D +MG!O#;FS3SCCBRNSH!1YQ<%(#:*T_"=J0,2B#HK=?,&M1QT\32!;/\C[O.U>U +MMEQ*F0Z<$SS)A9LHM#K.FN(!;+'2>-O#&)1B]0-_O()CV0U^9\OK@E+/-W5Z +M7Q/4;F6%@27ACZ*_$SA]8<7A*21\,7K0*^,8(PG(X?W1R%>DOE`,&!Y$S7<2 +M#D1%+^H+_A*M?+EQK"T:>!DHSU$^&OG#\"]L/^9WW[O-^_/J\ZOW6\H#9F-! +M0/.6R<@&E&]IT):>T1BDNK:FZ6*)<6*@U*@/RB&4+]89LP-+(&8II+G%."F8 +M#+$Y(H'?:T0&?B>(,OC5B`KX31-5\)LLJN%7)2;!KUQ4PJ_/RZW>M3G@W^VW +M:)=HOV,S:S-]WQ:BIA*3VJ>)8\P7Z1[@+=X]?/(R.F4'7UA.PNZXO*KI)OD/ +M\G+WO;RF7`[U+A_8P6]W)#2/_;4=-22_@^\0F#7J-1V+LW)1O^_DI,D9![03 +M,EML)^Z]:M,]%(XXC1.:)7K]&8UIO1&>@P:Q'YS[TI87VZ6;BO2[Y[M;"JQE21S"I9#9=>"I+)#3.T +MINOXF;(]LX(NGNHTY97N%F^F[A9)RJ;!2K=*C%FWD`6?\*B+",38A21GAP?/ +M+E=ZU(CLYZX62![1,Z;CWC&4,"3<'Q+^<,PL:#E[A;J!ZAQ-G'C0(ZA4IY;P +M9DGW-2$-5-LTG&9>G7LN+].9RGO\'3*UM,?K8[,$3>P=G+.Y$D:9IB+= +MG5Q2PI/PBV,W0#BU0K:/A'\Q5L#;R^EZ(]_C)6%35"?8*_B&.<*UO*;"7MY; +M#WQKN#A*H!RN9F+H"3*ZI]U3!@%1EHBU6!-D\,RZW-+3?..8&:O0^& +M"'E`$=.3Q;F>T(]5Q_>W?"3&8R!_\2Y^I8CK&'^7&;*T@C3'$^0W4 +M24;>@YTQMYA8;R&RHEMFS`V^(`B>XTIE']6! +MY`]]MMMZT)TA4IVN*57T>A%Y0F94!?F9BN!/I93')]&2?D0@=$\'ZA>-?#;T +M;(V!O<8T%AD>?:::UP[1KFZ,FZ,CL`;@F_\P:G`9&HPN[*FZ,6?# +M1_6DX&X?AI:,*=F"C=@3?QU5L$`IT"*Z5V7("N[@D==+#]XGV$O(S*3@:\#O +MJH)_;.K9$:,K3XX2,<.-U.B/HPF,'>!!ASPU=<#CQFJT9W1S+8[>P^S','J_ +M,PI\[I2[H6\?&MU033D=6U?B;XK5.`SUE<7J"^]6CB5P;!KY;5T*CVH*EO#1 +MT1M9;B[9%4::?#+=D'H&J2G:HD>=!0(C=<>X;<"5PK%-7Q'2.?5:+.MMH[?P +M1&P66NK*"%`O9G\2T/3,0%?K4L&L[,E0N^7`F]TP0O7/-1G$ +ML+T>)84)05HRM)MEE!,F_'/*B:PU*D#;T +M6+;KI++-'^T*(9V/E;=XM&*17T+A;1^.1"/NT7#K5(%ODG-H10&H_G[4.6!A9<@M.0HKP]F1 +M+J]6T-?Z-Y4_Z&_W/'BL_>B#ZFTF#VK!3!3D>E.%VI\JJ"MXGY:7EV2;2/@E +MJ'FI6[+;5DP"*B@'@7$^)?62<5^8XMIHDVY-+6&J) +M^8AS#NI?.>D>SJTY:ONKG2T.1IM5)?I;A1> +M"/10*C8Q'U +MV%CD;R/),`JL(PG.+JK7E2KSB&X9/Q8Y-A+5T])D""V!4.](>GX>&]67E!)= +M+82?'\%0)82J(?0H9M]V:? +M=[J0M'HZ'VS3VTYZH],G!*Y59?9-\JC<7_4LK94I>[K*7/"1OZN*>(B9XH_ME-Q&O=R?G:.:=:(T"Q;9LRK3M +MT"9"S-U"CJ;B>&L4.(S*N\EN[TIEKX5UYJZ%SH5`BP:F+$9;C)TE:2QJZ6P; +MQOT_(TM$K6`G)&>2M(I,LF6M64K:M?)]*"'VD)X2CW\,2L39=2 +MI]GRV*6K,;T?XA1"#_QVEJ#.1HQ36'8HRB1PO]#.,-HX(/4U// +MNQ!7)L?SH#T]&"Z3F3+/->)Y6&[IN59"YLEZ2D(,N44Z#YM!R(X999W]\IZ? +M7L#[J?.W]<(L5LJ3:4BT3CT_[?T++Y/__?T+%[.*!4/9?BD\B?T+="'MOW+ +M_93\A>UY_$)&SP,B)>SY-/%;61EB)\7SB+3G6^?0)V';0,[Y:!2?P[/V6^`9 +M/.]-XVV$M.GT6%2ZUN#Y?&A/$#'F:>M^:M#6=1H2/L3KI?;_0U?_^#WR4UY+ +M.GD-O(_Y8Q?TP>Y\Z(=\*!]MGX5Z'<$%,"[R88SD4ZX'KGO@N@?O]^.H)6$R +M@/LW/XTC/(L[;`[YS^+QG+/H7?$85Z#U/[)WG$8N<^&+8[_*>SOZ>I!]>O-Q-@&=B +MYY4[H8>C?S'#V*><3UPPJ_TSIHL_+R))^F::SC2&58C;DB760UC8.ZDIB94O$N;O3:]-8RLK9 +M>Q>8I!'`L%T691"MDI-P[D!\9Y/W+&BWR`(8&XW\8I1PG\`ZO,Y.1F\&%QNW +MCTMGPU_0(3ZQ96I:4?Z3A25WK1T/"'>M\S@:-G%+UVV\^XY-,#DY?IW#S=VY[LX-S5ZN84-S\]WN3>O6 +MPC/K[]IPSUW<1M?M=SGNN#0N?P;MCWH-B3ZXXESUC9CN4MAQTY5A8`&O"'\N +M7!E^7G]E>(GMRO"Z:Z\,?RB_,CP][\KPTXHKPX]=E=_DJ]*/7O4^U[PKP\5+ +MK@PW,5>&?W]5^86K\M]_57T>N^KY1V17AE^]NCQ7I?_XJO#6J\*1W"O#)[57 +ME>>J_A@LOS)\9Q4P)>%K+]C!'V_3QZ),XGK1]ZX\MZZS74KWX..Q>_C\`_OP +M.C9^[H3Q@S2&:'SCAG5NC)['$>&..];=#HE==VW99=R@O1-=Z_;N`FC;]GD:%C/;;AL!DE_2]>M=<%;-\WC +M&AQW3=O$;7"OPY(LOALN;^.:Z:]W:^"SB2KXXNA0( +M_=W-Z[C-KN9-=T/XMKL@!RCQ6F*=/IV[PU7?[("Y.5[[?WH^Z94G)9T!E!V( +M>]D5<03E":>.D+7$=/?:>'JYC,A_.3=5N[R6_Z?OI91>"@S%7%%24=*U)$K4 +MZL2-?_666$_CF^@_^$=(XF[\BEYRE]TFC%RML1<2)JJ"?]<2)9E*N.A-(W0+ +M+*EN2*+A3"6EYLJZ)4MO@:(G)Z=3F4RN('9SSQ4%\D&KQ(N,7B>I@Q2 +M,4H6J_H_K1+^R7\%+1B[S/P7?XE']/_B+Y%N]K_X2Z1;\"_^_F4=_L5?-K3( +M+CR)I:1$!>'V[3N_+6=,QWJ(73J@=1K&VXJKF^6_X+"I_PXO'L:7PWA2(',/ +M+@-<-K@<<%/!Y8$S@"L&5PKN1G4L7Q,=('WD=?#WD;O)>M(#<5`R`B2>9($+ +MPQ]^;T\X_-[^U&^W#^S_Z,&_IT5?_(^?OK-L=YU=QCS]AZU?R0G5=[]7<^"O +M-W_KL6O-'=\>V_CL+?4W%:6JESZR;N'7'C.8#EZ7D=P] +M*RE];OZCDV_X<^'O7;6__\;C'TS.^MZ432MFEA7/?>ZMCXX,K_K[DS6;';_X +MP];6I3>^W?2U[TSX_/O.YPF9T6LW7WO^F/?#G__ZU,('S]Q>U?S.PZ?V7>RR +MW;?^5T6O7EA\S8>OWO^G`\MO>SCSCSLT[ROE;6/AS@6>7Q:\GR]M'%K7\\%CHE]-+'WFOLV=?3O![WSATVX)[ESU[_;:4UQXP_N[D^OD& +M[P_.O3#EFLT_NO[L5];6;IJ:?79/O/?39^XNTFKX-_O`&6_/J +M_/*/O_J[C4N^D_?ZEH/?O:B[\>UOO^6X/^V^C%VB9RA +ME[[>./CC@&OWI!7[I\U[?EKYF0E_^=GTV?I?G7`_W:'ZP>R?%^OG[YG('1>^ +M&7W&4]?RU+=D`[?ZDB;EOKFNY$^_W7XT\')[E_&>E9E37V\=.?P?=\Z;\=^9 +M![>YFN^\Q]&\;I9CTYWK[HC]?MVQZ;JY#7-,I6MGUKO^.7G^M_Y,\#?79$*_ +MY+HY5_CP=]U<4VD9*3&5E)3-+9E;5C:'F$I-964FPIG^S[/^UW]W;]SD:.8X +MXES77+^N>=,_3'=[\SK')J?C'S9'K#*F^/CQ"__,)72/165,EFK+ +M!+E%TR;Q.ZC7J0$9AX5K"O?4X*^FJ`,:XX=@_>F_W(7C[Y##O52\#\^KP?GB +M\?@\WOO*6YWG^;C.]U?8SO-O<(]?2.A^,YHV409YRC65YV@`WML9DP%_"&E. +M_(,TB3KX4$]5L^V")ZXGBWR_#ZXQWLW%=&119Y@A/M&-:23=Y[8+*Z1[[9), +M!8S'![@_`$WW`2S]']P!LM9RJ;X]T`8]%QAP,G"XGSDKDWS`A-\?S.:_N9"7 +MKG\PD@77FS)(',662*NQ6T687>`>5L5P[SB"])^0,G#EX.:#,X-;#9 +M,IFX9P&-M,OWK7,99-]%-919#?56<^VBVK1-I%WF<[3'#+ZEX]+[=_Y9S<_7"^W'U?_G`T +MNN,CJ(>,+.UOS"(I*'.;R',7\?E4>)X!/PE\F?F5\_*ZY?#<]OP1>.83>&;^ +M=Z*,/>X\X-3=LG#E\+]WSOQVF_-@(T\>EH5_.?R/SYG7Q\^9UQ^TVW:99.$G +MA^L/WL;+PMDC:_EU!SF(R1BIYV\_:$8,QQ%YN`6<#]S]X!Z0]BS+A^3A;XW4 +M?>')U>+"%!J0), +M>-V`+OX-G`D_-$`AY\X!Q)^)G4Z7AWDX==5YU,+[`Y +MYUW"#"Z_##,XRI68I@K?JU#[_-?Z_`Q;7FKS,>S$TAV^%-,QWR2^4_?M37=J]9/S.ST.C]^B"G1Z +M[&X2?G_`X9G*FU=S<:QC((7?C+\)HCL[YY^?CU?)__WR\',\&@UL0FR%, +M#&_-O8AA\:J]OK(>3VLA;I["1HQ+G$Q`;:V#TK=9E]@3YXPU1_"\R2&73[_7 +M>LB!Y]@/.AA_-<9^'WD%.T<]*I\\09]OZKPBJ=H/2[$-5-$[?= +MN9_O;9$91P(]G#Q\:.@[BQ7L@.MYJK96L,<<:D6/$]QZ-1L[N4W]I.-;?(_K +M6_RN6I*#7XFC!A)P;WJ0OQ0RW;WSLI#[[I*MV5PTTAEMVCH1_.]&M_.OM'&L +M/+Q^6`[S9\#5)L#X<"3.;M\>E8=O&S;`_35#&WF-J;<5L:\0%<,#,V'2,)IUI^SZUU[H)7U[$377\%_V"EG6>LI +M>[;K20C%XK+9/4ZTI)9VYJ::^[4_7I/00"AT_1U^O^^DI3LLGYR,]9(6>@GM +M".&9=\V1`RZ?;H?U@./3O,F*`Y#;F_9<*;=`\;=>RC!3#2#'MSM@) +MJ;VN%.M>QU[73OBMA/$BD\:+W'4>?F6LSQGEX$EI=.QS[G7E6'=+(T-S)-MV +MRG5+ZG>MIQQR10?167UJM553KVDT,R-]`2A;0$KWLH28Y%/3`"T?#;H790M* +MFQJ__QH"+B88.\,9TT'HB9]I\8'K30'QD!+FC^"_#6X7C9V9QSEE`+>0BI-;(43+8\3 +M0W*PW-GK?]J"F!8Q6O>J#]]5[J1E:E.Y/8WW.3LM%TZG\&U.6M)F;W.JC+(S +M2J'"K@:JE7C32]%R)S[W=BB<1A@/K*\^!FWS%2PNJ*GP$P[M_G809UU>+>7* +MG#TJSN[CN&;'Y&RHWW\,EOL,;-24759IVFXILY.3NJ9U4/8>-SJF< +M0[AKJLBT'&=RRU)E6E]&L]Z?74)+];X<^],6@^OYV->H@Y..^[6?U"`V +MQ.3`QSS5$:>@]/D7:.OOQ9;_D,>ST.E!CLTU_45`C"=87X)*/>*9783P35'* +M.>-?_]U'+M3\T$5T3SO>K:6Z'61/SLG&R=J3];"^&"-GS@AU%3M<6=H=CAVN +MI62I>H?#YM)H$>\IAO/T0VDF?=P=X-N[9,Y3`MV[ST\*S5J+AWKP%'*[=`KY +M)>D4,MEM\5+I;'*[M\>+\4#YK*?]J>RK9%]+SPV(PT/!,>`0$\W(IG"RL< +M@W7EXM7:43(+4I@THH%-%YWJ5/%.$DOSU?$T2R$-@31TVF^4OVST-I)'M5KZ +MZ&37Z[FO:LFCCR'2;=D/>-9$I)-8M#!+)./([M20$GRL"KB.IHRC?=["'%LL"]@N!] +MVL(%&5,1VPY]=>L8HAS9<8S#I5LLD78,M@L]SO,-O29'PB)NC!-<]^J_5.03$CR2D/IKKZ +M7/G:'UI2SBCRW]J8Y$K2VOE>>QM0X1QKFZ/'&9"L:P]T?[6*%DQUWJG\F5^O +M)_EK* +M9,&G/,RT&ZQ/N<^J9'V'//*"Z=9#[M2JISQUUZNE^"<]:R%EW>S5+60&#=)\ +MMID4<0%5%93MH;T6!>D%_"@\5P-=#QKY$8/2^' +M="%;&7OBH>WFD^&&.(;)HJ +M!LHK"Z^"N[+@Z]+=OX40A_2OP9<%I3Z]Q(1:-;N8W=%(=(08RH*<]\5:Q@`K +MF&&V-$:Y,;(+<5HOCM)P>"AVVI.#>7@-S"GG1L3]5;#J``V?@WLN*Z(E/2=4 +M:E6BW4MT,90A&C#YJ0Q/0>`IT=$ALD\6_GQ4+G+Q\Y;F,2J=4HM&?@TEZ`P< +ME$KYW1">V-=T?Z^:&%."7'QVFK5M6U_:BM0HV12-_&:$0GOHG+T_-[M#+/5-7<##*3"T[-3)LYY01SZ%%IA!.2H\I196?FY&3F +MI*G2"*)"53?'OL%I6#Q3/!"*1F9$/X??_%&#[I.0IKM'HIMR/.<_@I3@:Z.QVM&\1X'W88&# +M8OIB5B&U]EOMN0[*#80&NNN`ZJ>S=7.[/(QA`_1ZE[N:KRM_I1%1YFMM?JO= +MK?'4U%"#*U@3/YNNU1%QJLZV>)Y_2:[-EB2?X$Q*/:[-M#=X5BEIG[HB,[[N +M5591E=;]Q-9P7E)&KCG3:K8=O#O3Z;=D!>U0P^ND=\^'7J/RI-0*'\-IW`9G +M3PL)%XQ.AS+Q#>5^X^*ZF\H;9MIFUVC@CL$=C3P_:/`@NAX,W$A@B!%QC+TQ +M5.0QL*2H97V10(,]I51,\9_0&JIR[=?:#%59SA,MC[8OK7*16U=.K7K3OY1T:'M*U&)N52,YL#*WZJP_R;^* +MG-`NT6ILJ?"VR1XZ[X!E>C#;EN7HN^$'OS5Z`=5I_T?5.4X +M/Z@R:[&$>#*2AC(C1M1[:N(01W[!E^3NT+]O,)-/>8SOA7Z+MM6E6)DGE*X3RF>^W3#R#^4\:''25LS&,<]21?4[2555P8C,^W^-,2,+,OA\)P%NO1LXG&AD9 +MN)3BP]`/!&:?_]G@04'=Q.R#LO1EPZA. +MUWUO,:,OAQFT3CH_>>D]QT,2WJ*3'M!8J?B:4V-]24E/T1L&3^!)>U+,O*70 +M]3?_//2@;8*7T2=/3PID3T\)7#<]+7#7]/2@XC%9WGIWEJAXC("?#CX%/QG\ +M1K=*S)XI.Q%+0:68XTYJ36,/*V5]3A4]96!WAN3[25Z5VZE@^YA]1PRJP"N& +M[,`I@P[J>NW85'&V>*[)X[\3Z+*\@O>5(R+O_FC$.I0*+=\XDBZB+EZ*R.Q[ +M$E:%(P8U/$WA:2;H\3=4:8'+716J$X[Y%0>6>NHD'-2O5;5K#ZV(89'!.^3[7^%X]Z7VJ0CA&+QIP#@S[01B9RX:M`G'FE)T +M3=8_J&4ZV6ZB+.ZC-TX7L=4K!I$Z6(1D@[II0B#;,#%PG6%2X"[#Y"`^630X +M_ZHG-?!DNOAW-8%0LOAS-05?*:9P;JLRB<$4XNQ:Z$,#3,-]=3`"$,U--5@L +M^)1)3E_ZL>8/JQ'M3!9JG=JX"/IO1 +M]VBUNFAD]>B5(Z+GO4LC8H9(",Y?G,\XEU'^PGT*7YR'OUP6PW6^:RXA**L] +M#'%A>4R.\X'_CCRVYG.UA.#;CSO5UEYIG$5.:'1^JXH%_N8M+$,YZWNO/5[& +M=G^?MD6Q-$,9=/KOA1Z-W7>_M\4VR?Y;GVR_X@">,5[B;FN&<01U=P+U59N5 +MK$*<`J7W.VCL$D]/GK]2NYZG=Z.&- +MLJ#+8];OMKK<+H^@-)PJ<1[W$Z>V@H&U^/@(<@RQ$LQZ3P8^]DQV<`U?IDM: +MC8B=\OW'O0I8FRF;7F)@E7H-K,AO#R"'(M]/\W;"6UICQ!/N\?>DO%?- +M,WKBE$,O[+_L_=$+:SG4=@PZ*V!.GG3F6%_'MBK'.;G;FL%"RGA;?7!A/D^= +M-H\:Y!2-=0?(*1KK/)O&?MPSS]:1E.F>:YOND17<0M<5IIWG/VJ>+S'3C/TR-:9.W8*S3OF,+OT6* +ME=Z0O%6*=>S8RF^58KQQ;&<07^`X@_#&M3-K@(7PDK"S5>YCGC@"EEMF^.C,#K>,.^9&_<7V+N1"=(-_!O[YJ?9W!%W[4[YLG<[' +MZ`ZVOP4RY\<;9>&LP0^D<_RY.OKL:5BI[AK$9U2#GV]\JKU@FRS,#-)];2IU +M'U')^]HYIBN.`@7ROX6+A#[N?@WX$SEK+NOW$N.ZX$'XK0_TMU+CUX/]4.;5 +M,++L)38OR,E%O8M_4Y,2;&S!%?Z)%EJD"#R#.IG!HE;BVG?#.3%M;,)^6%7W5[UI?[*%SF`"/_22&6F!;U?? +MUVAN]&L[;`\O/N'=0WZYPJ?UHW0[1_?*::])O%(Y&0NNP76@$=7 +M;K$=\Y_P;UC\F+:E2G/3JHY]%M,9Q!$O#C9).]C&X`;^2-X,D\Q]O(7F$Z,Z +MZ`*^J<%6-V_I>N2?*GU)(L:LD[B$-?'X2E\]K%*F$M.4LYNBD4>CT+0*J.?H@(PC,TB0 +MX18*?K>1Q1WT#T8H]Y?0S8*<0^1WPET(N;OE)6^0&VJ)[N-F:M`&&'`RD)1T +M;`K'A$M&TUA'+E[-`+Z9%,L#M$Q>3$]0+@SM%1MW:]6#H;4DECYG/'VVE/ZO +MD/X#D,D,/)FF<%+N:;]9N:U+K:5>.7L<+:\7$I$4%@A),'^:@SG"<0_JA^D\ +M:F-2,+MJOP<1<-YO>=.SVT+/G/&\WSP!^-YC]61F4W"*<-&?U)%5):_P6QK? +MSEY,]?/<1/]+MYZ=6CKD2`89NBU7P\YK8_9HRV7A;PQ0DQ[6H/FIL74&;6ET +M/A"3-=5Q?A/7H:7Q]0?7(>1/U^)9&?DE_A/7+&W)44>%0PO4ESE`RX\ZYCG0 +M.H4".`^UJ;RMW`6_CHLM%2[44/4X*CHB-<:&"/13#_"-?)2(@FAD^89/(::W +MY1/>U](&(U7-?FS[N`I'B9EH5P8EGH*(6K''I!+-).C7KL28#X0DX#.>=_T2 +MZ!"B.WA=B[14=*W/T**\@$BS$\1S/-$S0),N^L\(Z@8L&=.G7J\VJ1OZA*3U +M%Z$,RNA)@6\X657*:IW7L[TMR$=/&D"-RNUC;]0@1GI&`!&%_RCI%3'AUR_3 +M*Z+/OLX#]QK%^[\9(X4?P?U?C?7POZZASF],XUOL\#0+TDN/DO1]Y$84W/3@ +M\WR/!^7M%ZM6@`0E.Z$%RJ@%JC$5>.I%HS^%=E"-2];/V6[QD.GRP%?<WQRCN"C_H8L,6WN<_W(`TF`%*+(=5'BEQJD2;DP+OKX_MM"9I +MU5`2[;"<$S?*@"9B7JECT,N$%T<9Q32$F +M?'/TZ^.:0DQX9O3K/.H*Y:/NTLA7_I.N4#3"2+I"T/KAD9@&%!/NODH#JC*N`37W'VA` +M/3$4TX!BPOO&Y:\YPO1J30G97288:]/8]#DJUEY6-Y<';GX63_46MZE$D'3" +M@&X',W65;IU@Y!/Z?4SXN;$"'DO\ZS'DVLC^LHSW,DE$_BQ2/&(!J6'$M18F38B +MJS&NETLM81_-$1,\K#^^)V6+RZ[[XM\9D.8@W:A6Q/B-!9#&V?">\#ZT_<]' +MHI'/AU'OKZGYR5FR(.X>4,[4G)`&_VS;UN6=]E;-6]7?4#![$O.0/ONF,B3HC>+O1(RMK\F5+3_TK=65P$;`2ETF4([OC3P2*N\>BSPS^)3-/&^)RYQ;201UMC3?<`\K +ML)Z(`><$MF[V*L]W:\CTJ<%MY$?^R=I'R:J<6W-W`MW,`1XV,TAAOMAAABJ" +M:4;E&36K+H]&M@S'=X*@/38/#X0>:4@24=OE+WX?Z=%6YDK\`;NW02V=L,89 +M]UZ(ROVVI'1U]^Y-@4TR72;4YX:A2W8^.I15#?Z&-CY31SP=P)6JK=\0T,;8 +M0'>T\/.Y)I86_$AI='7@JE8^=**)-TL\F`YF^#4!!>MKC$;^&'4U&AJ)7OJ& +MPW%-V&)S!Y]NC)9\7H*HOY/C&NRZ%F*<&O@:[Q1PU4CL+:RKO9FX5T4C/XS> +MRN,>Q@R0"WZ&[VG&]V0--JU*O"[:`;\7G33\P%`M3STRN,<8F6";KLU.10J_1"\(-CX:N3=J +M%4HYFW.I/%:_5P+\YUV]+B$R?@N3'%] +M5"'FB17K8^G+H/;V)CPWP#^)&DUF)H][5,`OX#Q& +M671!G$_`.8\\`\H0+$<(J\!OA$RX::!02'9JS,?LL?'C[D:9N*WQYD8=3_S; +M&1P3',R4MH%TENB.6_&Z=8!G%UI1/X$)WSW0I$6_:4`=Y[)B\2X(_SV4:=OM +MHN4T;YMYOW6WP[W()&FY1".?1F/?_)-MYIR#P%L>JU<*?A>=3_5/F/%KO"EF +MZ8V)T:'$GOI`]T?Q'2]$U/YKK3R8#K/TG6&33[HF*K9,T'QN3;0)7NB7\_%\>_GY^!V#N&/P7)I+V+ +MV?CKB[Y1"R%E +M3I]'.0GC0<(O8?V.8[5A5T>*VAIV)$.OA@?"KE?@G6$'K,=-_:TR(PF(&\7F +M%^%9HIS55ZXLAF=]\&R7H[_U9[Q"6H-EQJP@T?4Z.KT2=B/,?\3OUDKXW1.# +M,+-<0&8C/$@RVHO0%I&Q`%J]>>H#:((`0`AVR[78[5FE7TN,K\C4(,\<-%+Q%^(*D,.K.'A)L*9W"1L&KWH)L!G?TM0K[T( +M:R4-JKF+31=A[50"QWY1PBU'6PHS!O%+!!/`;PY*R!'OJ"1+!]<.W@ +M08WHW[MP=ST_B%\P=$%G*S4Y-SI;45+CH(6;!^2B6D(#CT:.C]$X@C1C2`UV +M218A@#\8[O)(O>;N`NX,6MK]-2R;:G[?4=4\*!LCE6TE]-MBIASZ+>R:##%A +MAP+>KH'^.PK7%V$490:7HXV%=O4VJG,TVYNXYLYF'&.'QG`<+>31EHM*O`@C +M2RZ-+`O$W#3DU0D*_P[$KX\]>[-`.;5[`<_LI^;D@)3"N-5O>/:&&.4 +MX:BQ/"`WY@3%C6IHV>RQPRX7K(%F\O1ZL[K-DG;BZ?65N6BOYJXQ+$5^\/WU +M;1;FY/OKU;D7&\K'Y[(Y+L,@KZ'12(?9I7F-^V=(G^1Q>6<_W&<80F"DA]YW +MMEG>/OF^$]YD/P,<[U@D?R#"]_C1MI8<:NJ-X]=^NICJRN-?TSF/0E6`5U(8 +M^DZ:O&*-_@8<-W9/K^KWIWRJU_O0;A-^B:?AK?#\RT$3S(#8_1?A_J].Q>ZC +MA;H[X?[/@LCU%P>#$MY\9@!Y_\(`2CEYIS!56ZL?YFI/ZT.&R8'.K43U:&"2 +M9#OP.Z!?FN'3@-WO-,C<$]&OE@)/9U!D<3E?8_1B.CHWA6 +M3O1^IU8S%\?U*T`?\,S;E$'DI.7!4Q"60WCB8)-_/P^C*[#7=L(_W;.*O+SR +MA+8CM\E'=$WN9)VW'O<$C1Y9$*U$])3+1?0?0IDQ]VC]C?44.(X$CQVSD$EV +MD7VD\'Z@G;K`_2A?J>BI7M7D/K,JM0]WFE\?0:Y'O=Y,-@EF=5T%[V`*4\5$ +MW`8ISN^@A4,Z3/W""-EW-[S+!3+Z)>KN"F#Z/ZX_JDSK4S>:27W\*:2V.#>< +MT6CD:\.T,(LK-]\2(#-)D"D\JF+ZT#;ISA%,I0L<56G[5DK?UI*"2^'M?M>. +M1I^VQQ0[=9$LUHS'+;5E^7W:6#RV\3='""^2H2MUGL=7-V^6J +M%I*<9BE=G6,`^&-,VS1B;V%@C!"=KAGY3Q(\V.QJ?AJI9S/(,>UT&]%7L&:8 +M_*XT\CC^9KCRFOZ^EMDQ@E!N:Z_.4EYW-GNS+2VV?-LFNOF48GZJV"MR!?\6PB,70UK-[WDI2!)_:Y)O?/X#G,N2E/1R/`P?F,( +M#XL2Y4::\L%P:"/ABL4!D9"WXGOG97$9!/<^\%LZRBQXMFE!?&\$]T(2,@S' +MQ>V/PN#&O7ND(TAKS.:8^@WR0X"NN(]+J<'\R<.;'97Y+X8DZ_VCDFJ@> +MUN@*=R_G=/!^QV-W#N,8V']\$TP'\S`RS.%1*2%%&37GTJCO@S*ZG?$1KQU6&Q1H*S; +M@G03^(+FT4CM,",:1,H=WGBXA1BX0#GD/"5PN)48<@-.N)X4Q%5TZC!PKAL- +M31)O$3@(XR8EB->=S:H@CC=<9Z[E23@X%@T1[G"SQR>VR($OP?=DQ6<)Q&_$ +M/-,D6J@*F*73-4ZIIM'(Q%$ZDP'_U1&9R,S$F&=@?D8C-\2YLTOC`=<0:/1LX.16J,SF-V-4O#T]&"G+[-OU3Y:>T#6J)O;_[4\[%` +MILN"LKS7W3OX9FBM*#)E.`V-!+M3X.U +M02/M_ZC%)`\U*H)H,5&I3S>-1E:.<.PUL%+TC+E?@+Z6Q>2_UP4UK-Y$[H;K +M8P+?I.'P2M/]*E"-9+:N-."VEQQK>J5:W#(:>7J(VQF;2\N'.K>@!55X4A$_ +MPY]#F\+H'6@KN1"._B7X>JO*2Z0S"\F\ +MTAV@0D1Y-G0,UE%-<&_L*Z,DU\^,!D)H>VM@1,Z.1KXV@MCFGXR@5=7PD8?X +M!VI,)FL+G59W`[RQ9:>0$R!%DP([^%<\9,:$0-$==%[16E*4_/:Q+?&O%9O2 +M#>3,'S?AJ4*T>-WKQJ\*ACMHN6$M,4Q[>P9K+SNV13&>EIY)+S^VB4Q/"N`) +MV&-;-M7ZP')S#K=NZX(WGY(58HV^-4)V7;S"3HU)LOMR:)CLHV'?2((#6RX< +MV[142.?J*M!2333B'ES,$YW&U-M4*U17FTK05LWEEFH.M]HD2S7'W/(`#;\V +M2O7/-!G%B]Z;XY9J\B1+-5;)4LW[XY9JM$&T"T8,V4'9S,LMU91!7G7E=*UI +MW%;-+5+Y3",_EFS5Q,HL#)>,VZHQQFS5S+S25DT13]W`C]:$DP1)MB2_-E5JL69ODP;T6W5 +M%F]=LVSY,EIRK9C8N\)]JEWQ=4$>I^WRA*US_`Z;$ELGMJ`LN*=E +M_--)JH<16F!@93,OV;P!V6446^+9X0MN0^A#7M--/4G&F2?HH56K\:10D5R= +MJLG6@MC"?`S\9_'[PE>"+X#/@_QE\ +M8LP)6#UH,SGCC$I$B1XE^5UQ&XX[5V_7TM*\)JMGKV7@--K-P[MM0W\+H?4^ +MO&X=>C_D[GZU&JG+S!/,H8$N7K]/Q&N!E*U>GY-?A9X+\(?CKX+X"? +M#/ZOP%>"_TOP&?"?!Y\4YP5P%,\8=GAPUXP8-?'2X6YSY5!,JM=ID[S49'0[ +M/'1.FR5RFH89R'JD7OH5JUH29XJ.:P9S2R +M>$":_T,JUN`1FRYZ./XG<)EJ;<$@.,D]\-[N0? +MJD$I,27`P?JL#HQ%?A(UQJ7"L38$RGAI$VWD_'6KBY>6X+F4$T/X8K.L>M7'A +M>-];9',KYM^DGAV-6.*2!LW'6CPRI&#=+I)LL#H$M2K&X1C;32< +M/(*TQWS=T8V(S*W(/]H:LVOL;M(ID]*I7@EEV#-H@#)L&`J&&*[+_8=0--(S +M]GJ(`A]]+$3#'P^_"K]_'WXI!!REGM&1<,O@"R%-]Y)J#J@J!SS(:.3HB`[D +ME]'(A1$&:O?)0.S.)X&$;3P+?^/BNG(EBSM\=7,5K.DZ^YQHY&W@96=%YPL\ +MU&!2,`RMDRV-@:*AZP2RZYB3FH[9B5P5M'F@-R6[;CS(!/L&<)9HA[C6E8:W +M@L6"W\,8J&(T841$CO?A31EAN!W +M$L/4P%,FJ7,M3;;C2(S?=H_3(GI)FVY27F]=:/] +M.UMNV2+%2D]/VBK%.KZS]9:M4NS6K'L3;WW.T:&BUF20']2E+GO>Z@G+J$EK +M&#J9N5F=7+=9G;IKLSH]L#G!\R&OA^<P)QNRF$_#4%L32/2*/:C1QK"R7:)+ +MUTAV*7G485,?5-H455TFH*<#3]5?J%=V=;U(R"9X/^*_%U<2N:^:6Q92LPMT3>)(OMRO8.^PS'!QWV&'06MD['%1_#2-W:UBBDXEH*]&L +M3DK_G6JP+\=-9]/2YRP?GU0*L?)IH'P_M/_5_E='&/([HH;U,8DPT>ZVKN2? +MI`!-2/_1MQ?F__[E/QZJW[BP8:W\T4-K1;O#8=:2O$-V:!='6-F3/J@\GB[6 +M]S<\X9#I=`WG'`WV/*&AP;'N4,.3ZQINRUM'=8=N.W];FSGO=MW:AMNG"-@G +MUTB47C8P6="S.GNNX"M-<9+IZL!4UC?W8^=G=G_AIKJ@?:^=$5/M#]M/0X97#JA$M`QX.@II*C#-R:AD"__%]RV$ +MI-U(R(*E_+(7H(X]X`)JQ*&OM.,)BD[H';M#M./3ST=3A!2;SI[IQ'VVUUQO +M.!YV:,N4KS!BMOU)Q[L.Q3@R_)-1Q*!'K/=ER819D8SMAN,0VNYQ?-/#4=G^ +M#M733EE?*;O#"C1/+#$G!YYVR@^0_$R[;/]QU?R^IYT_M3YM+Q=5^636G``K +MI#I9X>!MW[^]D)7M]\TML72V&B)RZ&"]J>Z@PVQ$H9@@"R-MK(R:*5J&%F686PMXZ#;B6U"P@M@ +M=@R&L,_;K(1@>XQUJ]A4=B*+I9\3?5KUO)/ITYF?A_+IK,_;Y[O(C+6!5A>L +MY]-+@P6L;\YTYZ.J0QN8OIW6:5"[%'-^X/R&'+O1B992GW<>VK`?GIKG:'$\ +M<=LU[.KQ=E-'[77EUFTX:,&]/60!.75WPX:JVW4;&C;DW.YU;5Q(*[P.HCMXVZUV +MU!\I9`M8'?;([;K;"X"CS69I!=U].,CLKW"0\$-C))]=?(U8)+KOFK,!:V^2 +M:G]JB(B?K<7:;!VK@/:I@-IYQM#V4_'@3);,#`7QW@:\5X'W&L=2>%C3G$E. +MI%[)TGE_$EP'DO78BU[IZU5]:!#>,VC_6BC6I]B_1]4Q>WN^;OSB'8T\-0K+ +M(=`SX,W"OQ@BX8G@3Q[V`;U+J=8Y_7<(=Y#P^2CF7#JF`RDYN6%'PZ5Q;Q@# +M'B*L&-"\>"0^CP9@W&#JR6/V6GM-B;,4ZO[`PDS[\^N)L2E`"G_=,-@XOW&5 +M;575"Y;\P+V-'>2V^OF-]S:6U:]>\8(E(SB_\2NUJ^M*G*@!,/^.@]82&$/? +MLLB"F+RZJ(OD=9'6=(,R_(\5YR)IB +M7R!,99&2T`"&9K-SE7/3K=406I,I3DZ>"B$&KM6SDR\+:6;+(`1C=[5V]@3[ +M=.?C%DMP$IOE-%7M(0=6S!**[$E0LO*`L=:Q,$9[?C#:(]D\C=&9:;5$G"/. +M=N8`UZ8..%9K14X'[90_`U+N&9TMYB0G*[,@IX.KU27)8I(4DD%(4R(3"R$, +M3Y1,M'60)2M>6S_?^81%=MIH3[IC)ZRHL"Z-:N+US@QD2/5."R:+:,,T.1ZO +M""1)\31(PF=&!UX,Q/O[C3@M/Q8?`]C_KV"%WBB0=]0)A)C:<"Q'JT0@]P*E'"ZJ&_H;YRR>"<96H%G +MZY8TIM8OJW?4Z^NGBB-U^?5KZR=5Z>^XUCG/FFLO=4ZLPA-O9?8<>X9XK?-Y +M2^J)'/O)]3LMZC/!QITPAC/O2+=-<.98,^UE4-^AD12H3F)D(SAQ31`//L7@IW-*2.TP-NA'-&(Z.CFT,DG#NR,33V +M(O(LVX%W\8/S@7M`%>NGV)H;&WD*D$N`]@:><)&B@N"ETF?%2Y]IR[JB_.E7 +ME%_]G\HONZST?QK&E9D0S'][O`Q=:%-QO1QX9\S]M\/)X^7O&4;]FKO'NEZ4 +MUO_AI^XBX9\/D^*_2]S%[:-=+UY>[J>'#P*=G130NTC>$Q9Y,!EF;$8PQ9XF +M.EQ+XOUZT(6Q\J#>A;W[A"O3?@AZ[P&I5`QP7FH[+^FI(]_@[G[E+H7TYBW# +M3]]%8-:1&<`)V'10^Y(@*?SQ;<8-3\/(*70H19W#M:%HPY+;C1L:-V3>[G#1 +M"H?#N%X%/;-=OV2)9KQ&7QU&I(/4,4E^"/]A&,9/N&;8*:VZ!EAW4,..B!]) +MZTXET/Z;AMT2'X/UO+Q\JY.O#*^]*GS'5>%-$-8EGY2Q*=9'5+J]`BA#33CJ)9TQ*%>(EG6)5\-(U#3+S/@YJ)[\/ +M:YGI2(%M$M#5N;HE=GUUG@UF4IDL=;+V0=*PA*NB)2NL/NUUQL_/HDZCZ<@D +M+D?(L:GMKD5>-T]=RJ:^J[V/+%O"LME5U-1@7:6]SO"9E-Y])%U(L_'. +M5*>Z=!OY/OGVK7TKZ/P?Y?35S=63&:EVV9NTG+Q.8E:CABPA +M6Z#._3G_<=OOTZAD4Q!MAOS?LJ7*DO\]6ZH,Z>Q/V%"%Z_.,IO-\A)(/,DCQ +M^PF[*F^@_11N[P5"EIY7HJU;KOT3ZL)/'C.$[_&_-;^&_E47Y5/V3_)AXNGO?SYU'@< +MKAU(FQR4D#O1MDHG692H[[LEL7)0SA+/?^EY&9;'_.)%X,J@K"]>3`]W]?=D +M7LI[&MSO*;E4?DB?>S@>9DA=/X:O?EX-X71-9_])&#L,Y"O7%%\(?[WX?9FY +ML_]$/`[3GJSK/*^0KHO?IZ;.\UKP%\3S5@=\%Q9>:FPGTJY;7MPF>)=N%VC;=G&,I(XV520=YHA^C4 +M9>T#PS"W!\-DKV23Z.JV[+JLK3FT(RT67S'/T-11SO:T._$U'YA-OAR\`GX:O!3P6G`98/3@F/!<>#RP1G`S9#2 +M[+I@BC]3!GXYN/G@S)KV"PO`5\-XD?*$?I\0'Q_\96T[$HTF)\9HC.:T79!# +MV;3P7FQK.3S/<8_#6(3^AO>AW6!\CL)8#_M&U=$_CUX\&F\#;"?,)V:G.*.? +MT[2=_Q1H4^+],^)CP(#VIS1[I/%-S-CF2Z2QC?:WB!GJBK:TS-LNG(A&/TB\ +M%^V47MQSI3W3IEU7AKW;K@S_Z:KP;]JN#+]XU?/3'K@RW/?-*\/4=V7XS$-7 +MAA^[*OV+.ZX,_ZC]RO#=5[TOZ:KZ_>B^*\,_Z[@RO&W[E6'95?4MONK]UU_U +M_,2K[L_V7QE^^:KRWG=5^A>O:B]Z57MV/WAEN'?G5?USU?VS5[UO\E7OFW-5 +M>89W7U5_:#\<)^J'8_94O_S[\N_+OR__OOS[\N_+OR__OOS[\N_+OR__OOS[ +M\N_+OR__OOS[_]Z?3$`-JC8?T;6UX?>L3S\E9()@[!D(^YTO8=(_A(\@I:FESG7H3G,-W=V_RTX$XEPZ[(H9[[N]3&"4'* +M:DH>:#W>JJW-9W36,O\#%B:P"7Z3X7="K8N2:U3F_,%EI69U&Z;.QKY<[1'-7P*M2=W#NE9(XOZ9(?C +M5F!]ND\YHJ!V:&D[U57:J1VM7Y]Q4?U26:;UC&."0!LF")4-;0V]#=3E<[H7 +MQ6S64YT@B]F9OA2.69_&]U4Z,_19\MW62GNE,Q-^<5R4*PA#4\&A/A7?ZV)2 +M8_;4)NMW2WX[C87EB7!JS+=(Z;!4!UR<+MEZP#&OZH`KV7S`46$CNMWMF=NH +MXC7G\?4QB^G$7\:;O42I/C5+4'-^1ZQTJ"6#95-WJ[EB@88SAHH%&7=L8TP7 +M5=V=I\OGVQRQFJ,]L#.0;X%DYZV`[^D@X3M'$O;2/QDDX?TC>+XX&CD=QP[7 +M5JWRKI)0N#7!%/8:@2LAT[.#I"@I.,$FS].4$H/?(P_NL_K=A-,TNQ=IX:JN +MA1@&@U0*,WI,P01W6=&VMD;ZC>N:@4,],]13\T\@!'7P49<5YT"(ORB8CJCM +M(=O[@L8>XDF^&GKPN$K>3.UJ-M,)H8([90_ZWO"E-K]E(UR.KH-N(Y.UE=9' +MR:-:(8>:-(;]OD]/OLF_)/L:W/WNI/T6;)V +M7UK>6>9EWQLVIDV3OZ"MGFEO>[GMMS:F?4&[7&_9)M,SVPKT[>VOVUYJ;]NF +MD;Z*DWR:AV>"?EAM;6A\X6>7R%I=8B-]Y1OGW?ZF(EZ9O`XKV! +MLZ@=\*)-]?9$;?%64DP"0)SO*WS^;5VD<('VQP(G68MC=M.P<3!V"CJA(\-QW&J=+FE-$J.V +MJMCL6?0$X<*A1WCBO']AC]]HP/#%D%[G6"UI)W+G0OEZ>7F^8?K;]/#!U<28 +M$J#&O.!![0,+!8_"2$ZDL41'BC/?3A(/:@4/GD,AW+$0+=RA94J3Q5NTDW,> +M]5B7T9*GH78.>`;CFQ8>]\LK=EO^XRTRDP8)UQ4RLM'([5'4[. +M-F*;O1/20ZQ/:K/3H4H^/Y\ZL9;YQGEO5["Y)?+=AC6H9T$-LX)%.74>A8&< +MD+1!9DY]6_;L1'%6CIEO\:!]?W4[ +MX2GB\H'\:B70BVL6H +M=5FF4R^G^W6^PV[E/ACE!F,0L5!I.'>`@7+('45BPCY[>=PN.YZC1[OMHOR2 +MS7;4(<(SY:@_A',:U[A[R26](Q(>BD;&K120\,^B\YL4W`!JP(5_'\5S7&]& +ME?M0XQ)U9(!4A%^+,J(9_/>BE)L8>K\*VE?73J2Y7C=T$FB-MU*RM/Z29'^] +M7;*_CG81=SLJ/<1#F`2=?)L_*U0Z\G1M#GBS(MGQ$K78Y?J7[*=M[?6?Z-OM +MI7J;(T9U8QBPWXO30D38T!S1N/\(.>?`;)$'LK74)#<<=$=.UKDU+S`FM/SW +MNVHSIRSCW*1@G5L',S6Y9)WO99Z$9T>C,&[M39U-8A/7W%-K;T:-1A.DF&87I+[(A;A<4_UF$LZ-.KTD)]>$%OR=WFZ!D_3QU(XXTBGP#]3$Z+YO +MH^[,#FK"7^0MY)Q[D4RZ1^'7K#TL'.^@;AF'J!.$,QUYHDKM7NDE1>HS^ZKU +MVJRM:5"'9R"FW1(YO<++NU=X35)-=MD>X7>W&$P=A/I.M*#^+(XJZMLC642D +M?EE0+X61QL?\[8*?3_(7FO"ZO/N^&A^GG&.`=<'I=OJ,4DNT03O\9,S(^GC4 +MY<1Z'QZ+T&P3Q9[2B/Z^S<647R)SOS=6?]1"^__KL+\Z?GG:'3K*ME +MTU,"JND3@U;M&H^RF)[\2)74E["E9]6N\LRSWJIE2I+$[[%,7J[5!9R:3,1X +MC'W@YG=.RXIPKKX7L@DR_;P2')^VL5MXE?T3]J.I1RS:$Q/6D.D3`YDY-9X5 +M4U?ET.NW65+>KJJ:K'U\TX.>*4T3UM1XJ"D6_^E;LK(CEO=.4NXW(4VWM9IP +M.@\);QMSH+Y0^!MC!SV2OMI8OP=M9]TSYMB2"?[&,=W6;.F\LV/K1/#7C^F^ +MP8)_^]C!+5EXWG&L?\L$M'(4QQS!,WG((:!>M=JZRQ&-[!I&7)_(J(&G3LQA +MZ5@A7.$(KQDKX)\DG-9RW#SF![N*.#*/,;!%5I/NG[L6KA"7:2Y8U/X +M6%JCTV6`7RSISM%. +M%\9@">X;C>,\`,\8X1.:Q7BNCH0?'Z70^^G%,EC+8C,I7"VZ"E--5M$ANARI +M:LD7U#$?[>V)CHLP;E=!_;X-8[,PBN<'ZZ*BJPON4.ZM$.(['QD5!=[A=X@\ +M6IJF>C5K-K4WO;3QI69+,@FBZ,7\2QC/FSXX&JQF=:?[!C437OY'; +M1),=FVCJP4U_%$BZN`G7^'DEZ="NDT;?X(E.=NW*U198:>7&H9/'!&5%DE_G +M0SNPOQI^B:>Z.A-M4NAZ)=HY*][Z0+OT)._7?'I/>D]JS\]Y4[F,Y6;OWWQF +M<\X]:,WJ>>%HC7\G6FWV;_/#RH$^ZC#/8+DRT9MNF'2:&B:>_*F`UC)@Y$/] +M#]>:)"V]'TDZL_WC.K-,H--+T6Z>7J;#GOA['.D>3U`.C*C8@]X#O%F?N:QN +M;HG[X=HRO>G&W$I"K:^B82?'"EALTL,;+T7Z.U(--(8+8<9 +M=F:$ZI]PD_"%D9+Q=>+QD9T"EETAE]*F`S<`SW+A)M1IQIG2.()U +MVA!O'=0:QMBOCWSUBI5[-_B=+#C"AS5ZTJ5>41GAEZV#T3U-]70 +MTF0((_U:,9">G\=&]26E1#[//6PS]72P$VO[BC4[/#A2Q4U29?1,] +M:>[EGAKW(YX'W7V>W[LG>FLV+?>FW?V(M^;NE'NR6J;DK5SVFH?D<34]14QP +MAOMU-Q&GN[-M[5K-O!.MT2(2L&W*NBR4?'>&S:=-H(+Q=T0/12,D`4GX_ +M,)7Y`W&;@"1)$1L;V.=K581!K*@$3M1[3&P'Y\`R>547,1^E\-XQM'L8U\AXD3`:00WL_;A4C+%FO`QDVW#)$'J:/ +MX%I,!IA=A;QKH6-\G:-%9IZJ/Q52RCOK$ +M7:+KK$][[8&5B0H.*2(:[AE^[$YKADEYXDL,S54%<\JZ@QOZB& +M-J.(9YX&=<7[Z76=_4N@#15B9S\Q=_:G:3K[DTV=_2K2<]X>\)W#Y^71Z%_P +M&56@]SRQ=YY'O$CBB^%SRGLZ^WN2?GCQP\'X5GS9JVT7M)KMTCE:#=E^80*\-QM\2-N?'N[L3Y191HK?GP[EPC+A64O6]/`% +MF:E&S.8>OH#8G41L%V7D:_TIA.Q(-^T5&[#,II?/FZ<\=$X%^:DTO>=E9$F_ +M3-/9QI!*,1OR3."XPYJ*N*52V1)Q[N[TVC26LG+VW@4F:00P;)=%&43;7B#/ +MQ'6-E;QG0;M%%L#8:*1JC'"?A`CI;22C!QMC8XN0QZ5SIO84Y/+^;S:3`-Y3UXC'B.TK^#)+-$/?N&3 +MZ2)/4ONF/9DLJF%%3V658A):>C$RP<*G@,(\A?1BYJ!!0@.@<$IXFA0:" +MG!3'>6@9"4\9Y*0X3#UI$"D+Y;2+8OO#0->)<-=FQQVNM=QB][KF!(P]1*L7 +MN#:[UJ[C+%YNY;KF#80LO@QA?OE=:\<#PEWK/(Z&3=S2=1OOOF,3$`6.OP0N +MSS5LD`#NUZV%9];?M>&>N^(P\I?&Y<^@_?&,=*(/+C_#6*/&=)?"&U17AO]_ +M[/T)>%/']3>.SURMEHTM&Q-DVP1#2$I96LEDD +M0X)L")%L2&63I#)DP21-69K&A*2%I(N;0INT26MG:2%I$PEP"R%IKR%$)$U2 +M9:N\ZW_.E0R8;[?W_;V_]WG^OR?R,YX[ZYWES)DS[)5[F+KTK_ +MK:O"OW55?J^5C77?YQCK_K%\K-MR57X]5^5WYJKX"ZX*?_JJ\,/SQKH5MUQ5 +M'\58]PM7I8]=%?Y[&4P>T6LO9,^'CAIMTT?BS.CSWQZYZHSOO,OQ+-])A&%Z +MIW3V--%?[=!?HQC`HWU647OGQL8[7!NXS6L:[_#<.4I&%8V>S>X[UFSVU'%K +M?'5KO.@]AR/"A@UKUD%DSYV;-C?>59>,#(0$J9%8N,8U=6L\6]:LEFAT-+9K +M]>K&-9LVC7[:6'KY31"_X:XUFR1TYULWN^K6Z +M<^IF;J-W#99DT5WPN)9S7R98*?9MF]8T%J]>L]9SYYK527KE+/_+.EN)>N$8 +M/X(R6=DXG.35VM7$?-?J9!JYC,A_-3M-=]M"_M]^!Z*47G8,)$Q12E'*M21. +MU.K1@/^42USZ84X:0F3PE\C[7_R1I+GT1"^;*X))7`5_UQ(EF4*X^,U#]/J6 +MSP///(.92__[M)S94F*MJ($Z:#3I5$:R4+_N_+G_S)?PTM-M8K +M\\K??Y-'LOCXRX;6V$7,)%U)"0QOTGKOSL?DC)F`%SD-XW'9U:__7S#8"O^` +M3`LV9#X_TW7YNMGU\TREZPIOMOKFE'K^7=,Z;_X +MF>$WVVQ&VW+]K#$V/)E+K[>8B<5LL93.MLPN+9U%S"66DA(SXN<8UKL]OU+YO"G/A=LO__Y/?`IT]<^'=F](Z< +MJ$S(Z2V9(!-K6Z2Y'>\?:4%^9N&90I@:[)44[RHEYGZ0G7NO--%D'G((2\-P +M2*\&$TCZ8WH,^]H['>?YY-W$K[$=Y__`/7%A](XBHVT19?!.N;;B'`U!OAV) +M]<6/(,Z)?Q%GM`X!O$^EW7[!E[S/A3)E`)[1W\LE[G+AW3:&!$0OQI'NZ+5< +M6":%M4KR.C#'#W$M"$WW(4QU'VX`.?XVJ;Y=T`9=%Q@P,C"X]R%FD0^9J+T_ +MF__V_'[I^?10%CR["TER)X9(D\0?)A/F(S!1,%],1MVD0$[@7PJF#`RL08D5 +MS$HP;IQ4K)3IJ2;D-9`!=@4>/I=!]EQ40YG54&\UURJJS=M%VFD]1[MLYRBI +MZ85UN,9+.B\JR-+>@7A<0TGV^53KO5I*)IQ/K;E/RX"=`K:LYK7SLC(DMY)V205UW-F\MQ%3)\&Z1FP4\"665\]+Z^Y#=+= +MFS\$:3Z#--.?C#,U2>,&\[^#X6[5/^U(EY"Q$V<5$E^W_M]"=M]Y!;*[+G[_ +M?T1V#_!=G@`?&(/L?L\89/?F?XOLGOC&LRF)[_Y@7!Y])-[G\8[!=S\)OKOB +MB._^UL@H\I.G$I';:P4F?5V5P^MLXAH1/5?G0ZWA6DYKY[V"A-.^/OY_!YG= +M^O])9/9,"9F=^R?([`G:W*!(['=.-A`&1&5F&MCEAH0N$CSCD9^7V)_].)

.X:(IB976\=L:!%B#/S=4"I +M)>@%-$6##V0W+2O'UUE5< +MWFQ2^F!^F/N$H$6B/%C"GP*M-I::(LWY%AZJ%9:5)HUY#:?(_FJ4A[PO!U`. +M7&M>#!!X#,REDKZS.S!T?&XGA\JK<)PU2<[\PV=_J,Z\^UL[\T5G(\[\93]* +M9WY+PIGOR;D$G?GI9T=WYB\[.^3,)Y^].,Y\Y#D7/-,Z*=VWPK6E5:IC@2\V +MY`9*O%91T\3KUDD\[5/\.I66<.:_;V?^DV]TY@='./-?C>+,VV.<^6UC.O/U +M(YQYZR7FS)^2G/E)`^#,,[W?I3/_YD5PYELNHC._.\:9WR"510O>QE7XM6;RQ7/F0SC-^J?\.)UYV.>?X_2!]$@X\Y>6,P_[ +M%/9O^60Q5MC%=N:72^=1PIG_X3CS:Z3][9#R\E])QP#L?QN,F_SC=.8CVP7; +M9).V+W;;+K8S'SFVX?<?E\O +MK<.W<>9CU_MB.O-0;O@A.?.PG;'KAZ8.'U;%#:OCAJFI/SUGGIF:<.9_S,X\ +M7#L@;THX\S]M9SYR'$`<&+C6T^GB]2KAS)^_,V^]'J&K%R($:4?%7/_A&LQ( +MY8`#4ED`O@??%]+X)^;,ETOE5DBGB^W,1Y8+,1^]<:[X[CB'O"3.E7]V#&>^ +M)V[^V^*<\\?'<.:GQKGJOXS[_B=QSOQOQG#FOVR.FQ[GS-\5Y\0OB7/F_S*& +M,S\0Y\C'._-?Q:W_TV,X\V?CTDL3EY[=<8[\P3AG?O+6X<,9<=^_+FYY67'K +M+#KSP0<3SGRB2W2)+M$END27Z!)=HDMTB2[1);I$E^@27:)+=-]7 +M)^.A;5V]"VGJZ^$_QNYNA";Q9MM$@G3`^\04DX.S$2S\Z^K8BW+2?>/-V^HV +MF]#[:?2XXM02'E7<^H5[6\8ABG18;_W4O8DZ2(':*_QCJ0&)O#>PG1P>,Y#D +M72AE.9&?4N:X$>K&.O8UNHFL.Y0DO3R#<&YL4V5/\A&TVK!E[<&U5*F.U!05 +MN+>82.\:_)Z"ITSB*(-2"^TNO^A32C&>9+I59(LIZ2A!IPI3Y7CJAWW_"*BN +MFBZ?GDH9'G3Y7.49=RRFM/;%1/!0'Z75T%#?^<]]70&U4*^S6Z=3H$RD5QTU +MEGQ1?LHRT_YR4G\G<56CJ>=P./.$A:%=-L;>CL?M`EDV)_5HEGT/'CIAR;)_ +MCOM/V\9#O&BVR73F\`&&"+9*M=6[-;ZS4^B\J +M\Y'>[93[=A2Y'8A15SMNI/"GLCJD[_41PC"IA6^0OJ8BB#.N%M[%=H00U\Z% +M^]".$&+:N2"CK +M#MD#KG=I#G!P1E5[_`XDK4390VN\9G'R#==?S&3]6K=HOH*LJ'^S7J?F6Q8 +MU"#7FAIE6K(Q2]O0\)ZYHZ&^42W4/D`Z(A/J7ATJD7=M+'_N9B)_LZGO6([3 +M-3._*,D +MB>S:4`UG>F/UV4!PWTN9%\U2S83P<)>L89YI/T1 +MWJ/E&DWRRF12591$I\\!ESX8>))#MHV+V]W9>A@^'=!JK.5"NU3F;P&=5CY/ +MI\_M(EI;RB$./I&=Z6NAMBSFG8IL=&@\C31H=EI7LK^%XIU0QPM]L>N\XNA(,^K9`-AWNN2,,$1&^ +M#&TM5D`,!/RY.[2E1*G-IB<8R!U$<&\HF][(I1L8+3./".X)D0SC*-!PR]9Q +M9R&1!'1 +MG)X-:?;7@!:/=0EI]GY@*:?3$3;82EWV_*YKZ6D&>;-^);1A(?1S?#D994Z% +M'AT26MI<>7F7[-G)_CD9I5R=$^*SPV^\$MA/R_%O5DB_^7R`P.OM=,HSR()D +MOP8?LYN<&3<3;!M.U3)A;#[$\W++Y^TRO7TD$-;3+0OG%2IPG:W`ZJUFE5D&CX&`8MENQ$P5[PWI!DY?O2#>@X)GPS*70 +MNK9`HUI&[-2X6AW*'?C(AM@>&F@KF1^"NHQRJ\I/!`M"=#02!=3E7E"E8$+" +M?DT*0:NA])!R!Z'7^Z#M$.PC>2C+CU`DKGV9%,\>VC9`O/N@?"C6/;3E@GK^ +MT(8+SG^XQM6AF/9?^/<&P@23'@@MP2FL:4#"&5[6=QCG,+6%0JSY#B$"?8,0 +M@1[B4#9;"YW(BT#99\K=DJYJFB"OH_ +M4LX'7H9ZK]K1A7\Q`Y\G*C8RR@'&@K-L< +M&D&RO\UUB$/!Q>$P/F(M5;NJ_%5,];NEEFIH)\K2HFT_-YQU]]O"7IB&QTUC +M*^Y&P=EA6RW*F,:"76"K?8MGA%:.*JMD7^(2`,&2FC?,A"-M$\'".Y0.Y(SC +M1IDPC<#O1FH_?W`3X9`Q8'P@AMW[PA*5X]9:E*,ZVE:LI2:N'X^WX1D\IL'4 +M\_[R6LZQO)85MF2W^4FNN4[/;D*$ZU`=Q$B$XXEPM0@Q*`FWS*<5AB%'%_N/ +M\@]SR>Z9+'R>MV][B8M17JW'5P&;P^;*%E*B":=#QV`V_1L.6LC"=K\V&&;T +M5;:JUJK35?IJ6W6XYW@XW.,)Y]&Z`JC/]W181T&_$/?OY8R_)B&:"1[>*HU? +M%V:H];QQNLH:,;G7+T&ZZ3:=YI@;:>77/;I8EYMYE)A55"[+'>=-RIWL*Z)6 +M.I6SB<-?)"5W1EI"%U$KG/.+_HTB#U9'X8#V.WW/#7]V4Y +M<):>"E3R,NU\`]3>7#E8R259SM!?7+[71!V:M!+E3O:F990XEU^^(H.XKM$T +MKFO%DNG4XVL><,ZHFK2RQ$FPXOCNX[*"O:93APGFC'\/1I>/KE +M>+J.*;,6,DW6`@[5>JWYN-Q05F'@7+5-%7.X]EIOQ94@+`%Q=!7@HARA1$_['3Q- +M!?D.[GOQZP#,$_0/_)T3UP4D]:,#$',+!>\:B,2G4]`GN4BK;ZCSB((/#Q#X +M&)HP6W8T<@QU%?OM,U/9(K_5;[>FJH0^KQ+[$"?1;^W$1_^2`;_=*`RMPDM9 +M-!#N&1P4K)S9XWWO\O]K'MW*D?DC-@[4"+TQ[+>WX240C"<`VO"F@0Z>L[JM +M'@[B>Q-:%6UD&ZHZ:CJJ3=5EALV.J$$>7#.`@G7XY1IH*R8U[(*6&J3YJ(99 +M0Z18UQ"I+6M>X-$$_QHH6G?5$A`E42N#%A?M;#>:J$/US;XY8?Z/8%Y^WY13&19"CYV +M['**+L'2/HA=MXR[H2J2/ZTH@76[#Z\;Q")AKDD+."DH:0J8M.JF!=T4O%!T +M74!="^HN>-FM+NRJJY\MWI;J7C)`]R.BNU,0@Y=UHZZF]_R?9Y)RV]OG^_M_ +M_M_7Z_?Z;^!TYIPY<^94.;SXUZL>R=232#F^,\7]Z,5DG1EG<* +ME!$Q2^1`95(C/"N<*E_'8WTX+ZL/1HF;`3P(O,M%&U%+'?OTXF$LTY)D[:`> +M.(8N&"Z]A%_H@&MG\UQ!8^8;.P,S!;M-Y]646>#-R%"AHM=]8#*)]@WM"Z@X +MN@#X5?A"/+9-J:\IPY;[$O85^X;R!3DPUG;+A\VHO:G8NUPQ_%]01U.J2/YG +MC5/X>*QP.(?7F%OORH:R%!A +MQ;I&@TS#WW29@;]Z60U_M7);HQI<,)`OZ&KSA=`6L1FM'YD%GN-;C9RNE9&O +M%';"O17N68%OU[<'C9.4L[!$?D,7A$[#Z_VU,XS06WP +MM/+,I.7L&F6V\%#F8TQ"ZJ1,6=[YPMN>U+1\\$_ +MO=I6G`%^M/]:#/YRQ6>&V#/`EU,,YG>4UI:T!;0$YN +M:VP-Y#ASERRKW;"(4>$,X6B2DWHN*]&/L%_HQE_`T,(Y8Q#MW"3K''6)<6[!?@;E +M7$P6ZQ8;%D.;++8LMBXN78QGKH/YAM.$N"K*K<4R,;C-_UMGR.NH_WMGR%_/ +M+):?R`PJ^1\[2X[7:D(^K:#(IVSWXV291?B/>HFTD.JGKP/N&$P02?3OJUD-Z7:&G;I*U+ +MA)2S[KJQI\3463=V)R?ON/H+Z?QC9V%!PDI*CCC;7G@RAMWW$+F`HV9=NZ.S36SO[M*3[C"N,N.LS +M/S;&XY_B.]KPD3/$U7D&<2%),('#R71W]G6G/'ON8C<.WDF<.^T\$X=W[8;6 +MTQ07E!=>U7::Y;:=-1JV*6>8#63;V7&0[GBX0MR^C&AGWUB>563FQS,@7Y@G +M/.?*6A\ZJ[)6R>.YA\XB1B>1VV05^6Y?*B';,ZP/RO689^OK9^R3[S^MA>]I +M#4?.J,BR/I6ALY4FY?)X^.88'CG,?HA/JN1M+,Q[.*,ZG:58AKUKH57I`33; +M5:&1T+HE\'])/6\-[U^(Z!$8&H]5CA+NRP@A)QO(R$L-B;Y%R./*&5_&B)AH +M%5/2"_.?G'9LHCFOLL+1LK#7./%JVC)>XBFJEWMRDIS/Z^Q4.._)*^2CA.J= +M^F2V'(+KM"<93B&8Y;<"BH"=9 +M_-0 +ML`F(`L=?@$KGZC/MM25#T"_WRYU#_>#Y]K`TN.8^JO12K +M?O9EV/4;S9?Z'U-?ZA\Q7>K_^K+W;[[L_?++GMOF7>K_@K_4OX^YU)]U>7XN +M2R_U,O^>R]Z?X+C4WWB9_W>7Q7_N,O]O5#!91*\\&UR(C9L(FX-G;Y/WQQ^\ +M]'QNN>-"O)P?))[A^[N5<[Z)]OD!M,\8MN]8&Y77W;;1=ZM[`[=IK>]6SVUC +MW:;VYKVN3;7#^&<2_K:L32#6C\5VKUGC6]O4-+9EL>+"ER!^X^:U30IJ\_6;W/7KN8T7]4WEMWSM +M&@^DNFD^5^^^;?HF;J-W+>9DZ6:X7<>)%SJH$ON&IK6^F6O6KO/,&=P&3YW/#;W^?.G_Q1[,@3WQ +MA/UK^+MIR25A!/FF0SF$K"'6S6N2\1D585Z>FV:\H?I?(]A3%'7!,YAPA2F% +M*5>2.-'IQA[\NU3BR@]3TB/$O&HLE*+B<9H>'IZPV.M=/&%XF*8QC,1'1F@= +M\_7GS.S:VMG,YU\S.GID)`YL[3_^1Y+N_!UUP5WTF,2U\.]*HB%3"!>_=IB: +MU_I5\.FG,3/*WWX#9[45V\MKH,QZ?0:E"N1W:.[]AGRF;_N7A4M6Z*^@-B\- +MRKKX]S](@B2SBK_Q4%,[B95D:"@"9(NT;=OQ,(.2`/Q_%^C2RLL__W_@L,3? +M0*)#F#"TH1H5<,!E@ANO0X.>P`>!RP-G`3<37#&X:W2)[T;AAVN;8^Z-A&V: +M__S^__2WSN.[]7:W;^U5[DVWKMV0^'NS>].\N?5SK"4W%Y?-*9UYN]<]J\[S +MKPC8O_E9X3?7:L6K;=Z<2ZYP9RV9,Z>$V*PV6\E8<-;_ +MO6+^\]_FIDUN'\<1<:VO;JUOTS^-=XMOK7N3Z/ZGU6!-_,Y?_U_RN_>+Q\_^ +M*S>FMRAK$OQ[:Q;PRH96A0=`G3`#\-4LW%/P3`?76@KUQQ(\`O#4?1>[:#(- +M!IZEX7-X7P^2WW^-DQO5':T"JKX)N,H?PT +M%89T.Q-RQ[,0Y]@_B3-6AB#JN!FVGO4G=>R0UPS"/89[N81^'>H;TB0H>S&. +MHC?9>G:E\JQ-X>.!6'Z",B)4W2_=^4/Q^/;/H1PJLKRO9QQ)13G/2EXXA^^GP?LT7%/@JK*_ +M<8:IN0'>VY8_#.]\">^$]\7IOR5=VO[X_R,\]TN1QC,LY0()EPL5SG^TMG\U +M?P'S_0>CFO.8[Z478;[/Y;L]="L\0CKI1DNN) +MS^+?:"7CFN^C.C%^.J/SDZAJO^][CI_?\"-YV)#@Q_[^`F_YD +M/J&M,+Z*U&A[9M[2>9?@IL_Y![CI2T;_*6[ZX<)*M%'/,E.,LYE):6U=Y,&I +ME79B-&Y;I&6F\OEI>57$=&T:]=`]B\R51I%N7JXQ];:%J$?9ROT5E#39I9/) +M(WOA;HY+);\,U[I%$US$/+&2]DU<,MYJ#B'RNM&5X?1>1X[GNM!^6DJ&H>#= +MXW1R+2?S//YZ^C_`7Q^OA3)"^_:C35$=H6^`7RF4'YA$^DMX!G("_6$^KCM\ +MEL1B__3OL-@C%V&QGQ68Z%4#%[#83POQV(1+L-C_G,1B_],_P&(__C_$8G^[ +MDDS-$=NZ0LTJ"W/RPHF0[:&>RM>JCQE7^,?Y>T+Y=)[C(7\^D^^LHDGCH3G30\AJ?.1"<,(Y[ZN>&O(QN=T4/C12IO?VBU +MQFPZ9EQ62S@\3X-VBL^$\DWY,[)/WE"KF9F)-D83>.AT*DV/NSZYIWPFA+@! +M.RH^>U=M2M&\+685]DDYYK==?XHL,Z8%,MCM_G?\:MN]BT9-4]ET^PV":OKX +MLI[0KU4OG4(Y#I!ML#W@^3>.;W^NGI"QSW>C\#FG6O +MGYE:!/>E2S9K;LT8OX">R4K%_'W^FE+=M#F.^[SM?@&QS:VX0P4M;J)\2)WZ +M[C>P'16[W]6Q#T?Z[C>R>RIVP?W.R';_@[8<@ +MWA@*.A/]9`@13C]3TCRAH*!+,*8_%L8PT%71;T'/F2.=K>8"&==<0$%GHK'! +M!`KZC%$J^I.AOT=!_V,2!7W/T!@*>N\E*.B4A7KW8A3T0T-D-Q/][>`%%/2U +M211T571@E%CN#K^NY+(UB8+^ZW^!@OYN$@7]K8M0T'^^A&+-T,-W0@]_:^H% +M%'1604'/@7Z=0$&?H)F@&6>8,,$P(4V31M#>U0U)#'0=BVLC+1ZX:L8FM+C[8GL[6I5$$0,4L[>+-">28JMMAU"I;X&%IZ`?2) +MV4,))))M@BJZ<11;[JWD7(A[44UQJVAO_B:"(QW]=RO^SR-OP8S[KW'2&X5T +MMF;.`3]MV2!1^;<)SWI_JV"D;ZA&''.K6-Z"R%BDA08.Q2;R+8PE7:KCGS%G +MUZ+5JY06G#5[B,X(?0;F7LIUL]/@IRSKI._R1A/V;")-,=4JF.JUEV&JJWIG +MBX^T].2.X:HOOPQ7?5D25SU+J0M!P56ON@17W:K@JC\V:A<05?W:2F-](N3$ +M,%YAYI`0L?&[0RKY*07W^T:H]ZN7'FG&EBU54#((A%>0,MY:V;9J]?ICQM+* +M7-=_-3\/LT$&._,\GOHT>;V,[\Q7\+;@'?-RTK;J6\T41\U`6\,S*KM)M[&) +M=*\JK#P56@WW0:/).>4\JKI*FNK,%K<::?F*RE7KQQD1!9V)+A\L:Z;R.98J +MP#1RE31R*QN)?=7)T!65N:)`VHT)7/3\01UOMRYL9$P'O64R(?U);`O$8Y=A +M3)^@$KP,SN6[84[?"ZX3W"%P7>`.:!,T(HS87MH$!AC2A&?A'F>(JD&;@K$> +M0TP;;\`DJ$-MNJWGFA#SX2L>L7._XK]*8JXST?\:Z$^.J\^K2Y*8Z]=(P#TH +M=7_%L$6I^P3B>F<2OOYM!8>=R9@-+^48YJJ!`4N_9U8Q< +M=4<%.9[%IFARI4-%5-BD97I?12MF]BS7)/F-HASIYU!#/#&5T'=&WW0`(;/#-)PP\(+FU&QZ,*SGOZ +M+CUK+\Y@:^822]JNQO?&FSHUY$2&J3.)]3Y)&?5C.._J/;PF?8\]@_\\'E"._=$6+V>44UVWNH2!-^HVA"^$21"?(V,#)%3MM+<^%&?ZCM(H3W +MC#WQ6/Y@&M3SD7Y$>% +M"!.[,7V/X!=(Q2J/<#0TSG@K(KX7?:P@OA.9D1'U'1'?Y8B81'Q7A]_@O,E2 +M-2A8[R/];IX2W4FL=P:D9<1Z5YMZZ`36^W(^V,[L&6\-5=#'F3UL@?K8Z^=3 +M$")!R&--T43)R9,&IX+ROO3_$.6=-<5CM2,7:O_*R(4Z_^<([]3[4'N1XLO0 +MW1E)#!5!796RPQ_-NM,H +MX/DSM$U]0J/(>N?IQ3^B"_;DF;-\>/8^\`W;X-GGX(;IA"R!9],8D"582$<' +MUWYMX@R+_B+T^`:@V7I[`CV^?@3/^):R6S]2*>CN;PAO.G5-!O$-(1@J-[[! +M5X@=%:GAMM;[G(V,I=!7Z^0"5Y_'9SA\/C]?@% +MC?7$829*S`*W +MG_/O=>+Y\WW^%$;GV+9(]C\BW)/218(YW21EI]TXS91:FR56-ND>I&;0QW6/ +MJ&=0)TO9C(\R@'IN;SH-G*%VURZ-IO>9.U/-D[0DS)C'L;K9VYV=Q9I=NP)( +M!]\.L;-!_GNWE/WJK&XO75@O:??NA+Y4RGYZ]LXJVBPJ>/1LLB1]9QGSG5PW +MH79E_PL\>NQ[OSUK\G?Z-U;BR>^"8%V`"R`&_/X`(L"?#B`R_)?DN/&0^8#K +MV,J=%>KC.RNT4N?L23MV5*A.WE1%YO00HBMC6)_F(VJ`UFFB!] +MTW"1?'5EREY5_M[:^D5HG7V-QNS:ZJ_P3Z)S':_[)S&Y#E5@$H37N806=<$$ +MJ6WL['0`ST[3S7AVVNUN:RYO5D*;20N&$XW.T>DV5;5R!:*S!>8[2)3BCA%2`&(>;^KE)URUB(>@1BZXO;<(\%$WRIEQYW- +M<5H/C6/ML]]O21/412DB]$U/KR??^&Q%ZDEU_OM-*9X48Q9_Q-7J">;E.%K= +MW6+8;57L-N(XPO&%8\JH38Q#7/W#^7T8_-=.)O2WP/U-FQB[R.=O!RGDB-9P +M*%:9#K)/:GC9E)03M<;\.TF1*JP#:H:\'E7V=6]0:^C]JU##IO@1+ZBU(N44 +MJ\2BPTCS/HU0UM:*K]\SL!]%#(<_6N(&.D,5I)YT>3EOGQ_I[SMQV4O!7)O@ +MI_?Y2<%`V.37%WQSDF9=7L)AO/\&.09;"Q$(]WME[[E(GQ^UD)Z#=T]'CCD- +MHAU/MKNRQ##?W=X*4K3!A6?7?R?H_3LKZ+#..QK;-II80_KB\%L\XC_T!4C! +M>@7E60PC^O-:!?>Y3J)8ETT(O%H-,R7(`8W-B/R->%7J\/,0EY9L+6B'&_]2 +M83*5D@\[>P.(7[QX?8YL:E8IF"'/.]/#6>+/G#W-NYH[*BC4#9$GL%SCLX)( +M,E>I9<2I=#4:Q#>;;UYO@5J*QP[&GQ#X9IWO*0'E-41SOS#7Z\11L\&NU+[FZP-X2,K*=8WKC7;$[Y]WSJU)H'79KEPI&CIKU57-L"=0G-9U8+&%$XTX)$],^ +MGP7&7-9PQ?G5%40^I<,R\/A9"JY#AM090#V0Z/KUPE;2'D(TP'(%9?O4,&+^ +M_L2'.-M:A<.;&D<$.BJ,(74\,;6VU3GIMM;@>!,5I,%7,S?6A-\[.32&PYQK +MHI]9Q=/1>X;HW:THO8-TW<:]&"'<+R(5W*&(X/SB,'!0>2&0VJZK?M/X3O,O +MFTF^D?U515L7.5[*SFVF\JA9AQ8!IY$G5)\BC^38R:15)?S;H>[0W.HKC7,K +M[7-7M^^MF'F2WDL*"Z7YSEU^4CA-*JT\9+;/SO7V`/>-7+U[$2)X0IV;K$Z! +M+%O5##1MFG/Y^J#1;IP)?)#=Q@<9FV7R:&S?2(&"_^*TZ:VCL;TCB#5-IFYN +MQ/(O`EEYN<1"/[_.A]^[4L+QI>94T6G#*HX4$0DDEB7`+7O+6`IJJABU'BKX!:&1J\(.>R4YKS36P\UO)+F.I*NH;HJQ&VXON,K<1^`>RERI] +MT3W?C:B9NMX#+61O&1LTEK8>:-%[@D:=^UQSF>=JX+*WQ$5W0?N3B'59OP_U +ME$"*V1`O8_GZ'_&=3O1W-"?0KW$%T'!>BGP4UWQ796.?1/R9O/?(GLIC1NQ/ +MNYU$GBT?"RU'.<9XT/.TGRKK`)G0XUD,$J%&#JS/-**$B\AK$^5[>&*FO6W> +M97U:M;_W0+Y++^+@A+68]2K3G>`O=\O9__%JL@N39WPNBR#.%) +MU+K1IJ5-5:6B84YYYTHR7?.WV&D6@8#0!/#E`E'!=UB;*"LJB@])"IYJX7XY2U,@4%)+;VWSCG0 +MW#D?:'"8M"!B:#<)GE\-2"`.J10LHW->1G;YNS54+S%_XL55CDQI"=^MH"55 +M\N5^ND!UC$)+RUZT+TYYX[$7A\N%[RGH.0FJ=JWS>C^9`;37M,RK,Y7[OF>B +M?%]$F`(V'(_]?KA4;&VF;*T^7+W`NDQ\87;R"\4"[T^L,X#$9*%.$K,>OO!] +M>&NFL[4Y^XZ."NVQ\F9=`0.IE_O:(.4W(IA;YL18&2BE##AV5PR6B=_C=+Z? +M1Z*'XJPX'R=?5L[RT+C6MSLIQW^6V*]1^/8Q +MGMV:7.\K`1[!/"F!\?TW30*/!M'L5='Y@[R"9J^*7CWH4-#L55'[X#4RTJ&, +M`6(*3/^>^J6VWSKGM[T47&.>'Z3-+[>]O<3M547C_3U5"53[*;WQV,31!*K] +M%1*^^47_&*K]$?Z(LD8PAFG_\R'$T_[O02OTRS_U(Z:]?`+?>+>?F%YJ*]N* +M*1_KQY`_]*L43'M5].W^6@73?G#@I\Y_C6C_Q/\AHGWO18CV?_@WB/8;DHCV +M]_]#1/OM_P+1OK7J4CS[/YW'L__3>3S[AP_*8EG?R2^7L&S +MMUL1VWX,S]Y_&9[]3^-K^#<;1*`12WI=U8G5.I!L6U!KO6B8X_0RCE0F&>(< +MI61<;64YFRBT(,9S*]JX-ZG,RS4=+M3VIAQ5N%<)W[PG7G,)*OUBI\&/Z]4= +M_K""ZZ$IM8GM+=GMQOG+J.U6#26[6IISZ7,B%RO,A^C@1;%I\NE +M"A[HE'#0;YRFK`A.PSU=&TLY$ICV-?$YEWRK""0`JKW;TSX)T\$8U\89N6Q] +M(G99'''$R]@:&^_;K_!+G;Y0HR70K56=F`(TC5)&*M+DT9C^EK!1C:$E)ZYQ]*K`;J5T>O).'_.,$OKN6DO'O9'8]]*UQ +M5:<(T62W=*>OSC$:*;30#Q0S$[\5_?'PQ`C.K[N3>VECLK4].1_C>,7Y&?GX +M,AB;\\"M`3=W,NZ?TM$S0],$O6BP'W4E>%_O8=R5;FVXKL'$D]`VFA1<$>9` +M`OIJ*(,EIAX'WO]EB&<7.?`\,9X6:#3B][XI;Q$6^O\(,LGHT,2Z^.-S61>]^ +M?\G[57\6:DKLDLU +M,R$4L76[W.=:?B<@#NZY%I4E6R+<4?>!@(+)Q)UK.@=W1NDQ%E[J"@6X//*$G'R8V( +M3JE1T"D1VP_UG>V#8(E%[^.1/%'$)K>#=B#J'-7M2J((>TDL/;>'H/ +M9=>'`YQ=W;H=^3V8\;>VMGD$"C'U.'H/;:7L4\+K>'R:&R;3-%OO:4/Y9+R$ +MK8(T7O3=UCC+U^D]H/!@/U40]LZ-?J3TIQMYQ%L?XZ`ID^XPS]NMK8U'0$K4 +M2D=`2F2D;B@;=2P>^\UP8N25'KZVBG!(OSL;^UIHD(&GA)F"'$ENPE,#PP(]G)P?5V76M%^K&#Z\MSQT/OGC:(LJ=>^G@]RKX?K]?EGJM/S#5RTV#D +M8[&U(G;\8Q%"75\!+SP;OD%V6A1*72"UMM`@@TR6Z)99PE65Q\@Q8XH8+%Y6 +M3[<4"3.7IH0PI+,X:RO5TEQ+%:9(A=66JJ;:AMKU*Z@6'[@[5C`RU6)>&JC% +M79K6%I.CM:F\);>**<@"'RG(D$A+CI#K["9VHV%^5G/0BOJ+.9N7-=^XN:-Y +MS^:1V.,*SO!R36MHNCRV)CBV3F@P$()CWYK4366`KZ"!(NS1)N0*E"EPS8+3 +M)N@;KEO@6@6N4^!ZQ;W&(Z%/EWY6S90="9:VE"FK.;JF4C:(LSG(&C;)%L`] +M+5PSQ+,$&G/9Y)'8YZ/RG5$S17?>2=N!^FM)9EFPWTZH72L!B2>CH8_W$;$@4#(\G/I +M7.!^2Y?$R+@SC)+`T^>YT6(IQ]0#\^L5(S\4#+:07X>ZI][I$',JI!J$,M18 +M.*FAI:/Z^IQ3+<>,V<7/U'[3_O.*=BD(8\C,V6_JUAIZ>T(UK+$,\<8+:ID" +MG60Q'@D$`[B.1X>#]&CLAZ-M?'!'4$-.W!HANY&FW"[<7@6U?/4Y,<5H-'/L +M2.R*T7,B6BFQ&\^YSHD""56@78USKHV"3FQKV:5E0-YH6$K,:=?.7R'R&ZO8 +MTM="7#XU_[5@6^A!\HC"O;$^JC@;Y+>VH*&0DHBY+1@,X5P=)/8LJ&#9;CZ7.`[2VF@ +M2V]PI5X-C-+Z840\9J03X&?`OWHX$%KJA!$27E)I92 +M"G4;=;E^Z$=^[S6"G@-9JZ[\LIAU)+@*U]JH&;ANC*LV"Y15FV!NJ"ZS;E;C +M&*YYPJ(-V0DU.*U$T-ESPR4P0[9JJ1-'M.-[[=H4!4,>4=SS!;L.ON2FI^GD +ML;`KE;"0FYI&=D^'MR>!W)?.IB$^ZAR<&3'>']:_J$GOU378R;AD;$3GI,+( +M?\5C3P]2T[*Y4OOJ)$X[/BL/OZ@M[1VOR(#3PJD\[MF8);.,ZY`XWG%$(@%KDL0[F.%BSTGX,F>[2!?;V\( +M&A,G?)!*3QC&V8UK3)7CL3N'7H0Y_4\P1_P)1IE=B57C[@1ST"K.O4Z'U^WT-OJ<;ZW"%SB?Q;6WTUD^`ZI>Q?P"J_^M!LN?W/&6'>E'W +MB+_CR]T4*WAZ-%QO7[,**"UCZO.E:'K$"D^6H]S]EO!698JX/03CP[]RA9ZAD9*:7FETC#[YEKZ*A)>M>(EW@XS&3V=6*K?^T4EX58& +M$$)WP(B6#*S+^EJ`*M1*OVG4[>C9;L]- +M8*!_:PC75:U#LC*_XOQ2.!1I(MR!)@KRAW7S(X&UZ5IHC;ZW38.[7;LR5SGV +M5+[G2M#0$,A7H0$B_UA^J/)&C\ZQTJW@O88/P(Q/23\#"3H>LPS=A_G5-"J] +MZVC##F>V:'#KV&[H)6U.K&6Y!;D*OD'RA"K4QR--=^-,K[H16ZM@"%<-@7=1>AF& +M<$-9,@6E*O5C;30H*PA:&G!XB +MNX'[&QP;R:E^P1^=RFIGV%/H',>T5N!:<>+]`H!:PMI[F?8K=G+]%IB[1F"F6+3&";';WR)C% +M'IKK]$5%=ZC4:#<:K1;@1/\B2:I,Q(E0E0Y;*5&'8X4R#AV<#I!"H]0#/7"")`9.5"72RX8>,GW@ +M=XKE(%WN@0K=24]%N1'[;.4`'=T_\!-OFOQCKU[N.8^.+.2$*NB3=/0A>$9V +MT]'E_6,]Z[^64N92$?FP>XW_Y22F5M\R[Y%FW*\YXN,"1[3,"0)U0P;(U!0Y +MCCO1X!OHIT%ZH:-?]U-3.3^EG1"F9HX+EXH_$UYK3O%OAQ8_XCO2_!Q_#:LS +MDCL1JU$%,M>'@S;QJ$\K'Q"PUQ\%N2/47`8ACU;7S+7Y]_!T0;IDM8Y9"3$H +M/$HZ;_08Z]`C@:>@`YE&MZB_V[>(KMM-&% +M:NGM0!SDO1W`^S+1V9+6\@29E',*>`+.&@RT5>C#!I`H<:4)ZUVVHXT;E\AWC,1&^KD="?K;TK_O#HBIG+P9.R56 +M*Z2!;"L'5E61::XY2$U18B/A65ZT0U+>@E+*(J`>1)N0LV4_@ICJCY75&CJ\KM'`G8G@BH\J/`WY4N;]")ZVA7AH;T33&T&I +MRR!=C:<`FPG,?BB7O1U!FU?V.`-<5MH@XA3/CQ/NUY'2PPN<)'^"GS*ESBP^ +M1B=/91(R2Z//R+XBUSQMUA2RRV^M/&',EW?YB^'*P7467%FX7@57(UROA.MX +MN$Z'JP&NA7!-@ZL)KL!]0-]@3`SXIX*?R(R)%*DEW"E1H4V4:`3RDY!R2@\; +MJW`VPSV"!@65/3+:X"QV'DN<:Y:2='(,Y<K8*Z=3EM.+X=C#<8L_S?*Q +MM-$;B6",#Y48??#^W?$_1:CH]OBI",QI\7I-T(A]+LFM$S5J3*QE72.N6VJ\M5:SSK!=TM6N% +MHZU4]*^C6-OV>2\VXQ.\O'V'8X=BK"B[\DA$: +MRG=M/!'OT_"8G9UR?I%@+V58JZVF1,W:YY".>.R_@:N_*EY6C7F_0JF=<+,%JIT3]&X[S>X=BY4:ROG!%+RRK+!S!S[1V-Q[:-1%UCY<^0 +MHC!+I0!_IY%F"G9EWP5K_)M18OK"]89"H8!S.[_R0YV,QZ8-1T5B^47X*<[2 +M=/[M\!0^:"(BY24FM$/YA4C,DW@2_7)X?R1Z:!R?7F6U.IHS!6JZ_>KY960& +MW3PO3`KGA#7\&WY29`L7;J#F%ZXAA98/6)D0'/](+U"')G03F9$">=*&C]Z15AW,04M%Z6&*^R#2&4BIMA/KJM_? +M04VGKOFEO=1.0;AT/KV3[Q/N[0C2)A'S='@:_T8#VHFDZ'P^14^+N`(]R6BN +M.D4^KYVKR7#,8U73MFCFN5;G/.Z_R7\M?;7CS_YKF:L=5P:NU5SMV.Q:WJ(N +MG"`]%E@5F$D7.CX(S&0*'9.;9VH*'3[W8\VKFI70YDDM&(ZG7UYP![64(]5) +MN+S:<2M0]VGP>-86G;YFBRYMYQ9=1GA+?W)/>6RM!^OW12W:MD5[)-B'=,,, +MJ^'5WD5>`[1^;`3[YNB0-_D>ML%7AUN[Z+U<7@=I-_8Y>\C]QD/WRE5&LYL1 +M,G(I0F01-JBMHK!"=KC;1Z>X60^ZQ%;T' +MR5[C,?):9?30,:.J_?6E-QJ/5.*:D&OVC:TW^,?[9](;[$OL)KU``JOR-1^F +M+UB=KD^A"QQN.Q-*R9H_I)^Y^H-]C=7KC"J[L/4*K,T4<.X7=;D3Y)(6NM-\EN&S.]NOMI]23 +M,B9IC`Y5WFJ-T:4+,1JB)W1^!N/@0VK-3#WX-$4.SK'2%;KHV=%+G[EU[93R +M+"5#Y\C2I.CAKSY%@U;<$FBU=4M:R5/^.G^*\;N5/62M=[^WQ[C]WL2*SO9M +MV1+NL%!3"]FM%02D>`.K;Z"*]74W.%7%#[.S:[.@I]I63%6L02?*L<3I/90H +MRY(J+(U3,,RY4!Y6LY5\5J,+KMHXF"=HN%1X;F*]X/_. +M$'(8K-!-%AFG<\&;[-I9O;EH>\Y:?@,B_ZIM_`WS&@I8,XMOKQP:!V]C&(;X +M(63I4.92`E*WW\MP+WI%DNJT`[]B+0X:!]GG[UU^TW(2-)K9>.RN41/K]\=C +MZY*\PM@XQOU?G2HAOT4/I[$I_GK_W5TI=(\QE$V:G0ZTM-.Z[X^XN\DQ.H_N._*5& +M\XV-W!TV=GL#'3:_%MV!U[<C]Y)M?K]*_R +M;O=[%NWUFMD-B^(Q=QS?_G&4KCI[I@WHN>!7Z/F@6=5.V6-J(#LU/+V+ZM#MTSC5E5U6$BWO?ZKN;)VFJ^M50IZ$ +M]!'_O.HZ0JX/-&U:>RNWPG/K6A^W0O2M=:\A4<2ISV=<:G:#J\C-<0?<%J.# +MW>"FS%?0C-<`/44E(P6RZU(R?J,=Z,WQ4K.IXA2 +MO"=<4"_NJ*8[8T#3DR'7]=7O=ZM,IOK3[GI7GE!?[U[[1/V3:^O7Y:VE3$^L +M.[.NU9YWBVE-_2V3!9R3WNC'4?I\_R3!S)I#+EI.S@I"%R_D5GT$9H^#(E8C#7NYB\`0$M([++;OP +M[5OZ4X54I\F5):+,^+;GM^Z'W,82S1NT/-[UI/M#MSJ)C`[\7S]BL"/6^3:H +MLY!2;S@/0]T]CBE5]*OVM&L/BJK>8G:[(UVB9)M='SXH,GM)?I9+M:='NZ#W +MH/B\XZ"K5-;FDZOFA%DA362%?>M^?,LT5K4G.-?F8O:>ON7LN@(/[BV8;BGP +M"!O=RM\T^+OD%EHNMQ;JGS+MJT_D,+*&BI+^%E8%M;0$ +M>E;%$-96P8!7Q#I!&\L<.Q#!-M^'-J*@/D8/:]DTH!MH&_),_*#V)9'N-=E? +M@OR9'"^Y%GA(T9IPBP=DC1G%TE0V.&>&^(CVB8UT[P['="A=JCT_?&9CCJM` +M[-&J>E\2G]BX!]Z:[VYV[U]W!5M['E'^%W&7@AZ?R-7U0T3^:`W'W@9/?CY` +M++="2^;U-\@DNC]^BTP_--]-/5A523IR1#*-3*5L.1#O!W',X:[X@(AG18EI +MP$4_&O!0'2^)9&^6@W20(D1>W:?1M5O61OAT,CT3+$L-.X +M8RFOD[4F\T928)'('LRW>]'%^39MW%=!2\1$=^AD^I$G8/:C.^HW5MYBVEB_ +M,>>6@*=I$546I,JKC@$3O*7.3 +MZ((XR6>77B$7RM[;YFS$TEN5TI\8)/+?UF!I9L3+H'[*H'33XFB/;.;`+);, +MBDCX;#(^*\-GQG@JGR80,45$ZJ57]`Z)M#9"N-%7`\K9CKK(`*0SX/IN)-&F +MV+[GP"'-"AZ.Q\Z.Q&-/C9!HZA")9H'[Y2")3H#KI*$@T+O4)28QM$'80$4] +M_?AE>=0D4F9]_?9Z]?GV^^,H)Y*HNM_PZH?)<=0/_09C]XRZJEU5-K$8RG[O +MHBS72^M)06.83/NO^H&&!0VKG:LK7ZG(#]_5T$[6U2UHN*NAI*YVY2L5F=*" +MAF]7U];81-0I7+!AG\,&?>B!"I64);:3&U<6P#&JY12NZ5[ +MY,65)+^=U-8(PH(-J>(3CE370F$*BY2$"J-O-CM7,S?#L01\-V7)D_13P$?# +MO6ZV_B*?8;8*?-!W:XVSQ[EFB(]75$@3V6S16KF+[%UYE5#H2H&ZI(>Q,7Y4GPQ7AU.4<$HBT>^/]K^*[8'M/9RDY?U3$GT`V_]O +M&*:T%\Y76(;H2(&S$"EK699K'UH^*#"MUX2I@K(P73`OO+_>7%\BDX+BL'L] +MGK95F:Q`"6?(YOJ^ALE+=Y#!E:ASNZPAK6Y%G;O.7#=%'J[)KUM3-['2O.%* +M<;XCUU4L3J@DA;14XLIQ90^,I$)I;)?T;FJJA;U0+BS3WY+EN[AL73@73F5$+-7=(R;(;X[4Y]GG +MSA!2E'X%=-%MD,T-^RO2PWT-9];OJ4B1=)7M9%6-3M`!'XX]C9J*_7O=B(7M +M.M^W\7O#R3$T>E@00A4-$N'XI=1._%+-R"(8,7J1WD4*J3#]S(-N,I4[8G+- +M%SN`>MCAVR:774AWW2";//LJH(U,.KG.XW2;/'6>++?90Q_L@'NZPR1R!:J3 +M7)G)!660ITVN^SW<08U3!_>Y\]UXIG(?4)&<$3*3#B-UV*_TP*R1?1[JZ8Z* +M:1*^3YV\$D^$E9FA+V6+[4;,@^YX>^[;$W=E+C-.=K8;(!3D#+U("E/"9K=> +M7.ZI +M,F^O3SM/#WX_S(GQV,C(E@B)'AUNBHR^BCS+(>!=7D3^"-PKDQ/ME)AS$SWO +MY\,F2-,2WN\AA5.E"[G/3N8^RYE]2?XS+LF_[N_RK[HH]W +MG._O#.\#.CLQ;/:0O/T5C*2'$9LII;K29;=G6;)=]WDPE)','FS=_9XLUQ-N +M/#6.N:+QK(V+5VR@(-_@/?S&;6HEY<+A@[<1&'6D"#@!IPE*;Y/(M)^N*]AX +M$'K.-+=&-KD]&PLW+KNE8&/#QJQ;W!ZJS.TN6*^%EMEF7K;,<+Y$ZF'4(TX; +M51`YHG<,0_^)#@V)RJQK@7DG'ML=)_+GRKSS5Z#]?QGR*GP,EO/B_-W+7>I_ +MZ#+_HY?YGP2_X1!3F'%8K6L\J?AZ6'K$Q5:Z<(])='SOY",DSZ&N,I!)5VB3C?:1^&5=)V58Z@L9Y!5^?LBJR]40N1\AQZEQS.=Z%DAN5IRMF +MTSXTWDU6+&/9\964M=ZQVCC/\K=3"2DX0TAW\F*:J"O>2GY,'KZQ=R6UX+F< +MWIJY9E*4YE*]1Y7R+KT+N&FXDEZG2R1VG8*`1)Z%,O?E_''=[](IQ_9V:=+9-V9G%^[/T(;.,_/IA*WH2^JSV-">DGS&;.SJH[BVTX>ZPW):S0PY[E*?OL?5U?>+ +M[@?[IJ[IZE/N70_V:58LD*>MF2-KO-^7*:]63L2?_N_C!T,R%=0EXUO^??R= +M[3*U,T5^I;L&XA?\^_B=VV6J4R^_H*1?^._C=^V0:7!45RK4:?9IAMBSM63Y +MF5?C\9>[O&_TO1!\H^_0SC?Z?M'Y1M^+76_T16].V-5$F323S/QXS*;5;]%V +M%??@60+O:@C18QVBK2I"EO8QV1#XHKB+Y_>5G5)@?^ZOG2'0CY/75_KP)]AZ.P[#N.2AN\RAIEGL3^KH#\?2X9AW.,UG6?4 +MROW,CREKYQDC7!.WLEYLM`R=EDV9E4B/.*X=(Z>,5Z:1T\:?U_7@?2OZD# +MN^%"'=BM_[X.0E!N(_2YL7K8!OZQ?H!VT9"/.C`YP0M@_10EZY@BP=/XOM%V +M>?^\4%_PS=PT>$XIW]IZ]F]C]<+M/%^?4<@CEEUT7U370<#TCS[QDG*$YSL[S;9D8'T'H[RLA+%/N[!N'8^$)X^*+ +MQYD>WEEPV?/D6,KEDVD;H0RL\L[6LQ8E?XDR,O)C'R*]F+"0D(_!8=T]>1%O +MA?S-LTD>:T62'\9X&%^I8_R6-;/O6J5/J8#FM_91:$./O*[0>WQN@&^KN-?. +M\%#7V.[$VG9V-EP9N!*XZN":!LX`;CPX(S@6'`C0XHHO_>>3JE] +MY67W7>IO?>!2_S-;+_6GMUWJ?_.12_V;OW^I_R<[+O4WWG.I_V=[+_7_];+O +M'6R]U'_C9?'OOLQ>=,=E\2,_N-2_]N%+_3^\[/F1R[Y?=IG_J5V7^CV7??]@ +MQZ7^7U[VO>=W7NKON?^R^KVL/C.#E_KCEY5?"_&Q74M^%/^/O=S__/[S^\_O +M/[___/[S^\_O/[___/[S^\_O_Y4_U%._54$)(QS:%OI^%YX_8=BXB3)WV"A. +MM9/J4.^B=U'39K-ESOG[%O#D(3I:VX^Q\EC*K-X5GQTWJ2!>AZUCMLI,'BSA +MZ3P\LU*RK]BYTTI'%_67["OEZ:BS?RX_;Q\'(=?UE_!E^^QP9^^GHL9A*BH, +M3^/O+?U:5$3/NBAH^/[Z6@N.*[?)+2W +M"X2RZ>S]]>@GT>G#8YC;69#2:(2029,)6>'G-B5.T1#RD)K0=\XAI.J66\\' +MPO.F3>Y-FYNX=1O[`U2$RMK;A7 +M\-57A.0*3C&;HKWX-UM?X>5%RHJ[)]%#I-`LC5^ROWE[!7DWBYW:3)E1BX*8 +M#57'B*%Z>8Y`EJ^*A8[E'#/2WGQ\BCJ3YF-D>3IR4113Y +M@0B>$\5SMF-V1F@A2/0KJ6)]C7]7GM1ZYIGE]` +MRU"SMU;$CL?SSK@X-BARGFX(ZT3$W,*TDU,]SX'OC&NJYR]P?4I,1UOPUIT5 +M7QX_BN?IXXFSIE^94M0A48VHPIX@Q(N?OPN).B6]D(BG=A&C6OZ80]:Q0@I.-L7_`G<;4RA7,PT9S,=CG)7N9@% +M?[V+AW,)3:4I>M)T!7_$0Z'B`:[8E"0E$'(G2H#V*<-N,^H11+>,D&AXA(K^ +M:#0>ZTNB@^=4K@ZLUJS.H&<8I%1VHL#9R(SQ$BE,D<8[F3Q#,;&$_(RTVQ'R +M$L[@\RXVPEU-,[$,2)3BI\T8@Y90']F[V.!(X`78$9J(4NQ*,JAKAOT[-(X0 +M/->-_>H<_[%@/:1SG7-^(AA):ZW/$(><0HY"BHZ<&OCI_B/Q"8X"F>"1HX'5S?%VA7COD]?A>U +MW:AS&>#^&-4.=[AG9SA$3+T\]O-6[Q%OBCE;U19,SSM%OQX\ZJ1;#?D+6]7F +M8W1;Z^NM1YQTV\(VVERQE3'36U/-;6U'G:^UM6XU*"=&WZIF6,:,V+M4U#0Z +MW>]7-*"CIZIE6?%=82&2:JK*1)NIO+:K#O&T +M1*:]U7B%?(M_VU64]'ICEOP3_PZX>ZTQ38[X'X:[(XU:>4O.H45O-LZ],SC] +M&LJKZ"HC1Z!T/;WT/0E+!Y_.F0VKH8\#7Y-7(TQ4? +M?15:J[_=>\LB3+759Y#W^7<44%*;+U5V^[?!W5:?1C;YV]`"M*G51^2[?8W^ +M^_DCW@1U2)P\M1XB>:G>2N\.[SM>AY_D$S.9D?N!*N<1_TV:6S/HF;24ZJ6* +MTV4&[BKA3B>GPMT.N%/)5\RDI'?@SN&G2IZH^/!]ZRL&%FMTW7D,`C)58UYH +M]`DPXV=1QPCW1>3;/!%?"Q44HN^3 +MB!GB=&NI$X3[,)+/Y1?F?$#EF6K17A6E6,WW+(K''HNC_LZ)B,DH^/$<`>%^ +M']$9:>MD1UO%N?=5,QGXXIL1FE,[^B,BQ%?'T6K'MT:JEJC13@?<7SU26:4Q +M%[`9-CRI.F6D@+V.'V_CS%PI%9TX0G.G*G8P42.P.T2FW6?VT9.]^F +MZJ`L*1)JXABLJCU4-#(\IDO*<1:H'^$FM`%*.L878(W\"6K$4AM4:N3=2"J? +MGT^)/:'\@NL_*&-S;72'Y29BL84IBR!9(*R=;AWB8:UL"9H&8-58U;C&>MAK"NL*>?PVU4FMB%`[\:Q +MZQA^9REJ/)>8=#>0/:;@`2^SF^13J/5B(I!6_7`W]"S&K9.IZ-KA7PMC-E2@ +MO8<7-*JY?J4GE`[CZ?#KAIG=:%\"M:JP5><,T[(=KLN&*6YRY(5*F`E-;42A +M6C6#QX%JCMDK]:-=TC8_VBNES+LT'>YR/_$3>HR^MFJ#E*NNA'"^,2M/"VL>,SWH7UA*8]:EBQ$'_ +M^O@JK_65G2SBXSRPQ`Z]E$Q;Y]683:S>MBZX@Z>B+PW%H7^Z&CL;Y4;.Y_+A +M,X/M'GCR[%!+U;0M#0$3V\;GVKC2NBU4=/^0&*!RP'E\I>"OT$C.HU7Y]%9=4F, +M8PU0'LI*FVYV4MZL=H@'?Y%G83CO8I7RC(*_=N-WA9YVRJOB$$&'<-9#-94Z +M[ZH`*=2=7+;$;,R^,]U(69^&D+:*V+LK`[QW9<#Z"FWU+A:$*KZ]N<9IMK83 +M*H@6>NDP]B8J:!=2FJD"*J22S(H?9[K$=8%@YU-"G!7OO8>OK@IR%I@;1:\8 +M1(J@MY5!;4T8PGN#;1[<9T*=6AK%Q@.-YQHM/M&'UL&POHK8_)+$J?-\XZQJ +MU#(8;XW'IH#/>Q>-=GC@V7W@PVM+G#->*=@G80U[DYIBQDJ2/TG,-YT*$7/^ +MC$<7Y9VDICMJ53-2P]H9$R2'\2:_9B9U_'-M2N\8_7085_OG.Q#%(T7^$4OG +MY3H\P`.J9$<2V^/>Z_[TKJHP%T;<1S#^#R3UK'3)\8OC&'E`G-O3)B7T,YN3 +M>!-H,T)EMK+?`#?RP\%O>*WK2_;S*8?5TXR/K[I/O_DQG$W5?DI:R+\J_=5)8G6>HSZ>M[7^CY6/^%^O_R.OSU.YQN7N,1%>=J!VVT534R;F))Q +MD5]SL3\H:N%-:>!)X:C'`NF4GM=ZZ%2LHB$M(MR/A'CLUW%&)F:M"2U;O137 +MP5N_&,!GN^'9\XK_IP,/7X)E%8\]I83O'^BX",LJ'MNKA/XPJ3&*WT+_`P-7 +MFMJ9Q'OM2HQ[!F:;4I(A027D3N6+WX,O^A7_9L5_!_B]BO]6Q1\`OZCXURK^ +M+>!W*?Z;!C;QFP2@=F:8V2#5&Y30Y4JLC1"K2IFAG0,X5NZ,CVFTJMGEO+YT +M3(.1/HF4TC5`P:C(F*DZ.38JKE\B>Z:GE3IDM^QQI^F4JZ!+7-%.I^Q>":.8 +M'9`]=L6W!E*9,!"//3>*EH*IZ"WX1&%5E[P:E"O,XM/F:J)UUGJ4 +M3V+]>-;.%A)@4=RBB.PSSR<`"@7>'W-_BT<8B94:= +M]+;&UYI>\U7X:FS;O0EJWP\QK0/0?B`SO](_<0EMFK]@7Q,Q]35QFRB]>Q.5 +MMF_3#(%DR)LX5F.>;\L`CNIH_W3>4$W\S-QY5U)3$:>`"R$WZP^:D?[W<[S: +MZP]Q0;0LVCZ8R]=8U8UJTY'&>?)\DM##5NS!P_A_.*&KK1ZS30N\OKH[:0?O +M"PC3@L=,=&0,=TSUJ(:(\72B>G0<$:^;3/(G$WIY23X9C.>1]]4)'464@:/P +M[E&T1P'UTYZTF$!0"SWO&SZC.Z,[K?MK'NU:[=ER7 +MY-H.3%:S=8W0/_I1(K"P=0$J>D5_/&:+(V=8UD^9]WNA/?MM2>Z!1./QWPB8 +M2X.26X-R1;X!OYO3_UJD]'#W$FJJJ^2L8M=")75#B\1CXP?0[N8O>*OUNL8Q +M7>%#59@_+>1/!>E^&G^AFG`U+'=G$ENG+GX0WD',H[0PXBVD0$EIBT:2 +M`_L%NQ%U7;/"J?(3/-;*$Y?5"J/$S0"*".]RT48*:@?$N>A;4#82?2>IBP:] +M4PG]5;SC$IZL`ZZ=S3L%C9EO[`S<)]AM.J^FS`)OWA-O%S@SUAV)!N/[`BJ. +M+B!A!KZ`]`+3?BQNN0]M-Y"H&)<#)/IF_"X!L>@H"/E-_+6(X?`=?#Q6.]3B +MW,QWW.6R;@TT+SE3NZ>B-&POF!HVO&\M8,.:]PUH3;&@0*),K8TS9%O!A'!Q +M@5EBP)0G-DD'M`%J/A[SA9!7\-LAK^ILLP]S3J +M91W\U1-?`W&.!J=VX)ASI"%<9EQE5.NS$KN$J(6VU673"I1W:XT+24 +MKPCA3#&F,;1V)_CU?PVMR%IT=LAW-UE +MM#$=\X4%51I6SV84&[A,MF9.D=$ZCY^EVC5+F@]2D\Y:[FT.9)FN5R1X2BKW +M:N6$S125M-^O*R004B:DB.U^/!M>[M=!ZY1[@2;D$3-M[0F@-2V5@KT$[3=J +M%HR;NBVSTFA4QV@IQ=7.,=SZM,W:%VE/M`G=\,]S$S9K4!?\C/`A +M?Z0.N.WH&Z,$RN'Q$4NG1)L.>O\L4)R"00,]N2?POJ(5*!#[JE-"3PA19DAT +MMG)"WC5*FSYN(M':T0LVNNEGCD$IGA@]AA:-_'@&O=6?0.9K]3(%]#'4?+\U +MTAQ8IJ"433O)S\J7L!7H1"OD[77L]ZH*X5U-/;U +MR--+.`]7;_(<5&KRNE%7_=DZ$GUI!"WHR?4'>!+JK,=2V4<1)0HMP>2,4EQ- +M"7>>>L1CPP.[JZCI16Q-R?2F'P!EQ)2/CE@\EOH"#]9A[JA8_WD=F;HYB+Y) +MHQIV:A/6T>]'U"Q:M4Q8P,R6[N=;[T#K@W<++AN9E2*A_1RM](?&[NV),7S/ +M")$SO3CRGQ\90Q.*Q]R#_JH:X)T3);IW9$LU]LH#[!?0*SM&@'^>'(!:]XYL +M7$)Q)K;&%FI,E#@*Y?W=B%)>#M>SQM"`;N.W=JG]VLF8PSM'KF&YN61G%*G@ +M\0Q+VDFD73A?D^@M(P3ZX8;S]B*_*QS=]&TA@].MP;SR(]?SQ.2R'FE<+2Q; +M0G<(S34E!.@$O2<%:&A6N*OEVX)=TYVI\S+A>.SGPY3YA4:+'`TL3U)3LY0B +M!P-+%4KZQ7E*.E$BT1TCQ#).4LW$6D/:C!9!2^%;U!J+!J08,^8M1\G;E)&N +M"%+51'XS1ZX^3U=G\_.MU,[4F1.E"VGT!>;RE+<`)*!6+[U'")1[3?XC7@IF +M_'P;!:G]83@>^]5(M&6*P#O$^WU>I'[:$<@3%;RW2A-$%7Q@<8V'JC8DU#R8J]BB6\F +M"6LA'P3Z<3S6.8PE>'7X(V\UR!`H)UR^IGPB::<:Q[`]B6.':P>X1CB&6X=C +M'^D`CF_D!Y0S@$0^@U?$T<6K/;7S3%`;/*T\,VDYNT9W6.'H/93Y&(/KK=]V +M4J8L[PW"VY[4M%S'V^ZW/9-@+.*54:YM'AR;;>ZCGNUI.X&'/NIQIAG@.AK[ +MV^L24X3%^*VXV%6OR8+SSH[%?#?->"[Q#X;,49X%L` +MON?`5Z[XYH/OQ\-4?AX;-^<4$],\\/]H>&Y5W)Q5G,<2DX5=![W_!\/X/`V> +MW[9(7#0:NV^8/)/C1V1&L[&CL3GAN5*R94:92$3%8 +M2ET6X&Q:`_H"ZB3.3:V!*#36JM3"(T.CL4W#2<2)W(0< +MB#39`GS<&,[L%TG,@F"25J.MCH>3O&'L<%M7&GLES`181A)=UC]Y*5K([+2E +MLZBAM'4(==(*6"(;!1/+$G +M];S3G7GL\EJ,CSKF:@$MH7;:2+1W*#&O_FU_G![#4$.[S&BC.3^)MP+2_&*R +M6+?8L-BXF%ML66Q=7+H8=1E49/F9[83L574;3N-97LHJ?4B3VC-I7)M,=4L/ +M4=;N#R&LA,&SL-W=Z"]16;-.-^!98&[YZ19"YJNZ;1&:7*^MF!K'V,-?C@0CQ=2AM;3&PGYI*CTHN>E%Y[3\/P6?+[@HN3VS6'XB,ZCD?TS7!*]0 +MMY\V4^13MOOQLYG=]T*3LF?2Y0>R,^5."L]F4MT/G,8KB3K[A3/Q.+Z'>@9> +M>`?/NE/).D*:\LEH7+DWH&X"U">((O.--<];C#6=EK$KA)N5^O]]5]_Y9^1Y +MWD@Z>0.D1_^A"]J@(Q_:(1_R1[5=A3HMTD+H%_G01_(IKAONN^&^&Y_W8:\E +M4=*/\NKS\3&>#VU1;.TBT:<'R4/4#W!V(_WTSFF\9Y%_(=ZCKC@!;@OO$ZYU +M$-?_\%X+Z7W9#ZF:M'6)D'+673?VE)@ZZ\;NY.0=5W\AG7_L+*R-'9LE=8V9=NZ.S3 +M6SO[M*3[C"LUG6:Y;6>-AFW*N7\#V79V'*0['JX0MR\CVMDW +MEF<5F?GQ#,@7Y@G/AK/6A\ZJK%7R>.ZALXCS3N0V646^VY<*8S;#^J!0]G5*>S +M%,NP=RVT*CV`9KLJ-!):<0=^JS^YZLG[%R(V78%BT^*7(X3[$N;2'[C(R&9P +MB7[[N'(N?J<)L9PKIJ07YC\Y[=A$=-8C9QB822J@):F/47D +M&4\AU?_N@$5!K+7XJ3DD^AW%UR]Q2ACGITI(M&J`4\(P]N(!Y"XISK@X<99@ +MKHH0X;8M[@V>-=Q2[UJ?>Y-GXVU$@;G7+?1L\:Q9RU4$N%5K?4#TEFY9ZUNW +M8>/M^-X-MZTY[Q%N6^MWUV_BEJ]MVKQA$PQ.CE_K]G*WKKUUHR_`U6_T^39[ +M-ZU=`^^LOVWC[;=Q39Y;;G-ON-`O?P[UCSH=8VUP\1GNK*LQW@7_G&LN]4^^ +M]E)_#W^I_T;3I?ZIPJ7^C5,N]3]&7^I_Y[+WJYA+_8V7?>]7E\7?H[K4?W;> +MI7ZJYK+T+OO^K9>E]Y?+TGOFLOB>R_QO7N:_\S+_J9Q+_3^?>-GW+ZO?RKF7 +M^LN="&)_Y=D2N(Z%!1Z+TV/W$W]TZ9G\K_D+\6YZ//%,T;W8C?>)_A"`_H`T +M@QB"Y\=J7/F5U]VVT7>K>P.W::WO5L]M8YVUW.?9)-ZZ=I.GGEOKKU_KQ>#Y +M'!$V;%A["T3VW-:TR;>Y/AD9NBN\C5V2\ZVM7^O9LG:-,A+&8KO7K/&M;6H: +M.VRSXL*7('[CYK5-FS#X^DWN^O76Y;NR8Y*CC;/PXN!L*]V;>6V^+Q;=H, +M_G6WP1<@QVN(8\8,;H.GSN>&L7:^]/_R_-":)Q5]".3?2& +M6#>O2<9G5(1Y>6Z:\89J_E^F2U'4!<]@PA6F%*9<2>)H4S;Y^W>I)%H:4[), +M'$_F@;L.W`IP=>`:P07!W0_N,7#/@'L9W%%P_PUN$/WG-IZ/B_??@]\_SM+("*UCOOZH.F+Z] +M\-C`66W%]O*:9_L7BS_\UO+-["?_/[MV7X-[_Q4",[\;26AB): +M\+=MV_$P`Y)K-W$1*]5/>LD[<-U--I/U$`;<-[@\<-G@HO!3]M23#O?4GWIK +M6_^>S^_[)CW^ZA^?_].*CAJ7BC[X^SN_G1.I._Q1U=[/KGO@L2OM[=\?G/#7 +M3U_HN3]UZ+/R6WX^I/WQ52L;<_$X]_,BG[1Y,WK9Q5,G/N"^]_?FAH]3=/5FUQ__+W=[8LO^:#QN_^<-S7 +M/Q9?(J3HB,M^Y9FC@;_\XK].++KOY"V5OC\]=&+WN2[GW>M_5?CFV:57_.7- +M>_Y[[PWK'LKZPW;#QQJF=33:N=#_\M0SE5_M'[VI.[A=_=RUKYAX+_/%G^N/ +MW+[Y9_455B[W;,;(K;]>TCK>.&?:5:_W_=?^.;\-EM.4\:=VZ=,V\!^^>-/CM[WZ5\>/WSA0]J1MWO$=7Q;W.G;<>-LOW[N7 +M6O/\L4=EX="[@\]JOYKZAY^]??_?/EYL-/1N#$4W.GVU^:5??./6>ZYH.'WW??DWYWYDZYXHXW&I_^[;L[U1HJELT^\=K-#0,_#7LZ)J[< +M,WW^2]-+3X[[].L&L"UR-\/_ZTOZ;YJ0=4_3<& +M4R;FOK?6]M]O;7LQ_'I;5\'MJ[*FO-,R?."/M\XO^O^V/_[_XK?.X[OU=K=O +M[57N3;>NW9#X>[-[T[RY]7.L)>Z;B\OFE,Z\W>N>5>?YU_/`O_I9X3?7:L6K +M;=Z<2ZYP9YLS;YZ5V."F9*YM;DG)'&(MMLVSS2&<]7^QG/_TM[EID]O'<41< +MZZM;Z]OT3^/=XEOKWB2Z_VDM6!._\]?_E_PV??'XV7_EQO2T928A>[5F@9QC +M:%7X*3OXT^"*NK#1R:UG6+BG(,P*5QWJQ1)%)CKOHLDT&'B&[Q%X3P.WL)UG#G&/GQW3DZ<-K;(*Y##&4'Z:"D.ZG0F9\2&(<^R? +MQ!DK@X@ZO8:M9UU)G6*4$T2XQ_"57$*?&/6K:1*45V(<14^\]:Q=>=:FR&#` +MV'R"ZPE0=9\`:_$)KD]>-YY\0DJRGZ:Z*TY3I*8O@Q"]EW2=4Y,5?8/QN)XBX\^DVK<9*#+A +M3&K-W08:KBEP5=6\>89Q??LTXWTHG_'>G3\4CV__',J@(LO[^O-)*LKA5O+" +M.7P_#=ZGX9H"5Y7]C3-,S0WPWK;\87CG2WAGPQY"'DVZ5_;@67(F^LO_X5GR +M8B)6@?^^5GR! +M6,"7[[/#77!`%_TFGA+-ZZ_@O]9>?I)<%STRJ(M>$]=%GQV9=LE)A^D=,?@I2?'#4YQ_@4L +MY/Q+L)!3A`UE8VC()/KS\VLJUYHN/6O^Z$W0,[_UK\^:O_+=Q//_R5ESBXIP +M*UM=65U^$I*L3L4SM)P3(1\N>H@1RW.I:YDF=[ +M[45Y*QU!'16F2DK1%/'`.B-WK;;QRPEE+A4C[57QW`ZYUO!>?Q:NGDAQ<@YZIC5M( +M^%Q](9_PXYJT63CJGLZ_T4HXB^M/_S^#CN7%T:9ZG7 +M00Q=]-?#VNCQ42NKCGZ37%O)X8D_1]"YL8P3>7689NT>1*FO@9!R#^[!E2=. +M?VL-@@[WWBPU'EH**<\3L=Z`.GMVI6*_OF;338GZ@'O[@K6$.,%M6`5C.!%> +MTW*>WN'4&MJM<88LP&AS&(^]I8K]@NNL/E:DVO +MEM-&MXT0+M$CCJB97AV$M(Q0W->1(/A2P+<)?)]':.ZS"%I44_DI:RJ>JY\_ +M(.&)"`V;SN8*DY9.XLM<09'D=U;DG-28K6R9R$0?'R86O50J'@D=K$!DB<2* +M_IM!M)1=*E(E.FNI*YT/BIT59]]-Y5M%RM;J:A6U!:J3&J',I3.UNA(IX1FV +M4A'?^R#R6RBW$6A;"92[__"\I?.JRD*$0_N^[42LF5--<25BMY9S!3G.YYXT +MGM-%OQTO#5K8N'5\2;EU6T6)BQR?Z\CQ7%=B)]=0\.YQ.CEV +M,P6=2*/-L%/ISO'6<6Q\=OGLW14ZR*,>1@`+;[G1Z#D7<_6X=6IKXX_+M*,C5';.L*-:LLS$ER'O5[ +M>^BWE6]6'S.N\(_S]X3RZ3S'0_Y\)L]QPI^OR7-TCN+V1?;RI8>)2)F"(4&[T/@8'PS@SI>9(S=U:^;VJN3$ +MG>T$7H/:F;WY'%=++`50N_G6Z_SPC?!V00@CO:0]5I$K='!-]?Y1A$>MB91SWT#F6`5J2:!.\_]TH +M#>/P!Z-?1WS.Z*'QHMFT/Y2J)=PQX[+:'BUU`O5JSH3R3?DS!D[>4*N9^O#P30NO@.RH^>?=,9)DQ+9#!;O>_XU?;[ETT:IK*IMM7 +M"ZKIX\MZ0K]6O>3`\OR54-<^4*%^;XM_2\XWQ'C-_174^P3J^R^D:M+G$[=D +M;L[YBV&F9F;&ND6;;Q*T0N;O[)4":ZL.-"HG%)X_N5`@TPVV![P?(A)[H4JZ +MUT]/7^"XU_L9T*5[_]V +M96JE0N>NAN5:U8GM?EU>KF.[=[L?=V.W>]=%T#8T\6_M"EIH20]U2P_E5IT+ +ML$O8$LIBD%S-:)4#UM]$5X.D52*4__&B%D&]`N'-.N&X'O`OI^ +MX&:%QB-$DMT(CTJ!KK>M3-#W,_!L`\0[%U!;)!BW$<&*^@H[Z0XF^M!V(,'1?*C5K9%2"F)`;#N]80I4+;E'@*G1TANX'O&6%D+GG6:_THI9S% +M8:+/01[N#K^AE*TU@F>B#8>[EY""5(E+CB.[L?7.U^[$,^AZ:SSVT3#BH9K$ +MMSC>-X:0>$3IS1,T +M$S3C#!,F&":D:=((GC.ZP9>8:W4L(AOW1^*Q[/C7\'?+""=>YXM".S]6O;7+ +M*A+3=(Y.A*=5`3 +ME@&D%;\Y3_\2N(ZCMGTMD+H#=]-(C4V&#=#-1" +M,X`[TV]Q[T?PY.;*N%6T-_\Q@C0!_0V*__>1M[C?1JB\1[2&0ZSG2<1=5^P5 +M&ETWNC@.YGDWQ7T3Z3]<)Z2S-7,.^&G+!HG*_Z[PK/>W#8AA?E-UR.'R)C"= +M:8FTJ*+]_3:1;V$LZ=+U_#/F[%JT83EF^U]W'G.]1CGMVR@MY8TF'!-$FF*J +M6CH_M"QWB3.%&2>FI/48LUSU_M4:5>]L\9&6GMPL5P(KHZ*2TAJ]^^^,YJ5D +MYMJS'.7.?9NST&ZL4A?SG9@?1"BB@#*5!6G.`+GK;B;1>:,V@:\O#5WE--1C +M2#RV9Q"OB+B%6/77#ZGD)V7LZ=5#TZMG+;6*1YK_J_EYF!\RV'S(K:(KE6>1 +ML:>4*@A_B-X\U6DGV:N^U4QQ"<1%LX+;W$2Z5W&5IT*KX9[(-\M!H]$YOC); +MG.2GYN\%[B77F2UN-=)RFG/Y^G%&8NZ$ECO^^-"5X%Y^I[82S?#^XA<$^"ZP2W^^8$'0C!6!]>E1CSCT(8X3Z# +M?'XF&%8)ZS^MM!M/AN8W4_D"$`@3JYPM,T4J>TB/T4?:5^&I,BHJ#,F\W;JP +MD3$=]&;+.)LL&[2)!,;9!X@SZ@V8!,T8KIW!=))719\;.LD?5[#54X%*!?O' +M3DS]OKI$06-6619(4I5%J?GW!RQ*S:LD&7P/#])*O>\:M(AO"Z\UAQ3D3`,+ +M%#ZLG'W#FC;_2D&M;%I_S/BK2FKJJ5!*\VIRW%C(4H@=8Y;(+Z"$[4;=JAPE +M_Q\/VN=N;F2X3F\ZY*:L?^RTU9U3B7DFU=%%[3JH"8G;4H>YGPJ,G5_?OAZU +M5VCV&5ZUBUI_P,ET+&LVL`>64KY1CBHHD)@]NYJ1R^ZH(,>SV!1-KG2HB`J; +MM$QOF3B?I>Q9KDGR&T4YTAZHG9YFM*A>BN%Y1H?!E2&/Q4F1+X2JSH?N%#IU +M.ICYU6%F#P\4T[!394DYB37RPP'D)XZ*64DJ<(_@TF9V-`MZUE6(87?&WAIOPD?M-3@H +M^6W1X'A-0YV@KAXXAF>0RP#&G`B<@(5]+8*H/**:[3U4I`F_ +M430A?*+(!!0[-C)%3M]+<^%&?\@M`.4NXX.EP`-F[HG'Q@VF<9IH,)XNQV,D +MKI>?+-*'#Q7IX&T*WJ8E?^@[E4;@H1^*+'52>08<26&2MUAXEV3LM1N7^07B +M<):O"H>J*E.,.<%#11]+'2'LJ3DA(M.RW6@,RI'%"00RH)!O0/XH*-.M$>RC +M\?YRGA++^;2.U(Z47.37[QI`7,ITDT"O=,!TR*3N(6FA8"%(P*J]XVT=%?1Q +MU5ZV4'WL=4Q'J1T^$H2X[![/]R0[LQ;:\$ +MO"3.1;29-<5CKI$+-5T0N5#'*D1'U?:(.L<1I9YCQ_!KEF062&#)`W92RFDAB#.-8WY`><$UVJO:\%F3T9>[$'+_.V^HBIT>M7 +M9_:F[Z7RCC>BGEFB[>8,>/R$$[2D5PR=$GA%,Y6(P9#="#[7*2'4?`KZ-\H= +M[3JK.MM;+C*V +M!GR]021Z_W=SA\'@]?@'XY5\XB2E;7-8DA=@"1DK?RY@D7RF[X:-?.'>U +M=U1HWF7+[")MCL<>&DY\^>:/TO>JN+`O6)0EI>Q^1L$0IRRI4A2X(!UP01DV +M_6Y5="-B6TI4WL\AK44?/EBP1S +MNHENI]TXS91:FR56-FD?I&;0Q[6/J&=0)TO9:1]E`%W$7-KET:3>]Z +M?ZIY-=0K8Q['ZF;?Z^PL5N]"O2U5^.T0.QNDOG=+V=2/M'OIPGI)LW5$7ES12?:8+PDW4\E;?UACH^>!,EN^&OCZRLW)5S +MC*3-/F:T$X.QF*6CI<-84Q?JB8Z^,'R]'(\0,]FEWK=.-.EA:.DU7C(I@*>117]*911]?XU\#TB;FT2_<4*%K<)TK]CM$B^ +MME*W5Y6_M[9^4;8FU[%&:W9M]5?X)]&YCM?]DYAYJI4K$)TM.--0G"I_C;;3=31$ +M]G*EK;F3^0RS761*X[%;AW"4$_-^5RD[]ZQ%/`(Q=,7MN4>"B=Y5RLXX.\EI +M/32.M<]^OR5=4!>EB(R4YNGUY!N?K4@]J2BU/"R*2DG:HWY=R+NLPYX)N3HJ+*O>X-:0^^G0@V;XD?, +MSM:*E%.L$HL.(V?U:82RME9\_9Z!_2AB.'QZB1MH`560>M+EY;Q]?J2O[\1E +M+P5S:H+7WN`[V^$ +MN50G(:JN.OP\Q*4E6PMB8>!?*DRF4O++SMX`GOVWK[]"-C6K0&8@!;]PZL-9 +MXB%G3_.NYHX*ZE@Z2^0)+->HEKE&C`O4IWGE>HN"R_WPR-.*)MW3`DIF9"83 +MUHF4V>#0P0RM$T?-!KO.A=(;):EFHD[W:.R:45J.-H_&YH,D[?+9M>4-Y"HZ +MW)-#R499;Z/,>RJ/J5:YJ+K]P+O0X1<"B-_S`^?6!GO#`_Q#2[H#0<*MM!M# +MN/(P.^6U_O.GZ+JYK5VJZ`C(4]NJ.;8$ZHB:3BR6<"=P2BG`H^WS66"4_&6T +MXKQ4(+18 +MJW!;\^.(6DV%,<3+$U-KF]=)M[4&QYNH(`V^FKFQ)OS>X?,:!;DF^AF1IZ,K +M1^G=K2B!@X30;V5]5 +MM'61XS!JFJD\:M:A13C??Z?Z%'DDQTXFK5K$OQWJ#O'55QJOK[3/7=V^MV+& +M27HO*;1(3NQ\'-=99CH-(-?AMZZ4 +M<`RH@6_)'U)QI(A(-)>W!+A6;QE+0>V]-M+-J:+64=K4UZ2*%EVD8T$]8X$: +M^07D$](`QX`^0CD&];HCD?6D,2W;S__;9_R[;?@VV_`V(SQ9+I: +MI+B#(;M69Z0"#/M[[5?"-YFHO=HH?>F4_*B/9?+K"E*DOSH[_,CG?MQ\W+^G +M@CHI^3_V?2HRT +MUEP#.[^5[#*6:J//#5-6H\WO'G`98:8G>ZE2OWO0A18I=+T'6LC>,C9H+&T] +MT/*V�>=9UK'A"O!NZV)FYQ%[3_86E9_=N*U!2/+8Z7L7S];_BC3O1W-"OC +MB\75.L-Y:>U-7(]=E8W]$*6>O/?(:Y4".69W?JG6X)& +M7?W30LIZE"?CHP=`WGR"_Q9+Q&+V2',GJXF^/H#ZB>M''UNZKZI4=,TI;WZR +MFA342>4M3RRE"TR2*="#$G@+';UAX'%EK6AB>!?*LB`_[W6B!-TY?X>1:AD, +M`%4+4R857-VCX)>YT#S9WST9($:4F<10^> +ME\*]27%W(E#;SW0HNZB:^W$\7J(Y1B%?@190. +MRAN/_65XO?`]!8$S0<,\SNO]9`;04-,RK\Y4[ON>B?)]$6$*V/!H[(^#I6)K +M,V5K]>&J`=9BX@LW);]0*_#^A'S/>Q&UDYCU\(57ADO%[SA;F[/OZ*C0'BMO +MUA4PD'JYKPU2?B."N65.C)6!4LJ`H_7,4)GX/4[G^WFD]+`F.C12K6@?::+] +M_8ZD]M&U?'<`>"I%^T@5_6U_0OL(A!A%^R@>*QU):!]IHNS`Q=I'7DCO^,C\ +M\_H_FNCO^XO.Z__`LWX+CQI`+%"XT?C;T\^"O4\RM3[1Z-'1I\F:\II=;_2NDADT=^*=24\?4_ +M%P[SAK*:TB-*RQ4,C^GH'5%T]+HNT='[Z7D=O>?.Z^CM'\36,@RACIXJFC9T +ML8[>DS!__&SP1TD=O8)_H*-W_WD=/N77/(1*K.7V:V.7A=?GXSS[3"/O?5\G&KY +M"(V8X?>,"O(1!3W\.Z,+Y6Z"=X6CU\I81W<-$E-@^OXO:"C#;X706AF&BNA'=^,HSWW[-,E/!-]Z`&$>Z`5_TV+PC!=FAK +M5X&(V.NC,=\@!7S;PT!]5=&J0:!?FC^?P'<6P]=>:BO;BFF7*VUTS:!J[RI3 +M%K12V>`=,(>/QM[IGUM5<[7'4YY;!!Q99S.N69];3^1S8B%;4WR]O[2:0._^ +M>8C(7X6>J7]N/=I[>H1\:KPQ=T\%.9G#+O<;'%E`F^0F%_!Q:BF]0'-2Q^I` +MH@@,)O%JH9::!OLCR*?=-X!\VI>1:0*MW^X^ZO8JME':M97UH7I=FDDP.-"& +M6O_A./>UE=+J/;MPEZ)T\%@ZY!'SQP70+LZ!!K36X6FP-!`SWJ'U'JR!CYY8)7UN=XG(F43O53H,?]U\Z_#L5[#A-J4UL +M;\EN-\Y?EJN1^QO*UANMQ:*Q;%=+>RYE7J[*2K\WF*3/5'O2T3\*4,,[D.".7K4_$GPCU +MX6HL@WF!]^U75C<[?:%&2Z!;JSJ1KZR*XTR&W,I([(?QG"5FL::%MI"P*6)0 +MYF]666$.WDM9*<;0DI*&N+6[D1O(@W?R4$*:P'?74O)X^#N974]6YXRK.D6( +M)KNE.WUUCM%(1=W#''`4&?BMZ.*1KS^ZL)ZT\L8$SXCS@DY%.&QG;'N4/>^& +M^6`KN"YP;:Z$O<6K1J8)>M%@/^I*[/E[#^,IB=:&ZQI,/`EMHPEJLH/\?NU( +M!DM,/0Z\+QOAV44.U!&AH[-'&HUXO6I$E^1X$^'3P?]-),O9T4"54GE;[7L< +M'77>Q59%TR@>^RJ>./NA=]IS]I%VX]%ZC1!JH!90YOUV@R-49U52PC)85E[8 +M"P/N=ND"926:AOD2UZ.G2IU^:AIM^;)**V5PZNBT$8NXR/=7H,2+O/A<+65" +MZ*21`I'F>)#O[=9%($%'V[KHW>\O +M>;_*KJDIL<\AEL;W/JB.-70U=&NUO?T@-74UH-6-KKIX[!?QK@:BN:JW5#,3 +M0H.FD*.K[ES+[P0UY.]*!L';0&A8K-*"8O'%O6_ZMS9\&+U*X)=ZYH+>%\8XB!S@>:(@(5F])-H%\CH!:>6@H%N#SRA)Q\F-R&UH +M%/U=1+A'ZR5G!N4`D;VR2DF#@:=$>:I5+$J=&$1$]A2)VL,G^325U*5P@%W> +M'T*^@AJA]T7-8L@-I^3F(3X((W5\F/.#3!O&D8*42VQ2<0=\\=@?1G<(UK(Q +MBU;QV#>CA3*U^QYE18^VY"L8\R;)U4)974VN%OP6!^VT=Y21=2%*A6]\,$J= +MQX9/.]FEC#9UU#+2Y5=:Q8MY@W;P>C%OT%HO:E60-UK)&[T[J-7W!CB[IG4[ +M[F8V*'JZP`MO;6VC=W=KK^Q=5]VU'=HHC'+Y!`G;(%M"?H-,W]AXE:_3>T"1 +M1'[FP]YS<"2B])Y5:&L):()U:U?;F!1)F72'*WF[M;7Q2#-5H)6.!`C0P6XH +M$74L'CN4U.LM/5Q113AE5FKL:Z$Y"CAMIF"B)#?IH*2NT0,>C\>>>W!]:T7Z +ML8/KRW/'0C74O32Q^MQ?>;C];K<<_4)WE9N&HQ\++96Q(Y_+$*HZZO( +M'+[_,%&H%D]W3)+N&II2@A#.HNSME(M +MS;5488I45%U8U53;4+M^!=7B`W?'"D:F6O*7!FIQG["UQ>1H;4+JG@7WJ(-/ +M6B8)DY>BWJOAVK+FH!4MI>1L#C3?N/FEYCV;1V(UHUG\A*5$3)MW)#2?3:EB +MRHX$RUIP%2NKJ8QM;S;)8_MB8^OD..Z1ET6Z=E]2/D;9&-?8+$F:ANMLN*:& +MZVFXKD:FX;Q"%RR2@B%X^L7T6:DW=COZA<%$JK0G!QU,?*+ +MS0GYYD5?'W\D1,$LR4`/FI6T2O">0)E3Q.7:]E!B-_K:3!VNC5WU5ZF7#WI& +M8M81"??L?(D]Y&I)`MY6;9&/6P)_6$I;TB27_XCVY(F@]K][4:\9RTE'SPT0 +MRQ\D"XSVQ/,>>/Z;$XGG4!_1=^'YKY4]Z*72KX50`,\X",VX,N?V"QKM"4-) +M9TO(\E-);KG?\HS$R'C:`>7DITZ(23HP6\HQ]<`<.W[D.<%@"P''BK8X+1!S +M&J0;M%#A&AC+>=`/5@5^LG1"#C?G+X'E.87%3]7&VU^M:)6",+9V^[NUF;T] +MH1HV5)%ZS%3+`(?+&8\$@@%;74.ZTO@PK<%#3`_WQ,,AG#F +M#1)[CLZU,-)_.`C<5@'KLCG]VRIW*[N5O)]A47H=B=TVI%@70)NUT$:6X, +MMZ`'.8:O6WM9S#H27(7KO11PHY09=TQ=RHYI +M,#=4EUDWJ[$_*6WBV442(CO);C(-N(+>[V"=:*D3KVG3>NU`\73K!91YW/0T +M1N;7+X+[D)N:1G8[A*"ZIBR=30-Z4P/SVG7OX2S\F_4O:E)[\8XTA-PP$T"[ +MQ6.WQ>.QYP:I:=E#=?;UZP"JL68^GPI\*3"`S*F.T.87)DB;@\= +M,V;[EVLR>BL\Q[2I)XBYPEO90L_02"DMVDK#[)MKZ:M(>-4*AK=[@EIZ.K&8 +MY/SDV;FNFQ.\\]RDK(P\,YZ#Q#TWI#>XEH^\-,K5"J^]LTN`.Z*W.5 +MXR>5[[EP95[7%`*9*-#_1.6-'IUCI?L`VFL*'_"C_=>?>;'V/4./8JDUB1H] +MVO"(,ULTN'5L=\,/G35NN05G=+Y!\H0JU,]?ZO?8842B?


%([0F-!J[=4@+?7.^]P@G>D\W8KOG#^+:-?`-2C_!D$F# +M6=`[#C25`B^0)MW!)V8A+A2%70G^, +MQP8&Q\9RVAGV%#K'<5UE?B8[^Y%F9Y5S:44U-6.M9*_D9I/"(HD4 +MY8=SK\P.;:^X8#VV3*`6L+:>YGV*_=&_1>8LT9@IEBTQ@DPT(3YF0Y7F.GU1 +MT1TJ-=J-1JL%>,`_1V8(*HZUA8#;.!FQ.-EB3#=-FBK43<'T.BHT$J:$Z7PQ +MBEP+*<*T7H]$DW,0SC_D).'*5IJ<'BKJA8FOS"3R%FME!J9&U":.RK +M3T;BD72!*-]%"YZ/1D@ASER[(6[IRDQGPHIJ1X3B0KX+*;5'0*ZX^<)Z5'YB +MC?O\N,F_^<*9U?[#W<#'-`QJV7/\:^(YX5QE.LNRKA+K'%(X-=P0T$U+K#)E +M2-VBC]Y9H9=T(35(AT&ZW*CB\.Q)I[_+T:E8*;L6>+_"_K$9B0%Y`+G`3N]L +M^<=>&]I!AM$R4]KO-[+9VH+>/\`HR&[.UN2?.`UR`^[=`KWR3FMD93N,5%)H +ME+H5WEP,O%F52'$<](7-`PD;K+K<`Q6ZDYZ*?+:7,I3#/MX:V=MUK_*D3K1TO +M\QYI1B[HB(\+'-$R)PC'1%\;)5-3Y#B>20#?KT9ID!.8Z"]'J:F%UYI3_-NAA8_XCC0_QE_#ZHSD3K2<@U:7_CA@$X_ZM/)N`?OX4>#P +M0\UE$')?=D2U9K@I.F04I`3B`=9GB#LK:KDVU^Y%+0"JO&G&$= +MB>D&./8**Q.=.XI$IZ]'<#[,M'9DM[R#,S> +MI\@D(S?[D<#>BM2P`20W7`-"JO)P_X7SQ,Z6:UBZ<)RD;WF0[#4>(]E&ZKD9 +MK+&88WM")%HS:A5UYL1IO`)6'8W'4>:7(U70L_5L3;'A<-CKLAUM7+Y$OF,X +M=B[.[4#:'(_]M'_?'1`33R1Q8^<1[4(:2)URX)HJ,LTU!RDM2E,D/,N+UA'+ +M6W`/91%0%Z)-2,"R'WDEM%>0%E;N83Y]/6[Q8H@*WH*8ZH^5=10ZO*[1P)V) +MX$J,*CP-RDB8]R-X=AOB`64EFMX(2D30.HGS,LJ:VZG1MR,X@GKZ&>!!S_:C +MO/TZU,RO(Z6'KW22_`E^RI0Z<^DQ*GGJMU*=DIXU(>=:1^6WR"[_^,H3Q@IY +ME_\*N%X#UVRXSH?K.+C.A2L#UV*XIL)UEBS?G)#!QWASM*6N\.5K$_M:.&_B +M?(F\.(Y[%N9-7(>Z%Y[O\G\&::1!6I_"52>CI,:8&/"?`S^1&1,I4DNX%ZA" +M*XO1QX/U4"TLZ[ +M?ZR:SMEOZM92O23?("]-WE/Y>OGVY#V=S\B/*_=YO:K\3D)R0$[)X:RM`;I` +M(W4'@MHC$RD;6L+H&]Y'4G)ZB)`#O`#T#W6T8<0*]3NN'RTEXDKPDJ%$*S/Y +M'T>BAU[DJ>F.9KKYQ:I?"F1&3I@43@S_@G_#3XK&A0LW4/,+UY!"_0='[TCL +MC!S=E&$A)_^PB>(2V`='O*C[8-E`E5K6$,OT#XJ`"AZ]0WT^+G4RH_3H)C(C +M!=+5AH_>L;E3#(B>=J9P#2(-Y[>%A +M,5#J$)5U&BWTO$S@AX9CGX^@W>]W1I&:9`*5LG@G5#%76_QJR^*P_GT*_JHL +M96%&615Y(+G;DVJQAM,L_1*F_[62_I>2!I$9H!:'8YX1BS_-\K&TT1N)/'1C +M8DSC&7,X7AV"]' +M"KF*FW;P[4)%(U=F@;;[ZR)0MK-5* +M`1W02WT!-7"H`4'PES=:E-6FT=B/1W!W4JVL2^$>ZS#([-@>J0F;,]`2FE$/ +MSY0B5SDNC/L_!HGRIQ>4H\Y%;4+GXFKM?*U6FS;OZJNOUFH)Q5F3B`94/I;E +MHQ$UZTVN9UTA?6=IS;6EBJ78U8*N=K5PM%4==0Y@.]GGO=B$J]?J_!=;$CRC +MM]&D2.T%#",\-CM5_"EPHUI0QKM=64J%G['-(! +MLP](AK/CLZHQSU`H^4$N[(CC77]HV%B^L+UAC('@NQP +M?MV/.@EEK$-?Q)1G/5 +M*?)Y[5Q-AF,>JYJV13O/M3KGO#K=VT7NYO`[2;HPY>\C]QD/W?E-E-+L9 +M(2/'D28H_E+^IVK-]C?7+4FY[^J7',^6ZXN^/-QGF35!HT@"=+E +M=@NK:K_1GJI?3896I6AZT@.K6/TD.L]1:2]OO]&(^2IO7=$RKB6?KK=7VF_4 +MG5+=:%>%>I0G5/#!EF,MV?3URI/W5,OL%:%V8WF0-CG)."/WK5,[<#^X%MZI +MM6]=E9)QQKAUN:8@>AQY`.NA1X4?.E/$,?V*=B-*FBETI?TAP65SME]O/Z6> +ME#%)8W2H\E9KC2Y=B-$0/:'S,Q@''U)K9NK!IRER<(Z5KM!%SXY>^LRM:Z>4 +M9RD9.D>6)D4/?_4I&IUCMW)ZT7O(OZ25/.6O\Z<8-U7VD+7>_=X>X_9[$VMH +MV[=E2[A'14TM9+=6$`FD;E;?0!7KZ]8[5<4/L[-KLZ"GVE9,]:(&8*(<=4[O +MH419ZJJP-"[!,.=">5C-5O)9C2ZT.N?BTF@TQGN1:](K$X[\(S6XJ!QD'W^WN4W+2=!HYF-QQX= +M-;%^?SRV+6Z!5+4VW0WIDRTWY`DRL1N#UD7K38J%R:H!#6>YP<1Z69PU$N,W +M?IB!T;JC2W>`%71F=?2G`T:SB:5_5@KC[L#`4SFZJW7F`E9695\RXM=8(Y0%NU+%I8UUGU.]71^P82J[L95G7T^P,P/[N[ +M0/I-ESKP?RN'0@,SFN"8D> +M3F-3_/7^N[M2Z!YC*I-%[_=/2LMRI+/$5$W:5CN74K95]G'*6,O6'$N_4C]) +M,RGM6XZ%2U]>MEU!Y!0)D6?*27H_BU'06K3A;U^ZKD"MDV[*Q/UR%O1]CMR?4Z_:N\V_V>17N]9G;#HGC,'4\@A%]O]2.J3KZ@\OLF/YUY']NQ_3(Z/^9'=.#HXG\<"LOZ#'A/C+N*1-1S6 +M\,P2JI2#6,L@ULV#-,^Y#*^R4-XOHM'H9TIZ5_#W=)&I#*MVC7.N=5F+L]BG +M7$^Y"4=9.0MW9.BX@0U:3[LX=YW;U4#,ZEUHO8%F53MECZF![-3P:*]!MT_C +M5%=V64FTO/^INK-UFJZN5Z&/0OI5PHKRD4I"K@\T;5I[*[?"<^M:'[@@ +M>G@<3_(9EYK=X"IR<]P!M\7H8#>X*?,5-.,U0$]6R4C5[;J4C-]H!WISO-1L +MJOB%BB^.:X1$_@R0OV==G[D^]8Z0FKJ"8G#O*O_62K0IXSG'EZ4_[O7 +M__!$7=.B^C7,(T^LD5UNM]U(\IYP0;VXHYKNC`%-3X9_WZTRF>I/N^M= +M>4)]O7OM$_5/KJU?E[>6,CVQ[LRZ5GO>+:8U];=,%G">_WT_<@"_ZI\DF%F3 +M*U<(%J>*9(8N/(4-SOU"_)LK-&U3C>1ZT$7+::Z'7">@9L=59XF4+->3[@_=:F8 +MW>Y(ERC99M>'#XK,7I*?Y5+MZ=$NZ#TH/N\XZ"J5M?GDJCEA5D@366'?NA_? +M,HU5[0G.M;F8O:=O.;NNP$,*4L*F6PH\PD:W\C<-_BZYA9:+W/FWK+G%XS$X +M*9O'K87ZITS[ZA,YC*RAHOK^%E8%M;0$>E;%$-96P8!7Q#HAT6$8Q0,1;/-E +MU8GZ&#VL9=.`KJ&-\+_$#VI?$NE>D_TER)_)\9)K@8<4K0FW>$#^F5$L366# +MB/1[KCK-ES73N3J^B$B?[2&8V^#)S\?()9;H25G]C?()/IL_!:9?FB^FWJP +MJI)TY(AD&IE*V7(@WN-QS.&C\0$1=P*):R>I +MR#99V;"IC9L&DVD&-DECPR9-MMW6S9@TVX6.^9K\YTF4XGLW_H,%?WWO?N??><<\\]]\H\_0XWM/DA@2S1R.66 +M,@N',[*%VU(&W\^++;2&#KPB,_MK`F2Z/DFLEC6W*Q6*]/"]VU%ZARK]ZS5XCT_F>O-\1,P1T7L9U-]W +M$_G[4X1-'-FAOG/4-C4#SYD1_G0J-:%#R5CD[/)V$NS9#KW"IDN +MA/3/E\GT;9`ON!(&?Y?;R(F]VWS;M-.OS>+(%Q.<2'E#^^[VK*OSI^";=M-9 +MEXQ''.EUA+^VP-;C":%)6.T4JT#VOZPO%'ZYE=@[(Z3\7]MG.E9V;/!O:#CL +MMD:>Z.@CF]M6=CS14=W6NNZPNT!>V?$G3:W-3A'?=EBY;\N"WH2 +M&L':4LLRW;)\3R/4-A8J"PQW08V!LGZIX;J:<:D&:F"[K::E\X5%XHMNMWR' +MI4AT-.PE/UUWCZ]"R`'.ED?L38%Z]#VP#ZBQ$%H3*3^SL(DH]RI+13-\`]%' +M`JTFA>5`3];%T-*?6*J8#09=$8PTU*IW&I0].^O"YM`SC_+KRFSA?N5RC#Y5F[OP(]:TVA,(31C>S<5EV$VFLB +MC/V^R(%VOKU:(?:J2&`KOCVKX1S@"13R.L0V:.G(:WN@+=#& +MM]VEQ)NM;9O:[FC@M]TMKO"4"%7B;0VD@I&K!;-0H-PM_M*=-V86QK?VN_7G +MY(Y^L.'";?G^^:+94RA4@[ROS>:"-,X;K)N6V2S7Y$*97&GYKI=M&/?",JV( +M4CT]RP&_9CD:'`KD^W)4NP*_&#`J?,74` +MRLP`)[)VS3FVAA-`!J7\SK9WH00:IZ\.!:P!?!-^"+Q(Z2RI9,!S:*>GKN#H +M"V:'@O3G`^YR&?O3]Y5?W`VSHK)V.SLHU-D>BS^PZG$$3RSD``A6DAQ?(IA,/QPGE?\501R3JBO# +M1Z[G.Q`?`C][1X0/DM(#;JUL@!5;(.<*\Y1`L"4]KT-!O*J5^2#.[H%@H7`0 +M9J].Y8J!DY=>\*I847AND`Z=>#A+?7)U_-6'":PZLAA.`GX.I'?*I/P?-MNW +MOPJ64Q[0*5P@N+UB>\L6^_:.[85;`D%:$PC8MV;#S.SB6UJ,5R4JB"/R0EX" +M]QDR_60<[&T%?GC&DNNY[EL@ZQ_RWCR(*P$[0IMQ:6Q@VX:T2[7UJ!'2.$_ +MC./_@51E*9I0'O[FPW'0G2U?*U.96?&%;%KP*>QECI$R_QW@5Y=Q+0+?6.J' +ME52MR5M@>HJTM[`-U+G.$S;=9__=^P[U[Q5WL&:?V:\7EK%>P81GW5)]E27O +M8]-/R`,M%DMQ`W6T>S:8[K-]_7[J+POYOGE^KY@GZJMVDI?)LP^=64=7_L)\ +MIGD93Q;G"9K_H,N]@D&`TS3DY(Q?$(E+C]_BP9>"S%'S>YO_;1Y5,;41`^__ +M*Y:`A7QSL008,AB=BR$`Y0G&.#CQL\)4'(!I5^6G#&+`2X/1A;W#T>S0<'0A +MI.$]Y7\L#[=QW9K??;T +M*?E[>UQ%643=9. +MO)%,_LNP="+Z6OA$=&3/B>CK@R>B;PR?B$ZG<;;Q>W0!J?QT#I?Q'<1?9)^9 +M)-!7A[$U0*^(MTC(FJA6:3J/,1N&R8N31L0R3]][/HW5B+$&M-"'L*FV6FB[ +M*]W6&'GJ?"A=QO$VW<(XC3>-4_V_C,.FVU[?/R]]#?=JW`M\E)`'$35YD*R: +MD_=C9XH/RKK3XZ^=T"`_H!\RO1UX/7(A?WHX.EIX;>R%<'_4>8U_:%_R2KK. +MD.8HUF_NKX=ZOG$P.@YKE8%QM<;*R>GO57ZJ`1L?2U_#MN/-@Q-9:KGR4^H8 +MG#!!7I<>6Q\)3]9=-RX#?)C8YJ_3&)USV)Q?.VY- +M7F)\8?)NY,M(E2+2,I$+;0X;;]3!8<>-.OB9X_^N`_GWZ,!EO*8#E^/WZZ`7 +MY#:!SVS<]*F\I>24:N\\#'ZBS?]A.QO2.D._U8T=][",\^E]+EK,'WVPG;8 +M7M4QCN4HB-ZOVI0&]H'N*$4<6')24>Z3S7DRR&MA.0R]DS60:X'>U'' +MA'F?G[8/[W6ZC2>3ACD;3?F<[DDM\&:"YZ*NM="?95\$6X3YAN=AG!+L1\'6 +MI\.S^N1'LQ>JT]\34$\X3BHN2D&4-79/?`6^:>[YB],V8$/\6N->U;Z)"W7> +MHMHVXO82%\B*6+RNG9-CR>3%N>>N3^,#IQ#T_S`P_+]I3/T\6,L93/UO#E/_ +MFX[1<"L8_BKV9SHASF<&PS^#X9^A#&4H0QG*4(8RE*$,92A#&_!A9:VY9_V5OG^FD*<=0*Z5PF*A4*\U,S<5GF<-09WQA +M8EA'JPS-TBK$LY(.?66UZD@IL>G/K5G]>>LG0GGP]>SX&;ITISLVGBR=$%A+ +M6&2#HW!M4"0LJ<@[5Q;\!=0FA++@;R%_29R'L;(=>]Q?CK_%7HKMFTEAAZQ3_R9[%%(::"1+[+OB7H@V'HD;Q:ZA7UZI-[142#244XO\=[IT47FJ]; +MD,\L6>0MEEMR]'RA2^.DDD=*QDXG1[.OG"Z&<3;-5%@X"Z+OO)!,C;BV7"ZI:.(Q)R9VUG=^?1SF3L4)+HKIS!WM]1>R-&Y1/)CZ;" +MW%##"WT'`T0+HLORBX4OM,8!;T6E(ZW +MW5\ZO_U8$"/V'@O4-A[H8$M+7`?:[O`Q[:SOD7<0,!%W=4&.5.>KH#1X-6/W)K +M12REZ4=GR?3QV7HEPAJ[I%4F*#4_1FPS,E7K#(\M&!F1=:551O73A9"D5(T; +MJ.(K_NC'R21B-"$V&\:%WQ5.V>]%[V<^QXA>N.C_3Y]1N.@E5CW,V,EL;1<5 +M])9"Q'IXCSYE\9NHPVO:'OQK_T/N13QO^ +MT*L-&UD]Y+_Q,8*9_\"[E^XVZ04CE,=H'Y3P]S[&$<+]NQ?74[=T5*KEUS(] +MX7FE[S/'PZ?\3+?16M?]4WU/]_'NXWZFIZZG=B?=6<3W]+SC/];3O=.H8G>< +M:M):M+S34NR\%'OWTL)02,4GI#(IFZ\@\J`K7YN.\3VHUG(1ZZLL2U'4VNTV +M(FO*-!S#T]*>>][P,C(I_W7G[A=+0S +M6WG4/%+_9N>RQ\,+O^W94O_M1SX)_9GNQ_DC]:\VW0XMG%(Q]/HQ7,F%6I4T +M#YZ&-2W4EDHZ9:%:8^[!^.'W25OJ\:G=749E*-1OIW)/5ZX2".V"TLXNG<*% +M>C#*+M?=192?=#E#`]ZC4LK_I%!!'".D-%=JD/JEMR5/B%@)3Q:5?*@Q/Q?: +MJ/M!/E/)R+D2K9JG:*'4`"6]D@NE?BAIE-LKJ?PVE#PA6GW0_?$'CL-&"VHT +M>#4*/"G3\76F1WRLIAC$,7L]!1G +M\H7PUX>$?7=*;V(<=WIZW!<^T%1J8<0WIQ@VRW-I2H3V64D-.Q/[--G^2\!SZ +M6W>_4MQV>_:LI];W>-#8+OMNK8E"!CQR!]#IB,$(=L5,10Q6Q +MUQ##:0Y[<2Z^V(%T/!#$LWK#P@#OGUQ)\=X_15F=)Q32FB]YF6HBCO8.NO_I +M`\T2G(G'829T,!/TE63,E<"9L":GO3?K=92-QP:2GS7J+#;8"_*=1H>.SX*Y +MF4V@IC3[8[%+B8]7V)4VH%=F8F\FSOCF(@+,Q'Z;6-F9Q5Y2[2"4<%CBL0>3VGW4EB4C +M.AS.:?]E1G'!W:<3E+UKZF0#[+1<#U&]5?/E%+OD>HXOV!4^))V$%2O/[C +M;,J78QP7QXA9@C7)U;6^8/I[J:X5$7)I%75J[;\;7R\Y#N^QX,[\'#WACL2V))%BGT#G8J72R74(7WC,Z7X`[ZQ-_O;K\T8X=G&6_ +MM\3)+F][-!9K3H@[J+G$^:PW&3N6_"M? +ME_,8M=->C].;VL`\O2H0=6AUD;[(RB)(;1'QB0=*RF^B9$82IV)&-W04UZ +M@L&H$FKT&JL)\Q\E6=,RGVL!:G@NHM>2!F)=(%JY]WL);UWT?'WI.;K0TZI9 +ME!O)7G2;[#%M#.DJZ?CGV3EGYKRGQ[0AM,+SD(EQYBA_8V%*2SQ!.&-JE/]F +M[U^@F[BNQ6'\G)$LR6_9F"#;`QG)!F1CB&0,L2D)LD1@1L;&D*27@&DE&Y*1 +M(2#+0"0[2663I#(D+29I"R1M3!XM:=+627%+6W_GN/9`CY[KV]_^_[K6^M;ZW::W2><^:UQ?>X=A2_XKJP9JX_Q5WM!H[)?9X_)]C:=#ZC8GN0 +M0E^$_3#.'(PL^:@HU$*##3FM-&F=6T#36'A&N#E=)S!E=`?6]E'2M7A+E57>K_&ED8=:YB3 +MPI:TDYX_D&..DV[$+&^/LQ03N4E_4F`$;AG!=3RJX,.]!)<==XXN-J$V);Q%"7\/PCXEW*"$]T.X60G?--[%[Q,`WYF` +MLD&IWU9B!277O9#KGX!"QV+5XSA;OAN?U@Z9PGZ'G];(R)Q%3-DS3F%69"U4 +MG9V>%PHUO<9B:>-`J^"B,`XM3;+G!+Q- +MN?Z(KB\6^]/8+0+O#KDW\&C3GII06W-GRTNM+_GLOGKK/F\"JX]`SA?&)F)W +MCDS$CHTXUS!&R_*CK<0XW,KMHFGN733CZ"Y>(%GR+M2TMLR:98G%.L=7\C?4 +M$3^=>^W50-\E+H0G>/TA+HB6(G\T5LG76U):4HP#"D7+3FID +M):CQN&@IG]6?U9_1OY"W5**]E,-[SN[)OP-Y-JM@J0WM1ZONH;TAH,7HQF/O +MHW:Q"CF099[Q)C7GG(X!+>3J+(J^T'F*7MWA2WIUF7!/@)KM(/.JC"G<6"PZ +M-:TWLBYI=]R2E'=!7*CO3]H$TX+'1'3D?L`)K\"C>D1#Q'@FN#.(>,-LH@:9 +M;7U%,1F+%REZ8=])N:SS_?VD'MC@5_3'*C85T.XQ\`\MXUKV:.#'O,V4T=BOQJR7.(4WQQX0$#9Z!49ZQ44>`5L;F/HNX,7[UM"Y%Q0]\:C3_ZI1 +MU-1^-V^QW)"T!CG2=WP*)]TKB+?!.=1M: +M3D6;]:D`6<:LD6349:QH-M:'T^1M?#!P^]?Z0*WDS`(L!V]RT1;4M*R&VI5. +M89L^3%H70'W&&'OUU"U7\%W=X/:TW8@6<5MZ`FL%FU7GU529@6K8QVH4_<3' +M9L=BR\>.!E0<4T+":O@":B+$LO]YS/P`:C0?C=TP)@,D[QBM%@@'7#&,P=K1 +MER*DSP%\1?.XW7D=WWVWK61N6/^.I80-:][1H\6ODA*)&CM:RF1KR8E) +M4D-HKEQ?DA=>!S'K(<^-);.D-(@MD$&::9DE,_";)ZO@-T=.@=\L60N_Z;(. +M?G5R*ORFR!KXQ9&J:SBP9S9/VM"""L_5=Q@X?8=*/@`^"_C"H>Z0W8!Z56R& +MG.!L(6ZQ6G1!A)2NK]28S=L#^7S:371V&E\`<_%WHXEYK.\CQ7F\VIO*ZRO5 +M+5.Q-^,Y_#V-^N28Q_$Y30]Q3#ZT.3$^<9QR27UV"BT$]P",X8-)';'GOIW0 +M=Z[72GXO&/T+6E]YP/I@3/*7Y.:Q2TNC[>W>\(N4]ZZIUZH!"O>RAG +M8SH=K[MK%4M3M<+K'@@0PQ%9!73K&VM(UC+!6Y1;P9AUWA3I)4J,'#L5^V)*+:/67_3_ +M!;ASCN4L5B$6,X\NJDTSZ9:@?;98S#BZL"X+TJRL!6!8,%JZ%D-5@"%CL1FC +MW-WS!9W7>.=\OJ/%U$Z1VI02X-SG.'5%^8YUKHY`&LAUV)L=@:N=5Z]9UW!T +M3S`P!_I5[C#[XV9U.`VD@D+XZE]&Y*Z.?'W58'N\A`GCFH[4U)^OK^QOCX-D +MDB><=$_%/IS"!]NKAY:?OX2G'@7`7_AVDF]Q)?IH.?2)$YX&>+`/*Y/]AOI[ +MZY*X#->>R&K=:OUJD&E7FU=;5E>N1ET;*K+^_#Y"CJCZ]>?P7CFU2.\SI.%\ +M!M^G9 +MA.PKJ^@95O<_>P'3,Y;O'59;@N^/QN.E5-]Q;BRJ!.C__OGT"51Y\@- +MV^-Q?`]U7C#P#NI=H$D8X=PTP+Q$OQ[U9``\@30M,]0_:S;4]YBG78@W*?#_ +M8^_PI33R+&\@/;P>RF/^U`M]T%T,_5`,]:.=UZ#.%6DEC(MB&"/%P%N`OQ_\ +M_9@^K'!_43*"G-&S2.:ILOY[QXS +MS/-IOX9 +M)K:>X4Q]SW":I6=82_K/N\+!<_C^B:GXQ_B.-CQPGKAZSA,O/$%X>GO.J_M[ +MAOM3G[GXU6<&O)/0&]!S/AZ/?VR#L4^YH+SRFLYS+'?/!8/^'D4'A9[<#H94RWGP37U2=PQP +M#<-8/ZS;=)RW+ZLNDZ6LFKU[I449`0S;:]=(B%U)M&`D*6'S_I6==E6X1-$) +M^]M)PGT>(>2&V^+QN;=DEA8_,>_4+%-1C=W1OG+( +M,.LZQIPG\90.<4\4RL6\SD;#14]<)9\D=&CN$[ER"-QY3V3)/,D8FO]$FJP# +MCB6#UY+("YY,@W'2-H(6`S1ALY\N(=%6)30B<4H]W;/%FZM=ZO/OWT^79[=VW=`N]LV['SCAUV'>[ME\?EKP'^J%_D4K\` +MSD#<,/A#*#SIO^U'E_V_.(3O]J]21Z^^\,S!R^5\#.7@6"/ZX*4^KF[N=3Z_V'_#N4)HIAIO/(/^:[I]$\2NC:XXP9"1AZ^,M^M'M_M=[A]6Z]Q +M[[I]Z_;$[[?=NZY=VK3$4M&T\`ZO>U&CYW^JP/_BSP)_2RT6=*W7+KG"!9^E +M8LFU%<1JL5HKEEJ75E0L(99R:_EB"^$L_\\^^[_[V]VZR^WC.")N]35N]>WZ +M;_/=YMOJWB6Z_UM06!)_E]S_C_S=_]FC%_ZG9UK'D:Q)T(J.',#+^@YE'J/^ +M&#W@`OX>_^D239:@A+0/3X7T=/,%D/+Z/:=]\I^<\ +MG]0M]4VVY_SON4C +MWWO!G]3'@W@M"'Z,]W()73RHFX@A0=F+>10=2QT7-BAIG0K-`-S[$?(_`+J/ +M@#9]M!UHR_L!!OT7&'A4\*"\\E0N^8B)?G#?/@]0 +M.!2D/%"8/!M\B\?3*,D[ +MGVZ[1T_)S//I]??J&7!3P575OWI>[?KF.;7WH6*U]][B\7A\WZ?0#N#AA]^? +M0=*1I["0YR[B^QGP/@-N*K@JVROGU?4WPWOW%$_`.Y_#.[\_&F>BR4?W6)P! +MWD)C:_:N9ECT=396-^+*-DAJJA0G*5DG,F&=H][E7=T!D@[N5=L(4>N/\\XL +M,PFO=O(UQ'A+TTT-CS11JZ%D]+36M%Z39=9(W1X]*^@$TN'&?CR_D7^E`#9K.N#I:#\\WXV8(_6`JL:HQCR=^D+'= +MV*IB/B7,L#9/$&I3#S'5'D$C9%6[<:=VEO.,Y\:,1QQGW.J4+F)T!'4ZA[Y1 +MWVQC)H;"'H,CK+3$00V&H(Z&:>6DY%V-K=6#;*@S4O,!#R-A&[VK0\KO(S"* +M[H$G2$A*,(4P"#?PJRTFPEP/STH8:>8B)3Z%%A(F54CS,XXTK]//V'1A6O2V +MYM#^H%8U9`BI37J'(8CK%0A_%LK2]56G:(:T`+^+4X1+<*T#*>HA'<3\>8IR +M7T:"$$J%T)L0^C3"<)]$4(.NRD\MZ7CF8MFHA.MJ&N#,"X3"M85\E2LHDN(> +M>_Y9C2\AA[X:1!M=E2*MT%DJ79E\4.RQ7W@S +MG>\0J;7#U2%J2U1G-4*52V?L<"5*POV'2A'?>S?R?C%AO##';-"&D;YKUUY; +M6Q4B'-K(Z")B_9(ZRE6(_5K.%>0XG[LP#^H?G*H,FMFX):^BVG*/O<)%3B]Q +M3=L/+*W)YX+`=,XQ+%879G3VD@?GUMB(P7#/*JUZ+E^<451+C"LRZ$/WK3+5 +M&$2F;;W&.-09HH^P-8_9J33;I9/)PT?`M\2EDE\`MW'53!1T@0OUVZ=FZ4O>/,TD98=L02@V9FR]V]H;:5&;UV%!FM>JCME +MN,D_PS\8*F:*'`_YB]5%CC/^8DV1XVKVIL",@!(;.!7`^%S-#,?G;2QKJ*(' +M:30T2H]\[J/&+LV^9J'YV9I*0Z%8Z'FCH-]PPDY.T0HM^TN>M9``DSS+0&'D +M`9?1\I"=GJ5SU?)#=D;ZOIV`GSFD[-$O5$%Z;X0L3`O["]#.1#N+YPUH!7[C +M_L:UC90[&OD17]D':-D8#`F:E88C?#"`>FE-'-G>_5PCZ![M"]G0)<=J&"36+]OHVQ(DY14+,M'8BT4?H%R;0>B4[^65DIS-Z +M/$^D18^%-FE,QE.&=0V$&]32,W@*ZWRHV%B\(/?LS0V:A=F7;!/K8D[IL)1O>MWU7F2=(2.0Q>[SO^%/L=Z_:LHXE\VT +MW2RHYN=5#8;^5?6\`]OVGX2N^+X]Y:T]_CWY?R.&Z[]GI^\0@/U?2&WAI[/V +M9._._XM^H69AUJVK=F\6M$+V'VPW"*RU+M`"&).6O'KV>H',UUN_[WU?FS)$ +M2E72_7YF_G+'_=Y/`&?=[U?/+0-_Y9K=FMNS\I8S"UFIG'_`7U^IF[?$\8"W +MRR_`6_7**C+TN)'Z$#L-?T_/=ML/O:EC?Q@9_IZ!/6P_"/X#D7W^]:B]UY36 +M@KZ#V5JIV'G0LUZK.K//KRLJ<.SS[O/C^N$^;UL$[9@0_][>H)D!R0W[(J_V +M8N"J-6P%->LE5QM:"T3[DFGA?*`+*.T9%.W?C(3:KF^9L/A?FQ\T5T@7`RKS +M7`G?)V:CI(8\JWVJ2S9=#J0DYC7P`$P>X/CR(@7/JQ''`RO/``%F\,@CQ<7)('27C:IE+KNYOG:)/ +MJ08U)E5T(=3AWO#+2BT[(KC7K>_[US6D)%WBDG/*9NBXZZ6[\&Q!FB4>>W." +M`A2-XFL<[YNV%?KK-90UP0@_`"/\M;G]!I5_CG9I-EG$2G-R,A?EP[A^6!G7 +M,S4S-3/T,V?J9V9H,@CJ([_9EU@ST`&%'XB/1.*QW/B7\"M.U=6MT0;?^A\R0)&H(6VS9J44<# +MXQ:QHWU0.YC=T9JP'F^2]O,F!?/,4FR^ZB277VUDV#0;9]392F!,W#:.^%9O +MN4=011^?PIY[+4D+<<^M-6X1;6U_B^!,Q_"]2OC3R&M`<6G1PQK]<=;SA)89 +M2FBA-KAN<16X@99"_5N$3+9^R3$_8]XNT>(=PC/>WS>[_#KC]KJ0P^6U*!:B +M&8FT,]$5<:O(MZO-F5(C_[0IMP&UDD];R-(98,P`[:6N;SOU?FJ^5?H6;S#B +MR";2'&/#VF6A=04-SE3U##$U8]"0XVKR;]*HAA:+#[-XM0/Q:H01:[T(GG/J'M1?/D;3*^LZR-EBKOF-:3SHW?:*-< +MPD[\@II^TF]H)?T;2VO>#FT"?]!@=,ZIR14+_739$>!;YCISQ;T&1KZJ9N.V +M&09BZH$>O6^LJHT67M^[2N@JVOZ/&KS-=+P#THL+]JPJS`7B7)`/NN,4:!_+UC9O&" +M\%);J*T38*MGT%P9!`!I,0>7C4MG1WBYKK\69"C9Y*GMB-]MTUEY@6TN_W(OUE#H9$=?H$ +MI[:]P=NVO2X0IFL;=9SDU=UTVTO.E.YU;7J6^J8X6E(BI1P^V(8\>+>=G,YA +M4S4%TO$R&C9JU4,OHI9Y6XZK4'ZE+%_Z-4!HL`W/2/P6N"X*'+'.E24?3^9) +ME9^[%*N2?Y6,_:70H],UX(YT//;#4:S927':+M19;OY28,PZVO)5G[-&0,UG&GK6,J1+F=*$RZQ/OOQ=).7=3@>*Q[+`#A_.9(I +MQV.J>)K\1%E:^'B9#MZF\#8C^4-W"#K@D`]&MN&9/IQ;T'O;A##:\CHL^`5B +MW^@13H9F&&YWS@@>+_M0ZH+>)+):MAER0C:#/BA'Q+65:$W9G!)^A?,F6]4< +MP?$Y/N+FJ>CFL]G4`N3&GQ_)+WJ8IA@'F0T.F^%$<#T?[%(?SK.$[,QI]6&V +M).74RY=*$")!J&-]V2S)R9-FIS#BV]>\E@:YB\#/VK(Y=AKI+1/RCJ'`,*W&.G],:00\N2 +MA?0=@%ZD7*!%.G&3IC,T9&A+69^MEL10&<"JDIWX8)%SEDM]Y*5@RN',(SCZ +MUGD[?,38XO6GZ('J\72 +MN].\S7<[O3^_>Y_WH[M?]U:+:FNUJ\3/EZ@DC]]FZG9XO!Z_H+&.0VCC@JV1O_.`YY\&N;KOF3;;*)C(FX,@G$E]>]4'&$147]@7+ +M]%+:H:<$`GQ&NA0%GD<'/$^6-?V0*CHRAGFIZ3DH:=$'/^%7BNKE;C_G/^+$ +ML[='_:EJG>.>5;+_8>&^U%X2S.\GJ0=LAGG&](8_P[:_!D;$FP,<`%@=GY/3AN.F8ZY3&P[84TX?L&NEGL6%^_?;56+3K1!_ +MU@4SNO/F;_/!S53&7Q_YIYJ#^:=(QN)3!AO1&\I9)KIM#"%U&4Y,],+8C7(< +M,`T]J#NB+N4DHW\=O\9)O6Y_M?>HO\.K.034PIP1CI(.PW&K"G@;5?1:Z`'5 +M.][LZVZ38EM(^T83S0Z +M1X_;6-O!E8C.=J1'E%,5;]'TN$Z&Z!&NLJ.`Y;-,-E%=&8]M&D<,0$R/N2K9 +M.1?,X@#DT)5W%0P$$V.KDIUQ(=]I.3Z#M2U^ISU#2"E+%6%L>H8\Q89G[.EG +M4XK?:4WUI!IR^`%7AR=8E._H+8<76)R%L-VK?IR +M**C5#_VG4,^F^KNT7=D=]M2W6247$T:<]W&$6CKL7[ZE9S^(Z/L^6.,&/$-+ +MTL^ZO)QWV(_X]XVX[*5`:Q/\]%$_*1D-&_UI)7\[R[`N+^$PWW^`'(.]U0$X +M^#&O[+T8&?8KEJ7AW7.14TZ]:,/3P*X<,+B=EFR5AMMH2:-$69=5"+Q8!Y02 +MY(`6H,-+YQ&P.]P!WEAHFQJ,^,\RY&R;LEU97Y':0G<(R\/@Y +MBL7P+*DG@%:ZH]NV"7M)5\A@"))J@XXCT;P(YAEID(%0_=)8*WXO$9R?]0$'510"J>V&NE<-;[3]MHT4&]A_MG?VDM.5 +M[-(V6D07'5\%G$:14/3C?1@HW5O"OA_I#2^NN-BRML2W=U'7$OO`L5%ESW&1;7.`=!.X;N7KW*N`U$>9&BU,@ZS:V`4Z;YUR_+6BP +M&18"'V2S\D&UU3Q[*G9TLD1`BNRTIEFF8DT^\89XW"K*MHY/@T5 +MO9$^?15`Y9KQRW(^XH)\D-_+BA)S'^DWKMDB[48:;J&)]5V4^Y&6HPQ0"?E' +M&-PKX+(O0N))38*^(_W_V*GF]X>(MT]M_3VY"#+L9SYJ-H09>%1FO61D +MTSDF^I=X)NLN0-_%N)K%$4HKU`OI*0 +M_R.0,?_$D_DI(N6>"MDT.@,-J-D_:G\O_"T[%3!)B_2&4_+C*3ZC7U>2*IUT +M=BMGD#]L.^T_;*=G)?^'OGZAONID(UDD2B\)%T.I7>JJD+WQW=^MI:9E7F)Z +MP6MBYY2/N=/4N1D=!7IV60Y\;:2 +M;NA8.SE2Q08-E1W'VM,\B7/[59[K@,O>$Q?=)5U/K*U?4=5T%*3-?I!BML>K +M6+[I)WR/$\/=;\OS<3ZNZ02;T>%:#1*B1`]NR#2CAZD"^G27?QQ,3X^WT7@SMQ=L% +M35A?U9!NV\_;H99-=T-+ZU<:IU +M;6MMI:A?4MT6J".`,:O;_6N9$J-D#`SB*D`[C6Z([U96GF:%192I08[W.E&2 +M[UFVWT#;QP*`$\/4B+.":3J6TS*%&YVA;SS*\ +M;43:$]9L@Y=6`Q*VY%5F!NCJ1:]:=OG[-72(F#[RXBI'MK2&[_H414M87K3_1KWQV(F):N$[BMWY!%9;X;S13Q8`[C6N\^J,U;[O&*GOLXBZ +MA`W'8W^K%PC+Q!<6)[]0+O#^Q#H#2$QF>I:8TN`+WX6W%CH[ +MVG+O[+9K3U6WZ4K44'JUKQ-*?B6"M56?F6X#5=J`<_>FL2KQ.YS.]^M(M"_? +M>6]O$:]?ICJH/C`]AYFG.8&#.5P[RAP:4&4,S5G#B<1O,U\??@+F_)&Q1&A$ +M6BH/4,N0&GC/0V,SDWG*PCSD"5W*4PQ\.\YQ7.M[)BG'ER7V:Q2^?9IGMR37 +M^W8!C[`4YKY>GY.C@_S(\P\PS)`JNF.,EPJ'S]35NKRJZ>'00I'N0S31SAN*Q65/H_X[Y +M*@G?G#NJ08NRP"L,\`/*&D&):`/83,5^/4Z!!O['F`7&9>XH]*E&/H-O9,"W +MGN^LVHLE:T8Q1C6J.K+1F`-X<&JD(5+9-Q4;&?VE4*Z>-EP7 +M#&\C)IOR;RG8#[,R'V9E#O23W.H"*IIDS-U35*;1B^,L9Q4%X*=HN`-M$!I5IO6:;A=( +MNRKJJ,7;#_#-^^+U0CGG%->K$RU;[=3[<;VZVQ]6[*YJ*JUB5WMNEV'9N@*- +M/-)5XU"93C&`B^+SY4J>`DZ?$P[Z#?.4%<%YN*]K +M9:EC1(%-?7S)%=\J`PF`=O5[N@JQ',RQ(JZ6J[8EPV&%LS:M\F1)/;WI^Y*=]@H-&_ +MCG.`,;/Q6]&W)F9%D+[BW,1Y.BU;VY+T&.VD*\'[>OMP'[JC^89F(T]"]S`$3WZ#!#1_(HLEQD$'^HT3/+O* +M@>?7F&CA1(L!W5D3NB1%3L1G0_AOD1QGMX=6TJ*]ML..;AC'%N449#SV13RQ +MWY[FM.4?!;ITLE$CA#QT.34]9M,[0B"38$G8#D(N[RF,],76+E=6_!C@$W'= +M;Z[4XZ?S&//GM5HI"^C^^W&SN,KWGT`A5GDQ/47*AMBS\1*1X7B0D&R65<`Q +MW="2XONI%\=SUL@%997Q?9Y&KXHGYL5G?9V]S*%WUKQ3^V>AOL*V1&L==C@^A>-]Z([_40S35#E9J%$!LTAAR][HOM?Q!2H(87 +MVU7F7(EP)]W'`HK-;.YBZT7P&:2+@$]F2O'8X&2NS$!LMGRL#?<-(&\38"H. +M>@-BQ3:5$A>/_6;T1>`)+5X:#8_*7@+\U%.";@NF44G'R2UR@)HUP`_*+3#.C2J.`AZ6 +M`T1NE55*&6I()4JJUJB&U*V0FF).E>AA/DF+5%*O0N5ZO3^">@5A]I_0.*$V +MG%*;A_@@S-6\,.<'3CZ,LP4QC]BJXH[Y@%).[1/%&D)O>'=B#:'/3FA54$-&J>$.GCE,;6GA`&=+Z=B'_!Y0 +M_+T=G1Z!0BEQCCD,D\8V)WPKCZD%83)/L_>^3I1/\B3L%<3QHF]'RR)?C_>8 +MPH/]$O#C9.R#J0^4\70+C*=/)Z.S?)A(SK[)O12WA$'_WM`RW,R`#SPFK2_(EN16U+&R<.N;Q`$6RD:>VV70= +M]LQ33VVK+LB#T;UQ#&7/-.G#;2C[?KA-5W"Q*4%KY-:QR(=BASUV^D,18EU? +M`"^\&+Y!#I@53%TB=;0S((/,EICV1<(U-:?(*4.J&"Q?U\2TEPD+UZ:&,*:G +M/&I9=IN6AMHP%V:CG:CHZ.UNKV@ +M5EV2`R%2DB61]GRAP-E/;`;]LIRVH`5O-.7O7M=VR^[NML.[)V./PHRE@/\[ +M0O/EZ37!Z75"O5XYNZ]&WD*1-0H5G1#D%]J$7($R!:Y95&@3^`W7+7"M`MU5RFJ.KK62#2(U!UG#*ED#N*>%:X9XED!CJIH] +M&?MT2KXK:J),SUV,#;"_EF17!4=\1/('S6(@]%*HRV"HPAWG0/`%P/[&,%.: +M*1FL`T%)"#OU5G;9*;'+T!$DW`D8$>2`6C[1EN#=3OA>KWU#,(O!T`V&UP2V +MZF0([R^K8=3Y<4A#EDXFR;^[7ZH<%0/6L`:2K]5$F#ND0GF0T#@6`` +MU_&8<)"9BOUHJI,/[@]JR)G;(^00XI0[A#MJ`:UQ)2Q8ME-(K^SEJU\*<05TV4O +M!3M##Y*'%>Z-]='R7)#?.H/Z4BH14V0B==MLI%BPZ>!+;F:>3IZ.NUJ) +M"[GI/')H/KQ="')?)IL!>*I^"5)&S/>G;2$3VLJA/$4&G!=.5^Y]F223S";7\G%>XQD"E#OT +M21D#SWQ5)M<=/BE(R!XH@W!$)`%KDL0[D.%B[THX,F>?2!?[VL.&A(G +M?!!+SYA`ZL:UI,OQV%WC)X"FOPS]R/`^E7LGP#K?S%&#O^1IS:`2\J@^`>^ +MVDU9P3.HX8:&VU2`:=7&85^J9E"T>W([7A-=J4L5](9@?_O6:K"&[YY0V +M_0PQV;TU[)O-S#7D/#&FY[G;4#)F/G$7/?6;VH(MR&8S^J\ +MU&A@J[T7`[]P(@=P$:B\7GI."-T),UK2LR[+2P%:JI7^K46W?W"?K0#O_\5C +MWQC'=57+N*S05Z0OI>.15L(=:Z50/X3-3P36JFMG-&E#G1K<[3J8O=%QN.8M +M5P*'AD"^"HT2^:?R0S6W>'2.#>YC0(55X6-^U,/R*Y"@XS'S^`-87TV+,KI. +M-N]WYHIZMX[MAU'2Z40HR^W(5?#-DB=D3SD=:;T7*;5"G[^SUN^Q:;.'4%M$ +M%:\'>FC^.JX;`NRBC#&/F +MC.?(%%I5Z4=H-"LK!PQ08-)^*\`UOP$Q/S$5W'0,9*'B,.8RAH^U$_.H]/@`DCY_ +M4&Y3`Y>'Y>4F1[X"84[VK58D$FW8YL>S6/@M/'5BF:"+&'#'QE4RLPACSHV3 +M0\#]C4W/Y'2_X(_.9;4+;*E,OF-)S9*U[.*'VXJSRZZE"ZZMM=;=)%EJN,6D +MM$PB9<7A@JMS0_OLEW6YE`AT.6L=;#MJ1XT#?XW,7:,Q49:M,(!L]OSDM$83 +MANOQ145WJ-)@,Q@L9N!$_QPI%%0<:PT!13L;,3C9^0L]M,)%) +M&/E"(`=>%[_@OZA)85G6 +M56%90N:1TOGAYH!N_GK-^BQ5:98T*+8QW?8TB812C*FJ(%-MP'GU_=$>_PE' +MCW*[V":]SVN`(TT;$Y,T4PW2"O*F/=YR^6=>BWS4+VB[LLNDQ_SY;*[6/'06 +M9DAN6ZZFZ,PY/YV/FC$^\,YO866;]?4`*35(@S`"9TIB(%R;*"\71LC\T4%% +M3XJNX)A==]9CKS;@F*T99:+_/OHS;X;\4V^:_"IO$W$."LU"?LC.G&6B)R&- +M'&*B]XU,CZP7UE)3I8A\V/V&%YRHBVB==Z`-]VL&?%Q@0*L^0P`V%:-D;JH< +MQYUH""T<94!Z8:(EHW0NYZ?:F6&Z<$:X4GQ:>*DMU;\/>GS`-]#V%'\]JS.0 +MNX@Y$R23J=C[8U;QI$\K/R'@J#\)HK0IB#M75+[7Z?\`S)9F2Q9+@[QG` +M9D*C&M%?A:2'L]@/XJT=F>T?XX*THI:P"[$&T"3E;]B-7AC>V,L** +M/XRZ)LQ>C%'!6Y`SY4-EM88)W]JBY\Y'<,5'%9Z'?*GZG0B>MH5\@#F)9BB" +M4I=>JL)3@&T$J!_*9:]'^E$VC*N!R\H`*-/HCCA1=(M4.DGQ3#\UIB\L/\4D +M3V42LDB3EI5[58%IWJ(YY*"_K.:,H5@^Z%\$+@=N*;@LN`O`-8!;"&X>N$7@ +MZL&=!VX&N+/!!>X#QH;:J(:P$<)$5AM)68J$.R4JU)(0+1SGV.G[^GFU2,V. +M0SW%<$J=9:FW#?>9+/`[%V3N8ID4)M81%/FB,"%CG$A/R!:XEHE[&\A?5";7 +M21#GU)L2YYJ>*";,=IHXNT@XK>8+?D56_]WD`$(F,M7L)T92JCW;;,@-4*O) +MV^RG%?OLL3=I].P4UH)1:I$G110^1P]\?4KX`S[+]+Y`1"::.2+S4-9AX%@E +M<@U()-&,$2::._)>[7R%/V:&2'&.O$!>JX3H$"U.D^](^IEBM?RHXI\SI"KN +M(20?9*Q\SM(18$HT4G\@J!V81:UX[S!MXBA)S1\D0CYG)=S)%@KPPU7DMB15 +M41=_"OSM2[5`P>C->H*W./][12N=S8J?:$Y:V]H,E!K04LC8*"1-U'W`Q"7J&IL +M6D-)UQH]S++[ZG3F-5((6CT1JXQCB\F4EC7[Y9:+?LZ+NVS%E@YA(A:)EW+V +MS4'^;L'>PE699T_$WHO?R=]5&U16]7&%0Q>>BFV9*DFN9TS%'IC*ELVLQ4*A +M)]*DX4`*\!L[!,%?W6)6UB^F8G=.60"[I2@K';@S,1'[5ARAF@[U_-5H)<#S +MA4F7PB'DAJOA-UNB_LP2&YY_;L"9MEQ3I=%HTIV45RQW3,I`3_0Z_TCP'QU_(T(C&(38R31AM%7`0MD9:^;+!%NEFK58ZRM2 +M6-L2TAV/_0=("I8X5X=UOTJ!S8PPEE9N5LF//P+)^=F/^(+_"NRAK``7A7H2VY_H`XI)`FSCPC#L$Z`B]Y:2V* +MGHW'WAV/BL3\H_"3G+GUTK?#U_!!(Q&IEQA1!^)G(C$MX$GTW8F]D>CQ4I[. +M=[0Q;:6U9H$LR`^3TEEA,_^*GY3-")=NI\M*MY#2M'=/WIG8/3JY*\M,SOYI +M%^426DH'O'@3Q;R=5IJW$//\=\N`7SEY9\JEO/1L5N7)761!*I2K#9^\,[,?[Z3SZ?6_M57:*,1+E\H[^P[A7H_@>@SNY5C( +MY?5EDCS//4+P#LL\_I5F&OULA#+%?&H:(^)*=Z'!5/LV^;1AJ2;+<2VKFK=' +M,KF.7=02QWI3L(5-UXGZ\)X]CBO=A)K5\"G>55X]C(B7)W&\ +M3HU[D^]AWW_1U]'+'.&*NDF78=@Y2+YG.'Z_7&LPN=5"5KXCFZ4LSI'222[- +MO`=GSLX]3^W!_`=I@>.C/9\;\ORIZK([;O)OO^,A_S-WG/$O8_0.ZI#X3^ZP +M^?_DU)<'R8P-Z0Z54="DNX(&N^AT=8I.=[\80*W%S*VVY]:D:EP5;#ZW_/W]J5FWVBK2MI#K-I6E+63* +M'$LT?\F\:]-VVZL;M^0?JW4M^61]2LF?3_,DIP%D9S]AJFUF5M5UBRT];1,9 +MWP@R;&9@(YM6R!0Y:FS57;<8L%[5'3>USV@O9IIL-;9;=&^K;K&I0H-*"@T^ +MV'ZJ/9>Y44EY2[7.9@]U&:J#C-%)9ABX;[R]'V\6-<`[#;:]&U.SSAOVKM>4 +M1$_C*+<]NPPH!Z4R-;:[!9?5V76C[>V4PJQ"C<&A*MJD,;AT +M(;6&I!&F.$OMX$,IFH5I$-*4.3C'!E?H*VDGKTQSZ[JHDI::I7/D:%+3X#\@X9]]R=6CO;=DROA3@Z=6\KN +MM1.)F/1L6C,M3VN\V:DJ_R&[N"$'1JKUIKE>O&&4:,<:I_=XHBUK:K$U3D&_ +MY')[6,U>\DF]+K0I_ZNMT6B6*C6N^#NM.>3Z[UKSILNKZ%3%G1B,E0E: +M%G@;J^YF-3SS!9G8#$'+JFVH(0]H^SCBV):Q(D'#I4.ZD?5"^)_&D>=@A7ZR +MRC"?"VZV:1<-%?#$J+)4WPSB'I=BY6^^MKF$-;'X]H;Q&?`VQF&,'V+6CF>O +M)2#=^[UJ[H17).E.&W`PEO*@88Q]]O[UF]>3H,'$QF-W3QE9OS\>NS7)/4S/ +M8]QG9E4).3':E\&F^IO\]_:F,H.&='4.\YB_,"/'DX[B]<:3+>T<'=: +MV4,M""TZ3IXV!.8(E7LV!'JL_CV'`B?V'*,C>TZVH=Y0KY_^HH3MU![,QGN? +M':C]"]Q7X]-?1^TC!P!Z64Y<(^PI/]5V3R\IS0BG^!'_$?@57]O;IU^@%3JR=$[*KPW-=$['[1DG4-Y;!SW4! +M-8O^!3A`SD6COQCM?5'?I^'5:V@E![E:(=>WQQB><^E?U$%YGT6C4;Q#W-MW +M%7]?+YFK9E-<,YQ;79;R'/9)UY-NPE$+9^8&QD_KV:#EG(MS-[I=S<24WA<)>1_*KQ5NJG[^ +M!D)N#+3NVGH[=Y/G]JT^[B;1M]6]A43[9O"D6.U*8;>[RMP<=\QM-CC8[6YJ +MNHI1>_4P4E0R8B";+C7KW[2C0_E>NIB6/V?_[+1&2-1/#_5[QO6)ZQ-W%+Y7 +M?#70/XXP<:`1:;]*9]5LUB]^N*KX#R__Z?'&UE5-6]0//[Y%=KG=-@,I>MP% +M<'%'-?U9HYK!++EQN.DQM\IH;#KG;G(5"4U-[JV/-SVQM>G6HJW4^/BMYV_M +ML!7=9MS2=-ML`6G2*R,X2Y\=*11,K-%5(`3+TT6R0!>>PP:7?B;^U16:MZM> +M7"$+-2&418X-*;L0T9UHUH92[UO +M!/)489Z.$47O[8N[@?8=M@-?M)Z_J0S::(''!H^^K]JEQI,6T#LNM^S"MV\; +M21?2G497CHBRZ>N>W[L?9(:/M +M>:B?T?&\:[F'E&T)MWM`^EA0+LUE@TL6B`]K']_)#.UWS(?6I=N*P^=WYKM* +MQ$&M:NAY\?&=A^&M9>XV]V.W7L4V).%&0&9R[<`5PD2M;APG\@=;.'8'I/QZ +ME)AOAYXL&FF62?2Q^&TR\]`R-WVPMH9TYXMD'IE+K?F0[P=QK.'!^*B(9U*) +M<=3%/!+PT.[G17(DQT&Z29DC7,0&%^>+/UEU_ZHN[=&=JB%RI-NAD1@9.X]A`$?)>^QBB&M@O;@3:. +MX)?E*:-(36E-^YI2+O7?OT]Q(HFFC.A?+$[.HQ$8-YA[<,I5YZJUBN70]OM7 +MY;B>WT9*6L)DWK\TC38O;][DW%3S.WMQ^.[F+G)KX_+FNYLK&ALV_,Z>+2UO +M_F9=0[U5Q+N+R[1AGI!6+X]77SY:*O"[@:#S!D!3L5ED-,VM5C.3TO3Y,*7 +MCC;HK&ERJA)204AO5]6>)*W;[?L1C>YZ;T +MR7;GA+.5=F=*:3`W\J;2DO$IX50EGDHD^MVID1=MR?Y>GL3EE:3$T5,BDI#[NWX:E> +ME=$"F'"!;&H:;IZ]=C\9VX!W>]U.AN-#7.D2?JBQNW-,ZJ,6V_6ESF +M*'"5BS-K2"DC5;CR7=GRU>+S]HQ3^:[3V_;;=6>EYOTPAG.V9SEGB/F.'%<% +MM/?89#JTQGK%Z*9SS>SE=F&;*I+M^VK;>I$6SE6+V*I[)XU0WWQIV'/4G26D +M*N,*\*);+YN:'[-GAH>;SV\[;$^5=#5=9&.]3M`!'XXCC<[%\7WKI)GMO32V +M\7O+D]^>ZA.$D+U9(AR_EA[`+]5/KH(9DR8R!TDI#3-//^@F<[D!HVN9V`W8 +MPP;?-KIL0J;K9MGH.8HK8D:=W.AQNHV>1D^.V^1AGNH&/]-M%+D2U5FNRNB" +M-LCS9C?^$7P`Q&\]N'@4LDC])%C)AQ`X_5T9@SN11#_UYMWV>A._3 +MLU?CR;,J$XRE7+'+@'70G>XJ>'W6P6S4,=FEAUB0,])$4IH:-KG3Q/6>1G<> +MN#>YC[K5LDDN=F\!7P;`X/T)+']X@GF$E!V5LA489DM9:U0F:&T3->UKRKB$ +M#_XXP8GQV.3DG@B)GIQHC4R]B#S+7X%W&8$G"L_$[$0_)6AN8N3]>L((99K# +MCWE(Z5SI9>4?^L*^JO^[_47_65VM\[@929$/S^7Y-UZ$7]==O4 +MY@P%H^Z:2+M4_QT3R"WNGNI]$5-NFWAR!XENF2`+_Z9P%U].]K[XU7K_T\11 +MP+.SPB8/*7K,KI;28,9F2^FN3-GM69?LUZ,>C%5+)@_V[F.>'-?C;CR=CK5B +M\$R/BU?TK2#?X.U[94>*4G+IQ%,[",PZ4@:<@-,(K;=*9-XO;RW9^12,G'EN +MC6QT>W:6[EQW6\G.YITYM[D]M,KM+MFFA9ZYQ[1NG?Y2BU(F\+YRQA32&1*] +M^[*\)FOA=_Y +M6OA]".N/JTNS3JO8=,?#VC1)=U(_^#C,!/4R=>G(JQ>4+^4Z=:RG'NU!RHT6ZS!!UY7O)3\D/;QG:0)?_(G^H?JF) +ME&6X5&_12MZ5Y@)N&EPRY'2)Q*;S*G>,/H$V#^?_^ZU_R*2*WC747_1_2F\E +M2\C_:WHK&=(S/*VO$OSG&7W/^>N9A,[)Z+<7?LB@OD%OS_#\4.^PUM\[/!^> +MW@/2\',]TO#Q7FG8;$7=3?)YDP'U2':>.]X?EC/J%\AQ5\JY^UR]P[_I?W!X +M[I;>8<7O>G!8<]-R>=Z6);+&^UV9>K5R(O_\OY\_&))I4)?,;_[[^0]TR?1` +MJOR[_GK(7_+W\_?LDVE/FOR<4G[IW\_?NU]FX*&]Z0#3W'-J8LO5DO7G7XS' +M7^CUOC+\7/"5X>,'7AG^3<\KPR=Z7QF.?CNAAP]ETFRR\,-I_5F_1SU9W(,7 +M"+RK09VM`$/4BT7(VF&U7'<.=8'VDDA?6QO7B11'="75^\F!7M'>[/N?SM^9#>;[U[J^YWR*XE_X +M(;7TG#>`NS+Y;5TX>&'E5[[+0#T,7#"IJPSK#B[IN#!(R$?3>L]>2^I2F]:A +M]E?+_ZZ]1/_C"U=CO?14SB7KSJ=#GM_IKX3![RQ7PN`)R_]]&$A_!P8V_648 +MV"Q_'P8A:+^ +M#LO>K\":0WW(\L(KYAGJ0^ZYU)>)^1&$\;X!XK+EGN$9.!<>-ZS^ZCQ+@W>6 +M?RT].9<*^&39!F@#J[RS]X)9J5^BC6KYQ^\CONA82? +M)'FLA^8DX(SY,+\"8_R6)7MXA3*F5(#S.X8IZNLC+ROX'M/U\&T5]])Y'O5! +M0[\32^>%Q>"JP27@ZL#-@$#AXBN$QPU.FY#EPP9)\IP+<2GB6 +MPV/3=UY8":X.QHOR3>CW&-KT&$W@G(X+:JB;`4A_IO\3T*8ST:G-3%_SQYT9R4"1!.^)V$OMWL84[?&/_O>E>&G]UX9SNR\,GSTX2O#N[][9?B.^Z\,M]QW97C_D2O#__FU +M[SW5<65XR=?RKW[PRG#WU_+_Z0=7AFM_>&7X.U]+'_C:]ZN^%O[P:]__[."5 +MX1E?"P]]+3R[^\KPHU^KS[/?_QK\OM8?V<$KPV]_K3[G(8S]K/])G"'_^/O' +MWS_^_O'WC[]__/WC[Q]___C[Q]\__O[Q]W_S#^^H;U(LTA`.]0I]MQ?/A*C9 +MN)&:NJV44QV@W2D'F8-TWF*VRKGLZ'*>/,1$G2.8JXBEII2#\<5QHPKR=5N[ +M%ZM,Y,$*GBG"K@R1HQ"EU=`J%6G6VD"<,D.G]"FSS9DP,E344(N7HV(3?YN5V)DRV$'$LA +MS-`20FION_U2)*2W[G+OVMW*W;K=?5NKHG\'TZ^(A+^;-G"KUWXM=OJ"[?V_=%<7$**2)FW5E; +M[:<-'[CF>7X#/4,7[[7'3L>+SKLX-BARGGZ(ZQ$)1THSSL[U_`)"YUUS/7\! +M]TDQ$_7`6P[8/S]]DJ/1;\43YS^_,*:FA,04M`SO"4*^^"5?2-0IY85$/&'K +M75W9E\+6I^J,.ALGL*S*HO,ZO?'8G^/]VO$S>5#BDKB)+6'QE/JQ>.+T<]#X +M!4=2J`M:Z:+&:A=UY0JT*5>H;NIH&FBBGJ"8T*@?]J!&C)!BE_AR.&&G&$NH +M%K--N>IN1[6K6LR!7^]J?2%A:`8\`"L[/^!A,M`._8"GT-2MN)T9"=>NQ.<8 +M4TRY&LE5Y>PP2JX!CUK)M;3FL(3L)VLHXK%6CTE:D20<6=;$W<:M?U<=S50LB=:`'JI@R[ +M37C:/UH[2:*A21J]?RH>&XXGJZ5#CI"7<'J?=[4!?/5MQ#PJ427,F#`'(^%=9("'(V$K`,:R&G5& +M!L'%>V8XOD,S",$SWCBN+O(?"I;C.M=%YT>"WG61)\4ZZ)E!K=I'73HV1]2Y +M4N;^A7D@^/M@AN]=)^'P3AN>;ZYV/$P>-@CYBI7IX!>GW^;?%=3!MWEU4,_I +MP'U'8%SYIK?X@W2?0>?2@_\4[0(?[J/ICQ/C$(_CO,,[X$TUY:HZ@YE%;S,O +M!T\ZF0Y]\J3=%-GYTGG2YT=>_7**<[7 +MZM0LVAG-L])H]M1\OU^Y-44E,G>&C/>A;%GJI#;Y'B64#B%F;HHL*Z&KS$12 +MS549&1,MZKSF.,](9-YK+5?)M_GON89*+[?DR#_S[P??2RT9!'9(G`:U'"=%Z=X:[W[O&UZ'GQ03$UE0\*XJ_V'_ +M9LWM6?2KYJ(97>`)_#3RL>M[__CN5W>A8A +M>NLE^P-DKL:TTN`3.#8;=9)';YM4M.XG;WIQ'-=@-*9NQMOJ&C9O$5I^_RSR +M39Z(+X5*2C'T4<0$>?H5._#O1XJYXM+\=VF1L0%U55%%8[YG53SVXSC>LCD3 +M,1H$/^[M$^Z/$9V!LE3-QE32:,LEPG+?"R-^\C%\4_+H%=]0) +M=*U`3"$O531]9$U2[ON1S_KF*CHP\39@?XC,>\!08KZG5WU*.2&HM'WA6O6A +M92NJV&5653>+BZDX&"HNN?'=*K;`RG2;-Q.S-4S-@F3.IT_%8]D`F]72RT#SIFU( +MZ)/V(O!,/]J64.L2=B30G@3>X40;$VSR[L;TG2Y#4G==6_(^.9`]YIK\O_!M +M?K0K@;4]&#G!,E#[/N>Z"8050JIRXO>U +M1K8YP!S"N6N=^,-:O.U<8=3=3`X;@\>\ZD.DF.+]$B.!LM9-O`0C2^W6R31Z +MX\2`,*T_!?I[8GE+"C>BC(1Y$WAB>_&$^A#JEL"[3]BK11.,;`-WQ03E9D>. +MUP`E-'82!6O5CYT&K#FMJ]2/.DD[_:BKE)H.:KK=U7[B)\PT?N>,/^4[W%!J +M2IK[)6IWJ4TON3XW=;K*34YW@D8DZCH^GL#FJ+7*W,VAXU\1X*?2)\@M/O>+[7/FE\!LTX*/Q +MZCPZR[0%>`U@'FIAC&XG]>9T03[X19Y%S7E7JY0T"K\V@TL8[*)>%8>V=@AG +M.;Z^1N?=&""ENK,WKC$9J?)TD5H$+7S,F$<331H%U+;:`D-J223$D9*EW"O%^Q\:HBSH-_;MZ(VR)F! +M-HI>,8@8(FL5^"?'XIRY16PYUG*QQ>P3?:@9#.%5QA97)$Z" +M%QLL=7CR/\\2C\V!D/=N!G7P0-H#$$*W/I&[>9Y][.DLP;TZ%EA[8*9DL.PV:]92$]_ +MJDT=FJ8'#L,F_S('6B1)E7_",D4%#@_PM"K9D;13:WK<_;3.WS-A61/P7[Z@JCML_.'U*N5>*>C9NB5/NAP?K6[VMWA'G`_ +MKVBC+?0?%\B"0;\JK.@]QMNG9I%K/*#8 +MJ3K@[N%[:HF_IP[U9)5Q%I?9]1.>B@R,H/.C/P8?8I[W1A_FGP!!T58YL`WQ +MX;^/'H(4')72J(ZSBC3ZAU$M5P+NX.B#?"(?8LB71A5=>M%O)37YXRVQ`)]6 +M^55+]C1ZQ^AE2_:)?'O7R)YY&1;%1KT[X[^R9-\.=OC3ZO5$\?;8O+GMZ%1OUIR.Z/AK=/[I3L5&_X^_8J`=Z-4JC[X.,^OE( +M[1K&N.S_8J/^6U?8J*?1J9&-_.HZXEK5NIOAGK^Y\B-7[%2+XW5 +M?L5*/8V.C'S52GUYTDK]-?RRKUFIOT%P_"^LU-,H-[HD::6^ZK^T4J]-6JFG +MT9>37T9L\>H(VHLW7[(7GUU785IV?<)B?-XEB_$TVC4R;3&>1O>.Q&-B''FC +MGXZ@Q7@:?6[$&JJ2$8\L(PG<@'=`%;WR@$/F)>Z`ITSKN`6Y(:4?'BN$WP>< +MLAV>8_!L@<<+CX@Z;Q-ZZ]7OI"3N'*+\;('\&YC$77+$5WA7AJM&;DO4MD7O62G7B5]"OT"U")-OC*"E>AJ]>N3\?V&I +M?G[\S_Q_9:?^G:_8J1_B@X&S_RL[]20ZH4"2CGS53CV)?A9_^;^P4_]JTD[] +M*T+"2CV)OA@?$#C3O*ICLTGTM_$KK=3?"R63Z)EXPDH]B3X:EZ'W,D9^G;12 +M#_SIR,L1?=^S?#SVY/BSSI_QW7?O#?2N.=]PV%X9_N_LU2^XPEY]\7]IKSY? +ML5=_E6*O?H9BKUZOV*O/5.S5IRGVZK6*O7IUTEX]UW!@S[1-^@.*3?H#29OT +M^M]-6Z6_E[<']BM6Z>_AYU62Z(KX9:OT]_%J[QV*5?IXK&3D'OX>]_3]]/:Z +MCEI2W,%W"LQFW>:.M;D%>`OT]*R'LXX8'LSY_.X5F\<+CMB9TR5`$=7RH0*D +M9/'8]1-(QTJ$6T&M`Z8L!4XK8][LW!OK\&J[FX0-M9:JM)8#:OGLLI! +MKKFNS&"YEE^D.GB-=!-(/CI+M;SRXYGK:K\.>KS:6R.0(F)B+(.!J=C8E$JQG42B_S:U0C!PKBI=$S6Z6SA% +MWXGV3!UO4^Y"3\L2USI!6BZO]R[E549+97^H2Z5SU`>GRWAR:I&@3Y3!B;XR +M&$\Z:Y8WS6KA2?1'4V8(9UA5ATBT>ZJ8=U72;6:^/T"B3)P37%5\$R?,X756 +M5^6`8A4[/D6@'AX?,?=+C/$I[VR!I +M;\*2U"H]!? +MW8ZCWFR9&HT@TP<":/=#5:*5^$4ITK-*SL%9U#KLM0$GNQ"P4#QV9NSI6C-[ +ME64J1J=^OH;S<$U&SU,*E-=.N9HN-)+HKR=12Y[<]`1/0CU-"#?G%%J"0FTO +M>V8B^1HI3^U].]+ +M8(_@))&SO8ASGIZ8S^#D?OC2>"39^^& +M?FV>W+F&L&GZLW5>=5B9ZZ;G6LQR-%"7Q.$F +M*54.!FH4#/[9)0P^2R**/J89DFHA0@WI`6K]K(1OT2UF#4@K)JS;#*5NALG> +M"&+S1'U3)ZLNX7.@\19Z('WA+.ER&<.!.\LB5MT^&:`,Y%U5=T%^`\Q3FGZ+"& +M/,J9.R*?1Q=MY*)K2^\Y']0&SREI1BUGT^CZ%![80TVGU+B6^DTG->9X;Q9> +M]Z1G%#A>=[_N*83YAZY:<3L].!\[W2<]^S(..$Z"Z\S0@SL5&YBQQ&AFIV*_F<"]D+@I']*70OHO)Y:LC9MRRA=#>B5[*XSZ)R>*V+(U +M<=,ZR,$NY^"=1R;,3L*5+RMJL+)C"\A9`JU1;@)9LLQ_?1OJPKO+L^#[6953 +ML?LF9@MSUF292JOPSL?0>`%?7KG2A3I&.@)I)?0LTL>.0+ZSH&Y=P[-[@H%\ +M0=<0[=#SU!\'BI%FNDH@T1?&HUTT7U\UV!Z'KRCKT$VV2S9MLX23[FG]#>K" +M!%^%N+(9<."TW5AKTA:!/HE#42_'O"2O%NOK[,U@KP;:L&.5N(I$UXW,7HN: +M+WNLF2S>"-H[CG?`2E@B&P07(?FS%,P_RYF[>3WI-*@/);3(]^'=`1=:?WT?($56__AR>G:46"=C-AO,9 +M7*=,^Z6'J*7_?8BK4./9T_Y^#%>H+#GGFO'L+;?^7#LARU3]U@A#;E3.WF83 +MLJ^LHF=8W?_L!4S/6+YW6&T)OC\:CY=2?<>YG81\5%;YE?3*R^D,I-^&Z'53J +M/WVW`UV`[<>=E'S,]C]Z(;O_?ID2]GRF_/W<;+F'XME'VO_]<^@"S1NY_7P\ +MCN_AN7X_O(-GRVD21HA3/IJ**WX]W@4`>(*HL,Q0_ZS94-]CGG8AWJ3`_X^] +MPY?2R+.\@?3P>BB/^5,O]$%W,?1#,=2/=EZ#=TBDE3`NBF&,%%.N'_S]X._' +M]&$B'^]F$^#` +MT)]XNL=P;0_]6BCO\Q$HU:AM3,14L^[&Z51B[&F<]LE)']=TN9S_^C&S5G:: +M,NKZOIJ2P(>$/`00G(:=&6"+9YD!'CJ$`<+EP21LL^I[AM=!GZ7(/\93K/T#&M)_WE7.'@.W]\W%?\8W]&&!\X35\]YM!M.@@D[[>K^GN'^U&\DSD;W0`_'/[;!V*=<4%YY3>&TV'.9ED> +ME)NPSI:7S]MF?^^<%KZGU0^<5Y%UPRI]3P=#JN4\^":V0:%)G&*_7JG;=)RW +M+ZLNDZ6LFKU[I449`0S;:]=(J)V=1`M&DBN:O'\EVIPK471(_':2<)\#_7S> +M128/PY,8MX\JY]##1K31;)^365K\Q+Q3LTQ%-79'^\HAPZSK&'.>Q%,ZQ#U1 +M*!?S.AL-%SUQE7R2T*&Y3^3*(7#G/9$E\R1C:/X3($D!YLU@-7*J62W1$D:: +M]R21%SR)M&_'J%FQ1&OVTR4D>IL2&I$X)8[STPH2W3S**7&8^Y]&D:.DG&%U +MXIS`-U6$"#OVN+=[MG!KO5M][EV>G3N(8L)>M]*SQ[-E*VWT +M^79[=VW=`N]LV['SCAUV'>[ME\?EKP'^>(=BN@^^>D;ZKNLPWU?.L%]_ +M9;AKQ97A)<*5XJ*\-_^MK[Z]17AM_EKPS_Z]?R/_FU +M\M957AF^O?[*<`OSM?#7ROOL:^6=_5I[=GXM_<=?*\_SM?!_?"U\U]?"?\Z_ +M,OS;65_[_M?@/[STRO`OG,"$1*^^T`/N=-S-/XXST_XO?GSEF7BW<#E?U:.) +M-.4NQ"'T)\9+"XP7Q"E$'[PTE^/*7W7CCIV^V]W;N5U;?;=[=DP/YFJ?9Y=X +M^]9=GB9NJ[]IJQ>CEW%$V+Y]ZVV0V;.C=9=O=U,R,PQG>!N'+.?;VK35LV?K +M%F6F3.=V;]GBV]K:.GW0YJ;+7X+\+;NWMN["Z!MWN9NV<3N_,F.4O_5;MWB@ +MU%W+N";WCOF[N)W>K5B3M;O!>RLG7IXV2NZ;6[?Z%F[9>JMGQ]8MR5G#6?_K +MZ')`[+M]6[D]'M^NW1"^=0=\`6J\A3@6+."V>QI];IB+EUK_/YX=K5 +M)$YTNNF$OU=*HJ>IXJ,T'F>8B8F9J[W>U3,G)A@&XTA\P_`U03WIR_\S?]BNGO_$WG6_QW_J;SK?P[?W^W#7_G+P\@<@!/3FDHT4*X +M\Y[]/U0SEI/]Q*4XALIML(_T0!S4C1?#DPA.%/T6W>O+! +M/?8G7[MGY/"G#_PM,_[BOS_[WDW=]2X5\]0?[_IF?J2Q[X/:(Y_<\/T?7VWK +M^N[8S/_\^+G![Z6/?U)]VZ\GO_W1#?]:%+OQA^]O>OBEW>SP+Z]K7K-Q>_7= +MS)=K]S:(?UU7(>E&'SS7^O2-C2M*,W3K?[!UU;=^;+8^:U*REQ0\7 +M7O?G>7_PU/WA.X]^5)C[D]F[-BRJ6+CTN7<^/3Z^Z6]/U.YQ__:/=[6OO_[= +MEF_]:,:7/Q6?)Z1LP&6[^OS)P%]^\R]G5CUP]K8:WWL/G3ETL==Y[[9_+GWU +MPMJK_O+J??]QY.9;'\KYTS[]AQIUQU2T9Z7_A;GG:[YX;&IS?W!?RB]6_,[( +M>]6?_;EIX([=OVJR6[B""UF3M__KFHX\PY)YU[P\_"^/+?E]J&K1/SWX^6%!^0\^Z.D_E"_]Y#N/W[KR[IN>_L;>]-?O+_FWT]N6FP,_._>[ +MV5?M^<4WWO[FEKI=<_+>/IB6L9U__\3F1W>\^)^.G[YRK.H)Z[6G]W]>/N38 +M?\N.W[YU/]WR[*E'9.'XFV//:+^8^Z=?O?Z]OWZXVJ`?VAF*[G3Z&HHK/_NG +M?VM=]Z.B-^X\^LA%X_7O_O`=]WV9]V8?D.UWOM+R\]^_>2!%0V.Y[.,O?;MY +M])=A3_>L#8?G+WM^?N79&1__>L%BTS^?\C[5I?W9XM\L-"T_.),;%+X;_[F_ +MONW)[ZM&;@FFSBIX:ZOU/UZ[YT3XY<[>DCLVYLQYHWWBV+_?OJSL_^F<^#_Q +M=ZO'=_L=;M_6:]R[;M^Z/?'[;?>N:Y!OZ46 +M"[K6:Y=N%_>J;O3LN:A'S6 +MD0.RD+Y#X:GP7JH>Y"86_!32=.`V4+S#FN"Y0&8:_NH339:AAK0,3(?W=?`$ +MD_'X/J9]\YV>\WSRSOHWV9[SO^<>O3!]=YW1=\@J^*9:7WV.AJ'KW7O`G[_FB+!$$/\9[N<0=7[SSS)"@[,4\RMWMC@L;E+1. +M14X#YN8C7',`T'T$[,5'VT%^NUEI;S_`H/\"`X\*'ES;_%4N^8B)/CB2QW]W +MU4G%_^5X+OCQ[GGB=`51J/L[R3O30/@9]1S4U8_TA)`*JIS'(,OAL<'3`(^( +MW("-,CFU\&H=(0>"WS^730Y=U$&===!N'=!HE>>?3;??H*9EY/KW^7CT#;BJXJOI7SZM=WSRG]CY4K/;> +M6SP>C^_[%-JA(NN'/YI!TE&.MY#G+N+[&?`^`VXJN"K;*^?5]3?#>_<43\`[ +MG\,[GQR-,_K'$H\9GH0],N]JAD5?9V-U(Y[>03MQ*4Y2LDYDPCI'OFFAD>:J-50,GI:9V<#Z?$F98FW+&HAYBJCVX(U3MQA.J!PR.L!O;XZ`&0U!'P[1R4DJ<5*;F&8+.FR)U +M>_0LMKT#2CO@H9U^AF;+DR+WM8ZQYY_5F"QLE:B.+D1-BE*E.!!ZRH[6$!+K +MU:\&41MSI4@K=)9*5R8?%'OL%]Y,YSM$:NUP=8C:$M59C5#ETAD[7(F2\.Q5 +MI8COO1MY'\^TP]Q;CF<%^JY=>VUM58APJ"NVBXCU2^HH5R'V:SE7D.-\[L(\ +MJ']PJC)H9N.6O(IJRSWV"A22!>;2FGPN2%GU',-B=6%&9R]Y<"[:B#7< +MLTJKGLL79Q35$N.*#/K0?:M,-0:1:5NO,0YUAN@C;,UC=BK-=NED\O`1\"UQ +MJ>07P&U<-=-%3+-J&-^L-7D64XB6FX(&5Y;3>P,Y7>!*['WJ2]X\S237\;(% +MGU:*F@,/SQI7.Y*PV-=Y/2M'"$Q_.;61+'%E@N".IHTR@Q:R6-"2U@ +MG1/BL9EQRHG)G4?O\3_7/N,AQJ?<[]51XSYR,/]TY]GO5DO6Z?V^G1&]!Z4,)JT#-NU&#T6=_K-61NOMC9&VI3F=5GR27+ +MU?M"@S4OU9TRW.2?X1\,%3-%CH?\Q>HBQQE_L:;(<35[4V!&0(D-G`I@?*YF +MAN/S-I8U5-&#-!H:I4<^]Z&%CGW-0O.S-96&0K'0\T9!O^$$6@6MT+*_Y%D+ +M"3#)D]P41AYJ:W_(3L_2N6KY(3LC?=].P,\<4DXH+U1!>F^$+$P+^PM01VP[ +MBZ>M:05^X_[&M8V4.QKY$5_9!^C:&`P)FI6&(WPP@#JO3!S9W*]9.J22$S[K +M&72#VH5#Q1S70,PE`.UBRPU^^$;XNX(0>,K.28REE-T/\']\A)CS)5<^9^D/ +MV/+-%F.#2CGE?*\0]`]VA>SI$N*W#1-J%NTU;(CC'C%BJ;43B3Y"OS#!0!YV +M\LO(3F?T>)Y(BQX+;=*8C*<,ZQH(-ZBE9_"&R/E0L;%X0>[9FQLT"[-1+[YB +M@8)ATAEFQHW)\W;G0ZAW>K_]DS<14[XNYI0.2_FFUUWO1=89,@)9[#[_&_X4 +MZ_VKIHQSV4S;S8)J?E[58.A?5<\[L&W_2>B*[]M3WMKCWY/_-V*X_GMV^@X! +MV/^%U!9^.FM/]N[\O^@7:A9FW;IJ]V9!*V3_P7:#P%KK`BW*;ORK9Z\7R'R] +M]?O>]]&R>*E*NM_/S%_NN-_[">"L^_WJN67@KURS6W-[5MYR9B$KE?,/^.LK +M=?.6.![P=OD%>*O>@J=VH,>-U(?8:?A[>K;;?NA-'?O#R/#W#.QA^T'P'XCL +M\Z]'S6"FM!;T'?'W[<7`56O8"FK62ZXVU`N/5D+2POG*R4)-V*!H%F0D"_3-+1,6_VOS +M@^8*Z6(`;6_B^\1LE-209[7OLKWP^U,2\QKW7_/PK'7191N>AJ2=X(W),YKQ +M@L1>[,6`VJP#/*J.SH$R5=(G2IEG(A<#*68)YO2'@@7/X!]@NE71G3!RED@7 +MZKA`UO5H\YV:%RLC:\$XB.`PLA9,X=EAJW)"FH-9TCH^30^HH&5?+7/(LU=8IJIQ+ +M44470AWN#;^LU+(C@N=\]7W_NH:4I$M<6?HUV:31:QTIRF&MFI?1VB]YGZ#T9^MK6Y?D9.">68I=GAT$EH*9]@T&V?4V4I@3-PVCOA6;[E' +M4$4?G\*>>RU)"_%D8VO<(MK:_A;!F8[A>Y7PIY'7@.+2HH+M'B'<(SWM\WHV7M[74AA\N;L#3,2*2= +MB:Z(6T6^76W.E!KYITVY#:CQ<%I3O.Z2)?!O._5^:KY5^A9O,.+()M(<8\/: +M9:%U!0W.5/4,,35CT)#C:O)OTJB&%HL/MP\6Y+@2%A?6UU"MP?O87=&BU.P" +M6XYCG?/H[AS4,JK`0G!B?5#/*@5L4Q5D.#W4KK^-1'\\91/XILK0BAI#4R+F +MS`2Z:`<*+:A7CZOD)V4M'6C#GJV\9-'=3JIX2TWGQDW;3ADJ:PI< +M_]+V+%"#+':A,]?/H%;`HGGR-AG?6:98(4;[?^M)Y\9OM%$N82-P@6)IN)7T +M;RRM>3NT":T.&XS..36Y8J&?+CL"?,M<9ZZXU\#(5]5LW#;#0$P]T*/WC56U +MT6*.I8J5C0*EC(*:%F+;>#9T54V!*)`N`YZ.HM'B,1UOLZQL41N?\E;)A."< +M!UZ>X?\:CT_O?2]/VE\X!O3^Y]K$>8Q7X.G7)NQ^(8Y`.V#'M9?O^?T._$@A +M5HQ910+S)8;V+[T!HY`R;6]-;_R"5T6%T2_X+Q2;W^DP^S\?G3[E\VE=A6(E +M6&6^7@+N08']51-F!?8J20;8[QUC%,A_9\PL7A!>:@LI%AWU+&#J<-HE:/Y9 +ML:;8NNVTX3TGG3O#E=I6FH"*22)O.6T`!]W&L\)@2""#28@\/&I;NKM%S?5X +M,Z%&3XU.GQ*Z:RXQ+:3?[T7ZRQP,B>KT"4YM>X.W;7M=($S7-NHXR:N[Z;:7 +MG"G=Z]KT+/5-<;2D1$HY?+`-^?%N.SF=PZ9J"J3C931LU*J'7D0-EK8<5Z'\ +M2EF^]&N`T&`;:N'^+7!=%#ABG2M+/I[,DRH_=RE6)?\J&?M+H4>G:\`SP/'8 +MOE'%1I^8G<3AQP27-JO[$2&-=95G'DQC;>59;/U28LXXV/)6GK%'0\YD&7O6 +M,J9*F-.%RJQ/O/]>).4PK\D\;$,K]TH,H=>-GL*3P63A +MX+N#(G5DLL=@OHE`U*QX+`/@_.5(IAR/J>)I\A-E:>'C93IXF\+;C.0/ +MW2'H@$,^&-F&-YIP;D'O;1/"J(?_L.`7B'VC1S@9FF&XW3DC>+SL0ZD+>I/( +M:MEFR`G9#/J@'!'75J)-+'-*^!7.FVQ5;:A9;YAC&?&="%$C4A?&Q!KCL8;) +MR]"_.G(9YBK%?N>@J',,*'"/G<*[EUJ6+*3O`/0BY0(MTHF;-)VA(4-;ROIL +MM22&R@!6E>S$!XN +MW\[#^U^0;@!7E[0EFM:=&D!+CUCG9L#9:4"YKK+2:!/:/)0JV;T?J`ZA_/N* +M\*I3UZH77Q&"H6K#*[Q=[+:GAZO%TKO3O,UW.[T_OWN?]Z.[7_=6BVIKM:O$ +MSY>H)(_?9NIV>+P>OZ"QG.ES$F.NN*Y5"K$E:BGCD-HXX*MD;_S@.>?!KFZ[ +MYDVVRB8R)N#()Q)?7O5!QA$5%_8%R_12VJ&G!`)\1KH4!9Y'!SQ/EC7]D"HZ +M,H9YJ>DY*&G1!S_A5XKJY6X_YS_BQ)N'1_VI:IWCGE6R_V'AOM1>$LSO)ZD' +M;(9YQO2&'+&F5?<@7<"K62S/L@"[+FO]1QPAMJ#!S6:H:?O2C<5 +M:DE8;9K!ZA;O<_:4:P[BS2-5^/40NQCDOS.Q0*Y:[S@7R-7H'9^3TX;CIF.N4QL.V%-. +M'[!KI9[%A?OWVU5G-]?2HH7BTZT0?]8%,[KSYF_SP:@_FG2,;B +M4P8;T1O*62:Z;0PA=1E.3/3"V(UR'#`-/:@[HB[E)*-_';_&2;UN?[7WJ+_# +MJSD$U,*<$8Z2#L-QJPIX&U7T6N@!U3O7*W4C)3ZIR^:Q?` +MNW9,&]ZU<[L[VZK;E-@VTH[Q1*-S]+B-M1UAL1WI$.57Q%DV/ZV2('N$J +M.PI8/LMD$]65\=BF<<0`Q/28JY*=<\$L#D`.77E7P4`P,;8JV1D7\IV6XS-8 +MV^)WVC.$E+)4$<:F9\A3;'C&GGXVI?B=UE1/JB&''W!U>()%^8X.=[\85FS> +M$&)(VN+$.87W+5CU9].134ZH?^4ZAG4_UH9[+#GOHVJ^1BPHCS/HY0 +M2X?]R[?T[`<1?=\':]R`9VA)^EF7E_,.^Q'_OA&7O11H;8*?/NHG):-AHS^M +MY&]G&=;E)1SF^P^08["WT#;Z8U[9>S$R[,?;^+^`=\]%3CGUH@UO0KIRQ##? +MW]4!4K3>A7<=_R"D^0_8F;#..Q6[;2JQAO19WVN\FK55#`=(R3;I*/R*X>%V +M6K)5&FZC)8T295U6(?!B'5!*D`-:@![K)+0:FQ)^%O(RDK4=;3#@+PV3N53N +M>BC^NW,1Z4D!YC2Q4AR_3>ITX9=+;="Z4Z:BD +M6HBWEZ=BZBE&CK9-Q<@4P[E\-@TY4MV,,YX-^:>YMMS2%#AS-4=RIPD#RW(6@( +MX=K%$N,K;XK]^6]>6I5"S>![>U4P`%K?BV[;)NPE72&TTUUMT'$D^O:$FI-; +M?^930;NT"H]E3DR?[2\P +M,D]OY)GH"^/,H0Z4WD&Z[N1.1`CWFXB=.QX1G)_U`0=5%`*I[8:Z5PUOM/VV +MC10;V'^V=_:2TY7LTC9:1!<=7P6<1I%0]S9Y.-]&"C=6\*^'^D-+ZZXV+*VQ +M+=W4=<2^\"QSA)262LNOHF%<7Z##[]WM83S*X5313=.J#A21B206-8`M^RM8BF'FM?[(>V^ +M<<8XW*J*=HY?OO%`G[X*H'+-^&4Y'W'!S$+`"T6)N8_TNSAY9PIIN"5Y'A?E +M?J3E*`-40/X1)F'O]R(DOJ))T'>D_Q\[U5R.R/O^$/'VJ:V_)Q=!AOW,1\V& +M,`./RJR7C&PZQT3_$L]DW07HNQA7LSA":85Z(3U%N:B/8Q,\]Q;=:&0+2>0? +MNI0_K.3_!/)_!#+FGW@R/T6DW%,AFT9GH`$U^T?M[X6_9>-=R1;I#:?DQUM3 +M1K^N)%4ZZ>SV(W_]8=MI_V$[/2OY/_3U"_55)QO)(E%Z2;@82NU25X7LC>_^ +M;BTU+?,2TPM>$SNG?,R=IL[-Z"C0L\LZR$%#I2KZTW%J,5A/N*O<*]S(VZ&G1#Q]K)D2HV:*CL.-:>YDG<6:[R7`=<]IZXZ"[I>F)M_8JJIJ,@ +M;?:#%+,]7L7R33_A>YP8[FY39AR+*X#Z2U+D([CFNS$7QR3>3%\JG0>I1C#$]Y?NZG5=T@$WH\JT$BU,B!;=D&E'#1ZNXL^3Z>F!AO +MI_=B:"_>K&["^JJ&=-M^W@ZU;+H;XE*WH51KBK>#GV_R\]]@B5C.#K3UP.QJ +M&,<;A8U3K6M;:RM%_9+JMD`=`8Q9W>Y?RY08)6-@$%)DGS/LOT&VCX6`)P8ID:<%4R[H9E:5-&EXZ)2MP;%NK>Z1*^4ECG4 +MZ!QMZUF&NA9(>^)$=_#2:H`W:9$9K6]>]*IEE[]?0X>(Z2,OKG)D2VOX?L6^ +M9PU?[6=*5*L]GW' +M2'V?1=0E;#@>^^-$I=C11JT=/ER]0%@FOK`X^85R@?-58G?X72^ +M7T>B??G.>WN+>/TRU4'U@>DYS#S-"1S,X=I1YM"`*F-HSAI.)'Z;^?KP$S#G +MCXPE0B/24GF`6H;4P'L>&IN9S%,6YB%/Z%*>8N#;<8[C6M^QI!QO3NS7*'S[ +M-,]N2:[W>8%'*(>YK]?GY*BUB;M,`PPSI(KN&./E`0WZ6L8<Z'Q]C=NKBBX>'50LD!+-G*%X;-84 +M^K]CODK"-^>.:M!:%?`*`_R`LD90(J*UYJG8K\1<-"EZ:F*=2D2]\GZ!VHB6FD3[G+#/%IGH.X,EPY +M=JJCM@SU4J$]W_"Q9KSS[VDV-Q,3^E`'"$(DE%P_05[!$/;Q=PB(5;H0JYS6 +ML;N4NT6XVKB-Q_47FR4>Z\=W??AN\ZBL6)I^-RQNNP9F^B_C6_A7FT7`$6N& +M7'6)U3J0;-O17J9K@N/29)RIZF3,W5-4IM&+XRQG%07@IVBX`^V;&%6F]9IN +M%VH]HHY:^"H'W[PO7B^4D4`[@H/E^N5&SLS@D'_89YRHK@/-SO +MM;+4,:+`ICZ^Y(IOE8$$0+OZ/5V%6`[F6!%7RU7;$KFK`!JNEBJVWLK['E/X +MI1Y?J,4JSLP!G*;V,F80=$;V"GV8K*VW!^ZF% +MJO7MJ1EH3?(08KLB>*<(^<>9?'\#E?%W-KL-QM:,VK<)T>2V]V=NRC<8:/2O +MXQQ@S&S\5O2MB5D1I*\X-W&>3LO6MB0]QOEJ2=J[W@USLQ6>'GA\LW'_E(G. +MFI@GI(EZVTE7@O?U]N&>=$?S#L`4):/Y$%DN,@P[T&R=X=I4# +MSY(ST<*)%@.ZLR9T28J.R+>&(? +M/LUIRS\*=.EDHT8(>>AR:GK,IG>$0";!DI8G=3],[RF,],76+E=6_!C@$W'= +M;Z[4XZ?S&//GM5HI"^C^^W&SN,KWGT`A5GDQ/47*AMBS\1*1X7B0D&R65<`Q +MW="2XONI%\CW]6NW0"/"*O1X;1/>ZX[&^>*^':*X9JM0LA-B@,>3H=5]L_X.0`C6\ +MV*XRYTJ$.^D^%E#L\7$76R^"SR!=!'PR4XK'!B=S909BL^5C;;AO`'F;`%-Q +MT!L0*[:IE+AX[#>C+SH/>'Y;]Z)@T[J6`H_?;7_+K[4-'?"HX8L'W'*@5YB^ +M,9DOJ;@H\(06+XV&1V4O`7[J*4&W!=.HI./D%KS=IU%N]Z$U:KQ1OFM,#A"Y +M558I9:@AE2BI6D6OS-8QM("<*M'#?)(6J:1>AG\$]0K"[#^A<4)M.*4V +M#_%H-3M/L9J=$\;9@IA';%5QQWQ`*:?V"Y:J:;TV:']^H4P/W2>0@*6*,<]7 +M+$(72ZYV:G&UNMKQ6QPW"2-&+>L4N]KQV#M3])(MYNRSO3#CU)(?;>YXF>B- +M\5Z_TC=>K"'TAGD1 +M*)02YYC#,&EL<\*W\IA:$";S-'OOZT3Y)$_"7D$<+_IVM"SR]7B/*3S8+P$_ +M3L;>FOI`&4^WP'CZ]-(=4&K4]?&\S=+1,@!2HE8:`"E1+?5#V^BI>.S?DGH$@V\M0VFZ[#GGGJJ6W5 +M!7DPNC>.H>R9)GVX#67?#[?I"BXV)6B-W#H6^5#LL,=.?RA"K.L+X(47PS?( +M`;."J4NDCG8&9)#9$M.^2+BFYA0Y94@5@^7KFICV,F'AVM00QO24Y^RE[6T- +MM#15*JTSU[8V-#=LNXFV^^"Y\R:U3-M-:P,-N$O3T6YT=+16MQ?4JDMR((2W +M=DE[OE#@Q%MS^F4Y;4$+ZI#(W[VN[9;=W6V'=T_&'H492TVH@6J^/+TF.+U. +MJ-<3@G/?DKQ+G0=\!0,8X2EM0JY`F0+7+"S:!'[#=0M4*>R=C]4[_#?1%?8J>N3OIGOA]FR(73ED#? +M6M,*QIPAN?P#VG?/!+5O#^'M1VP)$Y5&B/FT9(&9GDC_`Z2_<2:1#BV.#D#Z +MR\I>7ZWT,R$4P+4PH0UM:KK]@D9SYE@@9/ZU=#'P/7.OI)9Q9Q@E@9]?XD;+ +MI7SC(-#7JR9_).BM(;\.]7]XYT/.N5!J$-I0;^:DYO;NNAOSWVX_9<@M?[KA +M;UV_MG=)09A#)LZVN5^K'QH,U;,&D*;23Y4TJ$MTDMDP$`@&9J=B/ +MICKYX/Z@AIRY/4(.(4ZY0[BC%J!\W44QU6`P<>QD[*JIBR)JZK,9+KHNB@() +MV5&WVD773D$G=K8?U*I!WFA>2TP9*Y;=)/([:]G*ET)<,5WV4K`S]"!Y6.'> +M6%_"NG-G4%]*)6+J#`9#2*N#Q):O'O +M3P1":YTP0\)K:BQL85MB)P]EER;2OW%ES=NA?H.NP`_CR.^]7DCC0-9JK/Y: +MSD82W(AK;70!KAOCJLUR9=4F6!!JS&Y0B]1MLY%BP::#+[F9>3IY.NYJ)2[DIO/(H?GP=B'(?9EL +M!N"I^B5(&3'?G[:=T&0.Z9IM9$8R-]`315]18SP>^_D8G9?+5=HVA^:I,KCM<+$C( +M'BB#<%SBG%X0D`6N2Q#N0X6+O2C@R9Y](%_O:PX:$B=\$$MK)Y"Z<2WIR?`.M_,48._Y&G-H!+RJ#X![[:35G!,ZCAAH;;5(!I +MU<9A7ZIF4+1[$UVI2Q7TAF!_^]9JL(;OGE#;]##'9O37MS`*-E-K^ +MNQK]XF\W,->0\,:;GN=M0,F8^<1<]]9O:@BW(9C/ZKS4:&"KO1<#OW`B!W`1 +MJ+Q>>DX(W0DS6M*S+LM+`5JJE?ZM1;=_<)^M`'4FQ&/?&,=U5&?"A'$/FG\D,U +MMWATC@WN8ZB_)GS,CUHH?P42=#QF'G\`ZZMI44;7R>;]SEQ1[]:Q_3!*.IT( +M9;D=N0J^6?*$["FG(ZWW(J56Z/-WUOH]-FWV$&K*JV+Y$$A583Z4!E+0H`JQ +M17UH*M8UH841O\P[P(G>GP`29\_*+>I@#^+FDK0QORT;FL=H$M +MECD23F!FQ +M,@&L7+4AR]EM9R&M+U(BX]Q%FG_\*_3YS7`D::-B4F:J09I!7G3 +M'F^Y_#.O1=&3TY5=)CWFSV=SM>:ALS!#%E]I2_?N@QP=\`VU/\=>S.@.Y"[5]H*:8]\>LXDF?5GY"P%%_$N2.4%L5 +MQ!RJJU]J]?^`9THR)8LEP=\S@,N01\D$[D.OK*KI9*N?EJ1(J"%28\JR`/T? +MX]BK@*-9.HH@#]5:*S/:/]<5*8_S;P +M!)PE&.BTIX7U(%'B2A/BF2=&I^<8\'RJT;-FV1KYS +M,C8UPNU/X-_VD:-W0D[EY,WT*;$-0@;(MG+@F[5DGFL)8E.4V$AXD1?UPE6W +MHY2R"K`'T2;D;-F/7!G>GLX(*WZ@MB_'S5Z,4<%;D#/E0V6UA@G?VJ+GSD=P +MQ4<5GH=\J?J=")ZVA7R`.8EF*()2EUZJPE.`;02H'\IEKT=0Z]BNN!JXK(PQ +MM%&_(TZX?XU4]E4Z2?%,/S6F+RP_Q21/91*R2).6E7M5@6G>HCGDH+^LYHRA +M6#[H7P0N!VXIN"RX"\`U@%L(;AZX1>#JP9T';@:XL\$%[@/&AMJHAK`1PD16 +M&TE9BH0[)2K42Q;5(S8Y#/<5P2IUEJ;<-]YDL\#L79.YB>:(@ +ML8Z`N`9E")0Q3J0G9`MI-&S4U@+1JE%GA11^!P] +M\/4IX0_X+-/[`A&9:.:(S$-9AT-H!?D:D$BB&2-,-'?DO=KY"G_,#)'B''F! +MO%8)T2%:G";?D?0SQ6KY4<4_9TA5W$-(/LA8^9RE(\"4:*3^0%`[,(M:40=` +MVL11DIH_2(1\SDJXDRT4X(>KR&U)JJ(N_A3XVY=J@8+/9\P#:_(E;%M@2L,B +MGY:M[,1E2#3ZQ[@Y4.DP*VL&6GA_(]#%B=AX'/5I-D[AJ,N"T6SV/E=K]J>8 +M2\)I[U#X59D+PXIFZNAODNLKZ4`-,\PC$I;^I5+ZY])/4%,X\-(3L>UQLS_# +M_*&TTQN)8([WE1S#\/Y/XN]%:/3Q^-L1U(W\9D3?]Z,UZ@K$)>H:FQ:[UK7&CW,LOOJ=.8U4@A:/1$KCV.+ +MR926-?OEEHM^U&)D9HLM'<)$+!(OY>R;@_S=@KV%JS+/GHB]%[^3OZLVJ*SJ +MXPJ'+CP5VS)5DES/F(H],)4MFUF+A4)/I$G#@13@-W8(@K^ZQ:RL7TS%[IRR +M`'9+458Z<&=B(K8ACE!-AWK^:A2U[KTPZ5(XA-PPZAS+EJ@_L\2&YY\;<*8M +MUU1I-)KTI88T&7MAK`1D5/Q^PZ2:G8@]&$=\\L::^3+!5JEF+=;ZBA36MH1TQV/_`9*")<[58=VO4F`S(XSE +M54QJV5Z16GI=1*V56OS3>-/KG8C];@JA531I;M]H?A>HX<-3\=C&R:AKNOT+ +MI2A0OE3@&3422";*7@["^_=3Q/B9ZY5(8F^S8G9"?RSJAL3YC_@"[ZKPIH3. +MJ+;D^@/BD,*D7EK$(5A'X"4OK471L_'8N^-1D9A_%'Z2,[=>^G;X&CZHZ,)# +M76X=WL]$8EK`D^B[$WLCT>.E/)WO:&/:2FO-`EF0'R:EL\)F_A4_*9L1+MU. +MEY5N(:5I[YZ\,[%[=')7EIF<_=,NRB4L*`QX\2:*>3NM-&\AYOGOE@&_2>?3ZW]K +MJ[11B)F_$?]F_TKF.L/=P$)UJ6-VVT)-J/QE,US +M[J"6.M*=A"MJF'$3M1C,8Z=S]NC2ZO?H,@[LT66%]TSKE9I>4\)^/8GK1'VH +M\P;'E6Y"S6KX%.\JKQY&Q,N3.%ZGQKW)][#OO^CKZ&6.<$7=I,LP[!PDWS,< +MOU^N-9C<:B$KWY'-4A;G2.DDEV;>@S-GYYZG]F#^@[3`\=&>SPUY_E1UV1TW +M^;??\9#_F3O.^)@=U2/PG=]C\?W+JRX-DQH9TA\HH:-)=08-==+HZ1:>[ +M7PRYIU<.42/D*?)23?3X*8.JZ^6UMQ@&:G#MR;7XEHZ;_7G^A +MY#2`[.PG3+7-S*JZ;K&EIVTBXQM!ALT,;&33"IDB1XVMNNL6`]:KNN.F]AGM +MQ4R3K<9VB^YMU2TV56A02:'!!]M/M>RA+D-UD#$ZR0P#]XVW +M]^/-H@9XI\&V=V/J_X^]IPUNXLBR9_0MR[9D2)!A@!GY4\9D)=N`S;EVA42, +M)!O\$=@U']G,6,8>&0>+A>1,-I62@1`;DEL;DA20[,:R0PK"Y4[)XES8BJ^< +M6^X.4KM[$L1;X?)C1Q@OR5ZR.PGDD/&'[O5(!DM7MVQ=7=TO3U5KYG6_[G[O +M]>O7/9KNUQECQH,-2K-X593.+C_LZG)K^-G5WCU&_!ZD(:MMS[E8J[OG,=MG +MBB492Y1&ARQGN]+(JKOE2J1%9&Z&W.'L5BA7:@%2%CMH1R/;/2?M4G(:I^XA +MI#1-AMIA4&JT\*O5*-6.$US\1/2FFBYTNK.I4V/\8?5EM-,WX+ML//)B_)^C +M(X>RPOA+#I%71!VTHS`RZ2EM&U&B;=KBEI6\2I7N,("F6C?G^?`.HS@?-6[? +M^3@O-1LQ-VZ7?M5]?BCE0?1EG;I[>_9<;I3*U1+%90_@Y@3[/W'S*>N33I3` +M7V)P/SATM]BEHF!N8U5OD4,H<`G(9O1;JG9A[^`PMD]B&[OG;HY+2:=!.D/Y +M`/[!))YS4*X15&4LH/V/VU2/C"YV(D9F6;<%GRZOL#JWK&DS4R8*YVZ<7`"Y +M<1R.Z828VLG,6@1O]YT^.?V!CT=I;AO,8"PE?N-=ZMT7&QYO0'ZCB8K=>6Z& +MH3H[8W=:$K.'>_T8;#65."=`'-)1FDY/Y_-!#7G9F"8WD`.=2W0&1SJ%F$WH +MP'9W+6'=9EL@Z6V6\DKZ/OX8VKSS<]0 +M-SJW#HVD.6U;C]B,C0>4C)["&KJ]^W'T6=KCH)O_`9I)5-P>1>>N=>M,&FW$ +M1RREEQ)B_CT/T"[L;QGN_QR;Z[^N%Z07]U_77W+EF4-!5*0+:3O1N<4^=^1?,;EW7;Y:$\=NK.,Q-( +M_-%=G3./A=%,_`IF@#1+B.],!(?U0TJGO(8HIP&K%;">N$LZ:58_C,^Y_EH4 +M1;RW.#CTL/-P$.7)*06[P+V3M908J-/L:0[1A(4NI#^:O*JG_);K+,TU<6P; +M,BF.X=.=H)E[!2_3AGJ53GR>DSJ@="NJ@Q8DKHN>;AIO4@:#PP@)4/Y&U^9U +MX4<1>FS_WGT[GZ0W>Y_<^2-Z<_R@)'%H@1/ERED%UM`4F8`MD$VMR?A7U<1HMH\H)4K>LW]]5>F*TZ<'^OZ6_9+]DA.A/GHY +MC(4T(F,P1FC_/HV24QGOO%J5^^M?_MM@T]XJ3[/\M<%F@>4XFQ'E#+(@%TY4 +MCF1,*"]G"$T1SP`G8QC/=<[#YK@\'F[GH.?-G9Z6G)T$,]@RUM)ERVEEFCVM +M2UUX3+H8Q;WTW>@2EXEBV,4N?TD:CU:H0\LH_^JO^=ML=_Z^NC![G"4%'?LR +M^PE(=L$F`T]8#:P5?JW0/L>C:*4JA-\%3MR5OD.*Z@F5@$L]'`6<"HS3%95. +M_1A^"<:^=^TP+VIP;L;G1A=#J(2@'UK'RO%*"V@=EA-8G+LUFN9*#4[CC=!!B`Y2N']ZT_OOK1T!F%R6YX7$89/<& +M+LD>E9WL49WE9:,EU!%'>I@0K#9MZ"PO/P5O0*SLY&55Y>A9_EW'6;9<4.6B +M[ZP*42X=3[D"+6^UYE.RD_[55E9^ZGKK>(O9B[]A,*UFKZN#DWYU\%O32@K% +M7&YK'?NR% +MMX\5)>$\RK]J!?^::K"#'#WJ*`#NTFRYH;&.;-;,7U;)1B_P@QTG(==:[AEN +MH.5A:D=";@C>F=C=^!_".%6/32+A]\TTM1M2?CZ!"I^$ELR)M@E('(BU"N3+ +M:SGB^,9JU)?-HWR41UBS`>^5&*;P6&R"QVM2$3/!DJ_O]Q)]%WATRN!`?:C8 +M$&T4E,-U0?6J!?&T01C^RS]-1W#JR6_=[]U81%?LYQ`1:MK+H$5DX +MG\JC&-PBK4QK'D6<7$@1%43?F3!YLH)#8F4,Y5*U#PM%@F_WJ@[,O47B_I.[ +M2+C=C+E9$:L`^50`=_DQ[/-NY<0C%'KD9ABG+<5I%3C-&$MSZN`]6\-CZZ65 +M]C>B\,Z;B)X9WB^M(6FZ.0'E3+`_O!EO4SIQ3CJV6?ZAV)WQZ=B=T]-(3)M$ +MH@'"/]Q%XD.3^+\'/]B[M!J&[VYWMQ;WV^^T,S2-1 +M$=4/TXE^%`6]P=B79]A-[$8K7P*\OUAE8"_L0N8](93_CYZ)MLJV[>[MU1_: +MF=HH\0U%SXL;*A&N3UH1YW+5=F>Q@\ZTMCUKF44MB1$ +M"$.EU&KEZ@Q'#4"/&X0EVF4`D?"L+M7.@?2E,H!`=W<82Q>P*_@W[/;P(BJ+ +MMU0?0Z<:O^,J8C5`67G(O(FKPK8'B5LDS]H-,W$[4[`)":N$4CX;9LOJ$+?# +M*-`,R"FW&#!M,Z5"ME:KS(*:`CO45JV@D2`90'JK3,@'&')8'W+WH/K&CW=5 +M\@-VV:=F5M-^U%$*^>D9?8)O0RA3XCL]K(6^L7!&FXA7A#12/!'&/KZCPY6) +M]BY/V/*RA`[@]K?@.*F]\'B%>1"GS>XB;%DK#&Q@%S(A,[-+&2+,%2'2O"8T +MX#%YR@1D+@EQN_"J7AEC`4NX0C!Y(FU+:X^BNXUX;V]]FZYIK/#$6^`RW!I)+T"N\CI!5/;@#T]%&D;VW72K@FKJWO0MCJU2PWS<*QI1![6 +M[Y;I0BIX3[=Q?>6)NF>&7*YN>UL8T +M_1'#KN7[P'K8H&Z&M;G2V2T"XPW@?\08M=#D=7.,M\EKX$Q>\FP?/)-]#$^; +M9=?H"H8%'H3\I4V_@2>0.'$VP.5R>.UF`*Q(]C1:28:P=7A;TD##=,!+O-UG +MSP_C_,2UY7CE684)="F+[S%B&M17>Q9_O.A89KUQJ;M'#['PGJ'E49$F9.*T +M?(.WB5L(]\U<@),+)B&7:X8G'V].3.,YRPB]OD.X4L(T:7Q=HJ/N7'-^_D4 +M`V46A@:\J"@O?)_ZK`3U!G=6$OT92?2K_QO]LCG4/S^%1V:$C<2FZ?0RO^49A??3@>'Y]+]@ZD` +MV-E%(9,7Y0S8Y6$M]-C,^D2[!KPX5AXV>7'K#G@-[""'5Z=CJDB\ +MIH=U2GY8\+S!-W1QMT(JN6CJ[&Y\@A`JAIF`FP'NK6&4_W)Q!XK-3H#_B +MY"0OC;J%,.[$[IR((>&/TKCS)[#]7TWZI'D,YG,N?9?H9#B4`G^:`@L`Z\_+ +MBS*NRJ@TQVLJ;5A]27]Y$'J"?*V\*'IET$Z$Y.7R"FP1XKNFK^)_@$L4@JQ3 +MAUQZM+#J*WT*M;1QN)RG>R1^M6FU"QCI7].U'N +M9+4LS*;ACD;=+(]L:I^TQ^ASX#F2_=N67Z<3DB]5[-?H_\J'-(7^_WQ(DZ@_ +M,NL[&I['2'W_V'?)N/]G\8F57Y#8]Z^O/U+0'8RH.H.1`@C!WG#DO?YPY'PP +M'"FT8I].PIC)B'TZ'[A^?B0DZ.I6"#%6C+S? +M?S'R0?!B1'PB[BL5OY-FHI5?S/K5^A7VGT4?'T>05XG]IX,,L;\LA&HCR7.XC>&-=CO]V)M-<3OK:P/VDYY$%T'%<.N(<2N/K02]<[$\^XON:_H)Z: +ME'K*_DP]=`)W;GY=(@Z/R]CNN7ZE>-8GV6@SU<2<1CW:EW_F$)Z7OD%8>D?,\)]?:)N=<@_OGY.O2308:3] +M"1]FF':XHZ[QRPC]8=8?VK\D?*S-^E:[;?G+^$7ZGXXOQW3I"2$+U8^E`/8!@=EWS2IVT9[Q]^T/=& +MB,L4^B,+<%\8-&Z8V\^TD*4^LYV)<-;4O"W'D^&^U+PQU])ACVO)L.OI*1_E%)_10JL2>%7EE+_ +M@F/)\&@*O+0O&1Y*H>?=GZ3(+Z4],OTI[9G[6O5&9"Q\N<9`Y>+U(6 +M*''W6DAQ?;0L4.XD16=TM7--@(881[3,61&PP=-WHX2HGR+$JJE\9W?YM\HS +M?CUC[NHZ>EDU-8KH,W[\%800WX\B,2>VK'8;S7^O$OM9V/O67B2RT?X?X]U# +M"^C"+NP5/>25,3VDVA'B"IP5%-I?9U7[\&YWOQ>O[29%(X1E4<;5T^-"A%5M +MBWHPC,2"*55B!8\!2IJYB=":I0AM[J3WQ5>P(/2F`I%?K4)H8^N3]R(A?>\^ +M;M]3>^F6=JYUK^1G!Z4)L2.[N>4^;".P2[_(CIZL+_T]^ZA=!B +MEYO/(D@?_LW2VGU.GK#@+Q?B>51D"B^L&7CFB!U]:J#RGB%,>*<$,NDW7D'Z +M30W9+M2P[4[WE>PK1M*7BU/QODC3%=207;_MF^X>XV6C1KO.%U^]2OC6^29N +M5B;.<)WU)4*Z_$C;2)1HZWP;\/I[W]"MW%P%RD&%ZFNVC7_<\7LVW_L^M`Q1 +M>M!^YVHL9XRE*3]/>T<@KI]'-"K27^KFU5)YW3Q>2>O;4#ZDH.HT:D9MHUT4 +M);.H?6Y?[,[O8B.JR4\60HF/QDR4F<*KT<_$XJN<_YQ1+?J!:JKYPHOSY<8P)X5I"87.)$,RN[FXT%[H5..O:UK"4&!(`CKL +MJR)+:S630&W3ME8/-6R68$-"%!9)\6J]9'?5/JFT7A^TMU:S4JZ)T[=5"P:U +M>9MC0BGH-S>HUQ'Y1\YC2Z-V",!KLICK0*$\E6U5"EY'$=:*RM_0.G$'."'; +M2L*G^K.L,N'HRJCT.G=`$$98O8YH"Z@.RH##0$_UA\O[(.SM(^$=_9'NMIAE +M]+3I]]?=+UD>YX/QNB%6(1=&:X*0'1?4E+(9?!X8O6XVV%SL=8'`U[JF:=%G +M6PW&RT$BA1D#S<$$JXYZ$VL]+0:"R:_0< +M[DY]9/K>RGL\LK(<7.(3GK(P]S?"I90O9H.7L//I/ +MD$;TT>]E_'[0G[;0>5[O:G7%&9)E#9Y!&9\Q'WJ.EC+U?&9)O=QP@FFH_["^ +MM91I*&E@#$7K6`.S+M[0T'"T]'!#_3I>.JWYNQFLCC7DZC2Y)#RB_S:W6Y*. +M(D$8F2)2N2=S(AO3&N^30O'4?O-(N2A*H<%&",I&RO2,@60TC-MO88(PZG"'-6KQY^Z-Z#MY-V:18$-MO.APKT??NEJ%J'1?(&B2SZ +MIJ./$^/1MQ%],G'P&!+\&'W%;I*_N^C\.=,A7D=[],%K=@9@I,)0HJVU"KHD +MJGL\_%B?I%T_)M$E"$*%7A^WD$JE*W2:L>0$"-]TWFL!YV%O5C8-7>PT8!Z_ +MDIP"X7QGII"9G?8YR=!74)U41-*,7STUTOU"A$K3G.K4:ZUN^@T?A$\Z.2UC +M&E;<4-1U3C:&Q2?^MI,1Y,4]G)J>Z.-!_1]_T8 +M2T^)ZOJR=/=8-+F"02@@X=0^1A!<^7K+O,F6L9X!B][U&WD)4MT_MUO!X'41 +M2:/'\#XB/-OYS8&1DJY+*O7G]\*HI[59QO4M[`GI)*#4]C$SV>;)=T_23",3=`C-:@,8V\&NE.PKZ9%OP0][P!6Q%\S"Z$ +M9!]""0QP47L1U&X$E=6DMB1T,1F-`=DM34Q'W>J8W#A0G?1I?[.L=E/[$;2V +M6SH/ZABL_5.QVF_H)(*BV.UFT\Y;F'QP^KV^HI9SLK%T+-;B6"AP+,C>2/?= +M_70L5O:>L]S:L_3TXH]Z_URFT!EU>AP9WJ0PR'%TRGMI7]&>LO0>+]?KEM0Q +MS73M%O;^82:5:L[7<_-@F]ZSU\4V0R:A +M%!SOWBDU^G)[.)>MIGJD*`R3G14Q_MI#PKZ]&<'[::WPU8HU0 +M:Z^E:7RN%U->N_IX^:A'E]3I=>LMZ;E"P:)'2=AWU5E'TC`T@MI4J:-:ZAQ< +M]9*Z]+QD17)B5)<>&-,"7/4CI1[MYP;&17!,I%]T-LGWK?1+\->CI4[AXJHY +M$^>(6@UC&HJZS\ROL[CFUYD.,2;7M.G6F9;&U;-+ +M#:9&(!ZJA9<)T-E$/$76N-4DBWAE08,4ICM=%-YE+;+$>043];L.W%WN$8RX +M-SI=3@_%"*K<.["W4JY2/Y\["?V#L$^--7F1\] +M\9VI-QI#%*Z)"%J]U3R4]G"T9PH.#-)I=/5$ +M3K7"7\U:"!GZTOHBV4DN'7?/>43DG;)YO),LS%ZXN0C.RN8-R'O15?+5%85N +M2/F0F9!9D%:_EI[>(74;8+968YT-<0LW%(T\F6@U+HS#D>KQL:E[][I/HW[(D1XM_./I?S^I4+` +MSNGEU&J4?332ETI]O?TC*]5I20)J?2NE.QUQ&1\Z?C=]J+MXT9'I][O7+4K) +M^'!10H:L4IY17!G)6%?YP?3GW1]6_L:BRI#9-1G%]MLSUMF79WQH?V^ZSLTZ +M"AWUCE;'.Y+6V:'N_588?ZWQ=1\ZIM<5+]I8MV[1QW4?+HI?+:NTKFZM?,4Z3K!4*@3>3FD; +MUP%61ZG&)LDV59/#9_&5@]LW@^K#RA%,=J/]10MQ,@+5K?`"^BCF^?KR\Y8] +MR"B:"UJ74GSXQ>5F3*&SLNTR)^0Z2?CSRTHA"^'9R\]9HODHACQQ6=*9%UX> +MT]A/I<'J+*J"`0D^YBPM_<>7"8YYXA@9AJ+YUI6)U:,23,6B0ZQV)'`2M')1 +M2#5GBHXUN.:*+XO59BE4A:5,N1SI'AVANGM)^,7+])39AHA8W8*I1#C9R1V@ +M5@166"T.KV.YA>HM)`8JY]U0@4ALFYB=B^Q,L++--F@)N=>/L( +M,I+J_A>\E'IT>^9A/2,]*BVSN"5= +MD6=)]"?Z$_SC+),+J.ZF;8^>?33M,4H_W6,M+O=NI%K^O>N\N"M2&.D^3^51 +M\L6Z1&/*&6)4GR1AT^4),TR2!.HD22M+6QWRA),VF'DS$_#5X$TD9O]Q##2RX2/MR3ZYTD4CPR&:*X@, +MBLIZRP=TV2+?(/>C&XOA\XA3EE%=MNBJJ%Y+=$YT^Z+ZZ=ES\JAL(>6?QV#^ +M^4Q49ISB*RH3.;!K%_9T6VGO\%(O\1*D^S5M[_T]3W46'`B7D9$A26.$+/@U +MC@NN\%7;2O?3&;-;=%_FJA +MEH02`M2*01SV+6-4!,6Z-KBJ3M[RRBP4LY$7-=XIQ"N(3@: +M=*TD]-">5,?&!&>G%$MZ/KR)!MJ,T+?ZMU:%P5+CJSMBY5R*248=A/\0:;4* +MAE&3]@Z#\.\CN^ID`I,%`1;+I]9A"C#'^8CQ::H-`<*_BH@X>KJ>MZS4NAN= +M@\-[/NSD#[QAB72_?/6-TI];-C^QKJZEK*-B6U%!P)PU,L"?,V7I`HIS/-5. +MF)45)/KZFM%B;E9J("_+$&0QE"G:LC2!61@S&_/,R1H25&%LFH@\!O(]#/ZF +MB#+\Y44Y_@X2$7O6J$0.?Y5B'/ZRH@)_/75"1=.C`>]F;Y%VEK:IU*Q5>YJL +M$5.NB?-$Y:6X`]GZ)RU%=1LMJKEDV'K+J`((SXQQN?P!R'S*PKH>L_`%++8[ +MJV>]51!NYI$]EO6.`L#(+N85/S$Q.I_*?)X<\G[A=^YSZ +MVR?N7G@U?7L1UND>T(OW=SF^=9YY:9)*IU"QPN)>I]7,D +MOIP$"UU*,:KM1!9\RE.! +MW]LHXXIMGH$R]O5G6?EH&8*S]C:<85QNHDN5FV.!\(O]&1A.R)4U0[BY?X3% +M7D"69EK\=1".B^BL]DF6RJ'6=`N7:R]H7814<%@1`:Q'=2T8_4%&_ZHKS4H$ +MR?X+SOAC=2,E23DKF!<,MA[S4@LO$%XLG1K?TL_H+ZR$\#/]U_5C,Z^G8PU" +M_4/HZ7N1KO<=,;T2IIC>B`&YZ!A.D6@5B4Y!N`]YF5\JHW+E_>E17$+?5PS0 +M+U0.G=(O5.9Z0%\VU0%@#-2[H[;WZEUL%G."2I(OZ%Q=-TNR0S;JK&5L9I". +M%A,=K8SMQ2^Y9%GIP?>L5O(TT;>Y=N&8;2[>Y4H2B5Z/G'Y=';7Z(NO%YNU`TV]7?_H^_5,J%:J-17[Y5Z +M>FZ_O3*T",('^ZB./+%RCP6\ODK:=S/[J1THJNLEO9\(MGSA&AZ+=/==;BXG +MM^7H;/FWK=R*^P(M^5B?L=I8F55-1RJKWUGY]2(8^8B'AK+[%;J1*^E(_*%/ +MKJ-Z*Z,Z+I.#C19*0R8&UUOMN3`V+D@UY"B#?ZSQ;XCBE"?[0$QR44S4TC=@ +M+RC2O>C*8^4VI)RC+7JZ[]$9=/;NU7V#LW=+'U+/PU;AV*[H6U%&!+W.ENNM +MB;8XC.T]UR>U%\O^:]^`O9\EEG4M +M'Q*$\/8^,*8$96-HK]%=@NK\+,!GD2JC`GD8`ZV;5JK;L+Z63HKCH_5-["NX +MAN5QYS>1IO@Q0X+7RVBKR[405R[R/_4N9INUKM"E=[>Z"-(?F;FDF%0[TM=5JK?H9W5<'3W@;WTT<; +M#C[-K3.YJ=Q.JI4UF"9QW@0K-\GB&6)AY)%U[8R"@Q'H`SN-( +M]\)>VH)#O5^X9G12WF#@?3)=:^:873KZGH"NS\@->@OHVJ7KD*Y-NH=+Y^U` +M[*"0VLVET!SOZ_`H/>W4S^F5@EG!'RATX"[B6%!*]&I7LEN6,521[CI<_3&; +M7GS8,:]4[9I7>K)Z$Y-1?-)QLGIHYFX)LA)<5TVM;@2J-R=0W!^HM@+EN?N[ +MW^SK[[Z(+M2KPODPHG=@1X@8]'F*#-`76?J[?],;,9`\%8;NQM"O>Q,S,W01 +M0VX>Z*=@^%>8>D=Y85Z&#O1&77_WSWOIEY*((0W3)V+ZSMZ),R,&==YX3"_0 +M/8BS_Z>]&;HQ91'#+,RAFR+@/4_W9I6"D#WK2+7D%)7:J::2^3I5%SM+=L[XN +MO31]QJR*-Q[UU*59N8IPO=I"W!'0 +MWQUA!FRD4;W+5`=SOC*JGQ1YGVDPC9O&3]-.$Z89IYFF%4RC,@0RF-VQ`6"[ +MS,^WTS.TQ!1$I3`#V)[(2D[6V-XQ:F\\X +M`#'>(/7_)RUMU]+@#8L6?!8>RV/^V()CL#D3QR$3ZT<:QE%9DF`)SHM,G".9 +M1/"CWX]^/TUOH[,6PM!#W^N\$>&O66D9I%O7`N%WK\!6\A.ZMT$/TS3*4CW5 +M74+]5$8;D!ZC_JC;?(6^^Z-^)9;W;0^6JECG_N3/JR1WX,:4*$4-L!5[<*#OC-BW]$PS]@='^X#V2U.L;Q-MOK99 +M.&9RT=<&9E_;(-[7IC+YVI3@[[`'/.WT_A_W1[ZD]R@#K1U@]W50N^+@B=IQ +M9_V^-G_$STC[<,1CGQIQKE/!(]8,JZA72>L#VGY]=)Y>Q[6AU*P +M7`U"S-N6&/:U#=19!F,NC,9ZT3K1,]DZT]:0S%0N:H2M(6KC'<0&408_;(O' +M-9MH>DZLI'4V?=AA'O9,NQ*?I^1;.V0PJTW&^^H9*!0U^$S:!FGO$B3[]E+= +M!N)!G'TRW3W6W[9*%FD-;K)!`@_)(5Z@H(4)[A)/H077A:D.)K[!YS$<7USZX;,5C]+YYRZNN!:S+%[L=E:N$V8M7/K)L%2Y.P;+8X1(>7OSP +MBMHZH7)%;>TCKE6+J_">I+?LYG#G+?=7LS>'O[?<'/[S +M+?G?N*6\ZH*;PT_:;@[7,#>'&V\I+^Z6YW]S2WO6W/*\%VXIK_J6<,GW1S^XY!;GG]+_U^>>'/XMZ5(A(1'A`XBO#8F+T28:V?Q7[SY;'R=]7J^ +M^W9&T^C]6YNI/SI?:G"^4)P"O.?:6HY(5^&BY2MJ'W8L$U8MKGVX>OG`9"ZL +MK5[E?'CQJNI*8;&[*','/U\I6K:A^IC&7&Z8QWTRDKU"ZN +M7%S]Z.(J::4,Y'945=4N7KERX"#.W.M/POPUCRQ>N8I&SUGEJ%PJK+AAQ4C7 +M[,55U5CJJLE"I6/Y;:N$%:[%M"8S'T'O@X+S^K*17X!*QQ%12/'BTLJUY4Z\"U>*WU_^79 +M(L\>22Z!TOMP=,Y-<4!Y@/DX)ZO`]$A5+#\K`_;=B0G:>3,L_V6YA)#K@2M1 +MEQV7'3<"(L!Q`PG_JI3H2!/)1T@DPC"]O:G37*YIJ;V]#$/C(-+7QW#L]U^S +MXRLJQK-??\]R3%]?!,@_^8.8N^8CU]T-R5`U"ODA)?Z-``4,!R%R=R]9B]NM +M"Y-YP92;9RZTS9H]!YNI4B42F8R5UV5N5FSZ!WRE:O"!#6])`A5M@BS:'?]E +M,Z6.?0][->I5_XMKX!;#O[@&\HW_%]=`OI)_[^A]8\%5:.,XQ.27PT26ATZ!+0S<< +M708Z([HQZ/+0W<5%GVLB/7`:/D;8#(_`4O!C'-8,,M`EHPOC)>E8CSGZ#?[E +MWZWOV?;UT_\8%'G_3V_\9>YFFUW&O/K)X_>F=2XZ\$7Y]J_N>?:%$>;&'U]) +M_?N7;QY[)O[J5X4/O=7WP,5[/LCHGO/3\_<_?_@17=LO[UQ2MF!9X1/,]S/7 +M53@OS?:U_Y^IQ%=VW?G)KZ]-F'IM?^9>NIYJZ6TB>7OI?]V]#,P7_[ +M[5-_WC[OP:WJ/V[@+RC8^OZPK\3][LB.Z=^]U+_0[]D@_\7=A_06%_O-7RM; +M'WOD5Y5%)B$]E-CW\`=E]1KMA%'C/FS[S4L3CGLGC?W!<]_.:^B=MGK?T27MR;S^Y\=N\T\4;[UO^ZT\WD:HW +M3NP0K?O/7-FG_&[D'W_UT3.7+DS3\J=7>,,K2FLK,@N^^<'O5\[Z6<;':W?M +MZ-+?]?E/SSF>&O1D4I-8M/9(S6O'SS3)%:0[6;?[\`-++O\R4+UYR/QMMTU^ +MY[:"LRE?OC5ZO.&]$ZY7&Y4_'__V&,.4+:G",>N/(Z^Y;:M??E;6__T\.2<_Z=KXK]S/5A=^_!CCMK%XQRK +M'EZ\+/K[@&/5[1,K)Y@FCEU4_5]C^/_>9<)KHLE$8>[M$VZ">-T^,3?/!+FF +MW-S\B;D3\_,G@"G/E'?[!!!,_P//_I?7(RM7.6H%`9R+:QC]-N_>/?>`/,>ADZ.A[3$$-%YGPWWLTEA]/G23Y/[V:C'Y.!S$KOR#MWAH-,/GH +M"M!-T5"=_'2_`,@GTGD,F(+.C*X"G9/N]F;"G)X*\%ND8YL\S[8G07,7AW7F +ML-V)Y#:$6][ +MDF<0QB&4V7[;P=KO;6==6S-9UY.95R.1#5]C.V0PN^W^9(BG?+H)WNRB]R?@ +M_0S".(0R\Y$.UC8/[UN?V8OW?(OWV'\68=;'W`YTW`%9../JC>?,Z1L,=O.M +MY\RK2Y?L6F8A&;!5%G[AZC\_95X9.V5>N6M1:9-)%O[QU:I=#UEDX>ZK#UH> +MW"5@S+=7*RW5N\SH^]M5-KRPEPU7HJM&MT)ZV[OW,ANN[9UE(2,W%?R-GCP? +M-?:&D^=L>%EOZ0TGSFF8"#Z$KEYZ[GS*?W+NG`TOZ9U5EB_`0FJECG/-E.QQ +M*0,DO"2BOW:>[+D(P:?OZB'A>9'H^72L1P\;?K&GY(:SZ22O*$VZPKAP1=-23:O'IMQ80CTU?Z!FNK_.:U&`@$'.66 +M(_6"C@U7X:R%-K6NHG3)JR:P$YW+:U=BYC#6,\;(4:\;8 +MQ*O?==Y=RAW@W7=9.<==EOSIA:L++)`5'U"[Z63@/9'*YIA=7T +M*V6A@YZEUI:>JIZ3L*/XE(.5-X*^V,-QQ?PB?HF9Z3T=J-;BW*K]]4B:LTCNJ)_ZZ%E +M%3A)/F)R^HM"9>$N]D^36V^N=RBS9685UDIW#M3E0TN%(@9/>]WGG +M^G1@$G!/VHZ;@2G+6,&$?*=?J5@]PA"K6.H!MMWUY4" +MCU$7,6GR"TWKB_+M<'+"@`7Q_8-G#"F;H(M,*$0*;/!TN"W-J5H]6S'H=%*M +MP:O))7D&3YK]U2(X.=P>U8S.&_\F:8M.L').ANH]^TQ5JC&EZ"+C"\)GMTYDD[?:WY;3JUB#`U\<^UL>(EVT1.TY_]F +MH6>($X."+MWTI372?3OVGS*H,%!K:UU6:B&4",[8=V[7_E#YOFK0O^HX/X/H +M-\"6M)-+AFI/+D*,FM5]]JS5-FE#=;)V@V-#]6R8S6UPE%;S6FJI*FJA:I^# +M:LOZYD#`TM`B:O3#*K"UR$S<]O=L@G=X]+)W>A;5_CNIY2&"CD%';;9EZ>(%63C8EZ2K3J>^XWTP#G.8>-&H +M2Q2=7(+X,$3S?'`MS[N8!S`/N>T#Q;M+ZI;`\UHM>7YH]GP1M3?TC*7@`)(;>H_7JBC1;I9.0K(! +M`^YN?L7$TS(QZLL]1:%'.>9TIB!4@#$+1RK3=(\;QL@"3UBM=:\6"4'&E*UK +MP+&ZKQ^,:4%[FF#RUYG3C"9]A4PZI;_6ZG$?:_06Q4N6A3^-L#IJ5V1RA)YF +M$'38;S')'NK_.,+@_/VBY_O.Q:6F_;;)*3KS^'-K'K;*<^*<;#"A^G1UIG9? +M4?Q9>>:YE7'5<5J[I=5>7^W)H-]__D3EZPN>_JE",RSY!=G\F65IAXD;Q&M/KVOO=V[6, +MI'U<*]X84HLR"0["V/EU:74[ZX#!65%WOQN8:)Z"XN2$[[SL'<\5!<]AZP+> +M(MD)CP(2J+8[0?=!YZ^T[[K[W7?6]6?\9NJ^J?:>[XS"N[[0/9 +M>\6T5_\.Y.Z=18I/'YOZ(_>/TB*@Q1`Y!QF#Q+_!PJ%_'_*CI,?3_L:/4<#. +M,8F/+[Q?>7_2Y^;1.EVY;L+#=0]+4ANMP<%E,)+/?]FU>.K?E/+3D"T+ONQF +M;KNS^&779TK9Z=UN=N3HXMVNA.DONVUW<%+\'G<5YK2-KU@-.21(,G6UD"T$ +ME-.Q;L\\5P1GTG4:W4\Z`>CY/;K&*6[6H#O.7KT>@>Z:2X$]SK6CQ&)JC"N=`>$V54G-WX5_-"J,"3FFJ@\2A.S.=(=Z05C?E"H>W\&8\2= +MS3A>FJ/>?FBB]F&[^DAX[95F>K8*D=L'&T +MI9S193E)AM=[OZ(UTZ^5N8!VU2-W3&>G.B7R/OYE]1F=);;BSK/;KSH(#=>6@Q_#J +MPEJ/E^BMBD*MRLTK(8DS#@DNMY@D+*4*IL%;[MY`_X);S)TG/RO103_*XOVCJ2\;R"WZ^K +MWD/M]DA[L]9^GSW=082>SIX#-L3ZB3K;Q!8W8UR!H][B*K/8"HXLH=;B9Y1Z +MB^TNWEU>3HS5P?+866^M'L3A^M*9D[VSTDM+X]@49US",:W:7NF^7T%. +M973Z5T/X0N]HK).ELL";-=-V=T'EV-+QY3RF&%V1[JE7C&YJ&3"\.M(]\2HC +MTCF6=S7;;=1!]NJEV582].<1,=Y[0FNG3E\#V!>G3 +M/_/&>>^'$]I96KXT`4L;ZB:3MQ>-#FI*DYT;M5DBIQCH_OW+Q'N1W<4W1%TAV+T&:7+#K)1/$#MS='U[L?PZJ5SM,0-!A^.8$;_ +MWZ>?\?Y]>IKS[]/-6EI#>@:0GK8FPB2=.==2P^K?<*E$NAO$7 +M;;P2[=DGKQ0X_V2];H,]%^GGZJ78Q[F,&"Q-]C9JCY::06W_;>D)[RSM[TKY +M!7%2_=[L0;YC@K.&%7RN0?CT9_L&SGP^/A(,8\C&%FKUC6SQ.A7QO8+"_('% +MO/0W5F`:EW+%C.Z01;:%+&4WOV=MX;B*M\K,^90BQ!W@LEP0:R6;C<[X&*YZ +MR^I2JC:_9E7I['G(46X&8]R6FD];ET[^7;__+YU1 +M2+;SQ43\R,D7'U:04^3.RR?HN7$8PYR3Z]MJ/^YDM\<]3T\O+G`=[^2V@:'4Y90//;U_K")P9*PF<`KQ1:1[7O\PD9Y%Y?PVN&FGMJ#$J8S:QF#5A_I?J_OYC'0W3`&,LFJ +MZS$G5]PJC4/W"7H*6:G#_?PUJ^>PD1=#IG8#] +M%4W__HO;2X?89=L/>]AM<=LI9S;+55^+8X1M<2*^XBO31.4,E4V* +MS7%UU$8G+4>^C6H#S](-SJ52L]\5*N/N+TAF,P>1D<50# +M-Y0\_HLJ@1VW'..W$\)I]M,B,SOJGN6E>U5H:Z[1O6&M9*\5*):@> +MEV(=&QZW/"[%/A[WQ$#)>QWUPE[[H!DF[,\$[$]A4B+VY[S>@;D,F%J@>SM$ +MT[E)K1Z9U+Y?AN@XT3%L8J-O,O?@7#B$XWL07;>E$#$\R1I\5JTKYJ`"DL;[EDQJ_/;G#)A*.4ES_0T$*I@=]>_BO2L2\W_,6J;WC9H]'K/8Q^5\,Y +MY/V^62D+OWWYHG1R/%U/7C^#.T;R%7K/ZY>_7_ERP\AULO`KETESO9([#4KV +M=(/`M,0L4"$?7B1T=WYSX".D$UB=.;^M#K(6!W?A[Z)`VQJ2]4"P#>M<$234 +M*G4=\JO9K3,_*(\/+EE-=]J75I-L>>`U*EL8S%Y#WPX<*#U1-]GEJ)FZ-%U4 +MZ)!Z-8#Q[>F)`:WSE[&]AYPH<($XR66H*7"W6,V0N$`N&FH<-5KU:3'":PKPYR!@5^6O;D$O,2 +MK[:Q=.O,$W5;X-WY'JV7R/R3MG;Z1Q*M`B?3=6L1\S^_8&WI +M4>\)[XJ9+VA73^?OOK^QNJ(ET/Q^)='^*^V9Z<#;.^ZFUT'RC]#E@O\BQG;LNRP3(@2`C +M3+5Z75DZ^N[VS5XB?-EYCY45J'UX$$*=K@-L[G&XM:."VI8W7'J';R42#"J)&2#&)M,,UZS$VED?1N +M+BLNJ)F^S4VMQ%Q8_:E[]9]H38%Z<^CBV!L37"8M%=ET$W/.^*0X6\;'TZKYM=$QR:+-D068[*3CHF.R@ +MVA3DIYEFSE107U"-OXZNU9.J(]VS(F['I,;N\JS*;APG/])OE@B(5C%+9ZG\ +MCNX#J[^U>%;7XTSE=-^4?C.=SA(S:!<$)5H"1*WH-RE%,P2]V@4TYJ(U#G>] +M=ZK?13Q$+2#454_3$K%Z:9*6TNW4UFV*V&X!`X,XJGY^FTSCMTK:LI/?M>#Y7K6]]_O)Q::$\*4*O&*R-4 +MDH4)KXA&/(C2],@*COL;T!R)^RV_*B?-'MUE6V_%N'7(1?@6< +M_MI%[?`F!M^Q^-V4[WU_^GSD9&0GM(@9M8@UAB-M.ZWO#>P'Y34.]\W2.6X8 +MS0;N=;%(,2?5?MO)&G6!_NXOKOZN[E(<:)P-9O944!S.(B=FL)`D3 +M)TBX.2YP86GTC6>TWP9E6*-?(Q:P33#6 +M_`;7+1/NBBRY)IO"A"]$'K@FF\*$3T0>L%#I%`%QAZKOWO\@G1+I9B1IG$CW +MJKY(]UN]KA@7PH3_$)E^3=YFMB1OPX3?BT1;-U5J7:AO0.(&]UN\>VMO5.:& +M"=_7?[/,36%,YF;B/Y&Y67(E*G/#A*?T#_!!$ZRCR_AWG*,>12.8G*7EEYUE)6Z@E[7YHX0#>NC[T;LL=XR'VQ=_X4 +MYU"\$59'Z8T*S..L_-AZ`?O^[=Y(]_=7J:193>V><;(@Y>*)8*H=X,J.E*YK +MJ;NMM;RU[$=R9LO`.B2O?V#UXSI4])/F5IGL]![_T[#( +MQ80?ZS-*%IU'8%Z#Y/^1<4B0WK&D3T'M>;D$UTN6%Y&#-2/UG>6D%JW[NQ?B +MSM+?O>TJG;/W]A$1%'\]1>^Q24^9O(Z67-I'8Z;U,=L7Z-6(.8KZ?M)9<*"_ +M>_F5#:7FR;.JS>F%8.4TTGJC[Y("2T$,.%-TMO'WN^O+8?3PX#KXA7>H]GFX +M/^V^](V(-].07!0EN(LI^,*(MUKK\;>R&!_/'JUI_,GE7$B +ME<[XTNL!O[8P7:(/=,]5TA5WVV6ZXK[H7&YE5!L<1QTN23]%HV)ZI;>2BZ^V +M\L54CU7/`4D2'.-5U5OHWE5PY41%N?E.BA\$:O#`=Y]CB2%1=]062ST'8&1O@FC]];2>R]>%B6+ +MW)\'G$O'(8[^1>1NB[G@=TM&F9PS& +M=4H:_=76H;0LFN,'$5:Q:VS5Y#OS-;:BG-"4%?K;?&5.=7RDXI\6E$ +MLA7?W_WPY4IJ>:N[^O(#G73MS(^M*?K-C>?5Z@KTTSW<'/W6*J?[-EV#=`^G +M-+U.`/"KZ;915Y>3-1^W1;V>N`_0[:OV2>Y;H+>!=SP"5"L:9N_!R +MH@[TQXJI_P>7+;JIQ?1\.Q.>=;E&2V'Y92Y&]43C[\'P/SK5I9NK20')6&?> +M5KP99X])DI*(='\7B7[[596:TW8AK7=TD<+JK293B.$E,U_L=9BDDK;&3E0, +MO&ON.=`=>Q-$K6M_/X,-)N*J>;?7Y)Q62]\.R8-)&'ZS-]?)X!YIU)E-TVI! +M7UA#:G_NHOT6[!'72-IA<"Y]@5AB3F]T]HG7OL6V6ZB.F>^04VAH89H_*_NL +M_"]66[YY`F<&8TW@W(SNZI9JOU)YNDMSAPCXBT5(-BW.D"Q1B, +M]2!/V^+H6G/<*D=LW[5&AM@>A*..O762O4"A:V47^K1(Z1-C:C#2'=^?+#(8 +MFR3N74W?\F+>2L02`HX(QCIQ]=*X2+?O\J'2INJW9YB5]HE@G/"I6SG^=%,U +MBT]K;#]"92]>T$_?GO;61[L_ZG[NF;R?2+8N,%I^UK65.V7#SO=(Q]ZNA;733UBZ9H9X6KVMH+BL$..S]G: +M0Z4//=6`8[G$2@3.M<3*K?=@RF][PM4',==#%F8;,:L"=8)97K^!4MN@)^OJ +M&Q9)N2,"LXTQ$7-ZX`&K=P,8!V/[N77>AFKDF?@`T5?7.FN,M;MNV;GIX[4&0QF^IK6C&G*MB*5(\RV+I&GL4&_-@K5$O) +MU9AFH((#MY>#(-%<-6UK&(%D#0^P66E!<26'O57:O[>Z&O<),[RZU,S5%PTZ +M\>K2PG2J3<\3V265?6%I?1%S\L)2+KVK,KH#B"NO=%YPUA=UG[S@Q%C[=TCA +M]7=W]8RVY,P`9YZNU6LHA]O82:V>W#6F"92R4*_,U352K3H!)JLR&/TJ4*+- +MJA-TO(ERB_0+KL*0BSS:PA[Q\;"!,+['&3-B.J3U +M8UKM)&K-N,;SUFHRNCPPXAJ],'`F@.=<;SN\MA5JM@=L? +MU[8XZ3N@-,%#B$BY[18[*[;@6B/T>T+M%Y;,`K^7ZH-B<>3>B]G+;;OA2[;@ +M5B@G)G%4\]78OP>-.*>C7[!YTUDKXA#D0<\'3F$I4-V'.]-)*^4J34B#<\8[ +M@T$+?7-UZJ2Q+C"#SFV[NU7YAU,>Y<>GL>]TM`])^#8LX4,LE\32W\?T]TY% +MTZE>M2&8_E:04OI9P0\D^_:#`I3>-P0H9S/B%)_O6^,UOA04USQCW!D<(NFU +M>_Y4BDBI`L'MP7K;L.21`BPD:4+NL3KDJM($TR^MGM7TJ^U3P7T6ST:/HN'T +M;LOK99D%K5[!0'`>U'LWPOU(90Q-2Z\EN73TZCT\SO`?>SS>[59*17CHL6G[ +M@SB3FF?:[IY$WZ>XGT=>K@&I"HM[>[G1U=?]?E_TBPA=%;_HI[W?U_UJ/SV3 +M)=9MP1YA@T<0>RD0EQ^_3'$5&SR%81;#1R[7>#=:<(T$UI6>\(YVWP\?+CBA +M;4RO\8"^QJ72URW*PI[(:T61EWFE(TW%(S++::.=LDBX,9Q8D#<78ISNM` +M/KT9<8>Y`OGO0;H$;`/E$ZL"--\?EQY4##K-+3'#O%ANL2ZJ><@5B717726C +MDH4"\PR<01!D1M$T?>"@4GO:)GVUB@M.PS*]U1N6>+1^4_0\@THLNA976IKL +M]6BC\;0G%_51G"W4)(B1[N3>@TKN].VEMLE-U24X]\Q2/INC!RE>FK>LS[Z: +MP9D`>GTMI2@AN*NVNO95Q-_VVDF6^@:R#@R3=+M8YS$3VO*W0EE';5V2;3/:P+]RES +M<*C5NQ:,4X*\SFXZ7$>R;P_^OF:L>%7D8^\H*:]`WU$DQKX_4_["%7O_3/$% +M?6_1I+[.H'C&;):.:TI\"+?QV`9S.N6_(MVO7:5?(G9> +M%:6]B6+8;5<[5X*P=R7!%M-^?M[*K6$4LM-TA^)6>I'2OW#EIZ6:R4$G5QRP +M@Q@G[L4]2Q'8ZZ;:)'_E(C@N+UY]VJ*A_:"HD6;7T24;2I.=O.,HSI%&*QU) +M<8TON[[(TH1])-U=3K%*`,W)$8.\:,.H"3C<] +M\T'WZ*2KN.^O--;0'88)[,(9,2A(_;[:."R%]H%=^KHWSP+A'9$(4JU[:]T> +M<35K'!RD9:7$YK[4K_C4J=@[%)7W\$B=369LDO29_B/3H6!Z*;HM#H2=EZ-ZC3\JI,1?+5[G0ZO +M26O69EJU)@ZILK9.F7`0]_3/.VE9JN#EU8N&;RY2!.G]]&[K54KI00XMX>/. +MO4Z3=G#LSB,8JI/*4L=BWL,^.5A+-?R]W0G9=/=YLY-@#+V+B^5YM1-@X-T\ +MW2,'Z&$Z?^F[>M>!ON[[KG:79SF/VCE\?F/$Z"2&>N]LQ7$%ZN,/'$7\IM+9 +M\@(N>^[1FM^7B6O[NN57A8W15?G7RS[$"G2&@IR/<;%7.M^SXIV3+#B#0.F: +MQA_X=9EM"GVG\W'=`#C.N5H"#`NC6K7BI;PL1M[!E,H +M;_E]Y_0Z&,U@ZO[(WSMEL13ZM*[.^-71E%V1]DY9G92"*PL4GW4>Q=V<#_Z, +MGEI9#=([A8F10"?5,O7#/E;7UUW12VV/S^^C.DG#^S=;GBTWF8I7D]ML=V*) +MJY^QI@4@>TC@::NF[2RF*2M)S$X7HDX2]Z!RC;^=:CJ^99$P7;)*J7)=)] +MI6>V!?2\J;5FEG5FF2F7:F:Y42_+WC7EDEZ6HRXV0,*F?F)XK29+[*JSQ/2R +M9$AZ6:9*;P0N7-/+HD5,<&\$C)J@;.R->EENQV?9"DB5Z9IFEG>NTOK]M/>7 +MDF:6:)U_=37_FF:6G*AFEK$W:V898R&N,?]$,TM?]Y=72+BCKVM-VDV:6?JZ +M_WHE+::9I:_[[)6]=:G6F_6R)%L(TOE\,-$ZI#3.JYVNF:GVI):"_G'MF,<7 +MSITWEVKZ[#E)##B_1AIULK%ZI(T'WJ/1=V;G8WPQW;/VQLYPX";&K-=&]T!M +M>G0__`+3OD+71<_2QC2\D/"6/MH3ZMZ0R]C98^$/$'=O'48X&.'?$28C_!IA(L*_(50A_`JA`N&7"!F$%Q%" +M5EJ@V$UU"R>=Q;W(P.IQRPW_XTITS6VL6*\E>1DUQ>[GBGK.4!UN-+7SRM\[ +MJ?XZZF^[!1A(L+? +M(U0A_!U"!<+?(F00'D$(8S("=!9ON>IPTS=V.`JQVM$WW3^_$GV#H=?&U1%3 +MELOA)A.0.SJ#^X&D(_:QJ[2F-.<6K!VM*?5ONM*!U.XOI3<38MTO9G#&\N`O +M9AYT(TW;0Y]5<16:"MQB38];<.VTTCDR.3<3\>+QR]G"X87-ENW6HIKTW`*< +M*Q]>_HFE>2;EJN,EKIH+]'??'ID4XZ+[N^V1)+&`\M!U#/)S;75RY!6W6*WN +MPIH"B6?N[YX9<2%>EDO<-2/1UZ,N4QX_'NM9<(6.>^K5-196VF/5`:H+*S%( +MW%P6G%PE,K$9`.!BJQY:\G"<(])]5XSS(9FT)=U7E#I73+MCRCZ*G'5?=^K0>]]->BMFB95'+W/),\P1*/=#]U56C +M5\0E$H,"6_C[RU3+WIXK>W#7;G'MZJ1O=%_$W=3D>KZ3A,?V-G=2O;X_Z43J +MVL#H^;2^[C=[&6S+!SW1E&\#`SJ$)I8[ +ML?W#@Q/+Q&KEJ$<59B76XM.6:I4H2F\71*D/%O>T5+=5OU/,FRF0D>_1]LFRG6FV^T3(MU_0,[@`+H_]0^U6O!9 +M0X)A'$N--&MOOS+8"DU'G<1TU`ZL,ECJQODGZ5VS(%>5VT/'=^058*O73;_KK8_1PQ6Q;W0EZ5'<,4`S4]Q!:0J*1[0WZ%`SQLZ%2;RVT1"4QO\R +M-(G2NRM1>G=%PJNN3L=:$AQ]2TUI*2_PCJ;JS0E4\RB==4H$'J[.R*T +M;G^^;);>F<8%:"D*J11Z8IG#O??WO9%N0V^!U6NWQ&984M#K)/HXI&D5P7RK +M68AS4HJAM_M29"S5;6AW=N98OF +M.'=ZI(H4Q"Z7,207:,6:5L2I;;$!^-*;J"P$2_$Y?4][,!Z@YT">Y<@2"/^X'QA3.:A,I4[[+/=HG6Q4 +MFLN<\7S%HPHR.CDX*&-Z\79MRIJA"EGQ>/O/ULQ9:?_9VCEKI5CI[B&/2[&.GST^YW$I]O'D +M)P9*?=/1J"3%*N38N+QJ>T9%REPJ'W/EI/I13F5[E$MH>I1+##P:^\(.="[1 +M\R)T?E&-L(DZVI^?]K`ZA47NFNKB<013(I0>"L3TI0!XM-1..E_&6P5G^7!O +M$1L8:>_MOG@5PK57$BPC[>#LI6=V!,%.]:VVO,\?4%C8,E(@8*X_8ZX'KC`6 +MPO4D +MK_.8VNV"8Y'#O@0,\BU4+HW1R9K$:OT2:%)8J"0:MTM1*I_>8H)P8<_+BT*+ +M%"TM[P-HL7QJ:_X;7"QSZE:N6ORP,+?ZX<6UPMRHD%3X0(H%,EF[7+?,GN,0 +MA+T.H[98MPS7Q&"&=?$ZT,M$JG_0S,4E_EYY^72:BXPG>6\6?7-288W6C\?Z +M[;-_9?_*$<;GS4\%QCT8F,B!^A;5K^(18R3^XJ=3,__PX1]W+UHYM;**?7YW +ME6AW.,Q:R-AMQWYQA!7^Q,N*8XGBHK;*EQPRO;ZRW5%IS[!65CH6[Z[;O7DQ3MA-!<8KO-, +M_,9YR>X=MS9E!E1Z^^Y^)MKAW`H`F.4D@7[YBO2^^[P +M@AZE2'7ZG8E@GDDTS\F(I!7__5\4`03O!"B9;9EKQS96H5N52FW>%]KI210? +MCH[=(=KIW>]$XJWQI7J[VDG?Q7Y4?=RQU:'-5QQA1(U]C^.\0W[-"OV>"+5W +M3^W*]V"?]4K]1NX&HS(1Q$P(Z:X)39]WUX"L/C=+)MGDFYMK9[>T/A1[, +MJJ;?J/4/955;5SBDWP3\+7N($7,2W&J'$ON?Z'=51FO8B1-D +M=F2-3H:]5(8SJ^@J[:VLRRXG[1,(E^#JN-Q)Q_R>8@#:'_T'E+H$7:J.UGY" +MY%7E.T[FM-[\#M9/7_R.?4HUY%0%UE0C;3(Z+SA2YYDPVOF\?N%=OPKLF.U8Z7'ARLJ[C6;US$OIQBMFBMYEP% +M\8LJ0;<<4]ZZ#,:'`Q!^)+)$A/"E_H=$9NMD!WFN?#IL3G/"*!A)D +MY_-\_V4<(^1_]9?MS(ZZ:K+Y'2=LI_(UD%,L@"QC$+;1>CNFWEAO_8I=1=2Z!;.9$YGG=Q=! +MD-EZ5UF70;AC@A]6&RNOSWMB/U$I8WL._/S^VCGIPWM#<0_OM +M,^SEN7G)E"7WE]X__5!19N"))8WPX*(I2YY8 +MDK^H8OZAHJ3@E"7WSJBPY3JI1,.49;N*'N)=;B.8A(2H*'QNHF*B8G% +M91A:J!:'JH9CB$$_-UYU0X@?+\,0SMT*[?@4^VCGSJ*BX!!=LM,T?0MLGS_. +MFFV/PYH5!+)F.*9&<<_/^VAK]_1%\9@ +MSBU]X\4T%3T#RP1V57"Y*C%."LDPQ.?*Q%$8QCMR4TL;8=;\CY9.<;Y4)#N3 +M98];MA%W5-R7^OA8N]6!)*G=@X(JD>HF5<7BY8$X*9X$(7RVK^?]5;'Q=L5P +M^;+8'*#C[Z1QTGC1_8JVH:@OJS2;8M9):ONNIF7*@(D:U*`R;H]\%*E +MH3)?A*R\@&,IU1^,/#ABPM&BH;)MR;"9&^'*?'I&<=:2A$5S%SD6&18-%WMM +MF8NJ%@V9;E@VPCFY.-V>YTR=3D\.YMO3[$GB".<[10DGTNPGEVXLXLX&EVS$ +M.:Q>EEB:XDPK5MOSL;U7>N.IAMZ;9C?E3:^WB[;)&6O?C6UKH7OA2-9)6_7G +M7CW6-RW85KW+D6B-D^85XD6D^`U+7BH:%&A;TK%T6U%"`MLG)4KC9-F +M&AE)Y_?!7J.NY=K]U#L55XS*R6R!;!)@ +M7G_.`2.%5KU]LI.>#C/CL_5VLW60?9ZHK]Y5A&.DY\1%U:4.??6B:K7#4,V\ +MNAG]S&:]4\B2G14FZ>W8!G'4L$6?H`][G+RZRY'I("+B&<0B2WMA#!.@V$$G +M8<#*WEW5Y+7-1:."]'YR=H0>1#+)@',IV=FHI77@3C:F?S1D2](L[;#21AYC +M`3EI)V3'!0P.E7-V]2*'!N%7)M]4_\2;ZL_]A_K+;J@]TFJX +M,P/0YQMC=6BANA27LLA]T:?_[JKJ6OW]5ZF\T"/]+>]+^__5EY=#^.VK,.8? +M$G7Q4%_+^S?6^]6KNQ#/#@D8JB'CI2(VJ,(5FQ2,MP\2'=6S8N.ZJYK&LD%# +M-1W=EZK5]MTX>IND6C%(>7%VBR1G3ND&UX$CR^52R6NOOKJ<6MB`'*0$2O78 +M^MP@C/KE@UDK7L69,\JA$/6.ZA79*V8]E+5BR0KU0XYJ,LGAR%JJQ)%9;Y@U +MB[_6HA]XYL;N( +M!-@"=A+%"%%IJY/T%$^>7+PN(ZT,7O>3(#/YFZ!VZ`7;J$\]HG8>XLG4XSG9@JB^_7WFZ\).5W[4^T#BJU.!.<7-XZ>`5^>M_I +M^63*+]).VR8:("?!+ON4%%CL*CM2TPCA=*G="6:.2OP""-CFMK0_/?B'0432 +M)4CU?OQ/Z5#5P?\Y':H,^-H&=*>BOX/A?1W=!"XFP9@+`[I1CE,=*,)S(8#9 +M'0JJXU9H:*( +MR=>A15@2>S87\(1*;G@N@_70"IZ8'AI:=X10'SH&<'%`I\WO8GIR!O3C7#+] +M]]H+_`NA$;1>/!&3859'/.8YQ-_F`=4OP[=ZW6:Z'Y%^RG_A,],3 +M,)U(SUH7NC30+T+3M?X,8QU)K$Y*?#;5)73JAO[!:9CNIV%X3M(K=&M?MMS0 +MUP+5'RV.N6F=4?5ROFMC&5T?'ISO\S$N2?2UI="UL%L[[<9UIL)[IMR2'EM+ +MZ998V5IL@TZZ9UW(*-4OVD96?.$\Q1WOW`WPM!F`]IWVAOV?[L%"C`XX&J,% +M:#Z:7^IC^BQ34MO=TIR2(5ZJ;R-4%Q-\*.$DFL[CLV7"X0X+U9^-XPZFAM!X +MA"Q"0,@A3$#'H].@TZ+3H1/09:(SHLN1\C2%3+%[\A$6H)N"SLPWA$H08 +M:9_/DN8VU:$%9FPKU8=E7AS7M,_--T<+E]W<_CU6\(? +MU-\&:33>'=_[XYC#QW!S.>/;F\$.WY+^PX>;PLPTWAQ^YI;P[M]R2 +M_N0MX<:;P]/7WQS^\RWEC[FE_#[OS>'46]*_OZ7^+]]2WI.WY%<^?7-XW"WC +M$;DEW7I+^K&--X?US]P<'GG+_2-OJ<^X6_KK=@S3>3)E:U2OZK^O?U__OOY] +M_?OZ]_7OZ]_7OZ]_7_^^_GW]^_KW]>_KW]>_KW]?-UXR*Y5MJ_>`OKZ>?@O[ +M[CN`%&NI,YDP+OJ;K"IR69S$1+\.NO9#MB8XJ'3+Z@U%<$:MBR]+*+?"H@5? +M>[>DG=`R+L>"B]Y&[3%MG*K0)7U9TQ-7H>MRYU;F9CV`C-4#JODD3V5S3:-G +M3%T'UGG)R(<5C&Y^&G$_U<)EI02)CL_=M.;8&NV,3$9?G._=5,0$5N&O"E-2 +M+-IRWBJUE`]E81[KF@->IU11\+?7?F\DY?.'WZ7F2F'##!R9\WE7U=\81]5_;:R +M]S09OZZH^V0DH\,NZ#Q.H=J/<3XG")"=<'9D]2\PU&$?6?TWA"\[!U$=T*:F +MHF]/'A5(^)/8"?'O]'%RKU,N'+5SU1[,%[GF\SHYJ3RODYY9=DTK."#7V>(X +M/6<6K#J=S,2Y2EV1[K]&_,JKIZAT[LM7#+HL'2-$NO?&-.)Z]-\)("=V[&D[ +MT1?:B3W92BJ3K865]96ME:3:XW1-B^JHIQKQJ.W3&\.<%*8E%#J3#,GLYN)" +M>Z%3C;^N:>?4P)`$=#AFA9;6:B9!7=SJ:*T>:M@LP8:$*"R2XB>7UNN#]M9J +M5DJ]??JV:L&@-F]S3"P%_>8&]3HB_\AY;&E4VSIX`$T9;2;C@2K95)AQ=&95FY@X(@F"]V7YWAL7?".'UO50>'<*G$(Z] +M0OLJ>D?:]/OK[I?L:?/!>-T0JY`+HS5!R(X+:DK9##X/C%XW&VPN]KI`X&M= +MT[3HLZT&X^4@D<*,@>9@@DW%5'5.B^LOIO/[6 +M\IW5M)^S?UMZRCA-K.4A#2](UD +M'0S5%A8_#\]KK6G$Q!NW>;X[&;)T6EE/R,)Z>(%#R-CI%VY^/^@[+'1%U;M: +M77&&9%F#9U#&9\R'GC^7,O5\9DG](J:A_L/Z8"G34-+`&HK6R0S,NI&&AH8_ +ME1YNJ%_'2U_)(9-DT#-")\K9SY^J^.5AZ,IGV6[/J+SB;!=-47S^9,48 +M!9Q.T=&TGL^HY`/W^>]+4[5C'H@!F1\0$".'.W19P/C75[\TRTG!7IT'OJ)"D0H7VSDP#6Y!I'/TYV;NK@FJ[ +M)UD9P5W:35.M;GD6G!BD`SV,47\>)^[26MWT+`H(1SO)J`U:)D\ESM$.37O> +M73R7Y+Z*+7+@/32^9NHQ+SMI<]&?SL%8$@2AI3-+%^E^.$*U'`RY_$R9G.HU +M0'_:Y4WE"D.6+C&7::;GD[-T3UDTN8)!*"#ADSV,(+CR]99Y:RWC/`,20O4; +M>0E2W26KK6#PNHBD':&WAPB/=WYSX*D6$)BFARSL*'!^*Z_W^KU/:[.,++9Y +MP,;#PS,5S9/OGJ2;G"O?3"3-A50SHWP;"1_NB4HS7.@4!"/VH17[D!23S9HL +MVF=_Z31@K$?JLS.=,RV9F<1)6YF9-?GS2;KT7':S<2&5&2'&<<'L-)M;;H03 +MDG3+V.&?RUY/%<>ES;"L=E.=Z_09O^X\J&/QF=[8,W_52;#>;C>;QN3'B7J< +MLXWNM+G$U(*]:I-B\ZB.+B];X"OZZ!S5-$[[=6MGKDZV-]+M[Z<]NZ0GUW)K +M/]&3Q(_VY)4I$"?KL9]YD\(@1^ROZZZF\`SV/ +M3N6FZ/JG>]QJN$'F"DO+P!'7=/9,QQ[6-X"TPFU73B*&J2N4],X@1G`AX+^HJ7>@763JQR'29&=-1RV?VMHL.<92AU1G!JU_#J` +M^:A]#'X_[_H35TMV6S:M'F1J!>$ZLIGH/Z7PBGEV27DGBE04-4IAB]"C< +M8?V9)]9"I5)IN]OZ(X*Q +MQEFSMZ:KQECKK(UTGXM$NELC.;K,?'KN[.5(II;"0H1/6LQ/,%1#"8:?B<6O +MC0C:QZWFH9RC(";-\_ATR!SJS-1_Y@4#>\>.J9FC,\Z2VXHK9*/C`\K1J<%B +M[4*W8@PY^;4R[O2`]'&Q]G[WY.+[M$QNG/BBCLE(+ZY&6DLFTG@:N^F>OYR1 +M9=-5^D5GI55FF)PKV=KNK[0H[=_JOAZ^OTA[(F4AC$X-J-/*W?.'WY]&[EA7 +M%/_Y_=.':G>N>MH]K"9E8;F;F*+QWYV3Y>\O^N(D$3[HG&-=2FD6O9S:2K&/ +M1CI#J:^WI^E;*=WAB#,<=I25)KN+%I66SG8W+$HQ'%Z48&`JY8:BRHBAH?*> +MTBWNPY4EI2J!MVL$F_UVH +MCNG#,3U3L#D*A29'O@7J`HX\I!MLBW(MGKJF1>,L_KK`HK$66,U7YEC,JP.5 +M8ZWC!$NET:H0.'N.9)\EON*YF'T6.N=9':4?FB3[)DV.3,O($+3F@M:E!,/W]`_#%.R%L+F?$W*=$)[2 +MKQ2RG";$%R4Q>2B*"P;DI];'].%"3*<9Q2\**_HN6:%V0^`A'^J@>+0@_WS>@WH?'W[RAB]:W4GGL<$Y,ASSB4`-D +M/&])]"?Z$_R;+:8"F4X8O^W1LX^F/49UEOW,^I-R[T:J.]N[SHM[%X54*CQ' +M)^2+=8G&(6>(,?7D,U:J#P578-C6]]0,DR29N$&20FZ[)H7,!'QUA&I!-,CH +M>@I_%],K1<]Q?M^KU.VJJ[.8#>JYMHFYKA4S\@VFNS;/,ZPFNKJR]-R]P^2Z +M1340WM:;J]/D&G6+ZB#\7&^D>TFD`%?ZGWJ)X247A-M[8E2/UL["PY4E)&1]OR0R^>.VAVP7J&ZZ699[JD9P%4_**=U^SG6 +MC>H:W-AKFX&C/S'LHFWWQ:P5/!`IL12NIEI'J:[N.&PCM4DBUDV+262K`_%B +MD87VQ]1;^H.5\B8B/8+W"N$:*B5.Y_=#O;1-RV*]0^6P:6Q%;_Y-M,-FA+[5 +M>5:%P5+CJ\NVFG,YEV*2$>]4]MXFR57O'09ATKNK3B8P64B[XA,BW>NE_KJK +MU_AT5'\BZ16L8MW`V-7V4AW97DF?Y:K>WV`?I9=#YE>JRK%Q%EM7[J',UU4=SLJY./=0*[7XM?HJA'MB +M>@"Y`]GZ(9:BNB$6U5PR;+"%ROY<6ZV9*1;6A0Y[^(N>9*L@W,RQ)5G6.Z*K +M38C)DU)=*RU(2[V)KN(&G>%4MI3:"'E-':6ES#$Y4^E,%X@=%%+[>A2:XWT= +M'J6GG?HY0:FW*BP.'#W'/19*68";VJ"B4L;^ZH]9;;$RXW[%&(@5PDU7Q,;Z-'[2L361+"8@QS8'*^-Q[46MCI%`DO5HC"*C\W!`-Q:= +M9YSFNHTMNO]9IA5,H^>,/9E\ +M.X"]J-"4)P+O,/Q/G9M>1/[/G9O^,"E/W)WDD>H_<'Z:PAD`7Q81^%+GWQE* +M\F\2">@Z!HG/)B>)/B*=C?,_VTXAA)-[)JV`/GH?/9=<@/?0L['43J1TGASG +M[&R$ +M5V7'J#_J$$?KH_F46-ZW/=22HG)1-*90YU@TD`IZWZ(!GQCS"977R_G/G5&' +MW%J,"Z6[]?64Z$H'V`H``S;466PK/1O)F]_GL,\(M:,^!-M*TQ-MOK99V(=R +MT=<&9E_;(-[7IC+YVI3@[[`'/.WT_L1(Y$MZCS+0V@%V7P>U,0F>J$U/UN]K +M\\?MZ[K1I>`]T;.6OHX(WFOFZ]N)X!%+QC6TZX3U(2V_7CJWR\/Z4`J6JT&( +M>=L2P[ZV@3K+8,R%T5@O6B=ZME-GVAJ2F5\]`H:C!9P[8C\?=D]HZE>HV$. +M`GT/+XG.+8"=TKE65DMMIA4-'Y2=N6?4B2&&C.E%Q6M*3FN'W,D8-4$+(:>% +M/4/%3`MG)H&,/8/%HT!.C]R3+'H1CMJ3*%H@X?1M>U0BAWMW@DXAQE$M.5E, +M<-3+((Y^F=K&''79*%E7,KK)!`B/D$(]04&*0_HN'\*IEP4ICN9.NDQW!R)H +MIT7?*?N1XK4N?]2QK+I*F.E:7.N(68K':*ZD^M'JJL5"49VP8''M"H"9-UBV +MG[>\ZEK`NGRQVU&Y2IB]>.4CRU8A4A`LUXW:"Y4K:FL?<:U:7(7W+%V^XK'E +M,?/UU^?E6]C_]$SVP!C<>&:R4$GSW7"&5G%S^'G#S>%?RV\.9]V2KK^EO(VW +MI-]_2_F-!3>'K:4WA]]@;P[?>4MYQVXI;^0MX5=ON?_ADEONOR7\^2WYW[\E +M?%J&FT5X1.C,/71PHW'UST68`?^(K3>?2=U655TI+'97+G;1Z,D" +M6)OG)5[2.5L_U)F+_FD<4K)0O0W%5-9:Z:K)0Z5A^VRIAA6LQ +MKKEBZMB\U/(_<^C\Q"%/E*[6'BTNG;5 +M(QA^<#D^`6M+[\I#BB-M3\- +MH`I,CU3%\K,R8-^=F*"=-\/R7Y2*^QHAUP-7HBX[+CMN!$2`XP82_E4I$>FB +M):D`9/@7BR4D$F&8WM[4:2[7M-3>7H:A<1#IZV,X]ONOV?$5%>/9K[]G.::O +M+X)D\G_^!S%WS4>NNQN2(:+$OQ&@@.$@1.[N);?7?^=Y[35:&>FWAQ=,N7GF +M0ANV6:5*)+*ZS,V*3?^`KU0-_V7C8AWZ'O;FS5'J&Z__1A$0JRJ]--A336"" +M1`4!1#/0L'[C3UG*6>#_&<1+\V]]_/^"HRW^!Q9ZE1:,8RBG0B?HDM!I.*J< +M$^D@=!GHC.C&H,M#=Q<7?6X8+_J>=,`=B>J+^??U?]'U8'7MPX\Y:A>/<]56 +MKWQX0OZX_PW/,.%UN\E$8>[M$VZ"`Q?DXI++GY`[?F)^/IAR)^2/SP5APO^& +MNOR'ZY&5JQRU@@#.Q;6+%M>N^J?Y'JI=[%CE=/Q3W#O0D`'X?\GU'\:_>N6R +M\063_D?K3_MCXC\;_[R)M^=/R+\V_OGY$W'\)Z(/A/\CG?C_\?&?B#PJKK.+ +M^>C&HT-*Y"+N/1ZZ_Y05E^4B0O<@>0FY8TUC\\>._P_WXQ[BD;9Q3Q+=L_"7 +MD7YI'#N0!O'7=N@(_N.V!8M3_V-=[EUJ5Z&E-5RX0=(*94^ +M@M331"$W=W+NQ,EYDX3B>^;,%?),)LQ6AS3@,IJYRKRJVHVD5&'Q]`%W,JSO +M\%Q]M@-YLK8CXYYM-Z?[.GI&;.GJ&:&_`"G/2G*EO*FA/??NN*]]F9(,8KL: +M_?X2ZD<>-&]]R#/&UT&$V>U]D4@Z,:V3XEQW4_E%O!?];H3FR>LZ^+O)UZ<, +M.T.G\G:&!//F4*9M(@KT>P_7(9S:(Q.5KV\N/".V%$2.1B"Z:#?;TD+ZDSUX=,>EI/25[TO.?N*!3P>12:9V(8[]?,PK"M +MX3Q;Z&N3F]>+G'E].QUC5EAWGH4Y;;V1R&00DMI&F`YW##7C6(;U;65!+)?* +MB&+YEEC]3YFIC.QZ+'M]J`#K0JE?8;Y/'<4M6M,]2$JH[O'O%/*I\5G +MRVW8=MOZZ+P:)_M:+T'%UX#WJ!$^H/=U)".\).P,I2`,(]0@'(+Y4A&>Q_!@ +MFA_#0Q">P;!MG/SK4PA="/EQZJ^)T(!EDJ\+,(X5ZD,Y5%85(97[-89Q#"_Y +M.F9.+[RO_-[BO#GWS9F[)X(CCZ/$A65P7,G`*73+3A$(9R.==X1`T9Q'\VY> +MB4S,@0^$ZW%KAS%@/$M@;1H3)2#/$:F\%B1JT?GV)0"4%\XN.<*`K[%F3CW3>%X4B"%F]`]2O/'NPD--Z-S2_>7WA1FXFTWA0?%T@5L2SU" +M%1M-URJCY"RKL)%E&.8QO!9A(K'%NQ!NBJ5S,CNAX;)8.).]0PH/U"^3+0$: +MWJJ\%I;27=?RVZ2P$<-/2.D54IB/I1MBX;VQ<'[L_OW7PM-N>EX^:Y>>1]OS +M:#0LI1\:R$_NN"D\17;'3?7Y2:P^5=?"%3>5_Q/6+97OCI6/82G]R$!^^8]N +M8!:CUT-QP0HMJ";(4`)^DNF"W`/YI]J%6!:$;K9`E@PSH)YK9ANQ30KWELZ$YU-@.F8 +M7H9YRS!]1ADZC)^Q0``;^FV8;P[>,V>:``MBSZ7WT,M:%H539\?J@_?3NM$P +M?4;Y?;'R%D3+&:@SK2NMIU276#RMPT#Y]%DWED?K3LN(/GNF!(MB[:3MH_6] +M,4[J(TNLCO?$PC.$6[O[?\LU-QZ`!XE5E*XI0/7%:`?')?T?>?R_K_^URT-_ +MZ/L6[E_D^<\N"^+P_TCMX=C'J>)'C\L>FS7&F".%T]*'WA@>N%2<@HV/4\KW +MOJ8"ETX)<^?)H>`9&;SV&@.ZWQ.8-X^`L\,N3&%0`] +M"#4(G>A6K;@YK^>&\!3T4TQU#FE?2O\V'2?0,@Y@&;H=M[[\&G/=*SP)+&\=MN8@+9>7P5&:CV?A +MN)1/#H?2P=?`*Z"L!O.I"90\02'R)`AE:JPM1= +M)"@#':U?"LZ_5'Q."@%/&CXGA8$=J13*P"=!%@0IGQPR):@`HP25D$/;/PSG +M.7W>,")!&?*!&EK_83+02I`%71O-)X?Y*VFZ`@0:/Y2#'DGE-Z,7]#ZN?*HQ+\BY);1>%?E2Z$ZU)%Y1F$,@U`#BU/0\`D +M01D4("2#<3U+$,N5(`,E$I2!18(LE$E0+FDL(X,5,%>"2I@O00XJ)!@''@WX +MR&`5N"48#SJ@,`&T%"*S:J+],(2`_7&LUQ!&@L5#6"C`^.(AI_>E0!F='T,TL`QII88AJ;#L3>R?(8/!*3UG"+@DJ(5E +M".N'(]LOU3,-5DG/%^`0EMN`C6I^E$+DSR7(@.TQ"F6P!^$Z+0M[W30<#V44 +MIK%@JZ-A9>P^+G9?7.P^E71?`RY/FE^&3+Z=CE,:@2HZ+](8J*#WI\F@&:%> +M%T48LB8>7#2]20W^-32<#&XIG`(Z;'=#$^+2U<@K-0G@H>NF20_K$18V&<`K +MA3-@DQ3.A*8VV35V#/!AG-)FPB^/(T![`BG:#+! +MC7"J9A0T(;1IC+`7X0)--O@15FERX`S"Y9JQ$$;HUIB`2P+?)DT^"`A]F@(H +M0+A?,P5L"(]JS.!,BNY-]%H61^CK4%]-'`.;$#X:AWV`<`WBY3T(/7%R:$'X +M9)P"#B'<$*>$HPB?C>/@%,*M<7$@(MP6IX*O$+X8%P\]"'?')0`RTKZ]<8.` +M1[@_+A%T_/7G&M'OC(6GQ/RT#VPQ/W-#'MH[`WFH@--`'CGZJQ"NE>1>.ST3][H`Z8?RQ/7YXBQ/@%M]2! +MQM-OEHMH?,GU.@S'^,GHK[VA#@T\?=>"=8GYDTNB==B`_E$87XK^+3?4@?JS +MT3\;_2^A?_M(@#?1Y?T4PXL!?H?^J>C_)<)/T2U`_]L8_S7ZEZ.?&15SS=C& +M![%<]`]NCL)LZM`_'./O0O]=S=&XV=2A/P_C'T3_@\W1]-74H?\IC'\&_8G; +ML7X(7T)G0/]K"$_0>]'_I"RZ_N@EBZT7&B?\)W'F6^+H];(,KDVT@7CZ3O_6 +M.!6NO>E0"E:PX-]4*(%"_//?1&(I,'K6T[-__UOZW#[[WP8='@#"R..1E>75RBB9U\!#:S@=P@2"9!_^9]O73_]C4.3]/[WQE[F;;789\^HGC]^;UKGHP!?EV[^ZY]D71I@;?WPE +M]>]?OGGLF?BK7Q4^]%;?`Q?O^2"C>\Y/S]___.%'=&V_O'-)V8)EA4\PW\]< +M5^&\-"L_R%U^KGWEZW,6W9V=P,W^R>*I/WS!:-IU>Y+JP+BXQ(F9SP^]\Z^C +M_E`]XP\_VGEQ:/*+PU;-'YL_9N*;Y[[>?_7^?^PI?]3QZT\>7S/[KL]K?OBS +ME.]?<;Z#.V^KW3RBXVC=W][^S:FI3Y]]:'KM7[:>:NYJ*7URZ7O9OPW-'/RW +MWS[UY^WS'MRJ_N,&_H*"K>\/^TK<[X[LF/[=2_T+_9X-\E_::OW'>U\ +M=W3>3[[P^9O3@B_^:/>#)4_,??V.=?$?;___?B5X[LG;0G]_:3&[_-.UV\\;[EO_YT$ZEZ +MX\0.T;K_S)5]RN]&_O%7'SUSZ<(T+7]ZA3>\HK2V(K/@FQ_\?N6LGV5\O';7 +MCB[]79__])SCJ4%/)C6)16N/U+QV_$R37$&ZDW6[#S^PY/(O`]6;A\S?=MOD +M=VXK.)ORY5NCQQO>.^%ZM5'Y\_%OCS%,V9(J'+/^./*:V[;ZY6=E/?=YXH:D +M?[HX]\^_6W\P\&%#2]9C"]3#/U[3N_=/#T_.^=W+/>N_WO:/IR.#_O3^7][8 +M/-=N8V2?O'KOXYUI!Q:5?_'5]F?O&?%"H_G*C_^>^N:7SQR[&E_XU5L//=!W +MS\6,#^9TG__I\_<_IDL8=2(S+G#CT^;_>^8=1,ZI_](>+.Y.'#GMQ_JK\ +ML1/'G'MS_]?W7]WSCT?+?^UX_)/9:SZ_ZXO)TO>6_C9[9NAO@Y_Z[?8_/SA/O77#'R_PK**_ +MWA=VEXQ\=WK'2]\M[/?XY1ON_H7^D,OR#5OYU\=:?_5(4:5@"J7W)7[P<'V9 +M5C-JPH?C?M,VX27O\;&3GOO!O&][&U9/.[KOW*.U^/7;?KH]UE+3QJG_+SN4/O@8;]X]+,[JNY=-4,S?,MG"2K+LH/G=RY\ +M?WGQWX^\,FEO[IZ3MW^[\73>QN+E]WWZ:[+IC:H=)ZSBF?W[KGRG_./(CWYU +MZ9EI%WCMBM-A;^F*BMJ"S!]\L_+W/YOU<<:NM5T[[M+_]'/'N4%/)3TI-JTM +MJCER_+6F,PIY-]$E']Z]Y(%?7JX.#-F\;?[DVVY[YVS!ERFCWS*,/_'>JRYE +MX_B?CWE[BB%URS'AQ];7(C;WRZMES][7$^=)'[+XTS_GKO]=X&##AUDM"QX; +MKE[S\=[>A_^4,QDV*>#BY[5P44Y/I_H@X65@;4\#NP58\R]\':#:NZ$-]GA# +M`+N:0[UO;`L!U1(;#^EME#=2F57I'6`YV!RJ"&]+1;27+BGQ16IC:(>#0#JB +MS*$=O\8=8"S@]'&`'<*>'/BT`YA,8-D_POGS2_3;U15;/B'[2SL +M;@XI6GP=%O`UALH.>D,5T-4%#L(?&]ME8F+[,W!XDY@@ +M[@A5L;_RAIQ_AV6^4FC?]??&]OB6OT!GRZ[C;9J6XTQHK;\Q]#*O>0->[/1< +M\'4H?;"A_?F+8\5?7D12+G&7KVU9"[\ME`0%\;X-(HO,_,4(K,WNPD05W-_Q +MR[9L'U&#!A+&0@*V.N$9_S/BOK9G].+MO"#ZD/?3V)9#POUJ/B&]@X`X(SD1 +M?MCQ@PW"_A]VS./WOV3>[QNL:M_`[_?!?FAQ>N`@U3?=TG;X-I +M$7PRM2!K\7UH?HH(?,O&%-M1=3[O`6/V7E_;:SX?$)5OPYN,;P.\9!&WA0)O +M;H,0B,O;-R;=1=I(R\:BUUO@"-)R(K2\CGWNVQ3B6C:%-"K?N1`0+T^0KS[H +ME>_;U2CWP"N^%-CK3=T';S2FMNPZUW9D.\-'1'*(4IGG<"]Y/@0<587=DBCF +MG$^DY^?O;P..'C[W;WHSXC^^&_-L#"7XQ5TY<+2E[=`;V^1^>&-;:LL;C:&' +M&R!\I+4QY"/V/7'^;:&YI&?^4695`WBT;WE#.F`S6V!_">YFESHJWFP40BIH +M7A&)I#=Y('^3;UMH1$L\M,>U;!2KWOP,0KV__*@C?O<&KLVWUPNZQM!B521R +ML8I!`I('E4_L*,,I:.9M&Q"\OD%(T(*%O$8N:2%?(-X2T%1X0'/I-SM#V@^; +M-S`]"]IXPW$=LPPFJF;"?)NMA+B8/W9`*24J?+Z.>7;20LRE<_]Y*^C\P=:AU2')]Z]FXWG?>\;!*;OMH#.4E' +MF2HXU?$('&=AC/S"LE\UAV3O=0B;P.>5/R2'^#U@;`[MW;4MY(?1ASL,+W_: +MN=63P@I,NTIH:/.I>Y!#%""Y@W"0G$*(KI2!["]!IAL+W%IF6<%YZ%+O9]9V +M%,!!_HVQWE#R^7-P2:V136EK@H+M9^#(F_I/VN#<*\VA/6\UA]CL/;ZV"/C> +MWI7_21OR)UM3B$V6.M'WB7!);12*-+/6V[W`)_A?)//O[\#I]6+J?%]C*G;! +MN=`@:):Q[OD)OFVI*DB`?1TN9"WD;_K.J=G4EA=#*9NF@%W%F`]#IKXKWN*TE`:9X6Z#'WQ`R$]#\[8/&=E:$YT-I_L,A(I)/.EAQ8ZB`N?0+=29/ +M>@IDA]29+*&OL][OBF_9+GI)U:?S]WW3^ZO^"'-QE?]LR$*.F_:R7R7*FUG2 +M&N_;819)SLG!5+E]`SE##_S[Y'O/R=G&T+(D]7D>=CS%X\!\S9+SH-MK)N3\ +M>Q]WC)8'M)U;>7)>9H.6C1O(^5D=K/[\4,R2FGZ"Y(IO`[>/T7Z9?(0_G[)^ +M+1SE2%>*.Y_ULP=!DR#/(3Y^23LK,ZOH.X/>2.0C_RNPEL_T,6(9!/;Z&MLS +M66US:"VB<(%`._T6SX2WUW7.R9DE&FRP@Q$8FYRO[RC@28Z>L=F2&9N!L5'I +MA6R8G4>#;S"VP0V,+:,YI-=@"D?:WU8GVY([8`Z/0?S_A-A,1X-\U^P6MJ%E +M*S2"<(^-/?]^UUK(M!.0\_YGVYV04T%:V);6;3C)F_9\V"K["M<;.[3C)9+C +MTB0WP1%Y5;MG_\<>I;"@3?-FXY.%NO[(AN0CZB/J`O[P5;TQLT5_G.?)\T"WM9\0%8"\09 +M+VPP=GKH2R'-F0L[L07A)GGO2'APJ&+52*_G`'*FZ\U/8OW?V]C.)Q2PF84, +M5+`M&SL*DGNY5F_H#?EYF+]#UK7CR]'B$2C8/->38M\O?MKVKO]3CW+L,VT) +M8J*X'\2/VD8?310U/N8,P+ZW_1]1N8X?MB7Z-_GCB7]3(,&_(91\ZA_)56K7 +MD(HAON'LW"$^QD?VF$&[Q+O]O@X9]#@/PBJ^ +M:C_81Q]-^$;)AI<)RTCS^8,[81GNPX_ZSLH?\TTXF\J7\7./R+A(1MB\X':N +M93ONX&/@0KPO01Q])"%33"`]P"JYEHWP9J3EX]W0LH&$XEO$7:,/*KE[=RFY +MZ#^K.^)3\GM@[L&^R$5]XBCX4G:/F&Q*YN87[V4YIC%D3P7947##67D=G$U5 +M\S(O.?-^UVM0<#AY_;S,+ZBDR]:+P\V_]&64)-OY(X/]QN[%YKQ-@UOX9=N@ +M9%Z%3!,0;&E=)F:*"H:V%7ZI=#_B.QN:SWC41SZ8Z9@/4*$X2'PI?K]/II4E +MF$S)=M7V01/`T6SQ%?1X)I>VJ($Z",5Z^R:8Z;WI+)>LB9!>`[H0\ER#TJ +MGTV$,]QX5#5$\+#0I=@T=_!+C7)UOJ[0 +MIYY2^A:9XB^T:?WG]O.Z?/]/YP;.[\EW#>=[(.=\W)[&T%&F1#QOTI9H03OC +MJW`*U\Z!^$P[B+[BE?"KQO:EO_&VUWEDED3?]LY/6S[S,+X=G?&O+Q$KU#Y5 +MFTF[J=,.F<4:UC7VC><[TSV,B^G(/K2Q;1.K6R,<\G'^X1V:M[T@U[[M3=6] +MLK.5')P8UO5%5//!]X@'>'Y]D2:5]*8./OJ#C=P9#V-;3[SS,E._^F!>YCIB +M?-'OG<@[Z_M+W=`G]I +MV^_[I$W5HHX7->!\N^43YIQ^00+7\BW^I^)XWK;\/^X +MA_X_/?3WZ%65I`PIV_SKX?,K3M#)CA% +MS`IO^.<;.F39!S>TU[3BYD]LQ +MYH+Y(L<):V7GIK-&5NDOJ1:(6Q8V*R^Y4^0LDF6A)C-IHR?C.WZ="D/9UX#[ +M'#@>N#\")_B1V)XRE#%KVJ>`N3&5+6P.P7K.2,RLR)HZ/)Q*@Q2U4))\=@.S +M:5;'/9!@AOQG/#R7I.GP:LZ&C@QJ4CP_JV,.KXG79'?4`T<@\UG@IMC-9&^F +M9V['OI)M0NH4:&;!HP:Y\$+7T1+PYVO"](25:5V;/]\CZ-I8L+4=9;G&5,_@ +M01:--Y7Y'8&AGN%R7CNEO@UI,"^(2BT_*^_]KM3CZH(FA3)G,&D,R9CWNX+` +M;U-7F7]16"7W-+U-RHJ^D!T)KVCCY,+H)WJ90[`^7!(NX4N:S+HM,.6HC+G$ +M-^DU1!/VJ9.U9^)V>,;N4IB-C"]1W5%&+#P(0;*/&M0@#1T@M(:FP"9]SGC^ +M2$6',D<6?H7HILC-QA2V1Y'@;P$^!Q)X/C(:+AJV:M*]ZHXT(DJ]Z20]&=M" +MO>84LL??T)X`LTK:X@^6]GS(K;VK46C_4<(JQG2R$^E0;RA!*!3W>HB=@]D= +MZS.WL7(9>(A\OVQ]6F:CG"^`,K4'!#EC^K##0]:NA_PF_J@G/RD'YG3DJAA0 +MG0)G`%R,#\H$L'P:B2P@*G]]^REPC5`9XPA?+YX9WQH">V6(/P\5H3W(5I"C +MSC\.ZR'L?M"9A[;F=`!T,:#-*$EK%D)-L%;&$W'3=A#8-.7\03DMH-D4AA+8 +M)Q@5KHZMR=[!H1:!N61"XFMOHLET&/8KNTS>4+,(RY)[U%X0%K6?,N6?A2KB +MXHM$,RAG=20PL%&U'XZ?@?GJ*3)>JYK5I+9LCA^VWI_45L*8=H;,_*:,XP4L +M_US(G\FT\/5(]JX+)8"&7\^KC0VAE".9RH8"#O*@3+F-)P5*$W>J2?G"W'@A +MGGZ297R]$0*XA7_%J,&G,XV0;2UDVJM@7<@)9A'7(ZMC-[827F]M7\1\* +MPB,"IS6W/XJSU"@^!BL_%%8)3=!'-Z_F98[_!P%ENPH@0*R.7XMT`$^SM +MPMQ"?P4-M\/!=HE&3*!7T],%7Z82]X@ +M<^?#VJ!9F[*%V`N?2SRC[LC1[C381_(&WF1K@[D_F562QN:-4&QU;3J:4E06 +M)!PS7L5;CLO6"9:?\#9QB*FLPE[6:"_;E%+!"ZTJR&95K)PO:M]_>_S\+#D' +MZN!IWPR"07PIV]>VM@'<#$$FF3FDZ0)M<@5?PFMV(,MJ]T"!?'X[D_M< +M)_BUOK?L6M]NTI2B%_6<3U@F@"QW_I$M(T+G%[#:5;:"380_GY1P])W$2Z+, +MS&NUFXJG<)O`)&OG3.O:X5X3MRF)VS0)L@'MP +M$VR@FZ`F<2UDJ#=WKA/6B1#A6SL$77T;TR#XVFJ2M9M24CLT@[E-@^/*9+G- +MS-%1.T-^#2D1V"TA3E\?/]_7-C>U<4E'72/?X>L$M3[Y'8RY<@1LG<= +MF'1@;Q.@!4R<+-=_'+3K0LQA$'AD!D69IL*TESEW$,P>YDR^V0=M9(2O+=?& +MIHKUB+,%)2+$^6I_?8=ZZW'V.5+"^]OD;/-Q=EWHX8"9UP0"P*O#)F;OD_Q\ +MOG#,!6TF41Z?I-TJ:R(5I.M+HIBOAS!IKG^_ZRAQSCK.'@JD%@#?ILC,XQE$ +M7D;^$%EVRC)2R_)M\6X>3.1#]:'\QE3>>;X%"0E?6P_LVAHPH-.;^N#=PA$9G50*`^!(&FD/D@PR?R +M@1`[GFL.G=+$.4V5[;8SD*EBEBEYGRS'E1ZG29&+RKWBIL3WN[03B$^5F:$5 +M1FWJ4*\_JDG1LEO%9!`3Y9?\F<3,NSR@'1]."_/%8RZ,G_N3W"G,D0XS=\9I +M&N8'D=]QQB1SI@SRMBCG)A$@YR*1+YE#9"LAJY*/#]ZD+>#4\=X0O\Y4==!6 +M99E[[T'2[!\\%^10.!<(WZKV:QI3-38E"(?;CBI\>A&J?K@)49ON4KA*J&KJ +M@=^3BL'G0?`(7&)PRT"$,HXP$Q.:@)CRY07YOHFFKM2"P,@N>SO4)YG:$&\7S0_(E^UB +M+LU+:$I2FK_F.=O=J5^#VB]S$<]XPHC)N88/V]2;DG/7@4[^I2N311(BFLR +M:PV@G5=AUCZ!&,:LU6&@Q*QU@]9BU@[&0(Y96PO:?+.6!^V]&K-V&6@%LU9^ +MW\71O9M-V@=!FV#6,H>R+IXW:^V@[2%(T5X"CN,]<5_MZM(DF"_Y\M1I(6!4'MP#+&]:[N4Y^B''/-0XU`1% +M6IB2TASRJ8R;RK8A]^M0+)-Y^0:/T4C/R;O&I<+7X>S#';;L!J:#GHRW>7C; +M3X'WLS(A3[8^GF<5>9Z0-YQVSW>DFFRIS*Z,!WWY:$[:+YE!/XDMI)NR?>!8Z5*Q?7KJI>`-7'E;#@@/5B]; +M+(Q<*<\1EE4OA[@J:,KWYL%>,!/Y)=9D:-`DB>EN`Y,/^H8+_'[Z.G@PI_&< +M%^,XG\)$)7=,6T+A_`_EQJESE"Q,3D1D=#A;R?A];3)E$V+QXP^RRKUQ9]J^ +MA;FZ\QP+.U)9GF<]J=C,^M0$I9\-I[QP'N1V]C!X63L7!SLN9!TW%8NMO$61 +M(+#\II%D]-Q[I#S9K&(59QGA:=#Y(^304[6BYZ1 +M3'L#3/V2A1="?)-9,Q+:^8*)2/AM587,K)_UK(>F]<;VM8I3+CC*FGD(L39S +M>[CJ"-OAD6LZ$L:G*[+43R8D;`83WP$51I4'+&&8HK![,D4.$(4#:VZH;",E +M@X[7A\Q0D+!"E29+#1-.:HK#CYF)",LKF4VL@$W0$)-'+U-#2H9PWM1T +MGFO2GT_(LZ>S0A&I8F9W]$0BV;R&)6!.9OG"9%W9+EF3#"DG`LE`I=ATSN]1[,16*K+&M@G>SA+STZEX[WZ!:D\#HM$@L:@O\[&([3)NAT +M%6#J(E,%HC4%S[,:.#)[OEYA20]HB%$E`V.1R)NTH(F8?)"28O"I`1B>)S@3 +MP,P+;(*/Z!/T^6TD!"3CC-HF-"0TSU8?^6&V>CTD;57;9.>-"=TP<\P%8Z"\ +M/0T\3[=G>IX."0IX.L2XL"=L5W:#>>3H@T=2?P[-S!GH\+!B1W#TZ#[#A`$'G@?))L>U(FJU*-@03F3Y`PS)L!"2SZ>57Q +M:$@XLN)91G-HJ,Z7G-^*FQ34M^?LA?E?RN?FR$2`@"F4#4(V"S\+L;>U-,&1 +M'X=X76J8SSF*O$G.T^WROB^A98*O32B(SQG+6!+5MD_-1K&L*5QF*_LC7];T +MDJO,.>P4>!C<+']ITRSS:S@XE^SG+2N>`AWG\\FX4\P>R/MH/M)5CZ@J@]3#N-R8NG1.>'G:J8XSG25;7Y.L81P_4Z4H3U%.:?/K\E<`//0#< +M(\A/\V[@S##%PS9UK%SQ;#+O*_?QYRZJ@-,VK2![#_*Z6M"I6W@!A)_YV`HY +M:+<@_?!C=XCWIHC#JU0[WG2N$)Y]4^/+]+P02M/P?PC!OHOJ'`#NO@[6DVN: +M@B/Y+MOT=&BR6<=]R4Q)V<'K..Q:\*NT`)QZ<&?=N'7SJ(Y)X +MB6$.78@8(N_R%L(7">[]:?9GVY-TL.Q(2-62V5XN)/C:AK?H$.%^J1/(.?Y$ +MIYKP3CABZ^AF>EO5FF0W!PLZ3.PAGB`3//.^CCC?2-\NB'N-@$#(H2-\IGQH +MVY_[%:=\TR\H-+(SS/G;!I_WE2JFF!9T)&?RF>#SO77/'\"HXAN52#3JTJ:+ +MR-DD&M,%OL6$BVVG3,L?V7-5&XF\)GN?3*&*!'+SQN=/F'A[`3/)L:BR:K'J +M9S`>1@.K-(-)]3>7P!06%9?<,U7(GZ^F1V(Y8G^*3)E]A%3\"<[-0I2JA335JIJFF&AVV61LWMIO='FA:T=&9*G5, +M<1P=[F8=VQTK.M;A[K2B!!8D^"K\Q4G$.4$4[Y):&U1*IR5J=L04"&J:C0F>6*(/Z! +MC^P`CZ\H;=X':OU=//I[^D"U>=8%A%IS;F?[]>)+,TV/#V[ +M+?*8GBA+]$##H_HZ%N;O2:(BVVD.Q[0"?@Q\A-&OS*/`:/;"7H;,A*M'GA:G +MWZ(-GU%90%T6+%[:%BV9``4[",7R;MGS0K,BBB40VRD]7:M_;(9(_6BOZ`:> +ML6\I`_*[,$>9PV\4C$$=KN@!*80@:'S61VPSL<>^@\(PQX!"9>E$I5PP-UK: +M&OOU;W3!S)ZZQU&X1]>8?ZW,8V>J1R][E9C@G;W(+S>O^C!,D"$&2A\&[W4_ +M!B]&VAAX$00,P[1]/#`,^(`CPSM=NTX#%#*T:WIQ['GY_*@!EW&V!-L_V6(PA#TZQ=0 +M,@C,@^76I&7LUXTLU_LA^&BY#!?>-WR;95!Y&(4$(E%\Y-59>93)CIE!._0- +M.!3?]^#60P?O@:WWM-Z_;W]\*_'@WOOW;[G'IA0IAH"1*Z&$(QJA9M&GK.Z< +MC"P+9?(; +M]G(N!?[K".G-C=WBB%:XH]Y!)($Q_'R9!!,WD##_@!\HSE<'3)0-D99RF.]> +MG8YC/MU59QMJ+!&/S#J6U(T[.XBE#GT-3S*;F7DF1'2O73Z^^!?M$81GS(5FRW7PVIFFD/W&Z3=N.M&\=;FQIN#_<%XV+VZZXXA)B\W9)VBXJC89`#$3WB3?M +MBZ]N5V_=NS]RZ$/83MS-HA]2;`6=AD3'12E*RM!J);M,]4^S,$O6'-VG'@.T(,Q#XQ@CVVWO(+5!JSUJX%NGF4'RJ5R`N? +MKLP''N!F(?T^-.,Q!*[Q2I9MQ7SX=12P\ULPS/?)&]%(A5;XCPU0/W\_4*W_ +M7)E?F]D?!<9J:%4)NTW3\[>^+/+9,/]'X+DA;N%K#)I6'#C.;%8N7\(O+9\_R17JR,\&*;Y?%V"4AR&NX;U+*,YS"A8>0M`2+!\W)+!TV@Y,.CY>#_,C1NQI@$!)7./^NVQI\G7<;&M5SEP@M3R>[#*'/TA32`VK^I6# +M)-G-8VA;TTT!L^?SU:.&\*$$H/)8KBTJ4RSN04M9*+3N[M=WHA:I<`#UU02; +M&AKS>X*@T,1D&-H,YT\3GSR>?!3%O4`]3;T_=[5-`FH/4+<;,?#?QX[G5\;[ +MX)V5B;YW_I7N"[[#N^X'QZ2L5RL,UB/_1@W/MBI6Q:R=:&A&2Y87QTB_C:?@B!%)YAX:`US=QCD' +M4+?!SI>*&!P0;(7@&G">QFP$V))FD0VIL>X.B+'XA(Z$LNQ+0+'@P\V,B-7R +M24#'JS`D[)=.V*+`LQ)T\U%TG+A`N+1<`U!DLZLB(:H&9D\?O_`XCE"B6LI: +MTN)03/@J8V!Y.V)G6^L9YE,T*;C7>JU=6(K`!.XVX)K6*KR$K!RIS_.(7UVA +M7N*\]:T:+X:12`7&/F[@,.?A\1/&L-,XWT]J,T9HO!1FJ.(PP\'%=D9,1!`S^.]BH'((9B&TNM-CG*@B6@I.KM]>/F[O!-8FEZFVZL'L +MJ^;5HO3;4YCGTP^BOBF,^>'QBFC#`CY[X:\VU=I:V8?=7G#3-O571)9IS!YT_*O"`; +MXVWU43QM/#&Z8UB,>5&7N^33E;EAXOK6R=)R%5Y>W;F@\N#6VH!R&(;,:N-/ +M,_[E95,#O+H`[,!)D*:`F08J"]3$2:!F@,H`-0E4SP^)3X:`6;J&'&5%^`]S +M#TE,$PHAP`+7W5'A^`#4+QH`UQTJL4S^&Z;4A&\O-RFA#ME,'+I'E&+6C7%#S)?1F.HMZ9PU-^-WJZ$ZUW`?/Z&;S +MF&G`[*1A^+-EZ^`S.L^DGR$%K6ITCH?L,[H@/:.C3JB[+P^9XK[F+ +M+(5E&+.@;/VY&7N8S$Y<,*3W:_^CY7ZZ<#@+ORYHN>]<<>*0Q):NBTZ*K*-MA1AWHWY) +M_Y'JYJ(`8_IM`O@%<)AZ9Y]CF#[K]&(612PR$G.LJ'P?^6'.(7V_DTI^7T?I +M:TK]H>VYLGHG'MQ-UHM2PSLS:\=!>GV#+PU7:[D?^-3L:W")ECM,REFQ`;Y# +M]@1R"T@DWF(7B:_DO&2TJR3K/'DX^!+JZ2Z-JZ!U=Y+!J-RO#QLRZWTTB7F# +M(X[RK8#Y]AI>29C:),?/P*6]PMR002F;1@0"7>W'KA[:P3VW?W0?5LC=]]GNNO0 +MOOV1BX_P7J^<+L79/AUEOT/E(=NM*[@\A[N-L<97P'=F,4"?94'-JZ7W8=+I^I39VKTETII%>)#Z?CP +M1\5X.+XBS*1CP!.X]:MO?VD*1VWXN3,Q-$3\7Q+5Y`[X?\E5*U8SH)8$18&, +M2D+,!8)!8>QJ2M7P.NPD?9\G5*4\_UBY2`3AN=?@_V54M3^?K0<69/8Y<%^F +M6F7A\R=85>_G_N_GY](@!+#$(N.9R)[*,JOI4JG?Y\J+U5K.T12W#]T6P5,_ +MV9CX`..K`6/F6!GS=!F5(TA#R:\'P?0T&4BONXS'!BXZAU--"Q33NT:4"93] +M"G53QHP+:Z3/V$6,HVU&Z&=JQ+A6$-HZ]2HR)L?G5]#NU5:#GS7%0KP;ANH9/U'%1[L#$`2 +MQVO"18B7.PP4WU*D)O`@VP7L],Y^UM^9%Z;7+M-I5EP`D2[R8C^5IPE\/NHTP\T3*0RT"L/OG[N@!B%ZA9 +MKM?1QB6LCI_AF1%P8<;4Z.6&^.Y7ELO>CS4['Q> +M-@GO5[HP^P]+>P8<&&/WN;`7/(^LS_3H43%0HQ6^*18KJ53UN$W9`<+'UTZ" +MF-$]"XHU5-.W"P:@YHFU_D8GU8W3K"]]L=YH<1"8<:`L\*U.>JDFL'%UGAE) +M**.3SLZ<\;=]QGBN:6[NA%C"[`.E4`WP&`'$5PN4?(3F)JD%T^S:8:S%ZZ,; +M&^I[9&R=(9ON@5+J17FL1)S&75IA)\ZVR571U9DWCA+A +M<7O^#R4XF.7<<^SUA+:Z9Y(I/35KB'\#/EJ`6+D?_B]%Y(-P(+)/W/_0@W?# +MOH/B^H@%J(W9S8C/Z#9G=0R:;K%QPY01R$D/H;+_!0R[UA@:CD%K9IT7NO:6 +M0H\U3!6?G:F/OD)F`0E\^W;G"<3K#1?[)1)F91\$.?`BY9$\;_`,-. +M/'28U`J'&[H5JT%Q#$[8D6@O:^ZUC'?8P5/J@CGM97!]0W:5!2RFJ;S5L?&V +M?W`>-5_E$=R4;UON%Z0,SKDF@HW^C^Q!0?A2MK[9\&$C>/K')<%Z-B-*OFO! +MR\4._!6%N,A?@%GG1QXK?V560J-$;]TTP]?@IB=9=^YR\":1:>1U_Q]LRAZ_ +M+?`3PN(VK.E'X+U(;OT4(A.<*?,9L'53II1+-,8$@]IRGI>)-"&7"(F\ +M&9Z8_<_/QB_I*><=6:)Y=>+[*SO$>Z)[]]]'[8N(\0-$XY;U1$2\\>[8(>(2 +MN!;V9+N(NH8,160&R:C%,<(C)P_R`WEAI+;(HRAO*7J^#^S"K78GC),A#N*^_0<>NB\JB@<.PM@!\<&]^^$;XMZ#]SWTX#YI +M?US\;]DM'KC?T("KL_F8OW>O>'^K]->]]]RS[Q`<$@_<_<"^>^)FM[COX$&X +MWO:EL-=QSX$'84_,)Z[;882J'EN=I9E/'-<%A%36SSD?S_^-86!N@AQTK3]4 +MM\DI;FLB0DRZ/&,)S];/5'21"P1[FZ4"NQ)YV]*LJ5A<-UF:^Q1/UONN4NM[#AVZ/[)#7%]RR%URMUSZH!ON86#O??O@9;=X;_7!?5\% +M.WJCZ9MXVRU%=CG"LPJE0MM%OT8A>R"0()+$(MM=2++%PH-$T8!A"VT%>.L> +M8(^"ZP1:>&LO&+)8N-MHV>T(:GQAFV//K@+Q:@V,%\Z2B?O>`@<#E@>`V01. +MXA2(SY8NE(W,?17XAA=`/G2)8HD#\U=@[O@:,&O!;5MLWQ#G'4BU_K+B<:L5 +M!#I=\7A^`.%(Y<(_RV0<(9QBB*5.LU,VYLX/Z.XY',(.S%?$+6?Y&5NH%,$< +MG^*O01`.IW*&S/>EJ(PNX<:R<$M!`W<'J1X&!(^9?VL@6%`(@M.6&>67[L.] +M<@A=P68-Y_8;<`$_=XF6T3>_#`(PA]D0(VO8,2HW!9)OZP$3',O7K]L6*1NU?.G;X`[$)*%6%E!1%4-(U&QA +M>):VA_"S=L)=8PQ1)"7UO2@)CMS5)U'/]Z@,!>X!\Q1Z6^[C-7DKT^IOZP/U +MIP@,57(8LR5=7+LZ!"Q=GF:@N83-[3W/]8&<@-Y]C8&OR[X1+,6QI+@(@Y6R +MEY,A-(,C#V(7."J=4:","'I0[.O1[S58E?_BI'V(%X_E:=FN%:Z%I@01CS09 +M0G`QWVR`;=)_S+R\IZ``(\2DM^TLK@__XN\K\[0`;^L,-5D-[I:UU)2"L(`_ +M@F"EFE7`YS/[<.1*9B_,[X;VZ\A$.&_T)^^/'=.;Z6/I-6?KPE`NW%E963\C4@?^WSG'%W[[<5UA7W'Q!EFTC=>^"A_1',KV^% +MB.B2VM9+WMK6MDVPP<8WWA8AIO=LO@:;$%^&Q"L0&W59W$*;".QUI/I1<4`> +M*,4#H!')TS"P1?^-R;,&>KFH?>*R/X(?Q\HU6U4,QTLA8+H#8-YF1%_'VE0% +M?]VZ>)5O3T$NOTA["=RGN0#4]QY-$X'*V:?T';?`O!7CIXATCXY3Y5D0C:MG +MJ>HZW?2*>2DH.VLEMMR#V0V_`+8,#.C'XR5XI+3-_.?/5BPF`J-]&Q*RA_8_ +M88;YA<_L*W,7&YY>9F:!^8:BN.]>\,*20Q2.Z[MA&4=I"'1PL9"C.[HT_=.CRKT1J\IQL(1?2VT7^/8/'LL>VX/-40D%`_1YB";7P_# +M_.4[4=DD8`JF:E1"VEY@B:Z20)8G>B8T<`*1*/GKRKSV,S3,7KQ0!F?8)7,< +M+X@-FXA>KB.+H'DW1&5BTVJ6=N]:+;<.*"R@9GO8Z(WL=.[/*%KI@8O@.#1/ +M4Y$.TU_@++5<,H@S.2^6L?V(OKSJ')@E8.YE@.'2@QA%Z=9MSY?,_!4-],G] +M#8/_/%_>9FU]SA#':*0)>YNX#!^/$N7L/'@@^*%PC6I!PV98M6[+U +M68=O:RA[+%\.I=^916F43".-$MIIU!T2PBZ'8LA_\;N2<_FN[2,\-8W=D+KW +M)2Q9!T,'F1@Q@#?!=Y%?J1JK64,D3N*Q-DC_"-(WP5+??P#[)BPD[P;)FB%% +M3(/"C":L,FP)V$J;3QLR)&B+J@;?/PV^`=07!G9D'`QWT"OR125O<-0C!EX_ +M545A[F@5M!:`.TI=8.&$;BU*^-O(^]>5.23>M>XC,%'[]NT0I4OF#XEK'SJT +MKV3W\Q>XB[8I6TL.';QGJU2ZY1[,=VC^R(&'[F[=)UYB%P_<*[6(]*DV:+QM +M)UUV(U"U?'PWFMU3;PV>("9/;`A2,F..X9OS#Q/+_-2::"TK)T17A2=;VV;% +MYVL7'(O"ZLI/AXQ",(;[Z2&XF6`>6EDIQ3S":A<:.J+/6%+0V''7!3*6]^/`*K/P"Q1[)1^"66[G%#\I".6ZD9MJMH9'_03VW5-R< +MO^%'T"Q`<'K#N);CBTF+"!N`BNS[VOW[[]GQ>\OO#ID=J`EU21_B-(RRY(0U +MB6#4X;U`A\N5. +MOKG6;UK(B1P]69J"$:_U,PAB4710N/!K+`!E70+!J1'+D@KII@.'XO[=8GMS +MV7WVZ_'9S5^VM=[:&+NI6`V"[5'1=>]#AM@6(P_%6O=U5N56;M[\,8^SVF/4 +M`CZ<Z"YE#FO$_+=DT:CNCI@+R2>W:2_#2ZJ7)]5*)0E36D4 +M/IHW6>"6W+L4&&)Y&YR7>S#S)ATUA3#@]ZG_R5Q`ZJZNDAX%E,8D2A[NQ,TT +M!`NO@,^9<"B/OSK[%Q20.MZL6$!!&J;6,)MZ*UHE\EI;*QI/EEBR_E;+Y&=U +M-T.[EO/WT0,02Q&1++G?Q_T8A;<8D6R$'Z(AIV93^'>Y(P0`P??@!PE +M3ND@]3(ZG9XBVF#N"<(C9E.I#*3ON"A72D2'J<%WC,A2+CZAFTH%%$,S6N,9 +M>Y9P:[F=0)E->$K_%BF:QHS@3$$HM["R\M:+>(2"66N1D([:8ZZ"3`^;(:[B +MPYJ95\WL&1VESW0A`^N6$*3P>\>MX_D;B2&D'"FCUN_)D>.G+=!NO."!(-UD +M<_U;":-`G_*VT6@'/'ZGY261O?*_EU,$MQZF']NV_YQN5]UL@28:J/B`GV>L`_,T0:I;ZH0_F +MT(KS;&%%?&?=Z'ZJ*FV>9*Z;J/`B`;982&`6'TF3"QO3:UTK6^DZS=*V-<>G +M2\M-_UQ!(&9!YM%D97T6"9J8JP?JN8;Z;#VJ;,B*5'T6NT.(DD4"J!@Y>TP/ +ME@,CLBZ'%+#V7ZKO0)0Q7)'0!'@$BY<"CUMYQ4OT']!Y/TGE76F"8::)1-FQ +M_+-W7DH1CA>L\?\A@AO9*I^[+BG[T77.'LW01G+[%->OU[XMMYM#^0G`6*R4 +MVT_BR"A1%.5VIX&CIZ#=!0PD\_\NMYL`/GIA#R@_,#/P$7VRA/H4/A*16^JV +ML:`2'^.DW6_W31'AUI;*KK?QL%"$TY5&1!EN:+\_5I,L<64C65DH2S*,QHE@ +M0$'"C`E9M5:'L:=RK)4&N:0G6SO&A?UU^/%\#R.]]9>5^7N8#2-KE[/D7-DR +M7KB-,AM7Q>.%#__UU?;0A,R_!SP'G#0*#_>3"B=79(THV(G:F1%MZ5\Z4L00/D\W?I&#^/R$D**_BT!B$ +MD,>D6(.)BJ6:Q_-?!2<>_4]1@)8.U-Q!C'DSQ +M-^X0K]D%UXB&1SUP\"`V4*YRQ=,F?NV*0UO$$C*PI5K\&OGO5T1$X_S?%D*1 +MK+GX'7(*TM^W3=9(D`PE'0,6!O/9U3)"RN]T)$]?H!E_(DL`2V9_AW2Z*9$M +M7P#LA7^G\;9%0=K"[!9SAE*ZJ2F5*V=F-6X+4-_!'20F<(=U'BUQ2I+4YLKO +M:,]F"XDOY`"$0'7FT.A_)O-B0WV5?T'(7P-/=2X9!LBV4IK!F +M^U-U%MK)V5VH%;.79-&36*Y_LLRSJX#Z+AYY&0N?T1G36(&2[.!0;)9>$H4M +M()Y[FI<+!&`Z8,-.*FU)B:ZP1C9$M"]PX(BCM'T,JK'A2H@S:A:)G?F=]>!+ +M21,Y2]N.!Q:J!\U1BAYBP#^5,&Q:>4*O.#&7`O&='+/]/.Q>PYD@GERG#@,>@CTN\A)F0W)&!YZG]O989O>[;"?87HUPH>S(#XI,ZFW]5)"+^CIY+OY`CCU/2G?NW._@ZT=W,K:3;?#4\0 +MN6+X?$Z6?G46!:X*=J:.9*M.I3XTQ>XP4W+8W'T +M";^7JYHEM/^VO)X*_];<=\O%BZ+*3=2KF-#.VME4^K\YAV`)$Z@T^YU\&:CE +MA,3*N]X2*+\IQ#1L=S_U6(/[U@)E&9=*AHZM(:'6VEZ9$<>/FT=/RE&=2GY( +M]+#H^:Y!TXRA8'J!\4K;F2W;MD7(CHAX#T3W[M^_K_60"/$#!\0''[HGJF[X +MXX&['[CKT#U[`_NO5-IKM+"=T@I$BU4KI);Y=+)$!RJ%M&-Z2?OE%KG63PVY +MK(S0A%A_G!P1Q[3:Q3GB\NW?8;&5;:ER0-"<[>'2CL%.C6?Z\11JIG:\>LBYNBD%RS('>O:W=% +MSXN>2Z+9PL%VBJKUED[E&D2WYBK\`[DPGL49?8>GD8H9T&PT["S[%ATDXX4' +M2\.5$$%SX#!D"QE43(?KHBA<+`U'W[7RLE7S++=0(,&L.FV+CYX[&]=;I_O,+PZD^9 +M7$E=JUI`9%HZU*^[[M@MS+:L9TOB!>I2F/E-9=*W=`>ZS$]M$W%9ZF]N)^8I +M5N2/-DKK%7C,.JL4_@(.\XW,;V?-*=N(@L\;AJ(>/0K=3^D##5LTYX**'1I9 +MW[7M2#8E2N\2B=V%1+K38-EN;E2::)CA$O1I^6RNC8D+5/O/*Q>;85%@K6&L +MNIG:?&V(#LBQ:\V2TMMI;K:918TCNFR?H*7U7FZQ*D**QRSN_NT#__IG61?= +MC06K\?65)2-$26*MKZ/"V^1Y"_-54PG2.P%$D#VD2$FK"T_^_8YM3=;`B5LS +M"9L4S*^N;G%RK60=W:3JQ^N52``[&.V8'?S6"XX[H#88XZ0K%EH*P8]0='"M +M,2P[]-0(]F,B:)AXR,;@BU1[J:>FTI$Q9-0?+1+N`GR.Z2&F.VA7)U)!(Q?6 +M81&FT)M2V"<'\``#G9OTKQ`SQ:O=.2AI[VUPU9N@"4(\!OU[*B +M(0&S^''KV4]@I3:Q%N:;(G-8$HK;NJ=`3(-X^@R(MN;7UL#\.).97Y/^B[JX>!'%A?=*;R`;E%:@*(-,0>"'2L<6 +M+#]_S:1WC48.?"5.KV7^Z]<@6,%I6K,1''Z'7QYV,&#O=N1RREK!8YA/#?-- +MD?>"2`^#\[7JS-1_&31+">M%RN'M(99MLV]=Q#>$+53)"%_2"C:?\A\="^./WKDCTF;YL%8GC$ +MDH8K(%/?N\X/;0X3K_R1'H,4)&RU/`['&C2-;JNWMQF>N+ZC!`PG!M_=159I +MC^$BM'267=ZSICM7@L+9E\!WFB9QD`6^'V:L+*,D[M-Q\YY`UQ=?]'*,/?`M +MP3)#O%CO!69?@`8A1&S#;V$W)Q'M=F['RHKYCI>=2F0A':$>D2,K7X9YQH`% +MA^='X!&4Z#PX6"O'WGGF@5(_R=2U43T0^^MGL1@C1K7"%T^@H5!5'=EV +M23CR'K#8R0#+@(N+:[-\L%)#[5O<1:5PZ=-HNIT`-^KJV9E*#A"9+F+\][=_ +M(=@KB<_J'(;TNQ<,>G!L"M-G$J5#$X\RT^=TFFA%G&7RDSIAB`9H!#C-*T_<:XTBOI*BD'0L3VP[G,632;IY#N%H +M>CJ7JLF^FZO6+`/6JE[B0:D$X[@$<7`9V'V:Z#I=E81XW=AI/*IER=;Z16(9 +M\#LZ:I2`X@_GPN4D+TI)=@IVF,2=1!Z+JFYB-9Z15/VD79/.ZL]B3\<$.X19 +M<),PX"#$UT3V(J_,7IY&H;PZT6BE,%;1V%_2(>L2UH"D<9JFQ7307I<@H!=' +M"/&:-!(KXE@[SF-UMG[`WK1V%%N7I7.KJ^;;3IH&D72N/&3?31HH17[^^3U3 +MFEQ%9[F&!BE1.;D$NVWFF1H3DSZG=UA&S-ES%OIRN/,B0<4X39ZC_P(ATI8% +M]V!#TE1:Q)`PX9W?RN-N;F9-'^9QBA=393OS.YWD$)KF0?LUQV].X[,4M@W9 +M7.'/F,:*I1W?!ZDU:8C,<,243P%S&5UXS^8[0"N`^8$IJGS`]6"3 +M"X73%T*KLP)E21R@G=FKWC"X4@1\@ELL'SGR!VB]I(_S]'1L'(#%7JN>^&J] +M7*CCL2B\?\%"^1VC"!K?)*?+9T%[L5ZDLQP?,L/4!@CS(8+Z@&Z`HR5Q12^S +M4DKD6E,I/0IOF'R]>KJV7?2+<@KP(XTI)+]XU\WP"^RP4R!#;Q=H1S9U+RGN +M$NQL-D;)T$*L_TI]H4RM65P[C+L5*O4\[OX5-RJG:%RRCN`A +MS-]_-S<&[)`YT`B7:9Z__8]DB'L.>KG;?#>#:\S.6L?6!\5,2%\S^,^2`5.3 +M'>>9PR8_@8Y=**]WUC;]^ZX-(_0$4L"!>,Y1-@#!2TL2&_^.HX%"_!S=>WM; +M,O0G1X^:ODC/FZ>6F-XB4$VKE8"72@FH-SY@_2$+4$]5:!0'U#8P/#5;#<]] +M7-DF#N'#P-S=24W03DZ]4-J:OT^EXC!\>KJZNZ891AJ!BG8@-:O6^RZ"6=ZW +M1"2'4&A$D2&8+IE4^G0$V2.?KT5@4?8I8]Q_YX+(-\:`CW7K-)?&2GT:;X/5 +M10L/;\F6BWXPNA*;6@W:E8[IA(3\J.G7,&(-YE#)+)>!Y%PS+?/^Q6V]1.@T +M$,JU!O8F"->>BPI_JV"7B/02/-PR]",5FN +M$=EA8LHSM!0_U<7%#14Q9:^LC.P!=RFS!R6U[*&77^H_SL$*@W[H+Z= +M14F9GM%R=TIHY-#.5G($7(;;O2%&+&B7V(S`6,2'T23@7KW%>%UW<$Z)V"&" +MNY'L?\;F*/S&@''AR\W=*-M!32=IRN`JE&7HI9M?K;A<(R^%OZQ8EAY_==;[ +M-,H.*F5:8YP&WTQ\'?@0QNR7Y*8>V-YOAR9V\(P-FNPC7)=7&&^0;3BI?X87 +M5N:J(2_`//FI0<,!S(]=`8U!LEVNT`IOT2[/D3\97B4F@4^NJ](*/X989.,, +M-0U,0WBK=5@K&`'^F7#EI6*UI]D*6M"R%C0C3AIN/VN90C`+U"BP=\/GBU/V +MW?V0Z?/%*:7?`S1Q&DP>\&]:!LU7VDL]1RPXQ>&$;OUCZ?)C(MNC5P#[8QAY +M,@$C?UE8F2<=A3:K*H-:0/)\ +MC*$'N38LO5)_C@-UUQ0S_9Y#PD"+_"=AO59N'%9E:A&Y;N&5= +MV/H*=XZAN()EMJ8R7*R)"OY*@F`EE@?V-WBT4NG>/F9IJZI;M`H=^IZG3'VM@(75/?=\1$4> +MJQR:Q^TPMRL-OJ>!_^SP]J0_?"L*FV()XDA6FZ33]B5$3']*I=QFU*][Y5=G +MGX;N7NRFKEN71M$>_14"G3LRHJ/:)2C:'IN!9M"D6Q<&P/'.KF;%=PWXM"]B +M3X]/-X-L':H#5_MUFX6/PT\9TG@1Y.^ES;^'@9;)'!ONP7JM2DBQC%[C$M^@ +M9^R\:!D&_ZV&6&L?72H0J^ZSUB]GN,SDM'+4M'\V_^$(9PQ<#D"3RZ +MOKDFR-\\;(?NVH57N"+DU#4=A11.-^:P>]3>K]?6.[[5P;1+[IH,9I/N=G#] +MI&6Y"K4)1)!;(M",52VWURQ8#$O\?>EM,#\&S"=&+(D=D@T2B\+#B@V+9M^E +M%@/,K,Y)V?T.,-N\+YBZB6'`3P.U:R_A4(CB]UX&_/)A8CQ%P:,O/@!5>VSG`VQ42_WH&[LO5%;'.HV1D>X2-ELQV*FL6+M>4> +M>AAE!%>6>B>!WQJO#2[5`#PNQ! +M'ES6)6N"55B0`R=0SV3)=`_T0'Z`*VXWC\P:`T;NZ`)G0D=T`XT!L+_^&QESM9VT"U. +MXB!X&CIB'ODK9T6/U?46I+P0YYJ>H,=J7!!=VFZ5GG@.+6)^V8+AR?KH8T3< +M,F.5>GF#*/;)U2X4P!V4HHI#6NT@AA0E=^K$@W*Y`DD[S'*NWM*!']LF"6BN +M)N5$Z<@7PAT>A^]V*$T3F#^W=J$VFBQKAII=!!\6J)0UH?Y:R?_)_IO0\U;O +M;M)]*XR&;@6&A2#.EK7ID7^"0C1?M(@QEW;`B"W2BF&4&\$P4R]8#[-903PG +M^C@')=H["T*Y>PF)LTQT"CNQ9\`XR[')QOZ7R(D><9ANLO&TIPR?6>?EW$^Z +M8'Y8\2:H<75[1W9K5#F\05]%Q'3%DM*:1A,%(?V:_E=H-:TU*/+?Z%%.9D[+ +MPU%HLCKP"`.)1U\'D[1*RN;UXRJU6Q/8O@ +M"6YBLSA5*)N\>):'H%PRP=B:<.35DFDC^&TO&D+6C:L'.E`&/?*QB+O*FC8\ +MHE>WL>R2#D#^HAT)G=:/&/)46D-,6?V"@X^V:'#R.GRGH(@PJ_+@N,Z +M4L9_`-*X\9D3`%>/)BHV1#-:"'`D#UE0A*&/:H0"VL,0)=%SB20#$# +M6G.-(?8CP`RB8QG^#!@@CNVK^W'=BJ$Y0B"O;K8*+(-H&'T0L+R:5@(W:[,` +MXS\%9@*H(O50N,5BMLRB\ACKDGU$L)SY641(BRUU('N174Z +M3A[Y,8RJ&X9N)`>6P8=%\=Y@Y8B<_U.%_`/+AT?HB7[=W415#CQPV/`X[=\" +M9M/=BT<>J^_MYNJ>7[P2Q+;Y+PDX63.5@G8&%+[I+:-5IC32-AD!W[CC3)V^ +MJQU[\JJU^Z&LM6U7JU7]!_(M0^#V$7KR-#V-F\-P0@$:TJM9S,._1.-I2.`> +MG,!![!QZ%::(1H?-;<\JCF11:LBUJ^.&G!3YZ#G,FV6B9AFR-N"#'.=B61_, +MV,\7?U<^(6=]UFG#$;$.EIJ669[%=)>MR`GGE]M6:%P26.^I6M#>-5="]C5> +M&'&P:I?XYMIQE7G.T0%24<#1@X"8C)%C*U!I7.DH,DG)C]PANW[F#Y)2LP=1'P +MM)A-1A1H34&F1+)HN>>VE@ZM-?ZR3LN!(W_J^O9BTEL:K>JW4Q/VZD'.\6"H +ME,%M$Q!3I)@Z\;R5K1);>W1/K2(2&9T57]<-%PE8S9?!D?RKW>!CX3P5QFDU +M6U,63HLB=GM5]Q4_`?SAB&<.9\E36?@69,@=0YH6:7_O/E'279`"/Z0:* +M/H`,+[%@6MVIJ7[C+Z#6A5#Q8F\+LRV$PW^WNG!H3:N-&:'BM8MXB:4,``4& +M/9,E[RTGO-AW82WV5:>SUY%"U%,'9=.,`[J'\1@%D1*?@/M^[A>-^,8R&ZX% +MRU^M4K*U&(E%?IV.U!8C/PQ'WI)&9WUP[5D*-ZG%916UKCC,;4;[$@)X]:FU"$[#I\BAAYC)OBVN*T +ME=&NYTP+:#U2*JK_G+E\Q,,WE_NE@QFLF&[>E!,Z,^4@4;C"UT',4F+'#(BT +M5-S9S(<0)_HH.)9_R<:6&+;&?LEK=A7E#XMR6OX'V8[9VXMR6/ZOI/1'4;IJ +ML7QYK\9U8^>#]W9HCL67,-Z91%3@:Y<2R6*T&'VW&-6BS:^DH]]3H_QHK1S% +MRW+VXC8$%9/>=?TT@W`G[;'UTZ1R!XW&+1='KHF2H-"N_<@V<,E,)U"7+I_P +M+JLY,;=W)XJ]N0:Y]V5P +M_++8>WGN%W7+Z=XKU%Y>P[U?^QN]A'NHP."[T\`S+]FFIDIF92>S`4VXLLO@ +MMV>=0DDK=E%B87:445XI$;%D3MCCC/KGDJZJYDJ*V/0!6SY.J:CGC=="^65E +M\B)$,[Y/2YK^!MYR04SD[1.",KT5KITK1K3";R#B+@:VZ`P$PFBV&(@%?O&5 +M;<4`#IR&P-1UBYE`^(O%02UP_:4PU]Y7#!1>@$"M5`S(^?!1-8#]J]3ZZ=TB +MA"!<+B487B,+/9?`?#N*HNLN`J-%^U;O;E#CO +M8MK'5W>3L-7!=Z?LJTB%%TOYO]:V_PKFN66WUX:7-O=#$&3JZ:9DL,TM`E]9YI@_E,7G'?RXFH^DR-T +M:A2??9$8.U4G/V-=J,.2$WKFK./`_(?+7R1&KMILUCBQ9.'+7P#6!$X<-5&7 +ME(>_MD-L-<6Q]$-HY0)_#J]4C$)?;*U66&^[$N9NH9SUI3TPM$2I&R?6=QO! +MKYF!SH_,V0KW15)3,-O2/+QS4:L>7`2V2>S7FQC\>-Y8Q]\&/HP\]_T;&EZCNN-_0Y8'!6&/;6@R;]F2C[?_7`_W+LU +M`HMX6)F,VD(19,BT.([=%\'U:H4'A/1O,[ZT`YSQOF#15T]=2 +M$-E*-.#H(&4'=<;&5JI;VYKO_CMKQ"J#CJ88N=F>M4^\A148*IP%9<4B?FWK +MM4#XCIJ'L0:<7):%(R_CU:5=H/Z`@/1+=V+PBK*#'1,=A/B#G4AV7',5S&/*-0S. +M%X"Q-KM+?";3ZS@DC0:@!XTJ56'"XA2?TH.BL&M7P91]R=KUE"BYI:_?=JF& +M73BV.K.7@7'T%.VJ@5*FNOL9L4\IH,=%QV4@5`\\O,DTB2FI4GDL"Z_!,R:,:"^D3>YQ5!Y +MST6.-J;$NPR1'5$IM!U+(=>">/R7$-K5X"2-86XV]%+37>7;HW\U8-N/!ZP* +ME_D!]@O0;4XW;I1M3>]6JS9^&7OEU$7CMK8'@?1;HSY"P'X3T9J1NTV3V8N& +M^Z@Z/>@I3_<"H3K,=-^C#%O?_!5IG^+J23(?^ +M<`^X6N`K46A?UX5\.-L#@L`#?QG@RS"I7<)C]5*>!^%6;VVP:(RQBR7)'Z!( +M^7(#FS=ZAOFAP9HH"B\GB:HDG5H+KZ$&41;(8L25JH"SN4O+'=M=5+/L3[L# +MLI3"[W`I_(5WT99)?Q,G+B-UO2\MCZT=+-KK].E+L\A]/>"V4\YSN96*B9WY +M%<;+A:Q%MU,%\9\K*Y93_+G'J=!AO8W5J'$Q4BV>54+0;0]7]I,X2=DIZ+!S +MZ6!E-A:QS59'4O9SN2!LJ--YW*E[SA>;P\V\W&R,S(%B,X$NP>?T`6@6AJ%Y +MH70FV9P"*47`N=QH_;D<(1K::+CA3.Z7F'T$KCQ%G,EAYY8F.@(KLE8(*(F\ +M'#:UF0VUF*15,I#5"BN_U@K*$C15T$73)X\G#VU%V-H#R3D6J&KO"Q5_G2-^ +M/B<"M0XH<;0>HKDSN=3VR\[D2MHD?,80,^K:7AFG=DD\]HXVGKDJ5S2P^8]A +M5I1`3KG$].:$0&C>['-]Y$"'3L@Q/T3E;&.':4);I?2ZX-5SH[(/.[AT6)45 +M(13^&<'?&D@'M,+P4^Q@MW.[]F5KB`C.$%5U.IU6K*'G7SR5PV.8-XB+:#D]@-[P!)?@?'5/9O=^8\LZ;Y\$_`RN.X_"()FBTAD-53*0R=-O6[AU"KEI>/J[Y!* +M,J0#G(X%I14[W@3'K[KS?\>_Z-YW0YU:GCX^2T)B]KHYF':VTMX$2"*XFG_">@/@#`$KQ)H` +M[RNC'1:<8\BF7O"';P->Z`U>6)EG+S+`1I7`[P'*\3(TW0X^?MQ@*43V6:R@ +M?HR[5_,"'J9G>5G3*"BLF5OM +MJMX&@A.$3TM@6_P+M`LD#@ZCOI-<]+!IZ#"B#H-P6"T;T0JCZ+7<2JR<\JRF +M#$D1K^6$__ILQ3PMI`[K+@W<+@A(TN$\H9;V^,):82_\P/+QZ+_50>RPG'R$ +MT"=JZW2?&.D@=57MUUV00)28FX(N5A[4MQ\%!P]=NA5P3\JBC.5.`35L*JX] +M#WC-Z!C;,P(,BXK4YC*8/PVLFWWM\AX;%#M>9:J6S=HNF]$]_+3JV-875K$K +M_(@N**H>645><;;5\H&SS"#9"3;R9SA6!.J!C*.-34P",P54?2=\>;4V5P1. +M?.9?62VAU@9B9!^Z=^]#K7'##?CWA-B1,%"1U7W;CALOIGZ>L+-+0!E(O$<$ +MWKE:U([R`76EPC/UU(]LC!`O0I^'/0;:W=$NFNW2K_50DEQ61S$!(K`V^;%4 +M(EF#,%5RA^:RW5.>_:G%U[0._/.UCH@I2?5!_F`S>*Q39%`7("!#F598KNK7 +M%[_-.)?T%4KHJI=JIS*. +M]?/J):S)8W&43EV>JL:[-R#^$<2'UG+>2]B'CB*Q(7N]YPG`3X+SKO7@3H#+ +M0"&7XJP<_4+?36N#7TA;4J6U$YR'FMK0;T\QOBF]?J66BA=$)2&&;QT"10!E +MU`#O66O\ZQ0XJIW\\M)C`[CILF1ECTZ:D@%3TM1W.J8R*2)=T_?6_%B2RN], +MAYXGU)/$87GK[@T"PSC&0I +MIX;(9E^#9HQ1-%.CU#%[\+??DR->X%%XXSZ":J9B:KXIL^J0"Q2M*`1(70_S="KZDJ2%Z,X[BE,HFP4(3 +M^[+`HT>R.#8-4:101_(H?)08O:5P[U]N[H*N`A!QR=UQ?Q8"];._A(2PGF[7 +M8)`O23I+8?[G^:81Z*YH3^K#X/OH,=1.RND-K3^!B/-C-+EFHK+'\'[#Z`O) +M^PVG9FTZ8HJ-4]:A&Q);4A3)%<-F/O%+^VS.REXD$.S%*BR1QRI:24A;>B7G +M1^323VL,[]A$U290L6[JJ:]1OKXU8QS[`F"F<>Z;81RK721'[$433(K?`_X3 +M&228.+$+>V_=(X@UE6T.B')]:V9BAO%LEE5YANS7'V@D>_'`4=$7`)]68>N` +ML=)V&-F5@5`G7B9B6@Y!:CZ'1PBJK-TR7'^^--;%N7KTAY!W&)UOS'%N$IZ: +M[0'UIA1$>C'J-H++C*8!WP>8A._.#IP$=A#8(11.@7_HCU@R(M"H@,*VJ6I@ +MWL+=UO&5ZZ3NQT$-[?U!E>$]G]91$BVWJ'9%02&H\4`\[&RF"/ED6V%EWJF: +MD-NAF8Q@7O_PG.$C.@JU$$*'DV.Z0STB1N2?ERSCS+%\\1'JU=D&;*`)@TN. +MZ>M$8/D.F+4?TYV8%21V/6;W."1V`T@L,!ME]TG,NH#?)..+9._%1S#3VI%S +M@V,S9BWQCMP6P].#M/5#V8U9298PN\V`8O;6[>"F@+ED];=6#P?PK%.BX%FH +M,"ED&=;8W02#_<>('BUW^7J'4KCVC8K0,)I$7H68V**1J-7&M7)-N.AXI=A, +M4H,6\=GZ##?!&-*.Q<_J`W)B7?ZUDO2`[">F;"/;84YQ*.Z!,)J)W978.Z&Y +M4J=8RR`5KYFR9VW?!RTA&Z*0>;?6N6;$X$M6A&!9Z($WA''9/PC^`?!7"^J8 +MOD91A%XQ0>;/0.=L3S*U,Q:K1HLN**G +MJIGS?*$M;`Q,C1_>P_=0SG_PW54NK/%]IE@-18W\&#OO!^??43M/+E?B(WB: +M-S#+Q+X$TK4C?(`!X^I[@&H\PB0,)R;VK.^]^I%KKAS$1MPHD>0X:+_$K1D# +M,8>Y2`ZO25J[?%2IR0M`<=`9%V?\^YO*O` +MMZ(H1Y-!>OO*5LX)[21D=CI,<7MN)(`KI/#"BN]PQ;6LB`^)`\I/!3SP$?D_EO +MYU=JR^/F66L+S$$[%Z#&-B5I4`C63V=1S#^`FA!PK"=)LQ1.VN568%5[>`K$ +MFM3,/?WZ3^;0##=6-R"6SCH9*M-9/N*)'='#,!QY!YIJ%U_A%35;V99O1&9J +M!-[,U<*(7&$90/B="Z>Q$>L*.'F6'L=0);*>=G_GRU1!(E4652,60!4M$-4S:R5AET_LW +M<42UI8_R4Z'ULB_!:;%43@*A!V]Y)%\SG>=$D(E)RX,ED,%\S-17^I` +M-7NS/_UW43J3!]+;@,77=9%Q:KEU"85U +M:3FGPKJUBW/K/T^.MP$SJ)L0*2VW<;6^7=K-:/4.+FT +MLH)\5V."#7<8LFI-O(/0>;E#-Y.C%#+:)K#3X"#O0^]@+[A+PG/50TC(`L[H +M4N;&?+D%OZT;5%6!&9'*Z`16H>E8_HL"^"SRVP*_QEVX[:#)*S%CU:.3M&-Z +M;W+CU-IFZL**I3(;70!A+>L`QT?9%9ASOH_@W2E#7X;>0ZOUI+0-0U#:"M)Q +M?06R9'[=V&IIF32;%[)IO1K2:7V=5\NER"O2N4FXTSE+Y>K?&@!V&.ZT6<=; +MQH"M:_#`W`RPD440*DHMN&QR0/RB2H\=UPGPXZ9!2E)UXC)@K](@5R^E]8:+ +M-")WJB&=(T%E5U>`"^)Q>H@15=H!#.'2FA#A1RG#RD4-2$'4;$SZN*BS,.@> +MUW(D/]Z=Q0$-`GUI`Q8H8ZP"RZR56P4PM'$O'4#)'%53?':F2LPV;IUQV7",GCB'^RB_`U9EF3@?>5&BT?)]*=V57Q +MG5^V]MM!//PN"%73E>O[%JP.$9P?TVO6NBZGE$IM<)+NA3%HL4T0_731WF77 +M[`GL7+IF\\?B^!,5:F>_/G*0[=>'[H8F@REVOF69JG:+*AEY=-V`"L31+!)W +MYDE1).BQI-ZYZRA<:%(Z]%1]ALD-UY^Q%),?AT'LT"-2AW[*$`^O`,]+&;T6 +MI#/Z*]LRN1'PGLD)4E(_K0%CIWH3<$97&@D\DM1'F3-TA-,*AU=+(EG-S,8> +MFO+:$3O.W`+L^H2=GSUWI77D>\BYJW=C\+V2L:7#,'ZS6IHZU:\O/=>OP\+Q +M?GVYHU^_=_^F`106$17&3=\6]`EN[71Y8M?J]DCYA'YJ[WFD8L@#W:T>[+C0 +MUD0-\=W\5&5Q?\7CD+_#P-!,=D6<;[*$['!>GV"V]>NOL-TJ'(;L,,[DGN,: +MR[,$[@"6:(:!CF]>7NY%O5>,T(,W2(S:88E%NFQ'Z34.)KFAP\@@8H_`0-+!*ZU[VR%[=.ZBKT67N^=1:4 +M[0.T@*BU0<84'\0BC20&!HR@!SD:-V:'N3$Z]^354,O%)="^?&O][#/06A:' +MUFYNMNSQ5V>#U#>(7@V6MVL&OYF=6I;Y;SX"CBEIHZ==%HOTO=;.UP>WL5?C"C;B(^8@L\K;1-")3D.3H +M-%_F0QUT35L\QADVR`7O)_J&_U"[,N]#06%JA&CCBI4L?%>4OPQ.+BF?`Q9+ +M/0W3N.`%5C//YKE%IQWF@[J8](G6V!_Y&-\`HXU!\)Y6T[D@&D4CKLG<1W". +M6)95]'4UF]ZJY:"A0LW*2,L]4$:.XHF?$$H]M)V2MD\R;LLHH>:*3DN:R'(% +MNJ^F.E72RQB*5:%3Q!D)5>!(:6O*^DZNHI[8G:ONNLA5.F!M^P8%&)KEL;5S>VB=?ML,;O6LT;T4$\_O7[X]$# +M#^WZ+KI_OWAOVZ&[=B;/.GAN5L:/$T!9J69X/'\%6BCN,O01*UMZ"-P3X`KW +M2E6^8SH)3&]9FE89=U7,#?VT_24&YJO;O!N,>`>B*T;\[?Y#<,]#!QXZM`E` +MQ=^^?__]\?6'+"0$OF\\!TI@A<`U=24I1S&I>\H,/+K<-(CQ9Z#\E(MCPA$' +M9U4M-!X6U:0)C1IK:K9!.7LJI(6<6.>#>D*@IDF8*IOA+D.SDWYZ_1D0WGZ +MI9WB)NA!7R^,TGSY?8,$'H->C7&/Z:U#IG@8NOB&F=I$AV[R\75ZT+2(V>;S +MQCAC9+EYC"UBT76R%L:(T3'0QI!S["3XQ\C),8M_S.(8TRDG8+-\J8)%C8CQ +M8[H5J$V&HFZ\LS\<^,]BH!@`2@EL>ZJHZ"E5>::H9!7I/(@X@*TBEH*;(5C$ +M0TK0ZJ[I;GZH3J=\>_OUB"4*\EJU +M[.+*RNF:@6HAG:E.E"<<^=JIS7V2;:S%T4WC%E:Y+F/R8=)!]E1&B!\%"/8`93T)$U""PK(LCB8%(U.Q4^F-O2ILFA- +M_0^P^2_/0&BFU,TM6X-Q4RQ;EZ[BK8L!4YW.:T3("T+L=ROSMYP$Z@]4;)G, +M-*7=ZDG9S8*P#UQ?`NI'QI,A]+UI>%4Q]68M#R-(F@8R0.$?`^Z%;[E+V1%P +M5BHPW)'),4I2+ZF.98Q>R-7R@;3%4:;FOOS1ROQ@B:E??Y2.%\1&0=4OD/]UZ+&.\SV/E`0<"8.97+C'CIHYC<\.6]I7<$G^ +MNN,0#%9RGN/Z47.R'H7IR?#K^A?9OD.D>Y!1S1T4_?7)@W_O"0FMJTN +M^M_S%V!LH4U=R#&\5YK`Z?^N''9,_<-SJ6_&CONN?7WS$N!S:$@5!WZFM-X` +MS<&EGP/K&,'^;U0"RZ6L05MQN%&*_`)[\Q`2O-@S)+L:QK]CX5UJ$CF@N[0= +M2N1>O08).%72"IJ6JU,@7SH(GG=`'E[G>U/WDW2_OH(M5!)UJ8"'T7NY?TVO +MV.>E$Z5X/>?^'AZ&[&.X,UO$YVXPA$U6`(]`4!48+/FU0^P+_?K.ZTPA"H*Y +MDJR%<\![I(H+.XE9:9$"?ZEAO[L+Q%4`'Z0]9/H2YDE]:@`+]^3!E7Z::-Y= +MW@5/&_@],-K##UK&Z04!FJ.UIE1=TQ3T]/']:_2DA>)G\76@G>M0*HXL#CYD,F<8T%M]`H?-;U8".=!VO4D'51*Y>^=H,6G'_MD<3)W!_0.FD;Z/C/- +M?K+XOQ]XB%ML.@,![/@;?B<7P.%7S'U`\56:#P;H1^=.88=7=AFFB==VO[%! +ME^M[W]"Y;J[WOW^*DK7U5+HD0769VYARR%QP`+MVBANJ*5H\G(L;KG,RX:0N +M#+=DR*%+,O.7P-KYU&IU:Z5E`(=/_1&'8!D[*X#EF4MVPK-W3C$R-%/=W'(4 +M_,]SBQU(3,4RSH!0EDSDWX5PP'J5DH#^3N[VFD*C]=^4;DTK8)]"\,OK_FQ,5((W&;Q +MM=,]N%NSP5$00.G(98APOUXATF;G4S^$^"XSR'ENR?2CI^V,^!2:W&5)*O:Q +MYI,VZ?T/2WJOB\M`O/Z2J*@OHBEC!(!DI5;&C%[>W09W>>"_T1/#->=X\6$[\;F5NS7352(V_ +M.":X&!5+JM%3EC`&OF[$)&J%N[);VF`:FE8W$X[_#%H!A!H\4N>%!.$C9U=O +MNZ1@D7?NHZ-AAYR9YCI":=UPT3KUBMI5R@<*^E2R;:&F`I1+2>"I`R"'`.? +M#89&T3B36QM>7>BG\ZY8%]$\ME>C%(-:/`F]V/'J;,\`<8JI$#[[_!9%8`#U +M3J\N2*<"/[8!1(!B*]$(X!U.7-J%I%H_!$4;]D!=^R\:PS9NS-&.!EG4Q47H!IS(+[#4 +M,C1_ZFA>NR0L8Q_XUO/PQ&36< +M4,Q&,@QF9YMI&C`F^D2V,7LW#ZS-&49U("??JF>$H5C+%_P4M1A_$1P(FFCE +M-".RLT<9EA1W9@6>7,P1C*S9NNI1N_2M)R!3)C(LN,LG6U!H.]2\ZH",G""6 +M3AS^B8>2$[8?UJ>8[E^`@P!6,13LP-T#Y1,N2(%2 +M%]Q3H#2QG];*IU.`'B=^/+U2JN'$RW*4HL7R$;I$?.RQI<+2,T:R%2V]9 +M!T?(6(]^"(V"]%LRX`@EH`^S%KQUSBVC +MX.7G@:UD.8$EW;^C6YP#;>OPYJL>/'0?$NNO%&_:TTS] +M]E"P?-3!$\4"(D:0LI-VC#;F5BQ<8#!/R0V+X$2XHZQ9=>H)\/S3RXE:SB?? +M<-FX=<$=(40'KN[48\Z$N2AV4K'WR#CI'@+O=[`723^"#U=J5TNL2+4WP!R. +M8A%SS5#^/E;:5RWX:R&92Y#C8263!UYOKJ38^@'BUWT"2F.[40" +MQ#PH1TK&-*GP`(A$+&^"@"_WMW('%ZX=KQY(^RU:03`1/$--L0E:P&)^$+#? +M#.D<8M3.:0W+6E7B +M]$*I4F`72K77J#21^;8N_O)ZY!2.Y/HJGZ`UP^^W=^D,#!LD6@F9L5);&A('H/,,INV%(`Y\ISG8Q@> +M^,A0,5%:;E44:UJ1H[>9U.B7Y"C;;F'5Z*TL1&_AO*4H#H97OC@WH+;.0NM@ +ML34\^?5+Y=:-;EF0Y-;JN%6\&T-LV\#.K/%MQZOIV*`:XY)X^G@3(P=/<[W5 +M?-(4>Y+* +MW)VG":$C-V`X;3#.W]51&-R@ZO6Q4BYX6$EN +M[%8*A%R:$;#RV#I,V4[0\MY25Z,G2UTG@-=[B4?+W?DC:/>RRY59'+S<"WS- +M??^#NQ0B!35_X*8JAP696JU6PPN7&8.2D82_7Y?!R2<'(?V?,!ZC%^-_6KER +M;HH=KM&P&R^F`8]6=PV+`AV^OL<^,?#5MX$G?(#I"`^E/K&$;+F^EEY6< +M'9+-"GAO,ZC?,#!.3&37AD_!F5S+RR#LQ@+(1TI@&/@]NX"_25V=I=L-?.AZ +ME1\!?JW?VDZUK$EDCY2%'3$\F2/\'!M^!)+?U$:D2\;1-&J!*(:.[() +ML9P7WSG;D#&.`MF":7"N3TC'%21=%.-Z5F?0Q7Y['#]NM?SQ@Y7:&NGO[NCC +MCZWQY%_Y@,L<$5UDEOVJ;;G&Q8L]^O4-.Z#,T:/W&\[BJ`&M2,VNC>"%5"E. +MY[R,XRG;%/0-"NU]I5W=ADEBN!@YF"XG4!^0W_J6!)=XKY"VWO_5NVSW[&UE +MGE3X*SUX:-O%U^*9ZF4XK8&R[UH9EW=9_*;0'3+N((M(Z1]#A!>!&$9SX0!\6PQ>2@A%O!=]Y-K8#LAV9NAH$]?,/4 +MC:L#3GY_-?==^);\7U96;F]I`GZ)&+5="_61(25"0.AM.41Y+,^=AJX-X.;; +ML?\:0S*CUV>0',A_"DV!RU9SK309P1LDFU9X!PTC(YZA5(YV`V^@#)7=O(G% +M*PQ7ZH::1E\"8K-:;@M0*Y),PA#,=7)J%J/TN=)$*/=G3)Q#".Y$)3%KDARK +MZ41#JQE@*SJYS`6;!\:<,YA_I,7)P'&=<^)1TG_(1D9*(S"9UJBB+7N[?7V3 +MNKK"T((SOD&RIPS:1>`UZ`<[3B=H2*NWV]E>.Q8H5X'>4W.G$6PJ9)]=57R7 +M4;!G;E?$(/;_+$W(X/H5ZJG-U +M7#)->[B$'-0*0Q6$T4980UA6-VSJV.A4UX&+=-(O0O2?%@H+HMA9=&C880,L +M'!9O9/SO1H=E-(0.89*@@F">P0O00:YCX-]-94_`T=L]I5R +MAB7(I$-9,4F(VSY +M3;Z53^I7YL&;VXQ`9)HN!B:!\%0FU]%A>-N:COP]OT<3&IIF(/RQ!>97NDN7 +M*:R*&+<34#6EE\/LQ8!M&K/MO)BM'/I(9-.BXQ_`#EN]7S5%L>&,6R=$1[\^ +MX>@V2Y5C))!3]C0V]/`H>2O7:1^AQB#\*(@E2?W(5I@FG@87X,*W*C3RTPJD +MV:(DS/<:1E&Y<$OJ62(9Q0%8PH$['KDD1+I[_1D3I%!*>8WJ&2<"N2`\3N3_ +M]KN5^3AX$P")+*".K#,++!NF)COT:0N,F7_@&9-!IJ^18%V6(`U8%?CH3-8L(X/2E+3D%07>[W*5=T:\Q_.$G!M9N-8 +M1_WA>X?^JOJ?XF=FLV7CDF<9-W=LK_\.Q+`[5*"!@T[Q,$ZESW(OHI05ATPS +M-6+NRN5LT5UT.XO7;/Y8V;L$GHT\1-D^>TCECN)L2JJ>V%T@Q=UGK+RUQJ%^ +MM6X*BVEBL"C6)%"=WDUUU.E=Q[&K2^]AAW,UD+QOR[16"`^#1IV84['1IJ/X +M7$[UG2G`I^6["^:T=KS,E-8Z\*@]32))1=X:$+^O=W!-W4C:G8,^1,)7SY2P +M=+-YH:.^>Z_O[C]#.Q__%$\";H'<'U96WJ+AT;FRL34:(QZ^.L%4##E=#75$ +M7PN.UGB)BCK=:\5#%6-&5!QJM!%7RW[W[_FZ,F+=^Y#2:E+FM@=Z$H3F8+?T]!;!D&:IM5FZKO"I..+L.3D=+( +M3Y7/+J.:QZFO---9-']+#.M3HU,529NB=L:!P]7.@["01@E +MF\8'?K/N9N8'4$Z\7>E#O5?Z7X,%TT`.N!/F8)5DT-Q]5(Q")RY4(J-/QVOL +MQ=J>\)AU&BU`^OO0%2K$K!N92UR"^Y3X;NZ63DN4X&8E;I;C=_VP>MSHO0X` +M_H;8*8!W.4+NL)9?%S9I2@)SK9RWMOT;4#I5(]6T8NEG);3G"/32$,A!\C0> +MG,F`@O9[^N$JR-Q41&R-V4K,G-F`*YPIJ49:$*9--/N3B)MO2+W/)FT +M)8B]-1*;DJ2S:(20T;K.K!4*G<2"EJ,GX:MH?J +MR"*IA7(R/[O6[N(3=G_?6N#9\<4`T96 +MS,L(=N89E#("21C%5,A3F1OS7NW9R?)8B:#N4'J$Z7#JS.88'N-7%RR9ET0G +M(MJ.'\UFSO\!1&NR81I.5H8KBV,3X*6<<^.FRJS1N^BA+KKS-(!7"B?*)N!@(JM):I8WJY,N;0 +M*S3L+V?1\OKW9HE%$$N='*[I:+G'Q65K@CE\0,K7#Y6*FBU`R +MNM?,>#Y:V39_!N3-0>*1+)^:XU4^6[V8)9/30$U:S`3L`30+][>I=,L?RQ;* +M=L?WPCU?V7Q-=-\]7U%-?]@AQO<>^HH(ZP^YUD4=/52'^#72?`5BT,H5HIBSZ$('3W=_'VD+6+/K+6K8:BSFZ_E +MZG2K)*A.4[NMO1,5/Y^?LH;E(=@[CIQC0#'KM)$7@)E"OF*C9Z07PIY>64AM +MBR)FB((SI2,F!K!J!UIX@`(!#9[>[6Y%@V]9IE?FKT:#<30-UZD5@7"/7CII +M$@ACI(RRT*M+!%P]SUAY2-4M8M;:"PQ]GL4]YV$A`X)\GNX[#VJO(044]9P9 +M@KD_GD$+UO#J;)4?AF\HHN+>N]&K.Y@A$<7OO^,MUV<`F$BWT0GP#[ +M2(`H.+0ZVE`T'52WFGON222DGMY)4U$+J_20$SU8?_UJL@F"V;,E=?^=IMF5CV];J".%C;1`OPH5ZZH5EQSV:*LB2GBK(.J6=^C+)WB./S!),B +M&*OWDXTCU!0:9R2H8='D+[@!@F2^,.8U0I`D2I^@/E',2)4*@U7WLL:Q+#F` +MI83N^B4S)9`&FCED)-)!&(#?)"TA)6?.U+3L]M<./[5]=3ML'-+_`7([T4S) +MEDD0A-;C!*LW@QM@#\%6:5RLK*D?Y$I?S=2!'J(+MT.Y%R)BJ^7EJVJN$,-H +MB6C"_IK,5*%A$`=M3:I^&3BMCO,UV6#7G\1L]J)%3'>]NS5(`D^*E$PRL/"? +M_+2/2C0`M;K:KTZV7'U^9>Z.UFH(-?V,\0T0/&X/`LLUV:28(&9*@^!YXMV5 +MN4BPA!6F#"P=5/6HNDF0W$F1[=#CSQ'1+]F8U3PDP.Q0MU:*9C_9]&WSPK_8 +M:V`^2@4=`;4FMUZN=$#PU=GE:\JG1R'<;(M=TTPW8*UD/`_,__L3)?,3SWDFVB6'Z1@3-5Y)1[XHB4 +M`IPM5$M0XOJF6A,`QNHV0CP58RXE.PS55F0AIAF$Q\(3LZMSY.4D?BY;G<0. +M)C8/#P/D'X9P_NCJ+D/X`(]@O\NRKD,7H2E*S3S\F-AV6#=((@VLZT\@X%:\ +M9(>A^C1*RHN4CUBR_ZPLUD),*.@!A";63E&D(B`'Z8(>L8N&+A(2E\Y.0Z(Z +MF8%9#U#?\.&BC/``GJ5((DV(X;P+5JC^7Q^-T7X&G;$\@?B\1Z\CN +M,'"8A0P1S9HF;WB%8QY&3MPDUAB=XO[Q:E:`U51#HY!N\<[C*2SM"D\Q,$5H +M>[27^`55"E6I'UBHGMKQ?\`LP98$=TZ6O53X!M'\,X[YNG/TRFP2E(;$X;96 +MU0A%F"AI1HKP@.T:J#$:K(-HA]09:,=]":I#OX=08P%([IK!P0_?69G_-TE#1[-6MN +MWZ1Y$'B;+#QT,\RL&P+Q8@B=)9Q?F:QM!76`",\V]#%-.O34QL'-3`)O.)>6 +M3.?(^.K`2LC,+6TR,R@R9\S-UL&.];JZ,]'M!-8/TD]@.0E&(PF8#ZQ+U'3J +M?F"VL9VB4WJG;K(C%+IF2*X[-&3]-?*W))=)4P2HJB9U")5T`94`:H+?LL7@ +MMJU:4IZ8Q^$^_1,ATT2(4_@UUCA-I4,=C<$ +MUG;+87,FG*2ZZ!X*/Z4WA55JU!Q!BIRM?ZX28Y#PHWH=V4,;,OX"0X39BUAA +M3Z&:]&,O4JX=)%2Y9/PH-&F%W1^B,5YI6=W\<#,P]H%P&?BP9)$U$JV1TS-8 +MXA:L\$5PGK6.FA(U)#Q%)!OMV>O_8&6?@L!1F-C3B[S?`ZJE5JE9&[X%X,HI +M*(YT9-;UV:J3^B`77:=VZHR("CU65>^RFKI.$F-=P':?Z54;>]$9<+?T#NV$ +MN0BX9M\5MRTH[K3H?FXG[)_'[5+DC!AQLGZW\)$XP$]V6#*Q%-?5`^-?[06* +M6^1&52<&%Q7>V2AMIP)[&^"Y,[&L"+"#62UJQ"SN``K^MZA1_=DUL6R5+-`N +M27"!<.;_U31:AYTJ:O^\IM%?W\7_5],HEH7_K6GT?#;P_]4T4JV__?_7-.)D +MX87_KZ81EM@8`A89MGTJJZ_`RD6O56S/_J"B6173Y46B"[FGM\WB)6N@/"*6 +MM]8?SOX;5=:U-L%(%0L'MPSS+K(#.@QF`G&C=DNLQL4A-\=G@@G(T+AF66!' +M[BQ7"H-(?JQJN>`/JUB5M3+I!=2B:A2"$R]0N.<%VG7QB]'?EH81'JT'8"&I_.>D:YF#8B*=EFYA)#9S'@#JA8WSL=2J(V1Z]C!SD@;V>A.2S +M5_&L4D##;`T./TN*4IP)$R=T0CQ/E[8BA\D#S+PT@'D6+NZAB1E$L!:@Z,C% +MV0(D\E?%8,,.(7$OH56([@;EPV!-+F +M"Y=XAOY@&K`)?;:9]Z[U6(LSY5<.F!^P]TI%U%NJE4U4-.-C^;%>.O-6EN:.R(]D3UE@,E<"H?7@JW@4F!1,FK^MD%;O'QWF`'HWAQ!?-^480J$BFZ+I?Q&35<@P'CBT6@8`/B^P +MNC46^=+!#8_#`OT/!GZZ;O`9AO*7@=:8N/Z,2@S*4UR;LGK[9E3::1B_P[P#8#[+JJ25PQ;7;+.5DZ`BRQ$GNW,EQA:?7'75G!38@1. +M0K2@5AK!]R-]^&#_\W11+?-UYC]#W0:-O*DC_)%.BF(GT[U:U?U-T`GI([T# +MPF)N!GI,TILZV6D(Q89^W6SXG2&LJ5SLD74B>-&$'X*`JU"8-(XV,0<]A%(4/<*'5D3+`@+(M%? +MK:_\GHN7)6$2O<0IY.701$"B82*!OCY'2>^;QKZKPY/6^FQ*RN1D!.F4="9G +MEO9D('UFM?K@B/%HS^@4,*M%P8"Y=34'(!DR81:&UV2?+_>^)8UIN1-4(_6U +M,(C0S35_E.ZBZVN^0*FKL=W4-F<@6)8^;A*-$V+-$.I8G\5=^0^W`RR07=G5 +MK/$XC)L:_PRM_OI^/8G8E[FE!S@7&G\*K9;:V?.4+$1`^#I;?!KP3PQ0:/1^ +M&UQ;$GNIM@]V!JQ]+\'@.T'D"F@W/$>)+[5#\T^@V?'QG\,-8>Q_'OR4!/@E +MX(>H*3YXT4=$W+RX?Q1\/'65G&IH@Z[N_RF1E"Z;^SCNJEF$+K1<\@$%1SAW +M[C"H=[X-_N52T2K417#34@&:Z#0QJ>6BG+23^CEN_G><7&V0.1*VE2PS!)A> +MAQ\!M>?'1JPEN]X'YD.@]AE7C/JJ_FE<-U'/2U@FV1;$:L=[S)[C>P'3@&\% +MM_P$QHTRAL3ARQ^1^!R5W8PG-J;JQLQHNY9;H&=*&^FD^YT9//D/D\-`=8HH +M/CL#.",N(R:M%23<*F7HDC;838+'LAF'UJ6S\#.5L)2KE1-W2Q4)W/,D03`. +MK>$P0;@0SD"PYJ>*"UL%(+<$N@ +M4"I9<'2@/'Y?H9L;.9:GD->Q2(CR.3$I2G+^3JC>7=B"XA9OEF`CJN@"-4NH +M:5U?P]1B!BR8&)U#?(`R304AL`L"`-?>2FD:YX7VFZ#M0]R%$]FUB^"\?C7Y +MP,O8]ZGA'WT.$*X!(6T=%815>EH?DW>8O@ZP7MK>IN*2U>2%HBANA+\@JJN1 +MR""&$SJP#&*VL3U9M2'+?#2'$NJ1[#!,@3YG4*(M>^EX+Q%1'T'=%:(!![Z) +M,**@Z%#Q(GR>DTI5[5&"@]IABGT$/6+14&=6Y1.%%ZVQ3*,#HB=%CZ+J>^:@ +M"4]P,0^,.%@_WP4CW\6B9>JH?F,:1!YN-,'\+QO]:>1]2C]=0KW28$OGW%NC +M6D'TE4U_/H7:90<-]K8>N#>^0[P)#NR_=I +M1QD&6%967[<,"-VJ02&K-[MW"<`[@/KTLAT#BR!J-B=^W.HY3'0_=FZE-@I! +MWJM0X!P!MDAD)UDT@7GFE>.U--]]T[;7@9+@Z2_OQ^J[#AG547@XU6](P=E,[P;KV +M0EM-]-JQ&_9=+6F4U\*C;@<*HB2_/DM))\`?V%TY?!*[_00&T7%"OX3@65$, +MFT707DSAFT\I0#Y^:L^YE5\H`DA?/`>A<['+Z:]<$\Y/D6'[:`5U8V/OWH,' +MV;W?$->CX]L.KY-N`W7.8F*WYTJ);=IFZ?+7/;FXE/->QML%A`NKT92Z3^PPU +M9DB^(_<9-UFY<)1FCND:@FYRTIUBFWOQ$!>"$_1IP]FA5ZQCR&V"!/T(P[:OP,]"3T*VEW#=2G7SX%? +M+NEN<9!9RT8R];6B.%G-UW8=H0Y?/KZDLW&.4OQNA78FZY9@3\$`6;N!Q3)6 +M*<4V"`!/O](YF1MX'OKU4\1DKDN"(]E1Z=W<<`.>S)6:FZ^6R#Q%2A]<@-*> +MQ"GCOWX`H=QXC-8NB3RLP4J+N6^UWK=ANN6]'\@1,OX$0MGB/WLKEY[1N?#: +MJ24X#R\BD$\!!#N`Z3KU"C'V(I-\Q51\9E,7_/P#`]`"3;(5'-SVF&;#/U07 +M]L+"`AU;*&-KVAA839#@YZ8^V@R;YK]`^UZ!,15@#$,F9U_^LPWFCV.^WX]_ZUV +MUZG&."_.0+3Q(W82\!-Z1V,S7)TF\\W;^G73=/K)'`L>-/J6ROS(]#,J-#\D3B9TRK4 +MB[/&P0?!P8*C+#I:,7E+[:)KJ&QS./"1E"D&L8$ROG^=7YFGA[=/YDX1`1-( +MP23P2\!;ATX18QWDX%C.3#^:MV#"^4PIB]I90M)DV>\!K1WGRN]B4^3'T@-*HF[?/YSAOOAM@AM[AK]^[K/UEOYA=3[F*].L4(006UD='>)5.4\W()(D/T +MG,]Y.XD>%=1"+:2-N#FI^^^KT\I0&@M.BV#",43Z;>P:>=AV+F>(,:XP +MRIWG.H&Q80,9P6=/85\-^'%;L?'56=KA@KD>:@1!TWN"8@^=H8*(5#&[H@%+ +MD7+LD3H],(@";I,OQH6LYW-RAX5A<4>^#5^;*(OTZG%@/KUV[%4LM`-6>KE9 +ML7<=[L76@J$+1^O/YRA1M.:Q.7Y4Q&,Z!N$4?XY;LS+1Z%J`99KGS"F52F+- +M]HCQU\I+`4Q3O;9VMW]A[\9+5"P&<,(NA)J]UP[/(MO@MJ8X8[@6F>NG*Z'( +MXW.('H5*"H*56HZAIZ_%3$><[B="'[I?C'.M]4YP6&,/OIL6N:`736`5K7$7 +M(6'/V%UXR"N_RC!76L`"C/#+C=="F2NC(]:G4;//5RT/"$/B<=U0"A>)'2B0 +M!+&C-J9?>=65ENZB*,I8O`Q$2P5D"M!K8Q1R&BLM3`RFQ"1,_W'%L5(;1\4* +M1ZEO3P&"T$.?LA91!T2)%$ZC-3#^/'8%30/##9^8^CH;,96VIN`,AZ=IX?<` +M`=(MP_T*H%E+:5,'[LPJ9F#4TF6@.G*0Y@TP8SKT09P8I(K=M_64=^37]W%\ +MN$/'3,]Z=E!R)8%-4E,F0QS,`CZL5[8&!%!U2CRL!UUEJJY6@A\,WO(VXM6T +M%-F"P56A)L#ABK#9P)I._6M^X+%"X`+V8QPY8"]9--Y>9C9WBUVUKI]*JFC0 +M"4@*OM+[3HV.8L";C$"48B'\SH4J%N=,T'@T6Y>E\F/R3J9+T3AJ[Y-PH1;N +M+-CW'X4DJ3#/#3:!#CKCG`S')#T_LRWZ;R[[P,?*M5 +MO"&PO#GR;'W3[6.PR`C2:G),9N+DYTM^,I]K@,(@'F#WJ +MYP=O__S8>]H^/WA\M;(6LR<&C`.85F!$XTD4&.?J!N;5B<<]86`,*P^MYC1F +M]@2!\0`3`,9K/%&`\0%C=(6A96YO`L8/3+7;^"YKG_^V4=!RRLG5%Q@.=_75 +MP7<,?>@RCN2\A&BZS*[JXN=OXOC?=Q0^?WOCC`*QS\_/.+',55@K&*=IZ*^" +M8IRU"OZE[?WZG@2P1O]V`5,T7MH-3!(Y +M@0ND<*%IF];4WK91HZ)>VJA142]M6M'ELZ8V5>JBC6TZ<>.SSZ5-6^9PI956 +M=#BNBAM6W&)%AQVZ5*DRAUNJ5)G#+2'<%8%]/IECCCD^R_?BY_?'[]$T"2$D +M]YY[SOO]>I[S/N\W6]U]J42L-[TM>(MJ:)5]8!08TL>:2=1^"?LI*T&/V?'F +MB'Z)1HA^J6J-DL7,%#!ZN[]S6->)>.EGNJ`K_,>"+ILSZ2/21.?SQH1^->/: +M+NNB@*6D@&ECIR:9XE!OC&O]P"A,23*K/[9_OZDPP2=(?[DU[>Q>>5PC#C(A +M9F6KUL35`GQX274=UVX0I+=1[<&,ZFK5Y`#F"^V>@QK0Z+@F&94L4&,1#^7" +MHY3/M50TCNK0I-)6I\J4$!T:@<]EK?/TGWQAV4U)M2R=\T:](K._56"LJJ%[ +MTF+RD6.-9P5/B>BI[L.;TKYSQ@Z$.E"G-?LY.\KJ#<9BX6Y$Z#QP_<1ZV`X# +M\%B<^#'\^,?/02]E+D`T:0%$%!2BMD<>P8_<_VTPM#T0N&)IPU.?X:I=5X-. +MX9]\TG/I27BRZT0-6X/N@S;0C$8+>$$1@847'WL8$$?=5A[^QBF(5ASG?U)= +M?"68"HO6WPWP`_">@DKGY5`!$4'7A("2A"[%(#D(E#X&J<;B_C`EI2G/U"A0 +MRX+RMY&S<)R&NB>K^ZG048,3J+HUIL4Z./HY`[QNQ;T8CE)#1XL'Z0Y-V,XV +M-F3)&GRAT/^>G4+3N2?,4TK=]8[\E]?QO*2;@_\!3%WKMNC=!,G"]_SPC_PL +M3D!8V.3FNPB\D#36LPO2TQH=ZK1J`PT%P_!N#8->U#O2TB0Z]3JRJ$(Q +M+@F6*\5*5O]Q.%-M4OQ7G,=I<@2>L%O&V,)%7.ZU7S&!!&6R'Z4S^HVGRNL8QE^\TDB3"CI$@@MBV^GP"L8`Z6`^5Z,Q://<"V7^J6@5#D>\&/-B@"LT; +MS)(;'H-(P>.:B#']:5%CU*E6B4MEC.&6=%ZW*9/F(I"HGGL-J+G@%<7@AD;W +MVZ"23I+`26CZ\"`AG-),H!"[SNFJ]&#:@)5)[*JC03:`,CD'\FZ:6L2#OZ^) +M#CX/@YYILE0N"YPC!$73(7Y,PR[B-WG[;&HY;CH!*:5XON'@\A$G##GPTS#X +M,=&.W(TS&+F6*:R<_SL[1R!#CPK`=)<&/!2_84)X0.`Y4F +M:=1J6'0-FM/66E;!3L-G%L=-45P+,P@BO'FRS#^(DX[J5%`$:G*.'K0&/R>&V8$C]ZM,;;%,7P87#+T$GC:,R'FOJ%/H;1#<2*3F^3N.60C=E +M8,I'V'ACSC"%S!-8I))O4P8#?&A`"FD0X.U5]0GQ0UUFT%Z^=FFCU1GL?!L5 +MABQ?8!ZV;L\`?L7ASDFZN?]4ES)O9Y(LT2S472`4F'3`0:)YZ[D5_5$8;JD3 +M^X08)0\;DBPIZ: +M(3(&X;=:HCAP1BEVD;`EDY"'KT!G@,+"%[JU-/7M!/UAM!S!(6COT!MSB]%? +M1WR5QWF+J4:U9EJ1#DMGX!U6Y]"#IMSD/_/Y>X"97I83/A(DD>^06@7IPH:T +M*"5"DC)I@C%F(9__5!R4JIUV4^0\J6^F5^S"6!.VU5W@+Z +M[T2C0"9=RX53)CB>^6OI@"ZBA(H),HQD2Y$)+I_E)=_GT%XS!+6W6OZ4G]5` +MND2,++G-D#$RSX.*Z3)0Z>)IQ0YKU.V6A`QOSH-CX4W@!RQ_*.ZO'35V=0*_ +MNY-\JZ0KO--"/US7_U5!+^5$"5NMD4$5`T\,#P##U0*D&MG4]E&]I[D1MQ_!(+G0137C:23?EJ9%)C@?8S@FG1W$] +MF^R^VN"`9`[CBYD@U#J$DQK!B2>U)ZJAA5US(5/DSOQ8/06BL=\0IFYN_):T +M@&->@&-G.@3U50'K3U[[3?Z7')9>0]Z3VG%*2/?AB!NU>X%:_"LH!7>2\'6B +M3OAZCB9\[^6P"V"/B5#P&8=5:^X04YH2!%VB,.U^`H5=/8.%; +M:MDTG@\J[G[LOI-Z&[N@>6GNKI#O)+0.NS/-^[P#BFFL#=]I_>HW^2T5+$,; +MQKH!_"%(9Q,[AS,)@DMEWC+U!2"7Q'*5K3 +M57FX51O'=ZXY@Q'U#J(.(+@MK0-W)UX,W[MC?PSMW+'GH0/[=TN79.#FI+K: +M6CCV'/Q.4)^_N>K.YYC[?I-_J?A[T`EG*[P-5W1Z@5;H>ZQAU;`W407<]6&0?TSB:EK0.6KB_S,Y5S[2!'&EH)9^C* +M-EHZ7-S>QO6U:<::7)O6)Z`J)+9--D"K,!U8>H67VM9K#J`*1C,OBM"&HXD, +M@\K/2.??%OP&<8:#+HAUT5H'M\(E$OKUFD52?/*MS>>_3S8&,E]:T\(@!&_M +M0E[?)!K6*>"M,ELR8_-5B6XKBG^_NJ-5&WY[^CUQW[0GL`5J[B3:])N9_ +MK_>;@_.AG[%0-_CSXCO/W`;KU%=?J[KSS,*#[Y^9QQ-#,&&%(+$@+2,?W1D. +M[]N]'_;OV+/?M6;GZI]MF',>3(Y+P2_FKG+(OU#&2='M7B]NY/MS!(:B#<1:F +MXII,(%^&8U:"P\>LC[^_<8$9YP>6MHJ(SLY=D3W$O>ONVW/?7NX48*AV +M86;M]0_NA.8=^_=\9[>P\@Y!9O=_"PV7^,UMF29,>'`S8^V0Z])M;-M2T%8; +MI*E6S,CJ.0C5$3QT:@;8GC&$'@.,6]/612,1NJ%NC;7IQK01C@K.;UP+F*$2 +MEE0:]['RWTL8W1JFE]($N#!$[4B4A#")FT6Q^4UZ("U'<4LHQG`FI+Z,8S5R +M#$,,(I6`]V$IQO)R+"#GGA=3M[73'R7^2:>BH:"Y*H;;L.F@LL\!=U-15C==IEH&:4,*$ +MP>*DA_?=]+W2P<NS>,N:49OX`-=O[ +MN@73&%%+F)MT7W?2H`J=AD%@T++^E0[P&4%>F_F;I:FZ<*X\?(LS?M,V"L#2 +M2>0(?_8@R.4+ZR]FBIHSAZK"W<7')K\!(X[0+9@(V/Y\S7#@RLK@\DX-.K0R +M`Q9Y^V#&$"ZN)]('JVN!D.HNFM)V +MMX^(A"EG",;D(1)3]A:#DFYZ$]*-*/S-$,M;^^^'9,"N)#^`I`M<9PAJ++-0 +M?1&UR1GX2G]$PD&B`,$69.0LN+9DL#&\E`BQ%H3,`EMR,?,`8`*PT3ZS(DF! +M3'90C2>AMR0TV41%2*B'Q:13'K@5,L?&J>A1GFNK@\+)I2C8F"!_NBF]U0_C`@]&EV'O8&PD+X;V[ +MOM5*7K_[$6%%V"U0W;AD19CXX^9&TK=[]Q\%%W!"05#FL8W[ECP@/[5/\H?M)52AQK0BO6P'AU<+>`S%A+]PG[-_]\('=#UV_:[>) +MD2M@H^@1=L:*]CRX.XPOQZ4BOWMY\RYZ>L^W=^_ZD_!&47C?WB@>)R^YO+[= +MTG(5>0)9;;G.:`*W6'UX)+]]BE@(T2T2GK],*#]GI?B1I=19[95C"OA73.1G +M?=-YF/WQ3'[V9Q00LT_]2R\ +MADJ;?TSKO3I78UEIXA5&YB8LP.&+6KRZ1T.M_Y<_@H3;9;H1[JE)4T&::I,L +ML'@&WLZ8(]?PBU<>GERHRO7 +MI6;^M`R^,9MJ7Z`'H^T2M%_K_NZ4(YAKS[5#^RG<#O7/X*:_>:+Q6]IJ6I83 +MD<8NPM-%U%(=,_&&34=-RD5-J#9VL=R12P:0$-'9[;D)B.A%C3!&0;#O_"%@ +M:VV`:!F>Y*XV=6"@;K"\'-=U'^-N![H,W>C]&R@W-N_;NV[WNOF:T?\>^ +MW='(HVL^?\L6\#A"$"I)X_%2WXL'(52+[YQK3NXJ"EX[3@V587 +MO$5'&C084H3Z$QJ%+UQ:)(J2640J]J!&+LU/J[1Q'@*OX(%I<<`0[M2^25`& +M$CJG5^L-S]2/6R7LB$LAW!ZB@4IR_P8P)=3P.-*LLHMRV^I?1RF5<&-4?U*C +M0NI=9(''MG50=\Z4BM956-Y_%^8!TX9Q8MJ8V2)``<;+9"9G:<&QBI9M\R+$ +M)_MQWQO0YJ[S$6X+\[_EL^BH_BWFE +M.'EN]2BGQ!TP>]@W?IKHHMDAHRG"5ROQ[9H^JJ%S`$2.BRKD1#J;GPD3/0]H +MJR,&'T76E^F#FMG2HP7,(6$1E->8T<.HGZ=T!9:$!>:(]M/SI8G27CE[8(%( +M6$13TV')DQ0\QW"XX`JXHJ^LVS9DH#_%]4*R4!P/+/X3_/F_(1ZKK&H+CCQL +MCY,+`$]JAGN5]%\[JI.G-+I]1I2D=9.;89Y"`CI9[<:!;G!81!90AZ&]?.8@ +M>)!\>%*BA^<^)MILG`;F21M6+NY1`"$T]B1:?K%YTH#;@.M17V7K4H6Y]WDQEF?%R'8?WAG^P5+#Y +M&L8EV9R`KW\F7[98,`:TM:7HSIFF)DB2WHPY\!C(CD[MU6K^BWIC,+/RXX/U +MA-]*^.V$'VCE7CM6-[0?U?K`5681QS3>DJ`(1TM'0>^YT3)9SL +M$CBS7T@;I(8'LF89^DUH\",4?J(3AAXFV>Z[(?ZD746<'7'LPN8W!^'[57!V +MX=";T]L&X>H2BV^Z&=](YGZ3]$:6]TS[[= +M]!HN]FB4/[V!/KUKK^FAV+Z]$:$(_85MMP2B59JN`BE%:'7CABQ./JDMB[&' +MTA<`?S-[!5*JZ;1E(?U';0!P7+4>8!# +MYQGZ?=/KZ$)&(F2^$WO>LG6X*OP%#HB07<#CI5G`B:6YP$65<)9!,P65V5+= +M,)XY<2$#\G'07,IQC>\X^BG$V5S0#>GF-#2GKSUTGG2$FB%@AQ`\LC-(]%:. +M;64I,[K,U`76:X +M;N>N<,SR8Z)IY[LV$919M%D +M/&ITFX8S5='A59&2(,9!WJ+T6CM*:D%,F'W#"(]I)!D`*+F0X8UR)3A6],FB +ME"X-V,)&4-*GMX;GS"/\\L[SZ\:0;I43YC&Z0Z0%ZB85YL]KG11WI8O=E$51 +M4BI4F(02L0E=F\>LR(&%P9K;>I"@^_9&&7AKXSMX"/EGU`T]0IR-84K<;!F5 +M,QW$+3TD/G$1U9^O,G!J:;NP%'EW>++K9\6QC>1\-RC%4;/CL*!;=\S#]FPO +MPITO]`F=+Q@YXKDU)+Q4N93@"`X3_;C3D%"*NQ>D-VDG"8+E%=3)454:\Z)Q +MD:Y.-!A#ZJM&67J^@LK=K%L#Q=RA29VFX6AZ]=2[)9CM!F@D$ER_NCRSV<1Q +M^"EP`E^QI37]C2E3L)P,&WI_:DW*)C>!TCPZZ];S4+_RMHU7#D;+[=2:EK/O61I7 +M=?]B`[B<94PIWU;N`+C+-O0I!X^."WWE_:5\25S7^2,GUW=;KH7&<>2\&NCM +M&W"X@9N^"R\0"XUOF?CQY31*"Q+9'Y(*WP>NI/%7"WCT+F>2NFI7U8I%^_QQ +MZ,+CU-RZF6HIN0R2HGJE+'@&)?&P,,+Z\<@1C1L%#TY7?K+>S=:F[;A*.PZ) +M>EN5%CMFF[?YB7FW<2"^'*HT$2N3+N%6!=-+YT)`<-GG9!A';$D75>_X32FV +MI[,T*7,6P2B%]GP%,K5!I5Y75?VM(1+4_;N+/KZW9O=.8Y5PC5#T_('VH@T@/.#7`MN^3<26R!*VNNI%>-+FU9CGW_\A1C#\?\(07TF".I\W?O7 +M-7Y8!K,?(.Z?C7$4-0;7>T&Q4*7]/S/U41!Q`?_/J0TAZAQ0RWJ3&V!&@;&V +MBA/1_0\7G'IP[[=W?]S_\-S?8FMO\IVC9Q-\W*+WVBTWS_ +M!T3J.6#*^*I@Y*^&^:KZYR&&`_O_.>9MP5,!F/HQ3#WROR@_.WB7;C++Q@H( +M)?TG\%&;1BA(VKR$*XB5/9 +M99E\Q3(./A:XR[VDSZ",JL0THD=I>B%OF2W-R6YPV9>F+EQ\KLLX-W8>-QG: +MWBF#DN'S]1!M@BCGV<*M`>\7W$M?<"OK:KX3>^:W= +M!^K^FJM;N^KS3R#(?<1[FL4^HX^EA@%GLO/GC +M_)4SGPK.]4P6,=;V]NW_$/V_!X<$C=@]#[_.S]ROLWT4]D?W1B(ZS5^]]T'A +M]\M?M/7MC*SO0?MW->T.'XB@MU>Y5EC>6=%,GF.3HA>6LC@*NQ^,7A=[U#,H +M.!I=GEKG_\8?Y;TQ;>W%JU8>+OB!VB'G^NV-;IG>E\Q6O6&.%;!!X+9^' +M9K]J:3NL.U_*7'6E]AG1++I*)LZIW\K!($YW]*E?Z:7CI:.$(D.P@H15*\R!&H'+%XKA^Y'$)5 +M0X?M>H*>`1AV-$&#^4THTXK:.1LS;$MW(`W.ZS'_] +MG?Q,)`&-=TD8^PST7\[1^=D6$^;?G*[&%_,S=_$\I+30(4O.T1&$'CNFE3?Y +M7K00@)[;#,#0BB[1):8\YO-)#`.X*"C;P"OTV.^NNM.J8],QJ^N=?$6PDT@A +M4@5)J'^\>C7,@J0!,\W3_Q1TD1Y['J#]SPC`U0OP6_-JY?(UUUTG^-:OOPD" +M.VZONZ/NYAO1[3?>$1!:6JZ_20DYZK;>?<=F4`T]`&,_WA]EJM2S,$J3D7), +MT,\7<*>W7224`(E(W`G,O(W3;^^(Z+V&TB!;8KN/1+2-6QN&O?QCU:+Z= +M/5IMV9""VBATZE(>P\I)"]3^.6D(KXDKAG0<'TVS70SJ,B;@7&9^4\F5E*IP%U6\ICG[*$+6..F"Q0_<-+V%2VER*4D7NS00F=B"T5(GWLFH/C(M`>_&TSGN.P@CPE)#4:A[F8`08 +M-CV$>C:[=J;9>D.7\GD_6US;9FD"\3@Y=EQSJ@2#`0NBHG$_60IIB8:^Y+G+ +M>LL;%?!U`-XXJ&9/W>RHC*E9F[$%.QW1M3FQW@R*! +M<"6X8?9E#+.O^7*X5LU^>>/HSC^6Y6<)\`)G<^CN]*;B8Y,K4._UE?H(NYX, +M<5"+1D$H[]`82)9-V,!%_0EX-@4XI?,*7QK%]3E"MP:B"LP,`Q?4E30'_%=W +MJMF"5Z&1LO+0%UIIH:"_9E"N5.1L!5X0VS<``X>*WL,YOF!"6$OH`*=<[Z<7,O]F+5C^;V6]@73"C +MC_>+MB&Z;Z9#^-92M2BYPS(T,T34+TVQZ&Z(F@)&J0`5/WA_S#`9.Q"]!EM@ +MWG)+5YH$0ULIJ.)2*)'0SZ@Y-K6^!*YE$T86T[`9TO;FOI`L>SP*O6 +M]>X#-/BQWOMUA[<1S1D6_IZ??860AL$MW0+NE`"S0\O^PD)M$KN[H<76.PW. +M^_IJ?%''IY]M<)0%3AR27!A5:4]LBJ#@E6>=H.#IWY!#F&ZWO:MSMN1D\9#> +MO@U9>7V5`;#_B:*-#23I8`E\3XH(I$`7\3SIY[[5JO<>ZM#RVI!2B\7&,A`[ +M=:J:FQ2@CD6-(6)"EX-/NN4L]8P%>^AP=H/\1S2P?KV'ULFAS=8,L+5JSJ*< +M>QGW;:WI)H`NFBC7E>M,HU`QLD7@:8']4#-YYBR!:K8Q1PQ1:LF(N7&F=?U! +M(HW$C[2\/C@=N-5J;6%U9=>ZWOGA)8AD_FX16M&&@VG,V2,'_UKA3A1D/$25 +M^9<=ZSJQ]R_6EI)!3%^@8GAT!31O;UP1WWI9!V)=B%JN:^^G[7.LEQ8^>IQT +M-61T.<[Z>%/HMGY#T/N>H98@@N:Y[0R,C0*W$;B[/$4_`[E1M\/@`ZDJN>:[ +MBX10$^-4Y/DUZ4%CXLR7"F_HSMY3"`_.LB'<_WN"PTX*FOZ[=+S*@?GUD&,9 +M>>QQ%<;.$PEI4S&TZ2/B"U)(6D'M3I#UND0E_=<(^W87/;![5\S06^`N6.YN +MN^K$"G%#@7U79.=U^_>O>)E957M!\-P+)0OB*JC`A;5SC;'IM5`PF[15+6]L +MHA(U_J*E>>AU,HJ1?J?MK_D961PERYW68/J*6&$?8#G;"_'M!'):\%*>^@U> +MN78ID`RF#:3=`Y:@G0P%=4&X6)Z4`E^L;F.2:\'`ITF+FX[1$F8]N%[412\L +M/SX-33,!*MIF;G&7"^!VT@`M6M%H5ZFYMUN3=U-F+H +MM-/X@IV`6U/$4`.+?KT11KTJ=D91/54&,_2$0:Q@!#2UV@N]Y$15?G;",&9= +M+.RK6<#Q;3XB,%*@C!/JJ_Q4BAZ3A35"^J2V2#I2F>NM<:Q`;W)I8?-6024[ +M,#I&_"29+^B%D(&'86W(Z/#H?CO)*-F$>3CSK01@QQP%7!=X2VH?Z$2U,K=4 +M0J>Z7G5F#X.4I(@QLF.YIM#U`*%"X8S[OK\8_)B^\U]BNVZ3?U*`>4>J]+-B +M#N9'SAEY]_\MCI=49HG.@OQU\RM7"I*-<'>(W-KKK:FE9(2&;?7Z)Y5($^#[ +MITU@I;5`U**'9\&:_#/T\U.X[;[B*YJM]>09)&["# +MW#*&''QSK +M=`O()5#HO-#N:/'_/3\3_[DI]!MJ\[T/7R4RK4%JZW+8KPC[UU[/+0-VU=KU +M6,C5H4:27QZ.Z"#'IDXM]Z(PF2MI?9.V\=72O&UJ],I)\G@NRKNA-N4C,WX'I25K.1:,]*"3OEHN32H2Y- +MS!F*\%+<"=ZQ2GW\1MR5;5PI\M]"I]1K[DLA/=6[)+"VI +M&?O$3@-!-.JJ:L+NMK;KBEDW:0R*$BII5I*&TB!!1-6L.9HDU?CSA=./%S"/ +M3Y[BHH0[Q=9OCUQ/^?Y][,UIWK6\2O?7"7Q"\UHA/J]!KZWGM<^+CYTI;/U5_I?5 +MLB$"II8CI2J%3QJH&#^/H&-YC[W9UF.';/$QZ[=_E:_`YNAY5_=9X7RFY#.X +M*#0J9/>RN>2F*B*^E%R?5`L%.&\:7:J`_91J6E"+A<.3UU7I='0&?I])&,Z[ +M,E\`G8>./*C".QO`S<%3VI_^PNAJ#O&VDB3FP.\W(D@9!.1":OD`\FA5,=93 +M!(V0L*N9&M3\[X(%#J)U4!!:B@DL0+Q?@-@0LH*<'>+H,<0.+P+V_;DT/YM` +MO`N'P5'BU)W#>:`N"GBCPITW$"B$#2*-D4HFR(N9M\%C&B)^GS$7<0$*^ISE +M.7!\502A@^_!A4'TR85B`/3A('KO0M-)+F)_2C.L:WF:S9'\*!JP7G0!L6P#R(EOUEWR%YS_. +M6.D?N:,0,'Q+MN8TPB2.@-F2@%#"V-:%DID2137]\_T%!)]DEM8$]$-(9>=0 +MCT&7FXJ!(H\;IJJ3P%BZ`0X:AHAY'!?3IJ'J]I%E'D6Y4P.WEEPQ88P1'9#; +MGK$VOT4T#\`89H9TSK`.B[U/&1"@9:&#N/$,=3YS%CR#?[!V?KW8@[T#0%O; +MO!_^Q3A805'\P+DQ*0,#,T=JU(P15M:D5T[5I.DDF;S2_>$E,G1Y6JU@#)88 +M!5MM0`H'`0D?PL^7(J@5PA4K;D/X`F@$;IU$N"X)*:8?@IG/\WG/^XLWTJRW +MWC1BA!MDE@-KB.R$@,A8(Y^@6'7R1HB.@+>TD\_MJS-VXR3JS5X/CH1EJ3JQ +MJ;,?G)>:WB+CA-M(ZD?\C*C])Z'::E\7WLO(@T"=!6J`'M#APG#`!K+%),!Q_N$I[C1;J+2'-/4.VX:L2_^$>8"B_E/\VBV +MBH39M_Y]0]_E49JDYG>>I8?6`"Y0J9%(R-UH:8J,$PJ2_G8VF?>6I)'6UI!=]'Z2Y4]0(D`R\08\]#@,7JK=,5^0KG:L4[O0`JVNSGB5;^ +M+="VLU"I>@@4D5!5Y&YG6;)2,HU),DS.K*%A-L%=D3;"J;KILH4N(:X%2_K# +MN(`S#G4Z254\46"@A!.8M@,-%&K50&S56G#MR/N`%]K_^\JNU]FQ(T+BJ4_S +M%27N\EQ]!WAD#WB3QS6?3MV+U1]E=,Q3*%T[&,2`^RR7.`L/K.6VPR\TVGPO8S5(^!\?5,&(;%EDLEP[?'R=&,]",D +M?,40BS20EK5,Q$RGE_>@_A/30>D +M_:5=D#Z+AL6,#&[=.\*3VC4?3!ERP.DC$\:\1T`7Z]NR!9T.V5:W@0F>PA#3W:@*"; +ML^(%5JSR85&UG4#-&4)R#@B&@$@]J7U5M)6(I-^1-AI&0>S0^M\^B#NW9@?( +MCYBT:B8%`#-S,'/7HGL`#%W+P6%NEB[?2A3(BNHXXQ0=N.F6&MVKU$!3LIOD +M-P7Y<#F?/`6AH"$K0)*TRPB8,Q"U(;%P6LEBG]X/='<.S`4D%5V?)&VC=@=V +ME2:`S[BD(M'ME=P$O)TN'15;N"F_OO;;VZ( +MLC1V`SF,L?^R9]F/ +M31.`MYT%1B8%(UI83SI7=X=L.1EC]F\&V#MQ)&)T?%JIZVZ,2^?DI#&:+.J4 +MBPY./G@;5HF +M^U0;A(^1?N,=Z]1L&(*&C_X^/RNF+G]\LB(Q;I0JJ4IP6@I!#5#S +M(C#ZWW,E(V[FLWG`%6.5T>+0,E!+VI;QE5+)]*]*E'6H\*UV;"YZ')`]\/2. +M;LQ\3BA<.!0L71X;RUQ7XH;:J^9JY_VJ* +MP=R7^28."K#$]0%G:-.,RFJ8S54.SK=G'UE/#VYQ-+BN0RZNO63P.[=`^JHG +M'O\<03&XT3&4L"),^TR?T+U\.O`5K0Y240H<"+.I2YZB01HKF%+H836[ZM/\ +M3-^=W@I5I"'2XL:\"Q.[BZBJ-9]K*>7`7,/4RX@YJA&BN +M5C$OF^7NKM#G7EAY3\RES\'!Z"*141F&&L\9O +MFAW<1?"MK[5)%%6.%8;C*(N;J"K0?)NJP)LJ3*WNW'P-&QPK@]G-$;CJR,;Q +M>_ZM4WVH;(HAX8CV%;XHM(/3_Q'@B[2O!8%$O4W#D?.E=,+JJ=*PBH?!^*P8K*:+"UBQBW'VG +MO6(8X9L!<]MQL]NLGXWH"I`9N%$]UP)>MN\Q[$'0O"QI +M41K?_Q1/V<1!<*&6&3QW]!3,251B[E&8PPGU`>P8P&HKT$`GP%`X]')-?3F*#"K-)6-> +M\]Q-N+K[G/8I$2$3,X>P^P\E,/LCH]?JXP`.@Z@NG_]HW([`'V.WTW[MA%,'>7HPTL+3=6:5]%/PZ]4D$#EZ&C\?,21MW* +MX2I-Z6C%KBZM4ZC2C'/'H4_.,IRES0[\12Y%Q9:##!XA2]^XJGR(FXL>%(2U +M,4HPNR%N1VO+-Q9W0<*0RG0@E)8103^+!MS1N$;.P\>99KM9M@Z"O34=-?1H +MHR-(6(/%QX5XZ(J>;VBRU&J,8=^7X%TV`1W6ZC1:<3C]`J>I'X:0=0 +MVW8:16)`E?9F-5;V4\KC#U+35L,=Y>HF15`&4Q)MI$Y"J&!AN$, +MF]9-I^_?Y@`C+65I9YJ+MS'*\$T99F!FX$8CR82:(73\ +M1Q,;7_T?LI?L8DR&;JI=N6O.Y^PY[Z=ZB/.2L^=H!5U66X"_$9Y6Q!<^[2`R_'AV&Z7%MZV"!H(+OK*H;)K^!$=2/>'+L"(2-B:T]AB*( +M(N?[II!A6[87L)W#RH/=2YL"2U$2JQV`Q^PZH4WJ-\N+YWA;%HV5 +M5AGP+57,"!RG28C3](M?H!3,6W-."7>AG@8#68N?MH/`LT/5S[U!=A-J1BAH +MOX>BZW^LX(I>`.ZIUX$#C3UF=SY6T?!]<4+X#A&_WHO8_$A')RC:W:IOOP1YX1NN'`>Q^K610!6G; +M@G[Q!F%1U^M/:36$8,8HJ9V5DQD.VK<4F4*W5KCP4TN;WK)%P@5M[FJJ$82# +MZ6)X6TM`=8_VE?!A)D$O/Y>AF+'$%>>$3+Y@)"^J.K>*Y[0!<2PS0&X\E_&( +MSX!4D:;!4GL--52T);N)1.K0^H\RZ.I/X:US'V88\5`&\M>3DX/KAS/26V0@ +M4?-A)G\Y34R>K2X4A726'JH9SC#2#'F-0\TLU]'"!=[RB3,42F6&B.%,`=T-4V>K-"_\8/+X]?5/ +M:<;!S-69Z^7S)>/6#DIXO&9ZHYEZJWQL/8JQG6R'K1Y[AQ3PYD>EI2FCFLEV +MXW!M2=7*85O-V;R)>DK;@\;>MOTS/UN`L[Z*3I*3HN2C_CL1+%QVV!C2#_H* +M]-EZH!Y8!V^0/$]V\Z86OA-V\@Q0#X.C7>80N(S]WZAX9,=^V!T[$-UQ[_[] +M\!_"UMVQV)Z'X'[AOGU+`:3PT*Y'KQ%6A"V70=(XTF8<^1)NK_C987"OU8FN +MY/Q:&%D%"Z1SJL(JTXVLYXA%%O$/[)R?"-E`J.ZQTZ55=M*!>NSI-_"HN2E9 +MG*H8JF6JM&#[NR5=W^WS%%3]JP\P:8&NZ5Y@Q@M&^LXL;1QF./?:&5O7]H.N +ML"/TF%:+&M$J>(2(/*85CBYK*;RAY"FM#$E.7;SW=0$^1O3B8U9&$0+')D_\ +M*C\[\BPT&@$OI3W%(G6&2V464.?0)38_>XAJI.!I:+Q9H9H>TPYC3+9AY;K7 +MY[!"QF&AU/MQX>AP#4VXORIJ*$ZD+C!2$?ZH)%[27OJ_O\;B!M<[?\2Z'#`W +MN680G!LN]/G6(X`]#]VW;^?^&.P[L"MV8-]N,,+.<-/>9=7LJ]>$!#10_>*! +MZ+H#T9KP3H%9L5]`3[D5;-@3%E8\:(';NN#NW,W&7(=1(2,72^+0FRD)3L`\ +M:>PZ8>S(;H7%P4(V&0AFJ3=.L\T\18B6QBSR^)4T112 +M5)*E_(O+N%#"N`CE]!%"70IH@8BI4;5G#J"2^%U\X%7@T2`EJAEO)415*I*$ +MQ=>CYS(/-M/\PG5SX$26QJPI:11)#QLRJ+9;]!.I:`P=UG(_+PX_0=0&S2WV +MSI(Y8\";H_24U7_2L_L]X=W@T[#\2:A#T/A9?O;B9^YQ9VE;5: +MQ]\H32#D*'&86[)@;*&F>9A-&E(H]#+@A)@\CR?(@9W+^WQW$TUC=A,QOEG_ +MRC5G8>QRSLJ?/6?RL\Q_3.=GYJ,YP#3` +MEBSI.QO9>`YA@[2T#V\M.%S2.E8X85"W9&DDCAD,L)4LZWL#AP9Q!^W'S%8C +M&Y3D(DIE6XJ/62']5K[BP@J8=?=7%?HW4,-E*>5QT-`*)4WCMC63%O`>2,J?=30<>*(P0(Z+4R$`MR]`1N_,E"_J7G<%.:I#@8J]$[9F+8 +M#AS[PGQ>KL"..Z`#18].?J,,`MT&+UZHE1:@:=]I)*+^DF;99DB62T,0%`!G +M$R!=+.I2B`2<1Y]BCG3JYE+@S@#W[X/`+25Q&`#N]9JEH&%E<@#XUP'.LTNY +MR"2%G#^5SY]UM_:4:.YG@7IEU5CU@&66<+(#*&%#(0O;=[QW^W\C"J1^6NJG +M_O1IXWR$WDZT\_-J9O<="V(:)();-<5,P8:G=?*!Y3\R4%-D/PWEN-X"TR3U +M:$\+%`3J_G-$-E[(!(6 +M'MHKQ:BRA\)+M82D>L/P4C'4V%Y:V!_;>>__6D"`!O1UEJ61@X:Q>1K48:!# +M"9CY=_D0A2EX?/(V;T$Z3)9"AZEOI6I_WYNP=OP(N"V7N=T^N&+`#[1#7DIZ +M@O#6@B9[1,W^NPNZYK.F#NQ(=MBE%F9($(LF"7`&;;S")ZL\P2P(XCND(!ZR +M(>FW19.DU"Z*2.RP$[#51BFEY9*(75N%&(0$&@^*GR%E:_9U<>=GL%>(6:0[ +MAE$WP(QT1SQ[QGE>:F9`W=?#3]E(A2@?A,\RG64+'4EVA!B!)S4DOVTAD7S0 +MT"4+0:*#K/5@X$%*UUKP*:W+,4\2(QW\T<,81-FUX`3GK)AS93"XO/!;/&!W +MG2=)#@8O#Y3[!D`AA,-""R6L.6B#`S.X$PM^Y=?F**8[,C@T@,%=!]C=D.7Q +M*5/]E0TVS*/:&<`P=GY4<+!12BAW%*E"\D=`WY.E;>C5'ZU,(AHR`[84VE2) +M*(+2+P*I6"P`'=->?%2K!?&H9A93&M=:(`^*YS*)C?3$VTOI&#*;*L]91EK[ +M@4F:<7*UPHX#+D]G+S3@-G1=/8G_\K/UHWIQ!)2-`]X;Z28E!%.KAI=P/6M +MX%K*C/5K[:JH49O(SSY1U(]'PA^5)I?J;E`55L8)[I=MP?U&!L&(H7F&2W8: +M3Y;'($SIPQ,?J#.GH`E<`44J`.E9S-T)'+VT&=Q_[T[P7^E4LTXR2!.A8:U$ +M&5Z9S!E;WYQV%IKZR#8S5?L!(U):O4?%S4'K!&3*X' +M7L_/^GE&3!KT47[ND@$E?C"I%#4O4'V9I25(',BM[]'*XLNGD+W_<8U&X\9F +M8A)6M*7'@9L^ML*[+1L()6H3>`"/?&<3,#9*3M!Q$EU53JG'>[1K)1[!RK0- +MNX*(ZH9N][4)!?Q$$L4=A*MDXK\.LMXR+'5;.W'$F%B>2%G5!MYO28ILCWUS +M@RDD_B)?@=N)P3791N!YX+)6'6 +M+J/%Q,9AS2;@4%J\OOMXU[9Y&*3!*<+@D`TNUKE8YP#@GCIG`?0FK0'R+S/3 +M0H_6_C.2GS*/F]A>"%C;2CXEHGB1JQ>7#Y=`2&?VN''!:&ZW)YNL59*AK$.$ +M5L/KLOW]C,5+D)D2T(IHA17;_0_T8L,;7V>K?RD+3/<8OOSL`2 +MG=9M"_CKZF^^`VW9L?4V@+SJXO;O?EB\;",U!^97+2^*2PM9C1)RD'@W#0.%'B]X&CK'8O:C[/1ME:!'^H<1`%*=8,P_##/QCL0->4J/HX +M^X.V8:AA<\;:BP2%`%'7`%M0D4X=.MJN#]>@<7,:@=4^_`/T3D-VV5(F"6RJ +MN\%20'2S7891(F>=VZ\/W)H>0XBM,DB/&9K:7\\7)(AMGQ0UR15#Y;:XT]@7 +M5-#H=58:#:%5EN(4PEABH+F;K=(:_F)+J)6ZM2\$1YN84B9+8(*GJSY=$<61 +M>^E1>6X'A+Z\3/Z#,[)E>:3!X@%=]3>0H6I]'*[\$7*^OE0N0Y,#G#GB]]6<23E[W_\"C?SO.PMCN(MYR=BK$KE-2*I%4D-CLK07>VF=4))6 +MODK;QSJI*02_[]OI2(!0"G2NYO>&C!,_I>%:8J4_3DY9_Y!)D4K^EPL6$06V +M=;*2+3%JKTJ:1D0_K0[;155N1:5WV\.6@?4?TQE:.,4Q&0;0X],Z&V4-S`1Q +M$ZEFI[^R#=_UDN`R@(ZVX3]#&#O_;!O`G/DWF4>644`S<=O*YMA]NZ`8'+<`13SX8#1\8$?1=_;"Y;N:=D8BNQ^Z^?ZB +M[P#48\?:>IN*W<(>J+A_9T0@=T;N?VB?VQ*S/56U=Y\@;(]W-NUSNXG^T3']U:.9E/O; +M[P<']I:T+:_]9ZER,?,3( +MB$-G)TDH&F?:I:*8@KM-$8SE0L\?6$$`D2N"^"0'\`-M$/TA\[JRMA'2@^@W +M&>I`X7K`(JHE*QH7H>V*WWP.G844`?U^-.@3BNH9]0>F.37K:BOCHN>=T7]6 +MPQ6S$R8?ZV&J0M$=(=V#SQFKM,3&Y3UVH`ROV4O[6.?X>@?Z^0PWA/WMRZI` +M>UWY329!7"`R;3;]Y$QMB?7X0D&3U0OIL]#WHFVT@'"O)#$H5\457@U*;5JC +MW*:8XFT:'QK1\&NF-J^IC:/>1:&TE/XCJ]C%:=TAI#"&WG/=ELYS'QB>LK9A +MS]B7_RB>\`NKY$-=S[`<(5L3TG_0R8FC5=HX`3W:(#N>D7],5VFI,^Q@@RZE +MK;]'"2&%$M)IDPTAZ^\S.4#S[2BHJWFZ?#UF +M"OXL#E1&"Q?>YPW].#%@A7%47$M*@&UIU"]S^O,%-)X)68"K=#D;L8@Q?"N-P?PHS1Z,8RV0M^E>S'M?\PXO\QMZWJ@XN;=,E`SN;SJ_HZ +M"\Q5VK6$^CHD\,CVRZ!E4&)<,&7K=3[`%O2;&"#FD2V)\4%M@,#TRX[*M@4R1#PPF9^]P<:&3XE: +MKBAL2PV0J0NOH-&/8("*JF2*4]_!>C]N^7U^EHC7")M$QN/!3VLEBZO>1^/D +MP,P"\GX)T8$W@=,):VL0NR]$Q',1^2>(?AXYEA99#"U;$02_3C!V3Q2H`/6? +M!4'^BN8#Z*']!Z+1O?L,/T#"O3OW[]FUSW`*]@LK1$^SX#J-C:OM;4G+Q#!0 +M(WKWZ()?B[7;WMVS]Z%#A]]T"W6W^&X*B2[S?3OW1&!';&]H0]WN^XZXA9TZ +MQ%_^]">>UZ>1^V;/M^V^[]JJ-/]1SV=O(`X-GL5NSC[P#\WYV8IC@Q/GPGOW5CPM[BAX*[VZN_GX;CQ?GPPU%H:HFZ61Y +M/#.BP@(!"U_AL-/+`U7_+S_9)/5J=PP0*J4P'C(EO49:^\A;*DMH.^*J.(C5[ +M],\>'4=LBLW]TP7AN29J%ZR4 +MC08E+15*DX&E8--'BJ1)%Q+^R$[PS5=SC>#&L6B,-ICZ[6;=104Q$:+E;>=@ZJV98WS/T+N&^9"K&W+FWH#3#@IPSN +M!6,N_.J`&#$2?5CYRMCX>K1NF(A^K`WB89O+E3VKX[HA3&&I>G)(9@1IDB;X +MGUND27YH#KRBDZ:-;9B'BRL]O=!C?TPW\,^FUO,+B.OJ(-RQ*EAX-3_3<:L( +M8^(3*+?U,F?\6<"4A*OM$"EW4-ZRJ`#0:7?B3OL&1WX=B_U$&'@UVXKZ=(8"-6?W%[@1('AT +M7=G=!O])%.&+`,_3#X;(TU$O56@-%G^T-$=9$]WMKA2NOX[@'!^QXZC62]:_ +M/(C\]5/O('MBQ7R793HR%2D?[RR=FD_(;$YLF?W0S'F^3WP[=W" +MKJ7Z3KEMNY?_KN!.L.P7'MJKR,Z=#SWZX-Y]N^^^'%[QWC:/Z__U`3MZUA-: +M#;\K"2\;+2L<;@0YKC6B'D.]4B37LSV&%\_DUQ7X0>"Q@ZTE&GEJ:Q=R>@BA +M$R.WQ#VD8L[B[L:<=4[B^WX*?"]PH2JBS:24U5)H*2(5^`5HQUC-!H!AF>+L +M[S<.H6]8K/V8J_@=YASIK!=1#?5$+L/]P=H'SA..6*N$ZZ3*IF_?T2I54U`[ +MM")9ZVXY2`V'<8^]F1I^B#VC`]84C5-$X\J&+%%8;L5AY&WI]8.2Q#B(Z-@9C4_NQBP6C#\"Y2F4#< +M-%!O_]M7Z5N:JR17[7ED5^6>%:G*'+(N0G.)XXW2%L,7'B&*<.:<%/VHQ+TR@[ +M7_'?=<.X!8M-@!FF>"Q^AQ6BMG]"LVT,,X0-TL\C\VF7*63S+XOC5J$1R[B1 +ML\7?18G2^K-P7N#9"65/A6?"WAB%F"@+N4U9'%NJP[>UKZX5U?+XV&3A&8C; +M=QZ^)"_^'>)1\-=U@/_KK4#L*[#N:U"X?%5F/S`$IEA3:E +M>N(2+][TB3!"PI:24737MC79>;-O+^D&8R2OPL`UX";Q10T)PD5C5VN:P'60 +M-D)#I@F@^C&SWMO^>JR#J=TZ8_K3C&%Z!@-5U+MFA@=JA40[@"HY_74\&!2T +M(]*#UE(*]([0O0D.`?OU2G7@/[R<0?X^1<%X.T]AO@KFU*<1` +M['VO+TYP4-EFJ`9NV5155V680#!F&$(CR'SC6HM!P@-&8(4&,(`+X +MW4[=R80M:X!?=WGWGZ%6_P*_90-P1%MY'"L:8,W`WZBPNM? +MN/-+0V,%#;AB@2"G.9];'B6;HV02@<5/&'HT7GGOONEB%_`%PT=-<%2CS=*3 +MVN\@Y"<<72!G-ZAJ%B7^0-82P5]#!YL6@3+:;IU!'3/U0.W01]E+L+2-,PC4 +MKX`BSZ^>Z0%*5U;SV.Q58/%:!+,IKL>M86+1"PPW+D!]8]5(N9$;`2>#T4GM +M.(99(]D>XLR*O0N)RB2XA-2JIHV2%Q+):FW!W$$(\4GL1'\NA-D\`"%]8WAG +M\UL@6(4?H>$BZS7:OQ71QLA==@A\.0),\S,B1AT9S +M3:&F5JD)BW(D^4Q.G'P$6G(3A`-R$Z]CY\]SOE!LI+B6ZIPQ@'1$HXE&BNG? +M_@4,IW4!H2N!J<_Z@&'TPT=!)+;^`J(7A!;LQ,#C*&X>Z)@^D8H141[<#G&, +M[$7])$@I*3$`'>`!;.@$R_R&^WJ(D$/+06+^^!'Q(0HV\A>QP+IA"/;#.4_=TN1-5#OE.JCKTKU#=!1ZY*.V+_U +M8X1QDPN:EK$\U?@Z]G:#EPL_#30[U_6&Y$_H#L=/C5GTX:MBIICH<(HGM5QA +MS<4,AA8LG93$$*+ZN6`9?&*0D*ZTRN`]@[%^SPP.8-=!R>5[G1Y_G*RUH!^M +MC$+`8AL-T88$%2C_`J0YW9C-"_`3C4&N30;0X7E88WO1:1UU+$,$ +M&J')9K)OJ9(T8U@Y]Z2FL[$O/8#>*^W/U"X<*UZH&H-ZJT"OVET%7D,;;@5W +M0ZG'?!J=.P&I8-;4-V]:`(>$3?VV,AFM1PV(/<%Q)X14H9$ +M`_H"E#]B$9I)>UKV&"82'O&$?FE3AHU;D0F7!Y1"+X*Y(!U`,J>2EFB&!MP58KHQ'FY+@3":G0,?8,EF9 +M+'.@9(8@ZC?=3BSMPD^[)IRTFDURT+>Z54.209D,F5MIKWTIJ&TI_7(3T`#F +MXYI"X>S=BTB*ZAT\K'C`^QC44EAG*3A(-!W4O$1,3/86M?NG +M%4HE@3(_9@@]]9@!PG<_9FBZY3(/"#!H&>%R3FJVQD&H30BI/GL^7]%N2 +MIMCGLZJ_E_(1X+_P6",LJVH3[B9P7=7,3\]-L[:P7&B+.US%@MC8]9_85] +MU,_SVRHP+P$?`5ZW^'6ZNOOWS_(5!5L52S$D=6^5)H)0@`&WPTXS- +M6[96XG7H0?#GO#FO3-5MN25P=_3J3D%73$Y\0@/$MZ9YVL-A'BN_K)'< +M*-?43#<]CG@N5Q<@Q6AKCQ8MCA"&NJY+XZH!=U!J]O`^Q?A((*O8VFG\I,8( +M3QJUPT3'I?)1PI6Y_2;XZ/C1PNCY5/V3OH1DND\W.[A`2\:1(@3(D=O8#P(?6K?/[T +M8[4).5,$KG"1=->W!I@6HD_OT+K2)@:>K0FPB#(<;[N$F_9[ZP+$A.6HFK6Z +ML*?-/J!:0'!]<2%_VAW]AR702'X0U=U6@1W4?DKM!*KZ`[CF__AA/QQX4-B] +M;]_>?6FX@[@C5>)>BI7I$@QTL_E.*5$"[FXUM8^F2+5I;`*;L@ +M=%.]P_L*JS0%$QYCB$+Q(-6ZE$L5PB\I1S0[2230= +M$";FP-%J&IZA9=_DYWJ+38(.L0R%YKW2:A_A:,D"ESINE'NAWPS1^?XK`[?_ +M.KDAM=-YZ,UI9ZCSI9#K"W!U$W,)LU+1`5\(GV1:"TR$F3XWQVLVFNT:LC*OBL +M2:E0/D&$E`0Q_-HO=/DD@-T:9<7/\Q5G6/P)B]$\TP`C==_I@30;N0H:TL^# +MM^][8>0"7!ZV.]8-@_.Y-#B*!HOGI$D1<#_PTG*Q6V_X^@1G&,M\(7P<2M\! +M_'\>TTECP.9W,)CO)+'QY5?SLS\$1V47`DAFJ:B2S2%J+./!IS26V@1H"AI: +MTU9)I'%\,H&P+7J^1\C-ET/4ZD*<560=3=^%>CP<@([#PM@56@#"./($-!T& +MY4,\32HV%KO?7X_?5F%4)NLGK*`*>D/X;<'[[MWQR#YZ3VSW->0*G5#IF+`_ +M9G@Z+.SD=5`%L\U[W[Z=D0=MOJVWA_66:$KZGB73)!K`H6+OI`FGRB@(=^Y@E5)#')X^X!Z#$\#93="QC3_8!K7P2F'_PW +M@E\Z8@BWEC7*;9K0X2?$:"]Q!!)+:5FW$RU@ZN. +M)<,K1&^S0#7`CGV[]^^.72/$!5-LST/W?J/J!B),W<1;F-40XXBL&'-8%T,0\S/9KC*(Q9?(X0>UB# +MZK$G=8TIR(`80L`PL_C2:[:6KFIOZ0"&W@D87`925T&<[D,+',A_KTAA9W'$ +MD.16+R"@4^;?UK2I*/C?9_*SOEW@/DAQ5M6"'A!(75'T@>,2.((#NE=&'NQQ +M;!5#YT7[QY9>7*_D\Q4^!Q&G@2J4.S)F+SYIA[AM?8'8AF,"G*29DW9^J;C3 +MH^50@8](/@$X&ZN6.&9T8MP$3=S('@)F`[\BN@:A,`%4;ID`JFGP&N%`-`P[ +M8[N%/0_I'_-(TY[(;B&\M^"1AP07V[4:Q06G8IK9L;7^QAOE=;#YSMOE^AL# +M-XX+(G:ZB1$LK0A?GK2^(XF;[MP2L$!="\5]M_C8Y$O01O0V56E-VU$!J7>HRMI\I$P[RJ!F(CQ&6Z>2E,C7XG>U +MQ,JJ]9H;8VL3>_"2*?A;HJ4Z<;83S:^9MJ22%D;)7(:&XA`B#MXL#-,PVRSA +MD`4.3R8!1P"CEP"K@(=TT)$$3M@V"#@@+54KTV7@!Y8A=B2KZ%J9G:TD,^OFD*D?(.@?I?SP*F,:Y(9M[2/^M7@&V^(3:9 +MJ=258Q5@"\;V9";P3<`[`!=@7)9[01:_;H$1I?^0_-2_0EZ$.CV%-!EG8V"0]$2 +MU`=(A1@`.0?4*,8')0;$QS4$L6`K.?KF6'ZVV<)YC4L5,"3*`X)\\[O@4C,M +MACE;'U'BVAANQT:?T7#93/S1&,?A/HIC\6W/TW=6]E^>22R"UJ@ +M<9"/_%&J7_9*:2+RW:ITP7P55'SYMT +MC']'%U#O0X=Q\?#/+%[5XCM,3H`+:.,'YD5;,EVP81XW?P;-(48G-2=`:)+Y +MDU'!PUT0O2M0395.P/":H4U,=]'JR/NXD?F9:0*9_"#05S7IZNTD2XD1/'PJ +M--PL#/_%%A!UHT[C)';2J.5VK%\LP82AZ1?0NR91ME[F38'":D&MS;P"7$4O +M="/JB.&CAB@;P-#76U^Z6)I0>%ZU8>5-WCL+W?:P;M8QW0H^<%R;=<`_FB5O_$\0^T[[II,+0I/3F]'?+P#5A;5J&!-7BUS5^+D"- +M4P=>R<].@6_N_CN..B"JDM\?],8,6B)$W$3&:F9L:HT;QS0B5"$8")J1P,TE,]+Q8%7`PN& +MMGZH7X1ZN;!4S1Z'>H^4ML:)D%8SA!>*YF>`M'=0=`.FZ%R9:]<>P>SV"Z8_ +M'XB67;8B++Q;(;SH0*WD.2DCEI4% +MS??MVGO@(;KN!V7W`GA)0QU06V7G`F\)2A>+_%P6>T.'C2&5)20T;(OP4&'0 +M_5%4>I/_.P_E4MEMHP(,DP+(<7.S4E![7ELP_]G*4(U4"$)L=TGR"*>IQ<"' +MRH,=VD:EPC->^+^S21VR%O0NZX'@]*LOYF?^:$U:F_R&)J$>2622/$D,T3D0 +M1>"N0BTX00U3W7)V,X:Q%S!N?7XSOF+X!6M:'CT/(9LTVHD4RWN`2R]S<-D8 +M#1.\FXM>`3R2;APV3\2S-A@>D9N?3@YW$"9(#I^!VI8/@)>'#[VX89P#KS1R +MZ_.X31XC>NT&*NZREJ%ZO>/[K#U@SZ$Q5L3'*^S+[.:GP6MS*(@FNGF8<=9< +MI2(W?GO5A-[T7(#9D`.^(F7K``\2WM&H+?_*S^0*1.&FWQB7M@)V@".ZC"+# +M!\%%*JI.D"/^/?^Z0<+\C<"8;@4'R+_.2H5')P7IV\!TF">-H>^O29N`<8*C +MI";7>&AUOU08GUP#GDK_`*J=P=CAW@A<\K0DVZUVWT^%7A$_.:`X9(7A(AH$DM(T&@+/LIB[ +MT@$-V5.PS>(&[#1X+>$L16`E+>@H`$5*^K]+*T8+DP6CXO^@OI+QBE&OM9D6 +M5@UNS`]P-*`U* +M92MQSJZ_R0A\KK)U,G\YA29O*]IBZ%:7@^)2-TIK#F:]U26$#"G<1!N?6*8) +M-*%3#)ZB@?L43V'*3\=L*0Q#M7MLQ"#E\0+GS;+\",PA7MQL'AE6LW'JN`7A +MAXF`NI%`XL.3CN5+(5?JQD/BP?2`2'^4:=4%X[D,^`5>UU1L_R+1$[-#%W27 +M>CN,M3_4Z%ZR7>/H`9R"S.M"*D/@NFO2=0BP2'H_`O$=?$9(&H6='R+L3PK] +M@V]OT#UW]U@-1?C)TD@O&<&"_(1EH;N`J4N3<,O#7/VG)%L+L':>Y<0G8*1; +M(Y/"ET`+@L[Q_;+.YI'VZ.7$&Z%R?\2[ITDA0_@4BHYD2'<:IQ8;,@ROR'[SQVF+I'5\4N5+3DL?)8A +M?=D'_I"?W?8%,!9@[E^J/L5\LP"8,##E:FG*[IAXOXC'N>1.3!^E>0MW; +MLK;FP@D+@1E:5FTKR%0*?_RM"#UN6B$\`$$]H7/*4 +M)A6!H`A*FJB&UG1"^#"CN&]]FY*V9"H]"NF#*-+M0SODNGGH2'+IF[+!T;$&>M(-AN>A=F!J-%#6NA.X53HA3C4*5UE@T``(^H7U% +M<31N/0-&.#Z]M"<+U9$'TQ)2ER^(+5#6O5[JA2K[W?SR;AD'UR1K?@I3:=1T +MC\Z;LTF?FJ4FC)W:&(3SNC@EZ!.:9*U+4Z!?+L;@_>*#)T%$5=#7@1QH%((" +M15I$'++J9]%C'TER3(>=T#L>9J"!10E;%V4SC.&=5`!3IPOK6=QUW*SJ@K#U +M)L&AZ[]_YV4Y@\""> +M.XWK=5#R0[T"M.]#H#$G$6+;UFO'3R3H0068TJE8*C]3(Q5<-Z&0K=6YQ\`. +M,SX65'\GK!6>)3=P0.BGP;6A-H0$1`M4>BWGS'`IN'UR*?Z:D='Q:496IHL, +M5%TCK^+')V]]%P45HTKEGIG*U:V]ZW,N2!/]S*K:9?Q5/F@O/D8<^EF^X* +ME2'/`L.5MQE_E-E08O7+6?-!PM:P;^=('P8R%.A'\8?9<, +M?NKK%Q8^%A;8YL;"KC_<.?%P^#>$Z&4'9<40"ENJ(KCQ[+#>*6:V&HFP00YH6%,(WC][UE;1/[+21B,/=('V+&EO4ID)*?T9(E +M:GFJ&I_7?H@3-OJH)5=&L]F(4A2WOX(AC'IQ&)!\4BN$;1EJW%0.TC.:.5K@ +M)SS?D*W>[2`[&@\SW$;'OF.L&VJATW*X;I%($J/@8+<-YRL,+QNCA45-?P&9 +M=?X+`1ZH=/0ASL-D@JN[F2G0?^33OMR>/QS$-#CVD#U +M6(8VSH$5?CC)Z(>`)HM@=@`-K^J^AP?Y=8KAAD5#=\OU1)4X73TGIA&53O>^ +M!2[3IG!U'+EDGSR^]G5E?$UN7!WO]%/2N.$TC!N^OMGUV^G_>]!_3HV7#TKC +ML](X&S/SY3X@CDVN?#D_:U5_D#3J>JT1CEFK7R[,5]23XG39/&WL/V?KM#HN +MOI.?_0W*]6'F?:"C9-,\#:`^N&?7CIV[=L'N:.P:X?9;-L/_36T*8=@=V[TK +MMCLLA*HQ@A&X:><>'1EP;*^P?_=#X;AP66S?SJC`/KK?'MO]H.1*@0(0>[HT +M=.$%B!HC4\"%3>=ZM'#&'&*5"F&#^.,BA5@O'"QH_^%/D+,5TNU:2;1,X.NH +MZY)84K2_;(I23JK*[BQW24JY?40J#DD3E6C:\+1.YBQ:!&P%;R4M)36$4K%P +ME46KDI/&L(H"JCL[;?9;0017=HA`[V8JI7=!>/UGM<9"_ +MK1-N>9)SA?`01':>1ZE'8G+F'^18E,:6AC_F9Y8-ZWXOH:(I_6'T$(+A?J#D +M)8?(VUN$_>;8WF@4??A($_H]_%\IDMT/$4N38Q;=C=XQ@:A*QSO0+"3)A4/P +MG1358IV^HLGF2.DJ0<0I)!2TX6$M,F!B$':!DX670*"@.?^O@MY2NJ,6 +M.W#MGZ`VU_V6V#T.#CO%+JQ.P'ADVB"'II6I)_6.S8X=-,;8K`&G3*Z&;39H +MM$.C]>O[1^U50ZO2,,H$=:I,U)&Z;B35C&)LWT2"_/=\_C'LI]X'OS%I:85& +M6IH@7U(F8LJ$@MSS(./A#SJ2J-&0(4=.A"ARH:X%\,87EF921+(YU*,=^U]H +MA+&;5SM=G9FO2NJ1>QG=L#1M1O@$2*(Q=%C#',P60.U+.5UC"30(,Q!CO>3B +MZ?S,D&GCG#UPL"QXL3<_,TB$(C\C8CE=C:#KJH/$]%6J)=C,).L+U6RPX"?Y +M6054;U4,&J^J+]:)TK$=^))4N91#2^XOV[3T0[2ASS#DB4II2 +MD%S=WBBHMC#"=UH;?Y*O6*7V`W&<=N>P`9>=0^FQ`; +MDR6C6;L7=QF%"^<$1[$[6P+P&&YL-:?*!Y,?9>9!$:*3QJV=>)XEB`$--XS*$W@D-D!'L9N(&/"4/C0_,B`7V4KL1%:$%/9' +MEA?`;Q+Q1\:@U=60'<+P46;0FD2O6U&2I?$3FDCWP2U"TN#&BKW,KX^VT6B( +M(W*A%U.AQ]?5RQ#4\<1[+X4CN&G0FH)PBF"'\#L9$20WJ8L,&@Z%DKAQT_?T +M@0.IC(R_\Z9^%F2J88@-XN88\#-LP,J@\"'D;*L&Z\HJ.W383A"'T)#]58+' +M;!NY/W,_>+BY-K;-B-^AF)1FT34EE=#T9C!BI;V8.3196M?6T!P2S_/JM:,` +M3^SVW2--_Y2.6@J8F3MQ_^%HA_LO^N!UER\8?"KEM,'X9X4?K8&S2CVH,0V.+`^'O6ONO#`4IA2.G] +MW^9K9G7@$'"\)D)KFP,X"2Z20&T/@^_4C6V9$)-#J+EC1-TEFNM1BM1_[2E? +M>+G"H13X#P%O'=Y2/?]/L@-H1R@A0.^L`44[Z:Z,E_:`1?6R"NW=_Z!P[^Z= +MNV#O0\*!ZU8TNZ\0'@2C:0LV-])F80HGRESMA&,!6Z0S4(A"8 +MBNQ/EX\_-:7#9T@.X*=05UT:*G'=Y-.(2,-SW,YTLJIU\MYO$O4X`N118>S: +MBG_E*W`M]OX'S'?4PE?%:G;UZ?SL?:]`2C_?4FBI4'/;CEX;OQ7FOHD"-R#J +MKNL@_M5MH792L3MJIM\@FB)T.Q9Q_]LL-3YCG[=Z`#\`KG+P^_X.?NPF.W?Y +M;P;.!<%Q-HW=/_`EV84$"QLKK@+!-#A-@P>'WM7A1U2SK7(+&3(W7$>,5!:$ +M=2>Q/'B>Z,!!!'5F+TLZ[7&-(#I646->*G6'0(UGGF>YC;VV(?Q2@6.H?$.BU%<+ZU:ZVK6-T90@B^Y@B3W51I@$TQ4REG]S[GF +MXRWKF^47A<%J4)A,[?%+F)MA:]F%AHZ"UHY%=T@6,@<)\5#5G=8!!NZT;B/$ +MADZ`RT.3;!=?U[Q6;&V&'J`1QKWK%5N:5;;,?Y3J0YA.]Z'C*(AUG;R(Q^P( +M=92^!ETL>*H;GT*-IU&C,5!\Y^3EJ#$G'=][B6UJ<%31C+4+)W1+:?M0>8%0 +MWJJZ\VWC#XKO?+O\;>6OOM:%9WT-M+WVK_1ZFDH]3A*B]":-$689A1S.]%;W +M:/^%=R*REW*)'UXBB>AY=EILE+/_=(OIRYH4V_Q_"3`97=]STJ"3HXG.$$XK +M,?^99='L0S!Q"X5%!F(W$K0+P4="^HNUD>2U`Z[%J)HAY$0KJ]@22[O+C>)D +MB0^Y=;B=F72&MK5:%CXIA="1C&.$43"R5D9!MB56X(O$5"N+:YDK1M>?INDA +M'*/@$R'VX%\@MJ*^U=B+V@:*J.,HGH6"I:UNE6,E,_8YMK.2GR^F*B&CI.,V +M4GJ;N$2FWRY%)AV%DNV("0JCC/3Q]Z$QD/VK-$H"N#[`H;II)$$*384+5?G[ +M!6Y_8?]/G\L7)*P*TE_WS>@7]P_&,=8CH>:5[:>Q(#O.$T%P*)-8='R*F^)L +MXJ-Q!"OP@Q%XZV-Z]D7OK]BX;V+`5:Y/`,5>/@GBAP'/MEDSY +MJ&T4!VI+NZ#Q?VH35PSAT**Q=KFCQ(/XE["S%/N26`Z6,,N=22L%P1F47IIN +M3/^1"+9."M(=SLEO+J/$0P4_^&;6LE3AKC"0*4Z_OTE8[RT78"O0ZITV\/%+ +MB44\HL[`K1#GN1Y-,94D/BJB;Z$HX"BJ/!S558>M1Y.HA&OB)'!I,N%:RBIO +MX'T&.X]5DN8,`YRMQP"U)+@,SC)H-6`7Z^E;#K6*-(_$M^TBG*BSDVXKE7Z& +M(]T".ZL3_-N:&RX[H0$_"?P4\$+M@0C4,KVA6E>R=D*JE9W)VBC4$J'6]`]- +M7-:U6?`Y><262[\##RW$-4H<-C8"Q8?B('5JYZD1(CBL1>L&4%']-JQS$S@= +M2X&ZKD:7Y$*2"_>.U/1 +MZ.1:[?7`B$#[B4!/=8L/:'==W$6LZ]%PQ$`$41\:8=-;D]#1(8PNLD@%Y^_9 +M--1JU@%K?ZZN;.'F,9-3SA8C;VGRR +MNU\B>5V7(*7>(7D=]7>)4KT@<8)4WQ"QM_U-?T,7KL="$\+=)M^?0";2([BO +M,BEWZ8(/_TD.ZD8*,*BAI0+RX4<-YI85`S877EB0Q(4\ECI$C+'8(7=$]I/6WJ=M$\_85VZ^%_2S_7K-6:QW%DW +M]S-V@5M*V\JS7KZY-60U]=6/=["@PB8""`DDWM(D6IY`NK.C:*`<;P`5I/[C +MKJ:K&=56'ET=S)>'MW%)V]T",T:$B0&T4@P8_0%;O0&H>9F81F,`T9,U%"P4 +MCJGDE_\NS1<0H"M7)S<"W%79U2"!>P:\S@D<"#F%0"D7R-Z:SQ<4@'1X3;*[ +MR@FI7^,`R=E&Z-1_5JV5C;;__7>^'$^P\=C?JN,U(:$%!/+/T(*Y#!O"F`V5 +MY?,6-O2`+]F(Y=](LDMUJ$9R[-]YB]"4Y'_UEL1WHB#7L6RH9*@T_AS^W1.9 +MRBD"K!GI!2-MW;LW@T+$39/6=]4,G)RQ*I2M+%9NDWB;HO=<\;[)#>^T$QGK +MG]7,C>`D-R>-8VDU\T.6IWQ2NZF[7?()A.@\5&-*9!A@0(17)R$9F10$^0C9 +MN`46X9H5Q51GQB"IJ$`E=7[91'!5>S-6`C<4=ZN;*S!!8;65JX,H[$235TCQ +MC+W!%+Q9X*>V9`6]G9ABKT3HO7U2@8XT#7\]EH9RVMR[O>M*VD-9UFJ15#0!?!MC1CQV-I +MF*I&S=4L/97C\LQ-OGR<-R+>^%<>\3<]R]]#ZI*OH);EE5:>(J2! +MM`'>@OZAKT*1'/]__ZA6_HHNEM]^?DT]JROT9RLF;7\V>_1O8?MUHO!WK<:T%P;-I[(@6=3U?TI.?X0=U#C=)U[!D +M$IL38*&(QO?I"-V1G`*J%ZCAG4P!1XS/M/XN@1S+DTZ)\A7EB`5^\31)$Z9V +M8M.0@$(,+ZNNI:#>FG_EB?P:5)G("!Q@U0^@Z/X_4Z`K7R?XD#X`J1*)8G$S +MAQO-\6RBN.IIW%6AB]@+4PKN8H2#:92\P';JHE85+WA8%T;)I*ZA29&MFZSL +MIX0MDY<+8X[UEPBS#TM&]3$WX5$S5/*5(F8+3#*UAS*4J`2F"OK7E'740-KM +M[5<$;U0@0*!>F7'?5:L(GJB@=XB"G6N8D*";:?6 +MI=+KUVH$Q:7+ZY/\`AR?8M*;TV2:_FVFG60$\2"E0,R2Q[9)A(FWIY9[5);` +MY3R5>X9-`O7V%'R">G5V[<#_D)V`5C3=LP5B(>@R1`VDXC;C8Y-KB99/>\P+ +M[]"U9;H/2I-$^K*H>1/$I\V.S/:R2-H8L2ZXZ5V1/?>NHW9&=NY[D#$"J#^> +MD$!VXSLG_[$T&>T!?H[OY93B88?SKX2?=!;H6IH23YCFI*`C;B'%^K2RBMI* +MAN%IP4%@TXXW2.&$X%T[8G,+K:;DN:O492D^](Q&%@X_2!2.DXL9V&A +M-[%LC#(%;2TT/JD9*6MKFKXL<;G3\LFR">-T!KG?QS0+A0,"K8MQRJJD:1FP +M6Z;T-KA+MQ05V(?'*:+UTKN"$\U3406F1(:^0XDR3$ABP,]&W_K'JN3U7*.' +M]2`\H$2*%AI(2%BP^QJ`@L[WB\/<8,U!&#JX*DVGZNI-C?;2-DKLT(4AWHP5 +MJH$6"4F1"+45_$^\WN!$^O",YMC1THCR>3%F.=.T`0\*B>+IFSN6,LUN`(^I +M';K_J,N9KB*I$QXFQ*J%[=NR4)N"^8N%W9]BOXG""_X+FDTZ +M[3".)B'^*[/PQZ(XB]D`[F<7C-ZG#%W'#?HH,^DVCS^`3M"%:>JVM""&"J-_ +MJE%@J!$84Q_5;QY9+5!RUD_V@*_#`%_:4N@K,H7.\Z.%_>BZ26_*73C\6H7> +M=;V`>>QQ2!Q\YY;62?\=\Y[YHLTP`!'7S`" +MR^8`LBT[LCVV24I3)1FPG)!=DHP3[)"$QL(6#DZ(46PY=5IZ.V#AL*ELRREI +M^32DC%VWI0EIM;XD95UG[S@A+;=UNL0A*;LEV9'$U,2FB;)+NFY*HGODWKM_ +MP_V!AX\DSDB@.4?O>=_G&9WSOHRF%C3+K_75I;+/)+`L%\[;&Q&NLQ?+6"_Q +M9NIF7`M8>;-@`:(*NPS)>?EC'Y0)0IN#RPASY7-8V#[$=FUW,*-Y\Y(3]V-G +M#[Y8A*.I/C%6?7#1T>P8WA3;DI)P17-$+=+H"T+!0@!4?O)R`Q:(T;1LT1$, +M%?4C,-['4TD.V;J-;F[^FQM+U50-M(@H@"-E0?1G=BI9#).D7(/V#OOQO]E&5GF(!K@\X\!D>_JS"I_V!I#?V$=P2,954Z84DHW/Y##Z+54; +M9ZYM19XX>.9_.Q5G`89"_4E$&3[%7EU,;<->_#FX88,[6N)Y4'4;X7<;__(GLUSYW&>!>S +M*C"`@AL[+"&F'?E[EX_]+)G]I1*W@*_V'ZY`O/R\'/=4#@%_9\4)YJ[B$PRS +M^0?9`C],H'.K6OHDZMUXEP`=BP7L9/)FD-UW"[A=^FYR^:0D?7-7;^I;W,II +M5J9N16#';8K090AS)(H3(!\S?Z*#CFL7GWYM;KP\6BCD\D.!L""4@#8%`O5# +M@P7CLH^_Z4!GZ^,W$]31UOIDFX^L7@[7ZR?OVQ\B;8=)_N./1';M1@HT*?+.V^H<@?XO\=U6*QL*+`Z`_3&^+/+%[ +M4=/J`!I@/(]>@L4239HTFQ]`&0MR4Q']X@^9[-6`6F':O`\?`1>0`?-'5,G. +M:+:11C05Y'>FC[+L3D<(*C8F:@1I1Y(E\`.#7:Q#KPD?(6@G"NIF2(-I1[;^4H0^%,@W.1HIV_BIIJZV_QZ/ES-;`I-\4[K!*I@N&.F +M3=A4P8]KZ2^CL?^QKDIFKSE`F'$T.%K^/HJGZPOXPYK#,0'PW1\Q +MS9AKI+[\T_Q[F_\9SSNQ4C^'G3:QJFFN,GL51J[0R?7E8!H +MSWP,7=#BC&+6"#<[O8[IVJMF?;M%V#2_OS,"^_8^Y2,/K0H)7_613GN15'N8 +M:I&#D=;(YDK;%-[3&:K?\,C^S@,O;]Z)F9C.U-P?E)"WS['0#R<*!OOGBG_* +M-WP9)1:YJ4_>WD3#!QGB3U3?"%;\&.;-X&\"K8U.VJ[&TU,(R!; +M`V._37\*,K=`QF%L_QW3/P1ZJ+["E-?VIFP`QP1=2WXMMT=^\Z:!=S[/7F4^ +MH-K`]06=Q_[2B]+"HRLZ]^VWSS`_A@\/PH)ES:J#:WP8;RW:WL>;H=V[$+^K +M;;\0.?"4%Y:OO[65A-?N?@_@VCWK71_^9QXLP.)YMJ+,;/@.C#/JPKU8&-[< +MP`;ZSX(7!&T7,WB$.L^Q[8NJ-YJ")];VI.0M0^84EC!Y +M`4B-M>N6Y(KLU0F[U^85KO5ZY/=J:YWM-F8ASRHM"UTKNNG_J+@G=8YM^:_M@Z@9V2=VIAGP3^$F>PMK]7\!-2*TO4NF +M4(/C(\'Y%Y"1>*;"'!FMJ#HL[P+/&6>%J57]P5%3.UX*,>PNVQJT-DU[*0MB +M\W!^\%GS\!^MHJN=62CGUOFL+C[AFI!S7R9_'^!Y8FZ!B]?3WT)NK06O)3^O +M,+)742TD7,,W^?CYUX+X$\B4]V%%:@Y`[>T*VP#KG@*_T83$;B-<@L:PC^_^ +M:5#%H#Z)R-.GI9K_Z8IN+I0%U60YB>I5-E4L;GK@8/&J[2(ST0W7# +MV+O\;>)U3#[/C"K)GU0F'FS">GE9L\O@ZCS1'DLL:AOB6RVQ$_F#V8*]T-<& +M?7\LR&:O/`;B;FJ]QD,K6>_O>6^IG8-:FPD#YR?K=-(.I"O +M-N#<13'R70.DGZ3R&E5>5%`@V-_;`.'^7D[5NE&5TBOX=Z0_%/Q`H)EI?+Y$ +M`*7:MK?RO);\&6Y'2G,C1&\`;;4(`W,[O'5=%AAH!J='/?^8%?JP?PC\_8Q: +M%OGH8A, +M+)?_EKP2(O\W>:6V.G-+7M[,&02M0JY&@_6A?0>]_;=?7G^KYZ:U]],#S)[. +M_7OW/0(WAP;NWW;P-KQ-(GL[#^51I[L;RMH.9!Z]]K5AZXQT0\(#Q0>"?\,CS9`2NY?J4T(6;,A(X^;$X +M$I/Y>;.P*FJ,TBCI;M@V1=7%9S=\*9HJ'\'NM;FZ*EA\H`G$EZ@ESB-*^A6NJX3K\BWRT&!AYI^SS"7B0.^.0'$K!*ZST#(ZJP4>@X0[<\!Y[GI\ZA_M_ +M#OT%Y^?>718J7=@'GEO!DV?QSMDD[%G6\5_5*ESI^?>B"3Q>[P]U +M5'<\Y=AZ*+S1=0^KI)B)ZN-;YW*)64HB7^OT[M_RT`W?AK(@YR6KW?L[][,O +MDZIO_";4NB;2^M+80YO^&O]E/-Z4#3"9'?(.:36IZ.`=> +M7P,\(]B<+N1\4^L55#)D.JT^&D=N_?#[AX)J,WPT^'RX:\WE_,]+5&>CBF^9 +MLXW8&Z]GO:R2,G3<&J<9@=($2MCHQA +M/>D?@0:J=\[EOA.>%-T59K?=QTPS>GJT&[`@OS;W^;_7C#-/?9"]NG=Z6>U0 +MD^F,>;F8)&I`EM\-UYRSX@##A2SA]@_M,W8_RZF;LQM/LPO1^MJCIFAMAUG+ +M0L6TX+U"M;Z3H.?,9[E*`T"(X]H'GM]R'N2C)91]/%<2!16/6-\O+PU<@Z[2 +MQ4S6FWT1-WW&AS+RY+KD7T`(_WV3$X+X16:*$2(G816'PUA6F/=N&_P"-3,J5"MW%6:I=]X]0I;ZBA:A/M +MWAAIW=W1MN'&$)8SC&"VP[@/?^6>%)F@+CJ"H;9NT)]&*&8;L)TI]SO`#B]B +MU$4D%)=U+#$U."C8L!?N>RE7"I4IL=&5\.*;9/0?M]671% +M/,9<+&)F;'VV@43E10P*FCC)$>.-RD!NJ>YS']HZ[.+N=KO.]"/24S38[3-% +MD%Q`Z8V18/#;R2CI`>'U#/(S(G39A(2L)[GQ8BU)P*D5.:.&GG\8^$"IO:Y; +M7-#->2NLC7WS?8:K7,G=R3U:/2NC0KD(<9QT+"60TF.I^_*N%<'(>A7A![V6 +M/F1SYC<@1H)3K->%Q^&^=!2ZXM#W2L(RV(.[$]8CN%NC9IN)B35O\K4XX;!? +M(/V_AOXR)WZE6-HD#O[E9NGE%8I;CA>6'8:N#=#?5Y7!VBGPG!(!O3#\7C;[ +MDAM\/[#-<@:O,5TK)I?K(M+C9H\>,ZQ!E*JKBV,Y#*07C(! +MZ9=,L:;:V#$*N3I/K(Q?!2QS@'ERR51_1?TVXZDVQHB.:YB0P::.DVXPD'+) +M/"Z_S5SFFSS&&#O(@;+*R`;YU"IHTI*]2LQ0@6J2H\&8D8#@>\F$\FZ2)\IJ +M$">3%J47&?)#;Z83"H3D((3"ETQK:/4A`Y.,G)#/JO)9D+\J@)R7D3.R+(^J +M\OVC((L@%_[M@/*J*K\*\G'C[XA(&_L29'C +M!LC&!\D$09>2#-E@<,RU.A8X)!U)"4S7B[:F%PL6,FAXI7U$%[5TS&#=4!.3 +MT3$#Z;$4CXR\A#&>Y)K/C4'#,U@^1]XJOO8VTM\&4_14&>?T]W%2U+$JIB8] +M=)1\XUHRIEMZ#/5?8A"5E$0?(XCZ!A#?3Q;U,,T)_:TD`S++&&^;1>,^V>6[ +M0@(9.2R?E7/]Y5X#F9=ER44=A3PJ7^^Q!63KWPZ]."F_*N?ZG!N53__?R\9D +M>0SD7?D@%^0.23*N(8'/48=MPJ;C@*W=-B'611\04;3P9)3A3NL,?'T-4@BF +MBL);!-[B*[)7X>:;KM"^61%37,Y+.ZTP0`^?480;\#*XT +MNI<7:D?)=EL#[%*-V&I3;\@NF'#%G4@R_\(!<\TGGO_\Q%/76.E!$DN0)[=."ZAN.YX2 +MP7LL9?/15XOX6!]*O'V9LYX!V^^W2L*T6H(/0SW?R&$YE +MCN3C&03SNB6V#O1!DY,'JTP#,(=C5C4V0>5[G(FA!M7D\B35%`J$\9W+&X+/ +M,5[D@EYS;.\;6"JGPO%/WRV-A]UW:K)/7HXDVJ7ICWL+/BKBD=4"P#51. +M0^"W*H1RE=4$,KK%#.1'A?;D&W3&>%['[:69"SQ<*9OO.$P$W]I9.L,6D*+Q +MZ;D;ATRW$UCRS*'IF,&!P+,31TD^8D@J=2' +MZ$Q$2WOXI^',3I6IN60.\$,\HR(-X;H48M4;DQRX\3"'$HTP7"<4.#EJR@,P +M\@MP7E&<6/\.UO.ZL)&K;]HTBJ8XO^$X13\=%#)&T3B,[]T!AKM-I:9`J*D'V0*/0'PXEQ.E4&&]*:\4C\[ +M$F53$D13>G&[XG-ZH9]Y3($NC<5GF?'BI[5T`&#:ZP2:9T_K`]4?FLOUC +MT2E?;#]JB!>/4F/0CX-T/&47D,Y/F2RT5'$`L;MD?HR:DY#O94#`JO1NM2?+ +MZ6F)W<(OYG97]Y@_Q@,('8XX(.X(L$IW%2E#@@QJ^IMEO.8X;Y,=^GU"!RN\ +M;(NM1"-'ZL8*L(TQ[G*QXX[;V9;E@:Z'I&5@.%C)93_\;.2O$^B,O45WVH/= +M9L=@K@Y:P1FHL;<+4*[:112PAX3*F,S:J3=GA,(:])>'K^!0*0FQ+3V'[;F] +M15.F.@@M4Y^,,[1#38MS) +M%D;R&2IV)3;*>GH,^;'7&9F-_E3&%A"L;)SU6B8Z6H1VSLFS46:B?'1MU13C +MOI?2HV=DYZW?SRN8V$$G_XII=GU^%)-M>&H5JU=;OEUU34W=S&1XMLL^\2C# +M7,,SVQC#`LZ;AWN,/;*;*XG;3EXN!]O3NR_>U'2T*N8[6^P<9>+6=L9GCSW' +M]IG]:,A$Y]GYG7$F&N;G)QF@'B-:Z!&Z#0;YD5BG%C4^;7+D:4MD<',_-8I^ +M&U8.'W^ +M4O,&>[,D[V[F`X[$LB^RY<\2*PHS./6QG50U0TLCX[;[L(B:OF`\88(':`2D +M],D>",_7#U\Z4\+=:S\#8[IG$'64]*SR5V68P*@M,,XYH;RA.'C3X)]PX)8$ +M;GH":N\=&`-;OEH,^LK946IS&G]2PY@'G<$8X'7FB::5H"F8W_HZ4W;_-N5F +M('=NW4EVMX8R%2MLI`*0)PVR>J&R=F?S>@ZNAHA;4$T:SUKD;C.!$V`-+)O@ +M2E2S#T>1I,##]U;6EOXY^WVL,,43*$;M%*>1]$0)(DR]'4G!$F&!1BYR;\JE +M;%J;[U+(6A"KK+YU3,^&1-(%.;LF:SG)MHV3JF$;;LY*B.GGFL!S),EX>Y)O +MP:?9*QU4D'4@:#--P8Y%P +M'T^D9(>#_CP<+'Q`K@S0VR[D,DM_Q?!6-#283JYX2(U_1DKI3W> +MXD-<"0.<[0+[)*#'6B,'59B',*S_4*+2PC.FXWY;BMF6?P0V48XN[:'Q+'AR +M%@PCO5(M<05_E>3")V=E#@&K6@TA"$>3%MECL$'X=7+V_E4&+T/4$,.Q<[9AR4AM%T2_J0R"S2:S(7AM=OF5#N&$&["C9F&3(.F-&3T +MABQD@7/A^*S#Y1Q>F=T(R'9;9Y*MC)/+*A^P_TMGDZ: +M:ESRDYXD1[IWS4HU/:0&>W%#W$N(Q#(D7.HO7U[\43[`21-C@1_@.'C++/D# +M=KY@M@M\+A6-[!+P,<84R3$3RP3_029*K5VO55R.C(NX.FPZ[<5R-9[!%\PG +MW1D"Z]1^6^O6Z@GR%ZS,-IL"G4;8D_!BY*G)E$5E]_!B=\&"W'#FWT#&E#,XG>I.\'$% +M@0&S!81=6%P1>X69E4#B:I*XQE_@W-$([ON`>Q"XNX#K:I8QEMB/!;EP1-FQ +MSKX`$0E:D!R^]15P;\NM4;X-N+^3L1_5L0V6"&['7FB\4#`-[5$YD;P!DU)E +M1\KM?M?B5&;*._X#MR@7L==RYNJ-P'E^`=P6^M]GPDHS0QP;8"5PI;D'N][#3%BH&SJXZ+5MN +M^*5E_BNXL8`.L(K&;.%'-EM\-+![K0L*AL!-N6L'MDG%%:#R:A%RJUG("A\6 +M4$OJ\^=AI"C#A^7IF9)^\'[#`.%>O#K>32C3WC[_O.*4+5(P[M3D`';JV^/+ +M.$):4[A^I9:,R`VV07N?1:C*$HF:\+RM4<%%D2IHGBMW9;\(FV7H17<#RS'6'R%@.);^Y#1@,215T-.0J6Q/.HB$ +M50U78)U)VW%W&H&SX27+7`-TR!:]P3*?GPG/5OB6S2DU@K+^PQU6RV`16OAI +MT6$K/T<$Q2)E'DXA\JL\U3IQ$NJEX+*IXNB3T[B`O@=7!*Z" +M8Z9$&&`QHS=I:6\]TX+W/`>+[J;M:2EOIFRL!XZ73WZ4O8HR5SP@0SN.5B86 +M;<]@Z:0I52]L1Y]JP`I,+Q\OMGH_XH!3;OY>]^AY5'B#N:`/Q'1"% +MZU?>::=RK&\7B&^53[\(8@N(OP&1S_,\0!N_!M$"XDX0QVG#"N)](%X@#=JZ +MI`+B/U_7-W>]!.(OK^_2_3L0E_MV4/5S!XBOY"XO!9L#N;JHHJVF0G\#I2L, +M+B4:0E,"1@O+!D#8^?$]J1MO_E[&@SU%LF<7>'9L`L^-H%"E\@(TM6VFI]5A +M?A_$C?0H!*X<8U<#" +MYAJB.;"+5&I)EY8?."W,@VWPWR.(EH%/$]@X=4`HD"9U +MS]Z6R5T--9B.&W6[N``!L;)]>U'XPR]UX,.X-LL-,B>9CAA/?=2S)0O@Z3%W +M"A:#P/I:\%C;D_@Q8 +M1F7+668R^0!A?*7YKC*?4%[4_(V2(L769VDY*7,VT39X#(UPT-UZ!KO90K&9 +MQJR<;L-(3S!)%D^:#(PB29H$ZE1$#;%(4!'#J51``&(YU<8(*F=#HFHC06,] +MF(R12-;YM+7).AC-,N?KQN%\'M'Y+'\^ITDLNIAB=!#0!`M8I[)(+T&@ZR6, +MI)>PB.@EN9W!3R@F&T`S]E$A;W,BSO>:8<(Z,T03D,RQ-9R?*FXW.(WE/ +M[/1@.@J$#)JJK=L0542IG0)('@;70>-]'U01,\L=O`45H?6+8 +M+MG'*_+&_@4W+Y_GP.Z%=M8+KF]<<0XJ7LNGJE<-TN8(\;K![6%'"C7#=0=! +MM>CD929RVHT-%R)U-1W4(-]:MZ7M`L;M>3I#?D980B5D:PHW8LQ&Y4 +M$"NZR=!C)=0*&I7E.-_17#R;0#Z-F]R<:**T_0XE5PM=70L9E$%?Y.YR/Y,H +MSUY>"%OG+37$8N0"Q7^^47`OH`4+:%@40E^!%KA`A\D7IVZI4I51-@NPM[45 +M8'_G_C8('X#.QS?`GHY];;`_`JUA.+B?V[=W;]L![!U_]YGRXTSV?U,A"L+O +M7@2A`(3W0!!!>/\B"("P2>_S\57:0`&2H,[H/"P7TA(/S>`VWP +MQ*&V_7N>@OWRDU"\_\G.O7L/5K9%("^WIP&L8J@UT@I-4OVN3C@4"1^*[`IW +MPM?:#MQ,]K=]32:9L@.['F\]3#W--A+IS-4OM)`G0O6/,WE28!?D-JWNZMS] +M*+3MB=Q,MG8>*NP([5\#-]"I)BT+$OQU7+OO(-F]#QYYI.T`B;2W6O:3N^J: +M81G<&2G\*]#>(BPTR$+=&=KE18!1$+XTVXXZ4-D@E?<+A+QKVX0%+`M$%B19 +M^*HL"XHL6'N)D)"%+CIW)E'^#"#)KZSYG>4T"&1%"27^V*^LJD/$+VP#GF'O +M>A'^\;__0Z[$KK\149-F;_LYH`8L++LA0'"F71*2-A$CQ9M;[8+2\B[;/+G^ +M3:?(8YUFOV'&^Q#X#UP^`G8M8?< +M0.YMW@Z[[KOSP6UK2:7W%H)+]I+:C7LZX4#;QKT''M^P!Y:PA"4L80E+6,(2 +MEK"$)2QA"4M8PA*6L(0E+&$)2UC"$I:PA"4L80E+6,(2EK"$)2QA"4OX_PG_ +)!QAAG_@`$!@` +` +end --- linux-source-2.6.8.1-2.6.8.1.orig/debian/header-install +++ linux-source-2.6.8.1-2.6.8.1/debian/header-install @@ -0,0 +1,54 @@ +#!/bin/sh + +set -e + +stem=${DEBIAN_STEM:-kernel} +version=${DEBIAN_UPSTREAM_VERSION} +pkg=$stem-headers-$version$debnum + +arch=$DEB_HOST_ARCH +case $arch in +amd64) + arch=x86_64 + ;; +powerpc) + arch=ppc + ;; +esac + +cd "$DEBIAN_SRCTOP" +home="$OLDPWD" +{ + find . \ + -path './Documentation/*' -prune -o \ + -path './debian/*' -prune -o \ + -type f \( \ + -name Makefile -o -name 'Kconfig*' -o \ + -path './scripts/*' ! -name '*.o' \ + \) -print + echo arch/$arch/kernel/asm-offsets.s +} | cpio -pd --preserve-modification-time "$home" +cd "$home" +> scripts/Makefile + +find scripts -type f | xargs touch -t 9511212200 + +remove= +cd include +for i in asm-*; do + case ${i#asm-} in + generic | $arch) + ;; + *) + remove="$remove $i" + ;; + esac +done +${remove:+rm -r $remove} + +cd "$DEBIAN_SRCTOP" +dh_strip --package=$pkg --tmpdir=debian/tmp-headers +find "$home/scripts" -type f | xargs touch -t 9511212200 +dh_fixperms --package=$pkg --tmpdir=debian/tmp-headers +dh_shlibdeps --package=$pkg --tmpdir=debian/tmp-headers +mv debian/$pkg.substvars debian/substvars --- linux-source-2.6.8.1-2.6.8.1.orig/debian/list-patches +++ linux-source-2.6.8.1-2.6.8.1/debian/list-patches @@ -0,0 +1,63 @@ +#!/usr/bin/awk -f +# $Id: list-patches,v 1.1 2003/12/21 05:37:17 herbert Exp $ + +function find_chain(ver, forward) { + if (ver == upstream) { + return + } + + if (!(ver in prev)) { + print "Patch for " ver " is not available" > "/dev/stderr" + exit 1 + } + + do { + forward[prev[ver]] = ver + ver = prev[ver] + } while (ver != upstream) +} + +BEGIN { + old = ARGV[1] + delete ARGV[1] + new = ARGV[2] + delete ARGV[2] + + upstream = old + sub(/-[^-]*$/, "", upstream) +} + +/^#/ || NF < 1 { + next +} + +{ + prev[$3] = $2 + file[$2, $3] = $1 +} + +END { + if (new == old) { + exit + } + + find_chain(old, oldforward) + find_chain(new, newforward) + + common = upstream + while (oldforward[common] == newforward[common]) { + common = oldforward[common] + } + + while (common != old) { + print file[prev[old], old] + old = prev[old] + } + + print "/" + + while (common != new) { + print file[common, newforward[common]] + common = newforward[common] + } +} --- linux-source-2.6.8.1-2.6.8.1.orig/debian/make-kernel-patch-pkgs +++ linux-source-2.6.8.1-2.6.8.1/debian/make-kernel-patch-pkgs @@ -0,0 +1,44 @@ +#!/bin/sh +# $Id: make-kernel-patch-pkgs,v 1.1 2003/12/21 05:37:17 herbert Exp $ + +set -e + +stem=${1:-kernel} + +top=$PWD +version=$(cat version.Debian) +upstream=${version%-*} +kp=$stem-patch-debian-$upstream +kt=$stem-tree-$upstream +pkgs="--package=$kp --package=$kt" +kphome=$top/debian/$kp/usr/src/$stem-patches/all/$upstream + +mkdir -p $kphome/apply $kphome/debian $kphome/unpatch + +cd debian/monolith +awk '!/^#/ && NF > 0 {print $1}' list | + xargs cp --target-directory=$kphome/debian +bzip2 -9 $kphome/debian/* +cp list $kphome/debian + +cd .. +install list-patches $kphome/debian + +subst="s/@version@/$version/g; s/@stem@/$stem/g" +sed "$subst" apply > $kphome/apply/debian +sed "$subst" unpatch > $kphome/unpatch/debian + +chmod 755 \ + $kphome/apply/debian \ + $kphome/unpatch/debian + +cd .. +dh_installdocs $pkgs +dh_installchangelogs --package=$kp +dh_installchangelogs --package=$kt debian/ChangeLog-$upstream +dh_compress $pkgs +dh_fixperms $pkgs +dh_installdeb $pkgs +dh_gencontrol $pkgs -- -Tdebian/substvars +dh_md5sums $pkgs +dh_builddeb $pkgs --- linux-source-2.6.8.1-2.6.8.1.orig/debian/make-substvars +++ linux-source-2.6.8.1-2.6.8.1/debian/make-substvars @@ -0,0 +1,45 @@ +#!/usr/bin/awk -f +# $Id: make-substvars,v 1.1 2003/12/21 05:37:17 herbert Exp $ + +BEGIN { + stem = ARGV[1] + delete ARGV[1] + version_file = ARGV[2] + delete ARGV[2] + getline < version_file + version = $0 + upstream = version + sub(/-[^-]*$/, "", upstream) +} + +/^#/ || NF < 1 { + next +} + +NF != 3 { + print "Line " NR ": incorrect number of fields" > "/dev/stderr" + exit 1 +} + +$2 != upstream && !($2 in prev) { + print "Line " NR ": patch " $1 " is not well-founded" > "/dev/stderr" + exit 1 +} + +{ + prev[$3] = $2 +} + +END { + if (!(version in prev)) { + print "Patch for " version " must be listed" > "/dev/stderr" + exit 1 + } + + for (v in prev) { + dep = dep " | " stem "-source-" upstream " (= " v ")" + prov = prov ", " stem "-tree-" v + } + print "kt-depends=" substr(dep, 4) + print "kt-provides=" substr(prov, 3) +} --- linux-source-2.6.8.1-2.6.8.1.orig/debian/official +++ linux-source-2.6.8.1-2.6.8.1/debian/official @@ -0,0 +1 @@ +This is the Debian version of Linux 2.6.8. --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-16.28 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-16.28 @@ -0,0 +1,192 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +adm8211 +acpi-20040826 +ndiswrapper +aic79xx-nodev +sk98lin-update +ip6t-log-doff +eagle-usb +ieee80211-2 +ipw2200-2 +disable-lapic-in-acpi-power-off +therm_adt746x-schedule +usb-storage-vendor-count +ieee80211-3 +ipw2100-2 +ipw2200-3 +3w-xxxx-hotplug +via-velocity-2 +ieee80211-4 +ipw2200-4 +acpi-early-init-check-disable +acx100-fw +sata-nv-no-reset +powermac73 +acpi-psparse-aml-crash +vmio +execve +exec-aout +unix-sem +drm-lock +proc-cmdline +unix-seq +cmsg-ok +x86-64-sys-2 +tty-locking +igmp +vma-overlap +vt-of-death +fix-ip-options-leak +fix-ip-conntrack-ftp +dummy-cap +moxa +coda +scsi-ioctl +do-brk-locked-2 +random-poolsize +nfs-o_direct +smbfs-overflow-fixes-2 +mlock-expand-stack-2 +cmsg-compat +ipc-shm-lock +nls-ascii-overflow +setsid-tty-sem +ip-defrag-user +vfs-f-maxcount +n-tty-signed +proc-file-read-signed +reiserfs-file-clean64 +atm-copy-to-user +ppp-async-lcp-loop +ip-reset-frag-summed +ip-frag-dst-leak +drm-radeon-race +vfs-f-maxcount-fixup +epoll-overflow +ext2-dir-zero +isofs-range-check +shmem-nopage-isize +mouse-ldisc-root +binfmt-elf-load-library-kfree +net-bluetooth-proto +futex-mm-deadlock +sysfs-write-file +jbd-jh-in-use-race +jbd-journal-unmap-buffer-race +CAN-2005-1041_fib_seq_start-dos +CAN-2005-1263-elf_core_dump-privilege-escalation +CAN-2005-1369-incorrect_sysfs_perms +rawdev-root-hole +disable-ht +mmap-check +x86-64-ptrace +x86-64-ptrace-2 +x86-64-ptrace-3 +x86-64-page-fault +xfrm-dir-overflow +ipsec-sock-policy +zlib-update +vlan-ioctl-dev +sg-procfs-leak +sendmsg-stack-overflow +xattr-block-sharing +ipt-recent-dos +x86-64-exstack-backtrace +x86-64-tiocgdev-fput +compat-routing-ioctl-leak +mm-set-mempolicy-mode +stolen-from-head_CAN-2005-3106 +stolen-from-head_CAN-2005-3107 +stolen-from-head_CAN-2005-3108 +stolen-from-head_CAN-2005-3109 +stolen-from-head_CAN-2005-3110 +audit-syscall_mem-leak-CAN-2005-3181 +drivers-usb-devio_CVE-2005-3055 +drivers-net-wireless-orinoco_CVE-2005-3180 +fs-exec_CVE-2005-3271 +net-bridge_CVE-2005-3272 +net-rose-roseroute_CVE-2005-3273 +net-ipv4-ipvs-ip_vs_conn_CVE-2005-3274 +net-ipv6-udp_CVE-2005-2973 +net-ipv4-netfilter-ip-nat_CVE-2005-3275 +arch-i386-kernel-process_CVE-2005-3276 +kernel-sysctl_CVE-2005-2709 +drivers-char-vtioctl_CVE-2005-3257 +kernel-ptrace_CVE-2005-3783 +kernel-signal_CVE-2005-3784 +net-ipv6-ip6flowlabel_CVE-2005-3806 +net-ipv4-icmp_CVE-2005-3848 +fs-locks_CVE-2005-3857 +net-ipv6-ip6input_CVE-2005-3858 +CVE-2005-4605 +CVE-2005-4618 +CVE-2005-3356 +CVE-2006-0095 +CVE-2006-0096 +CVE-direct-io +CVE-sigaction +CVE-2006-0554 +CVE-2006-0555 +CVE-2006-0741 +CVE-2006-0742 --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-16.27 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-16.27 @@ -0,0 +1,186 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +adm8211 +acpi-20040826 +ndiswrapper +aic79xx-nodev +sk98lin-update +ip6t-log-doff +eagle-usb +ieee80211-2 +ipw2200-2 +disable-lapic-in-acpi-power-off +therm_adt746x-schedule +usb-storage-vendor-count +ieee80211-3 +ipw2100-2 +ipw2200-3 +3w-xxxx-hotplug +via-velocity-2 +ieee80211-4 +ipw2200-4 +acpi-early-init-check-disable +acx100-fw +sata-nv-no-reset +powermac73 +acpi-psparse-aml-crash +vmio +execve +exec-aout +unix-sem +drm-lock +proc-cmdline +unix-seq +cmsg-ok +x86-64-sys-2 +tty-locking +igmp +vma-overlap +vt-of-death +fix-ip-options-leak +fix-ip-conntrack-ftp +dummy-cap +moxa +coda +scsi-ioctl +do-brk-locked-2 +random-poolsize +nfs-o_direct +smbfs-overflow-fixes-2 +mlock-expand-stack-2 +cmsg-compat +ipc-shm-lock +nls-ascii-overflow +setsid-tty-sem +ip-defrag-user +vfs-f-maxcount +n-tty-signed +proc-file-read-signed +reiserfs-file-clean64 +atm-copy-to-user +ppp-async-lcp-loop +ip-reset-frag-summed +ip-frag-dst-leak +drm-radeon-race +vfs-f-maxcount-fixup +epoll-overflow +ext2-dir-zero +isofs-range-check +shmem-nopage-isize +mouse-ldisc-root +binfmt-elf-load-library-kfree +net-bluetooth-proto +futex-mm-deadlock +sysfs-write-file +jbd-jh-in-use-race +jbd-journal-unmap-buffer-race +CAN-2005-1041_fib_seq_start-dos +CAN-2005-1263-elf_core_dump-privilege-escalation +CAN-2005-1369-incorrect_sysfs_perms +rawdev-root-hole +disable-ht +mmap-check +x86-64-ptrace +x86-64-ptrace-2 +x86-64-ptrace-3 +x86-64-page-fault +xfrm-dir-overflow +ipsec-sock-policy +zlib-update +vlan-ioctl-dev +sg-procfs-leak +sendmsg-stack-overflow +xattr-block-sharing +ipt-recent-dos +x86-64-exstack-backtrace +x86-64-tiocgdev-fput +compat-routing-ioctl-leak +mm-set-mempolicy-mode +stolen-from-head_CAN-2005-3106 +stolen-from-head_CAN-2005-3107 +stolen-from-head_CAN-2005-3108 +stolen-from-head_CAN-2005-3109 +stolen-from-head_CAN-2005-3110 +audit-syscall_mem-leak-CAN-2005-3181 +drivers-usb-devio_CVE-2005-3055 +drivers-net-wireless-orinoco_CVE-2005-3180 +fs-exec_CVE-2005-3271 +net-bridge_CVE-2005-3272 +net-rose-roseroute_CVE-2005-3273 +net-ipv4-ipvs-ip_vs_conn_CVE-2005-3274 +net-ipv6-udp_CVE-2005-2973 +net-ipv4-netfilter-ip-nat_CVE-2005-3275 +arch-i386-kernel-process_CVE-2005-3276 +kernel-sysctl_CVE-2005-2709 +drivers-char-vtioctl_CVE-2005-3257 +kernel-ptrace_CVE-2005-3783 +kernel-signal_CVE-2005-3784 +net-ipv6-ip6flowlabel_CVE-2005-3806 +net-ipv4-icmp_CVE-2005-3848 +fs-locks_CVE-2005-3857 +net-ipv6-ip6input_CVE-2005-3858 +CVE-2005-4605 +CVE-2005-4618 +CVE-2005-3356 +CVE-2006-0095 +CVE-2006-0096 --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/CVE-direct-io.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/CVE-direct-io.dpatch @@ -0,0 +1,43 @@ +#! /bin/sh -e +# DP: CVE-2006-XXXX + +. $(dirname $0)/DPATCH +@DPATCH@ + +[PATCH] direct IO write memory leak fix + +It seems that O_DIRECT write sometimes leaks memory. + +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds + +diff -Naru a/fs/direct-io.c b/fs/direct-io.c +--- a/fs/direct-io.c 2006-03-09 08:28:51 -08:00 ++++ b/fs/direct-io.c 2006-03-09 08:28:51 -08:00 +@@ -844,8 +844,10 @@ + char *kaddr; + + /* AKPM: eargh, -ENOTBLK is a hack */ +- if (dio->rw == WRITE) ++ if (dio->rw == WRITE) { ++ page_cache_release(page); + return -ENOTBLK; ++ } + + if (dio->block_in_file >= + i_size_read(dio->inode)>>blkbits) { +# This is a BitKeeper generated diff -Nru style patch. +# +# ChangeSet +# 2004/10/29 13:20:35-07:00 iwamoto@valinux.co.jp +# [PATCH] direct IO write memory leak fix +# +# It seems that O_DIRECT write sometimes leaks memory. +# +# Signed-off-by: Andrew Morton +# Signed-off-by: Linus Torvalds +# +# fs/direct-io.c +# 2004/10/29 01:13:37-07:00 iwamoto@valinux.co.jp +3 -1 +# direct IO write memory leak fix +# --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-16.26 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-16.26 @@ -0,0 +1,181 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +adm8211 +acpi-20040826 +ndiswrapper +aic79xx-nodev +sk98lin-update +ip6t-log-doff +eagle-usb +ieee80211-2 +ipw2200-2 +disable-lapic-in-acpi-power-off +therm_adt746x-schedule +usb-storage-vendor-count +ieee80211-3 +ipw2100-2 +ipw2200-3 +3w-xxxx-hotplug +via-velocity-2 +ieee80211-4 +ipw2200-4 +acpi-early-init-check-disable +acx100-fw +sata-nv-no-reset +powermac73 +acpi-psparse-aml-crash +vmio +execve +exec-aout +unix-sem +drm-lock +proc-cmdline +unix-seq +cmsg-ok +x86-64-sys-2 +tty-locking +igmp +vma-overlap +vt-of-death +fix-ip-options-leak +fix-ip-conntrack-ftp +dummy-cap +moxa +coda +scsi-ioctl +do-brk-locked-2 +random-poolsize +nfs-o_direct +smbfs-overflow-fixes-2 +mlock-expand-stack-2 +cmsg-compat +ipc-shm-lock +nls-ascii-overflow +setsid-tty-sem +ip-defrag-user +vfs-f-maxcount +n-tty-signed +proc-file-read-signed +reiserfs-file-clean64 +atm-copy-to-user +ppp-async-lcp-loop +ip-reset-frag-summed +ip-frag-dst-leak +drm-radeon-race +vfs-f-maxcount-fixup +epoll-overflow +ext2-dir-zero +isofs-range-check +shmem-nopage-isize +mouse-ldisc-root +binfmt-elf-load-library-kfree +net-bluetooth-proto +futex-mm-deadlock +sysfs-write-file +jbd-jh-in-use-race +jbd-journal-unmap-buffer-race +CAN-2005-1041_fib_seq_start-dos +CAN-2005-1263-elf_core_dump-privilege-escalation +CAN-2005-1369-incorrect_sysfs_perms +rawdev-root-hole +disable-ht +mmap-check +x86-64-ptrace +x86-64-ptrace-2 +x86-64-ptrace-3 +x86-64-page-fault +xfrm-dir-overflow +ipsec-sock-policy +zlib-update +vlan-ioctl-dev +sg-procfs-leak +sendmsg-stack-overflow +xattr-block-sharing +ipt-recent-dos +x86-64-exstack-backtrace +x86-64-tiocgdev-fput +compat-routing-ioctl-leak +mm-set-mempolicy-mode +stolen-from-head_CAN-2005-3106 +stolen-from-head_CAN-2005-3107 +stolen-from-head_CAN-2005-3108 +stolen-from-head_CAN-2005-3109 +stolen-from-head_CAN-2005-3110 +audit-syscall_mem-leak-CAN-2005-3181 +drivers-usb-devio_CVE-2005-3055 +drivers-net-wireless-orinoco_CVE-2005-3180 +fs-exec_CVE-2005-3271 +net-bridge_CVE-2005-3272 +net-rose-roseroute_CVE-2005-3273 +net-ipv4-ipvs-ip_vs_conn_CVE-2005-3274 +net-ipv6-udp_CVE-2005-2973 +net-ipv4-netfilter-ip-nat_CVE-2005-3275 +arch-i386-kernel-process_CVE-2005-3276 +kernel-sysctl_CVE-2005-2709 +drivers-char-vtioctl_CVE-2005-3257 +kernel-ptrace_CVE-2005-3783 +kernel-signal_CVE-2005-3784 +net-ipv6-ip6flowlabel_CVE-2005-3806 +net-ipv4-icmp_CVE-2005-3848 +fs-locks_CVE-2005-3857 +net-ipv6-ip6input_CVE-2005-3858 --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/CVE-sigaction.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/CVE-sigaction.dpatch @@ -0,0 +1,78 @@ +#! /bin/sh -e +# DP: CVE-sigaction + +. $(dirname $0)/DPATCH +@DPATCH@ + +Oleg Nesterov discovered a race condition in the signal handling. On +multiprocessor (SMP) machines, a local attacker could exploit this to +create many unkillable processes, which could eventually lead to a +Denial of Service. + +--- a/kernel/signal.c.orig 2004-08-24 03:16:58.000000000 -0400 ++++ a/kernel/signal.c 2006-03-09 11:44:42.000000000 -0500 +@@ -2285,7 +2285,7 @@ + } + + int +-do_sigaction(int sig, const struct k_sigaction *act, struct k_sigaction *oact) ++do_sigaction(int sig, struct k_sigaction *act, struct k_sigaction *oact) + { + struct k_sigaction *k; + +@@ -2308,6 +2308,8 @@ + *oact = *k; + + if (act) { ++ sigdelsetmask(&act->sa.sa_mask, ++ sigmask(SIGKILL) | sigmask(SIGSTOP)); + /* + * POSIX 3.3.1.3: + * "Setting a signal action to SIG_IGN for a signal that is +@@ -2333,8 +2335,6 @@ + read_lock(&tasklist_lock); + spin_lock_irq(&t->sighand->siglock); + *k = *act; +- sigdelsetmask(&k->sa.sa_mask, +- sigmask(SIGKILL) | sigmask(SIGSTOP)); + rm_from_queue(sigmask(sig), &t->signal->shared_pending); + do { + rm_from_queue(sigmask(sig), &t->pending); +@@ -2347,8 +2347,6 @@ + } + + *k = *act; +- sigdelsetmask(&k->sa.sa_mask, +- sigmask(SIGKILL) | sigmask(SIGSTOP)); + } + + spin_unlock_irq(¤t->sighand->siglock); +@@ -2554,6 +2552,7 @@ + + new_sa.sa.sa_handler = handler; + new_sa.sa.sa_flags = SA_ONESHOT | SA_NOMASK; ++ sigemptyset(&new_sa.sa.sa_mask); + + ret = do_sigaction(sig, &new_sa, &old_sa); + +--- a/arch/ia64/ia32/ia32_signal.c.orig 2004-08-24 03:15:22.000000000 -0400 ++++ a/arch/ia64/ia32/ia32_signal.c 2006-03-09 11:42:51.000000000 -0500 +@@ -505,6 +505,7 @@ + + sigact_set_handler(&new_sa, handler, 0); + new_sa.sa.sa_flags = SA_ONESHOT | SA_NOMASK; ++ sigemptyset(&new_sa.sa.sa_mask); + + ret = do_sigaction(sig, &new_sa, &old_sa); + +--- a/include/linux/sched.h.orig 2004-08-29 03:16:50.000000000 -0400 ++++ a/include/linux/sched.h 2006-03-09 11:42:51.000000000 -0500 +@@ -807,7 +807,7 @@ + extern void sigqueue_free(struct sigqueue *); + extern int send_sigqueue(int, struct sigqueue *, struct task_struct *); + extern int send_group_sigqueue(int, struct sigqueue *, struct task_struct *); +-extern int do_sigaction(int, const struct k_sigaction *, struct k_sigaction *); ++extern int do_sigaction(int, struct k_sigaction *, struct k_sigaction *); + extern int do_sigaltstack(const stack_t __user *, stack_t __user *, unsigned long); + + /* These can be the second arg to send_sig_info/send_group_sig_info. */ --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/CVE-2005-4605.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/CVE-2005-4605.dpatch @@ -0,0 +1,80 @@ +#! /bin/sh -e +# DP: CVE-2005-4605: procfs information disclosure +. $(dirname $0)/DPATCH +@DPATCH@ + +Insanity avoidance in /proc + +The old /proc interfaces were never updated to use loff_t, and are just +generally broken. Now, we should be using the seq_file interface for +all of the proc files, but converting the legacy functions is more work +than most people care for and has little upside.. + +But at least we can make the non-LFS rules explicit, rather than just +insanely wrapping the offset or something. + +Signed-off-by: Linus Torvalds + +--- a/fs/proc/generic.c ++++ b/fs/proc/generic.c +@@ -54,6 +54,18 @@ proc_file_read(struct file *file, char _ + ssize_t n, count; + char *start; + struct proc_dir_entry * dp; ++ unsigned long long pos; ++ ++ /* ++ * Gaah, please just use "seq_file" instead. The legacy /proc ++ * interfaces cut loff_t down to off_t for reads, and ignore ++ * the offset entirely for writes.. ++ */ ++ pos = *ppos; ++ if (pos > MAX_NON_LFS) ++ return 0; ++ if (nbytes > MAX_NON_LFS - pos) ++ nbytes = MAX_NON_LFS - pos; + + dp = PDE(inode); + if (!(page = (char*) __get_free_page(GFP_KERNEL))) +@@ -202,30 +214,17 @@ proc_file_write(struct file *file, const + static loff_t + proc_file_lseek(struct file *file, loff_t offset, int orig) + { +- lock_kernel(); +- +- switch (orig) { +- case 0: +- if (offset < 0) +- goto out; +- file->f_pos = offset; +- unlock_kernel(); +- return(file->f_pos); +- case 1: +- if (offset + file->f_pos < 0) +- goto out; +- file->f_pos += offset; +- unlock_kernel(); +- return(file->f_pos); +- case 2: +- goto out; +- default: +- goto out; +- } +- +-out: +- unlock_kernel(); +- return -EINVAL; ++ loff_t retval = -EINVAL; ++ switch (orig) { ++ case 1: ++ offset += file->f_pos; ++ /* fallthrough */ ++ case 0: ++ if (offset < 0 || offset > MAX_NON_LFS) ++ break; ++ file->f_pos = retval = offset; ++ } ++ return retval; + } + + static int proc_notify_change(struct dentry *dentry, struct iattr *iattr) --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/CVE-2006-0554.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/CVE-2006-0554.dpatch @@ -0,0 +1,32 @@ +#! /bin/sh -e +# DP: CVE-2006-0554 + +. $(dirname $0)/DPATCH +@DPATCH@ + + +diff-tree 8dcd7c19f2624b7150edd60da336da0bb5291bef (from 6cbb463db05210e83ddc18cbd92e295f1fefa111) +Author: Mike O'Connor +Date: Wed Feb 15 00:17:24 2006 -0500 + + [PATCH] XFS ftruncate() bug could expose stale data (CVE-2006-0554) + + This is CVE-2006-0554 and SGI bug 942658. With certain types of + ftruncate() activity on 2.6 kernels, XFS can end up exposing stale + data off disk to a user, putting extents where holes should be. + + Signed-off-by: Chris Wright + +diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c +index 94d3cdf..c4ac008 100644 +--- a/fs/xfs/linux-2.6/xfs_aops.c ++++ b/fs/xfs/linux-2.6/xfs_aops.c +@@ -385,7 +385,7 @@ xfs_probe_unmapped_cluster( + + /* First sum forwards in this page */ + do { +- if (buffer_mapped(bh)) ++ if (buffer_mapped(bh) || !buffer_uptodate(bh)) + break; + total += bh->b_size; + } while ((bh = bh->b_this_page) != head); --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-16.24 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-16.24 @@ -0,0 +1,164 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +adm8211 +acpi-20040826 +ndiswrapper +aic79xx-nodev +sk98lin-update +ip6t-log-doff +eagle-usb +ieee80211-2 +ipw2200-2 +disable-lapic-in-acpi-power-off +therm_adt746x-schedule +usb-storage-vendor-count +ieee80211-3 +ipw2100-2 +ipw2200-3 +3w-xxxx-hotplug +via-velocity-2 +ieee80211-4 +ipw2200-4 +acpi-early-init-check-disable +acx100-fw +sata-nv-no-reset +powermac73 +acpi-psparse-aml-crash +vmio +execve +exec-aout +unix-sem +drm-lock +proc-cmdline +unix-seq +cmsg-ok +x86-64-sys-2 +tty-locking +igmp +vma-overlap +vt-of-death +fix-ip-options-leak +fix-ip-conntrack-ftp +dummy-cap +moxa +coda +scsi-ioctl +do-brk-locked-2 +random-poolsize +nfs-o_direct +smbfs-overflow-fixes-2 +mlock-expand-stack-2 +cmsg-compat +ipc-shm-lock +nls-ascii-overflow +setsid-tty-sem +ip-defrag-user +vfs-f-maxcount +n-tty-signed +proc-file-read-signed +reiserfs-file-clean64 +atm-copy-to-user +ppp-async-lcp-loop +ip-reset-frag-summed +ip-frag-dst-leak +drm-radeon-race +vfs-f-maxcount-fixup +epoll-overflow +ext2-dir-zero +isofs-range-check +shmem-nopage-isize +mouse-ldisc-root +binfmt-elf-load-library-kfree +net-bluetooth-proto +futex-mm-deadlock +sysfs-write-file +jbd-jh-in-use-race +jbd-journal-unmap-buffer-race +CAN-2005-1041_fib_seq_start-dos +CAN-2005-1263-elf_core_dump-privilege-escalation +CAN-2005-1369-incorrect_sysfs_perms +rawdev-root-hole +disable-ht +mmap-check +x86-64-ptrace +x86-64-ptrace-2 +x86-64-ptrace-3 +x86-64-page-fault +xfrm-dir-overflow +ipsec-sock-policy +zlib-update +vlan-ioctl-dev +sg-procfs-leak +sendmsg-stack-overflow +xattr-block-sharing +ipt-recent-dos +x86-64-exstack-backtrace +x86-64-tiocgdev-fput +compat-routing-ioctl-leak +mm-set-mempolicy-mode +stolen-from-head_CAN-2005-3106 +stolen-from-head_CAN-2005-3107 +stolen-from-head_CAN-2005-3108 +stolen-from-head_CAN-2005-3109 +stolen-from-head_CAN-2005-3110 +audit-syscall_mem-leak-CAN-2005-3181 --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/CVE-2006-0555.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/CVE-2006-0555.dpatch @@ -0,0 +1,34 @@ +#! /bin/sh -e +# DP: CVE-2006-0555 + +. $(dirname $0)/DPATCH +@DPATCH@ + + +diff-tree 93e3d00a9f0158e522cada1088233fad23247882 (from 8dcd7c19f2624b7150edd60da336da0bb5291bef) +Author: Trond Myklebust +Date: Wed Feb 15 00:42:26 2006 -0500 + + [PATCH] Normal user can panic NFS client with direct I/O (CVE-2006-0555) + + This is CVE-2006-0555 and SGI bug 946529. A normal user can panic an + NFS client and cause a local DoS with 'judicious'(?) use of O_DIRECT. + + Signed-off-by: Chris Wright + +diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c +index 0792288..3ebb06e 100644 +--- a/fs/nfs/direct.c ++++ b/fs/nfs/direct.c +@@ -106,6 +106,11 @@ nfs_get_user_pages(int rw, unsigned long + result = get_user_pages(current, current->mm, user_addr, + page_count, (rw == READ), 0, + *pages, NULL); ++ if (result >= 0 && result < page_count) { ++ nfs_free_user_pages(*pages, result, 0); ++ *pages = NULL; ++ result = -EFAULT; ++ } + up_read(¤t->mm->mmap_sem); + } + return result; --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/CVE-2005-4618.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/CVE-2005-4618.dpatch @@ -0,0 +1,33 @@ +#! /bin/sh -e +# DP: CVE-2005-4618: sysctl: don't overflow the user-supplied buffer with '\0' +. $(dirname $0)/DPATCH +@DPATCH@ + +sysctl: don't overflow the user-supplied buffer with '\0' + +If the string was too long to fit in the user-supplied buffer, +the sysctl layer would zero-terminate it by writing past the +end of the buffer. Don't do that. + +Noticed by Yi Yang + +Signed-off-by: Linus Torvalds + +--- a/kernel/sysctl.c ++++ b/kernel/sysctl.c +@@ -2201,14 +2201,12 @@ int sysctl_string(ctl_table *table, int + if (get_user(len, oldlenp)) + return -EFAULT; + if (len) { +- l = strlen(table->data); ++ l = strlen(table->data)+1; + if (len > l) len = l; + if (len >= table->maxlen) + len = table->maxlen; + if(copy_to_user(oldval, table->data, len)) + return -EFAULT; +- if(put_user(0, ((char __user *) oldval) + len)) +- return -EFAULT; + if(put_user(len, oldlenp)) + return -EFAULT; + } --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/CVE-2006-0741.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/CVE-2006-0741.dpatch @@ -0,0 +1,33 @@ +#! /bin/sh -e +# DP: CVE-2006-0741 + +. $(dirname $0)/DPATCH +@DPATCH@ + +diff-tree 5a62d3406ddd87a26d706d0b3019f4a1872713da (from 94069fb3035f4e9de4ce33f5910be0dded06677c) +Author: Suresh Siddha +Date: Sun Feb 26 04:34:00 2006 +0100 + + [PATCH] x86_64: Check for bad elf entry address (CVE-2006-0741) + + Fixes a local DOS on Intel systems that lead to an endless + recursive fault. AMD machines don't seem to be affected. + + Signed-off-by: Suresh Siddha + Signed-off-by: Andi Kleen + Signed-off-by: Chris Wright + +--- a/fs/binfmt_elf.c.orig 2004-08-24 03:17:07.000000000 -0400 ++++ a/fs/binfmt_elf.c 2006-03-09 12:25:21.000000000 -0500 +@@ -849,6 +849,11 @@ + kfree(elf_interpreter); + } else { + elf_entry = elf_ex.e_entry; ++ if (BAD_ADDR(elf_entry)) { ++ send_sig(SIGSEGV, current, 0); ++ retval = -ENOEXEC; /* Nobody gets to see this, but.. */ ++ goto out_free_dentry; ++ } + } + + kfree(elf_phdata); --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-1 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-1 @@ -0,0 +1,55 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +x86-i486_emu +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ipw2100 +ipw2200 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +acpi-osname +acpi-early +acpi-speedstep-fix +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/CVE-2006-0742.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/CVE-2006-0742.dpatch @@ -0,0 +1,33 @@ +#! /bin/sh -e +# DP: CVE-2006-0742 + +. $(dirname $0)/DPATCH +@DPATCH@ + +diff-tree e963701a761aede31c9c1bfc74cf8e0ec671f0f4 (from eb0911e27e8c6778d6c8ec95b7dd60c002d923c3) +Author: Tony Luck +Date: Mon Feb 27 16:18:58 2006 -0800 + + [IA64] die_if_kernel() can return + + arch/ia64/kernel/unaligned.c erroneously marked die_if_kernel() + with a "noreturn" attribute ... which is silly (it returns whenever + the argument regs say that the fault happened in user mode, as one + might expect given the "if_kernel" part of its name!). Thanks to + Alan and Gareth for pointing this out. + + Signed-off-by: Tony Luck + +diff --git a/arch/ia64/kernel/unaligned.c b/arch/ia64/kernel/unaligned.c +index f9e0ae9..1129138 100644 +--- a/arch/ia64/kernel/unaligned.c ++++ b/arch/ia64/kernel/unaligned.c +@@ -24,7 +24,7 @@ + #include + #include + +-extern void die_if_kernel(char *str, struct pt_regs *regs, long err) __attribute__ ((noreturn)); ++extern void die_if_kernel(char *str, struct pt_regs *regs, long err); + + #undef DEBUG_UNALIGNED_TRAP + --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/CVE-2005-3356.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/CVE-2005-3356.dpatch @@ -0,0 +1,142 @@ +#! /bin/sh -e +# DP: CVE-2005-3356 +. $(dirname $0)/DPATCH +@DPATCH@ + +diff-tree 7c7dce9209161eb260cdf9e9172f72c3a02379e6 (from 12dbf3fc4d06d2c0c4c44dc0612df04248b3cfd3) +Author: Alexander Viro +Date: Sat Jan 14 15:29:55 2006 -0500 + + [PATCH] Fix double decrement of mqueue_mnt->mnt_count in sys_mq_open + + Fixed the refcounting on failure exits in sys_mq_open() and + cleaned the logics up. Rules are actually pretty simple - dentry_open() + expects vfsmount and dentry to be pinned down and it either transfers + them into created struct file or drops them. Old code had been very + confused in that area - if dentry_open() had failed either in do_open() + or do_create(), we ended up dentry and mqueue_mnt dropped twice, once + by dentry_open() cleanup and then by sys_mq_open(). + + Fix consists of making the rules for do_create() and do_open() + same as for dentry_open() and updating the sys_mq_open() accordingly; + that actually leads to more straightforward code and less work on + normal path. + + Signed-off-by: Al Viro + Signed-off-by: Linus Torvalds + +diff --git a/ipc/mqueue.c b/ipc/mqueue.c +index 4e776f9..59302fc 100644 +--- a/ipc/mqueue.c ++++ b/ipc/mqueue.c +@@ -599,15 +599,16 @@ static int mq_attr_ok(struct mq_attr *at + static struct file *do_create(struct dentry *dir, struct dentry *dentry, + int oflag, mode_t mode, struct mq_attr __user *u_attr) + { +- struct file *filp; + struct mq_attr attr; + int ret; + +- if (u_attr != NULL) { ++ if (u_attr) { ++ ret = -EFAULT; + if (copy_from_user(&attr, u_attr, sizeof(attr))) +- return ERR_PTR(-EFAULT); ++ goto out; ++ ret = -EINVAL; + if (!mq_attr_ok(&attr)) +- return ERR_PTR(-EINVAL); ++ goto out; + /* store for use during create */ + dentry->d_fsdata = &attr; + } +@@ -616,13 +617,14 @@ static struct file *do_create(struct den + ret = vfs_create(dir->d_inode, dentry, mode, NULL); + dentry->d_fsdata = NULL; + if (ret) +- return ERR_PTR(ret); ++ goto out; + +- filp = dentry_open(dentry, mqueue_mnt, oflag); +- if (!IS_ERR(filp)) +- dget(dentry); ++ return dentry_open(dentry, mqueue_mnt, oflag); + +- return filp; ++out: ++ dput(dentry); ++ mntput(mqueue_mnt); ++ return ERR_PTR(ret); + } + + /* Opens existing queue */ +@@ -630,20 +632,20 @@ static struct file *do_open(struct dentr + { + static int oflag2acc[O_ACCMODE] = { MAY_READ, MAY_WRITE, + MAY_READ | MAY_WRITE }; +- struct file *filp; + +- if ((oflag & O_ACCMODE) == (O_RDWR | O_WRONLY)) ++ if ((oflag & O_ACCMODE) == (O_RDWR | O_WRONLY)) { ++ dput(dentry); ++ mntput(mqueue_mnt); + return ERR_PTR(-EINVAL); ++ } + +- if (permission(dentry->d_inode, oflag2acc[oflag & O_ACCMODE], NULL)) ++ if (permission(dentry->d_inode, oflag2acc[oflag & O_ACCMODE], NULL)) { ++ dput(dentry); ++ mntput(mqueue_mnt); + return ERR_PTR(-EACCES); ++ } + +- filp = dentry_open(dentry, mqueue_mnt, oflag); +- +- if (!IS_ERR(filp)) +- dget(dentry); +- +- return filp; ++ return dentry_open(dentry, mqueue_mnt, oflag); + } + + asmlinkage long sys_mq_open(const char __user *u_name, int oflag, mode_t mode, +@@ -671,17 +673,20 @@ asmlinkage long sys_mq_open(const char _ + + if (oflag & O_CREAT) { + if (dentry->d_inode) { /* entry already exists */ +- filp = (oflag & O_EXCL) ? ERR_PTR(-EEXIST) : +- do_open(dentry, oflag); ++ error = -EEXIST; ++ if (oflag & O_EXCL) ++ goto out; ++ filp = do_open(dentry, oflag); + } else { + filp = do_create(mqueue_mnt->mnt_root, dentry, + oflag, mode, u_attr); + } +- } else +- filp = (dentry->d_inode) ? do_open(dentry, oflag) : +- ERR_PTR(-ENOENT); +- +- dput(dentry); ++ } else { ++ error = -ENOENT; ++ if (!dentry->d_inode) ++ goto out; ++ filp = do_open(dentry, oflag); ++ } + + if (IS_ERR(filp)) { + error = PTR_ERR(filp); +@@ -692,8 +697,10 @@ asmlinkage long sys_mq_open(const char _ + fd_install(fd, filp); + goto out_upsem; + +-out_putfd: ++out: ++ dput(dentry); + mntput(mqueue_mnt); ++out_putfd: + put_unused_fd(fd); + out_err: + fd = error; --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-16.29 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-16.29 @@ -0,0 +1,200 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +adm8211 +acpi-20040826 +ndiswrapper +aic79xx-nodev +sk98lin-update +ip6t-log-doff +eagle-usb +ieee80211-2 +ipw2200-2 +disable-lapic-in-acpi-power-off +therm_adt746x-schedule +usb-storage-vendor-count +ieee80211-3 +ipw2100-2 +ipw2200-3 +3w-xxxx-hotplug +via-velocity-2 +ieee80211-4 +ipw2200-4 +acpi-early-init-check-disable +acx100-fw +sata-nv-no-reset +powermac73 +acpi-psparse-aml-crash +vmio +execve +exec-aout +unix-sem +drm-lock +proc-cmdline +unix-seq +cmsg-ok +x86-64-sys-2 +tty-locking +igmp +vma-overlap +vt-of-death +fix-ip-options-leak +fix-ip-conntrack-ftp +dummy-cap +moxa +coda +scsi-ioctl +do-brk-locked-2 +random-poolsize +nfs-o_direct +smbfs-overflow-fixes-2 +mlock-expand-stack-2 +cmsg-compat +ipc-shm-lock +nls-ascii-overflow +setsid-tty-sem +ip-defrag-user +vfs-f-maxcount +n-tty-signed +proc-file-read-signed +reiserfs-file-clean64 +atm-copy-to-user +ppp-async-lcp-loop +ip-reset-frag-summed +ip-frag-dst-leak +drm-radeon-race +vfs-f-maxcount-fixup +epoll-overflow +ext2-dir-zero +isofs-range-check +shmem-nopage-isize +mouse-ldisc-root +binfmt-elf-load-library-kfree +net-bluetooth-proto +futex-mm-deadlock +sysfs-write-file +jbd-jh-in-use-race +jbd-journal-unmap-buffer-race +CAN-2005-1041_fib_seq_start-dos +CAN-2005-1263-elf_core_dump-privilege-escalation +CAN-2005-1369-incorrect_sysfs_perms +rawdev-root-hole +disable-ht +mmap-check +x86-64-ptrace +x86-64-ptrace-2 +x86-64-ptrace-3 +x86-64-page-fault +xfrm-dir-overflow +ipsec-sock-policy +zlib-update +vlan-ioctl-dev +sg-procfs-leak +sendmsg-stack-overflow +xattr-block-sharing +ipt-recent-dos +x86-64-exstack-backtrace +x86-64-tiocgdev-fput +compat-routing-ioctl-leak +mm-set-mempolicy-mode +stolen-from-head_CAN-2005-3106 +stolen-from-head_CAN-2005-3107 +stolen-from-head_CAN-2005-3108 +stolen-from-head_CAN-2005-3109 +stolen-from-head_CAN-2005-3110 +audit-syscall_mem-leak-CAN-2005-3181 +drivers-usb-devio_CVE-2005-3055 +drivers-net-wireless-orinoco_CVE-2005-3180 +fs-exec_CVE-2005-3271 +net-bridge_CVE-2005-3272 +net-rose-roseroute_CVE-2005-3273 +net-ipv4-ipvs-ip_vs_conn_CVE-2005-3274 +net-ipv6-udp_CVE-2005-2973 +net-ipv4-netfilter-ip-nat_CVE-2005-3275 +arch-i386-kernel-process_CVE-2005-3276 +kernel-sysctl_CVE-2005-2709 +drivers-char-vtioctl_CVE-2005-3257 +kernel-ptrace_CVE-2005-3783 +kernel-signal_CVE-2005-3784 +net-ipv6-ip6flowlabel_CVE-2005-3806 +net-ipv4-icmp_CVE-2005-3848 +fs-locks_CVE-2005-3857 +net-ipv6-ip6input_CVE-2005-3858 +CVE-2005-4605 +CVE-2005-4618 +CVE-2005-3356 +CVE-2006-0095 +CVE-2006-0096 +CVE-direct-io +CVE-sigaction +CVE-2006-0554 +CVE-2006-0555 +CVE-2006-0741 +CVE-2006-0742 +CVE-2006-0038 +CVE-2006-0557 +CVE-2006-1052 +CVE-2006-1242 +CVE-2006-1343 +CVE-2006-1066 +CVE-2006-1368 +CVE-2006-1525 --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-16.25 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-16.25 @@ -0,0 +1,174 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +adm8211 +acpi-20040826 +ndiswrapper +aic79xx-nodev +sk98lin-update +ip6t-log-doff +eagle-usb +ieee80211-2 +ipw2200-2 +disable-lapic-in-acpi-power-off +therm_adt746x-schedule +usb-storage-vendor-count +ieee80211-3 +ipw2100-2 +ipw2200-3 +3w-xxxx-hotplug +via-velocity-2 +ieee80211-4 +ipw2200-4 +acpi-early-init-check-disable +acx100-fw +sata-nv-no-reset +powermac73 +acpi-psparse-aml-crash +vmio +execve +exec-aout +unix-sem +drm-lock +proc-cmdline +unix-seq +cmsg-ok +x86-64-sys-2 +tty-locking +igmp +vma-overlap +vt-of-death +fix-ip-options-leak +fix-ip-conntrack-ftp +dummy-cap +moxa +coda +scsi-ioctl +do-brk-locked-2 +random-poolsize +nfs-o_direct +smbfs-overflow-fixes-2 +mlock-expand-stack-2 +cmsg-compat +ipc-shm-lock +nls-ascii-overflow +setsid-tty-sem +ip-defrag-user +vfs-f-maxcount +n-tty-signed +proc-file-read-signed +reiserfs-file-clean64 +atm-copy-to-user +ppp-async-lcp-loop +ip-reset-frag-summed +ip-frag-dst-leak +drm-radeon-race +vfs-f-maxcount-fixup +epoll-overflow +ext2-dir-zero +isofs-range-check +shmem-nopage-isize +mouse-ldisc-root +binfmt-elf-load-library-kfree +net-bluetooth-proto +futex-mm-deadlock +sysfs-write-file +jbd-jh-in-use-race +jbd-journal-unmap-buffer-race +CAN-2005-1041_fib_seq_start-dos +CAN-2005-1263-elf_core_dump-privilege-escalation +CAN-2005-1369-incorrect_sysfs_perms +rawdev-root-hole +disable-ht +mmap-check +x86-64-ptrace +x86-64-ptrace-2 +x86-64-ptrace-3 +x86-64-page-fault +xfrm-dir-overflow +ipsec-sock-policy +zlib-update +vlan-ioctl-dev +sg-procfs-leak +sendmsg-stack-overflow +xattr-block-sharing +ipt-recent-dos +x86-64-exstack-backtrace +x86-64-tiocgdev-fput +compat-routing-ioctl-leak +mm-set-mempolicy-mode +stolen-from-head_CAN-2005-3106 +stolen-from-head_CAN-2005-3107 +stolen-from-head_CAN-2005-3108 +stolen-from-head_CAN-2005-3109 +stolen-from-head_CAN-2005-3110 +audit-syscall_mem-leak-CAN-2005-3181 +drivers-usb-devio_CVE-2005-3055 +drivers-net-wireless-orinoco_CVE-2005-3180 +fs-exec_CVE-2005-3271 +net-bridge_CVE-2005-3272 +net-rose-roseroute_CVE-2005-3273 +net-ipv4-ipvs-ip_vs_conn_CVE-2005-3274 +net-ipv6-udp_CVE-2005-2973 +net-ipv4-netfilter-ip-nat_CVE-2005-3275 +arch-i386-kernel-process_CVE-2005-3276 +kernel-sysctl_CVE-2005-2709 --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/CVE-2006-0038.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/CVE-2006-0038.dpatch @@ -0,0 +1,92 @@ +#! /bin/sh -e +# DP: CVE-2006-0038: Fix possible overflow in netfilters do_replace() + +. $(dirname $0)/DPATCH +@DPATCH@ + +Author: Kirill Korotaev +Date: Sat Feb 4 02:16:56 2006 -0800 + + [NETFILTER]: Fix possible overflow in netfilters do_replace() + + netfilter's do_replace() can overflow on addition within SMP_ALIGN() + and/or on multiplication by NR_CPUS, resulting in a buffer overflow on + the copy_from_user(). In practice, the overflow on addition is + triggerable on all systems, whereas the multiplication one might require + much physical memory to be present due to the check above. Either is + sufficient to overwrite arbitrary amounts of kernel memory. + + I really hate adding the same check to all 4 versions of do_replace(), + but the code is duplicate... + + Found by Solar Designer during security audit of OpenVZ.org + + Signed-Off-By: Kirill Korotaev + Signed-Off-By: Solar Designer + Signed-off-by: Patrck McHardy + Signed-off-by: David S. Miller + +--- a/net/ipv4/netfilter/arp_tables.c.orig 2006-04-27 11:41:54.000000000 -0400 ++++ a/net/ipv4/netfilter/arp_tables.c 2006-04-27 11:42:39.000000000 -0400 +@@ -878,6 +878,13 @@ + if (len != sizeof(tmp) + tmp.size) + return -ENOPROTOOPT; + ++ /* overflow check */ ++ if (tmp.size >= (INT_MAX - sizeof(struct xt_table_info)) / NR_CPUS - ++ SMP_CACHE_BYTES) ++ return -ENOMEM; ++ if (tmp.num_counters >= INT_MAX / sizeof(struct xt_counters)) ++ return -ENOMEM; ++ + /* Pedantry: prevent them from hitting BUG() in vmalloc.c --RR */ + if ((SMP_ALIGN(tmp.size) >> PAGE_SHIFT) + 2 > num_physpages) + return -ENOMEM; +--- a/net/ipv4/netfilter/ip_tables.c.orig 2006-04-27 11:42:55.000000000 -0400 ++++ a/net/ipv4/netfilter/ip_tables.c 2006-04-27 11:43:26.000000000 -0400 +@@ -1059,6 +1059,13 @@ + if (len != sizeof(tmp) + tmp.size) + return -ENOPROTOOPT; + ++ /* overflow check */ ++ if (tmp.size >= (INT_MAX - sizeof(struct xt_table_info)) / NR_CPUS - ++ SMP_CACHE_BYTES) ++ return -ENOMEM; ++ if (tmp.num_counters >= INT_MAX / sizeof(struct xt_counters)) ++ return -ENOMEM; ++ + /* Pedantry: prevent them from hitting BUG() in vmalloc.c --RR */ + if ((SMP_ALIGN(tmp.size) >> PAGE_SHIFT) + 2 > num_physpages) + return -ENOMEM; +--- a/net/bridge/netfilter/ebtables.c.orig 2006-04-27 11:41:11.000000000 -0400 ++++ a/net/bridge/netfilter/ebtables.c 2006-04-27 11:41:41.000000000 -0400 +@@ -924,6 +924,13 @@ + BUGPRINT("Entries_size never zero\n"); + return -EINVAL; + } ++ /* overflow check */ ++ if (tmp.nentries >= ((INT_MAX - sizeof(struct ebt_table_info)) / NR_CPUS - ++ SMP_CACHE_BYTES) / sizeof(struct ebt_counter)) ++ return -ENOMEM; ++ if (tmp.num_counters >= INT_MAX / sizeof(struct ebt_counter)) ++ return -ENOMEM; ++ + countersize = COUNTER_OFFSET(tmp.nentries) * NR_CPUS; + newinfo = (struct ebt_table_info *) + vmalloc(sizeof(struct ebt_table_info) + countersize); +--- a/net/ipv6/netfilter/ip6_tables.c.orig 2006-04-27 11:43:37.000000000 -0400 ++++ a/net/ipv6/netfilter/ip6_tables.c 2006-04-27 11:44:15.000000000 -0400 +@@ -1146,6 +1146,13 @@ + if ((SMP_ALIGN(tmp.size) >> PAGE_SHIFT) + 2 > num_physpages) + return -ENOMEM; + ++ /* overflow check */ ++ if (tmp.size >= (INT_MAX - sizeof(struct xt_table_info)) / NR_CPUS - ++ SMP_CACHE_BYTES) ++ return -ENOMEM; ++ if (tmp.num_counters >= INT_MAX / sizeof(struct xt_counters)) ++ return -ENOMEM; ++ + newinfo = vmalloc(sizeof(struct ip6t_table_info) + + SMP_ALIGN(tmp.size) * NR_CPUS); + if (!newinfo) --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/CVE-2006-0095.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/CVE-2006-0095.dpatch @@ -0,0 +1,43 @@ +#! /bin/sh -e +# DP: CVE-2006-0095 +. $(dirname $0)/DPATCH +@DPATCH@ + +diff-tree 9d3520a339d62f942085e9888f66905eb8b350bd (from 0b56306e56784d0513e1193d58c05a6bd97bd1a9) +Author: Stefan Rompf +Date: Fri Jan 6 00:20:08 2006 -0800 + + [PATCH] dm-crypt: zero key before freeing it + + Zap the memory before freeing it so we don't leave crypto information + around in memory. + + Signed-off-by: Stefan Rompf + Acked-by: Clemens Fruhwirth + Acked-by: Alasdair G Kergon + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + +diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c +index cf66310..a601a42 100644 +--- a/drivers/md/dm-crypt.c ++++ b/drivers/md/dm-crypt.c +@@ -690,6 +690,8 @@ bad3: + bad2: + crypto_free_tfm(tfm); + bad1: ++ /* Must zero key material before freeing */ ++ memset(cc, 0, sizeof(*cc) + cc->key_size * sizeof(u8)); + kfree(cc); + return -EINVAL; + } +@@ -706,6 +708,9 @@ static void crypt_dtr(struct dm_target * + cc->iv_gen_ops->dtr(cc); + crypto_free_tfm(cc->tfm); + dm_put_device(ti, cc->dev); ++ ++ /* Must zero key material before freeing */ ++ memset(cc, 0, sizeof(*cc) + cc->key_size * sizeof(u8)); + kfree(cc); + } + --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/CVE-2006-0557.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/CVE-2006-0557.dpatch @@ -0,0 +1,31 @@ +#! /bin/sh -e +# DP: CVE-2006-0557: sys_mbind sanity checking + +. $(dirname $0)/DPATCH +@DPATCH@ + +diff-tree 636f13c174dd7c84a437d3c3e8fa66f03f7fda63 (from 74910e6c7dc7471b286a883c1a7af70483ffd2ba) +Author: Chris Wright +Date: Fri Feb 17 13:59:36 2006 -0800 + + [PATCH] sys_mbind sanity checking + + Make sure maxnodes is safe size before calculating nlongs in + get_nodes(). + + Signed-off-by: Chris Wright + Signed-off-by: Linus Torvalds + +diff --git a/mm/mempolicy.c b/mm/mempolicy.c +index 323fdcf..bedfa4f 100644 +--- a/mm/mempolicy.c ++++ b/mm/mempolicy.c +@@ -808,6 +808,8 @@ static int get_nodes(nodemask_t *nodes, + nodes_clear(*nodes); + if (maxnode == 0 || !nmask) + return 0; ++ if (maxnode > PAGE_SIZE) ++ return -EINVAL; + + nlongs = BITS_TO_LONGS(maxnode); + if ((maxnode % BITS_PER_LONG) == 0) --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-16.30 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-16.30 @@ -0,0 +1,199 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +adm8211 +acpi-20040826 +ndiswrapper +aic79xx-nodev +sk98lin-update +ip6t-log-doff +eagle-usb +ieee80211-2 +ipw2200-2 +disable-lapic-in-acpi-power-off +therm_adt746x-schedule +usb-storage-vendor-count +ieee80211-3 +ipw2100-2 +ipw2200-3 +3w-xxxx-hotplug +via-velocity-2 +ieee80211-4 +ipw2200-4 +acpi-early-init-check-disable +acx100-fw +sata-nv-no-reset +powermac73 +acpi-psparse-aml-crash +vmio +execve +exec-aout +unix-sem +drm-lock +proc-cmdline +unix-seq +cmsg-ok +x86-64-sys-2 +tty-locking +igmp +vma-overlap +vt-of-death +fix-ip-options-leak +fix-ip-conntrack-ftp +dummy-cap +moxa +coda +scsi-ioctl +do-brk-locked-2 +random-poolsize +nfs-o_direct +smbfs-overflow-fixes-2 +mlock-expand-stack-2 +cmsg-compat +ipc-shm-lock +nls-ascii-overflow +setsid-tty-sem +ip-defrag-user +vfs-f-maxcount +n-tty-signed +proc-file-read-signed +reiserfs-file-clean64 +atm-copy-to-user +ppp-async-lcp-loop +ip-reset-frag-summed +ip-frag-dst-leak +drm-radeon-race +vfs-f-maxcount-fixup +epoll-overflow +ext2-dir-zero +isofs-range-check +shmem-nopage-isize +mouse-ldisc-root +binfmt-elf-load-library-kfree +net-bluetooth-proto +futex-mm-deadlock +sysfs-write-file +jbd-jh-in-use-race +jbd-journal-unmap-buffer-race +CAN-2005-1041_fib_seq_start-dos +CAN-2005-1263-elf_core_dump-privilege-escalation +CAN-2005-1369-incorrect_sysfs_perms +rawdev-root-hole +disable-ht +mmap-check +x86-64-ptrace +x86-64-ptrace-2 +x86-64-ptrace-3 +x86-64-page-fault +xfrm-dir-overflow +ipsec-sock-policy +zlib-update +vlan-ioctl-dev +sg-procfs-leak +sendmsg-stack-overflow +xattr-block-sharing +ipt-recent-dos +x86-64-exstack-backtrace +x86-64-tiocgdev-fput +compat-routing-ioctl-leak +mm-set-mempolicy-mode +stolen-from-head_CAN-2005-3106 +stolen-from-head_CAN-2005-3107 +stolen-from-head_CAN-2005-3108 +stolen-from-head_CAN-2005-3109 +stolen-from-head_CAN-2005-3110 +audit-syscall_mem-leak-CAN-2005-3181 +drivers-usb-devio_CVE-2005-3055 +drivers-net-wireless-orinoco_CVE-2005-3180 +fs-exec_CVE-2005-3271 +net-bridge_CVE-2005-3272 +net-rose-roseroute_CVE-2005-3273 +net-ipv4-ipvs-ip_vs_conn_CVE-2005-3274 +net-ipv6-udp_CVE-2005-2973 +net-ipv4-netfilter-ip-nat_CVE-2005-3275 +arch-i386-kernel-process_CVE-2005-3276 +kernel-sysctl_CVE-2005-2709 +drivers-char-vtioctl_CVE-2005-3257 +kernel-ptrace_CVE-2005-3783 +kernel-signal_CVE-2005-3784 +net-ipv6-ip6flowlabel_CVE-2005-3806 +net-ipv4-icmp_CVE-2005-3848 +fs-locks_CVE-2005-3857 +net-ipv6-ip6input_CVE-2005-3858 +CVE-2005-4605 +CVE-2005-4618 +CVE-2005-3356 +CVE-2006-0095 +CVE-2006-0096 +CVE-direct-io +CVE-sigaction +CVE-2006-0554 +CVE-2006-0555 +CVE-2006-0741 +CVE-2006-0742 +CVE-2006-0557 +CVE-2006-1052 +CVE-2006-1242 +CVE-2006-1343 +CVE-2006-1066 +CVE-2006-1368 +CVE-2006-1525 --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/kernel-ptrace_CVE-2005-3783.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/kernel-ptrace_CVE-2005-3783.dpatch @@ -0,0 +1,21 @@ +#! /bin/sh -e +## kernel-ptrace_CVE-2005-3783.dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: No description. + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urNad linux-source-2.6.12-2.6.12~/kernel/ptrace.c linux-source-2.6.12-2.6.12/kernel/ptrace.c +--- linux-source-2.6.12-2.6.12~/kernel/ptrace.c 2005-06-17 21:48:29.000000000 +0200 ++++ linux-source-2.6.12-2.6.12/kernel/ptrace.c 2005-12-20 10:51:41.000000000 +0100 +@@ -125,7 +125,7 @@ + retval = -EPERM; + if (task->pid <= 1) + goto bad; +- if (task == current) ++ if (task->tgid == current->tgid) + goto bad; + if (!task->mm) + goto bad; --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/CVE-2006-1052.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/CVE-2006-1052.dpatch @@ -0,0 +1,35 @@ +#! /bin/sh -e +# DP: CVE-2006-1052: selinux: tracer SID fix + +. $(dirname $0)/DPATCH +@DPATCH@ + +diff-tree 341c2d806b71cc3596afeb2d9bd26cd718e75202 (from 4136cabff33d6d73b8daf2f2612670cc0296f844) +Author: Stephen Smalley +Date: Sat Mar 11 03:27:16 2006 -0800 + + [PATCH] selinux: tracer SID fix + + Fix SELinux to not reset the tracer SID when the child is already being + traced, since selinux_ptrace is also called by proc for access checking + outside of the context of a ptrace attach. + + Signed-off-by: Stephen Smalley + Acked-by: James Morris + Acked-by: Chris Wright + Signed-off-by: Andrew Morton + Signed-off-by: Linus Torvalds + +diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c +index b7773bf..b65c201 100644 +--- a/security/selinux/hooks.c ++++ b/security/selinux/hooks.c +@@ -1262,7 +1262,7 @@ static int selinux_ptrace(struct task_st + + rc = task_has_perm(parent, child, PROCESS__PTRACE); + /* Save the SID of the tracing process for later use in apply_creds. */ +- if (!rc) ++ if (!(child->ptrace & PT_PTRACED) && !rc) + csec->ptrace_sid = psec->sid; + return rc; + } --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/CVE-2006-0096.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/CVE-2006-0096.dpatch @@ -0,0 +1,25 @@ +#! /bin/sh -e +# DP: CVE-2006-0096 +. $(dirname $0)/DPATCH +@DPATCH@ + +Author: Alan Cox Sat, 8 Jan 2005 11:59:53 +0000 (03:59 -0800) +Committer: Linus Torvalds Sat, 8 Jan 2005 11:59:53 +0000 (03:59 -0800) + +[PATCH] SDLA firmware upgrade should require CAP_SYS_RAWIO (not just CAP_NET_ADMIN) + +There were a few variants on the list trying to work out what the valid +ranges to verify for write are but they sort of missed the point, if you +can load new firmware you can have fun anyway. + +--- a/drivers/net/wan/sdla.c~ 2006-01-16 10:41:39.000000000 -0500 ++++ b/drivers/net/wan/sdla.c 2006-01-16 10:41:54.000000000 -0500 +@@ -1306,6 +1306,8 @@ + + case SDLA_WRITEMEM: + case SDLA_READMEM: ++ if(!capable(CAP_SYS_RAWIO)) ++ return -EPERM; + return(sdla_xfer(dev, ifr->ifr_data, cmd == SDLA_READMEM)); + + case SDLA_START: --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/CVE-2006-1242.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/CVE-2006-1242.dpatch @@ -0,0 +1,50 @@ +#! /bin/sh -e +# DP: CVE-2006-1242: increment the IP ID field after receiving unsolicited TCP SYN-ACK packets + +. $(dirname $0)/DPATCH +@DPATCH@ + +diff-tree 1a55d57b107c3e06935763905dc0fb235214569d (from 6a534ee35cfd02f60e99d301b9ac446ea11a9cfd) +Author: Alexey Kuznetsov +Date: Wed Mar 22 14:27:59 2006 -0800 + + [TCP]: Do not use inet->id of global tcp_socket when sending RST. + + The problem is in ip_push_pending_frames(), which uses: + + if (!df) { + __ip_select_ident(iph, &rt->u.dst, 0); + } else { + iph->id = htons(inet->id++); + } + + instead of ip_select_ident(). + + Right now I think the code is a nonsense. Most likely, I copied it from + old ip_build_xmit(), where it was really special, we had to decide + whether to generate unique ID when generating the first (well, the last) + fragment. + + In ip_push_pending_frames() it does not make sense, it should use plain + ip_select_ident() instead. + + Signed-off-by: Alexey Kuznetsov + Signed-off-by: David S. Miller + +diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c +index 8ee4d01..f75ff1d 100644 +--- a/net/ipv4/ip_output.c ++++ b/net/ipv4/ip_output.c +@@ -1249,11 +1249,7 @@ int ip_push_pending_frames(struct sock * + iph->tos = inet->tos; + iph->tot_len = htons(skb->len); + iph->frag_off = df; +- if (!df) { +- __ip_select_ident(iph, &rt->u.dst, 0); +- } else { +- iph->id = htons(inet->id++); +- } ++ ip_select_ident(iph, &rt->u.dst, sk); + iph->ttl = ttl; + iph->protocol = sk->sk_protocol; + iph->saddr = rt->rt_src; --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-10 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-10 @@ -0,0 +1,79 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +x86-i486_emu +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +adm8211 +acpi-20040826 +ndiswrapper +aic79xx-nodev +sk98lin-update +ip6t-log-doff +eagle-usb +ieee80211-2 +ipw2200-2 +disable-lapic-in-acpi-power-off +therm_adt746x-schedule +via-velocity +usb-storage-vendor-count +ieee80211-3 +ipw2100-2 +ipw2200-3 --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/CVE-2006-1343.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/CVE-2006-1343.dpatch @@ -0,0 +1,18 @@ +#! /bin/sh -e +# DP: CVE-2006-1343: information leak in SO_ORIGINAL_DST + +. $(dirname $0)/DPATCH +@DPATCH@ + +diff --git a/net/ipv4/netfilter/ip_conntrack_core.c b/net/ipv4/netfilter/ip_conntrack_core.c +index 84c66db..43f6b45 100644 +--- a/net/ipv4/netfilter/ip_conntrack_core.c ++++ b/net/ipv4/netfilter/ip_conntrack_core.c +@@ -1318,6 +1318,7 @@ getorigdst(struct sock *sk, int optval, + .tuple.dst.u.tcp.port; + sin.sin_addr.s_addr = ct->tuplehash[IP_CT_DIR_ORIGINAL] + .tuple.dst.ip; ++ memset(sin.sin_zero, 0, sizeof(sin.sin_zero)); + + DEBUGP("SO_ORIGINAL_DST: %u.%u.%u.%u %u\n", + NIPQUAD(sin.sin_addr.s_addr), ntohs(sin.sin_port)); --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-11 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-11 @@ -0,0 +1,82 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +x86-i486_emu +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +adm8211 +acpi-20040826 +ndiswrapper +aic79xx-nodev +sk98lin-update +ip6t-log-doff +eagle-usb +ieee80211-2 +ipw2200-2 +disable-lapic-in-acpi-power-off +therm_adt746x-schedule +usb-storage-vendor-count +ieee80211-3 +ipw2100-2 +ipw2200-3 +3w-xxxx-hotplug +via-velocity-2 +ieee80211-4 +ipw2200-4 --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/CVE-2006-1066.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/CVE-2006-1066.dpatch @@ -0,0 +1,48 @@ +#! /bin/sh -e +# DP: CVE-2006-1066: x86_64 PTRACE_SINGLESTEP oops + +. $(dirname $0)/DPATCH +@DPATCH@ + +diff --git a/arch/x86_64/kernel/traps.c b/arch/x86_64/kernel/traps.c +index bf337f4..ef7d940 100644 +--- a/arch/x86_64/kernel/traps.c ++++ b/arch/x86_64/kernel/traps.c +@@ -91,6 +91,20 @@ static inline void conditional_sti(struc + local_irq_enable(); + } + ++static inline void preempt_conditional_sti(struct pt_regs *regs) ++{ ++ preempt_disable(); ++ if (regs->eflags & X86_EFLAGS_IF) ++ local_irq_enable(); ++} ++ ++static inline void preempt_conditional_cli(struct pt_regs *regs) ++{ ++ if (regs->eflags & X86_EFLAGS_IF) ++ local_irq_disable(); ++ preempt_enable_no_resched(); ++} ++ + static int kstack_depth_to_print = 10; + + #ifdef CONFIG_KALLSYMS +@@ -644,7 +658,7 @@ asmlinkage void __kprobes do_debug(struc + SIGTRAP) == NOTIFY_STOP) + return; + +- conditional_sti(regs); ++ preempt_conditional_sti(regs); + + /* Mask out spurious debug traps due to lazy DR7 setting */ + if (condition & (DR_TRAP0|DR_TRAP1|DR_TRAP2|DR_TRAP3)) { +@@ -691,5 +705,7 @@ asmlinkage void __kprobes do_debug(struc ++ preempt_conditional_cli(regs); + return regs; + + clear_TF_reenable: + printk("clear_tf_reenable\n"); + set_tsk_thread_flag(tsk, TIF_SINGLESTEP); ++ preempt_conditional_cli(regs); --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-12 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-12 @@ -0,0 +1,83 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +x86-i486_emu +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +adm8211 +acpi-20040826 +ndiswrapper +aic79xx-nodev +sk98lin-update +ip6t-log-doff +eagle-usb +ieee80211-2 +ipw2200-2 +disable-lapic-in-acpi-power-off +therm_adt746x-schedule +usb-storage-vendor-count +ieee80211-3 +ipw2100-2 +ipw2200-3 +3w-xxxx-hotplug +via-velocity-2 +ieee80211-4 +ipw2200-4 +acpi-early-init-check-disable --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/CVE-2006-1368.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/CVE-2006-1368.dpatch @@ -0,0 +1,43 @@ +#! /bin/sh -e +# DP: CVE-2006-1368: Gadget RNDIS fix alloc bug. (buffer overflow) + +. $(dirname $0)/DPATCH +@DPATCH@ + +diff-tree 8763716bfe4d8a16bef28c9947cf9d799b1796a5 (from d5ec33490c67affef93aebf76e1238260c82d377) +Author: Shaun Tancheff +Date: Wed Feb 22 19:47:19 2006 -0800 + + [PATCH] USB: Gadget RNDIS fix alloc bug. (buffer overflow) + + Remote NDIS response to OID_GEN_SUPPORTED_LIST only allocated space + for the data attached to the reply, and not the reply structure + itself. This caused other kmalloc'd memory to be corrupted. + + Signed-off-by: Shaun Tancheff + Signed-off-by: David Brownell + Signed-off-by: Greg Kroah-Hartman + +diff --git a/drivers/usb/gadget/rndis.c b/drivers/usb/gadget/rndis.c +index 9689efe..6d6eaad 100644 +--- a/drivers/usb/gadget/rndis.c ++++ b/drivers/usb/gadget/rndis.c +@@ -853,11 +853,14 @@ static int rndis_query_response (int con + // DEBUG("%s: OID = %08X\n", __FUNCTION__, cpu_to_le32(buf->OID)); + if (!rndis_per_dev_params [configNr].dev) return -ENOTSUPP; + +- /* +- * we need more memory: +- * oid_supported_list is the largest answer ++ /* ++ * we need more memory: ++ * gen_ndis_query_resp expects enough space for ++ * rndis_query_cmplt_type followed by data. ++ * oid_supported_list is the largest data reply + */ +- r = rndis_add_response (configNr, sizeof (oid_supported_list)); ++ r = rndis_add_response (configNr, ++ sizeof (oid_supported_list) + sizeof(rndis_query_cmplt_type)); + + if (!r) return -ENOMEM; + resp = (rndis_query_cmplt_type *) r->buf; --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-16.9 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-16.9 @@ -0,0 +1,110 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +adm8211 +acpi-20040826 +ndiswrapper +aic79xx-nodev +sk98lin-update +ip6t-log-doff +eagle-usb +ieee80211-2 +ipw2200-2 +disable-lapic-in-acpi-power-off +therm_adt746x-schedule +usb-storage-vendor-count +ieee80211-3 +ipw2100-2 +ipw2200-3 +3w-xxxx-hotplug +via-velocity-2 +ieee80211-4 +ipw2200-4 +acpi-early-init-check-disable +acx100-fw +sata-nv-no-reset +powermac73 +acpi-psparse-aml-crash +vmio +execve +exec-aout +unix-sem +drm-lock +proc-cmdline +unix-seq +cmsg-ok +x86-64-sys-2 +tty-locking +igmp +vma-overlap +vt-of-death +fix-ip-options-leak +fix-ip-conntrack-ftp +dummy-cap +moxa +coda +scsi-ioctl +mlock-expand-stack +do-brk-locked-2 +random-poolsize +nfs-o_direct +smbfs-overflow-fixes-2 --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/CVE-2006-1525.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/CVE-2006-1525.dpatch @@ -0,0 +1,37 @@ +#! /bin/sh -e +# DP: CVE-2006-1525: ip_route_input panic fix + +. $(dirname $0)/DPATCH +@DPATCH@ + +diff-tree d2c962b8530b84f4e035df8ade7e35f353a57cbe (from c19f7a9e1ac45b57375d51f033b02deca50f4d3f) +Author: Stephen Hemminger +Date: Mon Apr 17 17:27:11 2006 -0700 + + [IPV4]: ip_route_input panic fix + + This fixes http://bugzilla.kernel.org/show_bug.cgi?id=6388 + The bug is caused by ip_route_input dereferencing skb->nh.protocol of + the dummy skb passed dow from inet_rtm_getroute (Thanks Thomas for seeing + it). It only happens if the route requested is for a multicast IP + address. + + Signed-off-by: Stephen Hemminger + Signed-off-by: David S. Miller + +diff --git a/net/ipv4/route.c b/net/ipv4/route.c +index ff43482..cc9423d 100644 +--- a/net/ipv4/route.c ++++ b/net/ipv4/route.c +@@ -2741,7 +2741,10 @@ int inet_rtm_getroute(struct sk_buff *in + /* Reserve room for dummy headers, this skb can pass + through good chunk of routing engine. + */ +- skb->mac.raw = skb->data; ++ skb->mac.raw = skb->nh.raw = skb->data; ++ ++ /* Bugfix: need to give ip_route_input enough of an IP header to not gag. */ ++ skb->nh.iph->protocol = IPPROTO_ICMP; + skb_reserve(skb, MAX_HEADER + sizeof(struct iphdr)); + + if (rta[RTA_SRC - 1]) --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-13 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-13 @@ -0,0 +1,84 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +x86-i486_emu +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +adm8211 +acpi-20040826 +ndiswrapper +aic79xx-nodev +sk98lin-update +ip6t-log-doff +eagle-usb +ieee80211-2 +ipw2200-2 +disable-lapic-in-acpi-power-off +therm_adt746x-schedule +usb-storage-vendor-count +ieee80211-3 +ipw2100-2 +ipw2200-3 +3w-xxxx-hotplug +via-velocity-2 +ieee80211-4 +ipw2200-4 +acpi-early-init-check-disable +acx100-fw --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-14 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-14 @@ -0,0 +1,86 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +x86-i486_emu +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +adm8211 +acpi-20040826 +ndiswrapper +aic79xx-nodev +sk98lin-update +ip6t-log-doff +eagle-usb +ieee80211-2 +ipw2200-2 +disable-lapic-in-acpi-power-off +therm_adt746x-schedule +usb-storage-vendor-count +ieee80211-3 +ipw2100-2 +ipw2200-3 +3w-xxxx-hotplug +via-velocity-2 +ieee80211-4 +ipw2200-4 +acpi-early-init-check-disable +acx100-fw +sata-nv-no-reset +powermac73 --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-15 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-15 @@ -0,0 +1,87 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +x86-i486_emu +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +adm8211 +acpi-20040826 +ndiswrapper +aic79xx-nodev +sk98lin-update +ip6t-log-doff +eagle-usb +ieee80211-2 +ipw2200-2 +disable-lapic-in-acpi-power-off +therm_adt746x-schedule +usb-storage-vendor-count +ieee80211-3 +ipw2100-2 +ipw2200-3 +3w-xxxx-hotplug +via-velocity-2 +ieee80211-4 +ipw2200-4 +acpi-early-init-check-disable +acx100-fw +sata-nv-no-reset +powermac73 +acpi-psparse-aml-crash --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-16 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-16 @@ -0,0 +1,87 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +x86-i486_emu +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +adm8211 +acpi-20040826 +ndiswrapper +aic79xx-nodev +sk98lin-update +ip6t-log-doff +eagle-usb +ieee80211-2 +ipw2200-2 +disable-lapic-in-acpi-power-off +therm_adt746x-schedule +usb-storage-vendor-count +ieee80211-3 +ipw2100-2 +ipw2200-3 +3w-xxxx-hotplug +via-velocity-2 +ieee80211-4 +ipw2200-4 +acpi-early-init-check-disable +acx100-fw +sata-nv-no-reset +powermac73 +acpi-psparse-aml-crash --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-16.1 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-16.1 @@ -0,0 +1,90 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +adm8211 +acpi-20040826 +ndiswrapper +aic79xx-nodev +sk98lin-update +ip6t-log-doff +eagle-usb +ieee80211-2 +ipw2200-2 +disable-lapic-in-acpi-power-off +therm_adt746x-schedule +usb-storage-vendor-count +ieee80211-3 +ipw2100-2 +ipw2200-3 +3w-xxxx-hotplug +via-velocity-2 +ieee80211-4 +ipw2200-4 +acpi-early-init-check-disable +acx100-fw +sata-nv-no-reset +powermac73 +acpi-psparse-aml-crash +smbfs-check +vmio +execve +exec-aout --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-16.2 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-16.2 @@ -0,0 +1,97 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +adm8211 +acpi-20040826 +ndiswrapper +aic79xx-nodev +sk98lin-update +ip6t-log-doff +eagle-usb +ieee80211-2 +ipw2200-2 +disable-lapic-in-acpi-power-off +therm_adt746x-schedule +usb-storage-vendor-count +ieee80211-3 +ipw2100-2 +ipw2200-3 +3w-xxxx-hotplug +via-velocity-2 +ieee80211-4 +ipw2200-4 +acpi-early-init-check-disable +acx100-fw +sata-nv-no-reset +powermac73 +acpi-psparse-aml-crash +smbfs-check +vmio +execve +exec-aout +unix-sem +drm-lock +proc-cmdline +unix-seq +cmsg-ok +x86-64-sys +tty-locking --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-16.3 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-16.3 @@ -0,0 +1,98 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +adm8211 +acpi-20040826 +ndiswrapper +aic79xx-nodev +sk98lin-update +ip6t-log-doff +eagle-usb +ieee80211-2 +ipw2200-2 +disable-lapic-in-acpi-power-off +therm_adt746x-schedule +usb-storage-vendor-count +ieee80211-3 +ipw2100-2 +ipw2200-3 +3w-xxxx-hotplug +via-velocity-2 +ieee80211-4 +ipw2200-4 +acpi-early-init-check-disable +acx100-fw +sata-nv-no-reset +powermac73 +acpi-psparse-aml-crash +smbfs-check +vmio +execve +exec-aout +unix-sem +drm-lock +proc-cmdline +unix-seq +cmsg-ok +x86-64-sys +tty-locking +igmp --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-16.4 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-16.4 @@ -0,0 +1,99 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +adm8211 +acpi-20040826 +ndiswrapper +aic79xx-nodev +sk98lin-update +ip6t-log-doff +eagle-usb +ieee80211-2 +ipw2200-2 +disable-lapic-in-acpi-power-off +therm_adt746x-schedule +usb-storage-vendor-count +ieee80211-3 +ipw2100-2 +ipw2200-3 +3w-xxxx-hotplug +via-velocity-2 +ieee80211-4 +ipw2200-4 +acpi-early-init-check-disable +acx100-fw +sata-nv-no-reset +powermac73 +acpi-psparse-aml-crash +smbfs-check +vmio +execve +exec-aout +unix-sem +drm-lock +proc-cmdline +unix-seq +cmsg-ok +x86-64-sys +tty-locking +igmp +vma-overlap --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-16.5 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-16.5 @@ -0,0 +1,101 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +adm8211 +acpi-20040826 +ndiswrapper +aic79xx-nodev +sk98lin-update +ip6t-log-doff +eagle-usb +ieee80211-2 +ipw2200-2 +disable-lapic-in-acpi-power-off +therm_adt746x-schedule +usb-storage-vendor-count +ieee80211-3 +ipw2100-2 +ipw2200-3 +3w-xxxx-hotplug +via-velocity-2 +ieee80211-4 +ipw2200-4 +acpi-early-init-check-disable +acx100-fw +sata-nv-no-reset +powermac73 +acpi-psparse-aml-crash +smbfs-check +vmio +execve +exec-aout +unix-sem +drm-lock +proc-cmdline +unix-seq +cmsg-ok +x86-64-sys-2 +tty-locking +igmp +vma-overlap +vt-of-death +fix-ip-options-leak --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-16.6 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-16.6 @@ -0,0 +1,104 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +adm8211 +acpi-20040826 +ndiswrapper +aic79xx-nodev +sk98lin-update +ip6t-log-doff +eagle-usb +ieee80211-2 +ipw2200-2 +disable-lapic-in-acpi-power-off +therm_adt746x-schedule +usb-storage-vendor-count +ieee80211-3 +ipw2100-2 +ipw2200-3 +3w-xxxx-hotplug +via-velocity-2 +ieee80211-4 +ipw2200-4 +acpi-early-init-check-disable +acx100-fw +sata-nv-no-reset +powermac73 +acpi-psparse-aml-crash +smbfs-check +vmio +execve +exec-aout +unix-sem +drm-lock +proc-cmdline +unix-seq +cmsg-ok +x86-64-sys-2 +tty-locking +igmp +vma-overlap +vt-of-death +fix-ip-options-leak +fix-ip-conntrack-ftp +dummy-cap +do-brk-locked --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-2 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-2 @@ -0,0 +1,63 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +x86-i486_emu +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ipw2100 +ipw2200 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +acpi-osname +acpi-early +acpi-speedstep-fix +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw.dpatch +acx100-amd64 --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-3 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-3 @@ -0,0 +1,66 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +x86-i486_emu +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +acpi-osname +acpi-early +acpi-speedstep-fix +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-4 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-4 @@ -0,0 +1,67 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +x86-i486_emu +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +acpi-osname +acpi-early +acpi-speedstep-fix +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +skge-hotplug --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-5 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-5 @@ -0,0 +1,67 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +x86-i486_emu +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +acpi-osname +acpi-early +acpi-speedstep-fix +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +skge-hotplug --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-6 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-6 @@ -0,0 +1,67 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +x86-i486_emu +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +acpi-osname +acpi-early +acpi-speedstep-fix +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +skge-hotplug-2 --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-7 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-7 @@ -0,0 +1,69 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +x86-i486_emu +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +adm8211 +acpi-20040826 +ndiswrapper +aic79xx-nodev +sk98lin-update +ip6t-log-doff --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-8 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-8 @@ -0,0 +1,70 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +x86-i486_emu +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +adm8211 +acpi-20040826 +ndiswrapper +aic79xx-nodev +sk98lin-update +ip6t-log-doff +eagle-usb --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/00list-9 +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/00list-9 @@ -0,0 +1,72 @@ +alpha-epoch-comment +alpha-termbits +doc-post_halloween +drivers-ftape +drivers-ide-dma-blacklist-toshiba +drivers-input-hiddev-HIDIOCGUCODE +drivers-input-psaux-hacks +drivers-net-8139too-locking +drivers-scsi_changer +drivers-scsi-generic_proc_info +extraversion +fs-asfs +include-missing-includes +ipsec-missing_wakeup +modular-ide +modular-ide-pnp +modular-vesafb +remove-references-to-removed-drivers +x86-i486_emu +marvell-mm +marvell-pegasos-2 +powerpc-pegasos +powerpc-g4-l2-flush-errata +ia64-generic-no-smp +ptmx-fix +powerpc-ibm-240-e30 +xfs-ioctl32 +ia64-generic-no-smp-1-to-2 +ia64_cyclone_nosmp +fix-sn_console-for-config_smp +bio-mem-leak +evms-bd-claim +mppe +mlock-as-user +tcp-win-scale +ieee80211 +ieee80211-1 +ipw2100 +ipw2100-1 +ipw2200 +ipw2200-1 +wlan-ng-prism2-usb +qdisc-cache-align +cbq-leak +drivers-macintosh-adb-trackpad +powerpc-g4-errata +SG_IO-safe-commands-2 +drivers-scsi-sym_2-dv-hang +scsi-blacklist +pmac-no-of-stdout +cciss-update +minix-block-accounting-fix +nfsd-subtreecheck-nostale +shm-segment-count-fix +sparc64-update +capi-skb-free +powerpc-serial +powerpc-via82cxxx +misdn +acx100 +acx100-kill-float +ipw2100-legacy-fw +acx100-amd64 +adm8211 +acpi-20040826 +ndiswrapper +aic79xx-nodev +sk98lin-update +ip6t-log-doff +eagle-usb +ieee80211-2 +ipw2200-2 --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/kernel-signal_CVE-2005-3784.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/kernel-signal_CVE-2005-3784.dpatch @@ -0,0 +1,21 @@ +#! /bin/sh -e +## kernel-signal_CVE-2005-3784.dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: No description. + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -Naurd linux-source-2.6.8.1-2.6.8.1.orig/kernel/signal.c linux-source-2.6.8.1-2.6.8.1/kernel/signal.c +--- linux-source-2.6.8.1-2.6.8.1.orig/kernel/signal.c 2004-08-24 09:16:58.000000000 +0200 ++++ linux-source-2.6.8.1-2.6.8.1/kernel/signal.c 2005-12-20 11:07:31.000000000 +0100 +@@ -1475,7 +1475,7 @@ + + psig = tsk->parent->sighand; + spin_lock_irqsave(&psig->siglock, flags); +- if (sig == SIGCHLD && tsk->state != TASK_STOPPED && ++ if (!tsk->ptrace && sig == SIGCHLD && tsk->state != TASK_STOPPED && + (psig->action[SIGCHLD-1].sa.sa_handler == SIG_IGN || + (psig->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDWAIT))) { + /* --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/mm-set-mempolicy-mode.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/mm-set-mempolicy-mode.dpatch @@ -0,0 +1,23 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: sys_set_mempolicy() doesnt check if mode < 0 +## DP: Patch author: Eric Dumazet +## DP: Upstream status: backport + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN x/mm/mempolicy.c y/mm/mempolicy.c +--- x/mm/mempolicy.c 2005-09-08 23:15:11.000000000 +1000 ++++ y/mm/mempolicy.c 2005-10-07 21:08:46.000000000 +1000 +@@ -388,7 +388,7 @@ + struct mempolicy *new; + DECLARE_BITMAP(nodes, MAX_NUMNODES); + +- if (mode > MPOL_MAX) ++ if (mode < 0 || mode > MPOL_MAX) + return -EINVAL; + err = get_nodes(nodes, nmask, maxnode, mode); + if (err) --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/fs-locks_CVE-2005-3857.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/fs-locks_CVE-2005-3857.dpatch @@ -0,0 +1,20 @@ +#! /bin/sh -e +## fs-locks_CVE-2005-3857.dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: No description. + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urNad linux-source-2.6.12-2.6.12~/fs/locks.c linux-source-2.6.12-2.6.12/fs/locks.c +--- linux-source-2.6.12-2.6.12~/fs/locks.c 2005-12-20 16:14:22.000000000 +0100 ++++ linux-source-2.6.12-2.6.12/fs/locks.c 2005-12-20 16:15:34.000000000 +0100 +@@ -1092,7 +1092,6 @@ + before = &fl->fl_next; + continue; + } +- printk(KERN_INFO "lease broken - owner pid = %d\n", fl->fl_pid); + lease_modify(before, fl->fl_type & ~F_INPROGRESS); + if (fl == *before) /* lease_modify may have freed fl */ + before = &fl->fl_next; --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/3w-xxxx-hotplug.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/3w-xxxx-hotplug.dpatch @@ -0,0 +1,29 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Add PCI table for 3w-xxxx. +## DP: Patch author: Herbert Xu +## DP: Upstream status: unknown + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN x/drivers/scsi/3w-xxxx.c y/drivers/scsi/3w-xxxx.c +--- x/drivers/scsi/3w-xxxx.c 2004-08-24 17:19:20.000000000 +1000 ++++ y/drivers/scsi/3w-xxxx.c 2004-10-02 14:15:29.000000000 +1000 +@@ -3482,6 +3482,14 @@ + outl(control_reg_value, control_reg_addr); + } /* End tw_unmask_command_interrupt() */ + ++static struct pci_device_id tw_pci_tbl[] = { ++ { TW_VENDOR_ID, TW_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID, }, ++ { TW_VENDOR_ID, TW_DEVICE_ID2, PCI_ANY_ID, PCI_ANY_ID, }, ++ { 0, } ++}; ++ ++MODULE_DEVICE_TABLE(pci, tw_pci_tbl); ++ + static Scsi_Host_Template driver_template = { + .proc_name = "3w-xxxx", + .proc_info = tw_scsi_proc_info, --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/DPATCH +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/DPATCH @@ -0,0 +1,8 @@ +patch_opts="-f --no-backup-if-mismatch -p1" +if test $# = 1; then + if test "$1" = -patch; then < $0 patch $patch_opts; exit 0; fi + if test "$1" = -unpatch; then < $0 patch $patch_opts -R; exit 0; fi +fi + +echo "please use -patch or -unpatch as the only argument to $0" >&2 +exit 1 --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/drivers-char-vtioctl_CVE-2005-3257.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/drivers-char-vtioctl_CVE-2005-3257.dpatch @@ -0,0 +1,22 @@ +#! /bin/sh -e +## drivers-char-vtioctl_CVE-2005-3257.dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: No description. + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urNad linux-source-2.6.12-2.6.12~/drivers/char/vt_ioctl.c linux-source-2.6.12-2.6.12/drivers/char/vt_ioctl.c +--- linux-source-2.6.12-2.6.12~/drivers/char/vt_ioctl.c 2005-06-17 21:48:29.000000000 +0200 ++++ linux-source-2.6.12-2.6.12/drivers/char/vt_ioctl.c 2005-12-20 10:19:48.000000000 +0100 +@@ -191,6 +191,9 @@ + int i, j, k; + int ret; + ++ if (!capable(CAP_SYS_TTY_CONFIG)) ++ return -EPERM; ++ + kbs = kmalloc(sizeof(*kbs), GFP_KERNEL); + if (!kbs) { + ret = -ENOMEM; --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/stolen-from-head_CAN-2005-3106.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/stolen-from-head_CAN-2005-3106.dpatch @@ -0,0 +1,44 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: +## DP: Patch author: +## DP: Upstream status: backport + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -Narud linux-source-2.6.8.1-2.6.8.1.old/fs/exec.c linux-source-2.6.8.1-2.6.8.1/fs/exec.c +--- linux-source-2.6.8.1-2.6.8.1.old/fs/exec.c 2005-10-09 11:58:52.000000000 +0200 ++++ linux-source-2.6.8.1-2.6.8.1/fs/exec.c 2005-10-09 12:09:43.000000000 +0200 +@@ -544,6 +544,21 @@ + old_mm = current->mm; + mm_release(tsk, old_mm); + ++ if (old_mm) { ++ /* ++ * Make sure that if there is a core dump in progress ++ * for the old mm, we get out and die instead of going ++ * through with the exec. We must hold mmap_sem around ++ * checking core_waiters and changing tsk->mm. The ++ * core-inducing thread will increment core_waiters for ++ * each thread whose ->mm == old_mm. ++ */ ++ down_read(&old_mm->mmap_sem); ++ if (unlikely(old_mm->core_waiters)) { ++ up_read(&old_mm->mmap_sem); ++ return -EINTR; ++ } ++ } + task_lock(tsk); + active_mm = tsk->active_mm; + tsk->mm = mm; +@@ -551,6 +566,7 @@ + activate_mm(active_mm, mm); + task_unlock(tsk); + if (old_mm) { ++ up_read(&old_mm->mmap_sem); + if (active_mm != old_mm) BUG(); + mmput(old_mm); + return 0; --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/net-ipv4-icmp_CVE-2005-3848.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/net-ipv4-icmp_CVE-2005-3848.dpatch @@ -0,0 +1,31 @@ +#! /bin/sh -e +## net-ipv4-icmp_CVE-2005-3848.dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: No description. + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urNad linux-source-2.6.10-2.6.10~/net/ipv4/icmp.c linux-source-2.6.10-2.6.10/net/ipv4/icmp.c +--- linux-source-2.6.10-2.6.10~/net/ipv4/icmp.c 2004-12-24 22:35:28.000000000 +0100 ++++ linux-source-2.6.10-2.6.10/net/ipv4/icmp.c 2005-12-20 13:45:52.000000000 +0100 +@@ -348,12 +348,12 @@ + { + struct sk_buff *skb; + +- ip_append_data(icmp_socket->sk, icmp_glue_bits, icmp_param, +- icmp_param->data_len+icmp_param->head_len, +- icmp_param->head_len, +- ipc, rt, MSG_DONTWAIT); +- +- if ((skb = skb_peek(&icmp_socket->sk->sk_write_queue)) != NULL) { ++ if (ip_append_data(icmp_socket->sk, icmp_glue_bits, icmp_param, ++ icmp_param->data_len+icmp_param->head_len, ++ icmp_param->head_len, ++ ipc, rt, MSG_DONTWAIT) < 0) ++ ip_flush_pending_frames(icmp_socket->sk); ++ else if ((skb = skb_peek(&icmp_socket->sk->sk_write_queue)) != NULL) { + struct icmphdr *icmph = skb->h.icmph; + unsigned int csum = 0; + struct sk_buff *skb1; --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/SG_IO-safe-commands-2.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/SG_IO-safe-commands-2.dpatch @@ -0,0 +1,90 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Update list of safe SCSI commands for SG_IO +## DP: Patch author: Linux Torvalds, Jens Axboe +## DP: Upstream status: backport + +. $(dirname $0)/DPATCH + +@DPATCH@ +--- linux-2.6.8/drivers/block/scsi_ioctl.c 2004-08-25 11:54:11.000000000 +0200 ++++ linux-2.5/drivers/block/scsi_ioctl.c 2004-08-25 00:31:03.000000000 +0200 +@@ -127,12 +127,16 @@ + safe_for_read(MODE_SENSE), + safe_for_read(MODE_SENSE_10), + safe_for_read(START_STOP), ++ safe_for_read(GPCMD_VERIFY_10), ++ safe_for_read(VERIFY_16), ++ safe_for_read(READ_BUFFER), + + /* Audio CD commands */ + safe_for_read(GPCMD_PLAY_CD), + safe_for_read(GPCMD_PLAY_AUDIO_10), + safe_for_read(GPCMD_PLAY_AUDIO_MSF), + safe_for_read(GPCMD_PLAY_AUDIO_TI), ++ safe_for_read(GPCMD_PAUSE_RESUME), + + /* CD/DVD data reading */ + safe_for_read(GPCMD_READ_CD), +@@ -146,6 +150,12 @@ + safe_for_read(GPCMD_READ_TOC_PMA_ATIP), + safe_for_read(GPCMD_REPORT_KEY), + safe_for_read(GPCMD_SCAN), ++ safe_for_read(GPCMD_GET_CONFIGURATION), ++ safe_for_read(GPCMD_READ_FORMAT_CAPACITIES), ++ safe_for_read(GPCMD_GET_EVENT_STATUS_NOTIFICATION), ++ safe_for_read(GPCMD_GET_PERFORMANCE), ++ safe_for_read(GPCMD_SEEK), ++ safe_for_read(GPCMD_STOP_PLAY_SCAN), + + /* Basic writing commands */ + safe_for_write(WRITE_6), +@@ -154,8 +164,25 @@ + safe_for_write(WRITE_12), + safe_for_write(WRITE_VERIFY_12), + safe_for_write(WRITE_16), +- safe_for_write(WRITE_BUFFER), + safe_for_write(WRITE_LONG), ++ safe_for_write(ERASE), ++ safe_for_write(GPCMD_MODE_SELECT_10), ++ safe_for_write(MODE_SELECT), ++ safe_for_write(GPCMD_BLANK), ++ safe_for_write(GPCMD_CLOSE_TRACK), ++ safe_for_write(GPCMD_FLUSH_CACHE), ++ safe_for_write(GPCMD_FORMAT_UNIT), ++ safe_for_write(GPCMD_REPAIR_RZONE_TRACK), ++ safe_for_write(GPCMD_RESERVE_RZONE_TRACK), ++ safe_for_write(GPCMD_SEND_DVD_STRUCTURE), ++ safe_for_write(GPCMD_SEND_EVENT), ++ safe_for_write(GPCMD_SEND_KEY), ++ safe_for_write(GPCMD_SEND_OPC), ++ safe_for_write(GPCMD_SEND_CUE_SHEET), ++ safe_for_write(GPCMD_SET_SPEED), ++ safe_for_write(GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL), ++ safe_for_write(GPCMD_LOAD_UNLOAD), ++ safe_for_write(GPCMD_SET_STREAMING), + }; + unsigned char type = cmd_type[cmd[0]]; + +--- linux-2.6.8/include/linux/cdrom.h 2004-08-26 09:15:56.891296646 +0200 ++++ linux-2.6.8/include/linux/cdrom.h 2004-08-26 09:14:34.434684402 +0200 +@@ -468,6 +468,7 @@ + #define GPCMD_RESERVE_RZONE_TRACK 0x53 + #define GPCMD_SCAN 0xba + #define GPCMD_SEEK 0x2b ++#define GPCMD_SEND_CUE_SHEET 0x5d + #define GPCMD_SEND_DVD_STRUCTURE 0xad + #define GPCMD_SEND_EVENT 0xa2 + #define GPCMD_SEND_KEY 0xa3 +--- linux-2.6.8/include/scsi/scsi.h 2004-08-25 19:55:21.000000000 +0200 ++++ linux-2.6.8/include/scsi/scsi.h 2004-08-26 09:12:24.594594554 +0200 +@@ -111,6 +111,7 @@ + #define WRITE_LONG_2 0xea + #define READ_16 0x88 + #define WRITE_16 0x8a ++#define VERIFY_16 0x8f + #define SERVICE_ACTION_IN 0x9e + /* values for service action in */ + #define SAI_READ_CAPACITY_16 0x10 --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/net-ipv6-ip6input_CVE-2005-3858.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/net-ipv6-ip6input_CVE-2005-3858.dpatch @@ -0,0 +1,30 @@ +#! /bin/sh -e +## net-ipv6-ip6input_CVE-2005-3858.dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: No description. + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urNad linux-source-2.6.10-2.6.10~/net/ipv6/ip6_input.c linux-source-2.6.10-2.6.10/net/ipv6/ip6_input.c +--- linux-source-2.6.10-2.6.10~/net/ipv6/ip6_input.c 2004-12-24 22:35:23.000000000 +0100 ++++ linux-source-2.6.10-2.6.10/net/ipv6/ip6_input.c 2005-12-20 16:34:14.000000000 +0100 +@@ -198,12 +198,13 @@ + if (!raw_sk) { + if (xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) { + IP6_INC_STATS_BH(IPSTATS_MIB_INUNKNOWNPROTOS); +- icmpv6_param_prob(skb, ICMPV6_UNK_NEXTHDR, nhoff); ++ icmpv6_send(skb, ICMPV6_PARAMPROB, ++ ICMPV6_UNK_NEXTHDR, nhoff, ++ skb->dev); + } +- } else { ++ } else + IP6_INC_STATS_BH(IPSTATS_MIB_INDELIVERS); +- kfree_skb(skb); +- } ++ kfree_skb(skb); + } + rcu_read_unlock(); + return 0; --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/fs-exec_CVE-2005-3271.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/fs-exec_CVE-2005-3271.dpatch @@ -0,0 +1,23 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -Naurd linux-source-2.6.8.1-2.6.8.1.ORIG/fs/exec.c linux-source-2.6.8.1-2.6.8.1/fs/exec.c +--- linux-source-2.6.8.1-2.6.8.1.ORIG/fs/exec.c 2005-11-15 14:11:38.000000000 +0100 ++++ linux-source-2.6.8.1-2.6.8.1/fs/exec.c 2005-11-16 09:20:35.000000000 +0100 +@@ -760,8 +760,10 @@ + spin_unlock(&oldsighand->siglock); + write_unlock_irq(&tasklist_lock); + +- if (newsig && atomic_dec_and_test(&oldsig->count)) ++ if (newsig && atomic_dec_and_test(&oldsig->count)) { ++ exit_itimers(oldsig); + kmem_cache_free(signal_cachep, oldsig); ++ } + + if (atomic_dec_and_test(&oldsighand->count)) + kmem_cache_free(sighand_cachep, oldsighand); --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/acpi-20040826.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/acpi-20040826.dpatch @@ -0,0 +1,11658 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: ACPI patch as of 20040826 +## DP: Patch author: Len Brown +## DP: Upstream status: unknown + +. $(dirname $0)/DPATCH + +@DPATCH@ +# This is a BitKeeper generated diff -Nru style patch. +# +# ChangeSet +# 2004/08/26 14:50:55-04:00 len.brown@intel.com +# [ACPI] Export acpi_strict for use in modular drivers. +# This will enable drivers to work around BIOS deficiencies, +# while still allowing the drivers to be more picky with "acpi=strict" +# +# Signed-off-by: Bjorn Helgaas +# +# arch/i386/kernel/acpi/boot.c +# 2004/08/26 14:50:48-04:00 len.brown@intel.com +1 -0 +# export acpi_strict +# +# ChangeSet +# 2004/08/26 00:19:36-04:00 len.brown@intel.com +# [ACPI] fix numa build warnings (Keith Owens) +# +# Signed-off-by: Takayoshi Kochi +# +# drivers/acpi/numa.c +# 2004/07/28 09:07:45-04:00 len.brown@intel.com +10 -2 +# fix numa build warnings +# +# ChangeSet +# 2004/08/24 22:18:39-04:00 len.brown@intel.com +# [ACPI] quiet ACPI NUMA boot messages +# Signed-off-by: Jesse Barnes +# +# drivers/acpi/tables.c +# 2004/08/24 18:12:20-04:00 len.brown@intel.com +2 -2 +# quiet boot messages +# +# drivers/acpi/numa.c +# 2004/08/24 18:16:12-04:00 len.brown@intel.com +0 -4 +# quiet boot messages +# +# ChangeSet +# 2004/08/21 23:12:45-04:00 len.brown@intel.com +# [ACPI] Enable ACPICA workarounds for 'RELAXED_AML' and 'implicit return' +# These workarounds are disabled if "acpi=strict" +# +# include/acpi/acglobal.h +# 2004/08/21 23:12:39-04:00 len.brown@intel.com +1 -1 +# acpi_gbl_enable_interpreter_slack typo fix +# +# drivers/acpi/executer/exfldio.c +# 2004/08/21 23:12:39-04:00 len.brown@intel.com +2 -35 +# acpi_gbl_enable_interpreter_slack typo fix +# delete the previous RELAXED_AML workaround it replaces +# +# drivers/acpi/dispatcher/dsutils.c +# 2004/08/21 23:12:39-04:00 len.brown@intel.com +1 -1 +# acpi_gbl_enable_interpreter_slack typo fix +# +# drivers/acpi/bus.c +# 2004/08/21 23:12:39-04:00 len.brown@intel.com +4 -0 +# if (!acpi_strict) enable_acpi_gbl_interpreter_slack = TRUE +# +# ChangeSet +# 2004/08/20 18:18:05-04:00 len.brown@intel.com +# [ACPI] ACPICA 20040816 update from Bob Moore +# +# Designed and implemented support within the AML interpreter +# for the so-called implicit return. This support returns +# the result of the last ASL operation within a control +# method, in the absence of an explicit Return() operator. +# A few machines depend on this behavior, even though it +# is not explicitly supported by the ASL language. It is +# optional support that can be enabled at runtime via the +# acpi_gbl_enable_interpreter_slack flag. +# +# Removed support for the PCI_Config address space from the +# internal low level hardware interfaces (acpi_hw_low_level_read +# and acpi_hw_low_level_write). This support was not used +# internally, and would not work correctly anyway because +# the PCI bus number and segment number were not supported. +# There are separate interfaces for PCI configuration space +# access because of the unique interface. +# acpica-unix-20040816.patch +# +# AE_CODE_AML_MAX fix from Bjorn Helgaas +# +# include/acpi/acmacros.h +# 2004/08/20 14:05:51-04:00 len.brown@intel.com +0 -18 +# ACPICA 20040816 +# +# include/acpi/acexcep.h +# 2004/08/20 14:05:51-04:00 len.brown@intel.com +1 -1 +# ACPICA 20040816 +# +# include/acpi/acconfig.h +# 2004/08/20 14:05:51-04:00 len.brown@intel.com +1 -1 +# ACPICA 20040816 +# +# drivers/acpi/hardware/hwtimer.c +# 2004/08/20 14:05:55-04:00 len.brown@intel.com +12 -16 +# ACPICA 20040816 +# +# drivers/acpi/hardware/hwregs.c +# 2004/08/20 14:05:55-04:00 len.brown@intel.com +22 -48 +# ACPICA 20040816 +# +# drivers/acpi/hardware/hwgpe.c +# 2004/08/20 14:05:55-04:00 len.brown@intel.com +1 -1 +# ACPICA 20040816 +# +# drivers/acpi/events/evxface.c +# 2004/08/20 14:05:55-04:00 len.brown@intel.com +5 -6 +# ACPICA 20040816 +# +# drivers/acpi/events/evrgnini.c +# 2004/08/20 14:05:55-04:00 len.brown@intel.com +6 -6 +# ACPICA 20040816 +# +# drivers/acpi/events/evregion.c +# 2004/08/20 14:05:55-04:00 len.brown@intel.com +8 -9 +# ACPICA 20040816 +# +# drivers/acpi/events/evmisc.c +# 2004/08/20 14:05:55-04:00 len.brown@intel.com +23 -9 +# ACPICA 20040816 +# +# drivers/acpi/events/evgpe.c +# 2004/08/20 14:05:55-04:00 len.brown@intel.com +5 -1 +# ACPICA 20040816 +# +# drivers/acpi/dispatcher/dsutils.c +# 2004/08/20 14:05:55-04:00 len.brown@intel.com +37 -16 +# ACPICA 20040816 +# +# drivers/acpi/dispatcher/dsmethod.c +# 2004/08/20 14:05:55-04:00 len.brown@intel.com +31 -21 +# ACPICA 20040816 +# +# ChangeSet +# 2004/08/19 02:43:31-04:00 len.brown@intel.com +# [ACPI] fix __initdata bug in acpi_irq_penalty[] +# +# Signed-off-by: Bjorn Helgaas +# +# drivers/acpi/pci_link.c +# 2004/08/18 19:26:48-04:00 len.brown@intel.com +2 -2 +# fix __initdata bug in acpi_irq_penalty[] +# +# ChangeSet +# 2004/08/14 18:42:08-04:00 len.brown@intel.com +# [ACPI] ia64 build fix +# Signed-off-by: Jesse Barnes +# +# include/asm-ia64/acpi.h +# 2004/08/10 12:26:39-04:00 len.brown@intel.com +1 -0 +# ia64 ACPI build fix +# +# ChangeSet +# 2004/08/14 16:26:29-04:00 len.brown@intel.com +# Merge intel.com:/home/lenb/src/linux-acpi-test-2.6.7 +# into intel.com:/home/lenb/src/linux-acpi-test-2.6.8 +# +# init/main.c +# 2004/08/14 16:26:24-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# ChangeSet +# 2004/08/14 16:24:17-04:00 len.brown@intel.com +# fix main.c build warning +# +# init/main.c +# 2004/08/14 16:24:07-04:00 len.brown@intel.com +1 -1 +# fix build warning +# +# ChangeSet +# 2004/08/14 02:32:45-04:00 len.brown@intel.com +# merge +# +# arch/i386/kernel/dmi_scan.c +# 2004/08/14 02:32:39-04:00 len.brown@intel.com +0 -6 +# merge +# +# init/main.c +# 2004/08/14 01:12:08-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# ChangeSet +# 2004/08/14 01:11:05-04:00 len.brown@intel.com +# [ACPI] Enter ACPI mode earlier +# Fixes two common boot failures due to buggy SMM BIOS code +# +# SMP boot crash if SMI_CMD=ACPI written from CPU1 +# http://bugzilla.kernel.org/show_bug.cgi?id=2941 +# +# laptop crash due to LAPIC timer before SMI_CMD=ACPI +# http://bugzilla.kernel.org/show_bug.cgi?id=1269 +# +# init/main.c +# 2004/08/14 01:10:59-04:00 len.brown@intel.com +7 -0 +# acpi_early_init() +# +# drivers/acpi/osl.c +# 2004/08/14 01:10:58-04:00 len.brown@intel.com +10 -0 +# defer acpi_os_initialize() to acpi_os_initialize1() +# +# drivers/acpi/bus.c +# 2004/08/14 01:10:58-04:00 len.brown@intel.com +32 -6 +# add acpi_early_init() +# +# arch/i386/kernel/dmi_scan.c +# 2004/08/14 01:10:58-04:00 len.brown@intel.com +0 -44 +# delete local_apic_kills_bios() +# +# ChangeSet +# 2004/08/13 17:52:32-04:00 len.brown@intel.com +# [ACPI] clean out blacklist entries that do nothing +# +# drivers/acpi/blacklist.c +# 2004/08/13 17:52:26-04:00 len.brown@intel.com +0 -14 +# delete blacklist entries that have no effect +# +# ChangeSet +# 2004/08/11 12:05:47-04:00 len.brown@intel.com +# Merge intel.com:/home/lenb/bk/linux-2.6.8 +# into intel.com:/home/lenb/src/linux-acpi-test-2.6.8 +# +# drivers/acpi/sleep/proc.c +# 2004/08/11 12:05:44-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# ChangeSet +# 2004/08/09 13:03:19-04:00 len.brown@intel.com +# Merge intel.com:/home/lenb/src/linux-acpi-test-2.6.7 +# into intel.com:/home/lenb/src/linux-acpi-test-2.6.8 +# +# drivers/acpi/scan.c +# 2004/08/09 13:03:16-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# ChangeSet +# 2004/08/09 12:43:20-04:00 len.brown@intel.com +# [ACPI] init wakeup devcies only if ACPI enabled (David Shaohua Li) +# +# drivers/acpi/sleep/wakeup.c +# 2004/08/04 04:34:13-04:00 len.brown@intel.com +2 -0 +# init wakeup devices only if ACPI enabled +# +# ChangeSet +# 2004/08/09 12:23:17-04:00 len.brown@intel.com +# [ACPI] acpi_bus_register_driver() now return a count +# consistent with pnp_register_driver() and pci_register_driver() +# +# All existing callers of acpi_bus_register_driver() either ignore the +# return value or check only for negative (error) return values. +# +# Signed-off-by: Bjorn Helgaas +# +# drivers/acpi/scan.c +# 2004/07/29 13:43:17-04:00 len.brown@intel.com +15 -11 +# acpi_bus_register_driver() now returns a count +# +# ChangeSet +# 2004/08/09 12:11:05-04:00 len.brown@intel.com +# [ACPI] acpi for asus update from Karol Kozimor +# +# support for L4R and M5N, moves some bits for M6N +# and restores WLED functionality for M2N +# comment and whitespace cleanups +# fix get/set typo from /proc patch, delete trailing spaces +# +# drivers/acpi/asus_acpi.c +# 2004/08/09 12:10:59-04:00 len.brown@intel.com +46 -19 +# support for L4R and M5N, moves some bits for M6N +# and restores WLED functionality for M2N +# comment and whitespace cleanups +# fix get/set typo from /proc patch, delete trailing spaces +# +# ChangeSet +# 2004/08/08 01:28:20-04:00 len.brown@intel.com +# [ACPI] acpi_system_write_wakeup_device() has the wrong return type +# and is missing the __user attribution from its buffer argument. +# This patch shuts up the resulting warnings on x86-64. +# +# From: William Lee Irwin III +# Signed-off-by: Andrew Morton +# +# drivers/acpi/sleep/proc.c +# 2004/08/08 01:02:39-04:00 len.brown@intel.com +2 -2 +# acpi_system_write_wakeup_device() syntax +# +# ChangeSet +# 2004/08/06 00:40:33-04:00 len.brown@intel.com +# Merge intel.com:/home/lenb/bk/linux-2.6.8 +# into intel.com:/home/lenb/src/linux-acpi-test-2.6.8 +# +# arch/ia64/kernel/acpi.c +# 2004/08/06 00:40:29-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# ChangeSet +# 2004/08/04 17:06:43-04:00 nbryant@optonline.net +# [ACPI] restore PCI Interrupt Link Devices upon resume +# +# * register as as a sys_device so that we can get resume callbacks and restore +# interrupt routing state. +# * add acpi_pci_link_resume(), which will be called when resuming from a suspend +# state that needs IRQ routing to be restored. This fixes issues reported on +# the mailing lists, e.g.: +# http://marc.theaimsgroup.com/?l=acpi4linux&m=109142999328643&w=2 +# * rename setonboot --> initialized +# * change to test acpi_noirq in init +# +# We want to initialize everything on S3 resume in case the BIOS points an +# interrupt link somewhere we didn't expect. (Doing so avoids "missing interrupt" +# or "irq x: nobody cared" problems.) According to Len, past experience has shown +# that it's a good idea to initialize only devices that exist or were explicitly +# asked for, so we try to initialize only the IRQ's that were previously +# initialized at some point before suspend, by checking the "initialized" flag. +# This corresponds to links that have PCI devices attached. Everything else, we +# leave alone. Assuming the BIOS does the same thing on resume that it did on +# boot, this will leave all the unused links in the same state that they were on +# boot. +# +# We are registered as a sysdev in order to do this work fairly early during +# resume, before devices are resumed; some devices may not call +# pci_device_enable. +# +# Previous "setonboot once" behavior is left in place, to be conservative. +# +# drivers/acpi/pci_link.c +# 2004/08/04 15:55:16-04:00 nbryant@optonline.net +72 -4 +# acpi_pci_link_resume() +# +# ChangeSet +# 2004/08/03 23:13:00-04:00 len.brown@intel.com +# [ACPI] BIOS workaround allowing devices to use reserved IO ports +# Author: David Shaohua Li +# http://bugzilla.kernel.org/show_bug.cgi?id=3049 +# +# drivers/acpi/motherboard.c +# 2004/08/03 23:12:54-04:00 len.brown@intel.com +16 -4 +# BIOS workaround, allow devices to use reserved IOports if they insist.. +# +# ChangeSet +# 2004/08/02 14:08:40-04:00 len.brown@intel.com +# Merge intel.com:/home/lenb/bk/linux-2.6.8 +# into intel.com:/home/lenb/src/linux-acpi-test-2.6.8 +# +# arch/x86_64/kernel/i8259.c +# 2004/08/02 14:08:35-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# arch/i386/kernel/io_apic.c +# 2004/08/02 14:08:34-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# ChangeSet +# 2004/07/29 11:57:15-04:00 len.brown@intel.com +# Merge intel.com:/home/lenb/bk/linux-2.6.8 +# into intel.com:/home/lenb/src/linux-acpi-test-2.6.8 +# +# arch/i386/kernel/io_apic.c +# 2004/07/29 11:57:11-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# ChangeSet +# 2004/07/28 15:44:31-04:00 len.brown@intel.com +# Merge intel.com:/home/lenb/bk/linux-2.6.8 +# into intel.com:/home/lenb/src/linux-acpi-test-2.6.8 +# +# arch/ia64/kernel/acpi.c +# 2004/07/28 15:44:27-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# ChangeSet +# 2004/07/28 15:24:34-04:00 len.brown@intel.com +# Merge intel.com:/home/lenb/src/linux-acpi-test-2.6.7 +# into intel.com:/home/lenb/src/linux-acpi-test-2.6.8 +# +# arch/x86_64/kernel/smpboot.c +# 2004/07/28 15:24:29-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# ChangeSet +# 2004/07/28 15:17:02-04:00 len.brown@intel.com +# [ACPI] fix build warning (Andrew Morton) +# +# arch/x86_64/kernel/smpboot.c +# 2004/07/28 02:38:53-04:00 len.brown@intel.com +1 -0 +# fix build warning (Andrew Morton) +# +# ChangeSet +# 2004/07/28 14:46:34-04:00 len.brown@intel.com +# [ACPI] synchronize_kernel for idle-loop unload (Zwane Mwaikambo) +# http://bugzilla.kernel.org/show_bug.cgi?id=1716 +# +# drivers/acpi/processor.c +# 2004/07/20 11:31:46-04:00 len.brown@intel.com +3 -1 +# synchronize_kernel for idle-loop unload (Zwane Mwaikambo) +# +# ChangeSet +# 2004/07/28 14:40:03-04:00 len.brown@intel.com +# [ACPI] S3 is independent of CONFIG_X86_PAE (David Shaohua Li) +# +# arch/i386/kernel/acpi/sleep.c +# 2004/07/28 05:15:45-04:00 len.brown@intel.com +1 -4 +# S3 is independent of CONFIG_X86_PAE (David Shaohua Li) +# +# ChangeSet +# 2004/07/26 16:47:18-04:00 len.brown@intel.com +# Merge intel.com:/home/lenb/bk/linux-2.6.8 +# into intel.com:/home/lenb/src/linux-acpi-test-2.6.8 +# +# arch/x86_64/kernel/smpboot.c +# 2004/07/26 16:47:15-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# arch/i386/mm/discontig.c +# 2004/07/26 16:47:15-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# ChangeSet +# 2004/07/17 01:37:59-04:00 len.brown@intel.com +# [ACPI] ACPICA 20040715 from Bob Moore +# +# Restructured the internal HW GPE interfaces to pass/track +# the current state of interrupts (enabled/disabled) in +# order to avoid possible deadlock and increase flexibility +# of the interfaces. +# +# Implemented a "lexicographical compare" for String and +# Buffer objects within the logical operators -- LGreater, +# LLess, LGreaterEqual, and LLessEqual -- as per further +# clarification to the ACPI specification. Behavior is +# similar to C library "strcmp". +# +# Completed a major reduction in CPU stack use for the +# acpi_get_firmware_table external function. In the 32-bit +# non-debug case, the stack use has been reduced from 168 +# bytes to 32 bytes. +# +# Deployed a new run-time configuration flag, +# acpi_gbl_enable_interpeter_slack, whose purpose is to allow +# the AML interpreter to forgive certain bad AML constructs. +# Default setting is FALSE. +# +# Implemented the first use of acpi_gbl_enable_interpeter_slack +# in the Field IO support code. If enabled, it allows field +# access to go beyond the end of a region definition if the +# field is within the region length rounded up to the next +# access width boundary (a common coding error.) +# +# Renamed OSD_HANDLER to acpi_osd_handler, and +# OSD_EXECUTION_CALLBACK to acpi_osd_exec_callback for +# consistency with other ACPI symbols. Also, these symbols +# are lowercased by the latest version of the acpisrc tool. +# +# The prototypes for the PCI interfaces in acpiosxf.h +# have been updated to rename "register" to simply "reg" +# to prevent certain compilers from complaining. +# +# include/acpi/actypes.h +# 2004/07/17 01:37:53-04:00 len.brown@intel.com +2 -2 +# ACPICA 20040715 +# +# include/acpi/acpiosxf.h +# 2004/07/17 01:37:53-04:00 len.brown@intel.com +9 -6 +# ACPICA 20040715 +# +# include/acpi/achware.h +# 2004/07/17 01:37:53-04:00 len.brown@intel.com +3 -3 +# ACPICA 20040715 +# +# include/acpi/acglobal.h +# 2004/07/17 01:37:53-04:00 len.brown@intel.com +11 -4 +# ACPICA 20040715 +# +# include/acpi/acevents.h +# 2004/07/17 01:37:53-04:00 len.brown@intel.com +2 -1 +# ACPICA 20040715 +# +# include/acpi/acconfig.h +# 2004/07/17 01:37:53-04:00 len.brown@intel.com +1 -1 +# ACPICA 20040715 +# +# drivers/acpi/tables/tbxfroot.c +# 2004/07/17 01:37:53-04:00 len.brown@intel.com +63 -43 +# ACPICA 20040715 +# +# drivers/acpi/osl.c +# 2004/07/17 01:37:53-04:00 len.brown@intel.com +5 -5 +# ACPICA 20040715 +# +# drivers/acpi/hardware/hwsleep.c +# 2004/07/17 01:37:53-04:00 len.brown@intel.com +7 -6 +# ACPICA 20040715 +# +# drivers/acpi/hardware/hwregs.c +# 2004/07/17 01:37:53-04:00 len.brown@intel.com +2 -1 +# ACPICA 20040715 +# +# drivers/acpi/hardware/hwgpe.c +# 2004/07/17 01:37:53-04:00 len.brown@intel.com +10 -10 +# ACPICA 20040715 +# +# drivers/acpi/executer/exmisc.c +# 2004/07/17 01:37:53-04:00 len.brown@intel.com +20 -20 +# ACPICA 20040715 +# +# drivers/acpi/executer/exfldio.c +# 2004/07/17 01:37:53-04:00 len.brown@intel.com +15 -0 +# ACPICA 20040715 +# +# drivers/acpi/events/evmisc.c +# 2004/07/17 01:37:53-04:00 len.brown@intel.com +2 -2 +# ACPICA 20040715 +# +# drivers/acpi/events/evgpeblk.c +# 2004/07/17 01:37:53-04:00 len.brown@intel.com +5 -4 +# ACPICA 20040715 +# +# ChangeSet +# 2004/07/15 15:17:42-04:00 len.brown@intel.com +# [ACPI] Enable run-time CM button/LID events (David Shaohua Li) +# http://bugzilla.kernel.org/show_bug.cgi?id=1415 +# +# drivers/acpi/sleep/wakeup.c +# 2004/07/15 05:05:42-04:00 len.brown@intel.com +41 -9 +# Enable run-time CM button/LID events +# +# drivers/acpi/button.c +# 2004/07/15 04:09:03-04:00 len.brown@intel.com +9 -0 +# Enable run-time CM button/LID events +# +# drivers/acpi/acpi_ksyms.c +# 2004/07/15 04:05:19-04:00 len.brown@intel.com +2 -0 +# Enable run-time CM button/LID events +# +# ChangeSet +# 2004/07/15 02:20:47-04:00 len.brown@intel.com +# Merge intel.com:/home/lenb/src/linux-acpi-test-2.6.7 +# into intel.com:/home/lenb/src/linux-acpi-test-2.6.8 +# +# drivers/acpi/sleep/main.c +# 2004/07/15 02:20:44-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# drivers/acpi/scan.c +# 2004/07/15 02:20:44-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# arch/i386/kernel/io_apic.c +# 2004/07/15 02:20:44-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# ChangeSet +# 2004/07/15 02:05:38-04:00 len.brown@intel.com +# Merge +# +# include/asm-x86_64/acpi.h +# 2004/07/15 02:05:37-04:00 len.brown@intel.com +0 -0 +# SCCS merged +# +# ChangeSet +# 2004/07/15 00:39:15-04:00 len.brown@intel.com +# [ACPI] Create /proc/acpi/wakeup to allow enabling +# the optional wakeup event sources. (David Shaohua Li) +# http://bugzilla.kernel.org/show_bug.cgi?id=1415 +# +# drivers/acpi/sleep/wakeup.c +# 2004/07/14 02:35:15-04:00 len.brown@intel.com +147 -0 +# /proc/acpi/wakeup +# +# drivers/acpi/sleep/sleep.h +# 2004/07/14 01:29:14-04:00 len.brown@intel.com +3 -0 +# /proc/acpi/wakeup +# +# drivers/acpi/sleep/proc.c +# 2004/07/14 02:14:03-04:00 len.brown@intel.com +86 -0 +# /proc/acpi/wakeup +# +# drivers/acpi/sleep/main.c +# 2004/07/14 01:29:13-04:00 len.brown@intel.com +3 -0 +# /proc/acpi/wakeup +# +# drivers/acpi/sleep/Makefile +# 2004/07/14 01:29:07-04:00 len.brown@intel.com +1 -1 +# /proc/acpi/wakeup +# +# drivers/acpi/sleep/wakeup.c +# 2004/07/14 02:35:15-04:00 len.brown@intel.com +0 -0 +# BitKeeper file /home/lenb/src/linux-acpi-test-2.6.7/drivers/acpi/sleep/wakeup.c +# +# ChangeSet +# 2004/07/15 00:37:33-04:00 len.brown@intel.com +# [ACPI] ACPI bus support for wakeup GPE (David Shaohua Li) +# http://bugzilla.kernel.org/show_bug.cgi?id=1415 +# +# include/acpi/acpi_drivers.h +# 2004/07/14 01:22:19-04:00 len.brown@intel.com +2 -1 +# ACPI bus support for wakeup GPE +# +# include/acpi/acpi_bus.h +# 2004/07/14 01:22:19-04:00 len.brown@intel.com +24 -4 +# ACPI bus support for wakeup GPE +# +# drivers/acpi/scan.c +# 2004/07/14 01:24:56-04:00 len.brown@intel.com +137 -28 +# ACPI bus support for wakeup GPE +# +# drivers/acpi/power.c +# 2004/07/14 01:22:19-04:00 len.brown@intel.com +80 -0 +# ACPI bus support for wakeup GPE +# +# ChangeSet +# 2004/07/15 00:27:33-04:00 len.brown@intel.com +# [ACPI] IOAPIC suspend/resume (David Shaohua Li) +# http://bugzilla.kernel.org/show_bug.cgi?id=3037 +# +# arch/i386/kernel/io_apic.c +# 2004/07/07 23:28:17-04:00 len.brown@intel.com +93 -0 +# IOAPIC suspend/resume +# +# arch/x86_64/kernel/smpboot.c +# 2004/07/14 16:00:16-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# arch/x86_64/kernel/i8259.c +# 2004/07/14 16:00:16-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# arch/i386/kernel/smpboot.c +# 2004/07/14 16:00:16-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# arch/i386/kernel/i8259.c +# 2004/07/14 16:00:16-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# arch/i386/kernel/acpi/boot.c +# 2004/07/14 16:00:16-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# ChangeSet +# 2004/07/14 15:47:04-04:00 len.brown@intel.com +# [ACPI] Tell the BIOS Linux can handle +# Enhanced Speed Step (EST). (Venkatesh Pallipadi) +# http://bugzilla.kernel.org/show_bug.cgi?id=2712 +# +# include/asm-i386/acpi.h +# 2004/05/18 18:45:51-04:00 len.brown@intel.com +6 -0 +# use _PDC to enable Enhanced Speed Step (EST) +# +# drivers/acpi/processor.c +# 2004/05/19 20:04:43-04:00 len.brown@intel.com +2 -2 +# use _PDC to enable Enhanced Speed Step (EST) +# +# arch/i386/kernel/cpu/cpufreq/acpi.c +# 2004/05/19 14:55:14-04:00 len.brown@intel.com +73 -0 +# use _PDC to enable Enhanced Speed Step (EST) +# +# ChangeSet +# 2004/07/14 15:39:55-04:00 len.brown@intel.com +# [ACPI] add SMP suport to processor driver (Venkatesh Pallipadi) +# http://bugzilla.kernel.org/show_bug.cgi?id=2615 +# +# include/asm-x86_64/acpi.h +# 2004/06/25 01:40:47-04:00 len.brown@intel.com +2 -0 +# add SMP support to processor driver +# +# include/asm-ia64/acpi.h +# 2004/06/25 01:40:46-04:00 len.brown@intel.com +2 -0 +# add SMP support to processor driver +# +# include/asm-i386/smp.h +# 2004/06/25 01:40:47-04:00 len.brown@intel.com +1 -0 +# add SMP support to processor driver +# +# include/asm-i386/acpi.h +# 2004/06/25 01:40:47-04:00 len.brown@intel.com +2 -0 +# add SMP support to processor driver +# +# drivers/acpi/processor.c +# 2004/06/25 03:53:02-04:00 len.brown@intel.com +55 -10 +# add SMP support to processor driver +# +# arch/x86_64/kernel/smpboot.c +# 2004/06/25 01:40:50-04:00 len.brown@intel.com +1 -0 +# add SMP support to processor driver +# +# arch/ia64/kernel/acpi.c +# 2004/06/25 01:40:49-04:00 len.brown@intel.com +6 -0 +# add SMP support to processor driver +# +# arch/i386/kernel/smpboot.c +# 2004/06/25 01:40:49-04:00 len.brown@intel.com +6 -0 +# add SMP support to processor driver +# +# arch/i386/kernel/cpu/cpufreq/acpi.c +# 2004/06/25 01:40:43-04:00 len.brown@intel.com +25 -5 +# add SMP support to processor driver +# +# arch/i386/kernel/acpi/boot.c +# 2004/06/25 01:40:49-04:00 len.brown@intel.com +7 -0 +# add SMP support to processor driver +# +# ChangeSet +# 2004/07/14 15:35:54-04:00 len.brown@intel.com +# [ACPI] save/restore ELCR on suspend/resume (David Shaohua Li) +# http://bugzilla.kernel.org/show_bug.cgi?id=2643 +# +# arch/x86_64/kernel/i8259.c +# 2004/07/14 15:35:49-04:00 len.brown@intel.com +52 -1 +# save/restore ELCR on suspend/resume +# +# arch/i386/kernel/i8259.c +# 2004/07/14 15:35:49-04:00 len.brown@intel.com +25 -0 +# save/restore ELCR on suspend/resume +# +# ChangeSet +# 2004/07/14 14:47:30-04:00 len.brown@intel.com +# [ACPI] /proc/acpi/thermal_zone/THRM/cooling_mode +# Add concept of (mandatory) "critical", when (optional) +# "passive" and "active" are not present. (Zhenyu Z Wang) +# http://bugzilla.kernel.org/show_bug.cgi?id=1770 +# +# drivers/acpi/thermal.c +# 2004/07/08 01:56:01-04:00 len.brown@intel.com +32 -16 +# create cooling_mode "critical" +# +# ChangeSet +# 2004/07/14 00:34:54-04:00 len.brown@intel.com +# [ACPI] fix ability to set thermal trip points (Hugo Haas, Stefan Seyfried) +# eg. # echo -n "100:90:80:70:60:50" > /proc/acpi/thermal_zone/THRM/trip_points +# http://bugzilla.kernel.org/show_bug.cgi?id=2588 +# +# drivers/acpi/thermal.c +# 2004/06/29 17:43:00-04:00 len.brown@intel.com +14 -5 +# fix ability to set thermal trip points +# +# ChangeSet +# 2004/07/13 16:49:41-04:00 len.brown@intel.com +# Merge intel.com:/home/lenb/src/linux-acpi-test-2.6.7 +# into intel.com:/home/lenb/src/linux-acpi-test-2.6.8 +# +# arch/x86_64/kernel/setup.c +# 2004/07/13 16:49:38-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# arch/i386/mm/discontig.c +# 2004/07/13 16:49:38-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# arch/i386/kernel/setup.c +# 2004/07/13 16:49:37-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# ChangeSet +# 2004/07/11 22:05:34-04:00 len.brown@intel.com +# Merge intel.com:/home/lenb/bk/linux-2.6.8 +# into intel.com:/home/lenb/src/linux-acpi-test-2.6.8 +# +# drivers/acpi/sleep/main.c +# 2004/07/11 22:05:30-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# ChangeSet +# 2004/07/07 13:53:29-04:00 len.brown@intel.com +# [ACPI] reserve EBDA for Dell BIOS that neglects to. (David Shaohua Li) +# http://bugme.osdl.org/show_bug.cgi?id=2990 +# +# arch/x86_64/kernel/setup.c +# 2004/06/30 23:30:27-04:00 len.brown@intel.com +17 -0 +# reserve EBDA for Dell BIOS that neglects to. +# +# arch/i386/mm/discontig.c +# 2004/06/30 22:51:37-04:00 len.brown@intel.com +15 -0 +# reserve EBDA for Dell BIOS that neglects to. +# +# arch/i386/kernel/setup.c +# 2004/06/30 22:51:37-04:00 len.brown@intel.com +15 -0 +# reserve EBDA for Dell BIOS that neglects to. +# +# ChangeSet +# 2004/07/02 23:13:23-04:00 len.brown@intel.com +# Merge intel.com:/home/lenb/bk/linux-2.6.8 +# into intel.com:/home/lenb/src/linux-acpi-test-2.6.8 +# +# drivers/acpi/namespace/nsalloc.c +# 2004/07/02 23:13:19-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# drivers/acpi/ec.c +# 2004/06/24 06:39:53-04:00 len.brown@intel.com +2 -0 +# enable GPE for ECDT +# +# ChangeSet +# 2004/06/24 01:43:06-04:00 len.brown@intel.com +# [ACPI] reserve IOPORTS for ACPI (David Shaohua Li) +# http://bugzilla.kernel.org/show_bug.cgi?id=2641 +# +# drivers/acpi/processor.c +# 2004/05/20 02:36:01-04:00 len.brown@intel.com +0 -1 +# reserve IOPORTS for ACPI +# +# drivers/acpi/motherboard.c +# 2004/05/20 05:01:24-04:00 len.brown@intel.com +161 -0 +# reserve IOPORTS for ACPI +# +# drivers/acpi/Makefile +# 2004/05/20 02:36:01-04:00 len.brown@intel.com +1 -1 +# reserve IOPORTS for ACPI +# +# drivers/acpi/motherboard.c +# 2004/05/20 05:01:24-04:00 len.brown@intel.com +0 -0 +# BitKeeper file /home/lenb/bk/linux-acpi-test-2.6.7/drivers/acpi/motherboard.c +# +# ChangeSet +# 2004/06/24 00:53:45-04:00 len.brown@intel.com +# [ACPI] enable GPE for ECDT (David Shaohua Li) +# +# ChangeSet +# 2004/06/23 17:01:29-04:00 len.brown@intel.com +# [ACPI] enable Embedded Controller (EC)'s +# General Purpose Event (GPE) from David Shaohua Li +# +# drivers/acpi/ec.c +# 2004/06/07 13:35:25-04:00 len.brown@intel.com +2 -0 +# enable EC GPE +# +# ChangeSet +# 2004/06/23 01:22:23-04:00 len.brown@intel.com +# [ACPI] fix return-from-sleep PM/ACPI state conversion bug (David Shaohua Li) +# +# drivers/acpi/sleep/main.c +# 2004/06/23 01:22:17-04:00 len.brown@intel.com +16 -14 +# fix conversion between pm_state and acpi_state on return from sleep +# +# ChangeSet +# 2004/06/22 16:27:51-04:00 len.brown@intel.com +# merge ACPICA +# +# drivers/acpi/events/evxface.c +# 2004/06/22 16:27:46-04:00 len.brown@intel.com +22 -17 +# merge +# +# drivers/acpi/events/evmisc.c +# 2004/06/22 16:27:46-04:00 len.brown@intel.com +0 -2 +# merge +# +# drivers/acpi/osl.c +# 2004/06/22 16:05:25-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# drivers/acpi/ec.c +# 2004/06/22 16:05:25-04:00 len.brown@intel.com +0 -0 +# Auto merged +# +# ChangeSet +# 2004/06/22 15:56:16-04:00 len.brown@intel.com +# [ACPI] update EC GPE handler to new ACPICA handler type +# +# drivers/acpi/ec.c +# 2004/06/22 15:13:22-04:00 len.brown@intel.com +7 -2 +# An acpi_gpe_handler is an acpi_event_handler +# as of ACPICA 20040427, and needs a return value. +# +# ChangeSet +# 2004/06/22 13:48:26-04:00 len.brown@intel.com +# [ACPI] ACPICA 20040615 from Bob Moore +# +# Implemented support for Buffer and String objects (as +# per ACPI 2.0) for the following ASL operators: LEqual, +# LGreater, LLess, LGreaterEqual, and LLessEqual. +# +# include/acpi/acinterp.h +# 2004/06/21 20:35:19-04:00 len.brown@intel.com +2 -2 +# ACPICA 20040615 +# +# include/acpi/acdebug.h +# 2004/06/21 20:35:19-04:00 len.brown@intel.com +4 -0 +# ACPICA 20040615 +# +# include/acpi/acconfig.h +# 2004/06/21 20:35:20-04:00 len.brown@intel.com +1 -1 +# ACPICA 20040615 +# +# drivers/acpi/utilities/utalloc.c +# 2004/06/21 20:35:22-04:00 len.brown@intel.com +8 -5 +# ACPICA 20040615 +# +# drivers/acpi/parser/psopcode.c +# 2004/06/21 20:35:22-04:00 len.brown@intel.com +4 -4 +# ACPICA 20040615 +# +# drivers/acpi/executer/exoparg2.c +# 2004/06/21 20:35:22-04:00 len.brown@intel.com +10 -2 +# ACPICA 20040615 +# +# drivers/acpi/executer/exmisc.c +# 2004/06/21 20:35:22-04:00 len.brown@intel.com +119 -32 +# ACPICA 20040615 +# +# drivers/acpi/events/evgpeblk.c +# 2004/06/21 20:35:22-04:00 len.brown@intel.com +2 -1 +# ACPICA 20040615 +# +# ChangeSet +# 2004/06/22 13:42:17-04:00 len.brown@intel.com +# [ACPI] ACPICA 20040527 from Bob Moore +# +# Completed a new design and implementation for EBDA +# (Extended BIOS Data Area) support in the RSDP scan code. +# The original code improperly scanned for the EBDA by simply +# scanning from memory location 0 to 0x400. The correct +# method is to first obtain the EBDA pointer from within +# the BIOS data area, then scan 1K of memory starting at the +# EBDA pointer. There appear to be few if any machines that +# place the RSDP in the EBDA, however. +# http://bugme.osdl.org/show_bug.cgi?id=2415 +# +# Integrated a fix for a possible fault during evaluation +# of BufferField arguments. Obsolete code that was causing +# the problem was removed. (Asus laptop boot crash) +# https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=121760 +# +# Found and fixed a problem in the Field Support Code +# where data could be corrupted on a bit field read that +# starts on an aligned boundary but does not end on an +# aligned boundary. Merged the read/write "datum length" +# calculation code into a common procedure. +# +# include/acpi/acmacros.h +# 2004/06/01 21:39:18-04:00 len.brown@intel.com +3 -0 +# ACPICA 20040527 +# +# include/acpi/acinterp.h +# 2004/06/01 21:39:18-04:00 len.brown@intel.com +6 -0 +# ACPICA 20040527 +# +# include/acpi/acconfig.h +# 2004/06/01 21:39:18-04:00 len.brown@intel.com +7 -6 +# ACPICA 20040527 +# +# drivers/acpi/tables/tbxfroot.c +# 2004/06/01 21:39:21-04:00 len.brown@intel.com +68 -35 +# ACPICA 20040527 +# +# drivers/acpi/executer/exfldio.c +# 2004/06/01 21:39:21-04:00 len.brown@intel.com +84 -64 +# ACPICA 20040527 +# +# drivers/acpi/executer/exconfig.c +# 2004/06/01 21:39:21-04:00 len.brown@intel.com +2 -2 +# ACPICA 20040527 +# +# drivers/acpi/events/evgpeblk.c +# 2004/06/01 21:39:21-04:00 len.brown@intel.com +2 -2 +# ACPICA 20040527 +# +# drivers/acpi/events/evgpe.c +# 2004/06/01 21:39:21-04:00 len.brown@intel.com +24 -20 +# ACPICA 20040527 +# +# drivers/acpi/dispatcher/dsopcode.c +# 2004/06/01 21:39:21-04:00 len.brown@intel.com +0 -3 +# ACPICA 20040527 +# +# ChangeSet +# 2004/06/22 13:15:18-04:00 len.brown@intel.com +# [ACPI] ACPICA 20040514 from Bob Moore +# +# Fixed a problem where hardware GPE enable bits sometimes +# not set properly during and after GPE method execution. +# Result of ACPICA 20040427 changes. +# +# Removed extra "clear all GPEs" when sleeping/waking. +# +# Removed acpi_ht_enable_gpe and acpi_hw_disable_gpe, replaced +# by the single acpi_hw_write_gpe_enable_reg. Changed a couple +# of calls to the functions above to the new acpi_ev* calls +# as appropriate. +# +# ACPI_OS_NAME was removed from the OS-specific headers. +# The default name is now "Microsoft Windows NT" for maximum +# compatibility. However this can be changed by modifying +# the acconfig.h file. Fixes EHCI probe issue: +# http://bugme.osdl.org/show_bug.cgi?id=1762 +# +# Allow a single invocation of acpi_install_notify_handler +# for a handler that traps both types of notifies (System, +# Device). Use ACPI_ALL_NOTIFY flag. +# +# Run _INI methods on ThermalZone objects. This is against +# the ACPI specification, but there is apparently ASL code +# in the field that has these _INI methods, and apparently +# "other" AML interpreters execute them. +# +# Performed a full 16/32/64 bit lint that resulted in some +# small changes. +# +# include/acpi/platform/aclinux.h +# 2004/06/01 21:37:50-04:00 len.brown@intel.com +0 -2 +# ACPICA 20040514 +# +# include/acpi/platform/acenv.h +# 2004/06/01 21:37:50-04:00 len.brown@intel.com +2 -6 +# ACPICA 20040514 +# +# include/acpi/actypes.h +# 2004/06/01 21:37:50-04:00 len.brown@intel.com +4 -3 +# ACPICA 20040514 +# +# include/acpi/acmacros.h +# 2004/06/01 21:37:50-04:00 len.brown@intel.com +1 -1 +# ACPICA 20040514 +# +# include/acpi/achware.h +# 2004/06/01 21:37:50-04:00 len.brown@intel.com +6 -5 +# ACPICA 20040514 +# +# include/acpi/acdebug.h +# 2004/06/01 21:37:50-04:00 len.brown@intel.com +4 -0 +# ACPICA 20040514 +# +# include/acpi/acconfig.h +# 2004/06/01 21:37:50-04:00 len.brown@intel.com +11 -1 +# ACPICA 20040514 +# +# drivers/acpi/utilities/utglobal.c +# 2004/06/01 21:37:53-04:00 len.brown@intel.com +1 -1 +# ACPICA 20040514 +# +# drivers/acpi/resources/rsxface.c +# 2004/06/01 21:37:53-04:00 len.brown@intel.com +2 -1 +# ACPICA 20040514 +# +# drivers/acpi/parser/psxface.c +# 2004/06/01 21:37:52-04:00 len.brown@intel.com +2 -3 +# ACPICA 20040514 +# +# drivers/acpi/namespace/nsinit.c +# 2004/06/01 21:37:53-04:00 len.brown@intel.com +8 -7 +# ACPICA 20040514 +# +# drivers/acpi/namespace/nseval.c +# 2004/06/01 21:37:53-04:00 len.brown@intel.com +1 -1 +# ACPICA 20040514 +# +# drivers/acpi/namespace/nsalloc.c +# 2004/06/01 21:37:53-04:00 len.brown@intel.com +1 -1 +# ACPICA 20040514 +# +# drivers/acpi/hardware/hwsleep.c +# 2004/06/01 21:37:52-04:00 len.brown@intel.com +2 -2 +# ACPICA 20040514 +# +# drivers/acpi/hardware/hwgpe.c +# 2004/06/01 21:37:52-04:00 len.brown@intel.com +16 -51 +# ACPICA 20040514 +# +# drivers/acpi/executer/exresolv.c +# 2004/06/01 21:37:53-04:00 len.brown@intel.com +4 -4 +# ACPICA 20040514 +# +# drivers/acpi/events/evxfregn.c +# 2004/06/01 21:37:52-04:00 len.brown@intel.com +0 -1 +# ACPICA 20040514 +# +# drivers/acpi/events/evxfevnt.c +# 2004/06/01 21:37:52-04:00 len.brown@intel.com +1 -8 +# ACPICA 20040514 +# +# drivers/acpi/events/evxface.c +# 2004/06/01 21:37:52-04:00 len.brown@intel.com +45 -31 +# ACPICA 20040514 +# +# drivers/acpi/events/evmisc.c +# 2004/06/01 21:37:52-04:00 len.brown@intel.com +2 -2 +# ACPICA 20040514 +# +# drivers/acpi/events/evgpeblk.c +# 2004/06/01 21:37:52-04:00 len.brown@intel.com +14 -7 +# ACPICA 20040514 +# +# drivers/acpi/events/evgpe.c +# 2004/06/01 21:37:52-04:00 len.brown@intel.com +21 -14 +# ACPICA 20040514 +# +# drivers/acpi/dispatcher/dsmethod.c +# 2004/06/01 21:37:52-04:00 len.brown@intel.com +1 -1 +# ACPICA 20040514 +# +# ChangeSet +# 2004/05/07 17:24:44-04:00 len.brown@intel.com +# [ACPI] ACPICA 20040427 from Bob Moore +# +# Completed a major overhaul of the GPE handling within ACPI CA. +# There are now three types of GPEs: +# wake-only; runtime-only; combination wake/run. +# +# The only GPEs allowed to be combination wake/run are for +# button-style devices such as a control-method power button, +# control-method sleep button, or a notebook lid switch. +# GPEs that have an _Lxx or _Exx method and are not referenced +# by any _PRW methods are marked for "runtime" and hardware enabled. +# +# Any GPE that is referenced by a _PRW method is marked for "wake" +# (and disabled at runtime). However, at sleep time, only those +# GPEs that have been specifically enabled for wake via the +# acpi_enable_gpe() interface will actually be hardware enabled. +# +# A new external interface has been added, acpi_set_gpe_type() +# that is meant to be used by device drivers to force a GPE +# to a particular type. It will be especially useful for the +# drivers for the button devices mentioned above. +# +# Completed restructuring of the ACPI CA initialization sequence +# so that default operation region handlers are installed +# before GPEs are initialized and the _PRW methods are executed. +# This will prevent errors when the _PRW methods attempt to +# access system memory or I/O space. +# +# GPE enable/disable no longer reads the GPE enable register. +# We now keep the enable info for runtime and wake separate +# and in the GPE_EVENT_INFO. We thus no longer depend on +# the hardware to maintain these bits. +# +# Always clear the wake status and fixed/GPE status bits +# before sleep, even for state S5. +# +# Improved the AML debugger output for displaying the +# GPE blocks and their current status. +# +# Added new strings for the _OSI method, of the form +# "Windows 2001 SPx" where x = 0,1,2,3,4. +# +# Fixed a problem where the physical address was incorrectly +# calculated when the Load() operator was used to directly +# load from an Operation Region (vs. loading from a Field object.) +# Also added check for minimum table length for this case. +# +# Fix for multiple mutex acquisition. Restore original thread +# SyncLevel on mutex release. +# +# Added ACPI_VALID_SXDS flag to the acpi_get_object_info interface +# for consistency with the other fields returned. +# +# Shrunk the ACPI_GPE_EVENT_INFO structure by 40%. +# There is one such structure for each GPE in the system, +# so the size of this structure is important. +# +# CPU stack requirement reduction: +# Cleaned up the method execution and object evaluation paths +# so that now a parameter structure is passed, instead of copying +# the various method parameters over and over again. +# +# In evregion.c: +# Correctly exit and reenter the interpreter region if and only +# if dispatching an operation region request to a user-installed +# handler. Do not exit/reenter when dispatching to a default +# handler (e.g., default system memory or I/O handlers) +# +# include/acpi/actypes.h +# 2004/05/07 13:10:42-04:00 len.brown@intel.com +46 -27 +# ACPICA 20040427 +# +# include/acpi/actbl.h +# 2004/05/07 13:10:43-04:00 len.brown@intel.com +16 -13 +# ACPICA 20040427 +# +# include/acpi/acstruct.h +# 2004/05/07 13:10:42-04:00 len.brown@intel.com +21 -2 +# ACPICA 20040427 +# +# include/acpi/acpixf.h +# 2004/05/07 13:10:43-04:00 len.brown@intel.com +8 -2 +# ACPICA 20040427 +# +# include/acpi/acparser.h +# 2004/05/07 13:10:43-04:00 len.brown@intel.com +1 -3 +# ACPICA 20040427 +# +# include/acpi/acobject.h +# 2004/05/07 13:10:42-04:00 len.brown@intel.com +7 -6 +# ACPICA 20040427 +# +# include/acpi/acnamesp.h +# 2004/05/07 13:10:43-04:00 len.brown@intel.com +5 -13 +# ACPICA 20040427 +# +# include/acpi/aclocal.h +# 2004/05/07 13:10:43-04:00 len.brown@intel.com +25 -14 +# ACPICA 20040427 +# +# include/acpi/achware.h +# 2004/05/07 13:10:42-04:00 len.brown@intel.com +11 -10 +# ACPICA 20040427 +# +# include/acpi/acglobal.h +# 2004/05/07 13:10:43-04:00 len.brown@intel.com +1 -0 +# ACPICA 20040427 +# +# include/acpi/acexcep.h +# 2004/05/07 13:10:43-04:00 len.brown@intel.com +4 -2 +# ACPICA 20040427 +# +# include/acpi/acevents.h +# 2004/05/07 13:10:42-04:00 len.brown@intel.com +48 -3 +# ACPICA 20040427 +# +# include/acpi/acdispat.h +# 2004/05/07 13:10:43-04:00 len.brown@intel.com +1 -2 +# ACPICA 20040427 +# +# include/acpi/acconfig.h +# 2004/05/07 13:10:43-04:00 len.brown@intel.com +2 -2 +# ACPICA 20040427 +# +# drivers/acpi/utilities/utxface.c +# 2004/05/07 13:10:46-04:00 len.brown@intel.com +26 -15 +# ACPICA 20040427 +# +# drivers/acpi/utilities/utglobal.c +# 2004/05/07 13:10:46-04:00 len.brown@intel.com +35 -21 +# ACPICA 20040427 +# +# drivers/acpi/utilities/uteval.c +# 2004/05/07 13:10:46-04:00 len.brown@intel.com +11 -7 +# ACPICA 20040427 +# +# drivers/acpi/resources/rsutils.c +# 2004/05/07 13:10:46-04:00 len.brown@intel.com +6 -1 +# ACPICA 20040427 +# +# drivers/acpi/parser/psxface.c +# 2004/05/07 13:10:46-04:00 len.brown@intel.com +27 -25 +# ACPICA 20040427 +# +# drivers/acpi/namespace/nsxfname.c +# 2004/05/07 13:10:46-04:00 len.brown@intel.com +2 -2 +# ACPICA 20040427 +# +# drivers/acpi/namespace/nsxfeval.c +# 2004/05/07 13:10:46-04:00 len.brown@intel.com +28 -24 +# ACPICA 20040427 +# +# drivers/acpi/namespace/nsparse.c +# 2004/05/07 13:10:46-04:00 len.brown@intel.com +3 -2 +# ACPICA 20040427 +# +# drivers/acpi/namespace/nsinit.c +# 2004/05/07 13:10:46-04:00 len.brown@intel.com +17 -14 +# ACPICA 20040427 +# +# drivers/acpi/namespace/nseval.c +# 2004/05/07 13:10:46-04:00 len.brown@intel.com +32 -58 +# ACPICA 20040427 +# +# drivers/acpi/namespace/nsaccess.c +# 2004/05/07 13:10:46-04:00 len.brown@intel.com +1 -1 +# ACPICA 20040427 +# +# drivers/acpi/hardware/hwsleep.c +# 2004/05/07 13:10:45-04:00 len.brown@intel.com +36 -16 +# ACPICA 20040427 +# +# drivers/acpi/hardware/hwregs.c +# 2004/05/07 13:10:45-04:00 len.brown@intel.com +17 -14 +# ACPICA 20040427 +# +# drivers/acpi/hardware/hwgpe.c +# 2004/05/07 13:10:45-04:00 len.brown@intel.com +92 -212 +# ACPICA 20040427 +# +# drivers/acpi/executer/exoparg2.c +# 2004/05/07 13:10:46-04:00 len.brown@intel.com +33 -3 +# ACPICA 20040427 +# +# drivers/acpi/executer/exmutex.c +# 2004/05/07 13:10:46-04:00 len.brown@intel.com +25 -21 +# ACPICA 20040427 +# +# drivers/acpi/executer/exconfig.c +# 2004/05/07 13:10:46-04:00 len.brown@intel.com +35 -12 +# ACPICA 20040427 +# +# drivers/acpi/events/evxfregn.c +# 2004/05/07 13:10:45-04:00 len.brown@intel.com +5 -195 +# ACPICA 20040427 +# +# drivers/acpi/events/evxfevnt.c +# 2004/05/07 13:10:45-04:00 len.brown@intel.com +101 -75 +# ACPICA 20040427 +# +# drivers/acpi/events/evxface.c +# 2004/05/07 13:10:45-04:00 len.brown@intel.com +58 -25 +# ACPICA 20040427 +# +# drivers/acpi/events/evregion.c +# 2004/05/07 13:10:45-04:00 len.brown@intel.com +346 -27 +# ACPICA 20040427 +# +# drivers/acpi/events/evmisc.c +# 2004/05/07 13:10:46-04:00 len.brown@intel.com +4 -0 +# ACPICA 20040427 +# +# drivers/acpi/events/evgpeblk.c +# 2004/05/07 13:10:45-04:00 len.brown@intel.com +104 -46 +# ACPICA 20040427 +# +# drivers/acpi/events/evgpe.c +# 2004/05/07 13:10:45-04:00 len.brown@intel.com +343 -25 +# ACPICA 20040427 +# +# drivers/acpi/events/evevent.c +# 2004/05/07 13:10:46-04:00 len.brown@intel.com +6 -6 +# ACPICA 20040427 +# +# drivers/acpi/dispatcher/dswstate.c +# 2004/05/07 13:10:46-04:00 len.brown@intel.com +13 -5 +# ACPICA 20040427 +# +# drivers/acpi/dispatcher/dsopcode.c +# 2004/05/07 13:10:46-04:00 len.brown@intel.com +2 -2 +# ACPICA 20040427 +# +# drivers/acpi/dispatcher/dsmethod.c +# 2004/05/07 13:10:46-04:00 len.brown@intel.com +10 -6 +# ACPICA 20040427 +# +# ChangeSet +# 2004/05/07 17:21:19-04:00 len.brown@intel.com +# [ACPI] ACPICA 20040402 from Bob Moore +# +# Fixed an interpreter problem where an indirect store through an +# ArgX parameter was incorrectly applying the "implicit conversion +# rules" during the store. From the ACPI specification: "If the +# target is a method local or argument (LocalX or ArgX), no +# conversion is performed and the result is stored directly to the +# target". The new behavior is to disable implicit conversion +# during ALL stores to an ArgX. +# +# Changed the behavior of the _PRW method scan to ignore any and +# all errors returned by a given _PRW. This prevents the scan from +# aborting from the failure of any single _PRW. +# +# Moved the runtime configuration parameters from the global init +# procedure to static variables in acglobal.h. This will allow the +# host to override the default values easily. +# +# include/acpi/acinterp.h +# 2004/05/07 13:11:48-04:00 len.brown@intel.com +4 -1 +# ACPICA 20040402 +# +# include/acpi/acglobal.h +# 2004/05/07 13:11:49-04:00 len.brown@intel.com +29 -7 +# ACPICA 20040402 +# +# include/acpi/acdisasm.h +# 2004/05/07 13:11:49-04:00 len.brown@intel.com +15 -0 +# ACPICA 20040402 +# +# include/acpi/acconfig.h +# 2004/05/07 13:11:49-04:00 len.brown@intel.com +1 -1 +# ACPICA 20040402 +# +# drivers/acpi/utilities/utglobal.c +# 2004/05/07 13:11:52-04:00 len.brown@intel.com +16 -10 +# ACPICA 20040402 +# +# drivers/acpi/executer/exstore.c +# 2004/05/07 13:11:52-04:00 len.brown@intel.com +14 -3 +# ACPICA 20040402 +# +# drivers/acpi/executer/exfldio.c +# 2004/05/07 13:11:52-04:00 len.brown@intel.com +1 -1 +# ACPICA 20040402 +# +# drivers/acpi/events/evmisc.c +# 2004/05/07 13:11:51-04:00 len.brown@intel.com +1 -1 +# ACPICA 20040402 +# +# drivers/acpi/events/evgpeblk.c +# 2004/05/07 13:11:51-04:00 len.brown@intel.com +4 -6 +# ACPICA 20040402 +# +# drivers/acpi/dispatcher/dswload.c +# 2004/05/07 13:11:51-04:00 len.brown@intel.com +22 -0 +# ACPICA 20040402 +# +# drivers/acpi/dispatcher/dsmthdat.c +# 2004/05/07 13:11:51-04:00 len.brown@intel.com +5 -3 +# ACPICA 20040402 +# +# ChangeSet +# 2004/05/03 12:31:49-04:00 len.brown@intel.com +# Cset exclude: torvalds@evo.osdl.org|ChangeSet|20040401021818|60003 +# +# drivers/acpi/utilities/utglobal.c +# 2004/05/03 12:31:41-04:00 len.brown@intel.com +0 -0 +# Exclude +# +# drivers/acpi/osl.c +# 2004/05/03 12:31:41-04:00 len.brown@intel.com +0 -0 +# Exclude +# +diff -Nru a/arch/i386/kernel/acpi/boot.c b/arch/i386/kernel/acpi/boot.c +--- a/arch/i386/kernel/acpi/boot.c 2004-09-21 21:26:34 +10:00 ++++ b/arch/i386/kernel/acpi/boot.c 2004-09-21 21:26:34 +10:00 +@@ -71,6 +71,7 @@ + int acpi_lapic; + int acpi_ioapic; + int acpi_strict; ++EXPORT_SYMBOL(acpi_strict); + + acpi_interrupt_flags acpi_sci_flags __initdata; + int acpi_sci_override_gsi __initdata; +@@ -84,6 +85,11 @@ + #warning ACPI uses CMPXCHG, i486 and later hardware + #endif + ++#define MAX_MADT_ENTRIES 256 ++u8 x86_acpiid_to_apicid[MAX_MADT_ENTRIES] = ++ { [0 ... MAX_MADT_ENTRIES-1] = 0xff }; ++EXPORT_SYMBOL(x86_acpiid_to_apicid); ++ + /* -------------------------------------------------------------------------- + Boot-time Configuration + -------------------------------------------------------------------------- */ +@@ -224,6 +230,8 @@ + /* no utility in registering a disabled processor */ + if (processor->flags.enabled == 0) + return 0; ++ ++ x86_acpiid_to_apicid[processor->acpi_id] = processor->id; + + mp_register_lapic ( + processor->id, /* APIC ID */ +diff -Nru a/arch/i386/kernel/acpi/sleep.c b/arch/i386/kernel/acpi/sleep.c +--- a/arch/i386/kernel/acpi/sleep.c 2004-09-21 21:26:34 +10:00 ++++ b/arch/i386/kernel/acpi/sleep.c 2004-09-21 21:26:34 +10:00 +@@ -77,10 +77,7 @@ + printk(KERN_ERR "ACPI: Wakeup code way too big, S3 disabled.\n"); + return; + } +-#ifdef CONFIG_X86_PAE +- printk(KERN_ERR "ACPI: S3 and PAE do not like each other for now, S3 disabled.\n"); +- return; +-#endif ++ + acpi_wakeup_address = (unsigned long)alloc_bootmem_low(PAGE_SIZE); + if (!acpi_wakeup_address) + printk(KERN_ERR "ACPI: Cannot allocate lowmem, S3 disabled.\n"); +diff -Nru a/arch/i386/kernel/cpu/cpufreq/acpi.c b/arch/i386/kernel/cpu/cpufreq/acpi.c +--- a/arch/i386/kernel/cpu/cpufreq/acpi.c 2004-09-21 21:26:34 +10:00 ++++ b/arch/i386/kernel/cpu/cpufreq/acpi.c 2004-09-21 21:26:34 +10:00 +@@ -108,13 +108,27 @@ + u32 value = 0; + int i = 0; + struct cpufreq_freqs cpufreq_freqs; ++ cpumask_t saved_mask; ++ int retval; + + ACPI_FUNCTION_TRACE("acpi_processor_set_performance"); + ++ /* ++ * TBD: Use something other than set_cpus_allowed. ++ * As set_cpus_allowed is a bit racy, ++ * with any other set_cpus_allowed for this process. ++ */ ++ saved_mask = current->cpus_allowed; ++ set_cpus_allowed(current, cpumask_of_cpu(cpu)); ++ if (smp_processor_id() != cpu) { ++ return_VALUE(-EAGAIN); ++ } ++ + if (state == data->acpi_data.state) { + ACPI_DEBUG_PRINT((ACPI_DB_INFO, + "Already at target state (P%d)\n", state)); +- return_VALUE(0); ++ retval = 0; ++ goto migrate_end; + } + + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Transitioning from P%d to P%d\n", +@@ -144,7 +158,8 @@ + if (ret) { + ACPI_DEBUG_PRINT((ACPI_DB_WARN, + "Invalid port width 0x%04x\n", bit_width)); +- return_VALUE(ret); ++ retval = ret; ++ goto migrate_end; + } + + /* +@@ -166,7 +181,8 @@ + if (ret) { + ACPI_DEBUG_PRINT((ACPI_DB_WARN, + "Invalid port width 0x%04x\n", bit_width)); +- return_VALUE(ret); ++ retval = ret; ++ goto migrate_end; + } + if (value == (u32) data->acpi_data.states[state].status) + break; +@@ -183,7 +199,8 @@ + cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_PRECHANGE); + cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_POSTCHANGE); + ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Transition failed\n")); +- return_VALUE(-ENODEV); ++ retval = -ENODEV; ++ goto migrate_end; + } + + ACPI_DEBUG_PRINT((ACPI_DB_INFO, +@@ -192,7 +209,10 @@ + + data->acpi_data.state = state; + +- return_VALUE(0); ++ retval = 0; ++migrate_end: ++ set_cpus_allowed(current, saved_mask); ++ return_VALUE(retval); + } + + +@@ -266,6 +286,69 @@ + + } + ++ ++/* ++ * acpi_processor_cpu_init_pdc_est - let BIOS know about the SMP capabilities ++ * of this driver ++ * @perf: processor-specific acpi_io_data struct ++ * @cpu: CPU being initialized ++ * ++ * To avoid issues with legacy OSes, some BIOSes require to be informed of ++ * the SMP capabilities of OS P-state driver. Here we set the bits in _PDC ++ * accordingly, for Enhanced Speedstep. Actual call to _PDC is done in ++ * driver/acpi/processor.c ++ */ ++static void ++acpi_processor_cpu_init_pdc_est( ++ struct acpi_processor_performance *perf, ++ unsigned int cpu, ++ struct acpi_object_list *obj_list ++ ) ++{ ++ union acpi_object *obj; ++ u32 *buf; ++ struct cpuinfo_x86 *c = cpu_data + cpu; ++ ACPI_FUNCTION_TRACE("acpi_processor_cpu_init_pdc_est"); ++ ++ if (!cpu_has(c, X86_FEATURE_EST)) ++ return_VOID; ++ ++ /* Initialize pdc. It will be used later. */ ++ if (!obj_list) ++ return_VOID; ++ ++ if (!(obj_list->count && obj_list->pointer)) ++ return_VOID; ++ ++ obj = obj_list->pointer; ++ if ((obj->buffer.length == 12) && obj->buffer.pointer) { ++ buf = (u32 *)obj->buffer.pointer; ++ buf[0] = ACPI_PDC_REVISION_ID; ++ buf[1] = 1; ++ buf[2] = ACPI_PDC_EST_CAPABILITY_SMP; ++ perf->pdc = obj_list; ++ } ++ return_VOID; ++} ++ ++ ++/* CPU specific PDC initialization */ ++static void ++acpi_processor_cpu_init_pdc( ++ struct acpi_processor_performance *perf, ++ unsigned int cpu, ++ struct acpi_object_list *obj_list ++ ) ++{ ++ struct cpuinfo_x86 *c = cpu_data + cpu; ++ ACPI_FUNCTION_TRACE("acpi_processor_cpu_init_pdc"); ++ perf->pdc = NULL; ++ if (cpu_has(c, X86_FEATURE_EST)) ++ acpi_processor_cpu_init_pdc_est(perf, cpu, obj_list); ++ return_VOID; ++} ++ ++ + static int + acpi_cpufreq_cpu_init ( + struct cpufreq_policy *policy) +@@ -275,7 +358,14 @@ + struct cpufreq_acpi_io *data; + unsigned int result = 0; + ++ union acpi_object arg0 = {ACPI_TYPE_BUFFER}; ++ u32 arg0_buf[3]; ++ struct acpi_object_list arg_list = {1, &arg0}; ++ + ACPI_FUNCTION_TRACE("acpi_cpufreq_cpu_init"); ++ /* setup arg_list for _PDC settings */ ++ arg0.buffer.length = 12; ++ arg0.buffer.pointer = (u8 *) arg0_buf; + + data = kmalloc(sizeof(struct cpufreq_acpi_io), GFP_KERNEL); + if (!data) +@@ -284,7 +374,10 @@ + + acpi_io_data[cpu] = data; + ++ acpi_processor_cpu_init_pdc(&data->acpi_data, cpu, &arg_list); + result = acpi_processor_register_performance(&data->acpi_data, cpu); ++ data->acpi_data.pdc = NULL; ++ + if (result) + goto err_free; + +diff -Nru a/arch/i386/kernel/dmi_scan.c b/arch/i386/kernel/dmi_scan.c +--- a/arch/i386/kernel/dmi_scan.c 2004-09-21 21:26:34 +10:00 ++++ b/arch/i386/kernel/dmi_scan.c 2004-09-21 21:26:34 +10:00 +@@ -163,27 +163,6 @@ + #define MATCH DMI_MATCH + + /* +- * Some machines, usually laptops, can't handle an enabled local APIC. +- * The symptoms include hangs or reboots when suspending or resuming, +- * attaching or detaching the power cord, or entering BIOS setup screens +- * through magic key sequences. +- */ +-static int __init local_apic_kills_bios(struct dmi_blacklist *d) +-{ +-#ifdef CONFIG_X86_LOCAL_APIC +- extern int enable_local_apic; +- if (enable_local_apic == 0) { +- enable_local_apic = -1; +- printk(KERN_WARNING "%s with broken BIOS detected. " +- "Refusing to enable the local APIC.\n", +- d->ident); +- } +-#endif +- return 0; +-} +- +- +-/* + * Toshiba keyboard likes to repeat keys when they are not repeated. + */ + +@@ -283,32 +262,6 @@ + */ + + static __initdata struct dmi_blacklist dmi_blacklist[]={ +- +- /* Machines which have problems handling enabled local APICs */ +- +- { local_apic_kills_bios, "Dell Inspiron", { +- MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"), +- MATCH(DMI_PRODUCT_NAME, "Inspiron"), +- NO_MATCH, NO_MATCH +- } }, +- +- { local_apic_kills_bios, "Dell Latitude", { +- MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"), +- MATCH(DMI_PRODUCT_NAME, "Latitude"), +- NO_MATCH, NO_MATCH +- } }, +- +- { local_apic_kills_bios, "IBM Thinkpad T20", { +- MATCH(DMI_BOARD_VENDOR, "IBM"), +- MATCH(DMI_BOARD_NAME, "264741U"), +- NO_MATCH, NO_MATCH +- } }, +- +- { local_apic_kills_bios, "ASUS L3C", { +- MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), +- MATCH(DMI_BOARD_NAME, "P4_L3C"), +- NO_MATCH, NO_MATCH +- } }, + + { broken_toshiba_keyboard, "Toshiba Satellite 4030cdt", { /* Keyboard generates spurious repeats */ + MATCH(DMI_PRODUCT_NAME, "S4030CDT/4.3"), +diff -Nru a/arch/i386/kernel/i8259.c b/arch/i386/kernel/i8259.c +--- a/arch/i386/kernel/i8259.c 2004-09-21 21:26:35 +10:00 ++++ b/arch/i386/kernel/i8259.c 2004-09-21 21:26:35 +10:00 +@@ -238,14 +238,39 @@ + } + } + ++static char irq_trigger[2]; ++/** ++ * ELCR registers (0x4d0, 0x4d1) control edge/level of IRQ ++ */ ++static void restore_ELCR(char *trigger) ++{ ++ outb(trigger[0], 0x4d0); ++ outb(trigger[1], 0x4d1); ++} ++ ++static void save_ELCR(char *trigger) ++{ ++ /* IRQ 0,1,2,8,13 are marked as reserved */ ++ trigger[0] = inb(0x4d0) & 0xF8; ++ trigger[1] = inb(0x4d1) & 0xDE; ++} ++ + static int i8259A_resume(struct sys_device *dev) + { + init_8259A(0); ++ restore_ELCR(irq_trigger); ++ return 0; ++} ++ ++static int i8259A_suspend(struct sys_device *dev, u32 state) ++{ ++ save_ELCR(irq_trigger); + return 0; + } + + static struct sysdev_class i8259_sysdev_class = { + set_kset_name("i8259"), ++ .suspend = i8259A_suspend, + .resume = i8259A_resume, + }; + +diff -Nru a/arch/i386/kernel/io_apic.c b/arch/i386/kernel/io_apic.c +--- a/arch/i386/kernel/io_apic.c 2004-09-21 21:26:34 +10:00 ++++ b/arch/i386/kernel/io_apic.c 2004-09-21 21:26:34 +10:00 +@@ -32,6 +32,7 @@ + #include + #include + ++#include + #include + #include + #include +@@ -2261,6 +2262,98 @@ + } + + late_initcall(io_apic_bug_finalize); ++ ++struct sysfs_ioapic_data { ++ struct sys_device dev; ++ struct IO_APIC_route_entry entry[0]; ++}; ++static struct sysfs_ioapic_data * mp_ioapic_data[MAX_IO_APICS]; ++ ++static int ioapic_suspend(struct sys_device *dev, u32 state) ++{ ++ struct IO_APIC_route_entry *entry; ++ struct sysfs_ioapic_data *data; ++ unsigned long flags; ++ int i; ++ ++ data = container_of(dev, struct sysfs_ioapic_data, dev); ++ entry = data->entry; ++ spin_lock_irqsave(&ioapic_lock, flags); ++ for (i = 0; i < nr_ioapic_registers[dev->id]; i ++, entry ++ ) { ++ *(((int *)entry) + 1) = io_apic_read(dev->id, 0x11 + 2 * i); ++ *(((int *)entry) + 0) = io_apic_read(dev->id, 0x10 + 2 * i); ++ } ++ spin_unlock_irqrestore(&ioapic_lock, flags); ++ ++ return 0; ++} ++ ++static int ioapic_resume(struct sys_device *dev) ++{ ++ struct IO_APIC_route_entry *entry; ++ struct sysfs_ioapic_data *data; ++ unsigned long flags; ++ union IO_APIC_reg_00 reg_00; ++ int i; ++ ++ data = container_of(dev, struct sysfs_ioapic_data, dev); ++ entry = data->entry; ++ ++ spin_lock_irqsave(&ioapic_lock, flags); ++ reg_00.raw = io_apic_read(dev->id, 0); ++ if (reg_00.bits.ID != mp_ioapics[dev->id].mpc_apicid) { ++ reg_00.bits.ID = mp_ioapics[dev->id].mpc_apicid; ++ io_apic_write(dev->id, 0, reg_00.raw); ++ } ++ for (i = 0; i < nr_ioapic_registers[dev->id]; i ++, entry ++ ) { ++ io_apic_write(dev->id, 0x11+2*i, *(((int *)entry)+1)); ++ io_apic_write(dev->id, 0x10+2*i, *(((int *)entry)+0)); ++ } ++ spin_unlock_irqrestore(&ioapic_lock, flags); ++ ++ return 0; ++} ++ ++static struct sysdev_class ioapic_sysdev_class = { ++ set_kset_name("ioapic"), ++ .suspend = ioapic_suspend, ++ .resume = ioapic_resume, ++}; ++ ++static int __init ioapic_init_sysfs(void) ++{ ++ struct sys_device * dev; ++ int i, size, error = 0; ++ ++ error = sysdev_class_register(&ioapic_sysdev_class); ++ if (error) ++ return error; ++ ++ for (i = 0; i < nr_ioapics; i++ ) { ++ size = sizeof(struct sys_device) + nr_ioapic_registers[i] ++ * sizeof(struct IO_APIC_route_entry); ++ mp_ioapic_data[i] = kmalloc(size, GFP_KERNEL); ++ if (!mp_ioapic_data[i]) { ++ printk(KERN_ERR "Can't suspend/resume IOAPIC %d\n", i); ++ continue; ++ } ++ memset(mp_ioapic_data[i], 0, size); ++ dev = &mp_ioapic_data[i]->dev; ++ dev->id = i; ++ dev->cls = &ioapic_sysdev_class; ++ error = sysdev_register(dev); ++ if (error) { ++ kfree(mp_ioapic_data[i]); ++ mp_ioapic_data[i] = NULL; ++ printk(KERN_ERR "Can't suspend/resume IOAPIC %d\n", i); ++ continue; ++ } ++ } ++ ++ return 0; ++} ++ ++device_initcall(ioapic_init_sysfs); + + /* -------------------------------------------------------------------------- + ACPI-based IOAPIC Configuration +diff -Nru a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c +--- a/arch/i386/kernel/setup.c 2004-09-21 21:26:34 +10:00 ++++ b/arch/i386/kernel/setup.c 2004-09-21 21:26:34 +10:00 +@@ -49,6 +49,7 @@ + #include + #include + #include "setup_arch_pre.h" ++#include + + /* This value is set up by the early boot code to point to the value + immediately after the boot time page tables. It contains a *physical* +@@ -991,6 +992,17 @@ + } + } + ++/* ++ * workaround for Dell systems that neglect to reserve EBDA ++ */ ++static void __init reserve_ebda_region(void) ++{ ++ unsigned int addr; ++ addr = get_bios_ebda(); ++ if (addr) ++ reserve_bootmem(addr, PAGE_SIZE); ++} ++ + static unsigned long __init setup_memory(void) + { + unsigned long bootmap_size, start_pfn, max_low_pfn; +@@ -1036,6 +1048,9 @@ + * enabling clean reboots, SMP operation, laptop functions. + */ + reserve_bootmem(0, PAGE_SIZE); ++ ++ /* reserve EBDA region, it's a 4K region */ ++ reserve_ebda_region(); + + /* could be an AMD 768MPX chipset. Reserve a page before VGA to prevent + PCI prefetch into it (errata #56). Usually the page is reserved anyways, +diff -Nru a/arch/i386/kernel/smpboot.c b/arch/i386/kernel/smpboot.c +--- a/arch/i386/kernel/smpboot.c 2004-09-21 21:26:34 +10:00 ++++ b/arch/i386/kernel/smpboot.c 2004-09-21 21:26:34 +10:00 +@@ -72,6 +72,10 @@ + /* Per CPU bogomips and other parameters */ + struct cpuinfo_x86 cpu_data[NR_CPUS] __cacheline_aligned; + ++u8 x86_cpu_to_apicid[NR_CPUS] = ++ { [0 ... NR_CPUS-1] = 0xff }; ++EXPORT_SYMBOL(x86_cpu_to_apicid); ++ + /* Set when the idlers are all forked */ + int smp_threads_ready; + +@@ -875,6 +879,7 @@ + inquire_remote_apic(apicid); + } + } ++ x86_cpu_to_apicid[cpu] = apicid; + if (boot_error) { + /* Try to put things back the way they were before ... */ + unmap_cpu_to_logical_apicid(cpu); +@@ -957,6 +962,7 @@ + + boot_cpu_physical_apicid = GET_APIC_ID(apic_read(APIC_ID)); + boot_cpu_logical_apicid = logical_smp_processor_id(); ++ x86_cpu_to_apicid[0] = boot_cpu_physical_apicid; + + current_thread_info()->cpu = 0; + smp_tune_scheduling(); +diff -Nru a/arch/i386/mm/discontig.c b/arch/i386/mm/discontig.c +--- a/arch/i386/mm/discontig.c 2004-09-21 21:26:34 +10:00 ++++ b/arch/i386/mm/discontig.c 2004-09-21 21:26:34 +10:00 +@@ -31,6 +31,7 @@ + #include + #include + #include ++#include + + struct pglist_data *node_data[MAX_NUMNODES]; + bootmem_data_t node0_bdata; +@@ -219,6 +220,17 @@ + return reserve_pages; + } + ++/* ++ * workaround for Dell systems that neglect to reserve EBDA ++ */ ++static void __init reserve_ebda_region_node(void) ++{ ++ unsigned int addr; ++ addr = get_bios_ebda(); ++ if (addr) ++ reserve_bootmem_node(NODE_DATA(0), addr, PAGE_SIZE); ++} ++ + unsigned long __init setup_memory(void) + { + int nid; +@@ -317,6 +329,9 @@ + * trampoline before removing it. (see the GDT stuff) + */ + reserve_bootmem_node(NODE_DATA(0), PAGE_SIZE, PAGE_SIZE); ++ ++ /* reserve EBDA region, it's a 4K region */ ++ reserve_ebda_region_node(); + + #ifdef CONFIG_ACPI_SLEEP + /* +diff -Nru a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c +--- a/arch/ia64/kernel/acpi.c 2004-09-21 21:26:34 +10:00 ++++ b/arch/ia64/kernel/acpi.c 2004-09-21 21:26:34 +10:00 +@@ -65,6 +65,11 @@ + unsigned char acpi_kbd_controller_present = 1; + unsigned char acpi_legacy_devices; + ++#define MAX_SAPICS 256 ++u16 ia64_acpiid_to_sapicid[MAX_SAPICS] = ++ { [0 ... MAX_SAPICS - 1] = -1 }; ++EXPORT_SYMBOL(ia64_acpiid_to_sapicid); ++ + const char * + acpi_get_sysname (void) + { +@@ -193,6 +198,7 @@ + #ifdef CONFIG_SMP + smp_boot_data.cpu_phys_id[available_cpus] = (lsapic->id << 8) | lsapic->eid; + #endif ++ ia64_acpiid_to_sapicid[lsapic->acpi_id] = (lsapic->id << 8) | lsapic->eid; + ++available_cpus; + } + +diff -Nru a/arch/x86_64/kernel/i8259.c b/arch/x86_64/kernel/i8259.c +--- a/arch/x86_64/kernel/i8259.c 2004-09-21 21:26:34 +10:00 ++++ b/arch/x86_64/kernel/i8259.c 2004-09-21 21:26:34 +10:00 +@@ -342,7 +342,7 @@ + } + } + +-void __init init_8259A(int auto_eoi) ++void init_8259A(int auto_eoi) + { + unsigned long flags; + +@@ -384,6 +384,57 @@ + + spin_unlock_irqrestore(&i8259A_lock, flags); + } ++ ++static char irq_trigger[2]; ++/** ++ * ELCR registers (0x4d0, 0x4d1) control edge/level of IRQ ++ */ ++static void restore_ELCR(char *trigger) ++{ ++ outb(trigger[0], 0x4d0); ++ outb(trigger[1], 0x4d1); ++} ++ ++static void save_ELCR(char *trigger) ++{ ++ /* IRQ 0,1,2,8,13 are marked as reserved */ ++ trigger[0] = inb(0x4d0) & 0xF8; ++ trigger[1] = inb(0x4d1) & 0xDE; ++} ++ ++static int i8259A_resume(struct sys_device *dev) ++{ ++ init_8259A(0); ++ restore_ELCR(irq_trigger); ++ return 0; ++} ++ ++static int i8259A_suspend(struct sys_device *dev, u32 state) ++{ ++ save_ELCR(irq_trigger); ++ return 0; ++} ++ ++static struct sysdev_class i8259_sysdev_class = { ++ set_kset_name("i8259"), ++ .suspend = i8259A_suspend, ++ .resume = i8259A_resume, ++}; ++ ++static struct sys_device device_i8259A = { ++ .id = 0, ++ .cls = &i8259_sysdev_class, ++}; ++ ++static int __init i8259A_init_sysfs(void) ++{ ++ int error = sysdev_class_register(&i8259_sysdev_class); ++ if (!error) ++ error = sysdev_register(&device_i8259A); ++ return error; ++} ++ ++device_initcall(i8259A_init_sysfs); + + /* + * IRQ2 is cascade interrupt to second interrupt controller +diff -Nru a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c +--- a/arch/x86_64/kernel/setup.c 2004-09-21 21:26:34 +10:00 ++++ b/arch/x86_64/kernel/setup.c 2004-09-21 21:26:34 +10:00 +@@ -423,6 +423,20 @@ + } + #endif + ++#define EBDA_ADDR_POINTER 0x40E ++static void __init reserve_ebda_region(void) ++{ ++ unsigned int addr; ++ /** ++ * there is a real-mode segmented pointer pointing to the ++ * 4K EBDA area at 0x40E ++ */ ++ addr = *(unsigned short *)phys_to_virt(EBDA_ADDR_POINTER); ++ addr <<= 4; ++ if (addr) ++ reserve_bootmem_generic(addr, PAGE_SIZE); ++} ++ + void __init setup_arch(char **cmdline_p) + { + unsigned long low_mem_size; +@@ -486,6 +500,9 @@ + * enabling clean reboots, SMP operation, laptop functions. + */ + reserve_bootmem_generic(0, PAGE_SIZE); ++ ++ /* reserve ebda region */ ++ reserve_ebda_region(); + + #ifdef CONFIG_SMP + /* +diff -Nru a/arch/x86_64/kernel/smpboot.c b/arch/x86_64/kernel/smpboot.c +--- a/arch/x86_64/kernel/smpboot.c 2004-09-21 21:26:35 +10:00 ++++ b/arch/x86_64/kernel/smpboot.c 2004-09-21 21:26:35 +10:00 +@@ -43,6 +43,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -62,6 +63,7 @@ + + /* which logical CPU number maps to which CPU (physical APIC ID) */ + volatile char x86_cpu_to_apicid[NR_CPUS]; ++EXPORT_SYMBOL(x86_cpu_to_apicid); + + static cpumask_t cpu_callin_map; + cpumask_t cpu_callout_map; +diff -Nru a/drivers/acpi/Makefile b/drivers/acpi/Makefile +--- a/drivers/acpi/Makefile 2004-09-21 21:26:35 +10:00 ++++ b/drivers/acpi/Makefile 2004-09-21 21:26:35 +10:00 +@@ -47,4 +47,4 @@ + obj-$(CONFIG_ACPI_NUMA) += numa.o + obj-$(CONFIG_ACPI_ASUS) += asus_acpi.o + obj-$(CONFIG_ACPI_TOSHIBA) += toshiba_acpi.o +-obj-$(CONFIG_ACPI_BUS) += scan.o ++obj-$(CONFIG_ACPI_BUS) += scan.o motherboard.o +diff -Nru a/drivers/acpi/acpi_ksyms.c b/drivers/acpi/acpi_ksyms.c +--- a/drivers/acpi/acpi_ksyms.c 2004-09-21 21:26:35 +10:00 ++++ b/drivers/acpi/acpi_ksyms.c 2004-09-21 21:26:35 +10:00 +@@ -84,6 +84,8 @@ + EXPORT_SYMBOL(acpi_enable_event); + EXPORT_SYMBOL(acpi_disable_event); + EXPORT_SYMBOL(acpi_clear_event); ++EXPORT_SYMBOL(acpi_set_gpe_type); ++EXPORT_SYMBOL(acpi_enable_gpe); + EXPORT_SYMBOL(acpi_get_timer_duration); + EXPORT_SYMBOL(acpi_get_timer); + EXPORT_SYMBOL(acpi_get_sleep_type_data); +diff -Nru a/drivers/acpi/asus_acpi.c b/drivers/acpi/asus_acpi.c +--- a/drivers/acpi/asus_acpi.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/asus_acpi.c 2004-09-21 21:26:34 +10:00 +@@ -123,14 +123,16 @@ + L3C, //L3800C + L3D, //L3400D + L3H, //L3H, but also L2000E ++ L4R, //L4500R + L5x, //L5800C + L8L, //L8400L + M1A, //M1300A + M2E, //M2400E, L4400L ++ M6N, //M6800N + P30, //Samsung P30 + S1x, //S1300A, but also L1400B and M2400A (L84F) + S2x, //S200 (J1 reported), Victor MP-XP7210 +- xxN, //M2400N, M3700N, M6800N, S1300N, S5200N (Centrino) ++ xxN, //M2400N, M3700N, M5200N, S1300N, S5200N (Centrino) + END_MODEL + } model; //Models currently supported + u16 event_count[128]; //count for each event TODO make this better +@@ -247,6 +249,19 @@ + }, + + { ++ .name = "L4R", ++ .mt_mled = "MLED", ++ .mt_wled = "WLED", ++ .wled_status = "\\_SB.PCI0.SBRG.SG13", ++ .mt_lcd_switch = xxN_PREFIX "_Q10", ++ .lcd_status = "\\_SB.PCI0.SBSM.SEO4", ++ .brightness_set = "SPLV", ++ .brightness_get = "GPLV", ++ .display_set = "SDSP", ++ .display_get = "\\_SB.PCI0.P0P1.VGA.GETD" ++ }, ++ ++ { + .name = "L5x", + .mt_mled = "MLED", + /* WLED present, but not controlled by ACPI */ +@@ -289,6 +304,19 @@ + }, + + { ++ .name = "M6N", ++ .mt_mled = "MLED", ++ .mt_wled = "WLED", ++ .wled_status = "\\_SB.PCI0.SBRG.SG13", ++ .mt_lcd_switch = xxN_PREFIX "_Q10", ++ .lcd_status = "\\_SB.BKLT", ++ .brightness_set = "SPLV", ++ .brightness_get = "GPLV", ++ .display_set = "SDSP", ++ .display_get = "\\SSTE" ++ }, ++ ++ { + .name = "P30", + .mt_wled = "WLED", + .mt_lcd_switch = P30_PREFIX "_Q0E", +@@ -428,7 +456,7 @@ + len += sprintf(page + len, "SFUN value : 0x%04x\n", temp); + /* + * Another value for userspace: the ASYM method returns 0x02 for +- * battery low and 0x04 for battery critical, it's readings tend to be ++ * battery low and 0x04 for battery critical, its readings tend to be + * more accurate than those provided by _BST. + * Note: since not all the laptops provide this method, errors are + * silently ignored. +@@ -580,7 +608,6 @@ + } + + +- + static int get_lcd_state(struct asus_hotk *hotk) + { + int lcd = 0; +@@ -764,6 +791,7 @@ + + if (!read_acpi_int(hotk->handle, hotk->methods->display_get, &value)) + printk(KERN_WARNING "Asus ACPI: Error reading display status\n"); ++ value &= 0x07; /* needed for some models, shouldn't hurt others */ + return sprintf(page, "%d\n", value); + } + +@@ -869,13 +897,12 @@ + } + + if ((hotk->methods->brightness_up && hotk->methods->brightness_down) || +- (hotk->methods->brightness_get && hotk->methods->brightness_get)) { ++ (hotk->methods->brightness_get && hotk->methods->brightness_set)) { + asus_proc_add(PROC_BRN, &proc_write_brn, &proc_read_brn, mode, device); + } + + if (hotk->methods->display_set) { + asus_proc_add(PROC_DISP, &proc_write_disp, &proc_read_disp, mode, device); +- + } + + return 0; +@@ -886,7 +913,7 @@ + struct asus_hotk* hotk = acpi_driver_data(device); + + +- if(acpi_device_dir(device)){ ++ if(acpi_device_dir(device)) { + remove_proc_entry(PROC_INFO,acpi_device_dir(device)); + if (hotk->methods->mt_wled) + remove_proc_entry(PROC_WLED,acpi_device_dir(device)); +@@ -894,11 +921,12 @@ + remove_proc_entry(PROC_MLED,acpi_device_dir(device)); + if (hotk->methods->mt_tled) + remove_proc_entry(PROC_TLED,acpi_device_dir(device)); +- if (hotk->methods->mt_lcd_switch && hotk->methods->lcd_status) ++ if (hotk->methods->mt_lcd_switch && hotk->methods->lcd_status) + remove_proc_entry(PROC_LCD, acpi_device_dir(device)); +- if ((hotk->methods->brightness_up && hotk->methods->brightness_down) || (hotk->methods->brightness_get && hotk->methods->brightness_get)) ++ if ((hotk->methods->brightness_up && hotk->methods->brightness_down) || ++ (hotk->methods->brightness_get && hotk->methods->brightness_set)) + remove_proc_entry(PROC_BRN, acpi_device_dir(device)); +- if (hotk->methods->display_set) ++ if (hotk->methods->display_set) + remove_proc_entry(PROC_DISP, acpi_device_dir(device)); + } + return 0; +@@ -998,8 +1026,13 @@ + hotk->model = L3C; + else if (strncmp(model->string.pointer, "L8L", 3) == 0) + hotk->model = L8L; ++ else if (strncmp(model->string.pointer, "L4R", 3) == 0) ++ hotk->model = L4R; ++ else if (strncmp(model->string.pointer, "M6N", 3) == 0) ++ hotk->model = M6N; + else if (strncmp(model->string.pointer, "M2N", 3) == 0 || + strncmp(model->string.pointer, "M3N", 3) == 0 || ++ strncmp(model->string.pointer, "M5N", 3) == 0 || + strncmp(model->string.pointer, "M6N", 3) == 0 || + strncmp(model->string.pointer, "S1N", 3) == 0 || + strncmp(model->string.pointer, "S5N", 3) == 0) +@@ -1025,7 +1058,6 @@ + hotk->model = L5x; + + if (hotk->model == END_MODEL) { +- /* By default use the same values, as I don't know others */ + printk("unsupported, trying default values, supply the " + "developers with your DSDT\n"); + hotk->model = M2E; +@@ -1043,13 +1075,9 @@ + else if (strncmp(model->string.pointer, "S5N", 3) == 0) + hotk->methods->mt_mled = NULL; + /* S5N has no MLED */ +- else if (strncmp(model->string.pointer, "M6N", 3) == 0) { +- hotk->methods->display_get = NULL; //TODO +- hotk->methods->lcd_status = "\\_SB.BKLT"; +- hotk->methods->mt_wled = "WLED"; +- hotk->methods->wled_status = "\\_SB.PCI0.SBRG.SG13"; +- /* M6N differs slightly and has a usable WLED */ +- } ++ else if (strncmp(model->string.pointer, "M2N", 3) == 0) ++ hotk->methods->mt_wled = "WLED"; ++ /* M2N has a usable WLED */ + else if (asus_info) { + if (strncmp(asus_info->oem_table_id, "L1", 2) == 0) + hotk->methods->mled_status = NULL; +@@ -1062,7 +1090,6 @@ + } + + +- + static int __init asus_hotk_check(struct asus_hotk *hotk) + { + int result = 0; +@@ -1085,7 +1112,6 @@ + } + + +- + static int __init asus_hotk_add(struct acpi_device *device) + { + struct asus_hotk *hotk = NULL; +@@ -1151,6 +1177,7 @@ + + return(result); + } ++ + + static int asus_hotk_remove(struct acpi_device *device, int type) + { +diff -Nru a/drivers/acpi/blacklist.c b/drivers/acpi/blacklist.c +--- a/drivers/acpi/blacklist.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/blacklist.c 2004-09-21 21:26:34 +10:00 +@@ -56,20 +56,6 @@ + */ + static struct acpi_blacklist_item acpi_blacklist[] __initdata = + { +- /* Portege 7020, BIOS 8.10 */ +- {"TOSHIB", "7020CT ", 0x19991112, ACPI_DSDT, all_versions, "Implicit Return", 0}, +- /* Portege 4030 */ +- {"TOSHIB", "4030 ", 0x19991112, ACPI_DSDT, all_versions, "Implicit Return", 0}, +- /* Portege 310/320, BIOS 7.1 */ +- {"TOSHIB", "310 ", 0x19990511, ACPI_DSDT, all_versions, "Implicit Return", 0}, +- /* Seattle 2, old bios rev. */ +- {"INTEL ", "440BX ", 0x00001000, ACPI_DSDT, less_than_or_equal, "Field beyond end of region", 0}, +- /* ASUS K7M */ +- {"ASUS ", "K7M ", 0x00001000, ACPI_DSDT, less_than_or_equal, "Field beyond end of region", 0}, +- /* Intel 810 Motherboard? */ +- {"MNTRAL", "MO81010A", 0x00000012, ACPI_DSDT, less_than_or_equal, "Field beyond end of region", 0}, +- /* Compaq Presario 711FR */ +- {"COMAPQ", "EAGLES", 0x06040000, ACPI_DSDT, less_than_or_equal, "SCI issues (C2 disabled)", 0}, + /* Compaq Presario 1700 */ + {"PTLTD ", " DSDT ", 0x06040000, ACPI_DSDT, less_than_or_equal, "Multiple problems", 1}, + /* Sony FX120, FX140, FX150? */ +diff -Nru a/drivers/acpi/bus.c b/drivers/acpi/bus.c +--- a/drivers/acpi/bus.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/bus.c 2004-09-21 21:26:34 +10:00 +@@ -590,15 +590,18 @@ + } + + +-static int __init +-acpi_bus_init (void) ++void __init ++acpi_early_init (void) + { +- int result = 0; + acpi_status status = AE_OK; + struct acpi_buffer buffer = {sizeof(acpi_fadt), &acpi_fadt}; + + ACPI_FUNCTION_TRACE("acpi_bus_init"); + ++ /* enable workarounds, unless strict ACPI spec. compliance */ ++ if (!acpi_strict) ++ acpi_gbl_enable_interpreter_slack = TRUE; ++ + status = acpi_initialize_subsystem(); + if (ACPI_FAILURE(status)) { + printk(KERN_ERR PREFIX "Unable to initialize the ACPI Interpreter\n"); +@@ -617,7 +620,7 @@ + status = acpi_get_table(ACPI_TABLE_FADT, 1, &buffer); + if (ACPI_FAILURE(status)) { + printk(KERN_ERR PREFIX "Unable to get the FADT\n"); +- goto error1; ++ goto error0; + } + + #ifdef CONFIG_X86 +@@ -640,12 +643,40 @@ + } + #endif + +- status = acpi_enable_subsystem(ACPI_FULL_INITIALIZATION); ++ status = acpi_enable_subsystem(~(ACPI_NO_HARDWARE_INIT | ACPI_NO_ACPI_ENABLE)); ++ if (ACPI_FAILURE(status)) { ++ printk(KERN_ERR PREFIX "Unable to enable ACPI\n"); ++ goto error0; ++ } ++ ++ return; ++ ++error0: ++ disable_acpi(); ++ return; ++} ++ ++static int __init ++acpi_bus_init (void) ++{ ++ int result = 0; ++ acpi_status status = AE_OK; ++ extern acpi_status acpi_os_initialize1(void); ++ ++ ACPI_FUNCTION_TRACE("acpi_bus_init"); ++ ++ status = acpi_os_initialize1(); ++ ++ status = acpi_enable_subsystem(ACPI_NO_HARDWARE_INIT | ACPI_NO_ACPI_ENABLE); + if (ACPI_FAILURE(status)) { + printk(KERN_ERR PREFIX "Unable to start the ACPI Interpreter\n"); + goto error1; + } + ++ if (ACPI_FAILURE(status)) { ++ printk(KERN_ERR PREFIX "Unable to initialize ACPI OS objects\n"); ++ goto error1; ++ } + #ifdef CONFIG_ACPI_EC + /* + * ACPI 2.0 requires the EC driver to be loaded and work before +@@ -693,7 +724,6 @@ + /* Mimic structured exception handling */ + error1: + acpi_terminate(); +-error0: + return_VALUE(-ENODEV); + } + +diff -Nru a/drivers/acpi/button.c b/drivers/acpi/button.c +--- a/drivers/acpi/button.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/button.c 2004-09-21 21:26:34 +10:00 +@@ -456,6 +456,15 @@ + goto end; + } + ++ if (device->wakeup.flags.valid) { ++ /* Button's GPE is run-wake GPE */ ++ acpi_set_gpe_type(device->wakeup.gpe_device, ++ device->wakeup.gpe_number, ACPI_GPE_TYPE_WAKE_RUN); ++ acpi_enable_gpe(device->wakeup.gpe_device, ++ device->wakeup.gpe_number, ACPI_NOT_ISR); ++ device->wakeup.state.enabled = 1; ++ } ++ + printk(KERN_INFO PREFIX "%s [%s]\n", + acpi_device_name(device), acpi_device_bid(device)); + +diff -Nru a/drivers/acpi/dispatcher/dsmethod.c b/drivers/acpi/dispatcher/dsmethod.c +--- a/drivers/acpi/dispatcher/dsmethod.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/dispatcher/dsmethod.c 2004-09-21 21:26:34 +10:00 +@@ -58,15 +58,12 @@ + * + * FUNCTION: acpi_ds_parse_method + * +- * PARAMETERS: obj_handle - Node of the method +- * Level - Current nesting level +- * Context - Points to a method counter +- * return_value - Not used ++ * PARAMETERS: obj_handle - Method node + * + * RETURN: Status + * +- * DESCRIPTION: Call the parser and parse the AML that is +- * associated with the method. ++ * DESCRIPTION: Call the parser and parse the AML that is associated with the ++ * method. + * + * MUTEX: Assumes parser is locked + * +@@ -145,8 +142,9 @@ + return_ACPI_STATUS (AE_NO_MEMORY); + } + +- status = acpi_ds_init_aml_walk (walk_state, op, node, obj_desc->method.aml_start, +- obj_desc->method.aml_length, NULL, NULL, 1); ++ status = acpi_ds_init_aml_walk (walk_state, op, node, ++ obj_desc->method.aml_start, ++ obj_desc->method.aml_length, NULL, 1); + if (ACPI_FAILURE (status)) { + acpi_ds_delete_walk_state (walk_state); + return_ACPI_STATUS (status); +@@ -190,8 +188,6 @@ + * increments the thread count, and waits at the method semaphore + * for clearance to execute. + * +- * MUTEX: Locks/unlocks parser. +- * + ******************************************************************************/ + + acpi_status +@@ -250,7 +246,8 @@ + * + * FUNCTION: acpi_ds_call_control_method + * +- * PARAMETERS: walk_state - Current state of the walk ++ * PARAMETERS: Thread - Info for this thread ++ * this_walk_state - Current walk state + * Op - Current Op to be walked + * + * RETURN: Status +@@ -267,8 +264,9 @@ + { + acpi_status status; + struct acpi_namespace_node *method_node; +- union acpi_operand_object *obj_desc; + struct acpi_walk_state *next_walk_state; ++ union acpi_operand_object *obj_desc; ++ struct acpi_parameter_info info; + u32 i; + + +@@ -309,7 +307,6 @@ + return_ACPI_STATUS (AE_NO_MEMORY); + } + +- + /* Create and init a Root Node */ + + op = acpi_ps_create_scope_op (); +@@ -320,7 +317,7 @@ + + status = acpi_ds_init_aml_walk (next_walk_state, op, method_node, + obj_desc->method.aml_start, obj_desc->method.aml_length, +- NULL, NULL, 1); ++ NULL, 1); + if (ACPI_FAILURE (status)) { + acpi_ds_delete_walk_state (next_walk_state); + goto cleanup; +@@ -348,9 +345,12 @@ + */ + this_walk_state->operands [this_walk_state->num_operands] = NULL; + ++ info.parameters = &this_walk_state->operands[0]; ++ info.parameter_type = ACPI_PARAM_ARGS; ++ + status = acpi_ds_init_aml_walk (next_walk_state, NULL, method_node, + obj_desc->method.aml_start, obj_desc->method.aml_length, +- &this_walk_state->operands[0], NULL, 3); ++ &info, 3); + if (ACPI_FAILURE (status)) { + goto cleanup; + } +@@ -382,7 +382,7 @@ + /* On error, we must delete the new walk state */ + + cleanup: +- if (next_walk_state->method_desc) { ++ if (next_walk_state && (next_walk_state->method_desc)) { + /* Decrement the thread count on the method parse tree */ + + next_walk_state->method_desc->method.thread_count--; +@@ -397,12 +397,13 @@ + * + * FUNCTION: acpi_ds_restart_control_method + * +- * PARAMETERS: walk_state - State of the method when it was preempted +- * Op - Pointer to new current op ++ * PARAMETERS: walk_state - State for preempted method (caller) ++ * return_desc - Return value from the called method + * + * RETURN: Status + * +- * DESCRIPTION: Restart a method that was preempted ++ * DESCRIPTION: Restart a method that was preempted by another (nested) method ++ * invocation. Handle the return value (if any) from the callee. + * + ******************************************************************************/ + +@@ -417,17 +418,35 @@ + ACPI_FUNCTION_TRACE_PTR ("ds_restart_control_method", walk_state); + + ++ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, ++ "****Restart [%4.4s] Op %p return_value_from_callee %p\n", ++ (char *) &walk_state->method_node->name, walk_state->method_call_op, ++ return_desc)); ++ ++ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, ++ " return_from_this_method_used?=%X res_stack %p Walk %p\n", ++ walk_state->return_used, ++ walk_state->results, walk_state)); ++ ++ /* Did the called method return a value? */ ++ + if (return_desc) { ++ /* Are we actually going to use the return value? */ ++ + if (walk_state->return_used) { +- /* +- * Get the return value (if any) from the previous method. +- * NULL if no return value +- */ ++ /* Save the return value from the previous method */ ++ + status = acpi_ds_result_push (return_desc, walk_state); + if (ACPI_FAILURE (status)) { + acpi_ut_remove_reference (return_desc); + return_ACPI_STATUS (status); + } ++ ++ /* ++ * Save as THIS method's return value in case it is returned ++ * immediately to yet another method ++ */ ++ walk_state->return_desc = return_desc; + } + else { + /* +@@ -437,11 +456,6 @@ + acpi_ut_remove_reference (return_desc); + } + } +- +- ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, +- "Method=%p Return=%p return_used?=%X res_stack=%p State=%p\n", +- walk_state->method_call_op, return_desc, walk_state->return_used, +- walk_state->results, walk_state)); + + return_ACPI_STATUS (AE_OK); + } +diff -Nru a/drivers/acpi/dispatcher/dsmthdat.c b/drivers/acpi/dispatcher/dsmthdat.c +--- a/drivers/acpi/dispatcher/dsmthdat.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/dispatcher/dsmthdat.c 2004-09-21 21:26:34 +10:00 +@@ -656,11 +656,13 @@ + new_obj_desc, current_obj_desc)); + + /* +- * Store this object to the Node +- * (perform the indirect store) ++ * Store this object to the Node (perform the indirect store) ++ * NOTE: No implicit conversion is performed, as per the ACPI ++ * specification rules on storing to Locals/Args. + */ + status = acpi_ex_store_object_to_node (new_obj_desc, +- current_obj_desc->reference.object, walk_state); ++ current_obj_desc->reference.object, walk_state, ++ ACPI_NO_IMPLICIT_CONVERSION); + + /* Remove local reference if we copied the object above */ + +diff -Nru a/drivers/acpi/dispatcher/dsopcode.c b/drivers/acpi/dispatcher/dsopcode.c +--- a/drivers/acpi/dispatcher/dsopcode.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/dispatcher/dsopcode.c 2004-09-21 21:26:34 +10:00 +@@ -79,7 +79,6 @@ + acpi_status status; + union acpi_parse_object *op; + struct acpi_walk_state *walk_state; +- union acpi_parse_object *arg; + + + ACPI_FUNCTION_TRACE ("ds_execute_arguments"); +@@ -105,7 +104,7 @@ + } + + status = acpi_ds_init_aml_walk (walk_state, op, NULL, aml_start, +- aml_length, NULL, NULL, 1); ++ aml_length, NULL, 1); + if (ACPI_FAILURE (status)) { + acpi_ds_delete_walk_state (walk_state); + return_ACPI_STATUS (status); +@@ -126,9 +125,7 @@ + + /* Get and init the Op created above */ + +- arg = op->common.value.arg; + op->common.node = node; +- arg->common.node = node; + acpi_ps_delete_parse_tree (op); + + /* Evaluate the deferred arguments */ +@@ -150,7 +147,7 @@ + /* Execute the opcode and arguments */ + + status = acpi_ds_init_aml_walk (walk_state, op, NULL, aml_start, +- aml_length, NULL, NULL, 3); ++ aml_length, NULL, 3); + if (ACPI_FAILURE (status)) { + acpi_ds_delete_walk_state (walk_state); + return_ACPI_STATUS (status); +diff -Nru a/drivers/acpi/dispatcher/dsutils.c b/drivers/acpi/dispatcher/dsutils.c +--- a/drivers/acpi/dispatcher/dsutils.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/dispatcher/dsutils.c 2004-09-21 21:26:34 +10:00 +@@ -60,11 +60,10 @@ + * + * FUNCTION: acpi_ds_is_result_used + * +- * PARAMETERS: Op +- * result_obj +- * walk_state ++ * PARAMETERS: Op - Current Op ++ * walk_state - Current State + * +- * RETURN: Status ++ * RETURN: TRUE if result is used, FALSE otherwise + * + * DESCRIPTION: Check if a result object will be used by the parent + * +@@ -89,18 +88,39 @@ + } + + /* +- * If there is no parent, the result can't possibly be used! +- * (An executing method typically has no parent, since each +- * method is parsed separately) However, a method that is +- * invoked from another method has a parent. ++ * If there is no parent, we are executing at the method level. ++ * An executing method typically has no parent, since each method ++ * is parsed separately. + */ + if (!op->common.parent) { ++ /* ++ * If this is the last statement in the method, we know it is not a ++ * Return() operator (would not come here.) The following code is the ++ * optional support for a so-called "implicit return". Some AML code ++ * assumes that the last value of the method is "implicitly" returned ++ * to the caller. Just save the last result as the return value. ++ * NOTE: this is optional because the ASL language does not actually ++ * support this behavior. ++ */ ++ if ((acpi_gbl_enable_interpreter_slack) && ++ (walk_state->parser_state.aml >= walk_state->parser_state.aml_end)) { ++ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, ++ "Result of [%s] will be implicitly returned\n", ++ acpi_ps_get_opcode_name (op->common.aml_opcode))); ++ ++ /* Use the top of the result stack as the implicit return value */ ++ ++ walk_state->return_desc = walk_state->results->results.obj_desc[0]; ++ return_VALUE (TRUE); ++ } ++ ++ /* No parent, the return value cannot possibly be used */ ++ + return_VALUE (FALSE); + } + +- /* +- * Get info on the parent. The root Op is AML_SCOPE +- */ ++ /* Get info on the parent. The root_op is AML_SCOPE */ ++ + parent_info = acpi_ps_get_opcode_info (op->common.parent->common.aml_opcode); + if (parent_info->class == AML_CLASS_UNKNOWN) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown parent opcode. Op=%p\n", op)); +@@ -204,9 +224,9 @@ + * + * FUNCTION: acpi_ds_delete_result_if_not_used + * +- * PARAMETERS: Op +- * result_obj +- * walk_state ++ * PARAMETERS: Op - Current parse Op ++ * result_obj - Result of the operation ++ * walk_state - Current state + * + * RETURN: Status + * +@@ -338,8 +358,9 @@ + * + * FUNCTION: acpi_ds_create_operand + * +- * PARAMETERS: walk_state +- * Arg ++ * PARAMETERS: walk_state - Current walk state ++ * Arg - Parse object for the argument ++ * arg_index - Which argument (zero based) + * + * RETURN: Status + * +diff -Nru a/drivers/acpi/dispatcher/dswload.c b/drivers/acpi/dispatcher/dswload.c +--- a/drivers/acpi/dispatcher/dswload.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/dispatcher/dswload.c 2004-09-21 21:26:34 +10:00 +@@ -50,6 +50,9 @@ + #include + #include + ++#ifdef _ACPI_ASL_COMPILER ++#include ++#endif + + #define _COMPONENT ACPI_DISPATCHER + ACPI_MODULE_NAME ("dswload") +@@ -180,7 +183,17 @@ + status = acpi_ns_lookup (walk_state->scope_info, path, object_type, + ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, walk_state, &(node)); + if (ACPI_FAILURE (status)) { ++#ifdef _ACPI_ASL_COMPILER ++ if (status == AE_NOT_FOUND) { ++ acpi_dm_add_to_external_list (path); ++ status = AE_OK; ++ } ++ else { ++ ACPI_REPORT_NSERROR (path, status); ++ } ++#else + ACPI_REPORT_NSERROR (path, status); ++#endif + return (status); + } + +@@ -529,7 +542,16 @@ + status = acpi_ns_lookup (walk_state->scope_info, buffer_ptr, object_type, + ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, walk_state, &(node)); + if (ACPI_FAILURE (status)) { ++#ifdef _ACPI_ASL_COMPILER ++ if (status == AE_NOT_FOUND) { ++ status = AE_OK; ++ } ++ else { ++ ACPI_REPORT_NSERROR (buffer_ptr, status); ++ } ++#else + ACPI_REPORT_NSERROR (buffer_ptr, status); ++#endif + return_ACPI_STATUS (status); + } + /* +diff -Nru a/drivers/acpi/dispatcher/dswstate.c b/drivers/acpi/dispatcher/dswstate.c +--- a/drivers/acpi/dispatcher/dswstate.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/dispatcher/dswstate.c 2004-09-21 21:26:34 +10:00 +@@ -906,8 +906,7 @@ + struct acpi_namespace_node *method_node, + u8 *aml_start, + u32 aml_length, +- union acpi_operand_object **params, +- union acpi_operand_object **return_obj_desc, ++ struct acpi_parameter_info *info, + u32 pass_number) + { + acpi_status status; +@@ -926,8 +925,17 @@ + /* The next_op of the next_walk will be the beginning of the method */ + + walk_state->next_op = NULL; +- walk_state->params = params; +- walk_state->caller_return_desc = return_obj_desc; ++ ++ if (info) { ++ if (info->parameter_type == ACPI_PARAM_GPE) { ++ walk_state->gpe_event_info = ACPI_CAST_PTR (struct acpi_gpe_event_info, ++ info->parameters); ++ } ++ else { ++ walk_state->params = info->parameters; ++ walk_state->caller_return_desc = &info->return_object; ++ } ++ } + + status = acpi_ps_init_scope (&walk_state->parser_state, op); + if (ACPI_FAILURE (status)) { +@@ -949,7 +957,7 @@ + + /* Init the method arguments */ + +- status = acpi_ds_method_data_init_args (params, ACPI_METHOD_NUM_ARGS, walk_state); ++ status = acpi_ds_method_data_init_args (walk_state->params, ACPI_METHOD_NUM_ARGS, walk_state); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } +diff -Nru a/drivers/acpi/ec.c b/drivers/acpi/ec.c +--- a/drivers/acpi/ec.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/ec.c 2004-09-21 21:26:34 +10:00 +@@ -381,7 +381,7 @@ + acpi_enable_gpe(NULL, ec->gpe_bit, ACPI_NOT_ISR); + } + +-static void ++static u32 + acpi_ec_gpe_handler ( + void *data) + { +@@ -389,12 +389,17 @@ + struct acpi_ec *ec = (struct acpi_ec *) data; + + if (!ec) +- return; ++ return ACPI_INTERRUPT_NOT_HANDLED; + + acpi_disable_gpe(NULL, ec->gpe_bit, ACPI_ISR); + + status = acpi_os_queue_for_execution(OSD_PRIORITY_GPE, + acpi_ec_gpe_query, ec); ++ ++ if (status == AE_OK) ++ return ACPI_INTERRUPT_HANDLED; ++ else ++ return ACPI_INTERRUPT_NOT_HANDLED; + } + + /* -------------------------------------------------------------------------- +@@ -729,6 +734,8 @@ + if (ACPI_FAILURE(status)) { + return_VALUE(-ENODEV); + } ++ acpi_set_gpe_type (NULL, ec->gpe_bit, ACPI_GPE_TYPE_RUNTIME); ++ acpi_enable_gpe (NULL, ec->gpe_bit, ACPI_NOT_ISR); + + status = acpi_install_address_space_handler (ec->handle, + ACPI_ADR_SPACE_EC, &acpi_ec_space_handler, +@@ -814,6 +821,8 @@ + if (ACPI_FAILURE(status)) { + goto error; + } ++ acpi_set_gpe_type (NULL, ec_ecdt->gpe_bit, ACPI_GPE_TYPE_RUNTIME); ++ acpi_enable_gpe (NULL, ec_ecdt->gpe_bit, ACPI_NOT_ISR); + + status = acpi_install_address_space_handler (ACPI_ROOT_OBJECT, + ACPI_ADR_SPACE_EC, &acpi_ec_space_handler, +diff -Nru a/drivers/acpi/events/evevent.c b/drivers/acpi/events/evevent.c +--- a/drivers/acpi/events/evevent.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/events/evevent.c 2004-09-21 21:26:34 +10:00 +@@ -50,7 +50,7 @@ + + /******************************************************************************* + * +- * FUNCTION: acpi_ev_initialize ++ * FUNCTION: acpi_ev_initialize_events + * + * PARAMETERS: None + * +@@ -61,13 +61,13 @@ + ******************************************************************************/ + + acpi_status +-acpi_ev_initialize ( ++acpi_ev_initialize_events ( + void) + { + acpi_status status; + + +- ACPI_FUNCTION_TRACE ("ev_initialize"); ++ ACPI_FUNCTION_TRACE ("ev_initialize_events"); + + + /* Make sure we have ACPI tables */ +@@ -104,7 +104,7 @@ + + /******************************************************************************* + * +- * FUNCTION: acpi_ev_handler_initialize ++ * FUNCTION: acpi_ev_install_xrupt_handlers + * + * PARAMETERS: None + * +@@ -115,13 +115,13 @@ + ******************************************************************************/ + + acpi_status +-acpi_ev_handler_initialize ( ++acpi_ev_install_xrupt_handlers ( + void) + { + acpi_status status; + + +- ACPI_FUNCTION_TRACE ("ev_handler_initialize"); ++ ACPI_FUNCTION_TRACE ("ev_install_xrupt_handlers"); + + + /* Install the SCI handler */ +diff -Nru a/drivers/acpi/events/evgpe.c b/drivers/acpi/events/evgpe.c +--- a/drivers/acpi/events/evgpe.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/events/evgpe.c 2004-09-21 21:26:34 +10:00 +@@ -51,6 +51,253 @@ + + /******************************************************************************* + * ++ * FUNCTION: acpi_ev_set_gpe_type ++ * ++ * PARAMETERS: gpe_event_info - GPE to set ++ * Type - New type ++ * ++ * RETURN: Status ++ * ++ * DESCRIPTION: Sets the new type for the GPE (wake, run, or wake/run) ++ * ++ ******************************************************************************/ ++ ++acpi_status ++acpi_ev_set_gpe_type ( ++ struct acpi_gpe_event_info *gpe_event_info, ++ u8 type) ++{ ++ acpi_status status; ++ ++ ++ ACPI_FUNCTION_TRACE ("ev_set_gpe_type"); ++ ++ ++ /* Validate type and update register enable masks */ ++ ++ switch (type) { ++ case ACPI_GPE_TYPE_WAKE: ++ case ACPI_GPE_TYPE_RUNTIME: ++ case ACPI_GPE_TYPE_WAKE_RUN: ++ break; ++ ++ default: ++ return_ACPI_STATUS (AE_BAD_PARAMETER); ++ } ++ ++ /* Disable the GPE if currently enabled */ ++ ++ status = acpi_ev_disable_gpe (gpe_event_info); ++ ++ /* Type was validated above */ ++ ++ gpe_event_info->flags &= ~ACPI_GPE_TYPE_MASK; /* Clear type bits */ ++ gpe_event_info->flags |= type; /* Insert type */ ++ return_ACPI_STATUS (status); ++} ++ ++ ++/******************************************************************************* ++ * ++ * FUNCTION: acpi_ev_update_gpe_enable_masks ++ * ++ * PARAMETERS: gpe_event_info - GPE to update ++ * Type - What to do: ACPI_GPE_DISABLE or ++ * ACPI_GPE_ENABLE ++ * ++ * RETURN: Status ++ * ++ * DESCRIPTION: Updates GPE register enable masks based on the GPE type ++ * ++ ******************************************************************************/ ++ ++acpi_status ++acpi_ev_update_gpe_enable_masks ( ++ struct acpi_gpe_event_info *gpe_event_info, ++ u8 type) ++{ ++ struct acpi_gpe_register_info *gpe_register_info; ++ u8 register_bit; ++ ++ ++ ACPI_FUNCTION_TRACE ("ev_update_gpe_enable_masks"); ++ ++ ++ gpe_register_info = gpe_event_info->register_info; ++ if (!gpe_register_info) { ++ return_ACPI_STATUS (AE_NOT_EXIST); ++ } ++ register_bit = gpe_event_info->register_bit; ++ ++ /* 1) Disable case. Simply clear all enable bits */ ++ ++ if (type == ACPI_GPE_DISABLE) { ++ ACPI_CLEAR_BIT (gpe_register_info->enable_for_wake, register_bit); ++ ACPI_CLEAR_BIT (gpe_register_info->enable_for_run, register_bit); ++ return_ACPI_STATUS (AE_OK); ++ } ++ ++ /* 2) Enable case. Set/Clear the appropriate enable bits */ ++ ++ switch (gpe_event_info->flags & ACPI_GPE_TYPE_MASK) { ++ case ACPI_GPE_TYPE_WAKE: ++ ACPI_SET_BIT (gpe_register_info->enable_for_wake, register_bit); ++ ACPI_CLEAR_BIT (gpe_register_info->enable_for_run, register_bit); ++ break; ++ ++ case ACPI_GPE_TYPE_RUNTIME: ++ ACPI_CLEAR_BIT (gpe_register_info->enable_for_wake, register_bit); ++ ACPI_SET_BIT (gpe_register_info->enable_for_run, register_bit); ++ break; ++ ++ case ACPI_GPE_TYPE_WAKE_RUN: ++ ACPI_SET_BIT (gpe_register_info->enable_for_wake, register_bit); ++ ACPI_SET_BIT (gpe_register_info->enable_for_run, register_bit); ++ break; ++ ++ default: ++ return_ACPI_STATUS (AE_BAD_PARAMETER); ++ } ++ ++ return_ACPI_STATUS (AE_OK); ++} ++ ++ ++/******************************************************************************* ++ * ++ * FUNCTION: acpi_ev_enable_gpe ++ * ++ * PARAMETERS: gpe_event_info - GPE to enable ++ * write_to_hardware - Enable now, or just mark data structs ++ * (WAKE GPEs should be deferred) ++ * ++ * RETURN: Status ++ * ++ * DESCRIPTION: Enable a GPE based on the GPE type ++ * ++ ******************************************************************************/ ++ ++acpi_status ++acpi_ev_enable_gpe ( ++ struct acpi_gpe_event_info *gpe_event_info, ++ u8 write_to_hardware) ++{ ++ acpi_status status; ++ ++ ++ ACPI_FUNCTION_TRACE ("ev_enable_gpe"); ++ ++ ++ /* Make sure HW enable masks are updated */ ++ ++ status = acpi_ev_update_gpe_enable_masks (gpe_event_info, ACPI_GPE_ENABLE); ++ if (ACPI_FAILURE (status)) { ++ return_ACPI_STATUS (status); ++ } ++ ++ /* Mark wake-enabled or HW enable, or both */ ++ ++ switch (gpe_event_info->flags & ACPI_GPE_TYPE_MASK) { ++ case ACPI_GPE_TYPE_WAKE: ++ ++ ACPI_SET_BIT (gpe_event_info->flags, ACPI_GPE_WAKE_ENABLED); ++ break; ++ ++ case ACPI_GPE_TYPE_WAKE_RUN: ++ ++ ACPI_SET_BIT (gpe_event_info->flags, ACPI_GPE_WAKE_ENABLED); ++ ++ /*lint -fallthrough */ ++ ++ case ACPI_GPE_TYPE_RUNTIME: ++ ++ ACPI_SET_BIT (gpe_event_info->flags, ACPI_GPE_RUN_ENABLED); ++ ++ if (write_to_hardware) { ++ /* Clear the GPE (of stale events), then enable it */ ++ ++ status = acpi_hw_clear_gpe (gpe_event_info); ++ if (ACPI_FAILURE (status)) { ++ return_ACPI_STATUS (status); ++ } ++ ++ /* Enable the requested runtime GPE */ ++ ++ status = acpi_hw_write_gpe_enable_reg (gpe_event_info); ++ } ++ break; ++ ++ default: ++ return_ACPI_STATUS (AE_BAD_PARAMETER); ++ } ++ ++ return_ACPI_STATUS (AE_OK); ++} ++ ++ ++/******************************************************************************* ++ * ++ * FUNCTION: acpi_ev_disable_gpe ++ * ++ * PARAMETERS: gpe_event_info - GPE to disable ++ * ++ * RETURN: Status ++ * ++ * DESCRIPTION: Disable a GPE based on the GPE type ++ * ++ ******************************************************************************/ ++ ++acpi_status ++acpi_ev_disable_gpe ( ++ struct acpi_gpe_event_info *gpe_event_info) ++{ ++ acpi_status status; ++ ++ ++ ACPI_FUNCTION_TRACE ("ev_disable_gpe"); ++ ++ ++ if (!(gpe_event_info->flags & ACPI_GPE_ENABLE_MASK)) { ++ return_ACPI_STATUS (AE_OK); ++ } ++ ++ /* Make sure HW enable masks are updated */ ++ ++ status = acpi_ev_update_gpe_enable_masks (gpe_event_info, ACPI_GPE_DISABLE); ++ if (ACPI_FAILURE (status)) { ++ return_ACPI_STATUS (status); ++ } ++ ++ /* Mark wake-disabled or HW disable, or both */ ++ ++ switch (gpe_event_info->flags & ACPI_GPE_TYPE_MASK) { ++ case ACPI_GPE_TYPE_WAKE: ++ ACPI_CLEAR_BIT (gpe_event_info->flags, ACPI_GPE_WAKE_ENABLED); ++ break; ++ ++ case ACPI_GPE_TYPE_WAKE_RUN: ++ ACPI_CLEAR_BIT (gpe_event_info->flags, ACPI_GPE_WAKE_ENABLED); ++ ++ /*lint -fallthrough */ ++ ++ case ACPI_GPE_TYPE_RUNTIME: ++ ++ /* Disable the requested runtime GPE */ ++ ++ ACPI_CLEAR_BIT (gpe_event_info->flags, ACPI_GPE_RUN_ENABLED); ++ status = acpi_hw_write_gpe_enable_reg (gpe_event_info); ++ break; ++ ++ default: ++ return_ACPI_STATUS (AE_BAD_PARAMETER); ++ } ++ ++ return_ACPI_STATUS (AE_OK); ++} ++ ++ ++/******************************************************************************* ++ * + * FUNCTION: acpi_ev_get_gpe_event_info + * + * PARAMETERS: gpe_device - Device node. NULL for GPE0/GPE1 +@@ -139,11 +386,12 @@ + u32 int_status = ACPI_INTERRUPT_NOT_HANDLED; + u8 enabled_status_byte; + struct acpi_gpe_register_info *gpe_register_info; +- u32 in_value; ++ u32 status_reg; ++ u32 enable_reg; + acpi_status status; + struct acpi_gpe_block_info *gpe_block; +- u32 i; +- u32 j; ++ acpi_native_uint i; ++ acpi_native_uint j; + + + ACPI_FUNCTION_NAME ("ev_gpe_detect"); +@@ -171,33 +419,32 @@ + + /* Read the Status Register */ + +- status = acpi_hw_low_level_read (ACPI_GPE_REGISTER_WIDTH, &in_value, ++ status = acpi_hw_low_level_read (ACPI_GPE_REGISTER_WIDTH, &status_reg, + &gpe_register_info->status_address); +- gpe_register_info->status = (u8) in_value; + if (ACPI_FAILURE (status)) { + goto unlock_and_exit; + } + + /* Read the Enable Register */ + +- status = acpi_hw_low_level_read (ACPI_GPE_REGISTER_WIDTH, &in_value, ++ status = acpi_hw_low_level_read (ACPI_GPE_REGISTER_WIDTH, &enable_reg, + &gpe_register_info->enable_address); +- gpe_register_info->enable = (u8) in_value; + if (ACPI_FAILURE (status)) { + goto unlock_and_exit; + } + + ACPI_DEBUG_PRINT ((ACPI_DB_INTERRUPTS, + "GPE pair: Status %8.8X%8.8X = %02X, Enable %8.8X%8.8X = %02X\n", +- ACPI_FORMAT_UINT64 (gpe_register_info->status_address.address), +- gpe_register_info->status, +- ACPI_FORMAT_UINT64 (gpe_register_info->enable_address.address), +- gpe_register_info->enable)); ++ ACPI_FORMAT_UINT64 ( ++ gpe_register_info->status_address.address), ++ status_reg, ++ ACPI_FORMAT_UINT64 ( ++ gpe_register_info->enable_address.address), ++ enable_reg)); + + /* First check if there is anything active at all in this register */ + +- enabled_status_byte = (u8) (gpe_register_info->status & +- gpe_register_info->enable); ++ enabled_status_byte = (u8) (status_reg & enable_reg); + if (!enabled_status_byte) { + /* No active GPEs in this register, move on */ + +@@ -216,7 +463,7 @@ + */ + int_status |= acpi_ev_gpe_dispatch ( + &gpe_block->event_info[(i * ACPI_GPE_REGISTER_WIDTH) + j], +- j + gpe_register_info->base_gpe_number); ++ (u32) j + gpe_register_info->base_gpe_number); + } + } + } +@@ -255,6 +502,7 @@ + u32 gpe_number = 0; + acpi_status status; + struct acpi_gpe_event_info local_gpe_event_info; ++ struct acpi_parameter_info info; + + + ACPI_FUNCTION_TRACE ("ev_asynch_execute_gpe_method"); +@@ -272,6 +520,10 @@ + return_VOID; + } + ++ /* Set the GPE flags for return to enabled state */ ++ ++ (void) acpi_ev_enable_gpe (gpe_event_info, FALSE); ++ + /* + * Take a snapshot of the GPE info for this level - we copy the + * info to prevent a race condition with remove_handler/remove_block. +@@ -283,23 +535,33 @@ + return_VOID; + } + +- if (local_gpe_event_info.method_node) { ++ /* ++ * Must check for control method type dispatch one more ++ * time to avoid race with ev_gpe_install_handler ++ */ ++ if ((local_gpe_event_info.flags & ACPI_GPE_DISPATCH_MASK) == ACPI_GPE_DISPATCH_METHOD) { + /* +- * Invoke the GPE Method (_Lxx, _Exx): +- * (Evaluate the _Lxx/_Exx control method that corresponds to this GPE.) ++ * Invoke the GPE Method (_Lxx, _Exx) i.e., evaluate the _Lxx/_Exx ++ * control method that corresponds to this GPE + */ +- status = acpi_ns_evaluate_by_handle (local_gpe_event_info.method_node, NULL, NULL); ++ info.node = local_gpe_event_info.dispatch.method_node; ++ info.parameters = ACPI_CAST_PTR (union acpi_operand_object *, gpe_event_info); ++ info.parameter_type = ACPI_PARAM_GPE; ++ ++ status = acpi_ns_evaluate_by_handle (&info); + if (ACPI_FAILURE (status)) { +- ACPI_REPORT_ERROR (("%s while evaluating method [%4.4s] for GPE[%2X]\n", ++ ACPI_REPORT_ERROR (( ++ "%s while evaluating method [%4.4s] for GPE[%2X]\n", + acpi_format_exception (status), +- acpi_ut_get_node_name (local_gpe_event_info.method_node), gpe_number)); ++ acpi_ut_get_node_name (local_gpe_event_info.dispatch.method_node), ++ gpe_number)); + } + } + + if ((local_gpe_event_info.flags & ACPI_GPE_XRUPT_TYPE_MASK) == ACPI_GPE_LEVEL_TRIGGERED) { + /* +- * GPE is level-triggered, we clear the GPE status bit after handling +- * the event. ++ * GPE is level-triggered, we clear the GPE status bit after ++ * handling the event. + */ + status = acpi_hw_clear_gpe (&local_gpe_event_info); + if (ACPI_FAILURE (status)) { +@@ -309,7 +571,7 @@ + + /* Enable this GPE */ + +- (void) acpi_hw_enable_gpe (&local_gpe_event_info); ++ (void) acpi_hw_write_gpe_enable_reg (&local_gpe_event_info); + return_VOID; + } + +@@ -354,6 +616,15 @@ + } + } + ++ /* Save current system state */ ++ ++ if (acpi_gbl_system_awake_and_running) { ++ ACPI_SET_BIT (gpe_event_info->flags, ACPI_GPE_SYSTEM_RUNNING); ++ } ++ else { ++ ACPI_CLEAR_BIT (gpe_event_info->flags, ACPI_GPE_SYSTEM_RUNNING); ++ } ++ + /* + * Dispatch the GPE to either an installed handler, or the control + * method associated with this GPE (_Lxx or _Exx). +@@ -361,10 +632,15 @@ + * If there is neither a handler nor a method, we disable the level to + * prevent further events from coming in here. + */ +- if (gpe_event_info->handler) { +- /* Invoke the installed handler (at interrupt level) */ ++ switch (gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) { ++ case ACPI_GPE_DISPATCH_HANDLER: + +- gpe_event_info->handler (gpe_event_info->context); ++ /* ++ * Invoke the installed handler (at interrupt level) ++ * Ignore return status for now. TBD: leave GPE disabled on error? ++ */ ++ (void) gpe_event_info->dispatch.handler->address ( ++ gpe_event_info->dispatch.handler->context); + + /* It is now safe to clear level-triggered events. */ + +@@ -377,13 +653,15 @@ + return_VALUE (ACPI_INTERRUPT_NOT_HANDLED); + } + } +- } +- else if (gpe_event_info->method_node) { ++ break; ++ ++ case ACPI_GPE_DISPATCH_METHOD: ++ + /* + * Disable GPE, so it doesn't keep firing before the method has a + * chance to run. + */ +- status = acpi_hw_disable_gpe (gpe_event_info); ++ status = acpi_ev_disable_gpe (gpe_event_info); + if (ACPI_FAILURE (status)) { + ACPI_REPORT_ERROR (( + "acpi_ev_gpe_dispatch: Unable to disable GPE[%2X]\n", +@@ -402,8 +680,10 @@ + "acpi_ev_gpe_dispatch: Unable to queue handler for GPE[%2X], event is disabled\n", + gpe_number)); + } +- } +- else { ++ break; ++ ++ default: ++ + /* No handler or method to run! */ + + ACPI_REPORT_ERROR (( +@@ -414,15 +694,68 @@ + * Disable the GPE. The GPE will remain disabled until the ACPI + * Core Subsystem is restarted, or a handler is installed. + */ +- status = acpi_hw_disable_gpe (gpe_event_info); ++ status = acpi_ev_disable_gpe (gpe_event_info); + if (ACPI_FAILURE (status)) { + ACPI_REPORT_ERROR (( + "acpi_ev_gpe_dispatch: Unable to disable GPE[%2X]\n", + gpe_number)); + return_VALUE (ACPI_INTERRUPT_NOT_HANDLED); + } ++ break; + } + + return_VALUE (ACPI_INTERRUPT_HANDLED); + } ++ ++ ++#ifdef ACPI_GPE_NOTIFY_CHECK ++ ++/******************************************************************************* ++ * TBD: NOT USED, PROTOTYPE ONLY AND WILL PROBABLY BE REMOVED ++ * ++ * FUNCTION: acpi_ev_check_for_wake_only_gpe ++ * ++ * PARAMETERS: gpe_event_info - info for this GPE ++ * ++ * RETURN: Status ++ * ++ * DESCRIPTION: Determine if a a GPE is "wake-only". ++ * ++ * Called from Notify() code in interpreter when a "device_wake" ++ * Notify comes in. ++ * ++ ******************************************************************************/ ++ ++acpi_status ++acpi_ev_check_for_wake_only_gpe ( ++ struct acpi_gpe_event_info *gpe_event_info) ++{ ++ acpi_status status; ++ ++ ++ ACPI_FUNCTION_TRACE ("ev_check_for_wake_only_gpe"); ++ ++ ++ if ((gpe_event_info) && /* Only >0 for _Lxx/_Exx */ ++ ((gpe_event_info->flags & ACPI_GPE_SYSTEM_MASK) == ACPI_GPE_SYSTEM_RUNNING)) /* System state at GPE time */ { ++ /* This must be a wake-only GPE, disable it */ ++ ++ status = acpi_ev_disable_gpe (gpe_event_info); ++ ++ /* Set GPE to wake-only. Do not change wake disabled/enabled status */ ++ ++ acpi_ev_set_gpe_type (gpe_event_info, ACPI_GPE_TYPE_WAKE); ++ ++ ACPI_REPORT_INFO (("GPE %p was updated from wake/run to wake-only\n", ++ gpe_event_info)); ++ ++ /* This was a wake-only GPE */ ++ ++ return_ACPI_STATUS (AE_WAKE_ONLY_GPE); ++ } ++ ++ return_ACPI_STATUS (AE_OK); ++} ++#endif ++ + +diff -Nru a/drivers/acpi/events/evgpeblk.c b/drivers/acpi/events/evgpeblk.c +--- a/drivers/acpi/events/evgpeblk.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/events/evgpeblk.c 2004-09-21 21:26:34 +10:00 +@@ -53,7 +53,7 @@ + * + * FUNCTION: acpi_ev_valid_gpe_event + * +- * PARAMETERS: gpe_event_info - Info for this GPE ++ * PARAMETERS: gpe_event_info - Info for this GPE + * + * RETURN: TRUE if the gpe_event is valid + * +@@ -105,17 +105,18 @@ + * FUNCTION: acpi_ev_walk_gpe_list + * + * PARAMETERS: gpe_walk_callback - Routine called for each GPE block ++ * Flags - ACPI_NOT_ISR or ACPI_ISR + * + * RETURN: Status + * + * DESCRIPTION: Walk the GPE lists. +- * FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED + * + ******************************************************************************/ + + acpi_status + acpi_ev_walk_gpe_list ( +- ACPI_GPE_CALLBACK gpe_walk_callback) ++ ACPI_GPE_CALLBACK gpe_walk_callback, ++ u32 flags) + { + struct acpi_gpe_block_info *gpe_block; + struct acpi_gpe_xrupt_info *gpe_xrupt_info; +@@ -125,7 +126,7 @@ + ACPI_FUNCTION_TRACE ("ev_walk_gpe_list"); + + +- acpi_os_acquire_lock (acpi_gbl_gpe_lock, ACPI_ISR); ++ acpi_os_acquire_lock (acpi_gbl_gpe_lock, flags); + + /* Walk the interrupt level descriptor list */ + +@@ -149,11 +150,58 @@ + } + + unlock_and_exit: +- acpi_os_release_lock (acpi_gbl_gpe_lock, ACPI_ISR); ++ acpi_os_release_lock (acpi_gbl_gpe_lock, flags); + return_ACPI_STATUS (status); + } + + ++/****************************************************************************** ++ * ++ * FUNCTION: acpi_ev_delete_gpe_handlers ++ * ++ * PARAMETERS: gpe_xrupt_info - GPE Interrupt info ++ * gpe_block - Gpe Block info ++ * ++ * RETURN: Status ++ * ++ * DESCRIPTION: Delete all Handler objects found in the GPE data structs. ++ * Used only prior to termination. ++ * ++ ******************************************************************************/ ++ ++acpi_status ++acpi_ev_delete_gpe_handlers ( ++ struct acpi_gpe_xrupt_info *gpe_xrupt_info, ++ struct acpi_gpe_block_info *gpe_block) ++{ ++ struct acpi_gpe_event_info *gpe_event_info; ++ acpi_native_uint i; ++ acpi_native_uint j; ++ ++ ++ ACPI_FUNCTION_TRACE ("ev_delete_gpe_handlers"); ++ ++ ++ /* Examine each GPE Register within the block */ ++ ++ for (i = 0; i < gpe_block->register_count; i++) { ++ /* Now look at the individual GPEs in this byte register */ ++ ++ for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++) { ++ gpe_event_info = &gpe_block->event_info[(i * ACPI_GPE_REGISTER_WIDTH) + j]; ++ ++ if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) == ACPI_GPE_DISPATCH_HANDLER) { ++ ACPI_MEM_FREE (gpe_event_info->dispatch.handler); ++ gpe_event_info->dispatch.handler = NULL; ++ gpe_event_info->flags &= ~ACPI_GPE_DISPATCH_MASK; ++ } ++ } ++ } ++ ++ return_ACPI_STATUS (AE_OK); ++} ++ ++ + /******************************************************************************* + * + * FUNCTION: acpi_ev_save_method_info +@@ -188,6 +236,7 @@ + u32 gpe_number; + char name[ACPI_NAME_SIZE + 1]; + u8 type; ++ acpi_status status; + + + ACPI_FUNCTION_TRACE ("ev_save_method_info"); +@@ -206,16 +255,16 @@ + * 2) Edge/Level determination is based on the 2nd character + * of the method name + * +- * NOTE: Default GPE type is RUNTIME. May be changed later to WAKE if a +- * _PRW object is found that points to this GPE. ++ * NOTE: Default GPE type is RUNTIME. May be changed later to WAKE ++ * if a _PRW object is found that points to this GPE. + */ + switch (name[1]) { + case 'L': +- type = ACPI_GPE_LEVEL_TRIGGERED | ACPI_GPE_TYPE_RUNTIME; ++ type = ACPI_GPE_LEVEL_TRIGGERED; + break; + + case 'E': +- type = ACPI_GPE_EDGE_TRIGGERED | ACPI_GPE_TYPE_RUNTIME; ++ type = ACPI_GPE_EDGE_TRIGGERED; + break; + + default: +@@ -253,27 +302,35 @@ + + /* + * Now we can add this information to the gpe_event_info block +- * for use during dispatch of this GPE. ++ * for use during dispatch of this GPE. Default type is RUNTIME, although ++ * this may change when the _PRW methods are executed later. + */ + gpe_event_info = &gpe_block->event_info[gpe_number - gpe_block->block_base_number]; + +- gpe_event_info->flags = type; +- gpe_event_info->method_node = (struct acpi_namespace_node *) obj_handle; ++ gpe_event_info->flags = (u8) (type | ACPI_GPE_DISPATCH_METHOD | ++ ACPI_GPE_TYPE_RUNTIME); ++ ++ gpe_event_info->dispatch.method_node = (struct acpi_namespace_node *) obj_handle; ++ ++ /* Update enable mask, but don't enable the HW GPE as of yet */ ++ ++ status = acpi_ev_enable_gpe (gpe_event_info, FALSE); + + ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, + "Registered GPE method %s as GPE number 0x%.2X\n", + name, gpe_number)); +- return_ACPI_STATUS (AE_OK); ++ return_ACPI_STATUS (status); + } + + + /******************************************************************************* + * +- * FUNCTION: acpi_ev_get_gpe_type ++ * FUNCTION: acpi_ev_match_prw_and_gpe + * + * PARAMETERS: Callback from walk_namespace + * +- * RETURN: Status ++ * RETURN: Status. NOTE: We ignore errors so that the _PRW walk is ++ * not aborted on a single _PRW failure. + * + * DESCRIPTION: Called from acpi_walk_namespace. Expects each object to be a + * Device. Run the _PRW method. If present, extract the GPE +@@ -282,7 +339,7 @@ + ******************************************************************************/ + + static acpi_status +-acpi_ev_get_gpe_type ( ++acpi_ev_match_prw_and_gpe ( + acpi_handle obj_handle, + u32 level, + void *info, +@@ -299,19 +356,18 @@ + acpi_status status; + + +- ACPI_FUNCTION_TRACE ("ev_get_gpe_type"); ++ ACPI_FUNCTION_TRACE ("ev_match_prw_and_gpe"); + + + /* Check for a _PRW method under this device */ + + status = acpi_ut_evaluate_object (obj_handle, METHOD_NAME__PRW, + ACPI_BTYPE_PACKAGE, &pkg_desc); +- if (status == AE_NOT_FOUND) { ++ if (ACPI_FAILURE (status)) { ++ /* Ignore all errors from _PRW, we don't want to abort the subsystem */ ++ + return_ACPI_STATUS (AE_OK); + } +- else if (ACPI_FAILURE (status)) { +- return_ACPI_STATUS (status); +- } + + /* The returned _PRW package must have at least two elements */ + +@@ -370,16 +426,21 @@ + if ((gpe_device == target_gpe_device) && + (gpe_number >= gpe_block->block_base_number) && + (gpe_number < gpe_block->block_base_number + (gpe_block->register_count * 8))) { +- /* Mark GPE for WAKE but DISABLED (even for wake) */ +- + gpe_event_info = &gpe_block->event_info[gpe_number - gpe_block->block_base_number]; +- gpe_event_info->flags |= ACPI_GPE_TYPE_WAKE; ++ ++ /* Mark GPE for WAKE-ONLY but WAKE_DISABLED */ ++ ++ gpe_event_info->flags &= ~(ACPI_GPE_WAKE_ENABLED | ACPI_GPE_RUN_ENABLED); ++ status = acpi_ev_set_gpe_type (gpe_event_info, ACPI_GPE_TYPE_WAKE); ++ if (ACPI_FAILURE (status)) { ++ goto cleanup; ++ } ++ status = acpi_ev_update_gpe_enable_masks (gpe_event_info, ACPI_GPE_DISABLE); + } + + cleanup: + acpi_ut_remove_reference (pkg_desc); +- +- return_ACPI_STATUS (status); ++ return_ACPI_STATUS (AE_OK); + } + + +@@ -742,7 +803,7 @@ + /* Init the event_info for each GPE within this register */ + + for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++) { +- this_event->bit_mask = acpi_gbl_decode_to8bit[j]; ++ this_event->register_bit = acpi_gbl_decode_to8bit[j]; + this_event->register_info = this_register; + this_event++; + } +@@ -817,6 +878,7 @@ + acpi_status status; + struct acpi_gpe_walk_info gpe_info; + ++ + ACPI_FUNCTION_TRACE ("ev_create_gpe_block"); + + +@@ -835,6 +897,7 @@ + + gpe_block->register_count = register_count; + gpe_block->block_base_number = gpe_block_base_number; ++ gpe_block->node = gpe_device; + + ACPI_MEMCPY (&gpe_block->block_address, gpe_block_address, sizeof (struct acpi_generic_address)); + +@@ -854,18 +917,6 @@ + return_ACPI_STATUS (status); + } + +- /* Dump info about this GPE block */ +- +- ACPI_DEBUG_PRINT ((ACPI_DB_INIT, +- "GPE %02d to %02d [%4.4s] %d regs at %8.8X%8.8X on int %d\n", +- gpe_block->block_base_number, +- (u32) (gpe_block->block_base_number + +- ((gpe_block->register_count * ACPI_GPE_REGISTER_WIDTH) -1)), +- gpe_device->name.ascii, +- gpe_block->register_count, +- ACPI_FORMAT_UINT64 (gpe_block->block_address.address), +- interrupt_level)); +- + /* Find all GPE methods (_Lxx, _Exx) for this block */ + + status = acpi_ns_walk_namespace (ACPI_TYPE_METHOD, gpe_device, +@@ -873,27 +924,28 @@ + gpe_block, NULL); + + /* +- * Runtime option: Should Wake GPEs be enabled at runtime? The default is +- * No,they should only be enabled just as the machine goes to sleep. ++ * Runtime option: Should Wake GPEs be enabled at runtime? The default ++ * is No,they should only be enabled just as the machine goes to sleep. + */ + if (acpi_gbl_leave_wake_gpes_disabled) { + /* +- * Differentiate RUNTIME vs WAKE GPEs, via the _PRW control methods. (Each +- * GPE that has one or more _PRWs that reference it is by definition a +- * WAKE GPE and will not be enabled while the machine is running.) ++ * Differentiate RUNTIME vs WAKE GPEs, via the _PRW control methods. ++ * (Each GPE that has one or more _PRWs that reference it is by ++ * definition a WAKE GPE and will not be enabled while the machine ++ * is running.) + */ + gpe_info.gpe_block = gpe_block; + gpe_info.gpe_device = gpe_device; + + status = acpi_ns_walk_namespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, +- ACPI_UINT32_MAX, ACPI_NS_WALK_UNLOCK, acpi_ev_get_gpe_type, ++ ACPI_UINT32_MAX, ACPI_NS_WALK_UNLOCK, acpi_ev_match_prw_and_gpe, + &gpe_info, NULL); + } + + /* +- * Enable all GPEs in this block that are 1) "runtime" GPEs, and 2) have +- * a corresponding _Lxx or _Exx method. All other GPEs must be enabled via +- * the acpi_enable_gpe() external interface. ++ * Enable all GPEs in this block that are 1) "runtime" or "run/wake" GPEs, ++ * and 2) have a corresponding _Lxx or _Exx method. All other GPEs must ++ * be enabled via the acpi_enable_gpe() external interface. + */ + wake_gpe_count = 0; + gpe_enabled_count = 0; +@@ -903,23 +955,35 @@ + /* Get the info block for this particular GPE */ + + gpe_event_info = &gpe_block->event_info[(i * ACPI_GPE_REGISTER_WIDTH) + j]; +- if ((gpe_event_info->method_node) && +- ((gpe_event_info->flags & ACPI_GPE_TYPE_MASK) == ACPI_GPE_TYPE_RUNTIME)) { +- /* Enable this GPE, it is 1) RUNTIME and 2) has an _Lxx or _Exx method */ +- +- status = acpi_hw_enable_gpe (gpe_event_info); +- if (ACPI_FAILURE (status)) { +- return_ACPI_STATUS (status); +- } ++ ++ if (((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) == ACPI_GPE_DISPATCH_METHOD) && ++ (gpe_event_info->flags & ACPI_GPE_TYPE_RUNTIME)) { + gpe_enabled_count++; + } + +- if ((gpe_event_info->flags & ACPI_GPE_TYPE_MASK) == ACPI_GPE_TYPE_WAKE) { ++ if (gpe_event_info->flags & ACPI_GPE_TYPE_WAKE) { + wake_gpe_count++; + } + } + } + ++ /* Dump info about this GPE block */ ++ ++ ACPI_DEBUG_PRINT ((ACPI_DB_INIT, ++ "GPE %02X to %02X [%4.4s] %u regs at %8.8X%8.8X on int 0x%X\n", ++ (u32) gpe_block->block_base_number, ++ (u32) (gpe_block->block_base_number + ++ ((gpe_block->register_count * ACPI_GPE_REGISTER_WIDTH) -1)), ++ gpe_device->name.ascii, ++ gpe_block->register_count, ++ ACPI_FORMAT_UINT64 (gpe_block->block_address.address), ++ interrupt_level)); ++ ++ ++ /* Enable all valid GPEs found above */ ++ ++ status = acpi_hw_enable_runtime_gpe_block (NULL, gpe_block); ++ + ACPI_DEBUG_PRINT ((ACPI_DB_INIT, + "Found %u Wake, Enabled %u Runtime GPEs in this block\n", + wake_gpe_count, gpe_enabled_count)); +@@ -1056,7 +1120,8 @@ + if ((register_count0 + register_count1) == 0) { + /* GPEs are not required by ACPI, this is OK */ + +- ACPI_REPORT_INFO (("There are no GPE blocks defined in the FADT\n")); ++ ACPI_DEBUG_PRINT ((ACPI_DB_INIT, ++ "There are no GPE blocks defined in the FADT\n")); + status = AE_OK; + goto cleanup; + } +diff -Nru a/drivers/acpi/events/evmisc.c b/drivers/acpi/events/evmisc.c +--- a/drivers/acpi/events/evmisc.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/events/evmisc.c 2004-09-21 21:26:34 +10:00 +@@ -88,9 +88,10 @@ + * + * FUNCTION: acpi_ev_queue_notify_request + * +- * PARAMETERS: ++ * PARAMETERS: Node - NS node for the notified object ++ * notify_value - Value from the Notify() request + * +- * RETURN: None. ++ * RETURN: Status + * + * DESCRIPTION: Dispatch a device notification event to a previously + * installed handler. +@@ -139,14 +140,12 @@ + acpi_notify_value_names[notify_value])); + } + else { +- ACPI_DEBUG_PRINT ((ACPI_DB_INFO, +- "notify value: 0x%2.2x **Device Specific**\n", ++ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Notify value: 0x%2.2X **Device Specific**\n", + notify_value)); + } + +- /* +- * Get the notify object attached to the NS Node +- */ ++ /* Get the notify object attached to the NS Node */ ++ + obj_desc = acpi_ns_get_attached_object (node); + if (obj_desc) { + /* We have the notify object, Get the right handler */ +@@ -194,11 +193,13 @@ + } + + if (!handler_obj) { +- /* There is no per-device notify handler for this device */ +- ++ /* ++ * There is no per-device notify handler for this device. ++ * This may or may not be a problem. ++ */ + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, +- "No notify handler for [%4.4s] node %p\n", +- acpi_ut_get_node_name (node), node)); ++ "No notify handler for Notify(%4.4s, %X) node %p\n", ++ acpi_ut_get_node_name (node), notify_value, node)); + } + + return (status); +@@ -209,7 +210,7 @@ + * + * FUNCTION: acpi_ev_notify_dispatch + * +- * PARAMETERS: ++ * PARAMETERS: Context - To be passsed to the notify handler + * + * RETURN: None. + * +@@ -276,6 +277,8 @@ + * + * FUNCTION: acpi_ev_global_lock_thread + * ++ * PARAMETERS: Context - From thread interface, not used ++ * + * RETURN: None + * + * DESCRIPTION: Invoked by SCI interrupt handler upon acquisition of the +@@ -309,7 +312,9 @@ + * + * FUNCTION: acpi_ev_global_lock_handler + * +- * RETURN: Status ++ * PARAMETERS: Context - From thread interface, not used ++ * ++ * RETURN: ACPI_INTERRUPT_HANDLED or ACPI_INTERRUPT_NOT_HANDLED + * + * DESCRIPTION: Invoked directly from the SCI handler when a global lock + * release interrupt occurs. Grab the global lock and queue +@@ -356,6 +361,8 @@ + * + * FUNCTION: acpi_ev_init_global_lock_handler + * ++ * PARAMETERS: None ++ * + * RETURN: Status + * + * DESCRIPTION: Install a handler for the global lock release event +@@ -395,6 +402,8 @@ + * + * FUNCTION: acpi_ev_acquire_global_lock + * ++ * PARAMETERS: Timeout - Max time to wait for the lock, in millisec. ++ * + * RETURN: Status + * + * DESCRIPTION: Attempt to gain ownership of the Global Lock. +@@ -462,6 +471,10 @@ + * + * FUNCTION: acpi_ev_release_global_lock + * ++ * PARAMETERS: None ++ * ++ * RETURN: Status ++ * + * DESCRIPTION: Releases ownership of the Global Lock. + * + ******************************************************************************/ +@@ -548,7 +561,7 @@ + + /* Disable all GPEs in all GPE blocks */ + +- status = acpi_ev_walk_gpe_list (acpi_hw_disable_gpe_block); ++ status = acpi_ev_walk_gpe_list (acpi_hw_disable_gpe_block, ACPI_NOT_ISR); + + /* Remove SCI handler */ + +@@ -557,6 +570,10 @@ + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not remove SCI handler\n")); + } + } ++ ++ /* Deallocate all handler objects installed within GPE info structs */ ++ ++ status = acpi_ev_walk_gpe_list (acpi_ev_delete_gpe_handlers, ACPI_NOT_ISR); + + /* Return to original mode if necessary */ + +diff -Nru a/drivers/acpi/events/evregion.c b/drivers/acpi/events/evregion.c +--- a/drivers/acpi/events/evregion.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/events/evregion.c 2004-09-21 21:26:34 +10:00 +@@ -61,7 +61,7 @@ + + /******************************************************************************* + * +- * FUNCTION: acpi_ev_init_address_spaces ++ * FUNCTION: acpi_ev_install_region_handlers + * + * PARAMETERS: None + * +@@ -72,15 +72,20 @@ + ******************************************************************************/ + + acpi_status +-acpi_ev_init_address_spaces ( ++acpi_ev_install_region_handlers ( + void) { + acpi_status status; + acpi_native_uint i; + + +- ACPI_FUNCTION_TRACE ("ev_init_address_spaces"); ++ ACPI_FUNCTION_TRACE ("ev_install_region_handlers"); + + ++ status = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE); ++ if (ACPI_FAILURE (status)) { ++ return_ACPI_STATUS (status); ++ } ++ + /* + * All address spaces (PCI Config, EC, SMBus) are scope dependent + * and registration must occur for a specific device. +@@ -99,9 +104,8 @@ + * has already been installed (via acpi_install_address_space_handler). + * Similar for AE_SAME_HANDLER. + */ +- + for (i = 0; i < ACPI_NUM_DEFAULT_SPACES; i++) { +- status = acpi_install_address_space_handler ((acpi_handle) acpi_gbl_root_node, ++ status = acpi_ev_install_space_handler (acpi_gbl_root_node, + acpi_gbl_default_address_spaces[i], + ACPI_DEFAULT_HANDLER, NULL, NULL); + switch (status) { +@@ -111,15 +115,63 @@ + + /* These exceptions are all OK */ + ++ status = AE_OK; + break; + + default: + +- return_ACPI_STATUS (status); ++ goto unlock_and_exit; + } + } + +- return_ACPI_STATUS (AE_OK); ++unlock_and_exit: ++ (void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); ++ return_ACPI_STATUS (status); ++} ++ ++ ++/******************************************************************************* ++ * ++ * FUNCTION: acpi_ev_initialize_op_regions ++ * ++ * PARAMETERS: None ++ * ++ * RETURN: Status ++ * ++ * DESCRIPTION: Execute _REG methods for all Operation Regions that have ++ * an installed default region handler. ++ * ++ ******************************************************************************/ ++ ++acpi_status ++acpi_ev_initialize_op_regions ( ++ void) ++{ ++ acpi_status status; ++ acpi_native_uint i; ++ ++ ++ ACPI_FUNCTION_TRACE ("ev_initialize_op_regions"); ++ ++ ++ status = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE); ++ if (ACPI_FAILURE (status)) { ++ return_ACPI_STATUS (status); ++ } ++ ++ /* ++ * Run the _REG methods for op_regions in each default address space ++ */ ++ for (i = 0; i < ACPI_NUM_DEFAULT_SPACES; i++) { ++ /* TBD: Make sure handler is the DEFAULT handler, otherwise ++ * _REG will have already been run. ++ */ ++ status = acpi_ev_execute_reg_methods (acpi_gbl_root_node, ++ acpi_gbl_default_address_spaces[i]); ++ } ++ ++ (void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); ++ return_ACPI_STATUS (status); + } + + +@@ -128,7 +180,7 @@ + * FUNCTION: acpi_ev_execute_reg_method + * + * PARAMETERS: region_obj - Object structure +- * Function - On (1) or Off (0) ++ * Function - Passed to _REG: On (1) or Off (0) + * + * RETURN: Status + * +@@ -138,11 +190,12 @@ + + acpi_status + acpi_ev_execute_reg_method ( +- union acpi_operand_object *region_obj, ++ union acpi_operand_object *region_obj, + u32 function) + { +- union acpi_operand_object *params[3]; +- union acpi_operand_object *region_obj2; ++ struct acpi_parameter_info info; ++ union acpi_operand_object *params[3]; ++ union acpi_operand_object *region_obj2; + acpi_status status; + + +@@ -159,10 +212,11 @@ + } + + /* +- * _REG method has two arguments +- * Arg0: Integer: Operation region space ID ++ * The _REG method has two arguments: ++ * ++ * Arg0, Integer: Operation region space ID + * Same value as region_obj->Region.space_id +- * Arg1: Integer: connection status ++ * Arg1, Integer: connection status + * 1 for connecting the handler, + * 0 for disconnecting the handler + * Passed as a parameter +@@ -178,16 +232,21 @@ + goto cleanup; + } + +- /* Set up the parameter objects */ ++ /* Setup the parameter objects */ + + params[0]->integer.value = region_obj->region.space_id; + params[1]->integer.value = function; + params[2] = NULL; + ++ info.node = region_obj2->extra.method_REG; ++ info.parameters = params; ++ info.parameter_type = ACPI_PARAM_ARGS; ++ + /* Execute the method, no return value */ + +- ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname (ACPI_TYPE_METHOD, region_obj2->extra.method_REG, NULL)); +- status = acpi_ns_evaluate_by_handle (region_obj2->extra.method_REG, params, NULL); ++ ACPI_DEBUG_EXEC (acpi_ut_display_init_pathname ( ++ ACPI_TYPE_METHOD, info.node, NULL)); ++ status = acpi_ns_evaluate_by_handle (&info); + + acpi_ut_remove_reference (params[1]); + +@@ -203,7 +262,6 @@ + * FUNCTION: acpi_ev_address_space_dispatch + * + * PARAMETERS: region_obj - Internal region object +- * space_id - ID of the address space (0-255) + * Function - Read or Write operation + * Address - Where in the space to read or write + * bit_width - Field width in bits (8, 16, 32, or 64) +@@ -326,7 +384,7 @@ + ACPI_FORMAT_UINT64 (address), + acpi_ut_get_region_name (region_obj->region.space_id))); + +- if (!(handler_desc->address_space.flags & ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)) { ++ if (!(handler_desc->address_space.hflags & ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)) { + /* + * For handlers other than the default (supplied) handlers, we must + * exit the interpreter because the handler *might* block -- we don't +@@ -347,7 +405,7 @@ + acpi_format_exception (status))); + } + +- if (!(handler_desc->address_space.flags & ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)) { ++ if (!(handler_desc->address_space.hflags & ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)) { + /* + * We just returned from a non-default handler, we must re-enter the + * interpreter +@@ -366,8 +424,8 @@ + * + * FUNCTION: acpi_ev_detach_region + * +- * PARAMETERS: region_obj - Region Object +- * acpi_ns_is_locked - Namespace Region Already Locked? ++ * PARAMETERS: region_obj - Region Object ++ * acpi_ns_is_locked - Namespace Region Already Locked? + * + * RETURN: None + * +@@ -501,9 +559,9 @@ + * + * FUNCTION: acpi_ev_attach_region + * +- * PARAMETERS: handler_obj - Handler Object +- * region_obj - Region Object +- * acpi_ns_is_locked - Namespace Region Already Locked? ++ * PARAMETERS: handler_obj - Handler Object ++ * region_obj - Region Object ++ * acpi_ns_is_locked - Namespace Region Already Locked? + * + * RETURN: None + * +@@ -676,6 +734,273 @@ + return (status); + } + ++ ++/******************************************************************************* ++ * ++ * FUNCTION: acpi_ev_install_space_handler ++ * ++ * PARAMETERS: Node - Namespace node for the device ++ * space_id - The address space ID ++ * Handler - Address of the handler ++ * Setup - Address of the setup function ++ * Context - Value passed to the handler on each access ++ * ++ * RETURN: Status ++ * ++ * DESCRIPTION: Install a handler for all op_regions of a given space_id. ++ * Assumes namespace is locked ++ * ++ ******************************************************************************/ ++ ++acpi_status ++acpi_ev_install_space_handler ( ++ struct acpi_namespace_node *node, ++ acpi_adr_space_type space_id, ++ acpi_adr_space_handler handler, ++ acpi_adr_space_setup setup, ++ void *context) ++{ ++ union acpi_operand_object *obj_desc; ++ union acpi_operand_object *handler_obj; ++ acpi_status status; ++ acpi_object_type type; ++ u16 flags = 0; ++ ++ ++ ACPI_FUNCTION_TRACE ("ev_install_space_handler"); ++ ++ ++ /* ++ * This registration is valid for only the types below ++ * and the root. This is where the default handlers ++ * get placed. ++ */ ++ if ((node->type != ACPI_TYPE_DEVICE) && ++ (node->type != ACPI_TYPE_PROCESSOR) && ++ (node->type != ACPI_TYPE_THERMAL) && ++ (node != acpi_gbl_root_node)) { ++ status = AE_BAD_PARAMETER; ++ goto unlock_and_exit; ++ } ++ ++ if (handler == ACPI_DEFAULT_HANDLER) { ++ flags = ACPI_ADDR_HANDLER_DEFAULT_INSTALLED; ++ ++ switch (space_id) { ++ case ACPI_ADR_SPACE_SYSTEM_MEMORY: ++ handler = acpi_ex_system_memory_space_handler; ++ setup = acpi_ev_system_memory_region_setup; ++ break; ++ ++ case ACPI_ADR_SPACE_SYSTEM_IO: ++ handler = acpi_ex_system_io_space_handler; ++ setup = acpi_ev_io_space_region_setup; ++ break; ++ ++ case ACPI_ADR_SPACE_PCI_CONFIG: ++ handler = acpi_ex_pci_config_space_handler; ++ setup = acpi_ev_pci_config_region_setup; ++ break; ++ ++ case ACPI_ADR_SPACE_CMOS: ++ handler = acpi_ex_cmos_space_handler; ++ setup = acpi_ev_cmos_region_setup; ++ break; ++ ++ case ACPI_ADR_SPACE_PCI_BAR_TARGET: ++ handler = acpi_ex_pci_bar_space_handler; ++ setup = acpi_ev_pci_bar_region_setup; ++ break; ++ ++ case ACPI_ADR_SPACE_DATA_TABLE: ++ handler = acpi_ex_data_table_space_handler; ++ setup = NULL; ++ break; ++ ++ default: ++ status = AE_BAD_PARAMETER; ++ goto unlock_and_exit; ++ } ++ } ++ ++ /* If the caller hasn't specified a setup routine, use the default */ ++ ++ if (!setup) { ++ setup = acpi_ev_default_region_setup; ++ } ++ ++ /* Check for an existing internal object */ ++ ++ obj_desc = acpi_ns_get_attached_object (node); ++ if (obj_desc) { ++ /* ++ * The attached device object already exists. ++ * Make sure the handler is not already installed. ++ */ ++ handler_obj = obj_desc->device.handler; ++ ++ /* Walk the handler list for this device */ ++ ++ while (handler_obj) { ++ /* Same space_id indicates a handler already installed */ ++ ++ if (handler_obj->address_space.space_id == space_id) { ++ if (handler_obj->address_space.handler == handler) { ++ /* ++ * It is (relatively) OK to attempt to install the SAME ++ * handler twice. This can easily happen with PCI_Config space. ++ */ ++ status = AE_SAME_HANDLER; ++ goto unlock_and_exit; ++ } ++ else { ++ /* A handler is already installed */ ++ ++ status = AE_ALREADY_EXISTS; ++ } ++ goto unlock_and_exit; ++ } ++ ++ /* Walk the linked list of handlers */ ++ ++ handler_obj = handler_obj->address_space.next; ++ } ++ } ++ else { ++ ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION, ++ "Creating object on Device %p while installing handler\n", node)); ++ ++ /* obj_desc does not exist, create one */ ++ ++ if (node->type == ACPI_TYPE_ANY) { ++ type = ACPI_TYPE_DEVICE; ++ } ++ else { ++ type = node->type; ++ } ++ ++ obj_desc = acpi_ut_create_internal_object (type); ++ if (!obj_desc) { ++ status = AE_NO_MEMORY; ++ goto unlock_and_exit; ++ } ++ ++ /* Init new descriptor */ ++ ++ obj_desc->common.type = (u8) type; ++ ++ /* Attach the new object to the Node */ ++ ++ status = acpi_ns_attach_object (node, obj_desc, type); ++ ++ /* Remove local reference to the object */ ++ ++ acpi_ut_remove_reference (obj_desc); ++ ++ if (ACPI_FAILURE (status)) { ++ goto unlock_and_exit; ++ } ++ } ++ ++ ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION, ++ "Installing address handler for region %s(%X) on Device %4.4s %p(%p)\n", ++ acpi_ut_get_region_name (space_id), space_id, ++ acpi_ut_get_node_name (node), node, obj_desc)); ++ ++ /* ++ * Install the handler ++ * ++ * At this point there is no existing handler. ++ * Just allocate the object for the handler and link it ++ * into the list. ++ */ ++ handler_obj = acpi_ut_create_internal_object (ACPI_TYPE_LOCAL_ADDRESS_HANDLER); ++ if (!handler_obj) { ++ status = AE_NO_MEMORY; ++ goto unlock_and_exit; ++ } ++ ++ /* Init handler obj */ ++ ++ handler_obj->address_space.space_id = (u8) space_id; ++ handler_obj->address_space.hflags = flags; ++ handler_obj->address_space.region_list = NULL; ++ handler_obj->address_space.node = node; ++ handler_obj->address_space.handler = handler; ++ handler_obj->address_space.context = context; ++ handler_obj->address_space.setup = setup; ++ ++ /* Install at head of Device.address_space list */ ++ ++ handler_obj->address_space.next = obj_desc->device.handler; ++ ++ /* ++ * The Device object is the first reference on the handler_obj. ++ * Each region that uses the handler adds a reference. ++ */ ++ obj_desc->device.handler = handler_obj; ++ ++ /* ++ * Walk the namespace finding all of the regions this ++ * handler will manage. ++ * ++ * Start at the device and search the branch toward ++ * the leaf nodes until either the leaf is encountered or ++ * a device is detected that has an address handler of the ++ * same type. ++ * ++ * In either case, back up and search down the remainder ++ * of the branch ++ */ ++ status = acpi_ns_walk_namespace (ACPI_TYPE_ANY, node, ACPI_UINT32_MAX, ++ ACPI_NS_WALK_UNLOCK, acpi_ev_install_handler, ++ handler_obj, NULL); ++ ++unlock_and_exit: ++ return_ACPI_STATUS (status); ++} ++ ++ ++/******************************************************************************* ++ * ++ * FUNCTION: acpi_ev_execute_reg_methods ++ * ++ * PARAMETERS: Node - Namespace node for the device ++ * space_id - The address space ID ++ * ++ * RETURN: Status ++ * ++ * DESCRIPTION: Run all _REG methods for the input Space ID; ++ * Note: assumes namespace is locked, or system init time. ++ * ++ ******************************************************************************/ ++ ++acpi_status ++acpi_ev_execute_reg_methods ( ++ struct acpi_namespace_node *node, ++ acpi_adr_space_type space_id) ++{ ++ acpi_status status; ++ ++ ++ ACPI_FUNCTION_TRACE ("ev_execute_reg_methods"); ++ ++ ++ /* ++ * Run all _REG methods for all Operation Regions for this ++ * space ID. This is a separate walk in order to handle any ++ * interdependencies between regions and _REG methods. (i.e. handlers ++ * must be installed for all regions of this Space ID before we ++ * can run any _REG methods) ++ */ ++ status = acpi_ns_walk_namespace (ACPI_TYPE_ANY, node, ACPI_UINT32_MAX, ++ ACPI_NS_WALK_UNLOCK, acpi_ev_reg_run, ++ &space_id, NULL); ++ ++ return_ACPI_STATUS (status); ++} ++ ++ + /******************************************************************************* + * + * FUNCTION: acpi_ev_reg_run +@@ -693,19 +1018,13 @@ + void *context, + void **return_value) + { +- union acpi_operand_object *handler_obj; + union acpi_operand_object *obj_desc; + struct acpi_namespace_node *node; ++ acpi_adr_space_type space_id; + acpi_status status; + + +- handler_obj = (union acpi_operand_object *) context; +- +- /* Parameter validation */ +- +- if (!handler_obj) { +- return (AE_OK); +- } ++ space_id = *ACPI_CAST_PTR (acpi_adr_space_type, context); + + /* Convert and validate the device handle */ + +@@ -732,10 +1051,9 @@ + return (AE_OK); + } + +- + /* Object is a Region */ + +- if (obj_desc->region.space_id != handler_obj->address_space.space_id) { ++ if (obj_desc->region.space_id != space_id) { + /* + * This region is for a different address space + * -- just ignore it +diff -Nru a/drivers/acpi/events/evrgnini.c b/drivers/acpi/events/evrgnini.c +--- a/drivers/acpi/events/evrgnini.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/events/evrgnini.c 2004-09-21 21:26:34 +10:00 +@@ -54,7 +54,7 @@ + * + * FUNCTION: acpi_ev_system_memory_region_setup + * +- * PARAMETERS: region_obj - Region we are interested in ++ * PARAMETERS: Handle - Region we are interested in + * Function - Start or stop + * handler_context - Address space handler context + * region_context - Region specific context +@@ -108,7 +108,7 @@ + * + * FUNCTION: acpi_ev_io_space_region_setup + * +- * PARAMETERS: region_obj - Region we are interested in ++ * PARAMETERS: Handle - Region we are interested in + * Function - Start or stop + * handler_context - Address space handler context + * region_context - Region specific context +@@ -144,7 +144,7 @@ + * + * FUNCTION: acpi_ev_pci_config_region_setup + * +- * PARAMETERS: region_obj - Region we are interested in ++ * PARAMETERS: Handle - Region we are interested in + * Function - Start or stop + * handler_context - Address space handler context + * region_context - Region specific context +@@ -317,7 +317,7 @@ + * + * FUNCTION: acpi_ev_pci_bar_region_setup + * +- * PARAMETERS: region_obj - Region we are interested in ++ * PARAMETERS: Handle - Region we are interested in + * Function - Start or stop + * handler_context - Address space handler context + * region_context - Region specific context +@@ -348,7 +348,7 @@ + * + * FUNCTION: acpi_ev_cmos_region_setup + * +- * PARAMETERS: region_obj - Region we are interested in ++ * PARAMETERS: Handle - Region we are interested in + * Function - Start or stop + * handler_context - Address space handler context + * region_context - Region specific context +@@ -379,7 +379,7 @@ + * + * FUNCTION: acpi_ev_default_region_setup + * +- * PARAMETERS: region_obj - Region we are interested in ++ * PARAMETERS: Handle - Region we are interested in + * Function - Start or stop + * handler_context - Address space handler context + * region_context - Region specific context +diff -Nru a/drivers/acpi/events/evxface.c b/drivers/acpi/events/evxface.c +--- a/drivers/acpi/events/evxface.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/events/evxface.c 2004-09-21 21:26:34 +10:00 +@@ -188,6 +188,7 @@ + * handler_type - The type of handler: + * ACPI_SYSTEM_NOTIFY: system_handler (00-7f) + * ACPI_DEVICE_NOTIFY: driver_handler (80-ff) ++ * ACPI_ALL_NOTIFY: both system and device + * Handler - Address of the handler + * Context - Value passed to the handler on each GPE + * +@@ -243,20 +244,21 @@ + if (device == ACPI_ROOT_OBJECT) { + /* Make sure the handler is not already installed */ + +- if (((handler_type == ACPI_SYSTEM_NOTIFY) && +- acpi_gbl_system_notify.handler) || +- ((handler_type == ACPI_DEVICE_NOTIFY) && ++ if (((handler_type & ACPI_SYSTEM_NOTIFY) && ++ acpi_gbl_system_notify.handler) || ++ ((handler_type & ACPI_DEVICE_NOTIFY) && + acpi_gbl_device_notify.handler)) { + status = AE_ALREADY_EXISTS; + goto unlock_and_exit; + } + +- if (handler_type == ACPI_SYSTEM_NOTIFY) { ++ if (handler_type & ACPI_SYSTEM_NOTIFY) { + acpi_gbl_system_notify.node = node; + acpi_gbl_system_notify.handler = handler; + acpi_gbl_system_notify.context = context; + } +- else /* ACPI_DEVICE_NOTIFY */ { ++ ++ if (handler_type & ACPI_DEVICE_NOTIFY) { + acpi_gbl_device_notify.node = node; + acpi_gbl_device_notify.handler = handler; + acpi_gbl_device_notify.context = context; +@@ -284,9 +286,9 @@ + if (obj_desc) { + /* Object exists - make sure there's no handler */ + +- if (((handler_type == ACPI_SYSTEM_NOTIFY) && ++ if (((handler_type & ACPI_SYSTEM_NOTIFY) && + obj_desc->common_notify.system_notify) || +- ((handler_type == ACPI_DEVICE_NOTIFY) && ++ ((handler_type & ACPI_DEVICE_NOTIFY) && + obj_desc->common_notify.device_notify)) { + status = AE_ALREADY_EXISTS; + goto unlock_and_exit; +@@ -308,7 +310,6 @@ + /* Remove local reference to the object */ + + acpi_ut_remove_reference (obj_desc); +- + if (ACPI_FAILURE (status)) { + goto unlock_and_exit; + } +@@ -326,12 +327,19 @@ + notify_obj->notify.handler = handler; + notify_obj->notify.context = context; + +- if (handler_type == ACPI_SYSTEM_NOTIFY) { ++ if (handler_type & ACPI_SYSTEM_NOTIFY) { + obj_desc->common_notify.system_notify = notify_obj; + } +- else /* ACPI_DEVICE_NOTIFY */ { ++ ++ if (handler_type & ACPI_DEVICE_NOTIFY) { + obj_desc->common_notify.device_notify = notify_obj; + } ++ ++ if (handler_type == ACPI_ALL_NOTIFY) { ++ /* Extra ref if installed in both */ ++ ++ acpi_ut_add_reference (notify_obj); ++ } + } + + +@@ -349,7 +357,9 @@ + * handler_type - The type of handler: + * ACPI_SYSTEM_NOTIFY: system_handler (00-7f) + * ACPI_DEVICE_NOTIFY: driver_handler (80-ff) ++ * ACPI_ALL_NOTIFY: both system and device + * Handler - Address of the handler ++ * + * RETURN: Status + * + * DESCRIPTION: Remove a handler for notifies on an ACPI device +@@ -392,15 +402,14 @@ + goto unlock_and_exit; + } + +- /* +- * Root Object +- */ ++ /* Root Object */ ++ + if (device == ACPI_ROOT_OBJECT) { + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Removing notify handler for ROOT object.\n")); + +- if (((handler_type == ACPI_SYSTEM_NOTIFY) && +- !acpi_gbl_system_notify.handler) || +- ((handler_type == ACPI_DEVICE_NOTIFY) && ++ if (((handler_type & ACPI_SYSTEM_NOTIFY) && ++ !acpi_gbl_system_notify.handler) || ++ ((handler_type & ACPI_DEVICE_NOTIFY) && + !acpi_gbl_device_notify.handler)) { + status = AE_NOT_EXIST; + goto unlock_and_exit; +@@ -415,21 +424,21 @@ + return_ACPI_STATUS (status); + } + +- if (handler_type == ACPI_SYSTEM_NOTIFY) { ++ if (handler_type & ACPI_SYSTEM_NOTIFY) { + acpi_gbl_system_notify.node = NULL; + acpi_gbl_system_notify.handler = NULL; + acpi_gbl_system_notify.context = NULL; + } +- else { ++ ++ if (handler_type & ACPI_DEVICE_NOTIFY) { + acpi_gbl_device_notify.node = NULL; + acpi_gbl_device_notify.handler = NULL; + acpi_gbl_device_notify.context = NULL; + } + } + +- /* +- * All Other Objects +- */ ++ /* All Other Objects */ ++ + else { + /* Notifies allowed on this object? */ + +@@ -448,38 +457,47 @@ + + /* Object exists - make sure there's an existing handler */ + +- if (handler_type == ACPI_SYSTEM_NOTIFY) { ++ if (handler_type & ACPI_SYSTEM_NOTIFY) { + notify_obj = obj_desc->common_notify.system_notify; +- } +- else { +- notify_obj = obj_desc->common_notify.device_notify; +- } ++ if ((!notify_obj) || ++ (notify_obj->notify.handler != handler)) { ++ status = AE_BAD_PARAMETER; ++ goto unlock_and_exit; ++ } ++ /* Make sure all deferred tasks are completed */ + +- if ((!notify_obj) || +- (notify_obj->notify.handler != handler)) { +- status = AE_BAD_PARAMETER; +- goto unlock_and_exit; +- } ++ (void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); ++ acpi_os_wait_events_complete(NULL); ++ status = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE); ++ if (ACPI_FAILURE (status)) { ++ return_ACPI_STATUS (status); ++ } + +- /* Make sure all deferred tasks are completed */ ++ /* Remove the handler */ ++ obj_desc->common_notify.system_notify = NULL; ++ acpi_ut_remove_reference (notify_obj); ++ } + +- (void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); +- acpi_os_wait_events_complete(NULL); +- status = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE); +- if (ACPI_FAILURE (status)) { +- return_ACPI_STATUS (status); +- } ++ if (handler_type & ACPI_DEVICE_NOTIFY) { ++ notify_obj = obj_desc->common_notify.device_notify; ++ if ((!notify_obj) || ++ (notify_obj->notify.handler != handler)) { ++ status = AE_BAD_PARAMETER; ++ goto unlock_and_exit; ++ } ++ /* Make sure all deferred tasks are completed */ + +- /* Remove the handler */ ++ (void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); ++ acpi_os_wait_events_complete(NULL); ++ status = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE); ++ if (ACPI_FAILURE (status)) { ++ return_ACPI_STATUS (status); ++ } + +- if (handler_type == ACPI_SYSTEM_NOTIFY) { +- obj_desc->common_notify.system_notify = NULL; +- } +- else { ++ /* Remove the handler */ + obj_desc->common_notify.device_notify = NULL; ++ acpi_ut_remove_reference (notify_obj); + } +- +- acpi_ut_remove_reference (notify_obj); + } + + +@@ -497,7 +515,7 @@ + * gpe_block - GPE block (NULL == FADT GPEs) + * Type - Whether this GPE should be treated as an + * edge- or level-triggered interrupt. +- * Handler - Address of the handler ++ * Address - Address of the handler + * Context - Value passed to the handler on each GPE + * + * RETURN: Status +@@ -511,11 +529,12 @@ + acpi_handle gpe_device, + u32 gpe_number, + u32 type, +- acpi_gpe_handler handler, ++ acpi_event_handler address, + void *context) + { +- acpi_status status; + struct acpi_gpe_event_info *gpe_event_info; ++ struct acpi_handler_info *handler; ++ acpi_status status; + + + ACPI_FUNCTION_TRACE ("acpi_install_gpe_handler"); +@@ -523,7 +542,7 @@ + + /* Parameter validation */ + +- if (!handler) { ++ if ((!address) || (type > ACPI_GPE_XRUPT_TYPE_MASK)) { + return_ACPI_STATUS (AE_BAD_PARAMETER); + } + +@@ -542,27 +561,41 @@ + + /* Make sure that there isn't a handler there already */ + +- if (gpe_event_info->handler) { ++ if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) == ACPI_GPE_DISPATCH_HANDLER) { + status = AE_ALREADY_EXISTS; + goto unlock_and_exit; + } + +- /* Install the handler */ ++ /* Allocate and init handler object */ + +- acpi_os_acquire_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR); +- gpe_event_info->handler = handler; +- gpe_event_info->context = context; +- gpe_event_info->flags = (u8) type; +- acpi_os_release_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR); ++ handler = ACPI_MEM_CALLOCATE (sizeof (struct acpi_handler_info)); ++ if (!handler) { ++ status = AE_NO_MEMORY; ++ goto unlock_and_exit; ++ } + +- /* Clear the GPE (of stale events), the enable it */ ++ handler->address = address; ++ handler->context = context; ++ handler->method_node = gpe_event_info->dispatch.method_node; + +- status = acpi_hw_clear_gpe (gpe_event_info); ++ /* Disable the GPE before installing the handler */ ++ ++ status = acpi_ev_disable_gpe (gpe_event_info); + if (ACPI_FAILURE (status)) { + goto unlock_and_exit; + } + +- status = acpi_hw_enable_gpe (gpe_event_info); ++ /* Install the handler */ ++ ++ acpi_os_acquire_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR); ++ gpe_event_info->dispatch.handler = handler; ++ ++ /* Setup up dispatch flags to indicate handler (vs. method) */ ++ ++ gpe_event_info->flags &= ~(ACPI_GPE_XRUPT_TYPE_MASK | ACPI_GPE_DISPATCH_MASK); /* Clear bits */ ++ gpe_event_info->flags |= (u8) (type | ACPI_GPE_DISPATCH_HANDLER); ++ ++ acpi_os_release_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR); + + + unlock_and_exit: +@@ -577,7 +610,7 @@ + * + * PARAMETERS: gpe_number - The event to remove a handler + * gpe_block - GPE block (NULL == FADT GPEs) +- * Handler - Address of the handler ++ * Address - Address of the handler + * + * RETURN: Status + * +@@ -589,10 +622,11 @@ + acpi_remove_gpe_handler ( + acpi_handle gpe_device, + u32 gpe_number, +- acpi_gpe_handler handler) ++ acpi_event_handler address) + { +- acpi_status status; + struct acpi_gpe_event_info *gpe_event_info; ++ struct acpi_handler_info *handler; ++ acpi_status status; + + + ACPI_FUNCTION_TRACE ("acpi_remove_gpe_handler"); +@@ -600,7 +634,7 @@ + + /* Parameter validation */ + +- if (!handler) { ++ if (!address) { + return_ACPI_STATUS (AE_BAD_PARAMETER); + } + +@@ -617,21 +651,27 @@ + goto unlock_and_exit; + } + +- /* Disable the GPE before removing the handler */ ++ /* Make sure that a handler is indeed installed */ + +- status = acpi_hw_disable_gpe (gpe_event_info); +- if (ACPI_FAILURE (status)) { ++ if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) != ACPI_GPE_DISPATCH_HANDLER) { ++ status = AE_NOT_EXIST; + goto unlock_and_exit; + } + + /* Make sure that the installed handler is the same */ + +- if (gpe_event_info->handler != handler) { +- (void) acpi_hw_enable_gpe (gpe_event_info); ++ if (gpe_event_info->dispatch.handler->address != address) { + status = AE_BAD_PARAMETER; + goto unlock_and_exit; + } + ++ /* Disable the GPE before removing the handler */ ++ ++ status = acpi_ev_disable_gpe (gpe_event_info); ++ if (ACPI_FAILURE (status)) { ++ goto unlock_and_exit; ++ } ++ + /* Make sure all deferred tasks are completed */ + + (void) acpi_ut_release_mutex (ACPI_MTX_EVENTS); +@@ -644,9 +684,20 @@ + /* Remove the handler */ + + acpi_os_acquire_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR); +- gpe_event_info->handler = NULL; +- gpe_event_info->context = NULL; ++ handler = gpe_event_info->dispatch.handler; ++ ++ /* Restore Method node (if any), set dispatch flags */ ++ ++ gpe_event_info->dispatch.method_node = handler->method_node; ++ gpe_event_info->flags &= ~ACPI_GPE_DISPATCH_MASK; /* Clear bits */ ++ if (handler->method_node) { ++ gpe_event_info->flags |= ACPI_GPE_DISPATCH_METHOD; ++ } + acpi_os_release_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR); ++ ++ /* Now we can free the handler object */ ++ ++ ACPI_MEM_FREE (handler); + + + unlock_and_exit: +diff -Nru a/drivers/acpi/events/evxfevnt.c b/drivers/acpi/events/evxfevnt.c +--- a/drivers/acpi/events/evxfevnt.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/events/evxfevnt.c 2004-09-21 21:26:34 +10:00 +@@ -204,12 +204,11 @@ + + /******************************************************************************* + * +- * FUNCTION: acpi_enable_gpe ++ * FUNCTION: acpi_set_gpe_type + * + * PARAMETERS: gpe_device - Parent GPE Device + * gpe_number - GPE level within the GPE block +- * Flags - Just enable, or also wake enable? +- * Called from ISR or not ++ * Type - New GPE type + * + * RETURN: Status + * +@@ -218,26 +217,17 @@ + ******************************************************************************/ + + acpi_status +-acpi_enable_gpe ( ++acpi_set_gpe_type ( + acpi_handle gpe_device, + u32 gpe_number, +- u32 flags) ++ u8 type) + { + acpi_status status = AE_OK; + struct acpi_gpe_event_info *gpe_event_info; + + +- ACPI_FUNCTION_TRACE ("acpi_enable_gpe"); +- +- +- /* Use semaphore lock if not executing at interrupt level */ ++ ACPI_FUNCTION_TRACE ("acpi_set_gpe_type"); + +- if (flags & ACPI_NOT_ISR) { +- status = acpi_ut_acquire_mutex (ACPI_MTX_EVENTS); +- if (ACPI_FAILURE (status)) { +- return_ACPI_STATUS (status); +- } +- } + + /* Ensure that we have a valid GPE number */ + +@@ -247,91 +237,72 @@ + goto unlock_and_exit; + } + +- /* Check for Wake vs Runtime GPE */ +- +- if (flags & ACPI_EVENT_WAKE_ENABLE) { +- /* Ensure the requested wake GPE is disabled */ +- +- status = acpi_hw_disable_gpe (gpe_event_info); +- if (ACPI_FAILURE (status)) { +- goto unlock_and_exit; +- } +- +- /* Defer Enable of Wake GPE until sleep time */ +- +- acpi_hw_enable_gpe_for_wakeup (gpe_event_info); ++ if ((gpe_event_info->flags & ACPI_GPE_TYPE_MASK) == type) { ++ return_ACPI_STATUS (AE_OK); + } +- else { +- /* Enable the requested runtime GPE */ + +- status = acpi_hw_enable_gpe (gpe_event_info); +- if (ACPI_FAILURE (status)) { +- goto unlock_and_exit; +- } +- } ++ /* Set the new type (will disable GPE if currently enabled) */ + ++ status = acpi_ev_set_gpe_type (gpe_event_info, type); + + unlock_and_exit: +- if (flags & ACPI_NOT_ISR) { +- (void) acpi_ut_release_mutex (ACPI_MTX_EVENTS); +- } + return_ACPI_STATUS (status); + } + + + /******************************************************************************* + * +- * FUNCTION: acpi_disable_event ++ * FUNCTION: acpi_enable_gpe + * +- * PARAMETERS: Event - The fixed eventto be enabled +- * Flags - Reserved ++ * PARAMETERS: gpe_device - Parent GPE Device ++ * gpe_number - GPE level within the GPE block ++ * Flags - Just enable, or also wake enable? ++ * Called from ISR or not + * + * RETURN: Status + * +- * DESCRIPTION: Disable an ACPI event (fixed) ++ * DESCRIPTION: Enable an ACPI event (general purpose) + * + ******************************************************************************/ + + acpi_status +-acpi_disable_event ( +- u32 event, ++acpi_enable_gpe ( ++ acpi_handle gpe_device, ++ u32 gpe_number, + u32 flags) + { + acpi_status status = AE_OK; +- u32 value; ++ struct acpi_gpe_event_info *gpe_event_info; + + +- ACPI_FUNCTION_TRACE ("acpi_disable_event"); ++ ACPI_FUNCTION_TRACE ("acpi_enable_gpe"); + + +- /* Decode the Fixed Event */ ++ /* Use semaphore lock if not executing at interrupt level */ + +- if (event > ACPI_EVENT_MAX) { +- return_ACPI_STATUS (AE_BAD_PARAMETER); ++ if (flags & ACPI_NOT_ISR) { ++ status = acpi_ut_acquire_mutex (ACPI_MTX_EVENTS); ++ if (ACPI_FAILURE (status)) { ++ return_ACPI_STATUS (status); ++ } + } + +- /* +- * Disable the requested fixed event (by writing a zero to the +- * enable register bit) +- */ +- status = acpi_set_register (acpi_gbl_fixed_event_info[event].enable_register_id, +- 0, ACPI_MTX_LOCK); +- if (ACPI_FAILURE (status)) { +- return_ACPI_STATUS (status); +- } ++ /* Ensure that we have a valid GPE number */ + +- status = acpi_get_register (acpi_gbl_fixed_event_info[event].enable_register_id, +- &value, ACPI_MTX_LOCK); +- if (ACPI_FAILURE (status)) { +- return_ACPI_STATUS (status); ++ gpe_event_info = acpi_ev_get_gpe_event_info (gpe_device, gpe_number); ++ if (!gpe_event_info) { ++ status = AE_BAD_PARAMETER; ++ goto unlock_and_exit; + } + +- if (value != 0) { +- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, +- "Could not disable %s events\n", acpi_ut_get_event_name (event))); +- return_ACPI_STATUS (AE_NO_HARDWARE_RESPONSE); +- } ++ /* Perform the enable */ ++ ++ status = acpi_ev_enable_gpe (gpe_event_info, TRUE); + ++unlock_and_exit: ++ if (flags & ACPI_NOT_ISR) { ++ (void) acpi_ut_release_mutex (ACPI_MTX_EVENTS); ++ } + return_ACPI_STATUS (status); + } + +@@ -342,7 +313,7 @@ + * + * PARAMETERS: gpe_device - Parent GPE Device + * gpe_number - GPE level within the GPE block +- * Flags - Just enable, or also wake enable? ++ * Flags - Just disable, or also wake disable? + * Called from ISR or not + * + * RETURN: Status +@@ -381,21 +352,69 @@ + goto unlock_and_exit; + } + ++ status = acpi_ev_disable_gpe (gpe_event_info); ++ ++unlock_and_exit: ++ if (flags & ACPI_NOT_ISR) { ++ (void) acpi_ut_release_mutex (ACPI_MTX_EVENTS); ++ } ++ return_ACPI_STATUS (status); ++} ++ ++ ++/******************************************************************************* ++ * ++ * FUNCTION: acpi_disable_event ++ * ++ * PARAMETERS: Event - The fixed eventto be enabled ++ * Flags - Reserved ++ * ++ * RETURN: Status ++ * ++ * DESCRIPTION: Disable an ACPI event (fixed) ++ * ++ ******************************************************************************/ ++ ++acpi_status ++acpi_disable_event ( ++ u32 event, ++ u32 flags) ++{ ++ acpi_status status = AE_OK; ++ u32 value; ++ ++ ++ ACPI_FUNCTION_TRACE ("acpi_disable_event"); ++ ++ ++ /* Decode the Fixed Event */ ++ ++ if (event > ACPI_EVENT_MAX) { ++ return_ACPI_STATUS (AE_BAD_PARAMETER); ++ } ++ + /* +- * Only disable the requested GPE number for wake if specified. +- * Otherwise, turn it totally off ++ * Disable the requested fixed event (by writing a zero to the ++ * enable register bit) + */ +- if (flags & ACPI_EVENT_WAKE_DISABLE) { +- acpi_hw_disable_gpe_for_wakeup (gpe_event_info); ++ status = acpi_set_register (acpi_gbl_fixed_event_info[event].enable_register_id, ++ 0, ACPI_MTX_LOCK); ++ if (ACPI_FAILURE (status)) { ++ return_ACPI_STATUS (status); + } +- else { +- status = acpi_hw_disable_gpe (gpe_event_info); ++ ++ status = acpi_get_register (acpi_gbl_fixed_event_info[event].enable_register_id, ++ &value, ACPI_MTX_LOCK); ++ if (ACPI_FAILURE (status)) { ++ return_ACPI_STATUS (status); + } + +-unlock_and_exit: +- if (flags & ACPI_NOT_ISR) { +- (void) acpi_ut_release_mutex (ACPI_MTX_EVENTS); ++ if (value != 0) { ++ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, ++ "Could not disable %s events\n", acpi_ut_get_event_name (event))); ++ return_ACPI_STATUS (AE_NO_HARDWARE_RESPONSE); + } ++ + return_ACPI_STATUS (status); + } + +diff -Nru a/drivers/acpi/events/evxfregn.c b/drivers/acpi/events/evxfregn.c +--- a/drivers/acpi/events/evxfregn.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/events/evxfregn.c 2004-09-21 21:26:34 +10:00 +@@ -46,7 +46,6 @@ + #include + #include + #include +-#include + + #define _COMPONENT ACPI_EVENTS + ACPI_MODULE_NAME ("evxfregn") +@@ -76,12 +75,8 @@ + acpi_adr_space_setup setup, + void *context) + { +- union acpi_operand_object *obj_desc; +- union acpi_operand_object *handler_obj; + struct acpi_namespace_node *node; + acpi_status status; +- acpi_object_type type; +- u16 flags = 0; + + + ACPI_FUNCTION_TRACE ("acpi_install_address_space_handler"); +@@ -106,202 +101,16 @@ + goto unlock_and_exit; + } + +- /* +- * This registration is valid for only the types below +- * and the root. This is where the default handlers +- * get placed. +- */ +- if ((node->type != ACPI_TYPE_DEVICE) && +- (node->type != ACPI_TYPE_PROCESSOR) && +- (node->type != ACPI_TYPE_THERMAL) && +- (node != acpi_gbl_root_node)) { +- status = AE_BAD_PARAMETER; +- goto unlock_and_exit; +- } +- +- if (handler == ACPI_DEFAULT_HANDLER) { +- flags = ACPI_ADDR_HANDLER_DEFAULT_INSTALLED; +- +- switch (space_id) { +- case ACPI_ADR_SPACE_SYSTEM_MEMORY: +- handler = acpi_ex_system_memory_space_handler; +- setup = acpi_ev_system_memory_region_setup; +- break; +- +- case ACPI_ADR_SPACE_SYSTEM_IO: +- handler = acpi_ex_system_io_space_handler; +- setup = acpi_ev_io_space_region_setup; +- break; +- +- case ACPI_ADR_SPACE_PCI_CONFIG: +- handler = acpi_ex_pci_config_space_handler; +- setup = acpi_ev_pci_config_region_setup; +- break; +- +- case ACPI_ADR_SPACE_CMOS: +- handler = acpi_ex_cmos_space_handler; +- setup = acpi_ev_cmos_region_setup; +- break; +- +- case ACPI_ADR_SPACE_PCI_BAR_TARGET: +- handler = acpi_ex_pci_bar_space_handler; +- setup = acpi_ev_pci_bar_region_setup; +- break; +- +- case ACPI_ADR_SPACE_DATA_TABLE: +- handler = acpi_ex_data_table_space_handler; +- setup = NULL; +- break; +- +- default: +- status = AE_BAD_PARAMETER; +- goto unlock_and_exit; +- } +- } +- +- /* If the caller hasn't specified a setup routine, use the default */ +- +- if (!setup) { +- setup = acpi_ev_default_region_setup; +- } +- +- /* Check for an existing internal object */ +- +- obj_desc = acpi_ns_get_attached_object (node); +- if (obj_desc) { +- /* +- * The attached device object already exists. +- * Make sure the handler is not already installed. +- */ +- handler_obj = obj_desc->device.handler; +- +- /* Walk the handler list for this device */ +- +- while (handler_obj) { +- /* Same space_id indicates a handler already installed */ +- +- if(handler_obj->address_space.space_id == space_id) { +- if (handler_obj->address_space.handler == handler) { +- /* +- * It is (relatively) OK to attempt to install the SAME +- * handler twice. This can easily happen with PCI_Config space. +- */ +- status = AE_SAME_HANDLER; +- goto unlock_and_exit; +- } +- else { +- /* A handler is already installed */ +- +- status = AE_ALREADY_EXISTS; +- } +- goto unlock_and_exit; +- } +- +- /* Walk the linked list of handlers */ +- +- handler_obj = handler_obj->address_space.next; +- } +- } +- else { +- ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION, +- "Creating object on Device %p while installing handler\n", node)); +- +- /* obj_desc does not exist, create one */ +- +- if (node->type == ACPI_TYPE_ANY) { +- type = ACPI_TYPE_DEVICE; +- } +- else { +- type = node->type; +- } +- +- obj_desc = acpi_ut_create_internal_object (type); +- if (!obj_desc) { +- status = AE_NO_MEMORY; +- goto unlock_and_exit; +- } +- +- /* Init new descriptor */ +- +- obj_desc->common.type = (u8) type; +- +- /* Attach the new object to the Node */ ++ /* Install the handler for all Regions for this Space ID */ + +- status = acpi_ns_attach_object (node, obj_desc, type); +- +- /* Remove local reference to the object */ +- +- acpi_ut_remove_reference (obj_desc); +- +- if (ACPI_FAILURE (status)) { +- goto unlock_and_exit; +- } +- } +- +- ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION, +- "Installing address handler for region %s(%X) on Device %4.4s %p(%p)\n", +- acpi_ut_get_region_name (space_id), space_id, +- acpi_ut_get_node_name (node), node, obj_desc)); +- +- /* +- * Install the handler +- * +- * At this point there is no existing handler. +- * Just allocate the object for the handler and link it +- * into the list. +- */ +- handler_obj = acpi_ut_create_internal_object (ACPI_TYPE_LOCAL_ADDRESS_HANDLER); +- if (!handler_obj) { +- status = AE_NO_MEMORY; ++ status = acpi_ev_install_space_handler (node, space_id, handler, setup, context); ++ if (ACPI_FAILURE (status)) { + goto unlock_and_exit; + } + +- /* Init handler obj */ ++ /* Run all _REG methods for this address space */ + +- handler_obj->address_space.space_id = (u8) space_id; +- handler_obj->address_space.hflags = flags; +- handler_obj->address_space.region_list = NULL; +- handler_obj->address_space.node = node; +- handler_obj->address_space.handler = handler; +- handler_obj->address_space.context = context; +- handler_obj->address_space.setup = setup; +- +- /* Install at head of Device.address_space list */ +- +- handler_obj->address_space.next = obj_desc->device.handler; +- +- /* +- * The Device object is the first reference on the handler_obj. +- * Each region that uses the handler adds a reference. +- */ +- obj_desc->device.handler = handler_obj; +- +- /* +- * Walk the namespace finding all of the regions this +- * handler will manage. +- * +- * Start at the device and search the branch toward +- * the leaf nodes until either the leaf is encountered or +- * a device is detected that has an address handler of the +- * same type. +- * +- * In either case, back up and search down the remainder +- * of the branch +- */ +- status = acpi_ns_walk_namespace (ACPI_TYPE_ANY, device, ACPI_UINT32_MAX, +- ACPI_NS_WALK_UNLOCK, acpi_ev_install_handler, +- handler_obj, NULL); +- +- /* +- * Now we can run the _REG methods for all Regions for this +- * space ID. This is a separate walk in order to handle any +- * interdependencies between regions and _REG methods. (i.e. handlers +- * must be installed for all regions of this Space ID before we +- * can run any _REG methods. +- */ +- status = acpi_ns_walk_namespace (ACPI_TYPE_ANY, device, ACPI_UINT32_MAX, +- ACPI_NS_WALK_UNLOCK, acpi_ev_reg_run, +- handler_obj, NULL); ++ status = acpi_ev_execute_reg_methods (node, space_id); + + unlock_and_exit: + (void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); +diff -Nru a/drivers/acpi/executer/exconfig.c b/drivers/acpi/executer/exconfig.c +--- a/drivers/acpi/executer/exconfig.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/executer/exconfig.c 2004-09-21 21:26:34 +10:00 +@@ -48,6 +48,7 @@ + #include + #include + #include ++#include + + + #define _COMPONENT ACPI_EXECUTER +@@ -285,7 +286,7 @@ + union acpi_operand_object *ddb_handle; + union acpi_operand_object *buffer_desc = NULL; + struct acpi_table_header *table_ptr = NULL; +- u8 *table_data_ptr; ++ acpi_physical_address address; + struct acpi_table_header table_header; + u32 i; + +@@ -300,18 +301,39 @@ + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Load from Region %p %s\n", + obj_desc, acpi_ut_get_object_type_name (obj_desc))); + +- /* Get the table header */ ++ /* ++ * If the Region Address and Length have not been previously evaluated, ++ * evaluate them now and save the results. ++ */ ++ if (!(obj_desc->common.flags & AOPOBJ_DATA_VALID)) { ++ status = acpi_ds_get_region_arguments (obj_desc); ++ if (ACPI_FAILURE (status)) { ++ return_ACPI_STATUS (status); ++ } ++ } ++ ++ /* Get the base physical address of the region */ ++ ++ address = obj_desc->region.address; ++ ++ /* Get the table length from the table header */ + + table_header.length = 0; +- for (i = 0; i < sizeof (struct acpi_table_header); i++) { ++ for (i = 0; i < 8; i++) { + status = acpi_ev_address_space_dispatch (obj_desc, ACPI_READ, +- (acpi_physical_address) i, 8, ++ (acpi_physical_address) (i + address), 8, + ((u8 *) &table_header) + i); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } + } + ++ /* Sanity check the table length */ ++ ++ if (table_header.length < sizeof (struct acpi_table_header)) { ++ return_ACPI_STATUS (AE_BAD_HEADER); ++ } ++ + /* Allocate a buffer for the entire table */ + + table_ptr = ACPI_MEM_ALLOCATE (table_header.length); +@@ -319,17 +341,12 @@ + return_ACPI_STATUS (AE_NO_MEMORY); + } + +- /* Copy the header to the buffer */ +- +- ACPI_MEMCPY (table_ptr, &table_header, sizeof (struct acpi_table_header)); +- table_data_ptr = ACPI_PTR_ADD (u8, table_ptr, sizeof (struct acpi_table_header)); +- +- /* Get the table from the op region */ ++ /* Get the entire table from the op region */ + + for (i = 0; i < table_header.length; i++) { + status = acpi_ev_address_space_dispatch (obj_desc, ACPI_READ, +- (acpi_physical_address) i, 8, +- ((u8 *) table_data_ptr + i)); ++ (acpi_physical_address) (i + address), 8, ++ ((u8 *) table_ptr + i)); + if (ACPI_FAILURE (status)) { + goto cleanup; + } +@@ -355,6 +372,12 @@ + } + + table_ptr = ACPI_CAST_PTR (struct acpi_table_header, buffer_desc->buffer.pointer); ++ ++ /* Sanity check the table length */ ++ ++ if (table_ptr->length < sizeof (struct acpi_table_header)) { ++ return_ACPI_STATUS (AE_BAD_HEADER); ++ } + break; + + +diff -Nru a/drivers/acpi/executer/exfldio.c b/drivers/acpi/executer/exfldio.c +--- a/drivers/acpi/executer/exfldio.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/executer/exfldio.c 2004-09-21 21:26:34 +10:00 +@@ -130,6 +130,21 @@ + if (rgn_desc->region.length < (obj_desc->common_field.base_byte_offset + + field_datum_byte_offset + + obj_desc->common_field.access_byte_width)) { ++ if (acpi_gbl_enable_interpreter_slack) { ++ /* ++ * Slack mode only: We will go ahead and allow access to this ++ * field if it is within the region length rounded up to the next ++ * access width boundary. ++ */ ++ if (ACPI_ROUND_UP (rgn_desc->region.length, ++ obj_desc->common_field.access_byte_width) >= ++ (obj_desc->common_field.base_byte_offset + ++ obj_desc->common_field.access_byte_width + ++ field_datum_byte_offset)) { ++ return_ACPI_STATUS (AE_OK); ++ } ++ } ++ + if (rgn_desc->region.length < obj_desc->common_field.access_byte_width) { + /* + * This is the case where the access_type (acc_word, etc.) is wider +@@ -154,40 +169,7 @@ + field_datum_byte_offset, obj_desc->common_field.access_byte_width, + acpi_ut_get_node_name (rgn_desc->region.node), rgn_desc->region.length)); + +- if (!acpi_strict) { +- /* +- * Allow access to the field if it is within the region size +- * rounded up to a multiple of the access byte width. This +- * overcomes "off-by-one" programming errors in the AML often +- * found in Toshiba laptops. These errors were allowed by +- * the Microsoft ASL compiler. +- */ +- u32 rounded_length = ACPI_ROUND_UP(rgn_desc->region.length, +- obj_desc->common_field.access_byte_width); +- +- if (rounded_length < (obj_desc->common_field.base_byte_offset +- + field_datum_byte_offset +- + obj_desc->common_field.access_byte_width)) { +- return_ACPI_STATUS (AE_AML_REGION_LIMIT); +- } else { +- static int warn_once = 1; +- if (warn_once) { +- // Could also associate a flag with each field, and +- // warn once for each field. +- ACPI_REPORT_WARNING(( +- "The ACPI AML in your computer contains errors, " +- "please nag the manufacturer to correct it.\n")); +- ACPI_REPORT_WARNING(( +- "Allowing relaxed access to fields; " +- "turn on CONFIG_ACPI_DEBUG for details.\n")); +- warn_once = 0; +- } +- return_ACPI_STATUS (AE_OK); +- } +- } +- else { +- return_ACPI_STATUS (AE_AML_REGION_LIMIT); +- } ++ return_ACPI_STATUS (AE_AML_REGION_LIMIT); + } + + return_ACPI_STATUS (AE_OK); +@@ -277,7 +259,7 @@ + rgn_desc->region.space_id)); + } + else if (status == AE_NOT_EXIST) { +- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, ++ ACPI_REPORT_ERROR (( + "Region %s(%X) has no handler\n", + acpi_ut_get_region_name (rgn_desc->region.space_id), + rgn_desc->region.space_id)); +@@ -766,14 +748,83 @@ + + /******************************************************************************* + * ++ * FUNCTION: acpi_ex_common_buffer_setup ++ * ++ * PARAMETERS: obj_desc - Field object ++ * buffer_length - Length of caller's buffer ++ * datum_count - Where the datum_count is returned ++ * ++ * RETURN: Status, datum_count ++ * ++ * DESCRIPTION: Common code to validate the incoming buffer size and compute ++ * the number of field "datums" that must be read or written. ++ * A "datum" is the smallest unit that can be read or written ++ * to the field, it is either 1,2,4, or 8 bytes. ++ * ++ ******************************************************************************/ ++ ++acpi_status ++acpi_ex_common_buffer_setup ( ++ union acpi_operand_object *obj_desc, ++ u32 buffer_length, ++ u32 *datum_count) ++{ ++ u32 byte_field_length; ++ u32 actual_byte_field_length; ++ ++ ++ ACPI_FUNCTION_TRACE ("ex_common_buffer_setup"); ++ ++ ++ /* ++ * Incoming buffer must be at least as long as the field, we do not ++ * allow "partial" field reads/writes. We do not care if the buffer is ++ * larger than the field, this typically happens when an integer is ++ * read/written to a field that is actually smaller than an integer. ++ */ ++ byte_field_length = ACPI_ROUND_BITS_UP_TO_BYTES ( ++ obj_desc->common_field.bit_length); ++ if (byte_field_length > buffer_length) { ++ ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, ++ "Field size %X (bytes) is too large for buffer (%X)\n", ++ byte_field_length, buffer_length)); ++ ++ return_ACPI_STATUS (AE_BUFFER_OVERFLOW); ++ } ++ ++ /* ++ * Create "actual" field byte count (minimum number of bytes that ++ * must be read), then convert to datum count (minimum number ++ * of datum-sized units that must be read) ++ */ ++ actual_byte_field_length = ACPI_ROUND_BITS_UP_TO_BYTES ( ++ obj_desc->common_field.start_field_bit_offset + ++ obj_desc->common_field.bit_length); ++ ++ ++ *datum_count = ACPI_ROUND_UP_TO (actual_byte_field_length, ++ obj_desc->common_field.access_byte_width); ++ ++ ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, ++ "buffer_bytes %X, actual_bytes %X, Datums %X, byte_gran %X\n", ++ byte_field_length, actual_byte_field_length, ++ *datum_count, obj_desc->common_field.access_byte_width)); ++ ++ return_ACPI_STATUS (AE_OK); ++} ++ ++ ++/******************************************************************************* ++ * + * FUNCTION: acpi_ex_extract_from_field + * +- * PARAMETERS: *obj_desc - Field to be read +- * *Value - Where to store value ++ * PARAMETERS: obj_desc - Field to be read ++ * Buffer - Where to store the field data ++ * buffer_length - Length of Buffer + * + * RETURN: Status + * +- * DESCRIPTION: Retrieve the value of the given field ++ * DESCRIPTION: Retrieve the current value of the given field + * + ******************************************************************************/ + +@@ -789,7 +840,6 @@ + acpi_integer previous_raw_datum = 0; + acpi_integer this_raw_datum = 0; + acpi_integer merged_datum = 0; +- u32 byte_field_length; + u32 datum_count; + u32 i; + +@@ -797,39 +847,13 @@ + ACPI_FUNCTION_TRACE ("ex_extract_from_field"); + + +- /* +- * The field must fit within the caller's buffer +- */ +- byte_field_length = ACPI_ROUND_BITS_UP_TO_BYTES (obj_desc->common_field.bit_length); +- if (byte_field_length > buffer_length) { +- ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, +- "Field size %X (bytes) too large for buffer (%X)\n", +- byte_field_length, buffer_length)); +- +- return_ACPI_STATUS (AE_BUFFER_OVERFLOW); +- } +- +- /* Convert field byte count to datum count, round up if necessary */ +- +- datum_count = ACPI_ROUND_UP_TO (byte_field_length, +- obj_desc->common_field.access_byte_width); ++ /* Validate buffer, compute number of datums */ + +- /* +- * If the field is not aligned on a datum boundary and does not +- * fit within a single datum, we must read an extra datum. +- * +- * We could just split the aligned and non-aligned cases since the +- * aligned case is so very simple, but this would require more code. +- */ +- if ((obj_desc->common_field.end_field_valid_bits != 0) && +- (!(obj_desc->common_field.flags & AOPOBJ_SINGLE_DATUM))) { +- datum_count++; ++ status = acpi_ex_common_buffer_setup (obj_desc, buffer_length, &datum_count); ++ if (ACPI_FAILURE (status)) { ++ return_ACPI_STATUS (status); + } + +- ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, +- "byte_len %X, datum_len %X, byte_gran %X\n", +- byte_field_length, datum_count,obj_desc->common_field.access_byte_width)); +- + /* + * Clear the caller's buffer (the whole buffer length as given) + * This is very important, especially in the cases where the buffer +@@ -942,12 +966,13 @@ + * + * FUNCTION: acpi_ex_insert_into_field + * +- * PARAMETERS: *obj_desc - Field to be set +- * Buffer - Value to store ++ * PARAMETERS: obj_desc - Field to be written ++ * Buffer - Data to be written ++ * buffer_length - Length of Buffer + * + * RETURN: Status + * +- * DESCRIPTION: Store the value into the given field ++ * DESCRIPTION: Store the Buffer contents into the given field + * + ******************************************************************************/ + +@@ -964,41 +989,18 @@ + acpi_integer merged_datum; + acpi_integer previous_raw_datum; + acpi_integer this_raw_datum; +- u32 byte_field_length; + u32 datum_count; + + + ACPI_FUNCTION_TRACE ("ex_insert_into_field"); + + +- /* +- * Incoming buffer must be at least as long as the field, we do not +- * allow "partial" field writes. We do not care if the buffer is +- * larger than the field, this typically happens when an integer is +- * written to a field that is actually smaller than an integer. +- */ +- byte_field_length = ACPI_ROUND_BITS_UP_TO_BYTES ( +- obj_desc->common_field.bit_length); +- if (buffer_length < byte_field_length) { +- ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, +- "Buffer length %X too small for field %X\n", +- buffer_length, byte_field_length)); ++ /* Validate buffer, compute number of datums */ + +- return_ACPI_STATUS (AE_BUFFER_OVERFLOW); ++ status = acpi_ex_common_buffer_setup (obj_desc, buffer_length, &datum_count); ++ if (ACPI_FAILURE (status)) { ++ return_ACPI_STATUS (status); + } +- +- byte_field_length = ACPI_ROUND_BITS_UP_TO_BYTES ( +- obj_desc->common_field.start_field_bit_offset + +- obj_desc->common_field.bit_length); +- +- /* Convert byte count to datum count, round up if necessary */ +- +- datum_count = ACPI_ROUND_UP_TO (byte_field_length, +- obj_desc->common_field.access_byte_width); +- +- ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, +- "Bytes %X, Datums %X, byte_gran %X\n", +- byte_field_length, datum_count, obj_desc->common_field.access_byte_width)); + + /* + * Break the request into up to three parts (similar to an I/O request): +diff -Nru a/drivers/acpi/executer/exmisc.c b/drivers/acpi/executer/exmisc.c +--- a/drivers/acpi/executer/exmisc.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/executer/exmisc.c 2004-09-21 21:26:34 +10:00 +@@ -389,6 +389,8 @@ + acpi_integer operand1) + { + ++ ACPI_FUNCTION_ENTRY (); ++ + + switch (opcode) { + case AML_ADD_OP: /* Add (Operand0, Operand1, Result) */ +@@ -452,15 +454,17 @@ + * FUNCTION: acpi_ex_do_logical_op + * + * PARAMETERS: Opcode - AML opcode +- * Operand0 - Integer operand #0 +- * Operand1 - Integer operand #1 ++ * obj_desc0 - operand #0 ++ * obj_desc1 - operand #1 + * + * RETURN: TRUE/FALSE result of the operation + * + * DESCRIPTION: Execute a logical AML opcode. The purpose of having all of the + * functions here is to prevent a lot of pointer dereferencing + * to obtain the operands and to simplify the generation of the +- * logical value. ++ * logical value. Both operands must already be validated as ++ * 1) Both the same type, and ++ * 2) Either Integer, Buffer, or String type. + * + * Note: cleanest machine code seems to be produced by the code + * below, rather than using statements of the form: +@@ -471,54 +475,137 @@ + u8 + acpi_ex_do_logical_op ( + u16 opcode, +- acpi_integer operand0, +- acpi_integer operand1) ++ union acpi_operand_object *obj_desc0, ++ union acpi_operand_object *obj_desc1) + { ++ acpi_integer operand0; ++ acpi_integer operand1; ++ u8 *ptr0; ++ u8 *ptr1; ++ u32 length0; ++ u32 length1; ++ u32 i; + + +- switch (opcode) { ++ ACPI_FUNCTION_ENTRY (); + +- case AML_LAND_OP: /* LAnd (Operand0, Operand1) */ + +- if (operand0 && operand1) { +- return (TRUE); +- } +- break; ++ if (ACPI_GET_OBJECT_TYPE (obj_desc0) == ACPI_TYPE_INTEGER) { ++ /* Both operands are of type integer */ + ++ operand0 = obj_desc0->integer.value; ++ operand1 = obj_desc1->integer.value; + +- case AML_LEQUAL_OP: /* LEqual (Operand0, Operand1) */ ++ switch (opcode) { ++ case AML_LAND_OP: /* LAnd (Operand0, Operand1) */ + +- if (operand0 == operand1) { +- return (TRUE); +- } +- break; ++ if (operand0 && operand1) { ++ return (TRUE); ++ } ++ break; + ++ case AML_LEQUAL_OP: /* LEqual (Operand0, Operand1) */ + +- case AML_LGREATER_OP: /* LGreater (Operand0, Operand1) */ ++ if (operand0 == operand1) { ++ return (TRUE); ++ } ++ break; + +- if (operand0 > operand1) { +- return (TRUE); +- } +- break; ++ case AML_LGREATER_OP: /* LGreater (Operand0, Operand1) */ + ++ if (operand0 > operand1) { ++ return (TRUE); ++ } ++ break; + +- case AML_LLESS_OP: /* LLess (Operand0, Operand1) */ ++ case AML_LLESS_OP: /* LLess (Operand0, Operand1) */ + +- if (operand0 < operand1) { +- return (TRUE); +- } +- break; ++ if (operand0 < operand1) { ++ return (TRUE); ++ } ++ break; + ++ case AML_LOR_OP: /* LOr (Operand0, Operand1) */ + +- case AML_LOR_OP: /* LOr (Operand0, Operand1) */ ++ if (operand0 || operand1) { ++ return (TRUE); ++ } ++ break; + +- if (operand0 || operand1) { +- return (TRUE); ++ default: ++ break; + } +- break; ++ } ++ else { ++ /* ++ * Case for Buffer/String objects. ++ * NOTE: takes advantage of common Buffer/String object fields ++ */ ++ length0 = obj_desc0->buffer.length; ++ ptr0 = obj_desc0->buffer.pointer; ++ ++ length1 = obj_desc1->buffer.length; ++ ptr1 = obj_desc1->buffer.pointer; ++ ++ switch (opcode) { ++ case AML_LEQUAL_OP: /* LEqual (Operand0, Operand1) */ ++ ++ /* Length and all bytes must be equal */ ++ ++ if (length0 != length1) { ++ return (FALSE); ++ } ++ ++ for (i = 0; i < length0; i++) { ++ if (ptr0[i] != ptr1[i]) { ++ return (FALSE); ++ } ++ } ++ return (TRUE); + +- default: +- break; ++ case AML_LGREATER_OP: /* LGreater (Operand0, Operand1) */ ++ ++ /* Lexicographic compare: Scan the 1-to-1 data */ ++ ++ for (i = 0; (i < length0) && (i < length1); i++) { ++ if (ptr0[i] > ptr1[i]) { ++ return (TRUE); ++ } ++ } ++ ++ /* Bytes match, now check lengths */ ++ ++ if (length0 > length1) { ++ return (TRUE); ++ } ++ ++ /* Length0 <= Length1 */ ++ ++ return (FALSE); ++ ++ case AML_LLESS_OP: /* LLess (Operand0, Operand1) */ ++ ++ /* Lexicographic compare: Scan the 1-to-1 data */ ++ ++ for (i = 0; (i < length0) && (i < length1); i++) { ++ if (ptr0[i] < ptr1[i]) { ++ return (TRUE); ++ } ++ } ++ ++ /* Bytes match, now check lengths */ ++ ++ if (length0 < length1) { ++ return (TRUE); ++ } ++ ++ /* Length0 >= Length1 */ ++ ++ return (FALSE); ++ ++ default: ++ break; ++ } + } + + return (FALSE); +diff -Nru a/drivers/acpi/executer/exmutex.c b/drivers/acpi/executer/exmutex.c +--- a/drivers/acpi/executer/exmutex.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/executer/exmutex.c 2004-09-21 21:26:34 +10:00 +@@ -54,7 +54,7 @@ + * + * FUNCTION: acpi_ex_unlink_mutex + * +- * PARAMETERS: *obj_desc - The mutex to be unlinked ++ * PARAMETERS: obj_desc - The mutex to be unlinked + * + * RETURN: Status + * +@@ -73,6 +73,8 @@ + return; + } + ++ /* Doubly linked list */ ++ + if (obj_desc->mutex.next) { + (obj_desc->mutex.next)->mutex.prev = obj_desc->mutex.prev; + } +@@ -90,8 +92,8 @@ + * + * FUNCTION: acpi_ex_link_mutex + * +- * PARAMETERS: *obj_desc - The mutex to be linked +- * *list_head - head of the "acquired_mutex" list ++ * PARAMETERS: obj_desc - The mutex to be linked ++ * list_head - head of the "acquired_mutex" list + * + * RETURN: Status + * +@@ -130,8 +132,8 @@ + * + * FUNCTION: acpi_ex_acquire_mutex + * +- * PARAMETERS: *time_desc - The 'time to delay' object descriptor +- * *obj_desc - The object descriptor for this op ++ * PARAMETERS: time_desc - The 'time to delay' object descriptor ++ * obj_desc - The object descriptor for this op + * + * RETURN: Status + * +@@ -173,9 +175,8 @@ + return_ACPI_STATUS (AE_AML_MUTEX_ORDER); + } + +- /* +- * Support for multiple acquires by the owning thread +- */ ++ /* Support for multiple acquires by the owning thread */ ++ + if (obj_desc->mutex.owner_thread) { + /* Special case for Global Lock, allow all threads */ + +@@ -199,10 +200,11 @@ + return_ACPI_STATUS (status); + } + +- /* Have the mutex, update mutex and walk info */ ++ /* Have the mutex: update mutex and walk info and save the sync_level */ + +- obj_desc->mutex.owner_thread = walk_state->thread; ++ obj_desc->mutex.owner_thread = walk_state->thread; + obj_desc->mutex.acquisition_depth = 1; ++ obj_desc->mutex.original_sync_level = walk_state->thread->current_sync_level; + + walk_state->thread->current_sync_level = obj_desc->mutex.sync_level; + +@@ -218,7 +220,7 @@ + * + * FUNCTION: acpi_ex_release_mutex + * +- * PARAMETERS: *obj_desc - The object descriptor for this op ++ * PARAMETERS: obj_desc - The object descriptor for this op + * + * RETURN: Status + * +@@ -281,9 +283,8 @@ + return_ACPI_STATUS (AE_AML_MUTEX_ORDER); + } + +- /* +- * Match multiple Acquires with multiple Releases +- */ ++ /* Match multiple Acquires with multiple Releases */ ++ + obj_desc->mutex.acquisition_depth--; + if (obj_desc->mutex.acquisition_depth != 0) { + /* Just decrement the depth and return */ +@@ -299,10 +300,10 @@ + + status = acpi_ex_system_release_mutex (obj_desc); + +- /* Update the mutex and walk state */ ++ /* Update the mutex and walk state, restore sync_level before acquire */ + + obj_desc->mutex.owner_thread = NULL; +- walk_state->thread->current_sync_level = obj_desc->mutex.sync_level; ++ walk_state->thread->current_sync_level = obj_desc->mutex.original_sync_level; + + return_ACPI_STATUS (status); + } +@@ -312,7 +313,7 @@ + * + * FUNCTION: acpi_ex_release_all_mutexes + * +- * PARAMETERS: *mutex_list - Head of the mutex list ++ * PARAMETERS: mutex_list - Head of the mutex list + * + * RETURN: Status + * +@@ -332,9 +333,8 @@ + ACPI_FUNCTION_ENTRY (); + + +- /* +- * Traverse the list of owned mutexes, releasing each one. +- */ ++ /* Traverse the list of owned mutexes, releasing each one */ ++ + while (next) { + this = next; + next = this->mutex.next; +@@ -352,7 +352,11 @@ + + /* Mark mutex unowned */ + +- this->mutex.owner_thread = NULL; ++ this->mutex.owner_thread = NULL; ++ ++ /* Update Thread sync_level (Last mutex is the important one) */ ++ ++ thread->current_sync_level = this->mutex.original_sync_level; + } + } + +diff -Nru a/drivers/acpi/executer/exoparg2.c b/drivers/acpi/executer/exoparg2.c +--- a/drivers/acpi/executer/exoparg2.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/executer/exoparg2.c 2004-09-21 21:26:34 +10:00 +@@ -97,6 +97,7 @@ + { + union acpi_operand_object **operand = &walk_state->operands[0]; + struct acpi_namespace_node *node; ++ u32 value; + acpi_status status = AE_OK; + + +@@ -113,16 +114,46 @@ + + node = (struct acpi_namespace_node *) operand[0]; + ++ /* Second value is the notify value */ ++ ++ value = (u32) operand[1]->integer.value; ++ + /* Notifies allowed on this object? */ + + if (!acpi_ev_is_notify_object (node)) { +- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unexpected notify object type [%s]\n", ++ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, ++ "Unexpected notify object type [%s]\n", + acpi_ut_get_type_name (node->type))); + + status = AE_AML_OPERAND_TYPE; + break; + } + ++#ifdef ACPI_GPE_NOTIFY_CHECK ++ /* ++ * GPE method wake/notify check. Here, we want to ensure that we ++ * don't receive any "device_wake" Notifies from a GPE _Lxx or _Exx ++ * GPE method during system runtime. If we do, the GPE is marked ++ * as "wake-only" and disabled. ++ * ++ * 1) Is the Notify() value == device_wake? ++ * 2) Is this a GPE deferred method? (An _Lxx or _Exx method) ++ * 3) Did the original GPE happen at system runtime? ++ * (versus during wake) ++ * ++ * If all three cases are true, this is a wake-only GPE that should ++ * be disabled at runtime. ++ */ ++ if (value == 2) /* device_wake */ { ++ status = acpi_ev_check_for_wake_only_gpe (walk_state->gpe_event_info); ++ if (ACPI_FAILURE (status)) { ++ /* AE_WAKE_ONLY_GPE only error, means ignore this notify */ ++ ++ return_ACPI_STATUS (AE_OK) ++ } ++ } ++#endif ++ + /* + * Dispatch the notify to the appropriate handler + * NOTE: the request is queued for execution after this method +@@ -130,8 +161,7 @@ + * from this thread -- because handlers may in turn run other + * control methods. + */ +- status = acpi_ev_queue_notify_request (node, +- (u32) operand[1]->integer.value); ++ status = acpi_ev_queue_notify_request (node, value); + break; + + +@@ -543,9 +573,17 @@ + * Execute the Opcode + */ + if (walk_state->op_info->flags & AML_LOGICAL) /* logical_op (Operand0, Operand1) */ { ++ /* Both operands must be of the same type */ ++ ++ if (ACPI_GET_OBJECT_TYPE (operand[0]) != ++ ACPI_GET_OBJECT_TYPE (operand[1])) { ++ status = AE_AML_OPERAND_TYPE; ++ goto cleanup; ++ } ++ + logical_result = acpi_ex_do_logical_op (walk_state->opcode, +- operand[0]->integer.value, +- operand[1]->integer.value); ++ operand[0], ++ operand[1]); + goto store_logical_result; + } + +diff -Nru a/drivers/acpi/executer/exresolv.c b/drivers/acpi/executer/exresolv.c +--- a/drivers/acpi/executer/exresolv.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/executer/exresolv.c 2004-09-21 21:26:34 +10:00 +@@ -187,15 +187,15 @@ + return_ACPI_STATUS (status); + } + ++ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Arg/Local %X] value_obj is %p\n", ++ stack_desc->reference.offset, obj_desc)); ++ + /* + * Now we can delete the original Reference Object and +- * replace it with the resolve value ++ * replace it with the resolved value + */ + acpi_ut_remove_reference (stack_desc); + *stack_ptr = obj_desc; +- +- ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Arg/Local %d] value_obj is %p\n", +- stack_desc->reference.offset, obj_desc)); + break; + + +diff -Nru a/drivers/acpi/executer/exstore.c b/drivers/acpi/executer/exstore.c +--- a/drivers/acpi/executer/exstore.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/executer/exstore.c 2004-09-21 21:26:34 +10:00 +@@ -102,7 +102,8 @@ + * Storing an object into a Named node. + */ + status = acpi_ex_store_object_to_node (source_desc, +- (struct acpi_namespace_node *) dest_desc, walk_state); ++ (struct acpi_namespace_node *) dest_desc, walk_state, ++ ACPI_IMPLICIT_CONVERSION); + + return_ACPI_STATUS (status); + } +@@ -153,7 +154,7 @@ + /* Storing an object into a Name "container" */ + + status = acpi_ex_store_object_to_node (source_desc, ref_desc->reference.object, +- walk_state); ++ walk_state, ACPI_IMPLICIT_CONVERSION); + break; + + +@@ -399,6 +400,7 @@ + * PARAMETERS: source_desc - Value to be stored + * Node - Named object to receive the value + * walk_state - Current walk state ++ * implicit_conversion - Perform implicit conversion (yes/no) + * + * RETURN: Status + * +@@ -421,7 +423,8 @@ + acpi_ex_store_object_to_node ( + union acpi_operand_object *source_desc, + struct acpi_namespace_node *node, +- struct acpi_walk_state *walk_state) ++ struct acpi_walk_state *walk_state, ++ u8 implicit_conversion) + { + acpi_status status = AE_OK; + union acpi_operand_object *target_desc; +@@ -449,6 +452,14 @@ + status = acpi_ex_resolve_object (&source_desc, target_type, walk_state); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); ++ } ++ ++ /* If no implicit conversion, drop into the default case below */ ++ ++ if (!implicit_conversion) { ++ /* Force execution of default (no implicit conversion) */ ++ ++ target_type = ACPI_TYPE_ANY; + } + + /* +diff -Nru a/drivers/acpi/hardware/hwgpe.c b/drivers/acpi/hardware/hwgpe.c +--- a/drivers/acpi/hardware/hwgpe.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/hardware/hwgpe.c 2004-09-21 21:26:34 +10:00 +@@ -51,104 +51,24 @@ + + /****************************************************************************** + * +- * FUNCTION: acpi_hw_enable_gpe ++ * FUNCTION: acpi_hw_write_gpe_enable_reg + * + * PARAMETERS: gpe_event_info - Info block for the GPE to be enabled + * + * RETURN: Status + * +- * DESCRIPTION: Enable a single GPE. ++ * DESCRIPTION: Write a GPE enable register. Note: The bit for this GPE must ++ * already be cleared or set in the parent register ++ * enable_for_run mask. + * + ******************************************************************************/ + + acpi_status +-acpi_hw_enable_gpe ( +- struct acpi_gpe_event_info *gpe_event_info) +-{ +- u32 in_byte; +- acpi_status status; +- +- +- ACPI_FUNCTION_ENTRY (); +- +- +- /* +- * Read the current value of the register, set the appropriate bit +- * to enable the GPE, and write out the new register. +- */ +- status = acpi_hw_low_level_read (8, &in_byte, +- &gpe_event_info->register_info->enable_address); +- if (ACPI_FAILURE (status)) { +- return (status); +- } +- +- /* Write with the new GPE bit enabled */ +- +- status = acpi_hw_low_level_write (8, (in_byte | gpe_event_info->bit_mask), +- &gpe_event_info->register_info->enable_address); +- +- return (status); +-} +- +- +-/****************************************************************************** +- * +- * FUNCTION: acpi_hw_enable_gpe_for_wakeup +- * +- * PARAMETERS: gpe_event_info - Info block for the GPE to be enabled +- * +- * RETURN: None +- * +- * DESCRIPTION: Keep track of which GPEs the OS has requested not be +- * disabled when going to sleep. +- * +- ******************************************************************************/ +- +-void +-acpi_hw_enable_gpe_for_wakeup ( ++acpi_hw_write_gpe_enable_reg ( + struct acpi_gpe_event_info *gpe_event_info) + { + struct acpi_gpe_register_info *gpe_register_info; +- +- +- ACPI_FUNCTION_ENTRY (); +- +- +- /* Get the info block for the entire GPE register */ +- +- gpe_register_info = gpe_event_info->register_info; +- if (!gpe_register_info) { +- return; +- } +- +- /* +- * Set the bit so we will not enable this GPE when sleeping (and disable +- * it upon wake) +- */ +- gpe_register_info->wake_enable |= gpe_event_info->bit_mask; +- gpe_event_info->flags |= (ACPI_GPE_TYPE_WAKE | ACPI_GPE_ENABLED); +-} +- +- +-/****************************************************************************** +- * +- * FUNCTION: acpi_hw_disable_gpe +- * +- * PARAMETERS: gpe_event_info - Info block for the GPE to be disabled +- * +- * RETURN: Status +- * +- * DESCRIPTION: Disable a single GPE. +- * +- ******************************************************************************/ +- +-acpi_status +-acpi_hw_disable_gpe ( +- struct acpi_gpe_event_info *gpe_event_info) +-{ +- u32 in_byte; + acpi_status status; +- struct acpi_gpe_register_info *gpe_register_info; + + + ACPI_FUNCTION_ENTRY (); +@@ -158,67 +78,15 @@ + + gpe_register_info = gpe_event_info->register_info; + if (!gpe_register_info) { +- return (AE_BAD_PARAMETER); +- } +- +- /* +- * Read the current value of the register, clear the appropriate bit, +- * and write out the new register value to disable the GPE. +- */ +- status = acpi_hw_low_level_read (8, &in_byte, +- &gpe_register_info->enable_address); +- if (ACPI_FAILURE (status)) { +- return (status); ++ return (AE_NOT_EXIST); + } + +- /* Write the byte with this GPE bit cleared */ ++ /* Write the entire GPE (runtime) enable register */ + +- status = acpi_hw_low_level_write (8, (in_byte & ~(gpe_event_info->bit_mask)), ++ status = acpi_hw_low_level_write (8, gpe_register_info->enable_for_run, + &gpe_register_info->enable_address); +- if (ACPI_FAILURE (status)) { +- return (status); +- } +- +- /* Make sure this GPE is disabled for wake, also */ +- +- acpi_hw_disable_gpe_for_wakeup (gpe_event_info); +- return (AE_OK); +-} +- +- +-/****************************************************************************** +- * +- * FUNCTION: acpi_hw_disable_gpe_for_wakeup +- * +- * PARAMETERS: gpe_event_info - Info block for the GPE to be disabled +- * +- * RETURN: None +- * +- * DESCRIPTION: Keep track of which GPEs the OS has requested not be +- * disabled when going to sleep. +- * +- ******************************************************************************/ + +-void +-acpi_hw_disable_gpe_for_wakeup ( +- struct acpi_gpe_event_info *gpe_event_info) +-{ +- struct acpi_gpe_register_info *gpe_register_info; +- +- +- ACPI_FUNCTION_ENTRY (); +- +- +- /* Get the info block for the entire GPE register */ +- +- gpe_register_info = gpe_event_info->register_info; +- if (!gpe_register_info) { +- return; +- } +- +- /* Clear the bit so we will disable this when sleeping */ +- +- gpe_register_info->wake_enable &= ~(gpe_event_info->bit_mask); ++ return (status); + } + + +@@ -228,7 +96,7 @@ + * + * PARAMETERS: gpe_event_info - Info block for the GPE to be cleared + * +- * RETURN: status_status ++ * RETURN: Status + * + * DESCRIPTION: Clear the status bit for a single GPE. + * +@@ -248,7 +116,7 @@ + * Write a one to the appropriate bit in the status register to + * clear this GPE. + */ +- status = acpi_hw_low_level_write (8, gpe_event_info->bit_mask, ++ status = acpi_hw_low_level_write (8, gpe_event_info->register_bit, + &gpe_event_info->register_info->status_address); + + return (status); +@@ -274,7 +142,7 @@ + acpi_event_status *event_status) + { + u32 in_byte; +- u8 bit_mask; ++ u8 register_bit; + struct acpi_gpe_register_info *gpe_register_info; + acpi_status status; + acpi_event_status local_event_status = 0; +@@ -293,33 +161,28 @@ + + /* Get the register bitmask for this GPE */ + +- bit_mask = gpe_event_info->bit_mask; +- +- /* GPE Enabled? */ ++ register_bit = gpe_event_info->register_bit; + +- status = acpi_hw_low_level_read (8, &in_byte, &gpe_register_info->enable_address); +- if (ACPI_FAILURE (status)) { +- goto unlock_and_exit; +- } ++ /* GPE currently enabled? (enabled for runtime?) */ + +- if (bit_mask & in_byte) { ++ if (register_bit & gpe_register_info->enable_for_run) { + local_event_status |= ACPI_EVENT_FLAG_ENABLED; + } + +- /* GPE Enabled for wake? */ ++ /* GPE enabled for wake? */ + +- if (bit_mask & gpe_register_info->wake_enable) { ++ if (register_bit & gpe_register_info->enable_for_wake) { + local_event_status |= ACPI_EVENT_FLAG_WAKE_ENABLED; + } + +- /* GPE active (set)? */ ++ /* GPE currently active (status bit == 1)? */ + + status = acpi_hw_low_level_read (8, &in_byte, &gpe_register_info->status_address); + if (ACPI_FAILURE (status)) { + goto unlock_and_exit; + } + +- if (bit_mask & in_byte) { ++ if (register_bit & in_byte) { + local_event_status |= ACPI_EVENT_FLAG_SET; + } + +@@ -411,64 +274,43 @@ + + /****************************************************************************** + * +- * FUNCTION: acpi_hw_prepare_gpe_block_for_sleep ++ * FUNCTION: acpi_hw_enable_runtime_gpe_block + * + * PARAMETERS: gpe_xrupt_info - GPE Interrupt info + * gpe_block - Gpe Block info + * + * RETURN: Status + * +- * DESCRIPTION: Disable all runtime GPEs and enable all wakeup GPEs -- within +- * a single GPE block ++ * DESCRIPTION: Enable all "runtime" GPEs within a GPE block. (Includes ++ * combination wake/run GPEs.) + * + ******************************************************************************/ + +-static acpi_status +-acpi_hw_prepare_gpe_block_for_sleep ( ++acpi_status ++acpi_hw_enable_runtime_gpe_block ( + struct acpi_gpe_xrupt_info *gpe_xrupt_info, + struct acpi_gpe_block_info *gpe_block) + { + u32 i; +- struct acpi_gpe_register_info *gpe_register_info; +- u32 in_value; + acpi_status status; + + +- /* Get the register info for the entire GPE block */ +- +- gpe_register_info = gpe_block->register_info; ++ /* NOTE: assumes that all GPEs are currently disabled */ + + /* Examine each GPE Register within the block */ + + for (i = 0; i < gpe_block->register_count; i++) { +- /* +- * Read the enabled/disabled status of all GPEs. We +- * will be using it to restore all the GPEs later. +- * +- * NOTE: Wake GPEs are are ALL disabled at this time, so when we wake +- * and restore this register, they will be automatically disabled. +- */ +- status = acpi_hw_low_level_read (8, &in_value, +- &gpe_register_info->enable_address); +- if (ACPI_FAILURE (status)) { +- return (status); ++ if (!gpe_block->register_info[i].enable_for_run) { ++ continue; + } + +- gpe_register_info->enable = (u8) in_value; ++ /* Enable all "runtime" GPEs in this register */ + +- /* +- * 1) Disable all runtime GPEs +- * 2) Enable all wakeup GPEs +- */ +- status = acpi_hw_low_level_write (8, gpe_register_info->wake_enable, +- &gpe_register_info->enable_address); ++ status = acpi_hw_low_level_write (8, gpe_block->register_info[i].enable_for_run, ++ &gpe_block->register_info[i].enable_address); + if (ACPI_FAILURE (status)) { + return (status); + } +- +- /* Point to next GPE register */ +- +- gpe_register_info++; + } + + return (AE_OK); +@@ -477,122 +319,125 @@ + + /****************************************************************************** + * +- * FUNCTION: acpi_hw_prepare_gpes_for_sleep ++ * FUNCTION: acpi_hw_enable_wakeup_gpe_block + * +- * PARAMETERS: None ++ * PARAMETERS: gpe_xrupt_info - GPE Interrupt info ++ * gpe_block - Gpe Block info + * + * RETURN: Status + * +- * DESCRIPTION: Disable all runtime GPEs, enable all wake GPEs. +- * Called with interrupts disabled. The interrupt handler also +- * modifies gpe_register_info->Enable, so it should not be +- * given the chance to run until after the runtime GPEs are +- * re-enabled. ++ * DESCRIPTION: Enable all "wake" GPEs within a GPE block. (Includes ++ * combination wake/run GPEs.) + * + ******************************************************************************/ + + acpi_status +-acpi_hw_prepare_gpes_for_sleep ( +- void) ++acpi_hw_enable_wakeup_gpe_block ( ++ struct acpi_gpe_xrupt_info *gpe_xrupt_info, ++ struct acpi_gpe_block_info *gpe_block) + { ++ u32 i; + acpi_status status; + + +- ACPI_FUNCTION_ENTRY (); ++ /* Examine each GPE Register within the block */ + ++ for (i = 0; i < gpe_block->register_count; i++) { ++ if (!gpe_block->register_info[i].enable_for_wake) { ++ continue; ++ } + +- status = acpi_ev_walk_gpe_list (acpi_hw_prepare_gpe_block_for_sleep); +- return (status); ++ /* Enable all "wake" GPEs in this register */ ++ ++ status = acpi_hw_low_level_write (8, gpe_block->register_info[i].enable_for_wake, ++ &gpe_block->register_info[i].enable_address); ++ if (ACPI_FAILURE (status)) { ++ return (status); ++ } ++ } ++ ++ return (AE_OK); + } + + + /****************************************************************************** + * +- * FUNCTION: acpi_hw_restore_gpe_block_on_wake ++ * FUNCTION: acpi_hw_disable_all_gpes + * +- * PARAMETERS: gpe_xrupt_info - GPE Interrupt info +- * gpe_block - Gpe Block info ++ * PARAMETERS: Flags - ACPI_NOT_ISR or ACPI_ISR + * + * RETURN: Status + * +- * DESCRIPTION: Enable all runtime GPEs and disable all wake GPEs -- in one +- * GPE block ++ * DESCRIPTION: Disable and clear all GPEs + * + ******************************************************************************/ + +-static acpi_status +-acpi_hw_restore_gpe_block_on_wake ( +- struct acpi_gpe_xrupt_info *gpe_xrupt_info, +- struct acpi_gpe_block_info *gpe_block) ++acpi_status ++acpi_hw_disable_all_gpes ( ++ u32 flags) + { +- u32 i; +- struct acpi_gpe_register_info *gpe_register_info; + acpi_status status; + + +- /* This callback processes one entire GPE block */ ++ ACPI_FUNCTION_TRACE ("hw_disable_all_gpes"); + +- /* Get the register info for the entire GPE block */ + +- gpe_register_info = gpe_block->register_info; ++ status = acpi_ev_walk_gpe_list (acpi_hw_disable_gpe_block, flags); ++ status = acpi_ev_walk_gpe_list (acpi_hw_clear_gpe_block, flags); ++ return_ACPI_STATUS (status); ++} + +- /* Examine each GPE register within the block */ + +- for (i = 0; i < gpe_block->register_count; i++) { +- /* Clear the entire status register */ ++/****************************************************************************** ++ * ++ * FUNCTION: acpi_hw_enable_all_runtime_gpes ++ * ++ * PARAMETERS: Flags - ACPI_NOT_ISR or ACPI_ISR ++ * ++ * RETURN: Status ++ * ++ * DESCRIPTION: Enable all GPEs of the given type ++ * ++ ******************************************************************************/ + +- status = acpi_hw_low_level_write (8, 0xFF, +- &gpe_block->register_info[i].status_address); +- if (ACPI_FAILURE (status)) { +- return (status); +- } ++acpi_status ++acpi_hw_enable_all_runtime_gpes ( ++ u32 flags) ++{ ++ acpi_status status; + +- /* +- * Restore the GPE Enable register, which will do the following: +- * +- * 1) Disable all wakeup GPEs +- * 2) Enable all runtime GPEs +- * +- * (On sleep, we saved the enabled status of all GPEs) +- */ +- status = acpi_hw_low_level_write (8, gpe_register_info->enable, +- &gpe_register_info->enable_address); +- if (ACPI_FAILURE (status)) { +- return (status); +- } + +- /* Point to next GPE register */ ++ ACPI_FUNCTION_TRACE ("hw_enable_all_runtime_gpes"); + +- gpe_register_info++; +- } + +- return (AE_OK); ++ status = acpi_ev_walk_gpe_list (acpi_hw_enable_runtime_gpe_block, flags); ++ return_ACPI_STATUS (status); + } + + + /****************************************************************************** + * +- * FUNCTION: acpi_hw_restore_gpes_on_wake ++ * FUNCTION: acpi_hw_enable_all_wakeup_gpes + * +- * PARAMETERS: None ++ * PARAMETERS: Flags - ACPI_NOT_ISR or ACPI_ISR + * + * RETURN: Status + * +- * DESCRIPTION: Enable all runtime GPEs and disable all wake GPEs -- in all +- * GPE blocks ++ * DESCRIPTION: Enable all GPEs of the given type + * + ******************************************************************************/ + + acpi_status +-acpi_hw_restore_gpes_on_wake ( +- void) ++acpi_hw_enable_all_wakeup_gpes ( ++ u32 flags) + { + acpi_status status; + + +- ACPI_FUNCTION_ENTRY (); ++ ACPI_FUNCTION_TRACE ("hw_enable_all_wakeup_gpes"); + + +- status = acpi_ev_walk_gpe_list (acpi_hw_restore_gpe_block_on_wake); +- return (status); ++ status = acpi_ev_walk_gpe_list (acpi_hw_enable_wakeup_gpe_block, flags); ++ return_ACPI_STATUS (status); + } ++ +diff -Nru a/drivers/acpi/hardware/hwregs.c b/drivers/acpi/hardware/hwregs.c +--- a/drivers/acpi/hardware/hwregs.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/hardware/hwregs.c 2004-09-21 21:26:34 +10:00 +@@ -61,6 +61,7 @@ + * RETURN: none + * + * DESCRIPTION: Clears all fixed and general purpose status bits ++ * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED + * + ******************************************************************************/ + +@@ -103,7 +104,7 @@ + + /* Clear the GPE Bits in all GPE registers in all GPE blocks */ + +- status = acpi_ev_walk_gpe_list (acpi_hw_clear_gpe_block); ++ status = acpi_ev_walk_gpe_list (acpi_hw_clear_gpe_block, ACPI_ISR); + + unlock_and_exit: + if (flags & ACPI_MTX_LOCK) { +@@ -135,7 +136,7 @@ + u8 *sleep_type_b) + { + acpi_status status = AE_OK; +- union acpi_operand_object *obj_desc; ++ struct acpi_parameter_info info; + + + ACPI_FUNCTION_TRACE ("acpi_get_sleep_type_data"); +@@ -152,8 +153,9 @@ + /* + * Evaluate the namespace object containing the values for this state + */ ++ info.parameters = NULL; + status = acpi_ns_evaluate_by_name ((char *) acpi_gbl_sleep_state_names[sleep_state], +- NULL, &obj_desc); ++ &info); + if (ACPI_FAILURE (status)) { + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%s while evaluating sleep_state [%s]\n", + acpi_format_exception (status), acpi_gbl_sleep_state_names[sleep_state])); +@@ -163,48 +165,50 @@ + + /* Must have a return object */ + +- if (!obj_desc) { ++ if (!info.return_object) { + ACPI_REPORT_ERROR (("Missing Sleep State object\n")); + status = AE_NOT_EXIST; + } + + /* It must be of type Package */ + +- else if (ACPI_GET_OBJECT_TYPE (obj_desc) != ACPI_TYPE_PACKAGE) { ++ else if (ACPI_GET_OBJECT_TYPE (info.return_object) != ACPI_TYPE_PACKAGE) { + ACPI_REPORT_ERROR (("Sleep State object not a Package\n")); + status = AE_AML_OPERAND_TYPE; + } + + /* The package must have at least two elements */ + +- else if (obj_desc->package.count < 2) { ++ else if (info.return_object->package.count < 2) { + ACPI_REPORT_ERROR (("Sleep State package does not have at least two elements\n")); + status = AE_AML_NO_OPERAND; + } + + /* The first two elements must both be of type Integer */ + +- else if ((ACPI_GET_OBJECT_TYPE (obj_desc->package.elements[0]) != ACPI_TYPE_INTEGER) || +- (ACPI_GET_OBJECT_TYPE (obj_desc->package.elements[1]) != ACPI_TYPE_INTEGER)) { ++ else if ((ACPI_GET_OBJECT_TYPE (info.return_object->package.elements[0]) != ACPI_TYPE_INTEGER) || ++ (ACPI_GET_OBJECT_TYPE (info.return_object->package.elements[1]) != ACPI_TYPE_INTEGER)) { + ACPI_REPORT_ERROR (("Sleep State package elements are not both Integers (%s, %s)\n", +- acpi_ut_get_object_type_name (obj_desc->package.elements[0]), +- acpi_ut_get_object_type_name (obj_desc->package.elements[1]))); ++ acpi_ut_get_object_type_name (info.return_object->package.elements[0]), ++ acpi_ut_get_object_type_name (info.return_object->package.elements[1]))); + status = AE_AML_OPERAND_TYPE; + } + else { + /* + * Valid _Sx_ package size, type, and value + */ +- *sleep_type_a = (u8) (obj_desc->package.elements[0])->integer.value; +- *sleep_type_b = (u8) (obj_desc->package.elements[1])->integer.value; ++ *sleep_type_a = (u8) (info.return_object->package.elements[0])->integer.value; ++ *sleep_type_b = (u8) (info.return_object->package.elements[1])->integer.value; + } + + if (ACPI_FAILURE (status)) { +- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "While evaluating sleep_state [%s], bad Sleep object %p type %s\n", +- acpi_gbl_sleep_state_names[sleep_state], obj_desc, acpi_ut_get_object_type_name (obj_desc))); ++ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, ++ "While evaluating sleep_state [%s], bad Sleep object %p type %s\n", ++ acpi_gbl_sleep_state_names[sleep_state], info.return_object, ++ acpi_ut_get_object_type_name (info.return_object))); + } + +- acpi_ut_remove_reference (obj_desc); ++ acpi_ut_remove_reference (info.return_object); + return_ACPI_STATUS (status); + } + +@@ -245,8 +249,8 @@ + * return_value - Value that was read from the register + * Flags - Lock the hardware or not + * +- * RETURN: Value is read from specified Register. Value returned is +- * normalized to bit0 (is shifted all the way right) ++ * RETURN: Status and the value read from specified Register. Value ++ * returned is normalized to bit0 (is shifted all the way right) + * + * DESCRIPTION: ACPI bit_register read function. + * +@@ -280,6 +284,8 @@ + } + } + ++ /* Read from the register */ ++ + status = acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, + bit_reg_info->parent_register, ®ister_value); + +@@ -309,10 +315,10 @@ + * + * PARAMETERS: register_id - ID of ACPI bit_register to access + * Value - (only used on write) value to write to the +- * Register, NOT pre-normalized to the bit pos. ++ * Register, NOT pre-normalized to the bit pos + * Flags - Lock the hardware or not + * +- * RETURN: None ++ * RETURN: Status + * + * DESCRIPTION: ACPI Bit Register write function. + * +@@ -457,10 +463,11 @@ + * + * FUNCTION: acpi_hw_register_read + * +- * PARAMETERS: use_lock - Mutex hw access. +- * register_id - register_iD + Offset. ++ * PARAMETERS: use_lock - Mutex hw access ++ * register_id - register_iD + Offset ++ * return_value - Value that was read from the register + * +- * RETURN: Value read or written. ++ * RETURN: Status and the value read. + * + * DESCRIPTION: Acpi register read function. Registers are read at the + * given offset. +@@ -568,10 +575,11 @@ + * + * FUNCTION: acpi_hw_register_write + * +- * PARAMETERS: use_lock - Mutex hw access. +- * register_id - register_iD + Offset. ++ * PARAMETERS: use_lock - Mutex hw access ++ * register_id - register_iD + Offset ++ * Value - The value to write + * +- * RETURN: Value read or written. ++ * RETURN: Status + * + * DESCRIPTION: Acpi register Write function. Registers are written at the + * given offset. +@@ -687,11 +695,11 @@ + * + * PARAMETERS: Width - 8, 16, or 32 + * Value - Where the value is returned +- * Register - GAS register structure ++ * Reg - GAS register structure + * + * RETURN: Status + * +- * DESCRIPTION: Read from either memory, IO, or PCI config space. ++ * DESCRIPTION: Read from either memory or IO space. + * + ******************************************************************************/ + +@@ -701,8 +709,6 @@ + u32 *value, + struct acpi_generic_address *reg) + { +- struct acpi_pci_id pci_id; +- u16 pci_register; + acpi_status status; + + +@@ -721,8 +727,8 @@ + *value = 0; + + /* +- * Three address spaces supported: +- * Memory, IO, or PCI_Config. ++ * Two address spaces supported: Memory or IO. ++ * PCI_Config is not supported here because the GAS struct is insufficient + */ + switch (reg->address_space_id) { + case ACPI_ADR_SPACE_SYSTEM_MEMORY: +@@ -740,19 +746,6 @@ + break; + + +- case ACPI_ADR_SPACE_PCI_CONFIG: +- +- pci_id.segment = 0; +- pci_id.bus = 0; +- pci_id.device = ACPI_PCI_DEVICE (reg->address); +- pci_id.function = ACPI_PCI_FUNCTION (reg->address); +- pci_register = (u16) ACPI_PCI_REGISTER (reg->address); +- +- status = acpi_os_read_pci_configuration (&pci_id, pci_register, +- value, width); +- break; +- +- + default: + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, + "Unsupported address space: %X\n", reg->address_space_id)); +@@ -774,11 +767,11 @@ + * + * PARAMETERS: Width - 8, 16, or 32 + * Value - To be written +- * Register - GAS register structure ++ * Reg - GAS register structure + * + * RETURN: Status + * +- * DESCRIPTION: Write to either memory, IO, or PCI config space. ++ * DESCRIPTION: Write to either memory or IO space. + * + ******************************************************************************/ + +@@ -788,8 +781,6 @@ + u32 value, + struct acpi_generic_address *reg) + { +- struct acpi_pci_id pci_id; +- u16 pci_register; + acpi_status status; + + +@@ -807,8 +798,8 @@ + } + + /* +- * Three address spaces supported: +- * Memory, IO, or PCI_Config. ++ * Two address spaces supported: Memory or IO. ++ * PCI_Config is not supported here because the GAS struct is insufficient + */ + switch (reg->address_space_id) { + case ACPI_ADR_SPACE_SYSTEM_MEMORY: +@@ -823,19 +814,6 @@ + + status = acpi_os_write_port ((acpi_io_address) reg->address, + value, width); +- break; +- +- +- case ACPI_ADR_SPACE_PCI_CONFIG: +- +- pci_id.segment = 0; +- pci_id.bus = 0; +- pci_id.device = ACPI_PCI_DEVICE (reg->address); +- pci_id.function = ACPI_PCI_FUNCTION (reg->address); +- pci_register = (u16) ACPI_PCI_REGISTER (reg->address); +- +- status = acpi_os_write_pci_configuration (&pci_id, pci_register, +- (acpi_integer) value, width); + break; + + +diff -Nru a/drivers/acpi/hardware/hwsleep.c b/drivers/acpi/hardware/hwsleep.c +--- a/drivers/acpi/hardware/hwsleep.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/hardware/hwsleep.c 2004-09-21 21:26:34 +10:00 +@@ -265,19 +265,21 @@ + sleep_type_reg_info = acpi_hw_get_bit_register_info (ACPI_BITREG_SLEEP_TYPE_A); + sleep_enable_reg_info = acpi_hw_get_bit_register_info (ACPI_BITREG_SLEEP_ENABLE); + +- if (sleep_state != ACPI_STATE_S5) { +- /* Clear wake status */ ++ /* Clear wake status */ + +- status = acpi_set_register (ACPI_BITREG_WAKE_STATUS, 1, ACPI_MTX_DO_NOT_LOCK); +- if (ACPI_FAILURE (status)) { +- return_ACPI_STATUS (status); +- } ++ status = acpi_set_register (ACPI_BITREG_WAKE_STATUS, 1, ACPI_MTX_DO_NOT_LOCK); ++ if (ACPI_FAILURE (status)) { ++ return_ACPI_STATUS (status); ++ } + +- status = acpi_hw_clear_acpi_status (ACPI_MTX_DO_NOT_LOCK); +- if (ACPI_FAILURE (status)) { +- return_ACPI_STATUS (status); +- } ++ /* Clear all fixed and general purpose status bits */ + ++ status = acpi_hw_clear_acpi_status (ACPI_MTX_DO_NOT_LOCK); ++ if (ACPI_FAILURE (status)) { ++ return_ACPI_STATUS (status); ++ } ++ ++ if (sleep_state != ACPI_STATE_S5) { + /* Disable BM arbitration */ + + status = acpi_set_register (ACPI_BITREG_ARB_DISABLE, 1, ACPI_MTX_DO_NOT_LOCK); +@@ -287,10 +289,16 @@ + } + + /* +- * 1) Disable all runtime GPEs ++ * 1) Disable/Clear all GPEs + * 2) Enable all wakeup GPEs + */ +- status = acpi_hw_prepare_gpes_for_sleep (); ++ status = acpi_hw_disable_all_gpes (ACPI_ISR); ++ if (ACPI_FAILURE (status)) { ++ return_ACPI_STATUS (status); ++ } ++ acpi_gbl_system_awake_and_running = FALSE; ++ ++ status = acpi_hw_enable_all_wakeup_gpes (ACPI_ISR); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } +@@ -420,10 +428,16 @@ + } + + /* +- * 1) Disable all runtime GPEs ++ * 1) Disable/Clear all GPEs + * 2) Enable all wakeup GPEs + */ +- status = acpi_hw_prepare_gpes_for_sleep (); ++ status = acpi_hw_disable_all_gpes (ACPI_ISR); ++ if (ACPI_FAILURE (status)) { ++ return_ACPI_STATUS (status); ++ } ++ acpi_gbl_system_awake_and_running = FALSE; ++ ++ status = acpi_hw_enable_all_wakeup_gpes (ACPI_ISR); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } +@@ -453,6 +467,7 @@ + * RETURN: Status + * + * DESCRIPTION: Perform OS-independent ACPI cleanup after a sleep ++ * Called with interrupts ENABLED. + * + ******************************************************************************/ + +@@ -540,19 +555,25 @@ + + /* + * Restore the GPEs: +- * 1) Disable all wakeup GPEs ++ * 1) Disable/Clear all GPEs + * 2) Enable all runtime GPEs + */ +- status = acpi_hw_restore_gpes_on_wake (); ++ status = acpi_hw_disable_all_gpes (ACPI_NOT_ISR); ++ if (ACPI_FAILURE (status)) { ++ return_ACPI_STATUS (status); ++ } ++ acpi_gbl_system_awake_and_running = TRUE; ++ ++ status = acpi_hw_enable_all_runtime_gpes (ACPI_NOT_ISR); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } + + /* Enable power button */ + +- acpi_set_register(acpi_gbl_fixed_event_info[ACPI_EVENT_POWER_BUTTON].enable_register_id, ++ (void) acpi_set_register(acpi_gbl_fixed_event_info[ACPI_EVENT_POWER_BUTTON].enable_register_id, + 1, ACPI_MTX_DO_NOT_LOCK); +- acpi_set_register(acpi_gbl_fixed_event_info[ACPI_EVENT_POWER_BUTTON].status_register_id, ++ (void) acpi_set_register(acpi_gbl_fixed_event_info[ACPI_EVENT_POWER_BUTTON].status_register_id, + 1, ACPI_MTX_DO_NOT_LOCK); + + /* Enable BM arbitration */ +diff -Nru a/drivers/acpi/hardware/hwtimer.c b/drivers/acpi/hardware/hwtimer.c +--- a/drivers/acpi/hardware/hwtimer.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/hardware/hwtimer.c 2004-09-21 21:26:34 +10:00 +@@ -52,11 +52,11 @@ + * + * FUNCTION: acpi_get_timer_resolution + * +- * PARAMETERS: none ++ * PARAMETERS: Resolution - Where the resolution is returned + * +- * RETURN: Number of bits of resolution in the PM Timer (24 or 32). ++ * RETURN: Status and timer resolution + * +- * DESCRIPTION: Obtains resolution of the ACPI PM Timer. ++ * DESCRIPTION: Obtains resolution of the ACPI PM Timer (24 or 32 bits). + * + ******************************************************************************/ + +@@ -86,11 +86,11 @@ + * + * FUNCTION: acpi_get_timer + * +- * PARAMETERS: none ++ * PARAMETERS: Ticks - Where the timer value is returned + * +- * RETURN: Current value of the ACPI PM Timer (in ticks). ++ * RETURN: Status and current ticks + * +- * DESCRIPTION: Obtains current value of ACPI PM Timer. ++ * DESCRIPTION: Obtains current value of ACPI PM Timer (in ticks). + * + ******************************************************************************/ + +@@ -118,11 +118,11 @@ + * + * FUNCTION: acpi_get_timer_duration + * +- * PARAMETERS: start_ticks +- * end_ticks +- * time_elapsed ++ * PARAMETERS: start_ticks - Starting timestamp ++ * end_ticks - End timestamp ++ * time_elapsed - Where the elapsed time is returned + * +- * RETURN: time_elapsed ++ * RETURN: Status and time_elapsed + * + * DESCRIPTION: Computes the time elapsed (in microseconds) between two + * PM Timer time stamps, taking into account the possibility of +@@ -136,7 +136,7 @@ + * Note that this function accommodates only a single timer + * rollover. Thus for 24-bit timers, this function should only + * be used for calculating durations less than ~4.6 seconds +- * (~20 minutes for 32-bit timers) -- calculations below ++ * (~20 minutes for 32-bit timers) -- calculations below: + * + * 2**24 Ticks / 3,600,000 Ticks/Sec = 4.66 sec + * 2**32 Ticks / 3,600,000 Ticks/Sec = 1193 sec or 19.88 minutes +@@ -164,7 +164,6 @@ + + /* + * Compute Tick Delta: +- * ------------------- + * Handle (max one) timer rollovers on 24- versus 32-bit timers. + */ + if (start_ticks < end_ticks) { +@@ -188,10 +187,7 @@ + } + + /* +- * Compute Duration: +- * ----------------- +- * +- * Requires a 64-bit divide: ++ * Compute Duration (Requires a 64-bit divide): + * + * time_elapsed = (delta_ticks * 1000000) / PM_TIMER_FREQUENCY; + */ +diff -Nru a/drivers/acpi/motherboard.c b/drivers/acpi/motherboard.c +--- /dev/null Wed Dec 31 16:00:00 196900 ++++ b/drivers/acpi/motherboard.c 2004-09-21 21:26:35 +10:00 +@@ -0,0 +1,173 @@ ++/* ++ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or (at ++ * your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, but ++ * WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ * General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with this program; if not, write to the Free Software Foundation, Inc., ++ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ++ * ++ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++ */ ++ ++/* Purpose: Prevent PCMCIA cards from using motherboard resources. */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#define _COMPONENT ACPI_SYSTEM_COMPONENT ++ACPI_MODULE_NAME ("acpi_motherboard") ++ ++/* Dell use PNP0C01 instead of PNP0C02 */ ++#define ACPI_MB_HID1 "PNP0C01" ++#define ACPI_MB_HID2 "PNP0C02" ++ ++/** ++ * Doesn't care about legacy IO ports, only IO ports beyond 0x1000 are reserved ++ * Doesn't care about the failure of 'request_region', since other may reserve ++ * the io ports as well ++ */ ++#define IS_RESERVED_ADDR(base, len) \ ++ (((len) > 0) && ((base) > 0) && ((base) + (len) < IO_SPACE_LIMIT) \ ++ && ((base) + (len) > PCIBIOS_MIN_IO)) ++ ++/* ++ * Clearing the flag (IORESOURCE_BUSY) allows drivers to use ++ * the io ports if they really know they can use it, while ++ * still preventing hotplug PCI devices from using it. ++ */ ++ ++static acpi_status ++acpi_reserve_io_ranges (struct acpi_resource *res, void *data) ++{ ++ struct resource *requested_res = NULL; ++ ++ ACPI_FUNCTION_TRACE("acpi_reserve_io_ranges"); ++ ++ if (res->id == ACPI_RSTYPE_IO) { ++ struct acpi_resource_io *io_res = &res->data.io; ++ ++ if (io_res->min_base_address != io_res->max_base_address) ++ return AE_OK; ++ if (IS_RESERVED_ADDR(io_res->min_base_address, io_res->range_length)) { ++ ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Motherboard resources 0x%08x - 0x%08x\n", ++ io_res->min_base_address, ++ io_res->min_base_address + io_res->range_length)); ++ requested_res = request_region(io_res->min_base_address, ++ io_res->range_length, "motherboard"); ++ } ++ } else if (res->id == ACPI_RSTYPE_FIXED_IO) { ++ struct acpi_resource_fixed_io *fixed_io_res = &res->data.fixed_io; ++ ++ if (IS_RESERVED_ADDR(fixed_io_res->base_address, fixed_io_res->range_length)) { ++ ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Motherboard resources 0x%08x - 0x%08x\n", ++ fixed_io_res->base_address, ++ fixed_io_res->base_address + fixed_io_res->range_length)); ++ requested_res = request_region(fixed_io_res->base_address, ++ fixed_io_res->range_length, "motherboard"); ++ } ++ } else { ++ /* Memory mapped IO? */ ++ } ++ ++ if (requested_res) ++ requested_res->flags &= ~IORESOURCE_BUSY; ++ return AE_OK; ++} ++ ++static int acpi_motherboard_add (struct acpi_device *device) ++{ ++ if (!device) ++ return -EINVAL; ++ acpi_walk_resources(device->handle, METHOD_NAME__CRS, ++ acpi_reserve_io_ranges, NULL); ++ ++ return 0; ++} ++ ++static struct acpi_driver acpi_motherboard_driver1 = { ++ .name = "motherboard", ++ .class = "", ++ .ids = ACPI_MB_HID1, ++ .ops = { ++ .add = acpi_motherboard_add, ++ }, ++}; ++ ++static struct acpi_driver acpi_motherboard_driver2 = { ++ .name = "motherboard", ++ .class = "", ++ .ids = ACPI_MB_HID2, ++ .ops = { ++ .add = acpi_motherboard_add, ++ }, ++}; ++ ++static void __init ++acpi_reserve_resources (void) ++{ ++ if (acpi_gbl_FADT->xpm1a_evt_blk.address && acpi_gbl_FADT->pm1_evt_len) ++ request_region(acpi_gbl_FADT->xpm1a_evt_blk.address, ++ acpi_gbl_FADT->pm1_evt_len, "PM1a_EVT_BLK"); ++ ++ if (acpi_gbl_FADT->xpm1b_evt_blk.address && acpi_gbl_FADT->pm1_evt_len) ++ request_region(acpi_gbl_FADT->xpm1b_evt_blk.address, ++ acpi_gbl_FADT->pm1_evt_len, "PM1b_EVT_BLK"); ++ ++ if (acpi_gbl_FADT->xpm1a_cnt_blk.address && acpi_gbl_FADT->pm1_cnt_len) ++ request_region(acpi_gbl_FADT->xpm1a_cnt_blk.address, ++ acpi_gbl_FADT->pm1_cnt_len, "PM1a_CNT_BLK"); ++ ++ if (acpi_gbl_FADT->xpm1b_cnt_blk.address && acpi_gbl_FADT->pm1_cnt_len) ++ request_region(acpi_gbl_FADT->xpm1b_cnt_blk.address, ++ acpi_gbl_FADT->pm1_cnt_len, "PM1b_CNT_BLK"); ++ ++ if (acpi_gbl_FADT->xpm_tmr_blk.address && acpi_gbl_FADT->pm_tm_len == 4) ++ request_region(acpi_gbl_FADT->xpm_tmr_blk.address, ++ 4, "PM_TMR"); ++ ++ if (acpi_gbl_FADT->xpm2_cnt_blk.address && acpi_gbl_FADT->pm2_cnt_len) ++ request_region(acpi_gbl_FADT->xpm2_cnt_blk.address, ++ acpi_gbl_FADT->pm2_cnt_len, "PM2_CNT_BLK"); ++ ++ /* Length of GPE blocks must be a non-negative multiple of 2 */ ++ ++ if (acpi_gbl_FADT->xgpe0_blk.address && acpi_gbl_FADT->gpe0_blk_len && ++ !(acpi_gbl_FADT->gpe0_blk_len & 0x1)) ++ request_region(acpi_gbl_FADT->xgpe0_blk.address, ++ acpi_gbl_FADT->gpe0_blk_len, "GPE0_BLK"); ++ ++ if (acpi_gbl_FADT->xgpe1_blk.address && acpi_gbl_FADT->gpe1_blk_len && ++ !(acpi_gbl_FADT->gpe1_blk_len & 0x1)) ++ request_region(acpi_gbl_FADT->xgpe1_blk.address, ++ acpi_gbl_FADT->gpe1_blk_len, "GPE1_BLK"); ++} ++ ++static int __init acpi_motherboard_init(void) ++{ ++ acpi_bus_register_driver(&acpi_motherboard_driver1); ++ acpi_bus_register_driver(&acpi_motherboard_driver2); ++ /* ++ * Guarantee motherboard IO reservation first ++ * This module must run after scan.c ++ */ ++ if (!acpi_disabled) ++ acpi_reserve_resources (); ++ return 0; ++} ++ ++subsys_initcall(acpi_motherboard_init); +diff -Nru a/drivers/acpi/namespace/nsaccess.c b/drivers/acpi/namespace/nsaccess.c +--- a/drivers/acpi/namespace/nsaccess.c 2004-09-21 21:26:35 +10:00 ++++ b/drivers/acpi/namespace/nsaccess.c 2004-09-21 21:26:35 +10:00 +@@ -193,7 +193,7 @@ + case ACPI_TYPE_MUTEX: + + obj_desc->mutex.node = new_node; +- obj_desc->mutex.sync_level = (u16) ACPI_STRTOUL ++ obj_desc->mutex.sync_level = (u8) ACPI_STRTOUL + (val, NULL, 10); + + if (ACPI_STRCMP (init_val->name, "_GL_") == 0) { +diff -Nru a/drivers/acpi/namespace/nsalloc.c b/drivers/acpi/namespace/nsalloc.c +--- a/drivers/acpi/namespace/nsalloc.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/namespace/nsalloc.c 2004-09-21 21:26:34 +10:00 +@@ -267,7 +267,7 @@ + else { + #ifdef ACPI_ALPHABETIC_NAMESPACE + /* +- * Walk the list whilst searching for the the correct ++ * Walk the list whilst searching for the correct + * alphabetic placement. + */ + previous_child_node = NULL; +diff -Nru a/drivers/acpi/namespace/nseval.c b/drivers/acpi/namespace/nseval.c +--- a/drivers/acpi/namespace/nseval.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/namespace/nseval.c 2004-09-21 21:26:34 +10:00 +@@ -77,13 +77,10 @@ + + acpi_status + acpi_ns_evaluate_relative ( +- struct acpi_namespace_node *handle, + char *pathname, +- union acpi_operand_object **params, +- union acpi_operand_object **return_object) ++ struct acpi_parameter_info *info) + { + acpi_status status; +- struct acpi_namespace_node *prefix_node; + struct acpi_namespace_node *node = NULL; + union acpi_generic_state *scope_info; + char *internal_path = NULL; +@@ -95,7 +92,7 @@ + /* + * Must have a valid object handle + */ +- if (!handle) { ++ if (!info || !info->node) { + return_ACPI_STATUS (AE_BAD_PARAMETER); + } + +@@ -118,8 +115,8 @@ + goto cleanup; + } + +- prefix_node = acpi_ns_map_handle_to_node (handle); +- if (!prefix_node) { ++ info->node = acpi_ns_map_handle_to_node (info->node); ++ if (!info->node) { + (void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); + status = AE_BAD_PARAMETER; + goto cleanup; +@@ -127,7 +124,7 @@ + + /* Lookup the name in the namespace */ + +- scope_info->scope.node = prefix_node; ++ scope_info->scope.node = info->node; + status = acpi_ns_lookup (scope_info, internal_path, ACPI_TYPE_ANY, + ACPI_IMODE_EXECUTE, ACPI_NS_NO_UPSEARCH, NULL, + &node); +@@ -147,7 +144,8 @@ + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "%s [%p] Value %p\n", + pathname, node, acpi_ns_get_attached_object (node))); + +- status = acpi_ns_evaluate_by_handle (node, params, return_object); ++ info->node = node; ++ status = acpi_ns_evaluate_by_handle (info); + + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "*** Completed eval of object %s ***\n", + pathname)); +@@ -166,6 +164,7 @@ + * FUNCTION: acpi_ns_evaluate_by_name + * + * PARAMETERS: Pathname - Fully qualified pathname to the object ++ * Info - Contains: + * return_object - Where to put method's return value (if + * any). If NULL, no value is returned. + * Params - List of parameters to pass to the method, +@@ -184,11 +183,9 @@ + acpi_status + acpi_ns_evaluate_by_name ( + char *pathname, +- union acpi_operand_object **params, +- union acpi_operand_object **return_object) ++ struct acpi_parameter_info *info) + { + acpi_status status; +- struct acpi_namespace_node *node = NULL; + char *internal_path = NULL; + + +@@ -211,7 +208,7 @@ + + status = acpi_ns_lookup (NULL, internal_path, ACPI_TYPE_ANY, + ACPI_IMODE_EXECUTE, ACPI_NS_NO_UPSEARCH, NULL, +- &node); ++ &info->node); + + (void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); + +@@ -226,9 +223,9 @@ + * to evaluate it. + */ + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "%s [%p] Value %p\n", +- pathname, node, acpi_ns_get_attached_object (node))); ++ pathname, info->node, acpi_ns_get_attached_object (info->node))); + +- status = acpi_ns_evaluate_by_handle (node, params, return_object); ++ status = acpi_ns_evaluate_by_handle (info); + + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "*** Completed eval of object %s ***\n", + pathname)); +@@ -254,6 +251,7 @@ + * Params - List of parameters to pass to the method, + * terminated by NULL. Params itself may be + * NULL if no parameters are being passed. ++ * param_type - Type of Parameter list + * return_object - Where to put method's return value (if + * any). If NULL, no value is returned. + * +@@ -267,13 +265,9 @@ + + acpi_status + acpi_ns_evaluate_by_handle ( +- struct acpi_namespace_node *handle, +- union acpi_operand_object **params, +- union acpi_operand_object **return_object) ++ struct acpi_parameter_info *info) + { +- struct acpi_namespace_node *node; + acpi_status status; +- union acpi_operand_object *local_return_object; + + + ACPI_FUNCTION_TRACE ("ns_evaluate_by_handle"); +@@ -287,15 +281,13 @@ + + /* Parameter Validation */ + +- if (!handle) { ++ if (!info) { + return_ACPI_STATUS (AE_BAD_PARAMETER); + } + +- if (return_object) { +- /* Initialize the return value to an invalid object */ ++ /* Initialize the return value to an invalid object */ + +- *return_object = NULL; +- } ++ info->return_object = NULL; + + /* Get the prefix handle and Node */ + +@@ -304,8 +296,8 @@ + return_ACPI_STATUS (status); + } + +- node = acpi_ns_map_handle_to_node (handle); +- if (!node) { ++ info->node = acpi_ns_map_handle_to_node (info->node); ++ if (!info->node) { + (void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); + return_ACPI_STATUS (AE_BAD_PARAMETER); + } +@@ -315,8 +307,8 @@ + * so that proper scoping context will be established + * before execution. + */ +- if (acpi_ns_get_type (node) == ACPI_TYPE_LOCAL_METHOD_ALIAS) { +- node = ACPI_CAST_PTR (struct acpi_namespace_node, node->object); ++ if (acpi_ns_get_type (info->node) == ACPI_TYPE_LOCAL_METHOD_ALIAS) { ++ info->node = ACPI_CAST_PTR (struct acpi_namespace_node, info->node->object); + } + + /* +@@ -328,19 +320,18 @@ + * In both cases, the namespace is unlocked by the + * acpi_ns* procedure + */ +- if (acpi_ns_get_type (node) == ACPI_TYPE_METHOD) { ++ if (acpi_ns_get_type (info->node) == ACPI_TYPE_METHOD) { + /* + * Case 1) We have an actual control method to execute + */ +- status = acpi_ns_execute_control_method (node, params, +- &local_return_object); ++ status = acpi_ns_execute_control_method (info); + } + else { + /* + * Case 2) Object is NOT a method, just return its + * current value + */ +- status = acpi_ns_get_object_value (node, &local_return_object); ++ status = acpi_ns_get_object_value (info); + } + + /* +@@ -348,20 +339,6 @@ + * be dealt with + */ + if (status == AE_CTRL_RETURN_VALUE) { +- /* +- * If the Method returned a value and the caller +- * provided a place to store a returned value, Copy +- * the returned value to the object descriptor provided +- * by the caller. +- */ +- if (return_object) { +- /* +- * Valid return object, copy the pointer to +- * the returned object +- */ +- *return_object = local_return_object; +- } +- + /* Map AE_CTRL_RETURN_VALUE to AE_OK, we are done with it */ + + status = AE_OK; +@@ -396,9 +373,7 @@ + + acpi_status + acpi_ns_execute_control_method ( +- struct acpi_namespace_node *method_node, +- union acpi_operand_object **params, +- union acpi_operand_object **return_obj_desc) ++ struct acpi_parameter_info *info) + { + acpi_status status; + union acpi_operand_object *obj_desc; +@@ -409,7 +384,7 @@ + + /* Verify that there is a method associated with this object */ + +- obj_desc = acpi_ns_get_attached_object (method_node); ++ obj_desc = acpi_ns_get_attached_object (info->node); + if (!obj_desc) { + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "No attached method object\n")); + +@@ -417,7 +392,7 @@ + return_ACPI_STATUS (AE_NULL_OBJECT); + } + +- ACPI_DUMP_PATHNAME (method_node, "Execute Method:", ++ ACPI_DUMP_PATHNAME (info->node, "Execute Method:", + ACPI_LV_INFO, _COMPONENT); + + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Method at AML address %p Length %X\n", +@@ -444,7 +419,7 @@ + return_ACPI_STATUS (status); + } + +- status = acpi_psx_execute (method_node, params, return_obj_desc); ++ status = acpi_psx_execute (info); + acpi_ex_exit_interpreter (); + + return_ACPI_STATUS (status); +@@ -468,11 +443,10 @@ + + acpi_status + acpi_ns_get_object_value ( +- struct acpi_namespace_node *node, +- union acpi_operand_object **return_obj_desc) ++ struct acpi_parameter_info *info) + { + acpi_status status = AE_OK; +- struct acpi_namespace_node *resolved_node = node; ++ struct acpi_namespace_node *resolved_node = info->node; + + + ACPI_FUNCTION_TRACE ("ns_get_object_value"); +@@ -518,9 +492,9 @@ + + if (ACPI_SUCCESS (status)) { + status = AE_CTRL_RETURN_VALUE; +- *return_obj_desc = ACPI_CAST_PTR (union acpi_operand_object, resolved_node); ++ info->return_object = ACPI_CAST_PTR (union acpi_operand_object, resolved_node); + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Returning object %p [%s]\n", +- *return_obj_desc, acpi_ut_get_object_type_name (*return_obj_desc))); ++ info->return_object, acpi_ut_get_object_type_name (info->return_object))); + } + } + +diff -Nru a/drivers/acpi/namespace/nsinit.c b/drivers/acpi/namespace/nsinit.c +--- a/drivers/acpi/namespace/nsinit.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/namespace/nsinit.c 2004-09-21 21:26:34 +10:00 +@@ -149,7 +149,7 @@ + return_ACPI_STATUS (status); + } + +- /* Walk namespace for all objects of type Device or Processor */ ++ /* Walk namespace for all objects */ + + status = acpi_ns_walk_namespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, + ACPI_UINT32_MAX, TRUE, acpi_ns_init_one_device, &info, NULL); +@@ -337,25 +337,29 @@ + void *context, + void **return_value) + { +- acpi_status status; +- struct acpi_namespace_node *node; +- u32 flags; + struct acpi_device_walk_info *info = (struct acpi_device_walk_info *) context; ++ struct acpi_parameter_info pinfo; ++ u32 flags; ++ acpi_status status; + + + ACPI_FUNCTION_TRACE ("ns_init_one_device"); + + +- node = acpi_ns_map_handle_to_node (obj_handle); +- if (!node) { ++ pinfo.parameters = NULL; ++ pinfo.parameter_type = ACPI_PARAM_ARGS; ++ ++ pinfo.node = acpi_ns_map_handle_to_node (obj_handle); ++ if (!pinfo.node) { + return_ACPI_STATUS (AE_BAD_PARAMETER); + } + + /* +- * We will run _STA/_INI on Devices and Processors only ++ * We will run _STA/_INI on Devices, Processors and thermal_zones only + */ +- if ((node->type != ACPI_TYPE_DEVICE) && +- (node->type != ACPI_TYPE_PROCESSOR)) { ++ if ((pinfo.node->type != ACPI_TYPE_DEVICE) && ++ (pinfo.node->type != ACPI_TYPE_PROCESSOR) && ++ (pinfo.node->type != ACPI_TYPE_THERMAL)) { + return_ACPI_STATUS (AE_OK); + } + +@@ -368,17 +372,17 @@ + /* + * Run _STA to determine if we can run _INI on the device. + */ +- ACPI_DEBUG_EXEC (acpi_ut_display_init_pathname (ACPI_TYPE_METHOD, node, "_STA")); +- status = acpi_ut_execute_STA (node, &flags); ++ ACPI_DEBUG_EXEC (acpi_ut_display_init_pathname (ACPI_TYPE_METHOD, pinfo.node, "_STA")); ++ status = acpi_ut_execute_STA (pinfo.node, &flags); + + if (ACPI_FAILURE (status)) { +- if (node->type == ACPI_TYPE_DEVICE) { ++ if (pinfo.node->type == ACPI_TYPE_DEVICE) { + /* Ignore error and move on to next device */ + + return_ACPI_STATUS (AE_OK); + } + +- /* _STA is not required for Processor objects */ ++ /* _STA is not required for Processor or thermal_zone objects */ + } + else { + info->num_STA++; +@@ -393,22 +397,22 @@ + /* + * The device is present. Run _INI. + */ +- ACPI_DEBUG_EXEC (acpi_ut_display_init_pathname (ACPI_TYPE_METHOD, obj_handle, "_INI")); +- status = acpi_ns_evaluate_relative (obj_handle, "_INI", NULL, NULL); ++ ACPI_DEBUG_EXEC (acpi_ut_display_init_pathname (ACPI_TYPE_METHOD, pinfo.node, "_INI")); ++ status = acpi_ns_evaluate_relative ("_INI", &pinfo); + if (ACPI_FAILURE (status)) { + /* No _INI (AE_NOT_FOUND) means device requires no initialization */ + + if (status != AE_NOT_FOUND) { + /* Ignore error and move on to next device */ + +- #ifdef ACPI_DEBUG_OUTPUT +- char *scope_name = acpi_ns_get_external_pathname (obj_handle); ++#ifdef ACPI_DEBUG_OUTPUT ++ char *scope_name = acpi_ns_get_external_pathname (pinfo.node); + + ACPI_DEBUG_PRINT ((ACPI_DB_WARN, "%s._INI failed: %s\n", + scope_name, acpi_format_exception (status))); + + ACPI_MEM_FREE (scope_name); +- #endif ++#endif + } + + status = AE_OK; +@@ -422,7 +426,7 @@ + if (acpi_gbl_init_handler) { + /* External initialization handler is present, call it */ + +- status = acpi_gbl_init_handler (obj_handle, ACPI_INIT_DEVICE_INI); ++ status = acpi_gbl_init_handler (pinfo.node, ACPI_INIT_DEVICE_INI); + } + + +diff -Nru a/drivers/acpi/namespace/nsparse.c b/drivers/acpi/namespace/nsparse.c +--- a/drivers/acpi/namespace/nsparse.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/namespace/nsparse.c 2004-09-21 21:26:34 +10:00 +@@ -94,8 +94,9 @@ + return_ACPI_STATUS (AE_NO_MEMORY); + } + +- status = acpi_ds_init_aml_walk (walk_state, parse_root, NULL, table_desc->aml_start, +- table_desc->aml_length, NULL, NULL, pass_number); ++ status = acpi_ds_init_aml_walk (walk_state, parse_root, NULL, ++ table_desc->aml_start, table_desc->aml_length, ++ NULL, pass_number); + if (ACPI_FAILURE (status)) { + acpi_ds_delete_walk_state (walk_state); + return_ACPI_STATUS (status); +diff -Nru a/drivers/acpi/namespace/nsxfeval.c b/drivers/acpi/namespace/nsxfeval.c +--- a/drivers/acpi/namespace/nsxfeval.c 2004-09-21 21:26:35 +10:00 ++++ b/drivers/acpi/namespace/nsxfeval.c 2004-09-21 21:26:35 +10:00 +@@ -174,8 +174,7 @@ + { + acpi_status status; + acpi_status status2; +- union acpi_operand_object **internal_params = NULL; +- union acpi_operand_object *internal_return_obj = NULL; ++ struct acpi_parameter_info info; + acpi_size buffer_space_needed; + u32 i; + +@@ -183,6 +182,11 @@ + ACPI_FUNCTION_TRACE ("acpi_evaluate_object"); + + ++ info.node = handle; ++ info.parameters = NULL; ++ info.return_object = NULL; ++ info.parameter_type = ACPI_PARAM_ARGS; ++ + /* + * If there are parameters to be passed to the object + * (which must be a control method), the external objects +@@ -193,9 +197,10 @@ + * Allocate a new parameter block for the internal objects + * Add 1 to count to allow for null terminated internal list + */ +- internal_params = ACPI_MEM_CALLOCATE (((acpi_size) external_params->count + 1) * +- sizeof (void *)); +- if (!internal_params) { ++ info.parameters = ACPI_MEM_CALLOCATE ( ++ ((acpi_size) external_params->count + 1) * ++ sizeof (void *)); ++ if (!info.parameters) { + return_ACPI_STATUS (AE_NO_MEMORY); + } + +@@ -205,15 +210,16 @@ + */ + for (i = 0; i < external_params->count; i++) { + status = acpi_ut_copy_eobject_to_iobject (&external_params->pointer[i], +- &internal_params[i]); ++ &info.parameters[i]); + if (ACPI_FAILURE (status)) { +- acpi_ut_delete_internal_object_list (internal_params); ++ acpi_ut_delete_internal_object_list (info.parameters); + return_ACPI_STATUS (status); + } + } +- internal_params[external_params->count] = NULL; ++ info.parameters[external_params->count] = NULL; + } + ++ + /* + * Three major cases: + * 1) Fully qualified pathname +@@ -225,8 +231,7 @@ + /* + * The path is fully qualified, just evaluate by name + */ +- status = acpi_ns_evaluate_by_name (pathname, internal_params, +- &internal_return_obj); ++ status = acpi_ns_evaluate_by_name (pathname, &info); + } + else if (!handle) { + /* +@@ -256,15 +261,13 @@ + * The null pathname case means the handle is for + * the actual object to be evaluated + */ +- status = acpi_ns_evaluate_by_handle (handle, internal_params, +- &internal_return_obj); ++ status = acpi_ns_evaluate_by_handle (&info); + } + else { + /* + * Both a Handle and a relative Pathname + */ +- status = acpi_ns_evaluate_relative (handle, pathname, internal_params, +- &internal_return_obj); ++ status = acpi_ns_evaluate_relative (pathname, &info); + } + } + +@@ -274,11 +277,11 @@ + * copy the return value to an external object. + */ + if (return_buffer) { +- if (!internal_return_obj) { ++ if (!info.return_object) { + return_buffer->length = 0; + } + else { +- if (ACPI_GET_DESCRIPTOR_TYPE (internal_return_obj) == ACPI_DESC_TYPE_NAMED) { ++ if (ACPI_GET_DESCRIPTOR_TYPE (info.return_object) == ACPI_DESC_TYPE_NAMED) { + /* + * If we received a NS Node as a return object, this means that + * the object we are evaluating has nothing interesting to +@@ -288,7 +291,7 @@ + * support for various types at a later date if necessary. + */ + status = AE_TYPE; +- internal_return_obj = NULL; /* No need to delete a NS Node */ ++ info.return_object = NULL; /* No need to delete a NS Node */ + return_buffer->length = 0; + } + +@@ -297,7 +300,7 @@ + * Find out how large a buffer is needed + * to contain the returned object + */ +- status = acpi_ut_get_object_size (internal_return_obj, ++ status = acpi_ut_get_object_size (info.return_object, + &buffer_space_needed); + if (ACPI_SUCCESS (status)) { + /* Validate/Allocate/Clear caller buffer */ +@@ -309,13 +312,14 @@ + */ + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, + "Needed buffer size %X, %s\n", +- (u32) buffer_space_needed, acpi_format_exception (status))); ++ (u32) buffer_space_needed, ++ acpi_format_exception (status))); + } + else { + /* + * We have enough space for the object, build it + */ +- status = acpi_ut_copy_iobject_to_eobject (internal_return_obj, ++ status = acpi_ut_copy_iobject_to_eobject (info.return_object, + return_buffer); + } + } +@@ -323,7 +327,7 @@ + } + } + +- if (internal_return_obj) { ++ if (info.return_object) { + /* + * Delete the internal return object. NOTE: Interpreter + * must be locked to avoid race condition. +@@ -334,7 +338,7 @@ + * Delete the internal return object. (Or at least + * decrement the reference count by one) + */ +- acpi_ut_remove_reference (internal_return_obj); ++ acpi_ut_remove_reference (info.return_object); + acpi_ex_exit_interpreter (); + } + } +@@ -342,10 +346,10 @@ + /* + * Free the input parameter list (if we created one), + */ +- if (internal_params) { ++ if (info.parameters) { + /* Free the allocated parameter block */ + +- acpi_ut_delete_internal_object_list (internal_params); ++ acpi_ut_delete_internal_object_list (info.parameters); + } + + return_ACPI_STATUS (status); +diff -Nru a/drivers/acpi/namespace/nsxfname.c b/drivers/acpi/namespace/nsxfname.c +--- a/drivers/acpi/namespace/nsxfname.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/namespace/nsxfname.c 2004-09-21 21:26:34 +10:00 +@@ -281,7 +281,7 @@ + if (info.type == ACPI_TYPE_DEVICE) { + /* + * Get extra info for ACPI Devices objects only: +- * Run the Device _HID, _UID, _CID, _STA, and _ADR methods. ++ * Run the Device _HID, _UID, _CID, _STA, _ADR and _sx_d methods. + * + * Note: none of these methods are required, so they may or may + * not be present for this device. The Info.Valid bitfield is used +@@ -330,7 +330,7 @@ + + status = acpi_ut_execute_sxds (node, info.highest_dstates); + if (ACPI_SUCCESS (status)) { +- info.valid |= ACPI_VALID_STA; ++ info.valid |= ACPI_VALID_SXDS; + } + + status = AE_OK; +diff -Nru a/drivers/acpi/numa.c b/drivers/acpi/numa.c +--- a/drivers/acpi/numa.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/numa.c 2004-09-21 21:26:34 +10:00 +@@ -51,6 +51,7 @@ + switch (header->type) { + + case ACPI_SRAT_PROCESSOR_AFFINITY: ++#ifdef ACPI_DEBUG_OUTPUT + { + struct acpi_table_processor_affinity *p = + (struct acpi_table_processor_affinity*) header; +@@ -58,9 +59,11 @@ + p->apic_id, p->lsapic_eid, p->proximity_domain, + p->flags.enabled?"enabled":"disabled")); + } ++#endif /* ACPI_DEBUG_OUTPUT */ + break; + + case ACPI_SRAT_MEMORY_AFFINITY: ++#ifdef ACPI_DEBUG_OUTPUT + { + struct acpi_table_memory_affinity *p = + (struct acpi_table_memory_affinity*) header; +@@ -70,6 +73,7 @@ + p->flags.enabled ? "enabled" : "disabled", + p->flags.hot_pluggable ? " hot-pluggable" : "")); + } ++#endif /* ACPI_DEBUG_OUTPUT */ + break; + + default: +@@ -94,8 +98,6 @@ + /* downcast just for %llu vs %lu for i386/ia64 */ + localities = (u32) slit->localities; + +- printk(KERN_INFO PREFIX "SLIT localities %ux%u\n", localities, localities); +- + acpi_numa_slit_init(slit); + + return 0; +@@ -103,7 +105,9 @@ + + + static int __init +-acpi_parse_processor_affinity (acpi_table_entry_header *header) ++acpi_parse_processor_affinity ( ++ acpi_table_entry_header *header, ++ const unsigned long end) + { + struct acpi_table_processor_affinity *processor_affinity; + +@@ -121,7 +125,9 @@ + + + static int __init +-acpi_parse_memory_affinity (acpi_table_entry_header *header) ++acpi_parse_memory_affinity ( ++ acpi_table_entry_header *header, ++ const unsigned long end) + { + struct acpi_table_memory_affinity *memory_affinity; + +@@ -147,8 +153,6 @@ + return -EINVAL; + + srat = (struct acpi_table_srat *) __va(phys_addr); +- +- printk(KERN_INFO PREFIX "SRAT revision %d\n", srat->table_revision); + + return 0; + } +diff -Nru a/drivers/acpi/osl.c b/drivers/acpi/osl.c +--- a/drivers/acpi/osl.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/osl.c 2004-09-21 21:26:34 +10:00 +@@ -51,7 +51,7 @@ + + struct acpi_os_dpc + { +- OSD_EXECUTION_CALLBACK function; ++ acpi_osd_exec_callback function; + void *context; + }; + +@@ -64,13 +64,19 @@ + #endif /*ENABLE_DEBUGGER*/ + + static unsigned int acpi_irq_irq; +-static OSD_HANDLER acpi_irq_handler; ++static acpi_osd_handler acpi_irq_handler; + static void *acpi_irq_context; + static struct workqueue_struct *kacpid_wq; + + acpi_status + acpi_os_initialize(void) + { ++ return AE_OK; ++} ++ ++acpi_status ++acpi_os_initialize1(void) ++{ + /* + * Initialize PCI configuration space access, as we'll need to access + * it while walking the namespace (bus 0 and root bridges w/ _BBNs). +@@ -246,7 +252,7 @@ + } + + acpi_status +-acpi_os_install_interrupt_handler(u32 gsi, OSD_HANDLER handler, void *context) ++acpi_os_install_interrupt_handler(u32 gsi, acpi_osd_handler handler, void *context) + { + unsigned int irq; + +@@ -274,7 +280,7 @@ + } + + acpi_status +-acpi_os_remove_interrupt_handler(u32 irq, OSD_HANDLER handler) ++acpi_os_remove_interrupt_handler(u32 irq, acpi_osd_handler handler) + { + if (irq) { + free_irq(irq, acpi_irq); +@@ -470,6 +476,8 @@ + return AE_ERROR; + } + ++ BUG_ON(!raw_pci_ops); ++ + result = raw_pci_ops->read(pci_id->segment, pci_id->bus, + PCI_DEVFN(pci_id->device, pci_id->function), + reg, size, value); +@@ -496,6 +504,8 @@ + return AE_ERROR; + } + ++ BUG_ON(!raw_pci_ops); ++ + result = raw_pci_ops->write(pci_id->segment, pci_id->bus, + PCI_DEVFN(pci_id->device, pci_id->function), + reg, size, value); +@@ -624,7 +634,7 @@ + acpi_status + acpi_os_queue_for_execution( + u32 priority, +- OSD_EXECUTION_CALLBACK function, ++ acpi_osd_exec_callback function, + void *context) + { + acpi_status status = AE_OK; +@@ -1066,15 +1076,15 @@ + * Run-time events on the same GPE this flag is available + * to tell Linux to keep the wake-time GPEs enabled at run-time. + */ +-static int __init +-acpi_leave_gpes_disabled_setup(char *str) ++int __init ++acpi_wake_gpes_always_on_setup(char *str) + { +- printk(KERN_INFO PREFIX "leave wake GPEs disabled\n"); ++ printk(KERN_INFO PREFIX "wake GPEs not disabled\n"); + +- acpi_gbl_leave_wake_gpes_disabled = TRUE; ++ acpi_gbl_leave_wake_gpes_disabled = FALSE; + + return 1; + } + +-__setup("acpi_leave_gpes_disabled", acpi_leave_gpes_disabled_setup); ++__setup("acpi_wake_gpes_always_on", acpi_wake_gpes_always_on_setup); + +diff -Nru a/drivers/acpi/parser/psopcode.c b/drivers/acpi/parser/psopcode.c +--- a/drivers/acpi/parser/psopcode.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/parser/psopcode.c 2004-09-21 21:26:34 +10:00 +@@ -251,7 +251,7 @@ + #define ARGI_CREATE_FIELD_OP ARGI_LIST4 (ARGI_BUFFER, ARGI_INTEGER, ARGI_INTEGER, ARGI_REFERENCE) + #define ARGI_CREATE_QWORD_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) + #define ARGI_CREATE_WORD_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) +-#define ARGI_DATA_REGION_OP ARGI_LIST3 (ARGI_STRING, ARGI_STRING, ARGI_STRING) ++#define ARGI_DATA_REGION_OP ARGI_LIST3 (ARGI_STRING, ARGI_STRING, ARGI_STRING) + #define ARGI_DEBUG_OP ARG_NONE + #define ARGI_DECREMENT_OP ARGI_LIST1 (ARGI_INTEGER_REF) + #define ARGI_DEREF_OF_OP ARGI_LIST1 (ARGI_REF_OR_STRING) +@@ -270,10 +270,10 @@ + #define ARGI_INDEX_FIELD_OP ARGI_INVALID_OPCODE + #define ARGI_INDEX_OP ARGI_LIST3 (ARGI_COMPLEXOBJ, ARGI_INTEGER, ARGI_TARGETREF) + #define ARGI_LAND_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) +-#define ARGI_LEQUAL_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) +-#define ARGI_LGREATER_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) ++#define ARGI_LEQUAL_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_COMPUTEDATA) ++#define ARGI_LGREATER_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_COMPUTEDATA) + #define ARGI_LGREATEREQUAL_OP ARGI_INVALID_OPCODE +-#define ARGI_LLESS_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) ++#define ARGI_LLESS_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_COMPUTEDATA) + #define ARGI_LLESSEQUAL_OP ARGI_INVALID_OPCODE + #define ARGI_LNOT_OP ARGI_LIST1 (ARGI_INTEGER) + #define ARGI_LNOTEQUAL_OP ARGI_INVALID_OPCODE +diff -Nru a/drivers/acpi/parser/psxface.c b/drivers/acpi/parser/psxface.c +--- a/drivers/acpi/parser/psxface.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/parser/psxface.c 2004-09-21 21:26:34 +10:00 +@@ -57,7 +57,7 @@ + * + * FUNCTION: acpi_psx_execute + * +- * PARAMETERS: method_node - A method object containing both the AML ++ * PARAMETERS: Info->Node - A method object containing both the AML + * address and length. + * **Params - List of parameters to pass to method, + * terminated by NULL. Params itself may be +@@ -73,9 +73,7 @@ + + acpi_status + acpi_psx_execute ( +- struct acpi_namespace_node *method_node, +- union acpi_operand_object **params, +- union acpi_operand_object **return_obj_desc) ++ struct acpi_parameter_info *info) + { + acpi_status status; + union acpi_operand_object *obj_desc; +@@ -89,29 +87,30 @@ + + /* Validate the Node and get the attached object */ + +- if (!method_node) { ++ if (!info || !info->node) { + return_ACPI_STATUS (AE_NULL_ENTRY); + } + +- obj_desc = acpi_ns_get_attached_object (method_node); ++ obj_desc = acpi_ns_get_attached_object (info->node); + if (!obj_desc) { + return_ACPI_STATUS (AE_NULL_OBJECT); + } + + /* Init for new method, wait on concurrency semaphore */ + +- status = acpi_ds_begin_method_execution (method_node, obj_desc, NULL); ++ status = acpi_ds_begin_method_execution (info->node, obj_desc, NULL); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } + +- if (params) { ++ if ((info->parameter_type == ACPI_PARAM_ARGS) && ++ (info->parameters)) { + /* + * The caller "owns" the parameters, so give each one an extra + * reference + */ +- for (i = 0; params[i]; i++) { +- acpi_ut_add_reference (params[i]); ++ for (i = 0; info->parameters[i]; i++) { ++ acpi_ut_add_reference (info->parameters[i]); + } + } + +@@ -121,7 +120,7 @@ + */ + ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, + "**** Begin Method Parse **** Entry=%p obj=%p\n", +- method_node, obj_desc)); ++ info->node, obj_desc)); + + /* Create and init a Root Node */ + +@@ -147,8 +146,9 @@ + goto cleanup2; + } + +- status = acpi_ds_init_aml_walk (walk_state, op, method_node, obj_desc->method.aml_start, +- obj_desc->method.aml_length, NULL, NULL, 1); ++ status = acpi_ds_init_aml_walk (walk_state, op, info->node, ++ obj_desc->method.aml_start, ++ obj_desc->method.aml_length, NULL, 1); + if (ACPI_FAILURE (status)) { + goto cleanup3; + } +@@ -159,7 +159,6 @@ + acpi_ps_delete_parse_tree (op); + if (ACPI_FAILURE (status)) { + goto cleanup1; /* Walk state is already deleted */ +- + } + + /* +@@ -167,7 +166,7 @@ + */ + ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, + "**** Begin Method Execution **** Entry=%p obj=%p\n", +- method_node, obj_desc)); ++ info->node, obj_desc)); + + /* Create and init a Root Node */ + +@@ -179,8 +178,8 @@ + + /* Init new op with the method name and pointer back to the NS node */ + +- acpi_ps_set_name (op, method_node->name.integer); +- op->common.node = method_node; ++ acpi_ps_set_name (op, info->node->name.integer); ++ op->common.node = info->node; + + /* Create and initialize a new walk state */ + +@@ -190,8 +189,9 @@ + goto cleanup2; + } + +- status = acpi_ds_init_aml_walk (walk_state, op, method_node, obj_desc->method.aml_start, +- obj_desc->method.aml_length, params, return_obj_desc, 3); ++ status = acpi_ds_init_aml_walk (walk_state, op, info->node, ++ obj_desc->method.aml_start, ++ obj_desc->method.aml_length, info, 3); + if (ACPI_FAILURE (status)) { + goto cleanup3; + } +@@ -210,13 +210,14 @@ + acpi_ps_delete_parse_tree (op); + + cleanup1: +- if (params) { ++ if ((info->parameter_type == ACPI_PARAM_ARGS) && ++ (info->parameters)) { + /* Take away the extra reference that we gave the parameters above */ + +- for (i = 0; params[i]; i++) { ++ for (i = 0; info->parameters[i]; i++) { + /* Ignore errors, just do them all */ + +- (void) acpi_ut_update_object_reference (params[i], REF_DECREMENT); ++ (void) acpi_ut_update_object_reference (info->parameters[i], REF_DECREMENT); + } + } + +@@ -228,10 +229,10 @@ + * If the method has returned an object, signal this to the caller with + * a control exception code + */ +- if (*return_obj_desc) { ++ if (info->return_object) { + ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Method returned obj_desc=%p\n", +- *return_obj_desc)); +- ACPI_DUMP_STACK_ENTRY (*return_obj_desc); ++ info->return_object)); ++ ACPI_DUMP_STACK_ENTRY (info->return_object); + + status = AE_CTRL_RETURN_VALUE; + } +diff -Nru a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c +--- a/drivers/acpi/pci_link.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/pci_link.c 2004-09-21 21:26:34 +10:00 +@@ -29,6 +29,7 @@ + * for IRQ management (e.g. start()->_SRS). + */ + ++#include + #include + #include + #include +@@ -71,7 +72,7 @@ + u8 active; /* Current IRQ */ + u8 edge_level; /* All IRQs */ + u8 active_high_low; /* All IRQs */ +- u8 setonboot; ++ u8 initialized; + u8 resource_type; + u8 possible_count; + u8 possible[ACPI_PCI_LINK_MAX_POSSIBLE]; +@@ -447,7 +448,7 @@ + #define PIRQ_PENALTY_ISA_USED (16*16*16*16*16) + #define PIRQ_PENALTY_ISA_ALWAYS (16*16*16*16*16*16) + +-static int __initdata acpi_irq_penalty[ACPI_MAX_IRQS] = { ++static int acpi_irq_penalty[ACPI_MAX_IRQS] = { + PIRQ_PENALTY_ISA_ALWAYS, /* IRQ0 timer */ + PIRQ_PENALTY_ISA_ALWAYS, /* IRQ1 keyboard */ + PIRQ_PENALTY_ISA_ALWAYS, /* IRQ2 cascade */ +@@ -467,7 +468,7 @@ + /* >IRQ15 */ + }; + +-int ++int __init + acpi_irq_penalty_init(void) + { + struct list_head *node = NULL; +@@ -517,7 +518,7 @@ + + ACPI_FUNCTION_TRACE("acpi_pci_link_allocate"); + +- if (link->irq.setonboot) ++ if (link->irq.initialized) + return_VALUE(0); + + /* +@@ -571,7 +572,7 @@ + acpi_device_bid(link->device), link->irq.active); + } + +- link->irq.setonboot = 1; ++ link->irq.initialized = 1; + + return_VALUE(0); + } +@@ -695,6 +696,42 @@ + + + static int ++acpi_pci_link_resume ( ++ struct acpi_pci_link *link) ++{ ++ ACPI_FUNCTION_TRACE("acpi_pci_link_resume"); ++ ++ if (link->irq.active && link->irq.initialized) ++ return_VALUE(acpi_pci_link_set(link, link->irq.active)); ++ else ++ return_VALUE(0); ++} ++ ++ ++static int ++irqrouter_resume( ++ struct sys_device *dev) ++{ ++ struct list_head *node = NULL; ++ struct acpi_pci_link *link = NULL; ++ ++ ACPI_FUNCTION_TRACE("irqrouter_resume"); ++ ++ list_for_each(node, &acpi_link.entries) { ++ ++ link = list_entry(node, struct acpi_pci_link, node); ++ if (!link) { ++ ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid link context\n")); ++ continue; ++ } ++ ++ acpi_pci_link_resume(link); ++ } ++ return_VALUE(0); ++} ++ ++ ++static int + acpi_pci_link_remove ( + struct acpi_device *device, + int type) +@@ -786,11 +823,42 @@ + __setup("acpi_irq_balance", acpi_irq_balance_set); + + ++static struct sysdev_class irqrouter_sysdev_class = { ++ set_kset_name("irqrouter"), ++ .resume = irqrouter_resume, ++}; ++ ++ ++static struct sys_device device_irqrouter = { ++ .id = 0, ++ .cls = &irqrouter_sysdev_class, ++}; ++ ++ ++static int __init irqrouter_init_sysfs(void) ++{ ++ int error; ++ ++ ACPI_FUNCTION_TRACE("irqrouter_init_sysfs"); ++ ++ if (acpi_disabled || acpi_noirq) ++ return_VALUE(0); ++ ++ error = sysdev_class_register(&irqrouter_sysdev_class); ++ if (!error) ++ error = sysdev_register(&device_irqrouter); ++ ++ return_VALUE(error); ++} ++ ++device_initcall(irqrouter_init_sysfs); ++ ++ + static int __init acpi_pci_link_init (void) + { + ACPI_FUNCTION_TRACE("acpi_pci_link_init"); + +- if (acpi_pci_disabled) ++ if (acpi_noirq) + return_VALUE(0); + + acpi_link.count = 0; +diff -Nru a/drivers/acpi/power.c b/drivers/acpi/power.c +--- a/drivers/acpi/power.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/power.c 2004-09-21 21:26:34 +10:00 +@@ -288,6 +288,86 @@ + return_VALUE(0); + } + ++/* ++ * Prepare a wakeup device, two steps (Ref ACPI 2.0:P229): ++ * 1. Power on the power resources required for the wakeup device ++ * 2. Enable _PSW (power state wake) for the device if present ++ */ ++int acpi_enable_wakeup_device_power (struct acpi_device *dev) ++{ ++ union acpi_object arg = {ACPI_TYPE_INTEGER}; ++ struct acpi_object_list arg_list = {1, &arg}; ++ acpi_status status = AE_OK; ++ int i; ++ int ret = 0; ++ ++ ACPI_FUNCTION_TRACE("acpi_enable_wakeup_device_power"); ++ if (!dev || !dev->wakeup.flags.valid) ++ return -1; ++ ++ arg.integer.value = 1; ++ /* Open power resource */ ++ for (i = 0; i < dev->wakeup.resources.count; i++) { ++ ret = acpi_power_on(dev->wakeup.resources.handles[i]); ++ if (ret) { ++ ACPI_DEBUG_PRINT((ACPI_DB_ERROR, ++ "Error transition power state\n")); ++ dev->wakeup.flags.valid = 0; ++ return -1; ++ } ++ } ++ ++ /* Execute PSW */ ++ status = acpi_evaluate_object(dev->handle, "_PSW", &arg_list, NULL); ++ if (ACPI_FAILURE(status) && (status != AE_NOT_FOUND)) { ++ ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluate _PSW\n")); ++ dev->wakeup.flags.valid = 0; ++ ret = -1; ++ } ++ ++ return ret; ++} ++ ++/* ++ * Shutdown a wakeup device, counterpart of above method ++ * 1. Disable _PSW (power state wake) ++ * 2. Shutdown down the power resources ++ */ ++int acpi_disable_wakeup_device_power (struct acpi_device *dev) ++{ ++ union acpi_object arg = {ACPI_TYPE_INTEGER}; ++ struct acpi_object_list arg_list = {1, &arg}; ++ acpi_status status = AE_OK; ++ int i; ++ int ret = 0; ++ ++ ACPI_FUNCTION_TRACE("acpi_disable_wakeup_device_power"); ++ ++ if (!dev || !dev->wakeup.flags.valid) ++ return -1; ++ ++ arg.integer.value = 0; ++ /* Execute PSW */ ++ status = acpi_evaluate_object(dev->handle, "_PSW", &arg_list, NULL); ++ if (ACPI_FAILURE(status) && (status != AE_NOT_FOUND)) { ++ ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluate _PSW\n")); ++ dev->wakeup.flags.valid = 0; ++ return -1; ++ } ++ ++ /* Close power resource */ ++ for (i = 0; i < dev->wakeup.resources.count; i++) { ++ ret = acpi_power_off_device(dev->wakeup.resources.handles[i]); ++ if (ret) { ++ ACPI_DEBUG_PRINT((ACPI_DB_ERROR, ++ "Error transition power state\n")); ++ dev->wakeup.flags.valid = 0; ++ return -1; ++ } ++ } ++ ++ return ret; ++} + + /* -------------------------------------------------------------------------- + Device Power Management +diff -Nru a/drivers/acpi/processor.c b/drivers/acpi/processor.c +--- a/drivers/acpi/processor.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/processor.c 2004-09-21 21:26:34 +10:00 +@@ -44,6 +44,9 @@ + #include + #include + #include ++#include ++#include ++#include + + #include + #include +@@ -859,7 +862,6 @@ + * _PCT and _PSS structures are read out and written into struct + * acpi_processor_performance. + */ +- + static int acpi_processor_set_pdc (struct acpi_processor *pr) + { + acpi_status status = AE_OK; +@@ -1047,6 +1049,8 @@ + if (!pr || !pr->performance || !pr->handle) + return_VALUE(-EINVAL); + ++ acpi_processor_set_pdc(pr); ++ + status = acpi_get_handle(pr->handle, "_PCT", &handle); + if (ACPI_FAILURE(status)) { + ACPI_DEBUG_PRINT((ACPI_DB_INFO, +@@ -1054,8 +1058,6 @@ + return_VALUE(-ENODEV); + } + +- acpi_processor_set_pdc(pr); +- + result = acpi_processor_get_performance_control(pr); + if (result) + return_VALUE(result); +@@ -2146,6 +2148,37 @@ + return_VALUE(0); + } + ++/* Use the acpiid in MADT to map cpus in case of SMP */ ++#ifndef CONFIG_SMP ++#define convert_acpiid_to_cpu(acpi_id) (0xff) ++#else ++ ++#ifdef CONFIG_IA64 ++#define arch_acpiid_to_apicid ia64_acpiid_to_sapicid ++#define arch_cpu_to_apicid ia64_cpu_to_sapicid ++#define ARCH_BAD_APICID (0xffff) ++#else ++#define arch_acpiid_to_apicid x86_acpiid_to_apicid ++#define arch_cpu_to_apicid x86_cpu_to_apicid ++#define ARCH_BAD_APICID (0xff) ++#endif ++ ++static u8 convert_acpiid_to_cpu(u8 acpi_id) ++{ ++ u16 apic_id; ++ int i; ++ ++ apic_id = arch_acpiid_to_apicid[acpi_id]; ++ if (apic_id == ARCH_BAD_APICID) ++ return -1; ++ ++ for (i = 0; i < NR_CPUS; i++) { ++ if (arch_cpu_to_apicid[i] == apic_id) ++ return i; ++ } ++ return -1; ++} ++#endif + + /* -------------------------------------------------------------------------- + Driver Interface +@@ -2158,7 +2191,8 @@ + acpi_status status = 0; + union acpi_object object = {0}; + struct acpi_buffer buffer = {sizeof(union acpi_object), &object}; +- static int cpu_index = 0; ++ u8 cpu_index; ++ static int cpu0_initialized; + + ACPI_FUNCTION_TRACE("acpi_processor_get_info"); + +@@ -2168,13 +2202,6 @@ + if (num_online_cpus() > 1) + errata.smp = TRUE; + +- /* +- * Extra Processor objects may be enumerated on MP systems with +- * less than the max # of CPUs. They should be ignored. +- */ +- if ((cpu_index + 1) > num_online_cpus()) +- return_VALUE(-ENODEV); +- + acpi_processor_errata(pr); + + /* +@@ -2206,9 +2233,27 @@ + * TBD: Synch processor ID (via LAPIC/LSAPIC structures) on SMP. + * >>> 'acpi_get_processor_id(acpi_id, &id)' in arch/xxx/acpi.c + */ +- pr->id = cpu_index++; + pr->acpi_id = object.processor.proc_id; + ++ cpu_index = convert_acpiid_to_cpu(pr->acpi_id); ++ ++ if ( !cpu0_initialized && (cpu_index == 0xff)) { ++ /* Handle UP system running SMP kernel, with no LAPIC in MADT */ ++ cpu_index = 0; ++ } else if (cpu_index > num_online_cpus()) { ++ /* ++ * Extra Processor objects may be enumerated on MP systems with ++ * less than the max # of CPUs. They should be ignored. ++ */ ++ ACPI_DEBUG_PRINT((ACPI_DB_ERROR, ++ "Error getting cpuindex for acpiid 0x%x\n", ++ pr->acpi_id)); ++ return_VALUE(-ENODEV); ++ } ++ cpu0_initialized = 1; ++ ++ pr->id = cpu_index; ++ + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Processor [%d:%d]\n", pr->id, + pr->acpi_id)); + +@@ -2234,7 +2279,6 @@ + * (In particular, allocating the IO range for Cardbus) + */ + request_region(pr->throttling.address, 6, "ACPI CPU throttle"); +- request_region(acpi_fadt.xpm_tmr_blk.address, 4, "ACPI timer"); + } + + acpi_processor_get_power_info(pr); +@@ -2373,8 +2417,10 @@ + pr = (struct acpi_processor *) acpi_driver_data(device); + + /* Unregister the idle handler when processor #0 is removed. */ +- if (pr->id == 0) ++ if (pr->id == 0) { + pm_idle = pm_idle_save; ++ synchronize_kernel(); ++ } + + status = acpi_remove_notify_handler(pr->handle, ACPI_DEVICE_NOTIFY, + acpi_processor_notify); +diff -Nru a/drivers/acpi/resources/rsutils.c b/drivers/acpi/resources/rsutils.c +--- a/drivers/acpi/resources/rsutils.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/resources/rsutils.c 2004-09-21 21:26:34 +10:00 +@@ -289,6 +289,7 @@ + acpi_handle handle, + struct acpi_buffer *in_buffer) + { ++ struct acpi_parameter_info info; + union acpi_operand_object *params[2]; + acpi_status status; + struct acpi_buffer buffer; +@@ -329,10 +330,14 @@ + params[0]->common.flags = AOPOBJ_DATA_VALID; + params[1] = NULL; + ++ info.node = handle; ++ info.parameters = params; ++ info.parameter_type = ACPI_PARAM_ARGS; ++ + /* + * Execute the method, no return value + */ +- status = acpi_ns_evaluate_relative (handle, "_SRS", params, NULL); ++ status = acpi_ns_evaluate_relative ("_SRS", &info); + + /* + * Clean up and return the status from acpi_ns_evaluate_relative +diff -Nru a/drivers/acpi/resources/rsxface.c b/drivers/acpi/resources/rsxface.c +--- a/drivers/acpi/resources/rsxface.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/resources/rsxface.c 2004-09-21 21:26:34 +10:00 +@@ -259,7 +259,8 @@ + /* Setup pointers */ + + resource = (struct acpi_resource *) buffer.pointer; +- buffer_end = (struct acpi_resource *) ((u8 *) buffer.pointer + buffer.length); ++ buffer_end = ACPI_CAST_PTR (struct acpi_resource, ++ ((u8 *) buffer.pointer + buffer.length)); + + /* Walk the resource list */ + +diff -Nru a/drivers/acpi/scan.c b/drivers/acpi/scan.c +--- a/drivers/acpi/scan.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/scan.c 2004-09-21 21:26:34 +10:00 +@@ -23,7 +23,8 @@ + #define ACPI_BUS_DEVICE_NAME "System Bus" + + static LIST_HEAD(acpi_device_list); +-static spinlock_t acpi_device_lock = SPIN_LOCK_UNLOCKED; ++spinlock_t acpi_device_lock = SPIN_LOCK_UNLOCKED; ++LIST_HEAD(acpi_wakeup_device_list); + + static void acpi_device_release(struct kobject * kobj) + { +@@ -115,9 +116,6 @@ + status = acpi_get_handle(device->handle, "_IRC", &handle); + if (ACPI_SUCCESS(status)) + device->power.flags.inrush_current = 1; +- status = acpi_get_handle(device->handle, "_PRW", &handle); +- if (ACPI_SUCCESS(status)) +- device->power.flags.wake_capable = 1; + + /* + * Enumerate supported power management states +@@ -163,6 +161,125 @@ + return 0; + } + ++static int ++acpi_match_ids ( ++ struct acpi_device *device, ++ char *ids) ++{ ++ int error = 0; ++ struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL}; ++ ++ if (device->flags.hardware_id) ++ if (strstr(ids, device->pnp.hardware_id)) ++ goto Done; ++ ++ if (device->flags.compatible_ids) { ++ struct acpi_compatible_id_list *cid_list = device->pnp.cid_list; ++ int i; ++ ++ /* compare multiple _CID entries against driver ids */ ++ for (i = 0; i < cid_list->count; i++) ++ { ++ if (strstr(ids, cid_list->id[i].value)) ++ goto Done; ++ } ++ } ++ error = -ENOENT; ++ ++ Done: ++ if (buffer.pointer) ++ acpi_os_free(buffer.pointer); ++ return error; ++} ++ ++static acpi_status ++acpi_bus_extract_wakeup_device_power_package ( ++ struct acpi_device *device, ++ union acpi_object *package) ++{ ++ int i = 0; ++ union acpi_object *element = NULL; ++ ++ if (!device || !package || (package->package.count < 2)) ++ return AE_BAD_PARAMETER; ++ ++ element = &(package->package.elements[0]); ++ if (element->type == ACPI_TYPE_PACKAGE) { ++ if ((element->package.count < 2) || ++ (element->package.elements[0].type != ACPI_TYPE_LOCAL_REFERENCE) || ++ (element->package.elements[1].type != ACPI_TYPE_INTEGER)) ++ return AE_BAD_DATA; ++ device->wakeup.gpe_device = element->package.elements[0].reference.handle; ++ device->wakeup.gpe_number = (u32)element->package.elements[1].integer.value; ++ }else if (element->type == ACPI_TYPE_INTEGER) { ++ device->wakeup.gpe_number = element->integer.value; ++ }else ++ return AE_BAD_DATA; ++ ++ element = &(package->package.elements[1]); ++ if (element->type != ACPI_TYPE_INTEGER) { ++ return AE_BAD_DATA; ++ } ++ device->wakeup.sleep_state = element->integer.value; ++ ++ if ((package->package.count - 2) > ACPI_MAX_HANDLES) { ++ return AE_NO_MEMORY; ++ } ++ device->wakeup.resources.count = package->package.count - 2; ++ for (i=0; i < device->wakeup.resources.count; i++) { ++ element = &(package->package.elements[i + 2]); ++ if (element->type != ACPI_TYPE_ANY ) { ++ return AE_BAD_DATA; ++ } ++ ++ device->wakeup.resources.handles[i] = element->reference.handle; ++ } ++ ++ return AE_OK; ++} ++ ++static int ++acpi_bus_get_wakeup_device_flags ( ++ struct acpi_device *device) ++{ ++ acpi_status status = 0; ++ struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL}; ++ union acpi_object *package = NULL; ++ ++ ACPI_FUNCTION_TRACE("acpi_bus_get_wakeup_flags"); ++ ++ /* _PRW */ ++ status = acpi_evaluate_object(device->handle, "_PRW", NULL, &buffer); ++ if (ACPI_FAILURE(status)) { ++ ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluating _PRW\n")); ++ goto end; ++ } ++ ++ package = (union acpi_object *) buffer.pointer; ++ status = acpi_bus_extract_wakeup_device_power_package(device, package); ++ if (ACPI_FAILURE(status)) { ++ ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error extracting _PRW package\n")); ++ goto end; ++ } ++ ++ acpi_os_free(buffer.pointer); ++ ++ device->wakeup.flags.valid = 1; ++ /* Power button, Lid switch always enable wakeup*/ ++ if (!acpi_match_ids(device, "PNP0C0D,PNP0C0C,PNP0C0E")) ++ device->wakeup.flags.run_wake = 1; ++ ++ /* TBD: lock */ ++ INIT_LIST_HEAD(&device->wakeup_list); ++ spin_lock(&acpi_device_lock); ++ list_add_tail(&device->wakeup_list, &acpi_wakeup_device_list); ++ spin_unlock(&acpi_device_lock); ++ ++end: ++ if (ACPI_FAILURE(status)) ++ device->flags.wake_capable = 0; ++ return 0; ++} + + /* -------------------------------------------------------------------------- + Performance Management +@@ -195,30 +312,7 @@ + struct acpi_device *device, + struct acpi_driver *driver) + { +- int error = 0; +- struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL}; +- +- if (device->flags.hardware_id) +- if (strstr(driver->ids, device->pnp.hardware_id)) +- goto Done; +- +- if (device->flags.compatible_ids) { +- struct acpi_compatible_id_list *cid_list = device->pnp.cid_list; +- int i; +- +- /* compare multiple _CID entries against driver ids */ +- for (i = 0; i < cid_list->count; i++) +- { +- if (strstr(driver->ids, cid_list->id[i].value)) +- goto Done; +- } +- } +- error = -ENOENT; +- +- Done: +- if (buffer.pointer) +- acpi_os_free(buffer.pointer); +- return error; ++ return acpi_match_ids(device, driver->ids); + } + + +@@ -276,6 +370,7 @@ + static int acpi_driver_attach(struct acpi_driver * drv) + { + struct list_head * node, * next; ++ int count = 0; + + ACPI_FUNCTION_TRACE("acpi_driver_attach"); + +@@ -290,6 +385,7 @@ + if (!acpi_bus_match(dev, drv)) { + if (!acpi_bus_driver_init(dev, drv)) { + atomic_inc(&drv->references); ++ count++; + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found driver [%s] for device [%s]\n", + drv->name, dev->pnp.bus_id)); + } +@@ -297,7 +393,7 @@ + spin_lock(&acpi_device_lock); + } + spin_unlock(&acpi_device_lock); +- return_VALUE(0); ++ return_VALUE(count); + } + + static int acpi_driver_detach(struct acpi_driver * drv) +@@ -328,28 +424,30 @@ + * acpi_bus_register_driver + * ------------------------ + * Registers a driver with the ACPI bus. Searches the namespace for all +- * devices that match the driver's criteria and binds. ++ * devices that match the driver's criteria and binds. Returns the ++ * number of devices that were claimed by the driver, or a negative ++ * error status for failure. + */ + int + acpi_bus_register_driver ( + struct acpi_driver *driver) + { +- int error = 0; ++ int count; + + ACPI_FUNCTION_TRACE("acpi_bus_register_driver"); + + if (acpi_disabled) + return_VALUE(-ENODEV); + +- if (driver) { +- spin_lock(&acpi_device_lock); +- list_add_tail(&driver->node, &acpi_bus_drivers); +- spin_unlock(&acpi_device_lock); +- acpi_driver_attach(driver); +- } else +- error = -EINVAL; ++ if (!driver) ++ return_VALUE(-EINVAL); + +- return_VALUE(error); ++ spin_lock(&acpi_device_lock); ++ list_add_tail(&driver->node, &acpi_bus_drivers); ++ spin_unlock(&acpi_device_lock); ++ count = acpi_driver_attach(driver); ++ ++ return_VALUE(count); + } + + +@@ -469,6 +567,11 @@ + if (ACPI_SUCCESS(status)) + device->flags.power_manageable = 1; + ++ /* Presence of _PRW indicates wake capable */ ++ status = acpi_get_handle(device->handle, "_PRW", &temp); ++ if (ACPI_SUCCESS(status)) ++ device->flags.wake_capable = 1; ++ + /* TBD: Peformance management */ + + return_VALUE(0); +@@ -736,6 +839,16 @@ + */ + if (device->flags.power_manageable) { + result = acpi_bus_get_power_flags(device); ++ if (result) ++ goto end; ++ } ++ ++ /* ++ * Wakeup device management ++ *----------------------- ++ */ ++ if (device->flags.wake_capable) { ++ result = acpi_bus_get_wakeup_device_flags(device); + if (result) + goto end; + } +diff -Nru a/drivers/acpi/sleep/Makefile b/drivers/acpi/sleep/Makefile +--- a/drivers/acpi/sleep/Makefile 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/sleep/Makefile 2004-09-21 21:26:34 +10:00 +@@ -1,5 +1,5 @@ + obj-y := poweroff.o +-obj-$(CONFIG_ACPI_SLEEP) += main.o ++obj-$(CONFIG_ACPI_SLEEP) += main.o wakeup.o + obj-$(CONFIG_ACPI_SLEEP_PROC_FS) += proc.o + + EXTRA_CFLAGS += $(ACPI_CFLAGS) +diff -Nru a/drivers/acpi/sleep/main.c b/drivers/acpi/sleep/main.c +--- a/drivers/acpi/sleep/main.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/sleep/main.c 2004-09-21 21:26:34 +10:00 +@@ -35,16 +35,16 @@ + + /** + * acpi_pm_prepare - Do preliminary suspend work. +- * @state: suspend state we're entering. ++ * @pm_state: suspend state we're entering. + * + * Make sure we support the state. If we do, and we need it, set the + * firmware waking vector and do arch-specific nastiness to get the + * wakeup code to the waking vector. + */ + +-static int acpi_pm_prepare(u32 state) ++static int acpi_pm_prepare(u32 pm_state) + { +- u32 acpi_state = acpi_suspend_states[state]; ++ u32 acpi_state = acpi_suspend_states[pm_state]; + + if (!sleep_states[acpi_state]) + return -EPERM; +@@ -52,13 +52,14 @@ + /* do we have a wakeup address for S2 and S3? */ + /* Here, we support only S4BIOS, those we set the wakeup address */ + /* S4OS is only supported for now via swsusp.. */ +- if (state == PM_SUSPEND_MEM || state == PM_SUSPEND_DISK) { ++ if (pm_state == PM_SUSPEND_MEM || pm_state == PM_SUSPEND_DISK) { + if (!acpi_wakeup_address) + return -EFAULT; + acpi_set_firmware_waking_vector( + (acpi_physical_address) acpi_wakeup_address); + } + ACPI_FLUSH_CPU_CACHE(); ++ acpi_enable_wakeup_device_prep(acpi_state); + acpi_enter_sleep_state_prep(acpi_state); + return 0; + } +@@ -66,23 +67,23 @@ + + /** + * acpi_pm_enter - Actually enter a sleep state. +- * @state: State we're entering. ++ * @pm_state: State we're entering. + * + * Flush caches and go to sleep. For STR or STD, we have to call + * arch-specific assembly, which in turn call acpi_enter_sleep_state(). + * It's unfortunate, but it works. Please fix if you're feeling frisky. + */ + +-static int acpi_pm_enter(u32 state) ++static int acpi_pm_enter(u32 pm_state) + { + acpi_status status = AE_OK; + unsigned long flags = 0; +- u32 acpi_state = acpi_suspend_states[state]; ++ u32 acpi_state = acpi_suspend_states[pm_state]; + + ACPI_FLUSH_CPU_CACHE(); + + /* Do arch specific saving of state. */ +- if (state > PM_SUSPEND_STANDBY) { ++ if (pm_state > PM_SUSPEND_STANDBY) { + int error = acpi_save_state_mem(); + if (error) + return error; +@@ -90,7 +91,8 @@ + + + local_irq_save(flags); +- switch (state) ++ acpi_enable_wakeup_device(acpi_state); ++ switch (pm_state) + { + case PM_SUSPEND_STANDBY: + barrier(); +@@ -118,7 +120,7 @@ + * And, in the case of the latter, the memory image should have already + * been loaded from disk. + */ +- if (state > PM_SUSPEND_STANDBY) ++ if (pm_state > PM_SUSPEND_STANDBY) + acpi_restore_state_mem(); + + +@@ -128,15 +130,18 @@ + + /** + * acpi_pm_finish - Finish up suspend sequence. +- * @state: State we're coming out of. ++ * @pm_state: State we're coming out of. + * + * This is called after we wake back up (or if entering the sleep state + * failed). + */ + +-static int acpi_pm_finish(u32 state) ++static int acpi_pm_finish(u32 pm_state) + { +- acpi_leave_sleep_state(state); ++ u32 acpi_state = acpi_suspend_states[pm_state]; ++ ++ acpi_leave_sleep_state(acpi_state); ++ acpi_disable_wakeup_device(acpi_state); + + /* reset firmware waking vector */ + acpi_set_firmware_waking_vector((acpi_physical_address) 0); +@@ -199,7 +204,7 @@ + return 0; + + printk(KERN_INFO PREFIX "(supports"); +- for (i=0; iwakeup.flags.valid) ++ continue; ++ spin_unlock(&acpi_device_lock); ++ if (dev->wakeup.flags.run_wake) ++ seq_printf(seq, "%4s %4d %8s\n", ++ dev->pnp.bus_id, (u32) dev->wakeup.sleep_state, ++ dev->wakeup.state.enabled ? "*enabled" : "*disabled"); ++ else ++ seq_printf(seq, "%4s %4d %8s\n", ++ dev->pnp.bus_id, (u32) dev->wakeup.sleep_state, ++ dev->wakeup.state.enabled ? "enabled" : "disabled"); ++ spin_lock(&acpi_device_lock); ++ } ++ spin_unlock(&acpi_device_lock); ++ return 0; ++} ++ ++static ssize_t ++acpi_system_write_wakeup_device ( ++ struct file *file, ++ const char __user *buffer, ++ size_t count, ++ loff_t *ppos) ++{ ++ struct list_head * node, * next; ++ char strbuf[5]; ++ char str[5] = ""; ++ int len = count; ++ ++ if (len > 4) len = 4; ++ ++ if (copy_from_user(strbuf, buffer, len)) ++ return -EFAULT; ++ strbuf[len] = '\0'; ++ sscanf(strbuf, "%s", str); ++ ++ spin_lock(&acpi_device_lock); ++ list_for_each_safe(node, next, &acpi_wakeup_device_list) { ++ struct acpi_device * dev = container_of(node, struct acpi_device, wakeup_list); ++ if (!dev->wakeup.flags.valid) ++ continue; ++ ++ if (!strncmp(dev->pnp.bus_id, str, 4)) { ++ dev->wakeup.state.enabled = dev->wakeup.state.enabled ? 0:1; ++ break; ++ } ++ } ++ spin_unlock(&acpi_device_lock); ++ return count; ++} ++ ++static int ++acpi_system_wakeup_device_open_fs(struct inode *inode, struct file *file) ++{ ++ return single_open(file, acpi_system_wakeup_device_seq_show, PDE(inode)->data); ++} ++ ++static struct file_operations acpi_system_wakeup_device_fops = { ++ .open = acpi_system_wakeup_device_open_fs, ++ .read = seq_read, ++ .write = acpi_system_write_wakeup_device, ++ .llseek = seq_lseek, ++ .release = single_release, ++}; + + static struct file_operations acpi_system_sleep_fops = { + .open = acpi_system_sleep_open_fs, +@@ -388,6 +467,13 @@ + S_IFREG|S_IRUGO|S_IWUSR, acpi_root_dir); + if (entry) + entry->proc_fops = &acpi_system_alarm_fops; ++ ++ /* 'wakeup device' [R/W]*/ ++ entry = create_proc_entry(ACPI_SYSTEM_FILE_WAKEUP_DEVICE, ++ S_IFREG|S_IRUGO|S_IWUSR, acpi_root_dir); ++ if (entry) ++ entry->proc_fops = &acpi_system_wakeup_device_fops; ++ + return 0; + } + +diff -Nru a/drivers/acpi/sleep/sleep.h b/drivers/acpi/sleep/sleep.h +--- a/drivers/acpi/sleep/sleep.h 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/sleep/sleep.h 2004-09-21 21:26:34 +10:00 +@@ -2,3 +2,6 @@ + extern u8 sleep_states[]; + extern int acpi_suspend (u32 state); + ++extern void acpi_enable_wakeup_device_prep(u8 sleep_state); ++extern void acpi_enable_wakeup_device(u8 sleep_state); ++extern void acpi_disable_wakeup_device(u8 sleep_state); +diff -Nru a/drivers/acpi/sleep/wakeup.c b/drivers/acpi/sleep/wakeup.c +--- /dev/null Wed Dec 31 16:00:00 196900 ++++ b/drivers/acpi/sleep/wakeup.c 2004-09-21 21:26:35 +10:00 +@@ -0,0 +1,181 @@ ++/* ++ * wakeup.c - support wakeup devices ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include "sleep.h" ++ ++#define _COMPONENT ACPI_SYSTEM_COMPONENT ++ACPI_MODULE_NAME ("wakeup_devices") ++ ++/** ++ * acpi_enable_wakeup_device_prep - prepare wakeup devices ++ * @sleep_state: ACPI state ++ * Enable all wakup devices power if the devices' wakeup level ++ * is higher than requested sleep level ++ */ ++extern struct list_head acpi_wakeup_device_list; ++extern spinlock_t acpi_device_lock; ++ ++void ++acpi_enable_wakeup_device_prep( ++ u8 sleep_state) ++{ ++ struct list_head * node, * next; ++ ++ ACPI_FUNCTION_TRACE("acpi_enable_wakeup_device_prep"); ++ ++ spin_lock(&acpi_device_lock); ++ list_for_each_safe(node, next, &acpi_wakeup_device_list) { ++ struct acpi_device * dev = container_of(node, ++ struct acpi_device, wakeup_list); ++ ++ if (!dev->wakeup.flags.valid || ++ !dev->wakeup.state.enabled || ++ (sleep_state > (u32) dev->wakeup.sleep_state)) ++ continue; ++ ++ spin_unlock(&acpi_device_lock); ++ acpi_enable_wakeup_device_power(dev); ++ spin_lock(&acpi_device_lock); ++ } ++ spin_unlock(&acpi_device_lock); ++} ++ ++/** ++ * acpi_enable_wakeup_device - enable wakeup devices ++ * @sleep_state: ACPI state ++ * Enable all wakup devices's GPE ++ */ ++void ++acpi_enable_wakeup_device( ++ u8 sleep_state) ++{ ++ struct list_head * node, * next; ++ ++ /* ++ * Caution: this routine must be invoked when interrupt is disabled ++ * Refer ACPI2.0: P212 ++ */ ++ ACPI_FUNCTION_TRACE("acpi_enable_wakeup_device"); ++ spin_lock(&acpi_device_lock); ++ list_for_each_safe(node, next, &acpi_wakeup_device_list) { ++ struct acpi_device * dev = container_of(node, ++ struct acpi_device, wakeup_list); ++ ++ /* If users want to disable run-wake GPE, ++ * we only disable it for wake and leave it for runtime ++ */ ++ if (dev->wakeup.flags.run_wake && !dev->wakeup.state.enabled) { ++ spin_unlock(&acpi_device_lock); ++ acpi_set_gpe_type(dev->wakeup.gpe_device, ++ dev->wakeup.gpe_number, ACPI_GPE_TYPE_RUNTIME); ++ /* Re-enable it, since set_gpe_type will disable it */ ++ acpi_enable_gpe(dev->wakeup.gpe_device, ++ dev->wakeup.gpe_number, ACPI_ISR); ++ spin_lock(&acpi_device_lock); ++ continue; ++ } ++ ++ if (!dev->wakeup.flags.valid || ++ !dev->wakeup.state.enabled || ++ (sleep_state > (u32) dev->wakeup.sleep_state)) ++ continue; ++ ++ spin_unlock(&acpi_device_lock); ++ /* run-wake GPE has been enabled */ ++ if (!dev->wakeup.flags.run_wake) ++ acpi_enable_gpe(dev->wakeup.gpe_device, ++ dev->wakeup.gpe_number, ACPI_ISR); ++ dev->wakeup.state.active = 1; ++ spin_lock(&acpi_device_lock); ++ } ++ spin_unlock(&acpi_device_lock); ++} ++ ++/** ++ * acpi_disable_wakeup_device - disable devices' wakeup capability ++ * @sleep_state: ACPI state ++ * Disable all wakup devices's GPE and wakeup capability ++ */ ++void ++acpi_disable_wakeup_device ( ++ u8 sleep_state) ++{ ++ struct list_head * node, * next; ++ ++ ACPI_FUNCTION_TRACE("acpi_disable_wakeup_device"); ++ ++ spin_lock(&acpi_device_lock); ++ list_for_each_safe(node, next, &acpi_wakeup_device_list) { ++ struct acpi_device * dev = container_of(node, ++ struct acpi_device, wakeup_list); ++ ++ if (dev->wakeup.flags.run_wake && !dev->wakeup.state.enabled) { ++ spin_unlock(&acpi_device_lock); ++ acpi_set_gpe_type(dev->wakeup.gpe_device, ++ dev->wakeup.gpe_number, ACPI_GPE_TYPE_WAKE_RUN); ++ /* Re-enable it, since set_gpe_type will disable it */ ++ acpi_enable_gpe(dev->wakeup.gpe_device, ++ dev->wakeup.gpe_number, ACPI_NOT_ISR); ++ spin_lock(&acpi_device_lock); ++ continue; ++ } ++ ++ if (!dev->wakeup.flags.valid || ++ !dev->wakeup.state.active || ++ (sleep_state > (u32) dev->wakeup.sleep_state)) ++ continue; ++ ++ spin_unlock(&acpi_device_lock); ++ acpi_disable_wakeup_device_power(dev); ++ /* Never disable run-wake GPE */ ++ if (!dev->wakeup.flags.run_wake) { ++ acpi_disable_gpe(dev->wakeup.gpe_device, ++ dev->wakeup.gpe_number, ACPI_NOT_ISR); ++ acpi_clear_gpe(dev->wakeup.gpe_device, ++ dev->wakeup.gpe_number, ACPI_NOT_ISR); ++ } ++ dev->wakeup.state.active = 0; ++ spin_lock(&acpi_device_lock); ++ } ++ spin_unlock(&acpi_device_lock); ++} ++ ++static int __init acpi_wakeup_device_init(void) ++{ ++ struct list_head * node, * next; ++ ++ if (acpi_disabled) ++ return 0; ++ printk("ACPI wakeup devices: \n"); ++ ++ spin_lock(&acpi_device_lock); ++ list_for_each_safe(node, next, &acpi_wakeup_device_list) { ++ struct acpi_device * dev = container_of(node, ++ struct acpi_device, wakeup_list); ++ ++ /* In case user doesn't load button driver */ ++ if (dev->wakeup.flags.run_wake && !dev->wakeup.state.enabled) { ++ spin_unlock(&acpi_device_lock); ++ acpi_set_gpe_type(dev->wakeup.gpe_device, ++ dev->wakeup.gpe_number, ACPI_GPE_TYPE_WAKE_RUN); ++ acpi_enable_gpe(dev->wakeup.gpe_device, ++ dev->wakeup.gpe_number, ACPI_NOT_ISR); ++ dev->wakeup.state.enabled = 1; ++ spin_lock(&acpi_device_lock); ++ } ++ printk("%4s ", dev->pnp.bus_id); ++ } ++ spin_unlock(&acpi_device_lock); ++ printk("\n"); ++ ++ return 0; ++} ++ ++late_initcall(acpi_wakeup_device_init); +diff -Nru a/drivers/acpi/tables/tbxfroot.c b/drivers/acpi/tables/tbxfroot.c +--- a/drivers/acpi/tables/tbxfroot.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/tables/tbxfroot.c 2004-09-21 21:26:34 +10:00 +@@ -115,17 +115,14 @@ + * Instance - the non zero instance of the table, allows + * support for multiple tables of the same type + * Flags - Physical/Virtual support +- * ret_buffer - pointer to a structure containing a buffer to +- * receive the table ++ * table_pointer - Where a buffer containing the table is ++ * returned + * + * RETURN: Status + * +- * DESCRIPTION: This function is called to get an ACPI table. The caller +- * supplies an out_buffer large enough to contain the entire ACPI +- * table. Upon completion +- * the out_buffer->Length field will indicate the number of bytes +- * copied into the out_buffer->buf_ptr buffer. This table will be +- * a complete table including the header. ++ * DESCRIPTION: This function is called to get an ACPI table. A buffer is ++ * allocated for the table and returned in table_pointer. ++ * This table will be a complete table including the header. + * + ******************************************************************************/ + +@@ -136,12 +133,11 @@ + u32 flags, + struct acpi_table_header **table_pointer) + { +- struct acpi_pointer rsdp_address; +- struct acpi_pointer address; + acpi_status status; +- struct acpi_table_header header; +- struct acpi_table_desc table_info; +- struct acpi_table_desc rsdt_info; ++ struct acpi_pointer address; ++ struct acpi_table_header *header = NULL; ++ struct acpi_table_desc *table_info = NULL; ++ struct acpi_table_desc *rsdt_info; + u32 table_count; + u32 i; + u32 j; +@@ -152,45 +148,41 @@ + + /* + * Ensure that at least the table manager is initialized. We don't +- * require that the entire ACPI subsystem is up for this interface +- */ +- +- /* +- * If we have a buffer, we must have a length too ++ * require that the entire ACPI subsystem is up for this interface. ++ * If we have a buffer, we must have a length too + */ +- if ((instance == 0) || +- (!signature) || ++ if ((instance == 0) || ++ (!signature) || + (!table_pointer)) { + return_ACPI_STATUS (AE_BAD_PARAMETER); + } + +- rsdt_info.pointer = NULL; ++ /* Ensure that we have a RSDP */ + + if (!acpi_gbl_RSDP) { + /* Get the RSDP */ + +- status = acpi_os_get_root_pointer (flags, &rsdp_address); ++ status = acpi_os_get_root_pointer (flags, &address); + if (ACPI_FAILURE (status)) { +- ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "RSDP not found\n")); ++ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "RSDP not found\n")); + return_ACPI_STATUS (AE_NO_ACPI_TABLES); + } + + /* Map and validate the RSDP */ + + if ((flags & ACPI_MEMORY_MODE) == ACPI_LOGICAL_ADDRESSING) { +- status = acpi_os_map_memory (rsdp_address.pointer.physical, sizeof (struct rsdp_descriptor), ++ status = acpi_os_map_memory (address.pointer.physical, sizeof (struct rsdp_descriptor), + (void *) &acpi_gbl_RSDP); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } + } + else { +- acpi_gbl_RSDP = rsdp_address.pointer.logical; ++ acpi_gbl_RSDP = address.pointer.logical; + } + +- /* +- * The signature and checksum must both be correct +- */ ++ /* The signature and checksum must both be correct */ ++ + if (ACPI_STRNCMP ((char *) acpi_gbl_RSDP, RSDP_SIG, sizeof (RSDP_SIG)-1) != 0) { + /* Nope, BAD Signature */ + +@@ -204,10 +196,9 @@ + } + } + +- /* Get the RSDT and validate it */ ++ /* Get the RSDT address via the RSDP */ + + acpi_tb_get_rsdt_address (&address); +- + ACPI_DEBUG_PRINT ((ACPI_DB_INFO, + "RSDP located at %p, RSDT physical=%8.8X%8.8X \n", + acpi_gbl_RSDP, +@@ -217,20 +208,40 @@ + + address.pointer_type |= flags; + +- status = acpi_tb_get_table (&address, &rsdt_info); ++ /* Get and validate the RSDT */ ++ ++ rsdt_info = ACPI_MEM_CALLOCATE (sizeof (struct acpi_table_desc)); ++ if (!rsdt_info) { ++ return_ACPI_STATUS (AE_NO_MEMORY); ++ } ++ ++ status = acpi_tb_get_table (&address, rsdt_info); + if (ACPI_FAILURE (status)) { +- return_ACPI_STATUS (status); ++ goto cleanup; + } + +- status = acpi_tb_validate_rsdt (rsdt_info.pointer); ++ status = acpi_tb_validate_rsdt (rsdt_info->pointer); + if (ACPI_FAILURE (status)) { + goto cleanup; + } + +- /* Get the number of table pointers within the RSDT */ ++ /* Allocate a scratch table header and table descriptor */ + +- table_count = acpi_tb_get_table_count (acpi_gbl_RSDP, rsdt_info.pointer); ++ header = ACPI_MEM_ALLOCATE (sizeof (struct acpi_table_header)); ++ if (!header) { ++ status = AE_NO_MEMORY; ++ goto cleanup; ++ } + ++ table_info = ACPI_MEM_ALLOCATE (sizeof (struct acpi_table_desc)); ++ if (!table_info) { ++ status = AE_NO_MEMORY; ++ goto cleanup; ++ } ++ ++ /* Get the number of table pointers within the RSDT */ ++ ++ table_count = acpi_tb_get_table_count (acpi_gbl_RSDP, rsdt_info->pointer); + address.pointer_type = acpi_gbl_table_flags | flags; + + /* +@@ -241,35 +252,36 @@ + /* Get the next table pointer, handle RSDT vs. XSDT */ + + if (acpi_gbl_RSDP->revision < 2) { +- address.pointer.value = (ACPI_CAST_PTR (RSDT_DESCRIPTOR, rsdt_info.pointer))->table_offset_entry[i]; ++ address.pointer.value = (ACPI_CAST_PTR ( ++ RSDT_DESCRIPTOR, rsdt_info->pointer))->table_offset_entry[i]; + } + else { +- address.pointer.value = +- (ACPI_CAST_PTR (XSDT_DESCRIPTOR, rsdt_info.pointer))->table_offset_entry[i]; ++ address.pointer.value = (ACPI_CAST_PTR ( ++ XSDT_DESCRIPTOR, rsdt_info->pointer))->table_offset_entry[i]; + } + + /* Get the table header */ + +- status = acpi_tb_get_table_header (&address, &header); ++ status = acpi_tb_get_table_header (&address, header); + if (ACPI_FAILURE (status)) { + goto cleanup; + } + + /* Compare table signatures and table instance */ + +- if (!ACPI_STRNCMP (header.signature, signature, ACPI_NAME_SIZE)) { ++ if (!ACPI_STRNCMP (header->signature, signature, ACPI_NAME_SIZE)) { + /* An instance of the table was found */ + + j++; + if (j >= instance) { + /* Found the correct instance, get the entire table */ + +- status = acpi_tb_get_table_body (&address, &header, &table_info); ++ status = acpi_tb_get_table_body (&address, header, table_info); + if (ACPI_FAILURE (status)) { + goto cleanup; + } + +- *table_pointer = table_info.pointer; ++ *table_pointer = table_info->pointer; + goto cleanup; + } + } +@@ -281,7 +293,15 @@ + + + cleanup: +- acpi_os_unmap_memory (rsdt_info.pointer, (acpi_size) rsdt_info.pointer->length); ++ acpi_os_unmap_memory (rsdt_info->pointer, (acpi_size) rsdt_info->pointer->length); ++ ACPI_MEM_FREE (rsdt_info); ++ ++ if (header) { ++ ACPI_MEM_FREE (header); ++ } ++ if (table_info) { ++ ACPI_MEM_FREE (table_info); ++ } + return_ACPI_STATUS (status); + } + +@@ -389,14 +409,17 @@ + * Flags - Current memory mode (logical vs. + * physical addressing) + * +- * RETURN: Status ++ * RETURN: Status, RSDP physical address + * + * DESCRIPTION: search lower 1_mbyte of memory for the root system descriptor + * pointer structure. If it is found, set *RSDP to point to it. + * +- * NOTE: The RSDp must be either in the first 1_k of the Extended +- * BIOS Data Area or between E0000 and FFFFF (ACPI 1.0 section +- * 5.2.2; assertion #421). ++ * NOTE1: The RSDp must be either in the first 1_k of the Extended ++ * BIOS Data Area or between E0000 and FFFFF (From ACPI Spec.) ++ * Only a 32-bit physical address is necessary. ++ * ++ * NOTE2: This function is always available, regardless of the ++ * initialization state of the rest of ACPI. + * + ******************************************************************************/ + +@@ -407,8 +430,8 @@ + { + u8 *table_ptr; + u8 *mem_rover; +- u64 phys_addr; +- acpi_status status = AE_OK; ++ u32 physical_address; ++ acpi_status status; + + + ACPI_FUNCTION_TRACE ("tb_find_rsdp"); +@@ -419,36 +442,57 @@ + */ + if ((flags & ACPI_MEMORY_MODE) == ACPI_LOGICAL_ADDRESSING) { + /* +- * 1) Search EBDA (low memory) paragraphs ++ * 1a) Get the location of the EBDA + */ +- status = acpi_os_map_memory ((u64) ACPI_LO_RSDP_WINDOW_BASE, ACPI_LO_RSDP_WINDOW_SIZE, ++ status = acpi_os_map_memory ((acpi_physical_address) ACPI_EBDA_PTR_LOCATION, ++ ACPI_EBDA_PTR_LENGTH, + (void *) &table_ptr); + if (ACPI_FAILURE (status)) { +- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not map memory at %X for length %X\n", +- ACPI_LO_RSDP_WINDOW_BASE, ACPI_LO_RSDP_WINDOW_SIZE)); ++ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not map memory at %8.8X for length %X\n", ++ ACPI_EBDA_PTR_LOCATION, ACPI_EBDA_PTR_LENGTH)); + return_ACPI_STATUS (status); + } + +- mem_rover = acpi_tb_scan_memory_for_rsdp (table_ptr, ACPI_LO_RSDP_WINDOW_SIZE); +- acpi_os_unmap_memory (table_ptr, ACPI_LO_RSDP_WINDOW_SIZE); ++ ACPI_MOVE_16_TO_32 (&physical_address, table_ptr); ++ physical_address <<= 4; /* Convert segment to physical address */ ++ acpi_os_unmap_memory (table_ptr, ACPI_EBDA_PTR_LENGTH); ++ ++ /* EBDA present? */ ++ ++ if (physical_address > 0x400) { ++ /* ++ * 1b) Search EBDA paragraphs (EBDa is required to be a minimum of 1_k length) ++ */ ++ status = acpi_os_map_memory ((acpi_physical_address) physical_address, ++ ACPI_EBDA_WINDOW_SIZE, ++ (void *) &table_ptr); ++ if (ACPI_FAILURE (status)) { ++ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not map memory at %8.8X for length %X\n", ++ physical_address, ACPI_EBDA_WINDOW_SIZE)); ++ return_ACPI_STATUS (status); ++ } + +- if (mem_rover) { +- /* Found it, return the physical address */ ++ mem_rover = acpi_tb_scan_memory_for_rsdp (table_ptr, ACPI_EBDA_WINDOW_SIZE); ++ acpi_os_unmap_memory (table_ptr, ACPI_EBDA_WINDOW_SIZE); + +- phys_addr = ACPI_LO_RSDP_WINDOW_BASE; +- phys_addr += ACPI_PTR_DIFF (mem_rover,table_ptr); ++ if (mem_rover) { ++ /* Found it, return the physical address */ + +- table_info->physical_address = phys_addr; +- return_ACPI_STATUS (AE_OK); ++ physical_address += ACPI_PTR_DIFF (mem_rover, table_ptr); ++ ++ table_info->physical_address = (acpi_physical_address) physical_address; ++ return_ACPI_STATUS (AE_OK); ++ } + } + + /* +- * 2) Search upper memory: 16-byte boundaries in E0000h-F0000h ++ * 2) Search upper memory: 16-byte boundaries in E0000h-FFFFFh + */ +- status = acpi_os_map_memory ((u64) ACPI_HI_RSDP_WINDOW_BASE, ACPI_HI_RSDP_WINDOW_SIZE, ++ status = acpi_os_map_memory ((acpi_physical_address) ACPI_HI_RSDP_WINDOW_BASE, ++ ACPI_HI_RSDP_WINDOW_SIZE, + (void *) &table_ptr); + if (ACPI_FAILURE (status)) { +- ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not map memory at %X for length %X\n", ++ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not map memory at %8.8X for length %X\n", + ACPI_HI_RSDP_WINDOW_BASE, ACPI_HI_RSDP_WINDOW_SIZE)); + return_ACPI_STATUS (status); + } +@@ -459,10 +503,9 @@ + if (mem_rover) { + /* Found it, return the physical address */ + +- phys_addr = ACPI_HI_RSDP_WINDOW_BASE; +- phys_addr += ACPI_PTR_DIFF (mem_rover, table_ptr); ++ physical_address = ACPI_HI_RSDP_WINDOW_BASE + ACPI_PTR_DIFF (mem_rover, table_ptr); + +- table_info->physical_address = phys_addr; ++ table_info->physical_address = (acpi_physical_address) physical_address; + return_ACPI_STATUS (AE_OK); + } + } +@@ -472,19 +515,29 @@ + */ + else { + /* +- * 1) Search EBDA (low memory) paragraphs ++ * 1a) Get the location of the EBDA + */ +- mem_rover = acpi_tb_scan_memory_for_rsdp (ACPI_PHYSADDR_TO_PTR (ACPI_LO_RSDP_WINDOW_BASE), +- ACPI_LO_RSDP_WINDOW_SIZE); +- if (mem_rover) { +- /* Found it, return the physical address */ ++ ACPI_MOVE_16_TO_32 (&physical_address, ACPI_EBDA_PTR_LOCATION); ++ physical_address <<= 4; /* Convert segment to physical address */ + +- table_info->physical_address = ACPI_TO_INTEGER (mem_rover); +- return_ACPI_STATUS (AE_OK); ++ /* EBDA present? */ ++ ++ if (physical_address > 0x400) { ++ /* ++ * 1b) Search EBDA paragraphs (EBDa is required to be a minimum of 1_k length) ++ */ ++ mem_rover = acpi_tb_scan_memory_for_rsdp (ACPI_PHYSADDR_TO_PTR (physical_address), ++ ACPI_EBDA_WINDOW_SIZE); ++ if (mem_rover) { ++ /* Found it, return the physical address */ ++ ++ table_info->physical_address = ACPI_TO_INTEGER (mem_rover); ++ return_ACPI_STATUS (AE_OK); ++ } + } + + /* +- * 2) Search upper memory: 16-byte boundaries in E0000h-F0000h ++ * 2) Search upper memory: 16-byte boundaries in E0000h-FFFFFh + */ + mem_rover = acpi_tb_scan_memory_for_rsdp (ACPI_PHYSADDR_TO_PTR (ACPI_HI_RSDP_WINDOW_BASE), + ACPI_HI_RSDP_WINDOW_SIZE); +diff -Nru a/drivers/acpi/tables.c b/drivers/acpi/tables.c +--- a/drivers/acpi/tables.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/tables.c 2004-09-21 21:26:34 +10:00 +@@ -101,7 +101,7 @@ + else + name = header->signature; + +- printk(KERN_INFO PREFIX "%.4s (v%3.3d %6.6s %8.8s 0x%08x %.4s 0x%08x) @ 0x%p\n", ++ printk(KERN_DEBUG PREFIX "%.4s (v%3.3d %6.6s %8.8s 0x%08x %.4s 0x%08x) @ 0x%p\n", + name, header->revision, header->oem_id, + header->oem_table_id, header->oem_revision, + header->asl_compiler_id, header->asl_compiler_revision, +@@ -587,7 +587,7 @@ + return -ENODEV; + } + +- printk(KERN_INFO PREFIX "RSDP (v%3.3d %6.6s ) @ 0x%p\n", ++ printk(KERN_DEBUG PREFIX "RSDP (v%3.3d %6.6s ) @ 0x%p\n", + rsdp->revision, rsdp->oem_id, (void *) rsdp_phys); + + if (rsdp->revision < 2) +diff -Nru a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c +--- a/drivers/acpi/thermal.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/thermal.c 2004-09-21 21:26:34 +10:00 +@@ -60,6 +60,7 @@ + #define ACPI_THERMAL_NOTIFY_HOT 0xF1 + #define ACPI_THERMAL_MODE_ACTIVE 0x00 + #define ACPI_THERMAL_MODE_PASSIVE 0x01 ++#define ACPI_THERMAL_MODE_CRT 0xff + #define ACPI_THERMAL_PATH_POWEROFF "/sbin/poweroff" + + #define ACPI_THERMAL_MAX_ACTIVE 10 +@@ -289,13 +290,6 @@ + status = acpi_get_handle(tz->handle, "_SCP", &handle); + if (ACPI_FAILURE(status)) { + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "_SCP not present\n")); +- status = acpi_get_handle(tz->handle, "_PSV", &handle); +- if(!ACPI_FAILURE(status)) { +- tz->cooling_mode = 1; +- ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Cooling mode [%s]\n", +- mode?"passive":"active")); +- return_VALUE(0); +- } + return_VALUE(-ENODEV); + } + +@@ -899,8 +893,10 @@ + struct seq_file *m = (struct seq_file *)file->private_data; + struct acpi_thermal *tz = (struct acpi_thermal *)m->private; + +- char limit_string[25] = {'\0'}; +- int critical, hot, passive, active0, active1; ++ char limit_string[65] = {'\0'}; ++ int num, critical, hot, passive; ++ int active[ACPI_THERMAL_MAX_ACTIVE]; ++ int i = 0; + + ACPI_FUNCTION_TRACE("acpi_thermal_write_trip_points"); + +@@ -916,7 +912,11 @@ + + limit_string[count] = '\0'; + +- if (sscanf(limit_string, "%d:%d:%d:%d:%d", &critical, &hot, &passive, &active0, &active1) != 5) { ++ num = sscanf(limit_string, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d", ++ &critical, &hot, &passive, ++ &active[0], &active[1], &active[2], &active[3], &active[4], ++ &active[5], &active[6], &active[7], &active[8], &active[9]); ++ if(!(num >=5 && num < (ACPI_THERMAL_MAX_ACTIVE + 3))) { + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Invalid data format\n")); + return_VALUE(-EINVAL); + } +@@ -924,8 +924,11 @@ + tz->trips.critical.temperature = CELSIUS_TO_KELVIN(critical); + tz->trips.hot.temperature = CELSIUS_TO_KELVIN(hot); + tz->trips.passive.temperature = CELSIUS_TO_KELVIN(passive); +- tz->trips.active[0].temperature = CELSIUS_TO_KELVIN(active0); +- tz->trips.active[1].temperature = CELSIUS_TO_KELVIN(active1); ++ for (i = 0; i < num - 3; i++) { ++ if (!(tz->trips.active[i].flags.valid)) ++ break; ++ tz->trips.active[i].temperature = CELSIUS_TO_KELVIN(active[i]); ++ } + + return_VALUE(count); + } +@@ -941,12 +944,14 @@ + goto end; + + if (!tz->flags.cooling_mode) { +- seq_puts(seq, "\n"); +- goto end; ++ seq_puts(seq, "\n"); + } + +- seq_printf(seq, "cooling mode: %s\n", +- tz->cooling_mode?"passive":"active"); ++ if ( tz->cooling_mode == ACPI_THERMAL_MODE_CRT ) ++ seq_printf(seq, "cooling mode: critical\n"); ++ else ++ seq_printf(seq, "cooling mode: %s\n", ++ tz->cooling_mode?"passive":"active"); + + end: + return 0; +@@ -988,6 +993,8 @@ + if (result) + return_VALUE(result); + ++ acpi_thermal_check(tz); ++ + return_VALUE(count); + } + +@@ -1225,15 +1232,33 @@ + if (result) + return_VALUE(result); + +- /* Set the cooling mode [_SCP] to active cooling (default) */ +- result = acpi_thermal_set_cooling_mode(tz, ACPI_THERMAL_MODE_ACTIVE); +- if (!result) +- tz->flags.cooling_mode = 1; +- + /* Get trip points [_CRT, _PSV, etc.] (required) */ + result = acpi_thermal_get_trip_points(tz); + if (result) + return_VALUE(result); ++ ++ /* Set the cooling mode [_SCP] to active cooling (default) */ ++ result = acpi_thermal_set_cooling_mode(tz, ACPI_THERMAL_MODE_ACTIVE); ++ if (!result) ++ tz->flags.cooling_mode = 1; ++ else { ++ /* Oh,we have not _SCP method. ++ Generally show cooling_mode by _ACx, _PSV,spec 12.2*/ ++ tz->flags.cooling_mode = 0; ++ if ( tz->trips.active[0].flags.valid && tz->trips.passive.flags.valid ) { ++ if ( tz->trips.passive.temperature > tz->trips.active[0].temperature ) ++ tz->cooling_mode = ACPI_THERMAL_MODE_ACTIVE; ++ else ++ tz->cooling_mode = ACPI_THERMAL_MODE_PASSIVE; ++ } else if ( !tz->trips.active[0].flags.valid && tz->trips.passive.flags.valid ) { ++ tz->cooling_mode = ACPI_THERMAL_MODE_PASSIVE; ++ } else if ( tz->trips.active[0].flags.valid && !tz->trips.passive.flags.valid ) { ++ tz->cooling_mode = ACPI_THERMAL_MODE_ACTIVE; ++ } else { ++ /* _ACx and _PSV are optional, but _CRT is required */ ++ tz->cooling_mode = ACPI_THERMAL_MODE_CRT; ++ } ++ } + + /* Get default polling frequency [_TZP] (optional) */ + if (tzp) +diff -Nru a/drivers/acpi/utilities/utalloc.c b/drivers/acpi/utilities/utalloc.c +--- a/drivers/acpi/utilities/utalloc.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/utilities/utalloc.c 2004-09-21 21:26:34 +10:00 +@@ -259,8 +259,8 @@ + * + * FUNCTION: acpi_ut_initialize_buffer + * +- * PARAMETERS: required_length - Length needed +- * Buffer - Buffer to be validated ++ * PARAMETERS: Buffer - Buffer to be validated ++ * required_length - Length needed + * + * RETURN: Status + * +@@ -603,7 +603,8 @@ + * + * FUNCTION: acpi_ut_find_allocation + * +- * PARAMETERS: Allocation - Address of allocated memory ++ * PARAMETERS: list_id - Memory list to search ++ * Allocation - Address of allocated memory + * + * RETURN: A list element if found; NULL otherwise. + * +@@ -646,7 +647,8 @@ + * + * FUNCTION: acpi_ut_track_allocation + * +- * PARAMETERS: Allocation - Address of allocated memory ++ * PARAMETERS: list_id - Memory list to search ++ * Allocation - Address of allocated memory + * Size - Size of the allocation + * alloc_type - MEM_MALLOC or MEM_CALLOC + * Component - Component type of caller +@@ -733,7 +735,8 @@ + * + * FUNCTION: acpi_ut_remove_allocation + * +- * PARAMETERS: Allocation - Address of allocated memory ++ * PARAMETERS: list_id - Memory list to search ++ * Allocation - Address of allocated memory + * Component - Component type of caller + * Module - Source file name of caller + * Line - Line number of caller +diff -Nru a/drivers/acpi/utilities/uteval.c b/drivers/acpi/utilities/uteval.c +--- a/drivers/acpi/utilities/uteval.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/utilities/uteval.c 2004-09-21 21:26:34 +10:00 +@@ -133,7 +133,7 @@ + u32 expected_return_btypes, + union acpi_operand_object **return_desc) + { +- union acpi_operand_object *obj_desc; ++ struct acpi_parameter_info info; + acpi_status status; + u32 return_btype; + +@@ -141,9 +141,13 @@ + ACPI_FUNCTION_TRACE ("ut_evaluate_object"); + + ++ info.node = prefix_node; ++ info.parameters = NULL; ++ info.parameter_type = ACPI_PARAM_ARGS; ++ + /* Evaluate the object/method */ + +- status = acpi_ns_evaluate_relative (prefix_node, path, NULL, &obj_desc); ++ status = acpi_ns_evaluate_relative (path, &info); + if (ACPI_FAILURE (status)) { + if (status == AE_NOT_FOUND) { + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s.%s] was not found\n", +@@ -159,7 +163,7 @@ + + /* Did we get a return object? */ + +- if (!obj_desc) { ++ if (!info.return_object) { + if (expected_return_btypes) { + ACPI_REPORT_METHOD_ERROR ("No object was returned from", + prefix_node, path, AE_NOT_EXIST); +@@ -172,7 +176,7 @@ + + /* Map the return object type to the bitmapped type */ + +- switch (ACPI_GET_OBJECT_TYPE (obj_desc)) { ++ switch (ACPI_GET_OBJECT_TYPE (info.return_object)) { + case ACPI_TYPE_INTEGER: + return_btype = ACPI_BTYPE_INTEGER; + break; +@@ -202,17 +206,17 @@ + + ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, + "Type returned from %s was incorrect: %X\n", +- path, ACPI_GET_OBJECT_TYPE (obj_desc))); ++ path, ACPI_GET_OBJECT_TYPE (info.return_object))); + + /* On error exit, we must delete the return object */ + +- acpi_ut_remove_reference (obj_desc); ++ acpi_ut_remove_reference (info.return_object); + return_ACPI_STATUS (AE_TYPE); + } + + /* Object type is OK, return it */ + +- *return_desc = obj_desc; ++ *return_desc = info.return_object; + return_ACPI_STATUS (AE_OK); + } + +diff -Nru a/drivers/acpi/utilities/utglobal.c b/drivers/acpi/utilities/utglobal.c +--- a/drivers/acpi/utilities/utglobal.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/utilities/utglobal.c 2004-09-21 21:26:34 +10:00 +@@ -171,27 +171,40 @@ + + const u8 acpi_gbl_decode_to8bit [8] = {1,2,4,8,16,32,64,128}; + +-const char *acpi_gbl_sleep_state_names[ACPI_S_STATE_COUNT] = { +- "\\_S0_", +- "\\_S1_", +- "\\_S2_", +- "\\_S3_", +- "\\_S4_", +- "\\_S5_"}; +- +-const char *acpi_gbl_highest_dstate_names[4] = { +- "_S1D", +- "_S2D", +- "_S3D", +- "_S4D"}; +- +-/* Strings supported by the _OSI predefined (internal) method */ +- +-const char *acpi_gbl_valid_osi_strings[ACPI_NUM_OSI_STRINGS] = { +- "Linux", +- "Windows 2000", +- "Windows 2001", +- "Windows 2001.1"}; ++const char *acpi_gbl_sleep_state_names[ACPI_S_STATE_COUNT] = ++{ ++ "\\_S0_", ++ "\\_S1_", ++ "\\_S2_", ++ "\\_S3_", ++ "\\_S4_", ++ "\\_S5_" ++}; ++ ++const char *acpi_gbl_highest_dstate_names[4] = ++{ ++ "_S1D", ++ "_S2D", ++ "_S3D", ++ "_S4D" ++}; ++ ++/* ++ * Strings supported by the _OSI predefined (internal) method. ++ * When adding strings, be sure to update ACPI_NUM_OSI_STRINGS. ++ */ ++const char *acpi_gbl_valid_osi_strings[ACPI_NUM_OSI_STRINGS] = ++{ ++ "Linux", ++ "Windows 2000", ++ "Windows 2001", ++ "Windows 2001.1", ++ "Windows 2001 SP0", ++ "Windows 2001 SP1", ++ "Windows 2001 SP2", ++ "Windows 2001 SP3", ++ "Windows 2001 SP4" ++}; + + + /****************************************************************************** +@@ -213,7 +226,7 @@ + {"_PR_", ACPI_TYPE_LOCAL_SCOPE, NULL}, + {"_SB_", ACPI_TYPE_DEVICE, NULL}, + {"_SI_", ACPI_TYPE_LOCAL_SCOPE, NULL}, +- {"_TZ_", ACPI_TYPE_LOCAL_SCOPE, NULL}, ++ {"_TZ_", ACPI_TYPE_THERMAL, NULL}, + {"_REV", ACPI_TYPE_INTEGER, "2"}, + {"_OS_", ACPI_TYPE_STRING, ACPI_OS_NAME}, + {"_GL_", ACPI_TYPE_MUTEX, "0"}, +@@ -561,26 +574,37 @@ + struct acpi_namespace_node *node = (struct acpi_namespace_node *) object; + + ++ /* Must return a string of exactly 4 characters == ACPI_NAME_SIZE */ ++ + if (!object) + { +- return ("NULL NODE"); ++ return ("NULL"); + } + +- if (object == ACPI_ROOT_OBJECT) ++ /* Check for Root node */ ++ ++ if ((object == ACPI_ROOT_OBJECT) || ++ (object == acpi_gbl_root_node)) + { +- node = acpi_gbl_root_node; ++ return ("\"\\\" "); + } + ++ /* Descriptor must be a namespace node */ ++ + if (node->descriptor != ACPI_DESC_TYPE_NAMED) + { +- return ("****"); ++ return ("####"); + } + ++ /* Name must be a valid ACPI name */ ++ + if (!acpi_ut_valid_acpi_name (* (u32 *) node->name.ascii)) + { +- return ("----"); ++ return ("????"); + } + ++ /* Return the name */ ++ + return (node->name.ascii); + } + +@@ -783,10 +807,6 @@ + + ACPI_FUNCTION_TRACE ("ut_init_globals"); + +- /* Runtime configuration */ +- +- acpi_gbl_create_osi_method = TRUE; +- acpi_gbl_all_methods_serialized = FALSE; + + /* Memory allocation and cache lists */ + +@@ -880,6 +900,7 @@ + /* Hardware oriented */ + + acpi_gbl_events_initialized = FALSE; ++ acpi_gbl_system_awake_and_running = TRUE; + + /* Namespace */ + +diff -Nru a/drivers/acpi/utilities/utxface.c b/drivers/acpi/utilities/utxface.c +--- a/drivers/acpi/utilities/utxface.c 2004-09-21 21:26:34 +10:00 ++++ b/drivers/acpi/utilities/utxface.c 2004-09-21 21:26:34 +10:00 +@@ -157,9 +157,8 @@ + } + } + +- /* +- * Enable ACPI mode +- */ ++ /* Enable ACPI mode */ ++ + if (!(flags & ACPI_NO_ACPI_ENABLE)) { + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Going into ACPI mode\n")); + +@@ -173,7 +172,21 @@ + } + + /* +- * Initialize ACPI Event handling ++ * Install the default op_region handlers. These are installed unless ++ * other handlers have already been installed via the ++ * install_address_space_handler interface. ++ */ ++ if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) { ++ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Installing default address space handlers\n")); ++ ++ status = acpi_ev_install_region_handlers (); ++ if (ACPI_FAILURE (status)) { ++ return_ACPI_STATUS (status); ++ } ++ } ++ ++ /* ++ * Initialize ACPI Event handling (Fixed and General Purpose) + * + * NOTE: We must have the hardware AND events initialized before we can execute + * ANY control methods SAFELY. Any control method can require ACPI hardware +@@ -182,18 +195,18 @@ + if (!(flags & ACPI_NO_EVENT_INIT)) { + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Initializing ACPI events\n")); + +- status = acpi_ev_initialize (); ++ status = acpi_ev_initialize_events (); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } + } + +- /* Install the SCI handler, Global Lock handler, and GPE handlers */ ++ /* Install the SCI handler and Global Lock handler */ + + if (!(flags & ACPI_NO_HANDLER_INIT)) { +- ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Installing SCI/GL/GPE handlers\n")); ++ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Installing SCI/GL handlers\n")); + +- status = acpi_ev_handler_initialize (); ++ status = acpi_ev_install_xrupt_handlers (); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } +@@ -226,18 +239,16 @@ + + + /* +- * Install the default op_region handlers. These are installed unless +- * other handlers have already been installed via the +- * install_address_space_handler interface. ++ * Run all _REG methods + * +- * NOTE: This will cause _REG methods to be run. Any objects accessed ++ * NOTE: Any objects accessed + * by the _REG methods will be automatically initialized, even if they + * contain executable AML (see call to acpi_ns_initialize_objects below). + */ + if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) { +- ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Installing default address space handlers\n")); ++ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Executing _REG op_region methods\n")); + +- status = acpi_ev_init_address_spaces (); ++ status = acpi_ev_initialize_op_regions (); + if (ACPI_FAILURE (status)) { + return_ACPI_STATUS (status); + } +@@ -249,7 +260,7 @@ + * objects: operation_regions, buffer_fields, Buffers, and Packages. + */ + if (!(flags & ACPI_NO_OBJECT_INIT)) { +- ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Initializing ACPI Objects\n")); ++ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Completing Initialization of ACPI Objects\n")); + + status = acpi_ns_initialize_objects (); + if (ACPI_FAILURE (status)) { +diff -Nru a/include/acpi/acconfig.h b/include/acpi/acconfig.h +--- a/include/acpi/acconfig.h 2004-09-21 21:26:34 +10:00 ++++ b/include/acpi/acconfig.h 2004-09-21 21:26:34 +10:00 +@@ -64,11 +64,21 @@ + + /* Version string */ + +-#define ACPI_CA_VERSION 0x20040326 ++#define ACPI_CA_VERSION 0x20040816 ++ ++/* ++ * OS name, used for the _OS object. The _OS object is essentially obsolete, ++ * but there is a large base of ASL/AML code in existing machines that check ++ * for the string below. The use of this string usually guarantees that ++ * the ASL will execute down the most tested code path. Also, there is some ++ * code that will not execute the _OSI method unless _OS matches the string ++ * below. Therefore, change this string at your own risk. ++ */ ++#define ACPI_OS_NAME "Microsoft Windows NT" + + /* Maximum objects in the various object caches */ + +-#define ACPI_MAX_STATE_CACHE_DEPTH 64 /* State objects for stacks */ ++#define ACPI_MAX_STATE_CACHE_DEPTH 64 /* State objects */ + #define ACPI_MAX_PARSE_CACHE_DEPTH 96 /* Parse tree objects */ + #define ACPI_MAX_EXTPARSE_CACHE_DEPTH 64 /* Parse tree objects */ + #define ACPI_MAX_OBJECT_CACHE_DEPTH 64 /* Interpreter operand objects */ +@@ -152,10 +162,11 @@ + + /* Constants used in searching for the RSDP in low memory */ + +-#define ACPI_LO_RSDP_WINDOW_BASE 0 /* Physical Address */ +-#define ACPI_HI_RSDP_WINDOW_BASE 0xE0000 /* Physical Address */ +-#define ACPI_LO_RSDP_WINDOW_SIZE 0x400 +-#define ACPI_HI_RSDP_WINDOW_SIZE 0x20000 ++#define ACPI_EBDA_PTR_LOCATION 0x0000040E /* Physical Address */ ++#define ACPI_EBDA_PTR_LENGTH 2 ++#define ACPI_EBDA_WINDOW_SIZE 1024 ++#define ACPI_HI_RSDP_WINDOW_BASE 0x000E0000 /* Physical Address */ ++#define ACPI_HI_RSDP_WINDOW_SIZE 0x00020000 + #define ACPI_RSDP_SCAN_STEP 16 + + /* Operation regions */ +@@ -187,7 +198,7 @@ + + /* Number of strings associated with the _OSI reserved method */ + +-#define ACPI_NUM_OSI_STRINGS 4 ++#define ACPI_NUM_OSI_STRINGS 9 + + + /****************************************************************************** +diff -Nru a/include/acpi/acdebug.h b/include/acpi/acdebug.h +--- a/include/acpi/acdebug.h 2004-09-21 21:26:34 +10:00 ++++ b/include/acpi/acdebug.h 2004-09-21 21:26:34 +10:00 +@@ -106,6 +106,10 @@ + * dbcmds - debug commands and output routines + */ + ++acpi_status ++acpi_db_disassemble_method ( ++ char *name); ++ + void + acpi_db_display_table_info ( + char *table_arg); +@@ -163,6 +167,10 @@ + void + acpi_db_set_scope ( + char *name); ++ ++acpi_status ++acpi_db_sleep ( ++ char *object_arg); + + void + acpi_db_find_references ( +diff -Nru a/include/acpi/acdisasm.h b/include/acpi/acdisasm.h +--- a/include/acpi/acdisasm.h 2004-09-21 21:26:34 +10:00 ++++ b/include/acpi/acdisasm.h 2004-09-21 21:26:34 +10:00 +@@ -52,6 +52,13 @@ + #define BLOCK_BRACE 2 + #define BLOCK_COMMA_LIST 4 + ++struct acpi_external_list ++{ ++ char *path; ++ struct acpi_external_list *next; ++}; ++ ++extern struct acpi_external_list *acpi_gbl_external_list; + extern const char *acpi_gbl_io_decode[2]; + extern const char *acpi_gbl_word_decode[4]; + extern const char *acpi_gbl_consume_decode[2]; +@@ -398,5 +405,13 @@ + u32 length, + u32 level); + ++ ++/* ++ * dmutils ++ */ ++ ++void ++acpi_dm_add_to_external_list ( ++ char *path); + + #endif /* __ACDISASM_H__ */ +diff -Nru a/include/acpi/acdispat.h b/include/acpi/acdispat.h +--- a/include/acpi/acdispat.h 2004-09-21 21:26:34 +10:00 ++++ b/include/acpi/acdispat.h 2004-09-21 21:26:34 +10:00 +@@ -437,8 +437,7 @@ + struct acpi_namespace_node *method_node, + u8 *aml_start, + u32 aml_length, +- union acpi_operand_object **params, +- union acpi_operand_object **return_obj_desc, ++ struct acpi_parameter_info *info, + u32 pass_number); + + acpi_status +diff -Nru a/include/acpi/acevents.h b/include/acpi/acevents.h +--- a/include/acpi/acevents.h 2004-09-21 21:26:34 +10:00 ++++ b/include/acpi/acevents.h 2004-09-21 21:26:34 +10:00 +@@ -46,11 +46,11 @@ + + + acpi_status +-acpi_ev_initialize ( ++acpi_ev_initialize_events ( + void); + + acpi_status +-acpi_ev_handler_initialize ( ++acpi_ev_install_xrupt_handlers ( + void); + + +@@ -111,12 +111,27 @@ + + acpi_status + acpi_ev_walk_gpe_list ( +- ACPI_GPE_CALLBACK gpe_walk_callback); ++ ACPI_GPE_CALLBACK gpe_walk_callback, ++ u32 flags); + + u8 + acpi_ev_valid_gpe_event ( + struct acpi_gpe_event_info *gpe_event_info); + ++acpi_status ++acpi_ev_update_gpe_enable_masks ( ++ struct acpi_gpe_event_info *gpe_event_info, ++ u8 type); ++ ++acpi_status ++acpi_ev_enable_gpe ( ++ struct acpi_gpe_event_info *gpe_event_info, ++ u8 write_to_hardware); ++ ++acpi_status ++acpi_ev_disable_gpe ( ++ struct acpi_gpe_event_info *gpe_event_info); ++ + struct acpi_gpe_event_info * + acpi_ev_get_gpe_event_info ( + acpi_handle gpe_device, +@@ -139,6 +154,11 @@ + acpi_ev_delete_gpe_block ( + struct acpi_gpe_block_info *gpe_block); + ++acpi_status ++acpi_ev_delete_gpe_handlers ( ++ struct acpi_gpe_xrupt_info *gpe_xrupt_info, ++ struct acpi_gpe_block_info *gpe_block); ++ + u32 + acpi_ev_gpe_dispatch ( + struct acpi_gpe_event_info *gpe_event_info, +@@ -148,12 +168,25 @@ + acpi_ev_gpe_detect ( + struct acpi_gpe_xrupt_info *gpe_xrupt_list); + ++acpi_status ++acpi_ev_set_gpe_type ( ++ struct acpi_gpe_event_info *gpe_event_info, ++ u8 type); ++ ++acpi_status ++acpi_ev_check_for_wake_only_gpe ( ++ struct acpi_gpe_event_info *gpe_event_info); ++ + /* + * Evregion - Address Space handling + */ + + acpi_status +-acpi_ev_init_address_spaces ( ++acpi_ev_install_region_handlers ( ++ void); ++ ++acpi_status ++acpi_ev_initialize_op_regions ( + void); + + acpi_status +@@ -181,6 +214,19 @@ + acpi_ev_detach_region ( + union acpi_operand_object *region_obj, + u8 acpi_ns_is_locked); ++ ++acpi_status ++acpi_ev_install_space_handler ( ++ struct acpi_namespace_node *node, ++ acpi_adr_space_type space_id, ++ acpi_adr_space_handler handler, ++ acpi_adr_space_setup setup, ++ void *context); ++ ++acpi_status ++acpi_ev_execute_reg_methods ( ++ struct acpi_namespace_node *node, ++ acpi_adr_space_type space_id); + + acpi_status + acpi_ev_execute_reg_method ( +diff -Nru a/include/acpi/acexcep.h b/include/acpi/acexcep.h +--- a/include/acpi/acexcep.h 2004-09-21 21:26:34 +10:00 ++++ b/include/acpi/acexcep.h 2004-09-21 21:26:34 +10:00 +@@ -95,8 +95,9 @@ + #define AE_LOGICAL_ADDRESS (acpi_status) (0x001B | AE_CODE_ENVIRONMENTAL) + #define AE_ABORT_METHOD (acpi_status) (0x001C | AE_CODE_ENVIRONMENTAL) + #define AE_SAME_HANDLER (acpi_status) (0x001D | AE_CODE_ENVIRONMENTAL) ++#define AE_WAKE_ONLY_GPE (acpi_status) (0x001E | AE_CODE_ENVIRONMENTAL) + +-#define AE_CODE_ENV_MAX 0x001D ++#define AE_CODE_ENV_MAX 0x001E + + /* + * Programmer exceptions +@@ -165,7 +166,7 @@ + #define AE_AML_CIRCULAR_REFERENCE (acpi_status) (0x0020 | AE_CODE_AML) + #define AE_AML_BAD_RESOURCE_LENGTH (acpi_status) (0x0021 | AE_CODE_AML) + +-#define AE_CODE_AML_MAX 0x0020 ++#define AE_CODE_AML_MAX 0x0021 + + /* + * Internal exceptions used for control +@@ -222,7 +223,8 @@ + "AE_NO_GLOBAL_LOCK", + "AE_LOGICAL_ADDRESS", + "AE_ABORT_METHOD", +- "AE_SAME_HANDLER" ++ "AE_SAME_HANDLER", ++ "AE_WAKE_ONLY_GPE" + }; + + char const *acpi_gbl_exception_names_pgm[] = +diff -Nru a/include/acpi/acglobal.h b/include/acpi/acglobal.h +--- a/include/acpi/acglobal.h 2004-09-21 21:26:34 +10:00 ++++ b/include/acpi/acglobal.h 2004-09-21 21:26:34 +10:00 +@@ -46,15 +46,17 @@ + + + /* +- * Ensure that the globals are actually defined only once. ++ * Ensure that the globals are actually defined and initialized only once. + * +- * The use of these defines allows a single list of globals (here) in order ++ * The use of these macros allows a single list of globals (here) in order + * to simplify maintenance of the code. + */ + #ifdef DEFINE_ACPI_GLOBALS + #define ACPI_EXTERN ++#define ACPI_INIT_GLOBAL(a,b) a=b + #else + #define ACPI_EXTERN extern ++#define ACPI_INIT_GLOBAL(a,b) a + #endif + + /* +@@ -64,6 +66,7 @@ + ACPI_EXTERN struct acpi_generic_address acpi_gbl_xpm1a_enable; + ACPI_EXTERN struct acpi_generic_address acpi_gbl_xpm1b_enable; + ++ + /***************************************************************************** + * + * Debug support +@@ -79,15 +82,42 @@ + + extern u32 acpi_gbl_nesting_level; + ++ + /***************************************************************************** + * +- * Runtime configuration ++ * Runtime configuration (static defaults that can be overriden at runtime) + * + ****************************************************************************/ + +-ACPI_EXTERN u8 acpi_gbl_create_osi_method; +-ACPI_EXTERN u8 acpi_gbl_all_methods_serialized; +-ACPI_EXTERN u8 acpi_gbl_leave_wake_gpes_disabled; ++/* ++ * Enable "slack" in the AML interpreter? Default is FALSE, and the ++ * interpreter strictly follows the ACPI specification. Setting to TRUE ++ * allows the interpreter to forgive certain bad AML constructs. ++ */ ++ACPI_EXTERN u8 ACPI_INIT_GLOBAL (acpi_gbl_enable_interpreter_slack, FALSE); ++ ++/* ++ * Automatically serialize ALL control methods? Default is FALSE, meaning ++ * to use the Serialized/not_serialized method flags on a per method basis. ++ * Only change this if the ASL code is poorly written and cannot handle ++ * reentrancy even though methods are marked "not_serialized". ++ */ ++ACPI_EXTERN u8 ACPI_INIT_GLOBAL (acpi_gbl_all_methods_serialized, FALSE); ++ ++/* ++ * Create the predefined _OSI method in the namespace? Default is TRUE ++ * because ACPI CA is fully compatible with other ACPI implementations. ++ * Changing this will revert ACPI CA (and machine ASL) to pre-OSI behavior. ++ */ ++ACPI_EXTERN u8 ACPI_INIT_GLOBAL (acpi_gbl_create_osi_method, TRUE); ++ ++/* ++ * Disable wakeup GPEs during runtime? Default is TRUE because WAKE and ++ * RUNTIME GPEs should never be shared, and WAKE GPEs should typically only ++ * be enabled just before going to sleep. ++ */ ++ACPI_EXTERN u8 ACPI_INIT_GLOBAL (acpi_gbl_leave_wake_gpes_disabled, TRUE); ++ + + /***************************************************************************** + * +@@ -102,7 +132,6 @@ + * + * These tables are single-table only; meaning that there can be at most one + * of each in the system. Each global points to the actual table. +- * + */ + ACPI_EXTERN u32 acpi_gbl_table_flags; + ACPI_EXTERN u32 acpi_gbl_rsdt_table_count; +@@ -170,6 +199,7 @@ + ACPI_EXTERN u8 acpi_gbl_acpi_hardware_present; + ACPI_EXTERN u8 acpi_gbl_global_lock_present; + ACPI_EXTERN u8 acpi_gbl_events_initialized; ++ACPI_EXTERN u8 acpi_gbl_system_awake_and_running; + + extern u8 acpi_gbl_shutdown; + extern u32 acpi_gbl_startup_flags; +diff -Nru a/include/acpi/achware.h b/include/acpi/achware.h +--- a/include/acpi/achware.h 2004-09-21 21:26:34 +10:00 ++++ b/include/acpi/achware.h 2004-09-21 21:26:34 +10:00 +@@ -114,15 +114,7 @@ + /* GPE support */ + + acpi_status +-acpi_hw_enable_gpe ( +- struct acpi_gpe_event_info *gpe_event_info); +- +-void +-acpi_hw_enable_gpe_for_wakeup ( +- struct acpi_gpe_event_info *gpe_event_info); +- +-acpi_status +-acpi_hw_disable_gpe ( ++acpi_hw_write_gpe_enable_reg ( + struct acpi_gpe_event_info *gpe_event_info); + + acpi_status +@@ -130,10 +122,6 @@ + struct acpi_gpe_xrupt_info *gpe_xrupt_info, + struct acpi_gpe_block_info *gpe_block); + +-void +-acpi_hw_disable_gpe_for_wakeup ( +- struct acpi_gpe_event_info *gpe_event_info); +- + acpi_status + acpi_hw_clear_gpe ( + struct acpi_gpe_event_info *gpe_event_info); +@@ -149,12 +137,26 @@ + acpi_event_status *event_status); + + acpi_status +-acpi_hw_prepare_gpes_for_sleep ( +- void); ++acpi_hw_disable_all_gpes ( ++ u32 flags); ++ ++acpi_status ++acpi_hw_enable_all_runtime_gpes ( ++ u32 flags); + + acpi_status +-acpi_hw_restore_gpes_on_wake ( +- void); ++acpi_hw_enable_all_wakeup_gpes ( ++ u32 flags); ++ ++acpi_status ++acpi_hw_enable_runtime_gpe_block ( ++ struct acpi_gpe_xrupt_info *gpe_xrupt_info, ++ struct acpi_gpe_block_info *gpe_block); ++ ++acpi_status ++acpi_hw_enable_wakeup_gpe_block ( ++ struct acpi_gpe_xrupt_info *gpe_xrupt_info, ++ struct acpi_gpe_block_info *gpe_block); + + + /* ACPI Timer prototypes */ +diff -Nru a/include/acpi/acinterp.h b/include/acpi/acinterp.h +--- a/include/acpi/acinterp.h 2004-09-21 21:26:34 +10:00 ++++ b/include/acpi/acinterp.h 2004-09-21 21:26:35 +10:00 +@@ -118,6 +118,12 @@ + */ + + acpi_status ++acpi_ex_common_buffer_setup ( ++ union acpi_operand_object *obj_desc, ++ u32 buffer_length, ++ u32 *datum_count); ++ ++acpi_status + acpi_ex_extract_from_field ( + union acpi_operand_object *obj_desc, + void *buffer, +@@ -240,8 +246,8 @@ + u8 + acpi_ex_do_logical_op ( + u16 opcode, +- acpi_integer operand0, +- acpi_integer operand1); ++ union acpi_operand_object *obj_desc, ++ union acpi_operand_object *obj_desc2); + + acpi_integer + acpi_ex_do_math_op ( +@@ -563,8 +569,11 @@ + acpi_ex_store_object_to_node ( + union acpi_operand_object *source_desc, + struct acpi_namespace_node *node, +- struct acpi_walk_state *walk_state); ++ struct acpi_walk_state *walk_state, ++ u8 implicit_conversion); + ++#define ACPI_IMPLICIT_CONVERSION TRUE ++#define ACPI_NO_IMPLICIT_CONVERSION FALSE + + /* + * exstoren +diff -Nru a/include/acpi/aclocal.h b/include/acpi/aclocal.h +--- a/include/acpi/aclocal.h 2004-09-21 21:26:34 +10:00 ++++ b/include/acpi/aclocal.h 2004-09-21 21:26:34 +10:00 +@@ -189,8 +189,6 @@ + u8 type; /* Type associated with this name */ + u16 owner_id; + union acpi_name_union name; /* ACPI Name, always 4 chars per ACPI spec */ +- +- + union acpi_operand_object *object; /* Pointer to attached ACPI object (optional) */ + struct acpi_namespace_node *child; /* First child */ + struct acpi_namespace_node *peer; /* Next peer*/ +@@ -211,10 +209,8 @@ + #define ANOBJ_METHOD_LOCAL 0x10 + #define ANOBJ_METHOD_NO_RETVAL 0x20 + #define ANOBJ_METHOD_SOME_NO_RETVAL 0x40 +- + #define ANOBJ_IS_BIT_OFFSET 0x80 + +- + /* + * ACPI Table Descriptor. One per ACPI table + */ +@@ -309,16 +305,31 @@ + * + ****************************************************************************/ + +-/* Information about a GPE, one per each GPE in an array */ ++/* Dispatch info for each GPE -- either a method or handler, cannot be both */ + +-struct acpi_gpe_event_info ++struct acpi_handler_info + { +- struct acpi_namespace_node *method_node; /* Method node for this GPE level */ +- acpi_gpe_handler handler; /* Address of handler, if any */ ++ acpi_event_handler address; /* Address of handler, if any */ + void *context; /* Context to be passed to handler */ ++ struct acpi_namespace_node *method_node; /* Method node for this GPE level (saved) */ ++}; ++ ++union acpi_gpe_dispatch_info ++{ ++ struct acpi_namespace_node *method_node; /* Method node for this GPE level */ ++ struct acpi_handler_info *handler; ++}; ++ ++/* ++ * Information about a GPE, one per each GPE in an array. ++ * NOTE: Important to keep this struct as small as possible. ++ */ ++struct acpi_gpe_event_info ++{ ++ union acpi_gpe_dispatch_info dispatch; /* Either Method or Handler */ + struct acpi_gpe_register_info *register_info; /* Backpointer to register info */ +- u8 flags; /* Level or Edge */ +- u8 bit_mask; /* This GPE within the register */ ++ u8 flags; /* Misc info about this GPE */ ++ u8 register_bit; /* This GPE bit within the register */ + }; + + /* Information about a GPE register pair, one per each status/enable pair in an array */ +@@ -327,9 +338,8 @@ + { + struct acpi_generic_address status_address; /* Address of status reg */ + struct acpi_generic_address enable_address; /* Address of enable reg */ +- u8 status; /* Current value of status reg */ +- u8 enable; /* Current value of enable reg */ +- u8 wake_enable; /* Mask of bits to keep enabled when sleeping */ ++ u8 enable_for_wake; /* GPEs to keep enabled when sleeping */ ++ u8 enable_for_run; /* GPEs to keep enabled when running */ + u8 base_gpe_number; /* Base GPE number for this register */ + }; + +@@ -339,6 +349,7 @@ + */ + struct acpi_gpe_block_info + { ++ struct acpi_namespace_node *node; + struct acpi_gpe_block_info *previous; + struct acpi_gpe_block_info *next; + struct acpi_gpe_xrupt_info *xrupt_block; /* Backpointer to interrupt block */ +@@ -502,7 +513,7 @@ + struct acpi_walk_state *walk_state_list; /* Head of list of walk_states for this thread */ + union acpi_operand_object *acquired_mutex_list; /* List of all currently acquired mutexes */ + u32 thread_id; /* Running thread ID */ +- u16 current_sync_level; /* Mutex Sync (nested acquire) level */ ++ u8 current_sync_level; /* Mutex Sync (nested acquire) level */ + }; + + +diff -Nru a/include/acpi/acmacros.h b/include/acpi/acmacros.h +--- a/include/acpi/acmacros.h 2004-09-21 21:26:34 +10:00 ++++ b/include/acpi/acmacros.h 2004-09-21 21:26:34 +10:00 +@@ -53,6 +53,9 @@ + #define ACPI_LOBYTE(l) ((u8)(u16)(l)) + #define ACPI_HIBYTE(l) ((u8)((((u16)(l)) >> 8) & 0xFF)) + ++#define ACPI_SET_BIT(target,bit) ((target) |= (bit)) ++#define ACPI_CLEAR_BIT(target,bit) ((target) &= ~(bit)) ++ + + #if ACPI_MACHINE_WIDTH == 16 + +@@ -97,7 +100,7 @@ + * printf() format helpers + */ + +-/* Split 64-bit integer into two 32-bit values. use with %8,8_x%8.8X */ ++/* Split 64-bit integer into two 32-bit values. Use with %8.8X%8.8X */ + + #define ACPI_FORMAT_UINT64(i) ACPI_HIDWORD(i),ACPI_LODWORD(i) + +@@ -360,24 +363,6 @@ + #define ACPI_MASK_BITS_BELOW(position) ((ACPI_INTEGER_MAX) << ((u32) (position))) + + #define ACPI_IS_OCTAL_DIGIT(d) (((char)(d) >= '0') && ((char)(d) <= '7')) +- +-/* Macros for GAS addressing */ +- +-#if ACPI_MACHINE_WIDTH != 16 +- +-#define ACPI_PCI_DEVICE(a) (u16) ((ACPI_HIDWORD ((a))) & 0x0000FFFF) +-#define ACPI_PCI_FUNCTION(a) (u16) ((ACPI_LODWORD ((a))) >> 16) +-#define ACPI_PCI_REGISTER(a) (u16) ((ACPI_LODWORD ((a))) & 0x0000FFFF) +- +-#else +- +-/* No support for GAS and PCI IDs in 16-bit mode */ +- +-#define ACPI_PCI_FUNCTION(a) (u16) ((a) & 0xFFFF0000) +-#define ACPI_PCI_DEVICE(a) (u16) ((a) & 0x0000FFFF) +-#define ACPI_PCI_REGISTER(a) (u16) ((a) & 0x0000FFFF) +- +-#endif + + + /* Bitfields within ACPI registers */ +diff -Nru a/include/acpi/acnamesp.h b/include/acpi/acnamesp.h +--- a/include/acpi/acnamesp.h 2004-09-21 21:26:34 +10:00 ++++ b/include/acpi/acnamesp.h 2004-09-21 21:26:34 +10:00 +@@ -278,33 +278,25 @@ + + acpi_status + acpi_ns_evaluate_by_handle ( +- struct acpi_namespace_node *prefix_node, +- union acpi_operand_object **params, +- union acpi_operand_object **return_object); ++ struct acpi_parameter_info *info); + + acpi_status + acpi_ns_evaluate_by_name ( + char *pathname, +- union acpi_operand_object **params, +- union acpi_operand_object **return_object); ++ struct acpi_parameter_info *info); + + acpi_status + acpi_ns_evaluate_relative ( +- struct acpi_namespace_node *prefix_node, + char *pathname, +- union acpi_operand_object **params, +- union acpi_operand_object **return_object); ++ struct acpi_parameter_info *info); + + acpi_status + acpi_ns_execute_control_method ( +- struct acpi_namespace_node *method_node, +- union acpi_operand_object **params, +- union acpi_operand_object **return_obj_desc); ++ struct acpi_parameter_info *info); + + acpi_status + acpi_ns_get_object_value ( +- struct acpi_namespace_node *object_node, +- union acpi_operand_object **return_obj_desc); ++ struct acpi_parameter_info *info); + + + /* +diff -Nru a/include/acpi/acobject.h b/include/acpi/acobject.h +--- a/include/acpi/acobject.h 2004-09-21 21:26:34 +10:00 ++++ b/include/acpi/acobject.h 2004-09-21 21:26:34 +10:00 +@@ -204,13 +204,14 @@ + struct acpi_object_mutex + { + ACPI_OBJECT_COMMON_HEADER +- u16 sync_level; +- u16 acquisition_depth; +- struct acpi_thread_state *owner_thread; +- void *semaphore; ++ u8 sync_level; /* 0-15, specified in Mutex() call */ ++ u16 acquisition_depth; /* Allow multiple Acquires, same thread */ ++ struct acpi_thread_state *owner_thread; /* Current owner of the mutex */ ++ void *semaphore; /* Actual OS synchronization object */ + union acpi_operand_object *prev; /* Link for list of acquired mutexes */ + union acpi_operand_object *next; /* Link for list of acquired mutexes */ +- struct acpi_namespace_node *node; /* containing object */ ++ struct acpi_namespace_node *node; /* Containing namespace node */ ++ u8 original_sync_level; /* Owner's original sync level (0-15) */ + }; + + +@@ -220,7 +221,7 @@ + + u8 space_id; + union acpi_operand_object *handler; /* Handler for region access */ +- struct acpi_namespace_node *node; /* containing object */ ++ struct acpi_namespace_node *node; /* Containing namespace node */ + union acpi_operand_object *next; + u32 length; + acpi_physical_address address; +diff -Nru a/include/acpi/acparser.h b/include/acpi/acparser.h +--- a/include/acpi/acparser.h 2004-09-21 21:26:34 +10:00 ++++ b/include/acpi/acparser.h 2004-09-21 21:26:34 +10:00 +@@ -73,9 +73,7 @@ + + acpi_status + acpi_psx_execute ( +- struct acpi_namespace_node *method_node, +- union acpi_operand_object **params, +- union acpi_operand_object **return_obj_desc); ++ struct acpi_parameter_info *info); + + + /****************************************************************************** +diff -Nru a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h +--- a/include/acpi/acpi_bus.h 2004-09-21 21:26:35 +10:00 ++++ b/include/acpi/acpi_bus.h 2004-09-21 21:26:35 +10:00 +@@ -157,7 +157,8 @@ + u32 suprise_removal_ok:1; + u32 power_manageable:1; + u32 performance_manageable:1; +- u32 reserved:21; ++ u32 wake_capable:1; /* Wakeup(_PRW) supported? */ ++ u32 reserved:20; + }; + + +@@ -203,10 +204,8 @@ + u32 explicit_get:1; /* _PSC present? */ + u32 power_resources:1; /* Power resources */ + u32 inrush_current:1; /* Serialize Dx->D0 */ +- u32 wake_capable:1; /* Wakeup supported? */ +- u32 wake_enabled:1; /* Enabled for wakeup */ + u32 power_removed:1; /* Optimize Dx->D0 */ +- u32 reserved:26; ++ u32 reserved:28; + }; + + struct acpi_device_power_state { +@@ -250,6 +249,25 @@ + struct acpi_device_perf_state *states; + }; + ++/* Wakeup Management */ ++struct acpi_device_wakeup_flags { ++ u8 valid:1; /* Can successfully enable wakeup? */ ++ u8 run_wake:1; /* Run-Wake GPE devices */ ++}; ++ ++struct acpi_device_wakeup_state { ++ u8 enabled:1; ++ u8 active:1; ++}; ++ ++struct acpi_device_wakeup { ++ acpi_handle gpe_device; ++ acpi_integer gpe_number;; ++ acpi_integer sleep_state; ++ struct acpi_handle_list resources; ++ struct acpi_device_wakeup_state state; ++ struct acpi_device_wakeup_flags flags; ++}; + + /* Device */ + +@@ -258,11 +276,13 @@ + struct acpi_device *parent; + struct list_head children; + struct list_head node; ++ struct list_head wakeup_list; + struct list_head g_list; + struct acpi_device_status status; + struct acpi_device_flags flags; + struct acpi_device_pnp pnp; + struct acpi_device_power power; ++ struct acpi_device_wakeup wakeup; + struct acpi_device_perf performance; + struct acpi_device_dir dir; + struct acpi_device_ops ops; +diff -Nru a/include/acpi/acpi_drivers.h b/include/acpi/acpi_drivers.h +--- a/include/acpi/acpi_drivers.h 2004-09-21 21:26:34 +10:00 ++++ b/include/acpi/acpi_drivers.h 2004-09-21 21:26:34 +10:00 +@@ -81,7 +81,8 @@ + -------------------------------------------------------------------------- */ + + #ifdef CONFIG_ACPI_POWER +- ++int acpi_enable_wakeup_device_power (struct acpi_device *dev); ++int acpi_disable_wakeup_device_power (struct acpi_device *dev); + int acpi_power_get_inferred_state (struct acpi_device *device); + int acpi_power_transition (struct acpi_device *device, int state); + #endif +diff -Nru a/include/acpi/acpiosxf.h b/include/acpi/acpiosxf.h +--- a/include/acpi/acpiosxf.h 2004-09-21 21:26:34 +10:00 ++++ b/include/acpi/acpiosxf.h 2004-09-21 21:26:34 +10:00 +@@ -189,13 +189,13 @@ + acpi_status + acpi_os_install_interrupt_handler ( + u32 gsi, +- OSD_HANDLER service_routine, ++ acpi_osd_handler service_routine, + void *context); + + acpi_status + acpi_os_remove_interrupt_handler ( +- u32 interrupt_number, +- OSD_HANDLER service_routine); ++ u32 gsi, ++ acpi_osd_handler service_routine); + + + /* +@@ -209,7 +209,7 @@ + acpi_status + acpi_os_queue_for_execution ( + u32 priority, +- OSD_EXECUTION_CALLBACK function, ++ acpi_osd_exec_callback function, + void *context); + + void +@@ -262,25 +262,28 @@ + + /* + * Platform and hardware-independent PCI configuration space access ++ * Note: Can't use "Register" as a parameter, changed to "Reg" -- ++ * certain compilers complain. + */ + + acpi_status + acpi_os_read_pci_configuration ( + struct acpi_pci_id *pci_id, +- u32 register, ++ u32 reg, + void *value, + u32 width); + + acpi_status + acpi_os_write_pci_configuration ( + struct acpi_pci_id *pci_id, +- u32 register, ++ u32 reg, + acpi_integer value, + u32 width); + + /* + * Interim function needed for PCI IRQ routing + */ ++ + void + acpi_os_derive_pci_id( + acpi_handle rhandle, +diff -Nru a/include/acpi/acpixf.h b/include/acpi/acpixf.h +--- a/include/acpi/acpixf.h 2004-09-21 21:26:34 +10:00 ++++ b/include/acpi/acpixf.h 2004-09-21 21:26:34 +10:00 +@@ -296,7 +296,7 @@ + acpi_handle gpe_device, + u32 gpe_number, + u32 type, +- acpi_gpe_handler handler, ++ acpi_event_handler address, + void *context); + + acpi_status +@@ -312,7 +312,7 @@ + acpi_remove_gpe_handler ( + acpi_handle gpe_device, + u32 gpe_number, +- acpi_gpe_handler handler); ++ acpi_event_handler address); + + acpi_status + acpi_enable_event ( +@@ -332,6 +332,12 @@ + acpi_get_event_status ( + u32 event, + acpi_event_status *event_status); ++ ++acpi_status ++acpi_set_gpe_type ( ++ acpi_handle gpe_device, ++ u32 gpe_number, ++ u8 type); + + acpi_status + acpi_enable_gpe ( +diff -Nru a/include/acpi/acstruct.h b/include/acpi/acstruct.h +--- a/include/acpi/acstruct.h 2004-09-21 21:26:34 +10:00 ++++ b/include/acpi/acstruct.h 2004-09-21 21:26:34 +10:00 +@@ -69,13 +69,14 @@ + struct acpi_walk_state + { + u8 data_type; /* To differentiate various internal objs MUST BE FIRST!*/\ ++ u8 walk_type; + acpi_owner_id owner_id; /* Owner of objects created during the walk */ + u8 last_predicate; /* Result of last predicate */ ++ u8 reserved; /* For alignment */ + u8 current_result; /* */ + u8 next_op_info; /* Info about next_op */ + u8 num_operands; /* Stack pointer for Operands[] array */ + u8 return_used; +- u8 walk_type; + u16 opcode; /* Current AML opcode */ + u8 scope_depth; + u8 reserved1; +@@ -91,7 +92,8 @@ + struct acpi_namespace_node arguments[ACPI_METHOD_NUM_ARGS]; /* Control method arguments */ + union acpi_operand_object **caller_return_desc; + union acpi_generic_state *control_state; /* List of control states (nested IFs) */ +- struct acpi_namespace_node *deferred_node; /* Used when executing deferred opcodes */ ++ struct acpi_namespace_node *deferred_node; /* Used when executing deferred opcodes */ ++ struct acpi_gpe_event_info *gpe_event_info; /* Info for GPE (_Lxx/_Exx methods only */ + struct acpi_namespace_node local_variables[ACPI_METHOD_NUM_LOCALS]; /* Control method locals */ + struct acpi_namespace_node *method_call_node; /* Called method Node*/ + union acpi_parse_object *method_call_op; /* method_call Op if running a method */ +@@ -198,6 +200,23 @@ + + } mid; + }; ++ ++ ++/* Internal method parameter list */ ++ ++struct acpi_parameter_info ++{ ++ struct acpi_namespace_node *node; ++ union acpi_operand_object **parameters; ++ union acpi_operand_object *return_object; ++ u8 parameter_type; ++ u8 return_object_type; ++}; ++ ++/* Types for parameter_type above */ ++ ++#define ACPI_PARAM_ARGS 0 ++#define ACPI_PARAM_GPE 1 + + + #endif +diff -Nru a/include/acpi/actbl.h b/include/acpi/actbl.h +--- a/include/acpi/actbl.h 2004-09-21 21:26:34 +10:00 ++++ b/include/acpi/actbl.h 2004-09-21 21:26:34 +10:00 +@@ -288,19 +288,6 @@ + }; + + +-/* +- * High performance timer +- */ +-struct hpet_table +-{ +- ACPI_TABLE_HEADER_DEF +- u32 hardware_id; +- u32 base_address [3]; +- u8 hpet_number; +- u16 clock_tick; +- u8 attributes; +-}; +- + #pragma pack() + + +@@ -343,5 +330,21 @@ + #include "actbl1.h" /* Acpi 1.0 table definitions */ + #include "actbl2.h" /* Acpi 2.0 table definitions */ + ++ ++#pragma pack(1) ++/* ++ * High performance timer ++ */ ++struct hpet_table ++{ ++ ACPI_TABLE_HEADER_DEF ++ u32 hardware_id; ++ struct acpi_generic_address base_address; ++ u8 hpet_number; ++ u16 clock_tick; ++ u8 attributes; ++}; ++ ++#pragma pack() + + #endif /* __ACTBL_H__ */ +diff -Nru a/include/acpi/actypes.h b/include/acpi/actypes.h +--- a/include/acpi/actypes.h 2004-09-21 21:26:34 +10:00 ++++ b/include/acpi/actypes.h 2004-09-21 21:26:34 +10:00 +@@ -557,34 +557,56 @@ + #define ACPI_GPE_MAX 0xFF + #define ACPI_NUM_GPE 256 + ++#define ACPI_GPE_ENABLE 0 ++#define ACPI_GPE_DISABLE 1 ++ ++ + /* + * GPE info flags - Per GPE +- * +---------+-+-+-+ +- * |Bits 8:3 |2|1|0| +- * +---------+-+-+-+ +- * | | | | +- * | | | +- Edge or Level Triggered +- * | | +--- Type: Wake or Runtime +- * | +----- Enabled for wake? +- * +-------- +- */ +-#define ACPI_GPE_XRUPT_TYPE_MASK (u8) 1 +-#define ACPI_GPE_LEVEL_TRIGGERED (u8) 1 +-#define ACPI_GPE_EDGE_TRIGGERED (u8) 0 +- +-#define ACPI_GPE_TYPE_MASK (u8) 2 +-#define ACPI_GPE_TYPE_WAKE (u8) 2 +-#define ACPI_GPE_TYPE_RUNTIME (u8) 0 /* Default */ +- +-#define ACPI_GPE_ENABLE_MASK (u8) 4 +-#define ACPI_GPE_ENABLED (u8) 4 +-#define ACPI_GPE_DISABLED (u8) 0 /* Default */ ++ * +-+-+-+---+---+-+ ++ * |7|6|5|4:3|2:1|0| ++ * +-+-+-+---+---+-+ ++ * | | | | | | ++ * | | | | | +--- Interrupt type: Edge or Level Triggered ++ * | | | | +--- Type: Wake-only, Runtime-only, or wake/runtime ++ * | | | +--- Type of dispatch -- to method, handler, or none ++ * | | +--- Enabled for runtime? ++ * | +--- Enabled for wake? ++ * +--- System state when GPE ocurred (running/waking) ++ */ ++#define ACPI_GPE_XRUPT_TYPE_MASK (u8) 0x01 ++#define ACPI_GPE_LEVEL_TRIGGERED (u8) 0x01 ++#define ACPI_GPE_EDGE_TRIGGERED (u8) 0x00 ++ ++#define ACPI_GPE_TYPE_MASK (u8) 0x06 ++#define ACPI_GPE_TYPE_WAKE_RUN (u8) 0x06 ++#define ACPI_GPE_TYPE_WAKE (u8) 0x02 ++#define ACPI_GPE_TYPE_RUNTIME (u8) 0x04 /* Default */ ++ ++#define ACPI_GPE_DISPATCH_MASK (u8) 0x18 ++#define ACPI_GPE_DISPATCH_HANDLER (u8) 0x08 ++#define ACPI_GPE_DISPATCH_METHOD (u8) 0x10 ++#define ACPI_GPE_DISPATCH_NOT_USED (u8) 0x00 /* Default */ ++ ++#define ACPI_GPE_RUN_ENABLE_MASK (u8) 0x20 ++#define ACPI_GPE_RUN_ENABLED (u8) 0x20 ++#define ACPI_GPE_RUN_DISABLED (u8) 0x00 /* Default */ ++ ++#define ACPI_GPE_WAKE_ENABLE_MASK (u8) 0x40 ++#define ACPI_GPE_WAKE_ENABLED (u8) 0x40 ++#define ACPI_GPE_WAKE_DISABLED (u8) 0x00 /* Default */ ++ ++#define ACPI_GPE_ENABLE_MASK (u8) 0x60 /* Both run/wake */ ++ ++#define ACPI_GPE_SYSTEM_MASK (u8) 0x80 ++#define ACPI_GPE_SYSTEM_RUNNING (u8) 0x80 ++#define ACPI_GPE_SYSTEM_WAKING (u8) 0x00 + + /* + * Flags for GPE and Lock interfaces + */ +-#define ACPI_EVENT_WAKE_ENABLE 0x2 +-#define ACPI_EVENT_WAKE_DISABLE 0x2 ++#define ACPI_EVENT_WAKE_ENABLE 0x2 /* acpi_gpe_enable */ ++#define ACPI_EVENT_WAKE_DISABLE 0x2 /* acpi_gpe_disable */ + + #define ACPI_NOT_ISR 0x1 + #define ACPI_ISR 0x0 +@@ -592,9 +614,10 @@ + + /* Notify types */ + +-#define ACPI_SYSTEM_NOTIFY 0 +-#define ACPI_DEVICE_NOTIFY 1 +-#define ACPI_MAX_NOTIFY_HANDLER_TYPE 1 ++#define ACPI_SYSTEM_NOTIFY 0x1 ++#define ACPI_DEVICE_NOTIFY 0x2 ++#define ACPI_ALL_NOTIFY 0x3 ++#define ACPI_MAX_NOTIFY_HANDLER_TYPE 0x3 + + #define ACPI_MAX_SYS_NOTIFY 0x7f + +@@ -775,11 +798,11 @@ + */ + + typedef u32 +-(ACPI_SYSTEM_XFACE *OSD_HANDLER) ( ++(ACPI_SYSTEM_XFACE *acpi_osd_handler) ( + void *context); + + typedef void +-(ACPI_SYSTEM_XFACE *OSD_EXECUTION_CALLBACK) ( ++(ACPI_SYSTEM_XFACE *acpi_osd_exec_callback) ( + void *context); + + /* +@@ -790,10 +813,6 @@ + void *context); + + typedef +-void (*acpi_gpe_handler) ( +- void *context); +- +-typedef + void (*acpi_notify_handler) ( + acpi_handle device, + u32 value, +@@ -880,6 +899,7 @@ + #define ACPI_VALID_HID 0x0004 + #define ACPI_VALID_UID 0x0008 + #define ACPI_VALID_CID 0x0010 ++#define ACPI_VALID_SXDS 0x0020 + + + #define ACPI_COMMON_OBJ_INFO \ +@@ -899,12 +919,12 @@ + { + ACPI_COMMON_OBJ_INFO; + +- u8 highest_dstates[4]; /* _sx_d values 0xFF indicates not valid */ + u32 valid; /* Indicates which fields below are valid */ + u32 current_status; /* _STA value */ + acpi_integer address; /* _ADR value if any */ + struct acpi_device_id hardware_id; /* _HID value if any */ + struct acpi_device_id unique_id; /* _UID value if any */ ++ u8 highest_dstates[4]; /* _sx_d values: 0xFF indicates not valid */ + struct acpi_compatible_id_list compatibility_id; /* List of _CIDs if any */ + }; + +diff -Nru a/include/acpi/platform/acenv.h b/include/acpi/platform/acenv.h +--- a/include/acpi/platform/acenv.h 2004-09-21 21:26:34 +10:00 ++++ b/include/acpi/platform/acenv.h 2004-09-21 21:26:34 +10:00 +@@ -152,12 +152,8 @@ + #define COMPILER_DEPENDENT_INT64 long long + #define COMPILER_DEPENDENT_UINT64 unsigned long long + +- +-/* Name of host operating system (returned by the _OS_ namespace object) */ +- +-#define ACPI_OS_NAME "Intel ACPI/CA Core Subsystem" +- +-/* This macro is used to tag functions as "printf-like" because ++/* ++ * This macro is used to tag functions as "printf-like" because + * some compilers can catch printf format string problems. MSVC + * doesn't, so this is proprocessed away. + */ +diff -Nru a/include/acpi/platform/aclinux.h b/include/acpi/platform/aclinux.h +--- a/include/acpi/platform/aclinux.h 2004-09-21 21:26:34 +10:00 ++++ b/include/acpi/platform/aclinux.h 2004-09-21 21:26:34 +10:00 +@@ -44,8 +44,6 @@ + #ifndef __ACLINUX_H__ + #define __ACLINUX_H__ + +-#define ACPI_OS_NAME "Linux" +- + #define ACPI_USE_SYSTEM_CLIBRARY + #define ACPI_USE_DO_WHILE_0 + +diff -Nru a/include/asm-i386/acpi.h b/include/asm-i386/acpi.h +--- a/include/asm-i386/acpi.h 2004-09-21 21:26:34 +10:00 ++++ b/include/asm-i386/acpi.h 2004-09-21 21:26:34 +10:00 +@@ -102,6 +102,12 @@ + :"0"(n_hi), "1"(n_lo)) + + ++/* ++ * Refer Intel ACPI _PDC support document for bit definitions ++ */ ++#define ACPI_PDC_EST_CAPABILITY_SMP 0xa ++#define ACPI_PDC_EST_CAPABILITY_MSR 0x1 ++ + #ifdef CONFIG_ACPI_BOOT + extern int acpi_lapic; + extern int acpi_ioapic; +@@ -177,6 +183,8 @@ + extern void acpi_reserve_bootmem(void); + + #endif /*CONFIG_ACPI_SLEEP*/ ++ ++extern u8 x86_acpiid_to_apicid[]; + + #endif /*__KERNEL__*/ + +diff -Nru a/include/asm-i386/smp.h b/include/asm-i386/smp.h +--- a/include/asm-i386/smp.h 2004-09-21 21:26:34 +10:00 ++++ b/include/asm-i386/smp.h 2004-09-21 21:26:34 +10:00 +@@ -43,6 +43,7 @@ + extern void zap_low_mappings (void); + + #define MAX_APICID 256 ++extern u8 x86_cpu_to_apicid[]; + + /* + * This function is needed by all SMP systems. It must _always_ be valid +diff -Nru a/include/asm-ia64/acpi.h b/include/asm-ia64/acpi.h +--- a/include/asm-ia64/acpi.h 2004-09-21 21:26:34 +10:00 ++++ b/include/asm-ia64/acpi.h 2004-09-21 21:26:34 +10:00 +@@ -89,6 +89,7 @@ + ((Acq) = ia64_acpi_release_global_lock((unsigned int *) GLptr)) + + #define acpi_disabled 0 /* ACPI always enabled on IA64 */ ++#define acpi_noirq 0 /* ACPI always enabled on IA64 */ + #define acpi_pci_disabled 0 /* ACPI PCI always enabled on IA64 */ + #define acpi_strict 1 /* no ACPI spec workarounds on IA64 */ + static inline void disable_acpi(void) { } +@@ -104,6 +105,8 @@ + extern int __initdata pxm_to_nid_map[MAX_PXM_DOMAINS]; + extern int __initdata nid_to_pxm_map[MAX_NUMNODES]; + #endif ++ ++extern u16 ia64_acpiid_to_sapicid[]; + + #endif /*__KERNEL__*/ + +diff -Nru a/include/asm-x86_64/acpi.h b/include/asm-x86_64/acpi.h +--- a/include/asm-x86_64/acpi.h 2004-09-21 21:26:34 +10:00 ++++ b/include/asm-x86_64/acpi.h 2004-09-21 21:26:34 +10:00 +@@ -159,6 +159,8 @@ + extern int acpi_disabled; + extern int acpi_pci_disabled; + ++extern u8 x86_acpiid_to_apicid[]; ++ + #endif /*__KERNEL__*/ + + #endif /*_ASM_ACPI_H*/ +diff -Nru a/init/main.c b/init/main.c +--- a/init/main.c 2004-09-21 21:26:34 +10:00 ++++ b/init/main.c 2004-09-21 21:26:34 +10:00 +@@ -93,6 +93,11 @@ + extern void populate_rootfs(void); + extern void driver_init(void); + extern void prepare_namespace(void); ++#ifdef CONFIG_ACPI ++extern void acpi_early_init(void); ++#else ++static inline void acpi_early_init(void) { } ++#endif + + #ifdef CONFIG_TC + extern void tc_init(void); +@@ -529,6 +534,8 @@ + proc_root_init(); + #endif + check_bugs(); ++ ++ acpi_early_init(); /* before LAPIC and SMP init */ + + /* + * We count on the initial thread going ok --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/net-ipv6-ip6flowlabel_CVE-2005-3806.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/net-ipv6-ip6flowlabel_CVE-2005-3806.dpatch @@ -0,0 +1,21 @@ +#! /bin/sh -e +## net-ipv6-ip6flowlabel_CVE-2005-3806.dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: No description. + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urNad linux-source-2.6.12-2.6.12~/net/ipv6/ip6_flowlabel.c linux-source-2.6.12-2.6.12/net/ipv6/ip6_flowlabel.c +--- linux-source-2.6.12-2.6.12~/net/ipv6/ip6_flowlabel.c 2005-06-17 21:48:29.000000000 +0200 ++++ linux-source-2.6.12-2.6.12/net/ipv6/ip6_flowlabel.c 2005-12-20 11:54:03.000000000 +0100 +@@ -480,7 +480,7 @@ + goto done; + } + fl1 = sfl->fl; +- atomic_inc(&fl->users); ++ atomic_inc(&fl1->users); + break; + } + } --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/stolen-from-head_CAN-2005-3107.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/stolen-from-head_CAN-2005-3107.dpatch @@ -0,0 +1,52 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: +## DP: Patch author: +## DP: Upstream status: backport + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -Narud linux-source-2.6.8.1-2.6.8.1.old/fs/exec.c linux-source-2.6.8.1-2.6.8.1/fs/exec.c +--- linux-source-2.6.8.1-2.6.8.1.old/fs/exec.c 2005-10-09 12:14:48.000000000 +0200 ++++ linux-source-2.6.8.1-2.6.8.1/fs/exec.c 2005-10-09 12:15:35.000000000 +0200 +@@ -1328,6 +1328,7 @@ + struct task_struct *g, *p; + struct task_struct *tsk = current; + struct completion *vfork_done = tsk->vfork_done; ++ int traced = 0; + + /* + * Make sure nobody is waiting for us to release the VM, +@@ -1343,10 +1344,29 @@ + if (mm == p->mm && p != tsk) { + force_sig_specific(SIGKILL, p); + mm->core_waiters++; ++ if (unlikely(p->ptrace) && ++ unlikely(p->parent->mm == mm)) ++ traced = 1; + } + while_each_thread(g,p); + + read_unlock(&tasklist_lock); ++ if (unlikely(traced)) { ++ /* ++ * We are zapping a thread and the thread it ptraces. ++ * If the tracee went into a ptrace stop for exit tracing, ++ * we could deadlock since the tracer is waiting for this ++ * coredump to finish. Detach them so they can both die. ++ */ ++ write_lock_irq(&tasklist_lock); ++ do_each_thread(g,p) { ++ if (mm == p->mm && p != tsk && ++ p->ptrace && p->parent->mm == mm) { ++ __ptrace_unlink(p); ++ } ++ } while_each_thread(g,p); ++ write_unlock_irq(&tasklist_lock); ++ } + } + + static void coredump_wait(struct mm_struct *mm) --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/acpi-early-init-check-disable.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/acpi-early-init-check-disable.dpatch @@ -0,0 +1,24 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Disable acpi_early_init when acpi=off is set. +## DP: Patch author: Herbert Xu +## DP: Upstream status: unknown + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN x/drivers/acpi/bus.c y/drivers/acpi/bus.c +--- x/drivers/acpi/bus.c 2004-10-04 21:21:34.000000000 +1000 ++++ y/drivers/acpi/bus.c 2004-10-04 21:21:41.000000000 +1000 +@@ -598,6 +598,9 @@ + + ACPI_FUNCTION_TRACE("acpi_bus_init"); + ++ if (acpi_disabled) ++ return; ++ + /* enable workarounds, unless strict ACPI spec. compliance */ + if (!acpi_strict) + acpi_gbl_enable_interpreter_slack = TRUE; --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/acpi-early.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/acpi-early.dpatch @@ -0,0 +1,234 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Enter ACPI mode earlier +## DP: Patch author: Len Brown +## DP: Upstream status: backport + +. $(dirname $0)/DPATCH + +@DPATCH@ +# This is a BitKeeper generated diff -Nru style patch. +# +# ChangeSet +# 2004/08/14 01:11:05-04:00 len.brown@intel.com +# [ACPI] Enter ACPI mode earlier +# Fixes two common boot failures due to buggy SMM BIOS code +# +# SMP boot crash if SMI_CMD=ACPI written from CPU1 +# http://bugzilla.kernel.org/show_bug.cgi?id=2941 +# +# laptop crash due to LAPIC timer before SMI_CMD=ACPI +# http://bugzilla.kernel.org/show_bug.cgi?id=1269 +# +# arch/i386/kernel/dmi_scan.c +# 2004/08/14 01:10:58-04:00 len.brown@intel.com +0 -44 +# delete local_apic_kills_bios() +# +# drivers/acpi/bus.c +# 2004/08/14 01:10:58-04:00 len.brown@intel.com +32 -6 +# add acpi_early_init() +# +# drivers/acpi/osl.c +# 2004/08/14 01:10:58-04:00 len.brown@intel.com +10 -0 +# defer acpi_os_initialize() to acpi_os_initialize1() +# +# init/main.c +# 2004/08/14 01:10:59-04:00 len.brown@intel.com +7 -0 +# acpi_early_init() +# +diff -Nru a/arch/i386/kernel/dmi_scan.c b/arch/i386/kernel/dmi_scan.c +--- a/arch/i386/kernel/dmi_scan.c 2004-08-19 12:35:05 -07:00 ++++ b/arch/i386/kernel/dmi_scan.c 2004-08-19 12:35:05 -07:00 +@@ -162,26 +162,6 @@ + #define NO_MATCH { DMI_NONE, NULL} + #define MATCH DMI_MATCH + +-/* +- * Some machines, usually laptops, can't handle an enabled local APIC. +- * The symptoms include hangs or reboots when suspending or resuming, +- * attaching or detaching the power cord, or entering BIOS setup screens +- * through magic key sequences. +- */ +-static int __init local_apic_kills_bios(struct dmi_blacklist *d) +-{ +-#ifdef CONFIG_X86_LOCAL_APIC +- extern int enable_local_apic; +- if (enable_local_apic == 0) { +- enable_local_apic = -1; +- printk(KERN_WARNING "%s with broken BIOS detected. " +- "Refusing to enable the local APIC.\n", +- d->ident); +- } +-#endif +- return 0; +-} +- + + /* + * Toshiba keyboard likes to repeat keys when they are not repeated. +@@ -793,30 +773,6 @@ + } }, + + /* Machines which have problems handling enabled local APICs */ +- +- { local_apic_kills_bios, "Dell Inspiron", { +- MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"), +- MATCH(DMI_PRODUCT_NAME, "Inspiron"), +- NO_MATCH, NO_MATCH +- } }, +- +- { local_apic_kills_bios, "Dell Latitude", { +- MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"), +- MATCH(DMI_PRODUCT_NAME, "Latitude"), +- NO_MATCH, NO_MATCH +- } }, +- +- { local_apic_kills_bios, "IBM Thinkpad T20", { +- MATCH(DMI_BOARD_VENDOR, "IBM"), +- MATCH(DMI_BOARD_NAME, "264741U"), +- NO_MATCH, NO_MATCH +- } }, +- +- { local_apic_kills_bios, "ASUS L3C", { +- MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), +- MATCH(DMI_BOARD_NAME, "P4_L3C"), +- NO_MATCH, NO_MATCH +- } }, + + { broken_acpi_Sx, "ASUS K7V-RM", { /* Bad ACPI Sx table */ + MATCH(DMI_BIOS_VERSION,"ASUS K7V-RM ACPI BIOS Revision 1003A"), +diff -Nru a/drivers/acpi/bus.c b/drivers/acpi/bus.c +--- a/drivers/acpi/bus.c 2004-08-19 12:35:05 -07:00 ++++ b/drivers/acpi/bus.c 2004-08-19 12:35:05 -07:00 +@@ -590,10 +590,9 @@ + } + + +-static int __init +-acpi_bus_init (void) ++void __init ++acpi_early_init (void) + { +- int result = 0; + acpi_status status = AE_OK; + struct acpi_buffer buffer = {sizeof(acpi_fadt), &acpi_fadt}; + +@@ -617,7 +616,7 @@ + status = acpi_get_table(ACPI_TABLE_FADT, 1, &buffer); + if (ACPI_FAILURE(status)) { + printk(KERN_ERR PREFIX "Unable to get the FADT\n"); +- goto error1; ++ goto error0; + } + + #ifdef CONFIG_X86 +@@ -640,12 +639,40 @@ + } + #endif + +- status = acpi_enable_subsystem(ACPI_FULL_INITIALIZATION); ++ status = acpi_enable_subsystem(~(ACPI_NO_HARDWARE_INIT | ACPI_NO_ACPI_ENABLE)); ++ if (ACPI_FAILURE(status)) { ++ printk(KERN_ERR PREFIX "Unable to enable ACPI\n"); ++ goto error0; ++ } ++ ++ return; ++ ++error0: ++ disable_acpi(); ++ return; ++} ++ ++static int __init ++acpi_bus_init (void) ++{ ++ int result = 0; ++ acpi_status status = AE_OK; ++ extern acpi_status acpi_os_initialize1(void); ++ ++ ACPI_FUNCTION_TRACE("acpi_bus_init"); ++ ++ status = acpi_os_initialize1(); ++ ++ status = acpi_enable_subsystem(ACPI_NO_HARDWARE_INIT | ACPI_NO_ACPI_ENABLE); + if (ACPI_FAILURE(status)) { + printk(KERN_ERR PREFIX "Unable to start the ACPI Interpreter\n"); + goto error1; + } + ++ if (ACPI_FAILURE(status)) { ++ printk(KERN_ERR PREFIX "Unable to initialize ACPI OS objects\n"); ++ goto error1; ++ } + #ifdef CONFIG_ACPI_EC + /* + * ACPI 2.0 requires the EC driver to be loaded and work before +@@ -693,7 +720,6 @@ + /* Mimic structured exception handling */ + error1: + acpi_terminate(); +-error0: + return_VALUE(-ENODEV); + } + +diff -Nru a/drivers/acpi/osl.c b/drivers/acpi/osl.c +--- a/drivers/acpi/osl.c 2004-08-19 12:35:05 -07:00 ++++ b/drivers/acpi/osl.c 2004-08-19 12:35:05 -07:00 +@@ -71,6 +71,12 @@ + acpi_status + acpi_os_initialize(void) + { ++ return AE_OK; ++} ++ ++acpi_status ++acpi_os_initialize1(void) ++{ + /* + * Initialize PCI configuration space access, as we'll need to access + * it while walking the namespace (bus 0 and root bridges w/ _BBNs). +@@ -470,6 +476,8 @@ + return AE_ERROR; + } + ++ BUG_ON(!raw_pci_ops); ++ + result = raw_pci_ops->read(pci_id->segment, pci_id->bus, + PCI_DEVFN(pci_id->device, pci_id->function), + reg, size, value); +@@ -495,6 +503,8 @@ + default: + return AE_ERROR; + } ++ ++ BUG_ON(!raw_pci_ops); + + result = raw_pci_ops->write(pci_id->segment, pci_id->bus, + PCI_DEVFN(pci_id->device, pci_id->function), +diff -Nru a/init/main.c b/init/main.c +--- a/init/main.c 2004-08-19 12:35:05 -07:00 ++++ b/init/main.c 2004-08-19 12:35:05 -07:00 +@@ -91,6 +91,11 @@ + extern void populate_rootfs(void); + extern void driver_init(void); + extern void prepare_namespace(void); ++#ifdef CONFIG_ACPI ++extern void acpi_early_init(void); ++#else ++static inline void acpi_early_init(void) { } ++#endif + + #ifdef CONFIG_TC + extern void tc_init(void); +@@ -481,6 +486,8 @@ + proc_root_init(); + #endif + check_bugs(); ++ ++ acpi_early_init(); /* before LAPIC and SMP init */ + + /* + * We count on the initial thread going ok --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/acpi-osname.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/acpi-osname.dpatch @@ -0,0 +1,23 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: claim we're windows to ACPI to work around broken BIOSes +## DP: Patch author: unknown +## DP: Upstream status: backport + +. $(dirname $0)/DPATCH + +@DPATCH@ +--- linux/include/acpi/platform/aclinux.h~ 2004-08-18 21:35:34.433788552 +0200 ++++ linux/include/acpi/platform/aclinux.h 2004-08-18 21:35:59.580965600 +0200 +@@ -44,7 +44,8 @@ + #ifndef __ACLINUX_H__ + #define __ACLINUX_H__ + +-#define ACPI_OS_NAME "Linux" ++/* Microsoft, Microsoft Windows, Microsoft Windows NT are trademarks of Microsoft Corp. */ ++#define ACPI_OS_NAME "Microsoft Windows NT" + + #define ACPI_USE_SYSTEM_CLIBRARY + #define ACPI_USE_DO_WHILE_0 --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/stolen-from-head_CAN-2005-3108.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/stolen-from-head_CAN-2005-3108.dpatch @@ -0,0 +1,89 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: +## DP: Patch author: +## DP: Upstream status: backport + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -Narud linux-source-2.6.8.1-2.6.8.1.old/arch/x86_64/mm/ioremap.c linux-source-2.6.8.1-2.6.8.1/arch/x86_64/mm/ioremap.c +--- linux-source-2.6.8.1-2.6.8.1.old/arch/x86_64/mm/ioremap.c 2004-08-24 09:19:21.000000000 +0200 ++++ linux-source-2.6.8.1-2.6.8.1/arch/x86_64/mm/ioremap.c 2005-10-09 12:19:02.000000000 +0200 +@@ -224,7 +224,8 @@ + } + + if (p->flags && p->phys_addr < virt_to_phys(high_memory)) { +- change_page_attr(virt_to_page(__va(p->phys_addr)), ++ /* p->size includes the guard page, but cpa doesn't like that */ ++ change_page_attr_addr((unsigned long)__va(p->phys_addr), + p->size >> PAGE_SHIFT, + PAGE_KERNEL); + global_flush_tlb(); +diff -Narud linux-source-2.6.8.1-2.6.8.1.old/arch/x86_64/mm/pageattr.c linux-source-2.6.8.1-2.6.8.1/arch/x86_64/mm/pageattr.c +--- linux-source-2.6.8.1-2.6.8.1.old/arch/x86_64/mm/pageattr.c 2004-08-24 09:17:15.000000000 +0200 ++++ linux-source-2.6.8.1-2.6.8.1/arch/x86_64/mm/pageattr.c 2005-10-09 12:19:02.000000000 +0200 +@@ -162,31 +162,40 @@ + * + * Caller must call global_flush_tlb() after this. + */ +-int change_page_attr(struct page *page, int numpages, pgprot_t prot) ++int change_page_attr_addr(unsigned long address, int numpages, pgprot_t prot) + { + int err = 0; + int i; + + down_write(&init_mm.mmap_sem); +- for (i = 0; i < numpages; !err && i++, page++) { +- unsigned long address = (unsigned long)page_address(page); +- err = __change_page_attr(address, page, prot, PAGE_KERNEL); ++ for (i = 0; i < numpages; i++, address += PAGE_SIZE) { ++ unsigned long pfn = __pa(address) >> PAGE_SHIFT; ++ ++ err = __change_page_attr(address, pfn, prot, PAGE_KERNEL); + if (err) + break; + /* Handle kernel mapping too which aliases part of the + * lowmem */ +- /* Disabled right now. Fixme */ +- if (0 && page_to_phys(page) < KERNEL_TEXT_SIZE) { ++ if (__pa(address) < KERNEL_TEXT_SIZE) { + unsigned long addr2; +- addr2 = __START_KERNEL_map + page_to_phys(page); +- err = __change_page_attr(addr2, page, prot, +- PAGE_KERNEL_EXEC); +- } +- } ++ pgprot_t prot2 = prot; ++ addr2 = __START_KERNEL_map + __pa(address); ++ pgprot_val(prot2) &= ~_PAGE_NX; ++ err = __change_page_attr(addr2, pfn, prot2, PAGE_KERNEL_EXEC); ++ } ++ } + up_write(&init_mm.mmap_sem); + return err; + } + ++ ++/* Don't call this for MMIO areas that may not have a mem_map entry */ ++int change_page_attr(struct page *page, int numpages, pgprot_t prot) ++{ ++ unsigned long addr = (unsigned long)page_address(page); ++ return change_page_attr_addr(addr, numpages, prot); ++} ++ + void global_flush_tlb(void) + { + struct deferred_page *df, *next_df; +diff -Narud linux-source-2.6.8.1-2.6.8.1.old/include/asm-x86_64/cacheflush.h linux-source-2.6.8.1-2.6.8.1/include/asm-x86_64/cacheflush.h +--- linux-source-2.6.8.1-2.6.8.1.old/include/asm-x86_64/cacheflush.h 2004-08-24 09:16:08.000000000 +0200 ++++ linux-source-2.6.8.1-2.6.8.1/include/asm-x86_64/cacheflush.h 2005-10-09 12:19:02.000000000 +0200 +@@ -25,5 +25,6 @@ + + void global_flush_tlb(void); + int change_page_attr(struct page *page, int numpages, pgprot_t prot); ++int change_page_attr_addr(unsigned long addr, int numpages, pgprot_t prot); + + #endif /* _X8664_CACHEFLUSH_H */ --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/acpi-psparse-aml-crash.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/acpi-psparse-aml-crash.dpatch @@ -0,0 +1,22 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Fix method_desc crash in acpi_ps_parse_aml. +## DP: Patch author: Herbert Xu +## DP: Upstream status: unknown + +. $(dirname $0)/DPATCH + +@DPATCH@ +===== drivers/acpi/parser/psparse.c 1.25 vs edited ===== +--- 1.25/drivers/acpi/parser/psparse.c 2004-03-13 11:29:42 +11:00 ++++ edited/drivers/acpi/parser/psparse.c 2004-10-10 20:13:50 +10:00 +@@ -1135,6 +1135,7 @@ + /* Check for possible multi-thread reentrancy problem */ + + if ((status == AE_ALREADY_EXISTS) && ++ walk_state->method_desc && + (!walk_state->method_desc->method.semaphore)) { + /* + * This method is marked not_serialized, but it tried to create a named --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/net-bridge_CVE-2005-3272.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/net-bridge_CVE-2005-3272.dpatch @@ -0,0 +1,45 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urNad /home/fabbione/i386/linux-source-2.6.8.1-2.6.8.1/net/bridge/br_input.c linux-source-2.6.8.1-2.6.8.1/net/bridge/br_input.c +--- /home/fabbione/i386/linux-source-2.6.8.1-2.6.8.1/net/bridge/br_input.c 2004-08-24 07:16:19.000000000 +0000 ++++ linux-source-2.6.8.1-2.6.8.1/net/bridge/br_input.c 2005-11-17 11:35:55.000000000 +0000 +@@ -66,6 +66,10 @@ + + br = p->br; + passedup = 0; ++ ++ /* insert into forwarding database after filtering to avoid spoofing */ ++ br_fdb_insert(p->br, p, skb->mac.ethernet->h_source, 0); ++ + if (br->dev->flags & IFF_PROMISC) { + struct sk_buff *skb2; + +@@ -119,8 +123,7 @@ + if (skb->mac.ethernet->h_source[0] & 1) + goto err; + +- if (p->state == BR_STATE_LEARNING || +- p->state == BR_STATE_FORWARDING) ++ if (p->state == BR_STATE_LEARNING) + br_fdb_insert(p->br, p, skb->mac.ethernet->h_source, 0); + + if (p->br->stp_enabled && +diff -urNad /home/fabbione/i386/linux-source-2.6.8.1-2.6.8.1/net/bridge/br_stp_bpdu.c linux-source-2.6.8.1-2.6.8.1/net/bridge/br_stp_bpdu.c +--- /home/fabbione/i386/linux-source-2.6.8.1-2.6.8.1/net/bridge/br_stp_bpdu.c 2004-08-24 07:18:42.000000000 +0000 ++++ linux-source-2.6.8.1-2.6.8.1/net/bridge/br_stp_bpdu.c 2005-11-17 11:36:20.000000000 +0000 +@@ -140,6 +140,9 @@ + struct net_bridge *br = p->br; + unsigned char *buf; + ++ /* insert into forwarding database after filtering to avoid spoofing */ ++ br_fdb_insert(p->br, p, skb->mac.ethernet->h_source, 0); ++ + /* need at least the 802 and STP headers */ + if (!pskb_may_pull(skb, sizeof(header)+1) || + memcmp(skb->data, header, sizeof(header))) --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/acpi-speedstep-fix.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/acpi-speedstep-fix.dpatch @@ -0,0 +1,32 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: fix acpi speedstep interaction (#257763) +## DP: Patch author: unknown +## DP: Upstream status: from ACPICA 20040715, so probably soon merged + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -Bru 2.6.new/drivers/acpi/dispatcher/dsopcode.c patched/drivers/acpi/dispatcher/dsopcode.c +--- 2.6.new/drivers/acpi/dispatcher/dsopcode.c 2004-04-28 11:45:01.000000000 +0800 ++++ patched/drivers/acpi/dispatcher/dsopcode.c 2004-05-20 19:36:31.000000000 +0800 +@@ -79,7 +79,6 @@ + acpi_status status; + union acpi_parse_object *op; + struct acpi_walk_state *walk_state; +- union acpi_parse_object *arg; + + + ACPI_FUNCTION_TRACE ("ds_execute_arguments"); +@@ -126,9 +125,7 @@ + + /* Get and init the Op created above */ + +- arg = op->common.value.arg; + op->common.node = node; +- arg->common.node = node; + acpi_ps_delete_parse_tree (op); + + /* Evaluate the deferred arguments */ --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/acx100-amd64.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/acx100-amd64.dpatch @@ -0,0 +1,23 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Remove CPU identification error. +## DP: Patch author: Herbert Xu +## DP: Upstream status: unknown + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN x/drivers/net/wireless/acx/wlan_compat.h y/drivers/net/wireless/acx/wlan_compat.h +--- x/drivers/net/wireless/acx/wlan_compat.h 2004-09-04 20:14:19.000000000 +1000 ++++ y/drivers/net/wireless/acx/wlan_compat.h 2004-09-04 20:14:34.000000000 +1000 +@@ -163,8 +163,6 @@ + #define WLAN_CPU_CORE WLAN_HPPACORE + #define WLAN_CPU_PART WLAN_HPPAPART + #define WLAN_SYSARCH WLAN_HPPAARCH +-#else +-#error "No CPU identified!" + #endif + #endif /* __KERNEL__ */ + --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/acx100-fw.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/acx100-fw.dpatch @@ -0,0 +1,102 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: [acx100] Load firmware from standard locations. +## DP: Patch author: Herbert Xu +## DP: Upstream status: unknown + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN x/drivers/net/wireless/acx/acx100_helper.c y/drivers/net/wireless/acx/acx100_helper.c +--- x/drivers/net/wireless/acx/acx100_helper.c 2004-09-25 10:43:53.000000000 +1000 ++++ y/drivers/net/wireless/acx/acx100_helper.c 2004-10-07 21:21:11.000000000 +1000 +@@ -624,16 +624,21 @@ + + FN_ENTER; + if (!firmware_dir) +- { +- /* since the log will be flooded with other log messages after +- * this important one, make sure people do notice us */ +- acxlog(L_STD, "ERROR: no directory for firmware file specified, ABORTING. Make sure to set module parameter 'firmware_dir'! (specified as absolute path!)\n"); +- return 0; +- } ++ firmware_dir = "/lib/hotplug/firmware"; + + filename = kmalloc(PATH_MAX, GFP_USER); + if (!filename) + return -ENOMEM; ++ ++ if (priv->chip_type == CHIPTYPE_ACX100) ++ sprintf(filename, "%s/WLANGEN.BIN-" UTS_RELEASE, firmware_dir); ++ else if (priv->chip_type == CHIPTYPE_ACX111) ++ sprintf(filename, "%s/TIACX111.BIN-" UTS_RELEASE, firmware_dir); ++ ++ apfw_image = acx100_read_fw(filename); ++ if (apfw_image) ++ goto got_file; ++ + if(priv->chip_type == CHIPTYPE_ACX100) { + sprintf(filename,"%s/WLANGEN.BIN", firmware_dir); + } else if(priv->chip_type == CHIPTYPE_ACX111) { +@@ -648,6 +653,7 @@ + return 0; + } + ++got_file: + for (try = 0; try < 5; try++) + { + res1 = acx100_write_fw(priv, apfw_image, 0); +@@ -713,6 +719,13 @@ + return 0; + } + ++ sprintf(filename, "%s/RADIO%02x.BIN-" UTS_RELEASE, firmware_dir, ++ priv->radio_type); ++ acxlog(L_DEBUG, "trying to read %s\n", filename); ++ radio_image = acx100_read_fw(filename); ++ if (radio_image) ++ goto got_file; ++ + sprintf(filename,"%s/RADIO%02x.BIN", firmware_dir, priv->radio_type); + acxlog(L_DEBUG,"trying to read %s\n",filename); + radio_image = acx100_read_fw(filename); +@@ -730,6 +743,7 @@ + return 1; /* Doesn't need to be fatal, we might be using a combined image */ + } + ++got_file: + acx100_issue_cmd(priv, ACX100_CMD_SLEEP, NULL, 0, 5000); + + for (try = 0; try < 5; try++) +diff -urN x/drivers/net/wireless/acx/acx100_usb.c y/drivers/net/wireless/acx/acx100_usb.c +--- x/drivers/net/wireless/acx/acx100_usb.c 2004-09-25 10:43:53.000000000 +1000 ++++ y/drivers/net/wireless/acx/acx100_usb.c 2004-10-07 21:23:30.000000000 +1000 +@@ -573,14 +573,24 @@ + kfree(usbbuf); + return(-EINVAL); + } +- if (firmware_dir) sprintf(filename,"%s/ACX100.bin",firmware_dir); +- else sprintf(filename,"/etc/acx100/ACX100.bin"); ++ if (!firmware_dir) ++ firmware_dir = "/lib/hotplug/firmware/ACX100.bin"; ++ ++ sprintf(filename, "%s/ACX100.bin-" UTS_RELEASE, firmware_dir); ++ acxlog(L_STD, "loading firmware %s\n", filename); ++ firmware = acx100usb_read_firmware(filename, &size); ++ if (firmware) ++ goto got_file; ++ ++ sprintf(filename, "%s/ACX100.bin", firmware_dir); + acxlog(L_STD,"loading firmware %s\n",filename); + firmware=acx100usb_read_firmware(filename,&size); + if (!firmware) { + kfree(usbbuf); + return(-EIO); + } ++ ++got_file: + acxlog(L_DEBUG,"firmware size: %d bytes\n",size); + /* -------------------------------------- + ** Obtain the I/O pipes --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/net-ipv6-udp_CVE-2005-2973.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/net-ipv6-udp_CVE-2005-2973.dpatch @@ -0,0 +1,29 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -Naurd linux-source-2.6.8.1-2.6.8.1.ORIG/net/ipv6/udp.c linux-source-2.6.8.1-2.6.8.1/net/ipv6/udp.c +--- linux-source-2.6.8.1-2.6.8.1.ORIG/net/ipv6/udp.c 2004-08-24 09:18:47.000000000 +0200 ++++ linux-source-2.6.8.1-2.6.8.1/net/ipv6/udp.c 2005-11-16 12:59:52.000000000 +0100 +@@ -98,7 +98,7 @@ + next:; + } + result = best; +- for(;; result += UDP_HTABLE_SIZE) { ++ for(i = 0; i < (1 << 16) / UDP_HTABLE_SIZE; i++, result += UDP_HTABLE_SIZE) { + if (result > sysctl_local_port_range[1]) + result = sysctl_local_port_range[0] + + ((result - sysctl_local_port_range[0]) & +@@ -106,6 +106,8 @@ + if (!udp_lport_inuse(result)) + break; + } ++ if (i >= (1 << 16) / UDP_HTABLE_SIZE) ++ goto fail; + gotit: + udp_port_rover = snum = result; + } else { --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/acx100-kill-float.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/acx100-kill-float.dpatch @@ -0,0 +1,23 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Kill floating-point operations in acx100. +## DP: Patch author: Herbert Xu +## DP: Upstream status: unknown + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN x/drivers/net/wireless/acx/idma.c y/drivers/net/wireless/acx/idma.c +--- x/drivers/net/wireless/acx/idma.c 2004-04-14 02:10:03.000000000 +1000 ++++ y/drivers/net/wireless/acx/idma.c 2004-09-04 13:23:35.000000000 +1000 +@@ -948,7 +948,7 @@ + */ + inline UINT8 acx_signal_to_winlevel(UINT8 rawlevel) + { +- UINT8 winlevel = (UINT8) (0.5 + 0.625 * rawlevel); ++ int winlevel = (4 + 5 * rawlevel) / 8; + + if(winlevel>100) + winlevel=100; --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/acx100.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/acx100.dpatch @@ -0,0 +1,24918 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: TI ACX100 support. +## DP: Patch author: ACX100 Open Source Project +## DP: Upstream status: unknown + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN x/drivers/net/wireless/Kconfig y/drivers/net/wireless/Kconfig +--- x/drivers/net/wireless/Kconfig 2004-08-29 18:22:30.000000000 +1000 ++++ y/drivers/net/wireless/Kconfig 2004-09-04 13:07:18.000000000 +1000 +@@ -305,6 +305,12 @@ + ---help--- + This is the driver for USB cards with the Prism 2 chipset. + ++config ACX100 ++ tristate "TI ACX100 support" ++ depends on NET_RADIO && PCI ++ ---help--- ++ This is the driver for PCI cards with the TI ACX100 chipset. ++ + config AIRO + tristate "Cisco/Aironet 34X/35X/4500/4800 ISA and PCI cards" + depends on NET_RADIO && ISA && (PCI || BROKEN) +diff -urN x/drivers/net/wireless/Makefile y/drivers/net/wireless/Makefile +--- x/drivers/net/wireless/Makefile 2004-08-29 18:22:30.000000000 +1000 ++++ y/drivers/net/wireless/Makefile 2004-09-04 13:07:41.000000000 +1000 +@@ -6,6 +6,7 @@ + obj-$(CONFIG_IPW2200) += ipw2200/ + obj-$(CONFIG_WLAN_NG) += wlan-ng/ + obj-$(CONFIG_PRISM2) += prism2/ ++obj-$(CONFIG_ACX100) += acx/ + + obj-$(CONFIG_STRIP) += strip.o + obj-$(CONFIG_ARLAN) += arlan.o +diff -urN x/drivers/net/wireless/acx/Makefile y/drivers/net/wireless/acx/Makefile +--- x/drivers/net/wireless/acx/Makefile 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/acx/Makefile 2004-09-04 13:06:17.000000000 +1000 +@@ -0,0 +1,7 @@ ++CFLAGS += -Idrivers/net/wireless/acx -DWLAN_HOSTIF=WLAN_PCI -DACX_DEBUG=1 ++ ++acx_pci-objs := acx100.o acx100_helper.o acx100_helper2.o \ ++ ihw.o idma.o acx80211frm.o acx100_ioctl.o \ ++ acx100_conv.o ioregister.o ++ ++obj-$(CONFIG_ACX100) += acx_pci.o +diff -urN x/drivers/net/wireless/acx/acx100.c y/drivers/net/wireless/acx/acx100.c +--- x/drivers/net/wireless/acx/acx100.c 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/acx/acx100.c 2004-04-14 02:14:17.000000000 +1000 +@@ -0,0 +1,1977 @@ ++/* src/acx100.c - main module functions ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Copyright (C) 2003 ACX100 Open Source Project ++ * ++ * The contents of this file are subject to the Mozilla Public ++ * License Version 1.1 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS ++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or ++ * implied. See the License for the specific language governing ++ * rights and limitations under the License. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU Public License version 2 (the "GPL"), in which ++ * case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use ++ * your version of this file under the MPL, indicate your decision ++ * by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL. If you do not delete ++ * the provisions above, a recipient may use your version of this ++ * file under either the MPL or the GPL. ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Inquiries regarding the ACX100 Open Source Project can be ++ * made directly to: ++ * ++ * acx100-users@lists.sf.net ++ * http://acx100.sf.net ++ * ++ * -------------------------------------------------------------------- ++ * Locking and synchronization (taken from orinoco.c): ++ * ++ * The basic principle is that everything is serialized through a ++ * single spinlock, priv->lock. The lock is used in user, bh and irq ++ * context, so when taken outside hardirq context it should always be ++ * taken with interrupts disabled. The lock protects both the ++ * hardware and the struct wlandevice. ++ * ++ * Another flag, priv->hw_unavailable indicates that the hardware is ++ * unavailable for an extended period of time (e.g. suspended, or in ++ * the middle of a hard reset). This flag is protected by the ++ * spinlock. All code which touches the hardware should check the ++ * flag after taking the lock, and if it is set, give up on whatever ++ * they are doing and drop the lock again. The acx100_lock() ++ * function handles this (it unlocks and returns -EBUSY if ++ * hw_unavailable is true). */ ++ ++/*================================================================*/ ++/* System Includes */ ++#ifdef S_SPLINT_S /* some crap that splint needs to not crap out */ ++#define __signed__ signed ++#define __u64 unsigned long long ++#define u64 unsigned long long ++#define loff_t unsigned long ++#define sigval_t unsigned long ++#define siginfo_t unsigned long ++#define stack_t unsigned long ++#define __s64 signed long long ++#endif ++#include ++#include ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include ++ ++#include ++#include ++ ++#include ++ ++#include ++#include ++#include ++ ++/*================================================================*/ ++/* Project Includes */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/********************************************************************/ ++/* Module information */ ++/********************************************************************/ ++ ++MODULE_AUTHOR("The ACX100 Open Source Driver development team"); ++MODULE_DESCRIPTION("Driver for TI ACX1xx based wireless cards (CardBus/PCI/USB)"); ++#ifdef MODULE_LICENSE ++MODULE_LICENSE("Dual MPL/GPL"); ++#endif ++ ++/*================================================================*/ ++/* Local Constants */ ++#define PCI_TYPE (PCI_USES_MEM | PCI_ADDR0 | PCI_NO_ACPI_WAKE) ++#define PCI_ACX100_REGION1 0x01 ++#define PCI_ACX100_REGION1_SIZE 0x1000 /* Memory size - 4K bytes */ ++#define PCI_ACX100_REGION2 0x02 ++#define PCI_ACX100_REGION2_SIZE 0x10000 /* Memory size - 64K bytes */ ++ ++#define PCI_ACX111_REGION1 0x00 ++#define PCI_ACX111_REGION1_SIZE 0x2000 /* Memory size - 8K bytes */ ++#define PCI_ACX111_REGION2 0x01 ++#define PCI_ACX111_REGION2_SIZE 0x20000 /* Memory size - 128K bytes */ ++ ++/* Texas Instruments Vendor ID */ ++#define PCI_VENDOR_ID_TI 0x104c ++ ++/* ACX100 22Mb/s WLAN controller */ ++#define PCI_DEVICE_ID_TI_ACX100 0x8400 ++#define PCI_DEVICE_ID_TI_ACX100_CB 0x8401 ++ ++/* ACX111 54Mb/s WLAN controller */ ++#define PCI_DEVICE_ID_TI_ACX111 0x9066 ++ ++/* PCI Class & Sub-Class code, Network-'Other controller' */ ++#define PCI_CLASS_NETWORK_OTHERS 0x280 ++ ++/*================================================================*/ ++/* Local Macros */ ++ ++/*================================================================*/ ++/* Local Types */ ++ ++/*================================================================*/ ++/* Local Static Definitions */ ++#define DRIVER_SUFFIX "_pci" ++ ++#define CARD_EEPROM_ID_SIZE 6 ++#define MAX_IRQLOOPS_PER_JIFFY (20000/HZ) //a la orinoco.c ++ ++typedef char *dev_info_t; ++static dev_info_t dev_info = "TI acx" DRIVER_SUFFIX; ++ ++static char *version = "TI acx" DRIVER_SUFFIX ".o: " WLAN_RELEASE; ++ ++#ifdef ACX_DEBUG ++int debug = L_BIN|L_ASSOC|L_INIT|L_STD; ++int acx100_debug_func_indent = 0; ++#endif ++ ++int use_eth_name = 0; ++ ++char *firmware_dir; ++ ++extern const struct iw_handler_def acx100_ioctl_handler_def; ++ ++typedef struct device_id { ++ unsigned char id[6]; ++ char *descr; ++ char *type; ++} device_id_t; ++ ++char *name_acx100 = "ACX100"; ++char *name_acx111 = "ACX111"; ++ ++/*@-fullinitblock@*/ ++static const struct pci_device_id acx100_pci_id_tbl[] __devinitdata = { ++ { ++ .vendor = PCI_VENDOR_ID_TI, ++ .device = PCI_DEVICE_ID_TI_ACX100, ++ .subvendor = PCI_ANY_ID, ++ .subdevice = PCI_ANY_ID, ++ .driver_data = CHIPTYPE_ACX100, ++ }, ++ { ++ .vendor = PCI_VENDOR_ID_TI, ++ .device = PCI_DEVICE_ID_TI_ACX100_CB, ++ .subvendor = PCI_ANY_ID, ++ .subdevice = PCI_ANY_ID, ++ .driver_data = CHIPTYPE_ACX100, ++ }, ++ { ++ .vendor = PCI_VENDOR_ID_TI, ++ .device = PCI_DEVICE_ID_TI_ACX111, ++ .subvendor = PCI_ANY_ID, ++ .subdevice = PCI_ANY_ID, ++ .driver_data = CHIPTYPE_ACX111, ++ }, ++ { ++ .vendor = 0, ++ .device = 0, ++ .subvendor = 0, ++ .subdevice = 0, ++ .driver_data = 0, ++ } ++}; ++/*@=fullinitblock@*/ ++ ++MODULE_DEVICE_TABLE(pci, acx100_pci_id_tbl); ++ ++static const device_id_t device_ids[] = ++{ ++ /*@-null@*/ ++ { ++ {'G', 'l', 'o', 'b', 'a', 'l'}, ++ NULL, ++ NULL, ++ }, ++ { ++ {(UINT8)0xff, (UINT8)0xff, (UINT8)0xff, (UINT8)0xff, (UINT8)0xff, (UINT8)0xff}, ++ "uninitialised", ++ "SpeedStream SS1021 or Gigafast WF721-AEX" ++ }, ++ { ++ {(UINT8)0x80, (UINT8)0x81, (UINT8)0x82, (UINT8)0x83, (UINT8)0x84, (UINT8)0x85}, ++ "non-standard", ++ "DrayTek Vigor 520" ++ }, ++ { ++ {'?', '?', '?', '?', '?', '?'}, ++ "non-standard", ++ "Level One WPC-0200" ++ }, ++ { ++ {(UINT8)0x00, (UINT8)0x00, (UINT8)0x00, (UINT8)0x00, (UINT8)0x00, (UINT8)0x00}, ++ "empty", ++ "DWL-650+ variant" ++ } ++ /*@=null@*/ ++}; ++ ++static int acx100_probe_pci(struct pci_dev *pdev, ++ const struct pci_device_id *id); ++static void acx100_remove_pci(struct pci_dev *pdev); ++ ++static int acx100_suspend(struct pci_dev *pdev, u32 state); ++static int acx100_resume(struct pci_dev *pdev); ++#if THIS_IS_OLD_PM_STUFF_ISNT_IT ++static int acx100_pm_callback(struct pm_dev *dev, pm_request_t rqst, void *data); ++#endif ++ ++ ++/*@-fullinitblock@*/ ++static struct pci_driver acx100_pci_drv_id = { ++ .name = "acx_pci", ++ .id_table = acx100_pci_id_tbl, ++ .probe = acx100_probe_pci, ++ .remove = __devexit_p(acx100_remove_pci), ++ .suspend = acx100_suspend, ++ .resume = acx100_resume ++}; ++/*@=fullinitblock@*/ ++ ++typedef struct acx100_device { ++ netdevice_t *newest; ++ ++} acx100_device_t; ++ ++/* if this driver was only about PCI devices, then we probably wouldn't ++ * need this linked list. ++ * But if we want to register ALL kinds of devices in one global list, ++ * then we need it and need to maintain it properly. */ ++static struct acx100_device root_acx100_dev = { ++ .newest = NULL, ++}; ++ ++ ++static int acx100_start_xmit(struct sk_buff *skb, netdevice_t *dev); ++static void acx100_tx_timeout(netdevice_t *dev); ++static struct net_device_stats *acx100_get_stats(netdevice_t *dev); ++static struct iw_statistics *acx100_get_wireless_stats(netdevice_t *dev); ++ ++irqreturn_t acx100_interrupt(int irq, void *dev_id, struct pt_regs *regs); ++static void acx100_set_rx_mode(netdevice_t *dev); ++void acx100_rx(struct rxhostdescriptor *rxdesc, wlandevice_t *priv); ++ ++static int acx100_open(netdevice_t *dev); ++static int acx100_close(netdevice_t *dev); ++static void acx100_up(netdevice_t *dev); ++static void acx100_down(netdevice_t *dev); ++ ++static void acx100_get_firmware_version(wlandevice_t *priv) ++{ ++ fw_ver_t fw; ++ UINT8 fw_major = (UINT8)0, fw_minor = (UINT8)0, fw_sub = (UINT8)0, fw_extra = (UINT8)0; ++ ++ FN_ENTER; ++ ++ (void)acx100_interrogate(priv, &fw, ACX100_RID_FWREV); ++ memcpy(priv->firmware_version, &fw.fw_id, 20); ++ if (strncmp((char *)fw.fw_id, "Rev ", 4) != 0) ++ { ++ acxlog(L_STD|L_INIT, "Huh, strange firmware version string \"%s\" without leading \"Rev \" string detected, please report!\n", fw.fw_id); ++ priv->firmware_numver = 0x01090407; /* assume 1.9.4.7 */ ++ FN_EXIT(0, 0); ++ return; ++ } ++ fw_major = (UINT8)(fw.fw_id[4] - '0'); ++ fw_minor = (UINT8)(fw.fw_id[6] - '0'); ++ fw_sub = (UINT8)(fw.fw_id[8] - '0'); ++ if (strlen((char *)fw.fw_id) >= 11) ++ { ++ if ((fw.fw_id[10] >= '0') && (fw.fw_id[10] <= '9')) ++ fw_extra = (UINT8)(fw.fw_id[10] - '0'); ++ else ++ fw_extra = (UINT8)(fw.fw_id[10] - 'a' + (char)10); ++ } ++ priv->firmware_numver = ++ (UINT32)((fw_major << 24) + (fw_minor << 16) + (fw_sub << 8) + fw_extra); ++ acxlog(L_DEBUG, "firmware_numver %08lx\n", priv->firmware_numver); ++ ++ priv->firmware_id = fw.hw_id; ++ ++ FN_EXIT(0, 0); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_display_hardware_details ++* ++* ++* Arguments: ++* priv: ptr to wlandevice that contains all the details ++* displayed by this function ++* Returns: ++* void ++* ++* Side effects: ++* none ++* Call context: ++* acx100_probe_pci ++* STATUS: ++* stable ++* Comment: ++* This function will display strings to the system log according ++* to device form_factor and radio type. It will needed to be ++*----------------------------------------------------------------*/ ++ ++void acx100_display_hardware_details(wlandevice_t *priv) ++{ ++ char *radio_str, *form_str; ++ ++ FN_ENTER; ++ ++ switch(priv->radio_type) { ++ case RADIO_MAXIM_0D: ++ /* hmm, the DWL-650+ seems to have two variants, ++ * according to a windows driver changelog comment: ++ * RFMD and Maxim. */ ++ radio_str = "Maxim"; ++ break; ++ case RADIO_RFMD_11: ++ radio_str = "RFMD"; ++ break; ++ case RADIO_RALINK_15: ++ radio_str = "Ralink"; ++ break; ++ case RADIO_UNKNOWN_16: ++ case RADIO_UNKNOWN_17: ++ radio_str = "UNKNOWN, used e.g. in ACX111 cards, please report the radio type name!"; ++ break; ++ default: ++ radio_str = "UNKNOWN, please report the radio type name!"; ++ break; ++ } ++ ++ switch(priv->form_factor) { ++ case 0x00: ++ form_str = "standard?"; ++ break; ++ case 0x01: ++ form_str = "D-Link DWL-520+/650+/G650+/Planet WL-8305?"; ++ break; ++ default: ++ form_str = "UNKNOWN, please report!"; ++ break; ++ } ++ ++ acxlog(L_STD, "acx100: form factor 0x%02x (%s), radio type 0x%02x (%s), EEPROM version 0x%04x. Uploaded firmware '%s' (0x%08lx).\n", priv->form_factor, form_str, priv->radio_type, radio_str, priv->eeprom_version, priv->firmware_version, priv->firmware_id); ++ ++ FN_EXIT(0, 0); ++} ++ ++static inline void acx100_device_chain_add(struct net_device *dev) ++{ ++ wlandevice_t *priv = (struct wlandevice *) dev->priv; ++ ++ priv->prev_nd = root_acx100_dev.newest; ++ /*@-temptrans@*/ ++ root_acx100_dev.newest = dev; ++ /*@=temptrans@*/ ++ priv->netdev = dev; ++} ++ ++void acx100_device_chain_remove(struct net_device *dev) ++{ ++ struct net_device *querydev; ++ struct net_device *olderdev; ++ struct net_device *newerdev; ++ ++ querydev = (struct net_device *) root_acx100_dev.newest; ++ newerdev = NULL; ++ while (NULL != querydev) { ++ olderdev = ((struct wlandevice *) querydev->priv)->prev_nd; ++ if (0 == strcmp(querydev->name, dev->name)) { ++ if (NULL == newerdev) { ++ /* if we were at the beginning of the ++ * list, then it's the list head that ++ * we need to update to point at the ++ * next older device */ ++ root_acx100_dev.newest = olderdev; ++ } else { ++ /* it's the device that is newer than us ++ * that we need to update to point at ++ * the device older than us */ ++ ((struct wlandevice *) newerdev->priv)-> ++ prev_nd = olderdev; ++ } ++ break; ++ } ++ /* "newerdev" is actually the device of the old iteration, ++ * but since the list starts (root_acx100_dev.newest) ++ * with the newest devices, ++ * it's newer than the ones following. ++ * Oh the joys of iterating from newest to oldest :-\ */ ++ newerdev = querydev; ++ ++ /* keep checking old devices for matches until we hit the end ++ * of the list */ ++ querydev = olderdev; ++ } ++} ++ ++void acx_show_card_eeprom_id(wlandevice_t *priv) ++{ ++ unsigned char buffer[CARD_EEPROM_ID_SIZE]; ++ UINT16 i; ++ ++ memset(&buffer, 0, CARD_EEPROM_ID_SIZE); ++ /* use direct eeprom access */ ++ for (i = 0; i < CARD_EEPROM_ID_SIZE; i++) { ++ if (0 == acx100_read_eeprom_offset(priv, ++ (UINT16)(ACX100_EEPROM_ID_OFFSET + i), ++ &buffer[i])) ++ { ++ acxlog(L_STD, "huh, reading EEPROM failed!?\n"); ++ break; ++ } ++ } ++ ++ for (i = 0; i < (UINT16)(sizeof(device_ids) / sizeof(struct device_id)); i++) ++ { ++ if (0 == memcmp(&buffer, device_ids[i].id, CARD_EEPROM_ID_SIZE)) ++ { ++ if (NULL != device_ids[i].descr) { ++ acxlog(L_STD, "%s: EEPROM card ID string check found %s card ID: this is a %s, no??\n", __func__, device_ids[i].descr, device_ids[i].type); ++ } ++ break; ++ } ++ } ++ if (i == (UINT16)(sizeof(device_ids) / sizeof(device_id_t))) ++ { ++ acxlog(L_STD, ++ "%s: EEPROM card ID string check found unknown card: expected \"Global\", got \"%.*s\"! Please report!\n", __func__, CARD_EEPROM_ID_SIZE, buffer); ++ } ++} ++ ++/*---------------------------------------------------------------- ++* acx100_probe_pci ++* ++* Probe routine called when a PCI device w/ matching ID is found. ++* Here's the sequence: ++* - Allocate the PCI resources. ++* - Read the PCMCIA attribute memory to make sure we have a WLAN card ++* - Reset the MAC ++* - Initialize the dev and wlan data ++* - Initialize the MAC ++* ++* Arguments: ++* pdev ptr to pci device structure containing info about ++* pci configuration. ++* id ptr to the device id entry that matched this device. ++* ++* Returns: ++* zero - success ++* negative - failed ++* ++* Side effects: ++* ++* ++* Call context: ++* process thread ++* ++* STATUS: should be pretty much ok. UNVERIFIED. ++* ++* Comment: The function was rewritten according to the V3 driver. ++* The debugging information from V1 is left even if ++* absent from V3. ++----------------------------------------------------------------*/ ++static int __devinit ++acx100_probe_pci(struct pci_dev *pdev, const struct pci_device_id *id) ++{ ++ int result = -EIO; ++ int err; ++ ++ UINT16 chip_type; ++ ++ char *chip_name; ++ unsigned long mem_region1 = 0; ++ unsigned long mem_region1_size; ++ unsigned long mem_region2 = 0; ++ unsigned long mem_region2_size; ++ ++ unsigned long phymem1; ++ unsigned long phymem2; ++ unsigned long mem1 = 0; ++ unsigned long mem2 = 0; ++ ++ wlandevice_t *priv = NULL; ++ struct net_device *dev = NULL; ++ ++ char *devname_mask; ++ UINT32 hardware_info; ++ char procbuf[80]; ++ ++ FN_ENTER; ++ ++ /* FIXME: flag device somehow to make sure ioctls don't have access ++ * to uninitialized structures before init is finished */ ++ ++ /* Enable the PCI device */ ++ ++ if (0 != pci_enable_device(pdev)) { ++ acxlog(L_BINSTD | L_INIT, ++ "%s: %s: pci_enable_device() failed\n", ++ __func__, dev_info); ++ result = -ENODEV; ++ goto fail; ++ } ++ ++ /* enable busmastering (required for CardBus) */ ++ pci_set_master(pdev); ++#if DOES_NOT_WORK ++ /* on my Dell Inspiron 8000, if I try to suspend it, ++ * the notebook immediately resumes after shutdown when my ++ * ACX100 mini-PCI card is installed. This is obviously not useful :-( ++ * Thus I'm trying to fix this severe problem by playing with ++ * PCI power management bits. So far it's not very successful ++ * :-\ ++ */ ++ acxlog(L_DEBUG, "wake: %d\n", pci_enable_wake(pdev, 0, 0)); ++#endif ++ ++ /* acx100 and acx111 have different pci memory regions */ ++ chip_type = (UINT16)id->driver_data; ++ if (chip_type == CHIPTYPE_ACX100) { ++ chip_name = name_acx100; ++ mem_region1 = PCI_ACX100_REGION1; ++ mem_region1_size = PCI_ACX100_REGION1_SIZE; ++ ++ mem_region2 = PCI_ACX100_REGION2; ++ mem_region2_size = PCI_ACX100_REGION2_SIZE; ++ } else if (chip_type == CHIPTYPE_ACX111) { ++ acxlog(L_BINSTD, "%s: WARNING: ACX111 support is highly experimental!\n", __func__); ++ ++ chip_name = name_acx111; ++ mem_region1 = PCI_ACX111_REGION1; ++ mem_region1_size = PCI_ACX111_REGION1_SIZE; ++ ++ mem_region2 = PCI_ACX111_REGION2; ++ mem_region2_size = PCI_ACX111_REGION2_SIZE; ++ } else { ++ acxlog(L_BINSTD, "%s: unknown or bad chip??\n", __func__); ++ result = -EIO; ++ goto fail; ++ } ++ ++ /* Figure out our resources */ ++ phymem1 = pci_resource_start(pdev, mem_region1); ++ phymem2 = pci_resource_start(pdev, mem_region2); ++ ++ if (!request_mem_region ++ (phymem1, pci_resource_len(pdev, mem_region1), "Acx100_1")) { ++ acxlog(L_BINSTD | L_INIT, ++ "%s: acx100: Cannot reserve PCI memory region 1 (or also: are you sure you have CardBus support in kernel?)\n", __func__); ++ result = -EIO; ++ goto fail; ++ } ++ ++ if (!request_mem_region ++ (phymem2, pci_resource_len(pdev, mem_region2), "Acx100_2")) { ++ acxlog(L_BINSTD | L_INIT, ++ "%s: acx100: Cannot reserve PCI memory region 2\n", __func__); ++ result = -EIO; ++ goto fail; ++ } ++ ++ mem1 = (unsigned long) ioremap(phymem1, mem_region1_size); ++ if (0 == mem1) { ++ acxlog(L_BINSTD | L_INIT, ++ "%s: %s: ioremap() failed.\n", ++ __func__, dev_info); ++ result = -EIO; ++ goto fail; ++ } ++ ++ mem2 = (unsigned long) ioremap(phymem2, mem_region2_size); ++ if (0 == mem2) { ++ acxlog(L_BINSTD | L_INIT, ++ "%s: %s: ioremap() failed.\n", ++ __func__, dev_info); ++ result = -EIO; ++ goto fail; ++ } ++ ++ /* Log the device */ ++ acxlog(L_STD | L_INIT, ++ "Found %s-based wireless network card at %s, irq:%d, phymem1:0x%lx, phymem2:0x%lx, mem1:0x%lx, mem1_size:%ld, mem2:0x%lx, mem2_size:%ld.\n", ++ chip_name, pci_name(pdev), pdev->irq, phymem1, phymem2, ++ mem1, mem_region1_size, ++ mem2, mem_region2_size); ++ ++ if (0 == pdev->irq) { ++ acxlog(L_BINSTD | L_IRQ | L_INIT, "%s: %s: Can't get IRQ %d\n", ++ __func__, dev_info, 0); ++ result = -EIO; ++ goto fail; ++ } ++ ++ acxlog(L_DEBUG, "Allocating %d, %Xh bytes for wlandevice_t\n",sizeof(wlandevice_t),sizeof(wlandevice_t)); ++ if (NULL == (priv = kmalloc(sizeof(wlandevice_t), GFP_KERNEL))) { ++ acxlog(L_BINSTD | L_INIT, ++ "%s: %s: Memory allocation failure\n", ++ __func__, dev_info); ++ result = -EIO; ++ goto fail; ++ } ++ ++ memset(priv, 0, sizeof(wlandevice_t)); ++ ++ priv->chip_type = chip_type; ++ priv->chip_name = chip_name; ++ if (PCI_HEADER_TYPE_CARDBUS == pdev->hdr_type) { ++ priv->bus_type = (UINT8)ACX_CARDBUS; ++ } else ++ if (PCI_HEADER_TYPE_NORMAL == pdev->hdr_type) { ++ priv->bus_type = (UINT8)ACX_PCI; ++ } else { ++ acxlog(L_STD, "ERROR: card has unknown bus type!!\n"); ++ } ++ ++ /* set the correct io resource list for the active chip */ ++ if (CHIPTYPE_ACX100 == chip_type) { ++ priv->io = acx100_get_io_register_array(); ++ } else if (CHIPTYPE_ACX111 == chip_type) { ++ priv->io = acx111_get_io_register_array(); ++ } ++ if (NULL == priv->io) { ++ acxlog(L_BINSTD, "%s: error getting io mappings.\n", __func__); ++ result = -EIO; ++ goto fail; ++ } ++ acxlog(L_BINSTD, "%s: using %s io resource addresses (size: %d)\n", __func__, priv->chip_name, IO_INDICES_SIZE); ++ ++ spin_lock_init(&priv->lock); ++ ++ acxlog(L_INIT, "hw_unavailable = 1\n"); ++ priv->hw_unavailable = 1; ++ priv->dev_state_mask &= ~ACX_STATE_IFACE_UP; ++ ++ priv->membase = phymem1; ++ priv->iobase = mem1; ++ ++ priv->membase2 = phymem2; ++ priv->iobase2 = mem2; ++ ++ priv->mgmt_timer.function = (void *)0x0000dead; /* to find crashes due to weird driver access to unconfigured interface (ifup) */ ++ ++ acx_show_card_eeprom_id(priv); ++ ++ if (NULL == (dev = kmalloc(sizeof(netdevice_t), GFP_KERNEL))) { ++ acxlog(L_BINSTD | L_INIT, ++ "%s: Failed to alloc netdev\n", __func__); ++ result = -EIO; ++ goto fail; ++ } ++ ++ memset(dev, 0, sizeof(netdevice_t)); ++ ether_setup(dev); ++ ++#if QUEUE_OPEN_AFTER_ASSOC ++ /* now we have our device, so make sure the kernel doesn't try ++ * to send packets even though we're not associated to a network yet */ ++ acxlog(L_XFER, "stop queue after setup.\n"); ++ netif_stop_queue(dev); ++#endif ++ ++ dev->priv = priv; ++ ++ /* register new dev in linked list */ ++ acx100_device_chain_add(dev); ++ ++ dev->irq = pdev->irq; ++ dev->base_addr = pci_resource_start(pdev, 0); /* TODO this is maybe incompatible to ACX111 */ ++ ++ if (0 == acx100_reset_dev(dev)) { ++ acxlog(L_BINSTD | L_INIT, ++ "%s: %s: MAC initialize failure!\n", ++ __func__, dev_info); ++ result = -EIO; ++ goto fail; ++ } ++ ++ devname_mask = (1 == use_eth_name) ? "eth%d" : "wlan%d"; ++ if (dev_alloc_name(dev, devname_mask) < 0) ++ { ++ result = -EIO; ++ goto fail; ++ } ++ acxlog(L_STD, "acx100: allocated net device %s, driver compiled against wireless extensions v%d and Linux %s\n", dev->name, WIRELESS_EXT, UTS_RELEASE); ++ ++ /* now that device init was successful, fill remaining fields... */ ++ dev->open = &acx100_open; ++ dev->stop = &acx100_close; ++ dev->hard_start_xmit = &acx100_start_xmit; ++ /* FIXME: no handler for dev->hard_reset! could reset CPU, ++ * reinit packet templates etc. */ ++ dev->get_stats = &acx100_get_stats; ++ dev->get_wireless_stats = &acx100_get_wireless_stats; ++#if WIRELESS_EXT >= 13 ++ dev->wireless_handlers = (struct iw_handler_def *)&acx100_ioctl_handler_def; ++#else ++ dev->do_ioctl = &acx_ioctl_old; ++#endif ++ dev->set_multicast_list = &acx100_set_rx_mode; ++ dev->tx_timeout = &acx100_tx_timeout; ++ dev->watchdog_timeo = 4 * HZ; /* 400 */ ++ ++ /* ok, basic setup is finished, now start initialising the card */ ++ ++ hardware_info = acx100_read_reg16(priv, priv->io[IO_ACX_EEPROM_INFORMATION]); ++ priv->form_factor = (UINT8)(hardware_info & 0xff); ++ priv->radio_type = (UINT8)(hardware_info >> 8 & 0xff); ++// priv->eeprom_version = hardware_info >> 16; ++ if (0 == acx100_read_eeprom_offset(priv, 0x05, &priv->eeprom_version)) { ++ result = -EIO; ++ goto fail; ++ } ++ ++ if (0 != acx100_init_mac(dev)) { ++ acxlog(L_DEBUG | L_INIT, ++ "Danger Will Robinson, MAC did not come back\n"); ++ result = -EIO; ++ goto fail; ++ } ++ ++ /* card initialized, so let's release hardware */ ++ acxlog(L_INIT, "hw_unavailable--\n"); ++ priv->hw_unavailable--; ++ ++ /* needs to be after acx100_init_mac() due to necessary init stuff */ ++ acx100_get_firmware_version(priv); ++ ++ acx100_display_hardware_details(priv); ++ ++ /* ...and register the card, AFTER everything else has been set up, ++ * since otherwise an ioctl could step on our feet due to ++ * firmware operations happening in parallel or uninitialized data */ ++ if (0 != (err = register_netdev(dev))) { ++ acxlog(L_BINSTD | L_INIT, ++ "%s: %s: Register net device of %s failed: %d\n\n", ++ __func__, dev_info, dev->name, err); ++ result = -EIO; ++ goto fail; ++ } ++ ++ pci_set_drvdata(pdev, dev); ++#if THIS_IS_OLD_PM_STUFF_ISNT_IT ++ priv->pm = pm_register(PM_PCI_DEV,PM_PCI_ID(pdev), ++ &acx100_pm_callback); ++#endif ++ ++ sprintf(procbuf, "driver/acx_%s", dev->name); ++ acxlog(L_INIT, "creating /proc entry %s\n", procbuf); ++ (void)create_proc_read_entry(procbuf, 0, 0, acx100_read_proc, priv); ++ ++ sprintf(procbuf, "driver/acx_%s_diag", dev->name); ++ acxlog(L_INIT, "creating /proc entry %s\n", procbuf); ++ (void)create_proc_read_entry(procbuf, 0, 0, acx100_read_proc_diag, priv); ++ sprintf(procbuf, "driver/acx_%s_eeprom", dev->name); ++ acxlog(L_INIT, "creating /proc entry %s\n", procbuf); ++ (void)create_proc_read_entry(procbuf, 0, 0, acx100_read_proc_eeprom, priv); ++ sprintf(procbuf, "driver/acx_%s_phy", dev->name); ++ acxlog(L_INIT, "creating /proc entry %s\n", procbuf); ++ (void)create_proc_read_entry(procbuf, 0, 0, acx100_read_proc_phy, priv); ++ ++ acxlog(L_STD|L_INIT, "%s: %s Loaded Successfully\n", __func__, version); ++ result = 0; ++ goto done; ++ ++/* fail_registered: ++ unregister_netdev(dev); */ ++fail: ++ acxlog(L_STD|L_INIT, "%s: %s Loading FAILED\n", __func__, version); ++ ++ /* remove new failed dev from linked list */ ++ acx100_device_chain_remove(dev); ++ ++ if (NULL != dev) ++ kfree(dev); ++ ++ if (NULL != priv) ++ { ++ /* don't free priv->io here, this *global* resource ++ * will be freed on module unload */ ++#if THIS_IS_OLD_PM_STUFF_ISNT_IT ++ if (NULL != priv->pm) ++ pm_unregister(priv->pm); ++#endif ++ kfree(priv); ++ } ++ ++ if (0 != mem1) ++ iounmap((void *) mem1); ++ if (0 != mem2) ++ iounmap((void *) mem2); ++ ++ release_mem_region(pci_resource_start(pdev, mem_region1), ++ pci_resource_len(pdev, mem_region1)); ++ ++ release_mem_region(pci_resource_start(pdev, mem_region2), ++ pci_resource_len(pdev, mem_region2)); ++ pci_disable_device(pdev); ++ ++done: ++ FN_EXIT(1, result); ++ return result; ++} /* acx100_probe_pci() */ ++ ++ ++/*---------------------------------------------------------------- ++* acx100_remove_pci ++* ++* Deallocate PCI resources for the ACX100 chip. ++* ++* This should NOT execute any other hardware operations on the card, ++* since the card might already be ejected. Instead, that should be done ++* in cleanup_module, since the card is most likely still available there. ++* ++* Arguments: ++* pdev ptr to pci device structure containing info about ++* pci configuration. ++* ++* Returns: ++* nothing ++* ++* Side effects: ++* ++* Call context: ++* process thread ++* ++* STATUS: should be pretty much ok. UNVERIFIED. ++* ++* Comment: The function was rewritten according to the V3 driver. ++----------------------------------------------------------------*/ ++void __devexit acx100_remove_pci(struct pci_dev *pdev) ++{ ++ struct net_device *dev; ++ wlandevice_t *priv; ++ UINT16 chip_type; ++ ++ FN_ENTER; ++ ++ dev = (struct net_device *) pci_get_drvdata(pdev); ++ priv = (struct wlandevice *) dev->priv; ++ ++ /* unregister the device to not let the kernel ++ * (e.g. ioctls) access a half-deconfigured device */ ++ acxlog(L_INIT, "Removing device %s!\n", dev->name); ++ netif_device_detach(dev); ++ unregister_netdev(dev); ++ ++#if THIS_IS_OLD_PM_STUFF_ISNT_IT ++ pm_unregister(priv->pm); ++#endif ++ ++ /* find our PCI device in the global acx100 list and remove it */ ++ acx100_device_chain_remove(dev); ++ ++ if (0 != (priv->dev_state_mask & ACX_STATE_IFACE_UP)) ++ acx100_down(dev); ++ ++ priv->dev_state_mask &= ~ACX_STATE_IFACE_UP; ++ ++ acxlog(L_STD, "hw_unavailable++\n"); ++ priv->hw_unavailable++; ++ ++ acx100_delete_dma_region(priv); ++ ++#if NEWER_KERNELS_ONLY ++ free_netdev(dev); ++#else ++ if (dev) ++ kfree(dev); ++#endif ++ ++ chip_type = priv->chip_type; ++ ++ iounmap((void *) priv->iobase); ++ iounmap((void *) priv->iobase2); ++ ++ /* don't free priv->io here, this *global* resource ++ * will be freed on module unload */ ++ kfree(priv); ++ ++ /* finally, clean up PCI bus state */ ++ ++ if(chip_type == CHIPTYPE_ACX100) { ++ ++ release_mem_region(pci_resource_start(pdev, PCI_ACX100_REGION1), ++ pci_resource_len(pdev, PCI_ACX100_REGION1)); ++ ++ release_mem_region(pci_resource_start(pdev, PCI_ACX100_REGION2), ++ pci_resource_len(pdev, PCI_ACX100_REGION2)); ++ } ++ if(chip_type == CHIPTYPE_ACX111) { ++ ++ release_mem_region(pci_resource_start(pdev, PCI_ACX111_REGION1), ++ pci_resource_len(pdev, PCI_ACX111_REGION1)); ++ ++ release_mem_region(pci_resource_start(pdev, PCI_ACX111_REGION2), ++ pci_resource_len(pdev, PCI_ACX111_REGION2)); ++ } ++ ++ /* put device into ACPI D3 mode (shutdown) */ ++ pci_set_power_state(pdev, 3); ++ ++ pci_set_drvdata(pdev, NULL); ++ ++ FN_EXIT(0, 0); ++} ++ ++ ++static int acx100_suspend(struct pci_dev *pdev, /*@unused@*/ u32 state) ++{ ++#if CRASHES_SOMEHOW ++ /*@unused@*/ struct net_device *dev = pci_get_drvdata(pdev); ++ wlandevice_t *priv = dev->priv; ++ ++ FN_ENTER; ++ acxlog(L_STD, "acx100: unimplemented suspend handler called for %p!\n", priv); ++ FN_EXIT(0, 0); ++#endif ++ return 0; ++} ++ ++static int acx100_resume(struct pci_dev *pdev) ++{ ++ struct net_device *dev = pci_get_drvdata(pdev); ++ /*@unused@*/ wlandevice_t *priv = dev->priv; ++ ++ FN_ENTER; ++ acxlog(L_STD, "acx100: unimplemented resume handler called for %p!\n", priv); ++#if NOT_NEEDED ++ /* we probably shouldn't do this, since suspend/resume calls ++ * remove_pci/probe_pci, so on resume our priv struct is unavailable ++ * and thus settings cannot be restored easily (would need to ++ * copy to temporary priv's for all cards we handle). ++ * Also, doing that causes an OOPS right now. ++ * All in all I guess PCI hotplug is supposed to take care of ++ * reloading all card parameters by calling the card startup script. ++ * I should really set up my driver installation properly, methinks ;-) ++ */ ++ acx100_update_card_settings(priv, 0, 0, 1); ++#endif ++ ++ FN_EXIT(0, 0); ++ return 0; ++} ++ ++#if THIS_IS_OLD_PM_STUFF_ISNT_IT ++static int acx100_pm_callback(struct pm_dev *pmdev, pm_request_t rqst, void *data) ++{ ++ int result = 0; ++ netdevice_t *dev = root_acx100_dev.newest; ++ wlandevice_t *priv = (wlandevice_t*)dev->priv; ++ client_t client; ++ ++ FN_ENTER; ++ ++ switch(rqst) ++ { ++ case PM_SUSPEND: /* OK, we got a suspend request */ ++ if (netif_running(dev) && netif_device_present(dev)) ++ netif_device_detach(dev); ++ ++ /* Cancel our association */ ++ if (acx100_transmit_disassoc(&client, priv) == 1) { ++ result = -EINVAL; ++ } ++ /* better wait for some time to make sure Tx is ++ * finished */ ++ current->state = TASK_UNINTERRUPTIBLE; ++ schedule_timeout(HZ / 4); ++ ++ /* Then we set our flag */ ++ acx100_set_status(priv, ISTATUS_0_STARTED); ++ ++ /* Close off IRQs */ ++ acx100_disable_irq(priv); ++ ++ /* Disable the Rx/Tx queues */ ++ acx100_issue_cmd(priv, ACX100_CMD_DISABLE_TX, NULL, 0, 5000); ++ acx100_issue_cmd(priv, ACX100_CMD_DISABLE_RX, NULL, 0, 5000); ++// acx100_issue_cmd(priv, ACX100_CMD_FLUSH_QUEUE, NULL, 0, 5000); ++ ++ /* disable power LED to save power */ ++ acxlog(L_INIT, "switching off power LED to save power. :-)\n"); ++ acx100_power_led(priv, 0); ++ ++ printk("Asked to suspend: %X\n", rqst); ++ /* Now shut off everything else */ ++ if (0 == acx100_issue_cmd(priv, ACX100_CMD_SLEEP, NULL, 0, 5000)) ++ { ++ result = -EBUSY; ++ } else ++ { ++ result = 0; ++ break; ++ } ++ case PM_RESUME: ++ pm_access(priv->pm); ++#ifndef RESUME_STANDBY_ONLY ++ /* not sure whether we actually had our power ++ * removed or not, so let's do a full reset! */ ++ acx100_reset_dev(dev); ++#else ++ acx100_issue_cmd(priv, ACX100_CMD_WAKE, NULL, 0, 5000); ++ ++ acx100_issue_cmd(priv, ACX100_CMD_ENABLE_TX, NULL, 0, 5000); ++ acx100_issue_cmd(priv, ACX100_CMD_ENABLE_RX, NULL, 0, 5000); ++#endif ++ ++ acx100_enable_irq(priv); ++// acx100_join_bssid(priv); ++ acx100_set_status(priv, ISTATUS_0_STARTED); ++ printk("Asked to resume: %X\n", rqst); ++ if (netif_running(dev) && !netif_device_present(dev)) ++ netif_device_attach(dev); ++ break; ++ default: ++ printk("Asked for PM: %X\n", rqst); ++ result = -EINVAL; ++ break; ++ } ++ FN_EXIT(1, result); ++ return result; ++} ++#endif ++ ++/*---------------------------------------------------------------- ++* acx100_up ++* ++* ++* Arguments: ++* dev: netdevice structure that contains the private priv ++* Returns: ++* void ++* Side effects: ++* - Enables on-card interrupt requests ++* - calls acx100_start ++* Call context: ++* - process thread ++* STATUS: ++* stable ++* Comment: ++* This function is called by acx100_open (when ifconfig sets the ++* device as up). ++*----------------------------------------------------------------*/ ++static void acx100_up(netdevice_t *dev) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ ++ FN_ENTER; ++ ++ acx100_enable_irq(priv); ++ if ((priv->firmware_numver >= 0x0109030e) || (priv->chip_type == CHIPTYPE_ACX111) ) /* FIXME: first version? */ { ++ /* newer firmware versions don't use a hardware timer any more */ ++ acxlog(L_INIT, "firmware version >= 1.9.3.e --> using software timer\n"); ++ init_timer(&priv->mgmt_timer); ++ priv->mgmt_timer.function = acx100_timer; ++ priv->mgmt_timer.data = (unsigned long)priv; ++ } ++ else { ++ acxlog(L_INIT, "firmware version < 1.9.3.e --> using hardware timer\n"); ++ } ++ acx100_start(priv); ++ acxlog(L_XFER, "start queue on startup.\n"); ++ netif_start_queue(dev); ++ ++ FN_EXIT(0, 0); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_down ++* ++* ++* Arguments: ++* dev: netdevice structure that contains the private priv ++* Returns: ++* void ++* Side effects: ++* - disables on-card interrupt request ++* Call context: ++* process thread ++* STATUS: ++* stable ++* Comment: ++* this disables the netdevice ++*----------------------------------------------------------------*/ ++static void acx100_down(netdevice_t *dev) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ ++ FN_ENTER; ++ ++ acxlog(L_XFER, "stop queue during close.\n"); ++ netif_stop_queue(dev); ++ acx100_set_status(priv, ISTATUS_0_STARTED); ++ ++ if ((priv->firmware_numver >= 0x0109030e) || (priv->chip_type == CHIPTYPE_ACX111)) /* FIXME: first version? */ ++ { /* newer firmware versions don't use a hardware timer any more */ ++ del_timer_sync(&priv->mgmt_timer); ++ } ++ acx100_disable_irq(priv); ++ FN_EXIT(0, 0); ++} ++ ++ ++/*---------------------------------------------------------------- ++* acx100_open ++* ++* WLAN device open method. Called from p80211netdev when kernel ++* device open (start) method is called in response to the ++* SIOCSIFFLAGS ioctl changing the flags bit IFF_UP ++* from clear to set. ++* ++* Arguments: ++* dev network device structure ++* ++* Returns: ++* 0 success ++* >0 f/w reported error ++* <0 driver reported error ++* ++* Side effects: ++* ++* Call context: ++* process thread ++* STATUS: should be ok. ++----------------------------------------------------------------*/ ++ ++static int acx100_open(netdevice_t *dev) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ int result; ++ unsigned long flags; ++ ++ FN_ENTER; ++ ++ if (0 != acx100_lock(priv, &flags)) { ++ acxlog(L_INIT, "card unavailable, bailing\n"); ++ result = -ENODEV; ++ goto done; ++ } ++ /* request shared IRQ handler */ ++ if (0 != request_irq(dev->irq, acx100_interrupt, SA_SHIRQ, dev->name, dev)) { ++ acxlog(L_BINSTD | L_INIT | L_IRQ, "request_irq failed\n"); ++ result = -EAGAIN; ++ goto done; ++ } ++ acx100_up(dev); ++ ++ priv->dev_state_mask |= ACX_STATE_IFACE_UP; ++ ++ acxlog(L_INIT, "module count ++\n"); ++ WLAN_MOD_INC_USE_COUNT; ++ result = 0; ++ ++ /* We don't currently have to do anything else. ++ * The setup of the MAC should be subsequently completed via ++ * the mlme commands. ++ * Higher layers know we're ready from dev->start==1 and ++ * dev->tbusy==0. Our rx path knows to pass up received/ ++ * frames because of dev->flags&IFF_UP is true. ++ */ ++done: ++ acx100_unlock(priv, &flags); ++ FN_EXIT(1, result); ++ return result; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_close ++* ++* WLAN device close method. Called from p80211netdev when kernel ++* device close method is called in response to the ++* SIOCSIIFFLAGS ioctl changing the flags bit IFF_UP ++* from set to clear. ++* (i.e. called for "ifconfig DEV down") ++* ++* Arguments: ++* dev network device structure ++* ++* Returns: ++* 0 success ++* >0 f/w reported error ++* <0 driver reported error ++* ++* Side effects: ++* ++* Call context: ++* process thread ++* ++* STATUS: Should be pretty much perfect now. ++----------------------------------------------------------------*/ ++ ++static int acx100_close(netdevice_t *dev) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ ++ FN_ENTER; ++ ++ /* don't use acx100_lock() here: need to close card even in case ++ * of hw_unavailable set (card ejected) */ ++#ifdef BROKEN_LOCKING ++ spin_lock_irq(&priv->lock); ++#endif ++ ++ priv->dev_state_mask &= ~ACX_STATE_IFACE_UP; ++ ++ if (0 != netif_device_present(dev)) { ++ acx100_down(dev); ++ } ++ ++ free_irq(dev->irq, dev); ++ /* priv->val0x240c = 0; */ ++ ++ /* We currently don't have to do anything else. ++ * Higher layers know we're not ready from dev->start==0 and ++ * dev->tbusy==1. Our rx path knows to not pass up received ++ * frames because of dev->flags&IFF_UP is false. ++ */ ++ ++ acxlog(L_INIT, "module count --\n"); ++ WLAN_MOD_DEC_USE_COUNT; ++#ifdef BROKEN_LOCKING ++ spin_unlock_irq(&priv->lock); ++#endif ++ ++ FN_EXIT(0, 0); ++ return 0; ++} ++/*---------------------------------------------------------------- ++* acx100_start_xmit ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++static int acx100_start_xmit(struct sk_buff *skb, netdevice_t *dev) ++{ ++ int txresult = 0; ++ unsigned long flags; ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++// wlan_pb_t *pb; ++// wlan_pb_t pb1; ++ struct txdescriptor *tx_desc; ++ unsigned int templen; ++ ++// pb = &pb1; ++ ++ FN_ENTER; ++ ++ if (!skb) { ++ return 0; ++ } ++ if (!priv) { ++ return 1; ++ } ++ if (0 == (priv->dev_state_mask & ACX_STATE_IFACE_UP)) { ++ return 1; ++ } ++ ++ if (0 != acx100_lock(priv, &flags)) ++ return 1; ++ ++ if (0 != netif_queue_stopped(dev)) { ++ acxlog(L_BINSTD, "%s: called when queue stopped\n", __func__); ++ txresult = 1; ++ goto fail; ++ } ++ ++ if (ISTATUS_4_ASSOCIATED != priv->status) { ++ acxlog(L_XFER, "Trying to xmit, but not associated yet: aborting...\n"); ++ /* silently drop the packet, since we're not connected yet */ ++ dev_kfree_skb(skb); ++ priv->stats.tx_errors++; ++ txresult = 0; ++ goto fail; ++ } ++ ++#if 0 ++ /* we're going to transmit now, so stop another packet from entering. ++ * FIXME: most likely we shouldn't do it like that, but instead: ++ * stop the queue during card init, then wake the queue once ++ * we're associated to the network, then stop the queue whenever ++ * we don't have any free Tx buffers left, and wake it again once a ++ * Tx buffer becomes free again. And of course also stop the ++ * queue once we lose association to the network (since it ++ * doesn't make sense to allow more user packets if we can't ++ * forward them to a network). ++ * FIXME: Hmm, seems this is all wrong. We SHOULD leave the ++ * queue open from the beginning (as long as we're not full, ++ * and also even before we're even associated), ++ * otherwise we'll get NETDEV WATCHDOG transmit timeouts... */ ++ acxlog(L_XFER, "stop queue during Tx.\n"); ++ netif_stop_queue(dev); ++#endif ++#if UNUSED ++ if (acx100_lock(priv,&flags)) ... ++ ++ memset(pb, 0, sizeof(wlan_pb_t) /*0x14*4 */ ); ++ ++ pb->ethhostbuf = skb; ++ pb->ethbuf = skb->data; ++#endif ++ ++ templen = skb->len; ++/* if (templen > ETH_FRAME_LEN) { ++ templen = ETH_FRAME_LEN; ++ } ++ pb->ethbuflen = templen; ++ pb->ethfrmlen = templen; ++ ++ pb->eth_hdr = (wlan_ethhdr_t *) pb->ethbuf; ++ */ ++ if ((tx_desc = acx100_get_tx_desc(priv)) == NULL){ ++ acxlog(L_BINSTD,"BUG: txdesc ring full\n"); ++ txresult = 1; ++ goto fail; ++ } ++ ++ acx100_ether_to_txdesc(priv, tx_desc, skb); ++ acx100_dma_tx_data(priv, tx_desc); ++ dev->trans_start = jiffies; ++ ++ dev_kfree_skb(skb); ++ ++/* if (txresult == 1){ ++ return 1; ++ } */ ++ ++ /* tx_desc = &priv->dc.pTxDescQPool[priv->dc.pool_idx]; */ ++#if 0 ++ /* if((tx_desc->Ctl & 0x80) != 0){ */ ++ acxlog(L_XFER, "wake queue after Tx start.\n"); ++ netif_wake_queue(dev); ++ /* } */ ++#endif ++ priv->stats.tx_packets++; ++ priv->stats.tx_bytes += templen; ++ ++fail: ++ acx100_unlock(priv, &flags); ++ ++ FN_EXIT(1, txresult); ++ return txresult; ++} ++/*---------------------------------------------------------------- ++* acx100_tx_timeout ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_tx_timeout() ++ * STATUS: ok. ++ */ ++static void acx100_tx_timeout(netdevice_t *dev) ++{ ++// char tmp[4]; ++/* dev->trans_start = jiffies; ++ netif_wake_queue(dev); ++*/ ++ ++// ctlCmdFlushTxQueue((wlandevice_t*)dev->priv,(memmap_t*)&tmp); ++ FN_ENTER; ++ acxlog(L_STD, "Tx timeout!\n"); ++ ((wlandevice_t *)dev->priv)->stats.tx_errors++; ++ FN_EXIT(0, 0); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_get_stats ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_get_stats() ++ * STATUS: should be ok.. ++ */ ++static struct net_device_stats *acx100_get_stats(netdevice_t *dev) ++{ ++ wlandevice_t *priv = (wlandevice_t *)dev->priv; ++ FN_ENTER; ++ FN_EXIT(1, (int)&priv->stats); ++ return &priv->stats; ++} ++/*---------------------------------------------------------------- ++* acx100_get_wireless_stats ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++static struct iw_statistics *acx100_get_wireless_stats(netdevice_t *dev) ++{ ++ wlandevice_t *priv = (wlandevice_t *)dev->priv; ++ FN_ENTER; ++ FN_EXIT(1, (int)&priv->wstats); ++ return &priv->wstats; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_set_rx_mode ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++static void acx100_set_rx_mode(/*@unused@*/ netdevice_t *netdev) ++{ ++ FN_ENTER; ++ FN_EXIT(0, 0); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_enable_irq ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++void acx100_enable_irq(wlandevice_t *priv) ++{ ++ FN_ENTER; ++#if (WLAN_HOSTIF!=WLAN_USB) ++ acx100_write_reg16(priv, priv->io[IO_ACX_IRQ_MASK], priv->irq_mask); ++ acx100_write_reg16(priv, priv->io[IO_ACX_FEMR], 0x8000); ++#endif ++ FN_EXIT(0, 0); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_disable_irq ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++void acx100_disable_irq(wlandevice_t *priv) ++{ ++ FN_ENTER; ++#if (WLAN_HOSTIF!=WLAN_USB) ++ acx100_write_reg16(priv, priv->io[IO_ACX_IRQ_MASK], 0x7fff); ++ acx100_write_reg16(priv, priv->io[IO_ACX_FEMR], 0x0); ++#endif ++ FN_EXIT(0, 0); ++} ++ ++void acx100_handle_info_irq(wlandevice_t *priv) ++{ ++ acx100_get_info_state(priv); ++ acxlog(L_STD | L_IRQ, "Got Info IRQ: type 0x%04x, status 0x%04x\n", priv->info_type, priv->info_status); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_interrupt ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++irqreturn_t acx100_interrupt(/*@unused@*/ int irq, void *dev_id, /*@unused@*/ struct pt_regs *regs) ++{ ++ wlandevice_t *priv = (wlandevice_t *) (((netdevice_t *) dev_id)->priv); ++ UINT16 irqtype; ++ int irqcount = MAX_IRQLOOPS_PER_JIFFY; ++ static unsigned long entry_count = 0; ++ static int loops_this_jiffy = 0; ++ static unsigned long last_irq_jiffies = 0; ++ ++ FN_ENTER; ++ ++ irqtype = acx100_read_reg16(priv, priv->io[IO_ACX_IRQ_STATUS_CLEAR]); ++ if (0xffff == irqtype) ++ { ++ /* 0xffff value hints at missing hardware, ++ * so don't do anything. ++ * FIXME: that's not very clean - maybe we are able to ++ * establish a flag which definitely tells us that some ++ * hardware is absent and which we could check here? */ ++ FN_EXIT(0, 0); ++ return IRQ_NONE; ++ } ++ ++ irqtype &= ~(priv->irq_mask); /* check only "interesting" IRQ types */ ++ pm_access(priv->pm); ++ /* immediately return if we don't get signalled that an interrupt ++ * has occurred that we are interested in (interrupt sharing ++ * with other cards!) */ ++ if (0 == irqtype) { ++ acxlog(L_IRQ, "IRQTYPE: %X, irq_mask: %X\n", irqtype, priv->irq_mask); ++ FN_EXIT(0, 0); ++ return IRQ_NONE; ++ } ++ else ++ { ++ entry_count++; ++ acxlog(L_IRQ, "IRQTYPE: %X, irq_mask: %X, entry count: %ld\n", irqtype, priv->irq_mask, entry_count); ++ } ++// if (acx100_lock(priv,&flags)) ... ++#define IRQ_ITERATE 1 ++#if IRQ_ITERATE ++ if (jiffies != last_irq_jiffies) ++ loops_this_jiffy = 0; ++ last_irq_jiffies = jiffies; ++ ++ while ((irqtype != 0) && (irqcount-- > 0)) { ++ if (++loops_this_jiffy > MAX_IRQLOOPS_PER_JIFFY) { ++ acxlog(-1, "HARD ERROR: Too many interrupts this jiffy\n"); ++ priv->irq_mask = 0; ++ break; ++ } ++#endif ++ ++ /* do most important IRQ types first */ ++ if (0 != (irqtype & 0x8)) { ++ acx100_process_rx_desc(priv); ++ acx100_write_reg16(priv, priv->io[IO_ACX_IRQ_ACK], 0x8); ++ } ++ if (0 != (irqtype & 0x2)) { ++ acx100_clean_tx_desc(priv); ++ acx100_write_reg16(priv, priv->io[IO_ACX_IRQ_ACK], 0x2); ++#if 0 ++/* this shouldn't happen here generally, since we'd also enable user packet ++ * xmit for management packets, which we really DON'T want */ ++/* BS: disabling this caused my card to stop working after a few ++ * seconds when floodpinging. This should be reinvestigated ! */ ++ if (netif_queue_stopped(dev_id)) { ++ acxlog(L_XFER, "wake queue after Tx complete.\n"); ++ netif_wake_queue(dev_id); ++ } ++#endif ++ } ++ /* group all further IRQ types to improve performance */ ++ if (0 != (irqtype & 0x00f5)) { ++ if (0 != (irqtype & 0x1)) { ++ (void)printk("Got Rx Data IRQ\n"); ++ acx100_write_reg16(priv, priv->io[IO_ACX_IRQ_ACK], 0x1); ++ } ++ if (0 != (irqtype & 0x4)) { ++ (void)printk("Got Tx Xfer IRQ\n"); ++ acx100_write_reg16(priv, priv->io[IO_ACX_IRQ_ACK], 0x4); ++ } ++ if (0 != (irqtype & 0x10)) { ++ (void)printk("Got DTIM IRQ\n"); ++ acx100_write_reg16(priv, priv->io[IO_ACX_IRQ_ACK], 0x10); ++ } ++ if (0 != (irqtype & 0x20)) { ++ (void)printk("Got Beacon IRQ\n"); ++ acx100_write_reg16(priv, priv->io[IO_ACX_IRQ_ACK], 0x20); ++ } ++ if (0 != (irqtype & HOST_INT_TIMER) /* 0x40 */ ) { ++ acx100_timer((unsigned long)priv); ++ acx100_write_reg16(priv, priv->io[IO_ACX_IRQ_ACK], HOST_INT_TIMER); ++ } ++ if (0 != (irqtype & 0x80)) { ++ (void)printk("Got Key Not Found IRQ\n"); ++ acx100_write_reg16(priv, priv->io[IO_ACX_IRQ_ACK], 0x80); ++ } ++ } ++ if (0 != (irqtype & 0x0f00)) { ++ if (0 != (irqtype & 0x100)) { ++ (void)printk("Got IV ICV Failure IRQ\n"); ++ acx100_write_reg16(priv, priv->io[IO_ACX_IRQ_ACK], 0x100); ++ } ++ if (0 != (irqtype & 0x200)) { ++ (void)printk("Got Command Complete IRQ\n"); ++ acx100_write_reg16(priv, priv->io[IO_ACX_IRQ_ACK], 0x200); ++ } ++ if (0 != (irqtype & 0x400)) { ++ acx100_handle_info_irq(priv); ++ acx100_write_reg16(priv, priv->io[IO_ACX_IRQ_ACK], 0x400); ++ } ++ if (0 != (irqtype & 0x800)) { ++ (void)printk("Got Overflow IRQ\n"); ++ acx100_write_reg16(priv, priv->io[IO_ACX_IRQ_ACK], 0x800); ++ } ++ } ++ if (0 != (irqtype & 0xf000)) { ++ if (0 != (irqtype & 0x1000)) { ++ (void)printk("Got Process Error IRQ\n"); ++ acx100_write_reg16(priv, priv->io[IO_ACX_IRQ_ACK], 0x1000); ++ } ++ if (0 != (irqtype & HOST_INT_SCAN_COMPLETE) /* 0x2000 */ ) { ++ /* V1_3CHANGE: dbg msg only in V1 */ ++ acxlog(L_IRQ, ++ "<%s> HOST_INT_SCAN_COMPLETE\n", __func__); ++ ++ if (priv->status == ISTATUS_5_UNKNOWN) { ++ acx100_set_status(priv, priv->unknown0x2350); ++ priv->unknown0x2350 = 0; ++ } else if (priv->status == ISTATUS_1_SCANNING) { ++ ++ /* FIXME: this shouldn't be done in IRQ context !!! */ ++ acx100_complete_dot11_scan(priv); ++ } ++ acx100_write_reg16(priv, priv->io[IO_ACX_IRQ_ACK], HOST_INT_SCAN_COMPLETE); ++ } ++ if (0 != (irqtype & 0x4000)) { ++ (void)printk("Got FCS Threshold IRQ\n"); ++ acx100_write_reg16(priv, priv->io[IO_ACX_IRQ_ACK], 0x4000); ++ } ++ if (0 != (irqtype & 0x8000)) { ++ (void)printk("Got Unknown IRQ\n"); ++ acx100_write_reg16(priv, priv->io[IO_ACX_IRQ_ACK], 0x8000); ++ } ++ } ++// acx100_write_reg16(priv, priv->io[IO_ACX_IRQ_ACK], irqtype); ++#if IRQ_ITERATE ++ irqtype = acx100_read_reg16(priv, priv->io[IO_ACX_IRQ_STATUS_CLEAR]) & ~(priv->irq_mask); ++ if (0 != irqtype) { ++ acxlog(L_IRQ, "IRQTYPE: %X\n", irqtype); ++ } ++ } ++#endif ++ ++// acx100_unlock(priv,&flags); ++ entry_count--; ++ FN_EXIT(0, 0); ++ return IRQ_HANDLED; ++} ++ ++/*------------------------------------------------------------------------------ ++ * acx100_rx ++ * ++ * The end of the Rx path. Pulls data from a rxhostdescriptor into a socket ++ * buffer and feeds it to the network stack via netif_rx(). ++ * ++ * Arguments: ++ * rxdesc: the rxhostdecriptor to pull the data from ++ * priv: the acx100 private struct of the interface ++ * ++ * Returns: ++ * ++ * Side effects: ++ * ++ * Call context: ++ * ++ * STATUS: ++ * *much* better now, maybe finally bug-free, VERIFIED. ++ * ++ * Comment: ++ * ++ *----------------------------------------------------------------------------*/ ++void acx100_rx(struct rxhostdescriptor *rxdesc, wlandevice_t *priv) ++{ ++ struct sk_buff *skb; ++ ++ FN_ENTER; ++ if (0 != (priv->dev_state_mask & ACX_STATE_IFACE_UP)) { ++ if ((skb = acx100_rxdesc_to_ether(priv, rxdesc))) { ++ netdevice_t *dev = priv->netdev; ++ ++ skb->dev = dev; ++ skb->protocol = eth_type_trans(skb, dev); ++ dev->last_rx = jiffies; ++ ++ (void)netif_rx(skb); ++ ++ priv->stats.rx_packets++; ++ priv->stats.rx_bytes += skb->len; ++ } ++ } ++ FN_EXIT(0, 0); ++} ++ ++/*---------------------------------------------------------------- ++* init_module ++* ++* Module initialization routine, called once at module load time. ++* This one simulates some of the pcmcia calls. ++* ++* Arguments: ++* none ++* ++* Returns: ++* 0 - success ++* ~0 - failure, module is unloaded. ++* ++* Side effects: ++* alot ++* ++* Call context: ++* process thread (insmod or modprobe) ++* STATUS: should be ok.. NONV3. ++----------------------------------------------------------------*/ ++ ++#ifdef MODULE ++ ++#ifdef ACX_DEBUG ++MODULE_PARM(debug, "i"); ++MODULE_PARM_DESC(debug, "Debug level mask: 0x0000 - 0x3fff (see L_xxx in include/acx100.h)"); ++#endif ++ ++/*@-fullinitblock@*/ ++MODULE_PARM(use_eth_name, "i"); ++MODULE_PARM_DESC(use_eth_name, "Allocate device ethX instead of wlanX"); ++MODULE_PARM(firmware_dir, "s"); ++MODULE_PARM_DESC(firmware_dir, "Directory where to load acx100 firmware files from"); ++/*@=fullinitblock@*/ ++ ++static int __init acx100_init_module(void) ++{ ++ int res; ++ ++ FN_ENTER; ++ ++ acxlog(L_STD, ++ "acx100: It looks like you were coaxed into buying a wireless network card\n"); ++ acxlog(L_STD, ++ "acx100: that uses the mysterious ACX100 chip from Texas Instruments.\n"); ++ acxlog(L_STD, ++ "acx100: You should better have bought e.g. a PRISM(R) chipset based card,\n"); ++ acxlog(L_STD, ++ "acx100: since that would mean REAL vendor Linux support.\n"); ++ acxlog(L_STD, ++ "acx100: Given this info, it's evident that this driver is quite EXPERIMENTAL,\n"); ++ acxlog(L_STD, ++ "acx100: thus your mileage may vary. Visit http://acx100.sf.net for support.\n"); ++ ++ acxlog(L_BINDEBUG, "%s: dev_info is: %s\n", __func__, dev_info); ++ acxlog(L_STD|L_INIT, "%s: %s Driver initialized, waiting for cards to probe...\n", __func__, version); ++ ++ res = pci_module_init(&acx100_pci_drv_id); ++ FN_EXIT(1, res); ++ return res; ++} ++ ++/*---------------------------------------------------------------- ++* cleanup_module ++* ++* Called at module unload time. This is our last chance to ++* clean up after ourselves. ++* ++* Arguments: ++* none ++* ++* Returns: ++* nothing ++* ++* Side effects: ++* alot ++* ++* Call context: ++* process thread ++* ++* STATUS: should be ok. ++----------------------------------------------------------------*/ ++ ++static void __exit acx100_cleanup_module(void) ++{ ++ struct net_device *dev; ++ char procbuf[80]; ++ ++ FN_ENTER; ++ ++ /* Since the whole module is about to be unloaded, ++ * we recursively shutdown all cards we handled instead ++ * of doing it in remove_pci() (which will be activated by us ++ * via pci_unregister_driver at the end). ++ * remove_pci() might just get called after a card eject, ++ * that's why hardware operations have to be done here instead ++ * when the hardware is available. */ ++ ++ dev = (struct net_device *) root_acx100_dev.newest; ++ while (dev != NULL) { ++ wlandevice_t *priv = (struct wlandevice *) dev->priv; ++ ++ sprintf(procbuf, "driver/acx_%s_phy", dev->name); ++ acxlog(L_INIT, "removing /proc entry %s\n", procbuf); ++ remove_proc_entry(procbuf, NULL); ++ sprintf(procbuf, "driver/acx_%s_eeprom", dev->name); ++ acxlog(L_INIT, "removing /proc entry %s\n", procbuf); ++ remove_proc_entry(procbuf, NULL); ++ sprintf(procbuf, "driver/acx_%s_diag", dev->name); ++ acxlog(L_INIT, "removing /proc entry %s\n", procbuf); ++ remove_proc_entry(procbuf, NULL); ++ sprintf(procbuf, "driver/acx_%s", dev->name); ++ acxlog(L_INIT, "removing /proc entry %s\n", procbuf); ++ remove_proc_entry(procbuf, NULL); ++ ++ /* disable both Tx and Rx to shut radio down properly */ ++ acx100_issue_cmd(priv, ACX100_CMD_DISABLE_TX, NULL, 0, 5000); ++ acx100_issue_cmd(priv, ACX100_CMD_DISABLE_RX, NULL, 0, 5000); ++ ++ /* disable power LED to save power :-) */ ++ acxlog(L_INIT, "switching off power LED to save power. :-)\n"); ++ acx100_power_led(priv, (UINT8)0); ++ ++#if REDUNDANT ++ /* put the eCPU to sleep to save power ++ * Halting is not possible currently, ++ * since not supported by all firmware versions */ ++ acx100_issue_cmd(priv, ACX100_CMD_SLEEP, NULL, 0, 5000); ++#endif ++ ++ /* stop our ecpu */ ++ if(priv->chip_type == CHIPTYPE_ACX111) { ++ /* FIXME: does this actually keep halting the eCPU? ++ * I don't think so... ++ */ ++ acx100_reset_mac(priv); ++ } ++ else if (priv->chip_type == CHIPTYPE_ACX100) { ++ UINT16 temp; ++ ++ /* halt eCPU */ ++ temp = acx100_read_reg16(priv, priv->io[IO_ACX_ECPU_CTRL]) | 0x1; ++ acx100_write_reg16(priv, priv->io[IO_ACX_ECPU_CTRL], temp); ++ ++ } ++ ++ dev = priv->prev_nd; ++ } ++ ++ acx_free_io_register_arrays(); ++ ++ /* now let the pci layer recursively remove all PCI related things ++ * (acx100_remove_pci()) */ ++ pci_unregister_driver(&acx100_pci_drv_id); ++ ++ FN_EXIT(0, 0); ++} ++ ++module_init(acx100_init_module); ++module_exit(acx100_cleanup_module); ++ ++#else ++static int __init acx_get_firmware_dir(char *str) ++{ ++ /* I've seen other drivers just pass the string pointer, ++ * so hopefully that's safe */ ++ firmware_dir = str; ++ return 1; ++} ++ ++__setup("acx_firmware_dir=", acx_get_firmware_dir); ++#endif /* MODULE */ +diff -urN x/drivers/net/wireless/acx/acx100.h y/drivers/net/wireless/acx/acx100.h +--- x/drivers/net/wireless/acx/acx100.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/acx/acx100.h 2004-04-14 02:14:15.000000000 +1000 +@@ -0,0 +1,2784 @@ ++/* include/acx100.h ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Copyright (C) 2003 ACX100 Open Source Project ++ * ++ * The contents of this file are subject to the Mozilla Public ++ * License Version 1.1 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS ++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or ++ * implied. See the License for the specific language governing ++ * rights and limitations under the License. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU Public License version 2 (the "GPL"), in which ++ * case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use ++ * your version of this file under the MPL, indicate your decision ++ * by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL. If you do not delete ++ * the provisions above, a recipient may use your version of this ++ * file under either the MPL or the GPL. ++ * ++ * -------------------------------------------------------------------- ++ * ++ * This code is based on elements which are ++ * Copyright (C) 1999 AbsoluteValue Systems, Inc. All Rights Reserved. ++ * info@linux-wlan.com ++ * http://www.linux-wlan.com ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Inquiries regarding the ACX100 Open Source Project can be ++ * made directly to: ++ * ++ * acx100-users@lists.sf.net ++ * http://acx100.sf.net ++ * ++ * -------------------------------------------------------------------- ++ */ ++ ++#ifndef _ACX100_H ++#define _ACX100_H ++ ++ ++#if (WLAN_HOSTIF==WLAN_USB) ++#include ++#endif ++ ++/*============================================================================* ++ * Debug / log functionality * ++ *============================================================================*/ ++ ++/* NOTE: If we still want basic logging of driver info if ACX_DEBUG is not ++ * defined, we should provide an acxlog variant that is never turned off. We ++ * should make a acx_msg(), and rename acxlog() to acx_debug() to make the ++ * difference very clear. ++ */ ++ ++#ifdef ACX_DEBUG ++ ++#define L_STD 0x01 /* standard logging that really should be there, ++ like error messages etc. */ ++#define L_INIT 0x02 /* special card initialisation logging */ ++#define L_IRQ 0x04 /* interrupt stuff */ ++#define L_ASSOC 0x08 /* assocation (network join) and station log */ ++#define L_BIN 0x10 /* original messages from binary drivers */ ++#define L_FUNC 0x20 /* logging of function enter / leave */ ++#define L_STATE 0x40 /* log of function implementation state */ ++#define L_XFER 0x80 /* logging of transfers and mgmt */ ++#define L_DATA 0x100 /* logging of transfer data */ ++#define L_DEBUG 0x200 /* log of debug info */ ++#define L_IOCTL 0x400 /* log ioctl calls */ ++#define L_CTL 0x800 /* log of low-level ctl commands */ ++#define L_BUF 0x1000 /* debug buffer mgmt (ring buffer etc.) */ ++#define L_XFER_BEACON 0x2000 /* also log beacon packets */ ++ ++#define L_BINDEBUG (L_BIN | L_DEBUG) ++#define L_BINSTD (L_BIN | L_STD) ++ ++#define L_ALL (L_STD | L_INIT | L_IRQ | L_ASSOC | L_BIN | L_FUNC | \ ++ L_STATE | L_XFER | L_DATA | L_DEBUG | L_IOCTL | L_CTL) ++ ++extern int debug; ++extern int acx100_debug_func_indent; ++ ++#define acxlog(chan, args...) \ ++ if (debug & (chan)) \ ++ printk(KERN_WARNING args) ++ ++#define FUNC_INDENT_INCREMENT 2 ++ ++#define FN_ENTER \ ++ do { \ ++ if (debug & L_FUNC) { \ ++ int i; \ ++ for (i = 0; i < acx100_debug_func_indent; i++) \ ++ printk(" "); \ ++ printk("==> %s\n", __func__); \ ++ acx100_debug_func_indent += FUNC_INDENT_INCREMENT; \ ++ } \ ++ } while (0) ++ ++#define FN_EXIT(p, v) \ ++ do { \ ++ if (debug & L_FUNC) { \ ++ int i; \ ++ acx100_debug_func_indent -= FUNC_INDENT_INCREMENT; \ ++ for (i = 0; i < acx100_debug_func_indent; i++) \ ++ printk(" "); \ ++ if (p) { \ ++ printk("<== %s: %08x\n", __func__, v); \ ++ } else { \ ++ printk("<== %s\n", __func__); \ ++ } \ ++ } \ ++ } while (0) ++ ++#else /* ACX_DEBUG */ ++ ++#define acxlog(chan, args...) ++#define FN_ENTER ++#define FN_EXIT(p, v) ++ ++#endif /* ACX_DEBUG */ ++ ++#define MAC_COPY(dst, src) \ ++ *(UINT32 *)dst = *(UINT32 *)src; \ ++ *(UINT16 *)(((UINT8 *)dst)+4) = *(UINT16 *)(((UINT8 *)src)+4); \ ++ ++#define MAC_COPY_UNUSED1(dst, src) \ ++{ \ ++ int i; \ ++ for (i = 0; i < ETH_ALEN; i++) \ ++ *(((UINT8 *)dst)+i) = *(((UINT8 *)src)+i); \ ++} ++ ++#define MAC_COPY_UNUSED2(dst, src) memcpy(dst, src, ETH_ALEN); ++ ++#define MAC_FILL(dst, val) \ ++{ \ ++ int i; \ ++ for (i = 0; i < ETH_ALEN; i++) \ ++ *(((UINT8 *)dst)+i) = val; \ ++} ++ ++#define MAC_BCAST(dst) MAC_FILL(dst, 0xff) ++ ++/*============================================================================* ++ * Constants * ++ *============================================================================*/ ++ ++/*--- Mins & Maxs ------------------------------------------------------------*/ ++#define ACX100_CMD_ALLOC_LEN_MIN ((UINT16)4) ++#define ACX100_CMD_ALLOC_LEN_MAX ((UINT16)2400) ++#define ACX100_BAP_DATALEN_MAX ((UINT16)4096) ++#define ACX100_BAP_OFFSET_MAX ((UINT16)4096) ++#define ACX100_PORTID_MAX ((UINT16)7) ++#define ACX100_NUMPORTS_MAX ((UINT16)(ACX100_PORTID_MAX+1)) ++#define ACX100_PDR_LEN_MAX ((UINT16)512) /* in bytes, from EK */ ++#define ACX100_PDA_RECS_MAX ((UINT16)200) /* a guess */ ++#define ACX100_PDA_LEN_MAX ((UINT16)1024) /* in bytes, from EK */ ++#define ACX100_SCANRESULT_MAX ((UINT16)31) ++#define ACX100_HSCANRESULT_MAX ((UINT16)31) ++#define ACX100_CHINFORESULT_MAX ((UINT16)16) ++#define ACX100_DRVR_FIDSTACKLEN_MAX 10 ++#define ACX100_DRVR_TXBUF_MAX (sizeof(acx100_tx_frame_t) \ ++ + WLAN_DATA_MAXLEN \ ++ - WLAN_WEP_IV_LEN \ ++ - WLAN_WEP_ICV_LEN \ ++ + 2) ++#define ACX100_DRVR_MAGIC 0x4a2d ++#define ACX100_INFODATA_MAXLEN sizeof(acx100_infodata_t) ++#define ACX100_INFOFRM_MAXLEN sizeof(acx100_InfFrame_t) ++#define ACX100_RID_GUESSING_MAXLEN 2048 /* I'm not really sure */ ++#define ACX100_RIDDATA_MAXLEN ACX100_RID_GUESSING_MAXLEN ++#define ACX100_USB_RWMEM_MAXLEN 2048 ++ ++/* The supported chip models */ ++#define CHIPTYPE_ACX100 1 ++#define CHIPTYPE_ACX111 2 ++ ++/*--- Support Constants ------------------------------------------------------*/ ++#define ACX100_BAP_PROC ((UINT16)0) ++#define ACX100_BAP_INT ((UINT16)1) ++#define ACX100_PORTTYPE_IBSS ((UINT16)0) ++#define ACX100_PORTTYPE_BSS ((UINT16)1) ++#define ACX100_PORTTYPE_WDS ((UINT16)2) ++#define ACX100_WEPFLAGS_PRIVINVOKED ((UINT16)BIT0) ++#define ACX100_WEPFLAGS_EXCLUDE ((UINT16)BIT1) ++#define ACX100_WEPFLAGS_DISABLE_TXCRYPT ((UINT16)BIT4) ++#define ACX100_WEPFLAGS_DISABLE_RXCRYPT ((UINT16)BIT7) ++#define ACX100_WEPFLAGS_IV_INTERVAL1 ((UINT16)0) ++#define ACX100_WEPFLAGS_IV_INTERVAL10 ((UINT16)BIT5) ++#define ACX100_WEPFLAGS_IV_INTERVAL50 ((UINT16)BIT6) ++#define ACX100_WEPFLAGS_IV_INTERVAL100 ((UINT16)(BIT5 | BIT6)) ++#define ACX100_ROAMMODE_FWSCAN_FWROAM ((UINT16)1) ++#define ACX100_ROAMMODE_FWSCAN_HOSTROAM ((UINT16)2) ++#define ACX100_ROAMMODE_HOSTSCAN_HOSTROAM ((UINT16)3) ++#define ACX100_PORTSTATUS_DISABLED ((UINT16)1) ++#define ACX100_PORTSTATUS_INITSRCH ((UINT16)2) ++#define ACX100_PORTSTATUS_CONN_IBSS ((UINT16)3) ++#define ACX100_PORTSTATUS_CONN_ESS ((UINT16)4) ++#define ACX100_PORTSTATUS_OOR_ESS ((UINT16)5) ++#define ACX100_PORTSTATUS_CONN_WDS ((UINT16)6) ++#define ACX100_PORTSTATUS_HOSTAP ((UINT16)8) ++#define ACX100_RATEBIT_1 ((UINT16)1) ++#define ACX100_RATEBIT_2 ((UINT16)2) ++#define ACX100_RATEBIT_5dot5 ((UINT16)4) ++#define ACX100_RATEBIT_11 ((UINT16)8) ++ ++#define ACX_PCI 0 ++#define ACX_CARDBUS 1 ++ ++/* Radio type names, found in Win98 driver's TIACXLN.INF */ ++#define RADIO_MAXIM_0D 0x0d ++#define RADIO_RFMD_11 0x11 ++#define RADIO_RALINK_15 0x15 ++#define RADIO_UNKNOWN_16 0x16 /* used in ACX111 cards */ ++#define RADIO_UNKNOWN_17 0x17 /* most likely *sometimes* used in ACX111 cards */ ++ ++/*--- IRQ Constants ----------------------------------------------------------*/ ++#define HOST_INT_TIMER 0x40 ++#define HOST_INT_SCAN_COMPLETE 0x2000 /* official name */ ++ ++/*--- MAC Internal memory constants and macros -------------------------------*/ ++/* Masks and macros used to manipulate MAC internal memory addresses. MAC ++ * internal memory addresses are 23 bit quantities. The MAC uses a paged ++ * address space where the upper 16 bits are the page number and the lower 7 ++ * bits are the offset. There are various Host API elements that require two ++ * 16-bit quantities to specify a MAC internal memory address. Unfortunately, ++ * some of the API's use a page/offset format where the offset value is JUST ++ * the lower 7 bits and the page is the remaining 16 bits. Some of the APIs ++ * assume that the 23 bit address has been split at the 16th bit. We refer to ++ * these two formats as AUX format and CMD format. The macros below help ++ * handle some of this. ++ */ ++ ++/* Handy constant */ ++#define ACX100_ADDR_AUX_OFF_MAX ((UINT16)0x007f) ++ ++/* Mask bits for discarding unwanted pieces in a flat address */ ++#define ACX100_ADDR_FLAT_AUX_PAGE_MASK 0x007fff80 ++#define ACX100_ADDR_FLAT_AUX_OFF_MASK 0x0000007f ++#define ACX100_ADDR_FLAT_CMD_PAGE_MASK 0xffff0000 ++#define ACX100_ADDR_FLAT_CMD_OFF_MASK 0x0000ffff ++ ++/* Mask bits for discarding unwanted pieces in AUX format 16-bit address parts */ ++#define ACX100_ADDR_AUX_PAGE_MASK 0xffff ++#define ACX100_ADDR_AUX_OFF_MASK 0x007f ++ ++/* Mask bits for discarding unwanted pieces in CMD format 16-bit address parts */ ++#define ACX100_ADDR_CMD_PAGE_MASK 0x007f ++#define ACX100_ADDR_CMD_OFF_MASK 0xffff ++ ++/* Make a 32-bit flat address from AUX format 16-bit page and offset */ ++#define ACX100_ADDR_AUX_MKFLAT(p,o) \ ++ (((UINT32)(((UINT16)(p)) & ACX100_ADDR_AUX_PAGE_MASK)) << 7) \ ++ | ((UINT32)(((UINT16)(o)) & ACX100_ADDR_AUX_OFF_MASK)) ++ ++/* Make a 32-bit flat address from CMD format 16-bit page and offset */ ++#define ACX100_ADDR_CMD_MKFLAT(p,o) \ ++ (((UINT32)(((UINT16)(p)) & ACX100_ADDR_CMD_PAGE_MASK)) << 16) \ ++ | ((UINT32)(((UINT16)(o)) & ACX100_ADDR_CMD_OFF_MASK)) ++ ++/* Make AUX format offset and page from a 32-bit flat address */ ++#define ACX100_ADDR_AUX_MKPAGE(f) \ ++ ((UINT16)((((UINT32)(f)) & ACX100_ADDR_FLAT_AUX_PAGE_MASK) >> 7)) ++#define ACX100_ADDR_AUX_MKOFF(f) \ ++ ((UINT16)(((UINT32)(f)) & ACX100_ADDR_FLAT_AUX_OFF_MASK)) ++ ++/* Make CMD format offset and page from a 32-bit flat address */ ++#define ACX100_ADDR_CMD_MKPAGE(f) \ ++ ((UINT16)((((UINT32)(f)) & ACX100_ADDR_FLAT_CMD_PAGE_MASK) >> 16)) ++#define ACX100_ADDR_CMD_MKOFF(f) \ ++ ((UINT16)(((UINT32)(f)) & ACX100_ADDR_FLAT_CMD_OFF_MASK)) ++ ++/*--- Aux register masks/tests -----------------------------------------------*/ ++/* Some of the upper bits of the AUX offset register are used to select address ++ * space. */ ++#define ACX100_AUX_CTL_EXTDS 0x00 ++#define ACX100_AUX_CTL_NV 0x01 ++#define ACX100_AUX_CTL_PHY 0x02 ++#define ACX100_AUX_CTL_ICSRAM 0x03 ++ ++/* Make AUX register offset and page values from a flat address */ ++#define ACX100_AUX_MKOFF(f, c) \ ++ (ACX100_ADDR_AUX_MKOFF(f) | (((UINT16)(c)) << 12)) ++#define ACX100_AUX_MKPAGE(f) ACX100_ADDR_AUX_MKPAGE(f) ++ ++/*--- Controller Memory addresses --------------------------------------------*/ ++#define HFA3842_PDA_BASE 0x007f0000UL ++#define HFA3841_PDA_BASE 0x003f0000UL ++#define HFA3841_PDA_BOGUS_BASE 0x00390000UL ++ ++/*--- Driver Download states ------------------------------------------------*/ ++#define ACX100_DLSTATE_DISABLED 0 ++#define ACX100_DLSTATE_RAMENABLED 1 ++#define ACX100_DLSTATE_FLASHENABLED 2 ++#define ACX100_DLSTATE_FLASHWRITTEN 3 ++#define ACX100_DLSTATE_FLASHWRITEPENDING 4 ++ ++/*--- Register I/O offsets ---------------------------------------------------*/ ++ ++/* please add further ACX1XX hardware register definitions only when ++ it turns out you need them in the driver, and please try to use ++ firmware functionality instead, since using direct I/O access instead ++ of letting the firmware do it might confuse the firmware's state ++ machine */ ++ ++typedef enum { ++ IO_ACX_SOFT_RESET = 0, ++ ++ IO_ACX_SLV_MEM_ADDR, ++ IO_ACX_SLV_MEM_DATA, ++ IO_ACX_SLV_MEM_CTL, ++ IO_ACX_SLV_END_CTL, ++ ++ IO_ACX_FEMR, /* Function Event Mask */ ++ ++ IO_ACX_ECPU_CTRL, ++ IO_ACX_SOR_CFG, ++ IO_ACX_EE_START, ++ ++ IO_ACX_INT_TRIG, ++ IO_ACX_IRQ_MASK, ++ IO_ACX_IRQ_STATUS_NON_DES, ++ IO_ACX_IRQ_STATUS_CLEAR, /* CLEAR = clear on read */ ++ IO_ACX_IRQ_ACK, ++ IO_ACX_HINT_TRIG, ++ ++ IO_ACX_ENABLE, ++ ++ IO_ACX_EEPROM_CTL, ++ IO_ACX_EEPROM_CFG, ++ IO_ACX_EEPROM_ADDR, ++ IO_ACX_EEPROM_DATA, ++ ++ IO_ACX_PHY_ADDR, ++ IO_ACX_PHY_DATA, ++ IO_ACX_PHY_CTL, ++ ++ IO_ACX_GPIO_OE, ++ ++ IO_ACX_CMD_MAILBOX_OFFS, ++ IO_ACX_INFO_MAILBOX_OFFS, ++ IO_ACX_EEPROM_INFORMATION, ++ ++ END_OF_IO_ENUM /* LEAVE THIS AT THE END, USED TO FIGURE OUT THE LENGTH */ ++ ++} IO_INDICES; ++ ++#define IO_INDICES_SIZE END_OF_IO_ENUM * sizeof(UINT16) ++ ++/*--- EEPROM offsets ---------------------------------------------------------*/ ++#define ACX100_EEPROM_ID_OFFSET 0x380 ++ ++/*--- Command Code Constants -------------------------------------------------*/ ++ ++/*--- Controller Commands ----------------------------------------------------*/ ++/* can be found in table cmdTable in firmware "Rev. 1.5.0" (FW150) */ ++#define ACX100_CMD_RESET 0x00 ++#define ACX100_CMD_INTERROGATE 0x01 ++#define ACX100_CMD_CONFIGURE 0x02 ++#define ACX100_CMD_ENABLE_RX 0x03 ++#define ACX100_CMD_ENABLE_TX 0x04 ++#define ACX100_CMD_DISABLE_RX 0x05 ++#define ACX100_CMD_DISABLE_TX 0x06 ++#define ACX100_CMD_FLUSH_QUEUE 0x07 ++#define ACX100_CMD_SCAN 0x08 ++#define ACX100_CMD_STOP_SCAN 0x09 ++#define ACX100_CMD_CONFIG_TIM 0x0a ++#define ACX100_CMD_JOIN 0x0b ++#define ACX100_CMD_WEP_MGMT 0x0c ++#define ACX100_CMD_HALT 0x0e /* mapped to unknownCMD in FW150 */ ++#define ACX100_CMD_SLEEP 0x0f ++#define ACX100_CMD_WAKE 0x10 ++#define ACX100_CMD_UNKNOWN_11 0x11 /* mapped to unknownCMD in FW150 */ ++#define ACX100_CMD_INIT_MEMORY 0x12 ++#define ACX100_CMD_CONFIG_BEACON 0x13 ++#define ACX100_CMD_CONFIG_PROBE_RESPONSE 0x14 ++#define ACX100_CMD_CONFIG_NULL_DATA 0x15 ++#define ACX100_CMD_CONFIG_PROBE_REQUEST 0x16 ++#define ACX100_CMD_TEST 0x17 ++#define ACX100_CMD_RADIOINIT 0x18 ++ ++ ++/*--- Buffer Management Commands ---------------------------------------------*/ ++ ++/*--- Regulate Commands ------------------------------------------------------*/ ++ ++/*--- Configure Commands -----------------------------------------------------*/ ++ ++/*--- Debugging Commands -----------------------------------------------------*/ ++ ++/*--- Result Codes -----------------------------------------------------------*/ ++ ++/*--- Programming Modes ------------------------------------------------------*/ ++/* MODE 0: Disable programming ++ * MODE 1: Enable volatile memory programming ++ * MODE 2: Enable non-volatile memory programming ++ * MODE 3: Program non-volatile memory section ++ */ ++ ++/*--- AUX register enable ----------------------------------------------------*/ ++ ++/*============================================================================* ++ * Record ID Constants * ++ *============================================================================*/ ++ ++/*--- Configuration RIDs: Network Parameters, Static Configuration Entities --*/ ++/* these are handled by real_cfgtable in firmware "Rev 1.5.0" (FW150) */ ++#define ACX100_RID_UNKNOWN_00 0x00 /* mapped to cfgInvalid in FW150 */ ++#define ACX100_RID_ACX_TIMER 0x01 ++#define ACX100_RID_POWER_MGMT 0x02 ++#define ACX100_RID_QUEUE_CONFIG 0x03 ++#define ACX100_RID_BLOCK_SIZE 0x04 ++#define ACX100_RID_MEMORY_CONFIG_OPTIONS 0x05 ++#define ACX100_RID_RATE_FALLBACK 0x06 ++#define ACX100_RID_WEP_OPTIONS 0x07 ++#define ACX100_RID_MEMORY_MAP 0x08 /* huh? */ ++#define ACX100_RID_SSID 0x08 /* huh? */ ++#define ACX100_RID_SCAN_STATUS 0x09 /* mapped to cfgInvalid in FW150 */ ++#define ACX100_RID_ASSOC_ID 0x0a ++#define ACX100_RID_UNKNOWN_0B 0x0b /* mapped to cfgInvalid in FW150 */ ++#define ACX100_RID_UNKNOWN_0C 0x0c /* very small implementation in FW150! */ ++#define ACX100_RID_FWREV 0x0d ++#define ACX100_RID_FCS_ERROR_COUNT 0x0e ++#define ACX100_RID_MEDIUM_USAGE 0x0f ++#define ACX100_RID_RXCONFIG 0x10 ++#define ACX100_RID_UNKNOWN_11 0x11 /* NONBINARY: large implementation in FW150! link quality readings or so? */ ++#define ACX100_RID_UNKNOWN_12 0x12 /* NONBINARY: VERY large implementation in FW150!! maybe monitor mode??? :-) */ ++#define ACX100_RID_FIRMWARE_STATISTICS 0x13 ++#define ACX100_RID_DOT11_STATION_ID 0x1001 ++#define ACX100_RID_DOT11_UNKNOWN_1002 0x1002 /* mapped to cfgInvalid in FW150 */ ++#define ACX100_RID_DOT11_BEACON_PERIOD 0x1003 /* mapped to cfgInvalid in FW150 */ ++#define ACX100_RID_DOT11_DTIM_PERIOD 0x1004 /* mapped to cfgInvalid in FW150 */ ++#define ACX100_RID_DOT11_SHORT_RETRY_LIMIT 0x1005 ++#define ACX100_RID_DOT11_LONG_RETRY_LIMIT 0x1006 ++#define ACX100_RID_DOT11_WEP_KEY 0x1007 ++#define ACX100_RID_DOT11_MAX_XMIT_MSDU_LIFETIME 0x1008 ++#define ACX100_RID_DOT11_UNKNOWN_1009 0x1009 /* mapped to some very boring binary table in FW150 */ ++#define ACX100_RID_DOT11_CURRENT_REG_DOMAIN 0x100a ++#define ACX100_RID_DOT11_CURRENT_ANTENNA 0x100b ++#define ACX100_RID_DOT11_UNKNOWN_100C 0x100c /* mapped to cfgInvalid in FW150 */ ++#define ACX100_RID_DOT11_TX_POWER_LEVEL 0x100d ++#define ACX100_RID_DOT11_CURRENT_CCA_MODE 0x100e ++#define ACX100_RID_DOT11_ED_THRESHOLD 0x100f ++#define ACX100_RID_DOT11_WEP_DEFAULT_KEY_SET 0x1010 ++#define ACX100_RID_DOT11_UNKNOWN_1011 0x1011 /* mapped to cfgInvalid in FW150 */ ++#define ACX100_RID_DOT11_UNKNOWN_1012 0x1012 /* mapped to cfgInvalid in FW150 */ ++#define ACX100_RID_DOT11_UNKNOWN_1013 0x1013 /* mapped to cfgInvalid in FW150 */ ++ ++/*--- Configuration RID Lengths: Network Params, Static Config Entities -----*/ ++/* This is the length of JUST the DATA part of the RID (does not include the ++ * len or code fields) */ ++ ++/* TODO: fill in the rest of these */ ++#define ACX100_RID_ACX_TIMER_LEN 0x10 ++#define ACX100_RID_POWER_MGMT_LEN 0x06 ++#define ACX100_RID_QUEUE_CONFIG_LEN 0x1c ++#define ACX100_RID_BLOCK_SIZE_LEN 0x02 ++#define ACX100_RID_MEMORY_CONFIG_OPTIONS_LEN 0x14 ++#define ACX100_RID_RATE_FALLBACK_LEN 0x01 ++#define ACX100_RID_WEP_OPTIONS_LEN 0x03 ++#define ACX100_RID_MEMORY_MAP_LEN 0x28 ++#define ACX100_RID_SSID_LEN 0x20 ++#define ACX100_RID_ASSOC_ID_LEN 0x02 ++#define ACX100_RID_FWREV_LEN 0x18 ++#define ACX100_RID_FCS_ERROR_COUNT_LEN 0x04 ++#define ACX100_RID_MEDIUM_USAGE_LEN 0x08 ++#define ACX100_RID_RXCONFIG_LEN 0x04 ++#define ACX100_RID_FIRMWARE_STATISTICS_LEN 0x9c ++#define ACX100_RID_DOT11_STATION_ID_LEN 0x06 ++#define ACX100_RID_DOT11_BEACON_PERIOD_LEN 0x02 ++#define ACX100_RID_DOT11_DTIM_PERIOD_LEN 0x01 ++#define ACX100_RID_DOT11_SHORT_RETRY_LIMIT_LEN 0x01 ++#define ACX100_RID_DOT11_LONG_RETRY_LIMIT_LEN 0x01 ++#define ACX100_RID_DOT11_WEP_KEY_LEN 0x09 ++#define ACX100_RID_DOT11_WEP_DEFAULT_KEY_LEN 0x20 ++#define ACX100_RID_DOT11_MAX_XMIT_MSDU_LIFETIME_LEN 0x04 ++#define ACX100_RID_DOT11_CURRENT_REG_DOMAIN_LEN 0x02 ++#if (WLAN_HOSTIF==WLAN_USB) ++#define ACX100_RID_DOT11_CURRENT_ANTENNA_LEN 0x02 ++#else ++#define ACX100_RID_DOT11_CURRENT_ANTENNA_LEN 0x01 ++#endif ++#define ACX100_RID_DOT11_TX_POWER_LEVEL_LEN 0x01 ++#define ACX100_RID_DOT11_CURRENT_CCA_MODE_LEN 0x01 ++#define ACX100_RID_DOT11_ED_THRESHOLD_LEN 0x04 ++#define ACX100_RID_DOT11_WEP_DEFAULT_KEY_SET_LEN 0x01 ++#define ACX100_RID_SCAN_STATUS_LEN 0x04 ++ ++/*--- Configuration RIDs: Network Parameters, Dynamic Configuration Entities -*/ ++#define ACX100_RID_GROUPADDR ((UINT16)0xFC80) ++#define ACX100_RID_CREATEIBSS ((UINT16)0xFC81) ++#define ACX100_RID_FRAGTHRESH ((UINT16)0xFC82) ++#define ACX100_RID_RTSTHRESH ((UINT16)0xFC83) ++#define ACX100_RID_TXRATECNTL ((UINT16)0xFC84) ++#define ACX100_RID_PROMISCMODE ((UINT16)0xFC85) ++#define ACX100_RID_FRAGTHRESH0 ((UINT16)0xFC90) ++#define ACX100_RID_FRAGTHRESH1 ((UINT16)0xFC91) ++#define ACX100_RID_FRAGTHRESH2 ((UINT16)0xFC92) ++#define ACX100_RID_FRAGTHRESH3 ((UINT16)0xFC93) ++#define ACX100_RID_FRAGTHRESH4 ((UINT16)0xFC94) ++#define ACX100_RID_FRAGTHRESH5 ((UINT16)0xFC95) ++#define ACX100_RID_FRAGTHRESH6 ((UINT16)0xFC96) ++#define ACX100_RID_RTSTHRESH0 ((UINT16)0xFC97) ++#define ACX100_RID_RTSTHRESH1 ((UINT16)0xFC98) ++#define ACX100_RID_RTSTHRESH2 ((UINT16)0xFC99) ++#define ACX100_RID_RTSTHRESH3 ((UINT16)0xFC9A) ++#define ACX100_RID_RTSTHRESH4 ((UINT16)0xFC9B) ++#define ACX100_RID_RTSTHRESH5 ((UINT16)0xFC9C) ++#define ACX100_RID_RTSTHRESH6 ((UINT16)0xFC9D) ++#define ACX100_RID_TXRATECNTL0 ((UINT16)0xFC9E) ++#define ACX100_RID_TXRATECNTL1 ((UINT16)0xFC9F) ++#define ACX100_RID_TXRATECNTL2 ((UINT16)0xFCA0) ++#define ACX100_RID_TXRATECNTL3 ((UINT16)0xFCA1) ++#define ACX100_RID_TXRATECNTL4 ((UINT16)0xFCA2) ++#define ACX100_RID_TXRATECNTL5 ((UINT16)0xFCA3) ++#define ACX100_RID_TXRATECNTL6 ((UINT16)0xFCA4) ++ ++/*--- Configuration RID Lengths: Network Params, Dynamic Config Entities -----*/ ++/* This is the length of JUST the DATA part of the RID (does not include the ++ * len or code fields) */ ++ ++/* TODO: fill in the rest of these */ ++#define ACX100_RID_GROUPADDR_LEN ((UINT16)16 * ETH_ALEN) ++#define ACX100_RID_CREATEIBSS_LEN ((UINT16)0) ++#define ACX100_RID_FRAGTHRESH_LEN ((UINT16)0) ++#define ACX100_RID_RTSTHRESH_LEN ((UINT16)0) ++#define ACX100_RID_TXRATECNTL_LEN ((UINT16)4) ++#define ACX100_RID_PROMISCMODE_LEN ((UINT16)2) ++#define ACX100_RID_FRAGTHRESH0_LEN ((UINT16)0) ++#define ACX100_RID_FRAGTHRESH1_LEN ((UINT16)0) ++#define ACX100_RID_FRAGTHRESH2_LEN ((UINT16)0) ++#define ACX100_RID_FRAGTHRESH3_LEN ((UINT16)0) ++#define ACX100_RID_FRAGTHRESH4_LEN ((UINT16)0) ++#define ACX100_RID_FRAGTHRESH5_LEN ((UINT16)0) ++#define ACX100_RID_FRAGTHRESH6_LEN ((UINT16)0) ++#define ACX100_RID_RTSTHRESH0_LEN ((UINT16)0) ++#define ACX100_RID_RTSTHRESH1_LEN ((UINT16)0) ++#define ACX100_RID_RTSTHRESH2_LEN ((UINT16)0) ++#define ACX100_RID_RTSTHRESH3_LEN ((UINT16)0) ++#define ACX100_RID_RTSTHRESH4_LEN ((UINT16)0) ++#define ACX100_RID_RTSTHRESH5_LEN ((UINT16)0) ++#define ACX100_RID_RTSTHRESH6_LEN ((UINT16)0) ++#define ACX100_RID_TXRATECNTL0_LEN ((UINT16)0) ++#define ACX100_RID_TXRATECNTL1_LEN ((UINT16)0) ++#define ACX100_RID_TXRATECNTL2_LEN ((UINT16)0) ++#define ACX100_RID_TXRATECNTL3_LEN ((UINT16)0) ++#define ACX100_RID_TXRATECNTL4_LEN ((UINT16)0) ++#define ACX100_RID_TXRATECNTL5_LEN ((UINT16)0) ++#define ACX100_RID_TXRATECNTL6_LEN ((UINT16)0) ++ ++/*--- Configuration RIDs: Behavior Parameters --------------------------------*/ ++#define ACX100_RID_ITICKTIME ((UINT16)0xFCE0) ++ ++/*--- Configuration RID Lengths: Behavior Parameters -------------------------*/ ++/* This is the length of JUST the DATA part of the RID (does not include the ++ * len or code fields) */ ++#define ACX100_RID_ITICKTIME_LEN ((UINT16)2) ++ ++/*--- Information RIDs: NIC Information --------------------------------------*/ ++#define ACX100_RID_MAXLOADTIME ((UINT16)0xFD00) ++#define ACX100_RID_DOWNLOADBUFFER ((UINT16)0xFD01) ++#define ACX100_RID_PRIIDENTITY ((UINT16)0xFD02) ++#define ACX100_RID_PRISUPRANGE ((UINT16)0xFD03) ++#define ACX100_RID_PRI_CFIACTRANGES ((UINT16)0xFD04) ++#define ACX100_RID_NICSERIALNUMBER ((UINT16)0xFD0A) ++#define ACX100_RID_NICIDENTITY ((UINT16)0xFD0B) ++#define ACX100_RID_MFISUPRANGE ((UINT16)0xFD0C) ++#define ACX100_RID_CFISUPRANGE ((UINT16)0xFD0D) ++#define ACX100_RID_CHANNELLIST ((UINT16)0xFD10) ++#define ACX100_RID_REGULATORYDOMAINS ((UINT16)0xFD11) ++#define ACX100_RID_TEMPTYPE ((UINT16)0xFD12) ++#define ACX100_RID_CIS ((UINT16)0xFD13) ++#define ACX100_RID_STAIDENTITY ((UINT16)0xFD20) ++#define ACX100_RID_STASUPRANGE ((UINT16)0xFD21) ++#define ACX100_RID_STA_MFIACTRANGES ((UINT16)0xFD22) ++#define ACX100_RID_STA_CFIACTRANGES ((UINT16)0xFD23) ++#define ACX100_RID_BUILDSEQ ((UINT16)0xFFFE) ++#define ACX100_RID_FWID ((UINT16)0xFFFF) ++ ++/*--- Information RID Lengths: NIC Information -------------------------------*/ ++/* This is the length of JUST the DATA part of the RID (does not include the ++ * len or code fields) */ ++#define ACX100_RID_MAXLOADTIME_LEN ((UINT16)0) ++#define ACX100_RID_DOWNLOADBUFFER_LEN ((UINT16)sizeof(acx100_downloadbuffer_t)) ++#define ACX100_RID_PRIIDENTITY_LEN ((UINT16)8) ++#define ACX100_RID_PRISUPRANGE_LEN ((UINT16)10) ++#define ACX100_RID_CFIACTRANGES_LEN ((UINT16)10) ++#define ACX100_RID_NICSERIALNUMBER_LEN ((UINT16)12) ++#define ACX100_RID_NICIDENTITY_LEN ((UINT16)8) ++#define ACX100_RID_MFISUPRANGE_LEN ((UINT16)10) ++#define ACX100_RID_CFISUPRANGE_LEN ((UINT16)10) ++#define ACX100_RID_CHANNELLIST_LEN ((UINT16)0) ++#define ACX100_RID_REGULATORYDOMAINS_LEN ((UINT16)12) ++#define ACX100_RID_TEMPTYPE_LEN ((UINT16)0) ++#define ACX100_RID_CIS_LEN ((UINT16)480) ++#define ACX100_RID_STAIDENTITY_LEN ((UINT16)8) ++#define ACX100_RID_STASUPRANGE_LEN ((UINT16)10) ++#define ACX100_RID_MFIACTRANGES_LEN ((UINT16)10) ++#define ACX100_RID_CFIACTRANGES2_LEN ((UINT16)10) ++#define ACX100_RID_BUILDSEQ_LEN ((UINT16)sizeof(acx100_BuildSeq_t)) ++#define ACX100_RID_FWID_LEN ((UINT16)sizeof(acx100_FWID_t)) ++ ++/*--- Information RIDs: MAC Information --------------------------------------*/ ++#define ACX100_RID_PORTSTATUS ((UINT16)0xFD40) ++#define ACX100_RID_CURRENTSSID ((UINT16)0xFD41) ++#define ACX100_RID_CURRENTBSSID ((UINT16)0xFD42) ++#define ACX100_RID_COMMSQUALITY ((UINT16)0xFD43) ++#define ACX100_RID_CURRENTTXRATE ((UINT16)0xFD44) ++#define ACX100_RID_CURRENTBCNINT ((UINT16)0xFD45) ++#define ACX100_RID_CURRENTSCALETHRESH ((UINT16)0xFD46) ++#define ACX100_RID_PROTOCOLRSPTIME ((UINT16)0xFD47) ++#define ACX100_RID_SHORTRETRYLIMIT ((UINT16)0xFD48) ++#define ACX100_RID_LONGRETRYLIMIT ((UINT16)0xFD49) ++#define ACX100_RID_MAXTXLIFETIME ((UINT16)0xFD4A) ++#define ACX100_RID_MAXRXLIFETIME ((UINT16)0xFD4B) ++#define ACX100_RID_CFPOLLABLE ((UINT16)0xFD4C) ++#define ACX100_RID_AUTHALGORITHMS ((UINT16)0xFD4D) ++#define ACX100_RID_PRIVACYOPTIMP ((UINT16)0xFD4F) ++#define ACX100_RID_DBMCOMMSQUALITY ((UINT16)0xFD51) ++#define ACX100_RID_CURRENTTXRATE1 ((UINT16)0xFD80) ++#define ACX100_RID_CURRENTTXRATE2 ((UINT16)0xFD81) ++#define ACX100_RID_CURRENTTXRATE3 ((UINT16)0xFD82) ++#define ACX100_RID_CURRENTTXRATE4 ((UINT16)0xFD83) ++#define ACX100_RID_CURRENTTXRATE5 ((UINT16)0xFD84) ++#define ACX100_RID_CURRENTTXRATE6 ((UINT16)0xFD85) ++#define ACX100_RID_OWNMACADDRESS ((UINT16)0xFD86) ++/* #define ACX100_RID_PCFINFO ((UINT16)0xFD87) */ ++#define ACX100_RID_SCANRESULTS ((UINT16)0xFD88) /* NEW */ ++#define ACX100_RID_HOSTSCANRESULTS ((UINT16)0xFD89) /* NEW */ ++#define ACX100_RID_AUTHENTICATIONUSED ((UINT16)0xFD8A) /* NEW */ ++ ++/*--- Information RID Lengths: MAC Information -------------------------------*/ ++/* This is the length of JUST the DATA part of the RID (does not include the ++ * len or code fields) */ ++#define ACX100_RID_PORTSTATUS_LEN ((UINT16)0) ++#define ACX100_RID_CURRENTSSID_LEN ((UINT16)34) ++#define ACX100_RID_CURRENTBSSID_LEN ((UINT16)ETH_ALEN) ++#define ACX100_RID_COMMSQUALITY_LEN ((UINT16)sizeof(acx100_commsquality_t)) ++#define ACX100_RID_DBMCOMMSQUALITY_LEN ((UINT16)sizeof(acx100_dbmcommsquality_t)) ++#define ACX100_RID_CURRENTTXRATE_LEN ((UINT16)0) ++#define ACX100_RID_CURRENTBCNINT_LEN ((UINT16)0) ++#define ACX100_RID_STACURSCALETHRESH_LEN ((UINT16)12) ++#define ACX100_RID_APCURSCALETHRESH_LEN ((UINT16)6) ++#define ACX100_RID_PROTOCOLRSPTIME_LEN ((UINT16)0) ++#define ACX100_RID_SHORTRETRYLIMIT_LEN ((UINT16)0) ++#define ACX100_RID_LONGRETRYLIMIT_LEN ((UINT16)0) ++#define ACX100_RID_MAXTXLIFETIME_LEN ((UINT16)0) ++#define ACX100_RID_MAXRXLIFETIME_LEN ((UINT16)0) ++#define ACX100_RID_CFPOLLABLE_LEN ((UINT16)0) ++#define ACX100_RID_AUTHALGORITHMS_LEN ((UINT16)4) ++#define ACX100_RID_PRIVACYOPTIMP_LEN ((UINT16)0) ++#define ACX100_RID_CURRENTTXRATE1_LEN ((UINT16)0) ++#define ACX100_RID_CURRENTTXRATE2_LEN ((UINT16)0) ++#define ACX100_RID_CURRENTTXRATE3_LEN ((UINT16)0) ++#define ACX100_RID_CURRENTTXRATE4_LEN ((UINT16)0) ++#define ACX100_RID_CURRENTTXRATE5_LEN ((UINT16)0) ++#define ACX100_RID_CURRENTTXRATE6_LEN ((UINT16)0) ++#define ACX100_RID_OWNMACADDRESS_LEN ((UINT16)6) ++#define ACX100_RID_PCFINFO_LEN ((UINT16)6) ++#define ACX100_RID_CNFAPPCFINFO_LEN ((UINT16)sizeof(acx100_PCFInfo_data_t)) ++#define ACX100_RID_SCANREQUEST_LEN ((UINT16)sizeof(acx100_ScanRequest_data_t)) ++#define ACX100_RID_JOINREQUEST_LEN ((UINT16)sizeof(acx100_JoinRequest_data_t)) ++#define ACX100_RID_AUTHENTICATESTA_LEN ((UINT16)sizeof(acx100_authenticateStation_data_t)) ++#define ACX100_RID_CHANNELINFOREQUEST_LEN ((UINT16)sizeof(acx100_ChannelInfoRequest_data_t)) ++ ++/*--- Information RIDs: Modem Information ------------------------------------*/ ++#define ACX100_RID_PHYTYPE ((UINT16)0xFDC0) ++#define ACX100_RID_CURRENTCHANNEL ((UINT16)0xFDC1) ++#define ACX100_RID_CURRENTPOWERSTATE ((UINT16)0xFDC2) ++#define ACX100_RID_CCAMODE ((UINT16)0xFDC3) ++#define ACX100_RID_SUPPORTEDDATARATES ((UINT16)0xFDC6) ++ ++/*--- Information RID Lengths: Modem Information -----------------------------*/ ++/* This is the length of JUST the DATA part of the RID (does not include the ++ * len or code fields) */ ++#define ACX100_RID_PHYTYPE_LEN ((UINT16)0) ++#define ACX100_RID_CURRENTCHANNEL_LEN ((UINT16)0) ++#define ACX100_RID_CURRENTPOWERSTATE_LEN ((UINT16)0) ++#define ACX100_RID_CCAMODE_LEN ((UINT16)0) ++#define ACX100_RID_SUPPORTEDDATARATES_LEN ((UINT16)10) ++ ++/*--- API Enhancements (not yet implemented) ---------------------------------*/ ++#define ACX100_RID_CNFWEPDEFAULTKEYID ((UINT16)0xFC23) ++#define ACX100_RID_CNFWEPDEFAULTKEY0 ((UINT16)0xFC24) ++#define ACX100_RID_CNFWEPDEFAULTKEY1 ((UINT16)0xFC25) ++#define ACX100_RID_CNFWEPDEFAULTKEY2 ((UINT16)0xFC26) ++#define ACX100_RID_CNFWEPDEFAULTKEY3 ((UINT16)0xFC27) ++#define ACX100_RID_CNFWEPFLAGS ((UINT16)0xFC28) ++#define ACX100_RID_CNFWEPKEYMAPTABLE ((UINT16)0xFC29) ++#define ACX100_RID_CNFAUTHENTICATION ((UINT16)0xFC2A) ++#define ACX100_RID_CNFMAXASSOCSTATIONS ((UINT16)0xFC2B) ++#define ACX100_RID_CNFTXCONTROL ((UINT16)0xFC2C) ++#define ACX100_RID_CNFROAMINGMODE ((UINT16)0xFC2D) ++#define ACX100_RID_CNFHOSTAUTH ((UINT16)0xFC2E) ++#define ACX100_RID_CNFRCVCRCERROR ((UINT16)0xFC30) ++/* #define ACX100_RID_CNFMMLIFE ((UINT16)0xFC31) */ ++#define ACX100_RID_CNFALTRETRYCNT ((UINT16)0xFC32) ++#define ACX100_RID_CNFAPBCNINT ((UINT16)0xFC33) ++#define ACX100_RID_CNFAPPCFINFO ((UINT16)0xFC34) ++#define ACX100_RID_CNFSTAPCFINFO ((UINT16)0xFC35) ++#define ACX100_RID_CNFPRIORITYQUSAGE ((UINT16)0xFC37) ++#define ACX100_RID_CNFTIMCTRL ((UINT16)0xFC40) ++#define ACX100_RID_CNFTHIRTY2TALLY ((UINT16)0xFC42) ++#define ACX100_RID_CNFENHSECURITY ((UINT16)0xFC43) ++#define ACX100_RID_CNFDBMADJUST ((UINT16)0xFC46) /* NEW */ ++#define ACX100_RID_CNFSHORTPREAMBLE ((UINT16)0xFCB0) ++#define ACX100_RID_CNFEXCLONGPREAMBLE ((UINT16)0xFCB1) ++#define ACX100_RID_CNFAUTHRSPTIMEOUT ((UINT16)0xFCB2) ++#define ACX100_RID_CNFBASICRATES ((UINT16)0xFCB3) ++#define ACX100_RID_CNFSUPPRATES ((UINT16)0xFCB4) ++#define ACX100_RID_CNFFALLBACKCTRL ((UINT16)0xFCB5) /* NEW */ ++#define ACX100_RID_WEPKEYDISABLE ((UINT16)0xFCB6) /* NEW */ ++#define ACX100_RID_WEPKEYMAPINDEX ((UINT16)0xFCB7) /* NEW AP */ ++#define ACX100_RID_BROADCASTKEYID ((UINT16)0xFCB8) /* NEW AP */ ++#define ACX100_RID_ENTSECFLAGEYID ((UINT16)0xFCB9) /* NEW AP */ ++#define ACX100_RID_CNFPASSIVESCANCTRL ((UINT16)0xFCBA) /* NEW STA */ ++#define ACX100_RID_SCANREQUEST ((UINT16)0xFCE1) ++#define ACX100_RID_JOINREQUEST ((UINT16)0xFCE2) ++#define ACX100_RID_AUTHENTICATESTA ((UINT16)0xFCE3) ++#define ACX100_RID_CHANNELINFOREQUEST ((UINT16)0xFCE4) ++#define ACX100_RID_HOSTSCAN ((UINT16)0xFCE5) /* NEW STA */ ++ ++#define ACX100_RID_CNFWEPDEFAULTKEY_LEN ((UINT16)6) ++#define ACX100_RID_CNFWEP128DEFAULTKEY_LEN ((UINT16)14) ++#define ACX100_RID_CNFPRIOQUSAGE_LEN ((UINT16)4) ++ ++/*============================================================================* ++ * PD Record codes * ++ *============================================================================*/ ++ ++#define ACX100_PDR_PCB_PARTNUM ((UINT16)0x0001) ++#define ACX100_PDR_PDAVER ((UINT16)0x0002) ++#define ACX100_PDR_NIC_SERIAL ((UINT16)0x0003) ++#define ACX100_PDR_MKK_MEASUREMENTS ((UINT16)0x0004) ++#define ACX100_PDR_NIC_RAMSIZE ((UINT16)0x0005) ++#define ACX100_PDR_MFISUPRANGE ((UINT16)0x0006) ++#define ACX100_PDR_CFISUPRANGE ((UINT16)0x0007) ++#define ACX100_PDR_NICID ((UINT16)0x0008) ++#define ACX100_PDR_REFDAC_MEASUREMENTS ((UINT16)0x0010) ++#define ACX100_PDR_VGDAC_MEASUREMENTS ((UINT16)0x0020) ++#define ACX100_PDR_LEVEL_COMP_MEASUREMENTS ((UINT16)0x0030) ++#define ACX100_PDR_MODEM_TRIMDAC_MEASUREMENTS ((UINT16)0x0040) ++#define ACX100_PDR_COREGA_HACK ((UINT16)0x00ff) ++#define ACX100_PDR_MAC_ADDRESS ((UINT16)0x0101) ++#define ACX100_PDR_MKK_CALLNAME ((UINT16)0x0102) ++#define ACX100_PDR_REGDOMAIN ((UINT16)0x0103) ++#define ACX100_PDR_ALLOWED_CHANNEL ((UINT16)0x0104) ++#define ACX100_PDR_DEFAULT_CHANNEL ((UINT16)0x0105) ++#define ACX100_PDR_PRIVACY_OPTION ((UINT16)0x0106) ++#define ACX100_PDR_TEMPTYPE ((UINT16)0x0107) ++#define ACX100_PDR_REFDAC_SETUP ((UINT16)0x0110) ++#define ACX100_PDR_VGDAC_SETUP ((UINT16)0x0120) ++#define ACX100_PDR_LEVEL_COMP_SETUP ((UINT16)0x0130) ++#define ACX100_PDR_TRIMDAC_SETUP ((UINT16)0x0140) ++#define ACX100_PDR_IFR_SETTING ((UINT16)0x0200) ++#define ACX100_PDR_RFR_SETTING ((UINT16)0x0201) ++#define ACX100_PDR_HFA3861_BASELINE ((UINT16)0x0202) ++#define ACX100_PDR_HFA3861_SHADOW ((UINT16)0x0203) ++#define ACX100_PDR_HFA3861_IFRF ((UINT16)0x0204) ++#define ACX100_PDR_HFA3861_CHCALSP ((UINT16)0x0300) ++#define ACX100_PDR_HFA3861_CHCALI ((UINT16)0x0301) ++#define ACX100_PDR_3842_NIC_CONFIG ((UINT16)0x0400) ++#define ACX100_PDR_USB_ID ((UINT16)0x0401) ++#define ACX100_PDR_PCI_ID ((UINT16)0x0402) ++#define ACX100_PDR_PCI_IFCONF ((UINT16)0x0403) ++#define ACX100_PDR_PCI_PMCONF ((UINT16)0x0404) ++#define ACX100_PDR_RFENRGY ((UINT16)0x0406) ++#define ACX100_PDR_UNKNOWN407 ((UINT16)0x0407) ++#define ACX100_PDR_UNKNOWN408 ((UINT16)0x0408) ++#define ACX100_PDR_UNKNOWN409 ((UINT16)0x0409) ++#define ACX100_PDR_HFA3861_MANF_TESTSP ((UINT16)0x0900) ++#define ACX100_PDR_HFA3861_MANF_TESTI ((UINT16)0x0901) ++#define ACX100_PDR_END_OF_PDA ((UINT16)0x0000) ++ ++/*============================================================================* ++ * Macros * ++ *============================================================================*/ ++ ++/*--- Register ID macros -----------------------------------------------------*/ ++#define ACX100_CMD ACX100_CMD_OFF ++#define ACX100_PARAM0 ACX100_PARAM0_OFF ++#define ACX100_PARAM1 ACX100_PARAM1_OFF ++#define ACX100_PARAM2 ACX100_PARAM2_OFF ++#define ACX100_RESP0 ACX100_RESP0_OFF ++#define ACX100_RESP1 ACX100_RESP1_OFF ++#define ACX100_RESP2 ACX100_RESP2_OFF ++#define ACX100_INFOFID ACX100_INFOFID_OFF ++#define ACX100_RXFID ACX100_RXFID_OFF ++#define ACX100_ALLOCFID ACX100_ALLOCFID_OFF ++#define ACX100_TXCOMPLFID ACX100_TXCOMPLFID_OFF ++#define ACX100_SELECT0 ACX100_SELECT0_OFF ++#define ACX100_OFFSET0 ACX100_OFFSET0_OFF ++#define ACX100_DATA0 ACX100_DATA0_OFF ++#define ACX100_SELECT1 ACX100_SELECT1_OFF ++#define ACX100_OFFSET1 ACX100_OFFSET1_OFF ++#define ACX100_DATA1 ACX100_DATA1_OFF ++#define ACX100_EVSTAT ACX100_EVSTAT_OFF ++#define ACX100_INTEN ACX100_INTEN_OFF ++#define ACX100_EVACK ACX100_EVACK_OFF ++#define ACX100_CONTROL ACX100_CONTROL_OFF ++#define ACX100_SWSUPPORT0 ACX100_SWSUPPORT0_OFF ++#define ACX100_SWSUPPORT1 ACX100_SWSUPPORT1_OFF ++#define ACX100_SWSUPPORT2 ACX100_SWSUPPORT2_OFF ++#define ACX100_AUXPAGE ACX100_AUXPAGE_OFF ++#define ACX100_AUXOFFSET ACX100_AUXOFFSET_OFF ++#define ACX100_AUXDATA ACX100_AUXDATA_OFF ++#define ACX100_PCICOR ACX100_PCICOR_OFF ++ ++ ++/*--- Register Test/Get/Set Field macros -------------------------------------*/ ++#define ACX100_CMD_ISBUSY(value) ((UINT16)((UINT16)(value) & ACX100_CMD_BUSY)) ++#define ACX100_CMD_AINFO_GET(value) ((UINT16)(((UINT16)(value) & ACX100_CMD_AINFO) >> 8)) ++#define ACX100_CMD_AINFO_SET(value) ((UINT16)((UINT16)(value) << 8)) ++#define ACX100_CMD_MACPORT_GET(value) ((UINT16)(ACX100_CMD_AINFO_GET((UINT16)(value) & ACX100_CMD_MACPORT))) ++#define ACX100_CMD_MACPORT_SET(value) ((UINT16)ACX100_CMD_AINFO_SET(value)) ++#define ACX100_CMD_ISRECL(value) ((UINT16)(ACX100_CMD_AINFO_GET((UINT16)(value) & ACX100_CMD_RECL))) ++#define ACX100_CMD_RECL_SET(value) ((UINT16)ACX100_CMD_AINFO_SET(value)) ++#define ACX100_CMD_QOS_GET(value) ((UINT16)(((UINT16)(value) & 0x3000) >> 12)) ++#define ACX100_CMD_QOS_SET(value) ((UINT16)((((UINT16)(value)) << 12) & 0x3000)) ++#define ACX100_CMD_ISWRITE(value) ((UINT16)(ACX100_CMD_AINFO_GET((UINT16)(value) & ACX100_CMD_WRITE))) ++#define ACX100_CMD_WRITE_SET(value) ((UINT16)ACX100_CMD_AINFO_SET((UINT16)value)) ++#define ACX100_CMD_PROGMODE_GET(value) ((UINT16)(ACX100_CMD_AINFO_GET((UINT16)(value) & ACX100_CMD_PROGMODE))) ++#define ACX100_CMD_PROGMODE_SET(value) ((UINT16)ACX100_CMD_AINFO_SET((UINT16)value)) ++#define ACX100_CMD_CMDCODE_GET(value) ((UINT16)(((UINT16)(value)) & ACX100_CMD_CMDCODE)) ++#define ACX100_CMD_CMDCODE_SET(value) ((UINT16)(value)) ++ ++#define ACX100_STATUS_RESULT_GET(value) ((UINT16)((((UINT16)(value)) & ACX100_STATUS_RESULT) >> 8)) ++#define ACX100_STATUS_RESULT_SET(value) (((UINT16)(value)) << 8) ++#define ACX100_STATUS_CMDCODE_GET(value) (((UINT16)(value)) & ACX100_STATUS_CMDCODE) ++#define ACX100_STATUS_CMDCODE_SET(value) ((UINT16)(value)) ++ ++#define ACX100_OFFSET_ISBUSY(value) ((UINT16)(((UINT16)(value)) & ACX100_OFFSET_BUSY)) ++#define ACX100_OFFSET_ISERR(value) ((UINT16)(((UINT16)(value)) & ACX100_OFFSET_ERR)) ++#define ACX100_OFFSET_DATAOFF_GET(value) ((UINT16)(((UINT16)(value)) & ACX100_OFFSET_DATAOFF)) ++#define ACX100_OFFSET_DATAOFF_SET(value) ((UINT16)(value)) ++ ++#define ACX100_EVSTAT_ISTICK(value) ((UINT16)(((UINT16)(value)) & ACX100_EVSTAT_TICK)) ++#define ACX100_EVSTAT_ISWTERR(value) ((UINT16)(((UINT16)(value)) & ACX100_EVSTAT_WTERR)) ++#define ACX100_EVSTAT_ISINFDROP(value) ((UINT16)(((UINT16)(value)) & ACX100_EVSTAT_INFDROP)) ++#define ACX100_EVSTAT_ISINFO(value) ((UINT16)(((UINT16)(value)) & ACX100_EVSTAT_INFO)) ++#define ACX100_EVSTAT_ISDTIM(value) ((UINT16)(((UINT16)(value)) & ACX100_EVSTAT_DTIM)) ++#define ACX100_EVSTAT_ISCMD(value) ((UINT16)(((UINT16)(value)) & ACX100_EVSTAT_CMD)) ++#define ACX100_EVSTAT_ISALLOC(value) ((UINT16)(((UINT16)(value)) & ACX100_EVSTAT_ALLOC)) ++#define ACX100_EVSTAT_ISTXEXC(value) ((UINT16)(((UINT16)(value)) & ACX100_EVSTAT_TXEXC)) ++#define ACX100_EVSTAT_ISTX(value) ((UINT16)(((UINT16)(value)) & ACX100_EVSTAT_TX)) ++#define ACX100_EVSTAT_ISRX(value) ((UINT16)(((UINT16)(value)) & ACX100_EVSTAT_RX)) ++ ++#define ACX100_INTEN_ISTICK(value) ((UINT16)(((UINT16)(value)) & ACX100_INTEN_TICK)) ++#define ACX100_INTEN_TICK_SET(value) ((UINT16)(((UINT16)(value)) << 15)) ++#define ACX100_INTEN_ISWTERR(value) ((UINT16)(((UINT16)(value)) & ACX100_INTEN_WTERR)) ++#define ACX100_INTEN_WTERR_SET(value) ((UINT16)(((UINT16)(value)) << 14)) ++#define ACX100_INTEN_ISINFDROP(value) ((UINT16)(((UINT16)(value)) & ACX100_INTEN_INFDROP)) ++#define ACX100_INTEN_INFDROP_SET(value) ((UINT16)(((UINT16)(value)) << 13)) ++#define ACX100_INTEN_ISINFO(value) ((UINT16)(((UINT16)(value)) & ACX100_INTEN_INFO)) ++#define ACX100_INTEN_INFO_SET(value) ((UINT16)(((UINT16)(value)) << 7)) ++#define ACX100_INTEN_ISDTIM(value) ((UINT16)(((UINT16)(value)) & ACX100_INTEN_DTIM)) ++#define ACX100_INTEN_DTIM_SET(value) ((UINT16)(((UINT16)(value)) << 5)) ++#define ACX100_INTEN_ISCMD(value) ((UINT16)(((UINT16)(value)) & ACX100_INTEN_CMD)) ++#define ACX100_INTEN_CMD_SET(value) ((UINT16)(((UINT16)(value)) << 4)) ++#define ACX100_INTEN_ISALLOC(value) ((UINT16)(((UINT16)(value)) & ACX100_INTEN_ALLOC)) ++#define ACX100_INTEN_ALLOC_SET(value) ((UINT16)(((UINT16)(value)) << 3)) ++#define ACX100_INTEN_ISTXEXC(value) ((UINT16)(((UINT16)(value)) & ACX100_INTEN_TXEXC)) ++#define ACX100_INTEN_TXEXC_SET(value) ((UINT16)(((UINT16)(value)) << 2)) ++#define ACX100_INTEN_ISTX(value) ((UINT16)(((UINT16)(value)) & ACX100_INTEN_TX)) ++#define ACX100_INTEN_TX_SET(value) ((UINT16)(((UINT16)(value)) << 1)) ++#define ACX100_INTEN_ISRX(value) ((UINT16)(((UINT16)(value)) & ACX100_INTEN_RX)) ++#define ACX100_INTEN_RX_SET(value) ((UINT16)(((UINT16)(value)) << 0)) ++ ++#define ACX100_EVACK_ISTICK(value) ((UINT16)(((UINT16)(value)) & ACX100_EVACK_TICK)) ++#define ACX100_EVACK_TICK_SET(value) ((UINT16)(((UINT16)(value)) << 15)) ++#define ACX100_EVACK_ISWTERR(value) ((UINT16)(((UINT16)(value)) & ACX100_EVACK_WTERR)) ++#define ACX100_EVACK_WTERR_SET(value) ((UINT16)(((UINT16)(value)) << 14)) ++#define ACX100_EVACK_ISINFDROP(value) ((UINT16)(((UINT16)(value)) & ACX100_EVACK_INFDROP)) ++#define ACX100_EVACK_INFDROP_SET(value) ((UINT16)(((UINT16)(value)) << 13)) ++#define ACX100_EVACK_ISINFO(value) ((UINT16)(((UINT16)(value)) & ACX100_EVACK_INFO)) ++#define ACX100_EVACK_INFO_SET(value) ((UINT16)(((UINT16)(value)) << 7)) ++#define ACX100_EVACK_ISDTIM(value) ((UINT16)(((UINT16)(value)) & ACX100_EVACK_DTIM)) ++#define ACX100_EVACK_DTIM_SET(value) ((UINT16)(((UINT16)(value)) << 5)) ++#define ACX100_EVACK_ISCMD(value) ((UINT16)(((UINT16)(value)) & ACX100_EVACK_CMD)) ++#define ACX100_EVACK_CMD_SET(value) ((UINT16)(((UINT16)(value)) << 4)) ++#define ACX100_EVACK_ISALLOC(value) ((UINT16)(((UINT16)(value)) & ACX100_EVACK_ALLOC)) ++#define ACX100_EVACK_ALLOC_SET(value) ((UINT16)(((UINT16)(value)) << 3)) ++#define ACX100_EVACK_ISTXEXC(value) ((UINT16)(((UINT16)(value)) & ACX100_EVACK_TXEXC)) ++#define ACX100_EVACK_TXEXC_SET(value) ((UINT16)(((UINT16)(value)) << 2)) ++#define ACX100_EVACK_ISTX(value) ((UINT16)(((UINT16)(value)) & ACX100_EVACK_TX)) ++#define ACX100_EVACK_TX_SET(value) ((UINT16)(((UINT16)(value)) << 1)) ++#define ACX100_EVACK_ISRX(value) ((UINT16)(((UINT16)(value)) & ACX100_EVACK_RX)) ++#define ACX100_EVACK_RX_SET(value) ((UINT16)(((UINT16)(value)) << 0)) ++ ++#define ACX100_CONTROL_AUXEN_SET(value) ((UINT16)(((UINT16)(value)) << 14)) ++#define ACX100_CONTROL_AUXEN_GET(value) ((UINT16)(((UINT16)(value)) >> 14)) ++ ++/*--- Host Maintained State Info ---------------------------------------------*/ ++#define ACX100_STATE_PREINIT 0 ++#define ACX100_STATE_INIT 1 ++#define ACX100_STATE_RUNNING 2 ++ ++/*============================================================================* ++ * Types and their related constants * ++ *============================================================================*/ ++ ++/*--- Commonly used basic types ----------------------------------------------*/ ++typedef struct acx100_bytestr { ++ UINT16 len __WLAN_ATTRIB_PACK__; ++ UINT8 data[0] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_bytestr_t; ++ ++typedef struct acx100_bytestr32 { ++ UINT16 len __WLAN_ATTRIB_PACK__; ++ UINT8 data[32] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_bytestr32_t; ++ ++/*--- Configuration Record Structures: ---------------------------------------* ++ *--- Network Parameters, Static Configuration Entities ----------------------*/ ++ ++/*-- Prototype structure --*/ ++/* all configuration record structures start with these members */ ++typedef struct acx100_mem_t { ++ UINT base; ++ UINT len; ++ long time; ++} mem_t; ++ ++typedef struct acx100_record { ++ UINT16 reclen __WLAN_ATTRIB_PACK__; ++ UINT16 rid __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_rec_t; ++ ++typedef struct acx100_record16 { ++ UINT16 reclen __WLAN_ATTRIB_PACK__; ++ UINT16 rid __WLAN_ATTRIB_PACK__; ++ UINT16 val __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_rec16_t; ++ ++typedef struct acx100_record32 { ++ UINT16 reclen __WLAN_ATTRIB_PACK__; ++ UINT16 rid __WLAN_ATTRIB_PACK__; ++ UINT32 val __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_rec32; ++ ++/*-- Hardware/Firmware Component Information --*/ ++typedef struct acx100_compident { ++ UINT16 id __WLAN_ATTRIB_PACK__; ++ UINT16 variant __WLAN_ATTRIB_PACK__; ++ UINT16 major __WLAN_ATTRIB_PACK__; ++ UINT16 minor __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_compident_t; ++ ++typedef struct acx100_caplevel { ++ UINT16 role __WLAN_ATTRIB_PACK__; ++ UINT16 id __WLAN_ATTRIB_PACK__; ++ UINT16 variant __WLAN_ATTRIB_PACK__; ++ UINT16 bottom __WLAN_ATTRIB_PACK__; ++ UINT16 top __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_caplevel_t; ++ ++/*-- Configuration Record: cnfPortType --*/ ++typedef struct acx100_cnfPortType { ++ UINT16 cnfPortType __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_cnfPortType_t; ++ ++/*-- Configuration Record: cnfOwnMACAddress --*/ ++typedef struct acx100_cnfOwnMACAddress { ++ UINT8 cnfOwnMACAddress[6] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_cnfOwnMACAddress_t; ++ ++/*-- Configuration Record: cnfDesiredSSID --*/ ++typedef struct acx100_cnfDesiredSSID { ++ UINT8 cnfDesiredSSID[34] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_cnfDesiredSSID_t; ++ ++/*-- Configuration Record: cnfOwnChannel --*/ ++typedef struct acx100_cnfOwnChannel { ++ UINT16 cnfOwnChannel __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_cnfOwnChannel_t; ++ ++/*-- Configuration Record: cnfOwnSSID --*/ ++typedef struct acx100_cnfOwnSSID { ++ UINT8 cnfOwnSSID[34] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_cnfOwnSSID_t; ++ ++/*-- Configuration Record: cnfOwnATIMWindow --*/ ++typedef struct acx100_cnfOwnATIMWindow { ++ UINT16 cnfOwnATIMWindow __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_cnfOwnATIMWindow_t; ++ ++/*-- Configuration Record: cnfSystemScale --*/ ++typedef struct acx100_cnfSystemScale { ++ UINT16 cnfSystemScale __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_cnfSystemScale_t; ++ ++/*-- Configuration Record: cnfMaxDataLength --*/ ++typedef struct acx100_cnfMaxDataLength { ++ UINT16 cnfMaxDataLength __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_cnfMaxDataLength_t; ++ ++/*-- Configuration Record: cnfWDSAddress --*/ ++typedef struct acx100_cnfWDSAddress { ++ UINT8 cnfWDSAddress[6] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_cnfWDSAddress_t; ++ ++/*-- Configuration Record: cnfPMEnabled --*/ ++typedef struct acx100_cnfPMEnabled { ++ UINT16 cnfPMEnabled __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_cnfPMEnabled_t; ++ ++/*-- Configuration Record: cnfPMEPS --*/ ++typedef struct acx100_cnfPMEPS { ++ UINT16 cnfPMEPS __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_cnfPMEPS_t; ++ ++/*-- Configuration Record: cnfMulticastReceive --*/ ++typedef struct acx100_cnfMulticastReceive { ++ UINT16 cnfMulticastReceive __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_cnfMulticastReceive_t; ++ ++/*-- Configuration Record: cnfAuthentication --*/ ++#define ACX100_CNFAUTHENTICATION_OPENSYSTEM 0x0001 ++#define ACX100_CNFAUTHENTICATION_SHAREDKEY 0x0002 ++ ++/*-- Configuration Record: cnfMaxSleepDuration --*/ ++typedef struct acx100_cnfMaxSleepDuration { ++ UINT16 cnfMaxSleepDuration __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_cnfMaxSleepDuration_t; ++ ++/*-- Configuration Record: cnfPMHoldoverDuration --*/ ++typedef struct acx100_cnfPMHoldoverDuration { ++ UINT16 cnfPMHoldoverDuration __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_cnfPMHoldoverDuration_t; ++ ++/*-- Configuration Record: cnfOwnName --*/ ++typedef struct acx100_cnfOwnName { ++ UINT8 cnfOwnName[34] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_cnfOwnName_t; ++ ++/*-- Configuration Record: cnfOwnDTIMPeriod --*/ ++typedef struct acx100_cnfOwnDTIMPeriod { ++ UINT16 cnfOwnDTIMPeriod __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_cnfOwnDTIMPeriod_t; ++ ++/*-- Configuration Record: cnfWDSAddress --*/ ++typedef struct acx100_cnfWDSAddressN { ++ UINT8 cnfWDSAddress[6] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_cnfWDSAddressN_t; ++ ++/*-- Configuration Record: cnfMulticastPMBuffering --*/ ++typedef struct acx100_cnfMulticastPMBuffering { ++ UINT16 cnfMulticastPMBuffering __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_cnfMulticastPMBuffering_t; ++ ++/*--- Configuration Record Structures: ---------------------------------------* ++ *--- Network Parameters, Dynamic Configuration Entities ---------------------*/ ++ ++/*-- Configuration Record: GroupAddresses --*/ ++typedef struct acx100_GroupAddresses { ++ UINT8 MACAddress[16][6] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_GroupAddresses_t; ++ ++/*-- Configuration Record: CreateIBSS --*/ ++typedef struct acx100_CreateIBSS { ++ UINT16 CreateIBSS __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_CreateIBSS_t; ++ ++#define ACX100_CREATEIBSS_JOINCREATEIBSS 0 ++#define ACX100_CREATEIBSS_JOINESS_JOINCREATEIBSS 1 ++#define ACX100_CREATEIBSS_JOINIBSS 2 ++#define ACX100_CREATEIBSS_JOINESS_JOINIBSS 3 ++ ++/*-- Configuration Record: FragmentationThreshold --*/ ++typedef struct acx100_FragmentationThreshold { ++ UINT16 FragmentationThreshold __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_FragmentationThreshold_t; ++ ++/*-- Configuration Record: RTSThreshold --*/ ++typedef struct acx100_RTSThreshold { ++ UINT16 RTSThreshold __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_RTSThreshold_t; ++ ++/*-- Configuration Record: TxRateControl --*/ ++typedef struct acx100_TxRateControl { ++ UINT16 TxRateControl __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_TxRateControl_t; ++ ++/*-- Configuration Record: PromiscuousMode --*/ ++typedef struct acx100_PromiscuousMode { ++ UINT16 PromiscuousMode __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_PromiscuousMode_t; ++ ++/*-- Configuration Record: ScanRequest (data portion only) --*/ ++typedef struct acx100_ScanRequest_data { ++ UINT16 channelList __WLAN_ATTRIB_PACK__; ++ UINT16 txRate __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_ScanRequest_data_t; ++ ++/*-- Configuration Record: HostScanRequest (data portion only) --*/ ++typedef struct acx100_HostScanRequest_data { ++ UINT16 channelList __WLAN_ATTRIB_PACK__; ++ UINT16 txRate __WLAN_ATTRIB_PACK__; ++ acx100_bytestr32_t ssid __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_HostScanRequest_data_t; ++ ++/*-- Configuration Record: JoinRequest (data portion only) --*/ ++typedef struct acx100_JoinRequest_data { ++ UINT8 bssid[ETH_ALEN] __WLAN_ATTRIB_PACK__; ++ UINT16 channel __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_JoinRequest_data_t; ++ ++/*-- Configuration Record: authenticateStation (data portion only) --*/ ++typedef struct acx100_authenticateStation_data { ++ UINT8 address[ETH_ALEN] __WLAN_ATTRIB_PACK__; ++ UINT16 status __WLAN_ATTRIB_PACK__; ++ UINT16 algorithm __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_authenticateStation_data_t; ++ ++/*-- Configuration Record: ChannelInfoRequest (data portion only) --*/ ++typedef struct acx100_ChannelInfoRequest_data { ++ UINT16 channelList __WLAN_ATTRIB_PACK__; ++ UINT16 channelDwellTime __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_ChannelInfoRequest_data_t; ++ ++/*--- Configuration Record Structures: Behavior Parameters -------------------*/ ++ ++/*-- Configuration Record: TickTime --*/ ++typedef struct acx100_TickTime { ++ UINT16 TickTime __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_TickTime_t; ++ ++/*============================================================================* ++ * Information Record Structures: NIC Information * ++ *============================================================================*/ ++ ++/*-- Information Record: MaxLoadTime --*/ ++typedef struct acx100_MaxLoadTime { ++ UINT16 MaxLoadTime __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_MaxLoadTime_t; ++ ++/*-- Information Record: DownLoadBuffer --*/ ++/* NOTE: The page and offset are in AUX format */ ++typedef struct acx100_downloadbuffer { ++ UINT16 page __WLAN_ATTRIB_PACK__; ++ UINT16 offset __WLAN_ATTRIB_PACK__; ++ UINT16 len __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_downloadbuffer_t; ++ ++/*-- Information Record: PRIIdentity --*/ ++typedef struct acx100_PRIIdentity { ++ UINT16 PRICompID __WLAN_ATTRIB_PACK__; ++ UINT16 PRIVariant __WLAN_ATTRIB_PACK__; ++ UINT16 PRIMajorVersion __WLAN_ATTRIB_PACK__; ++ UINT16 PRIMinorVersion __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_PRIIdentity_t; ++ ++/*-- Information Record: PRISupRange --*/ ++typedef struct acx100_PRISupRange { ++ UINT16 PRIRole __WLAN_ATTRIB_PACK__; ++ UINT16 PRIID __WLAN_ATTRIB_PACK__; ++ UINT16 PRIVariant __WLAN_ATTRIB_PACK__; ++ UINT16 PRIBottom __WLAN_ATTRIB_PACK__; ++ UINT16 PRITop __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_PRISupRange_t; ++ ++/*-- Information Record: CFIActRanges --*/ ++typedef struct acx100_CFIActRanges { ++ UINT16 CFIRole __WLAN_ATTRIB_PACK__; ++ UINT16 CFIID __WLAN_ATTRIB_PACK__; ++ UINT16 CFIVariant __WLAN_ATTRIB_PACK__; ++ UINT16 CFIBottom __WLAN_ATTRIB_PACK__; ++ UINT16 CFITop __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_CFIActRanges_t; ++ ++/*-- Information Record: NICSerialNumber --*/ ++typedef struct acx100_NICSerialNumber { ++ UINT8 NICSerialNumber[12] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_NICSerialNumber_t; ++ ++/*-- Information Record: NICIdentity --*/ ++typedef struct acx100_NICIdentity { ++ UINT16 NICCompID __WLAN_ATTRIB_PACK__; ++ UINT16 NICVariant __WLAN_ATTRIB_PACK__; ++ UINT16 NICMajorVersion __WLAN_ATTRIB_PACK__; ++ UINT16 NICMinorVersion __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_NICIdentity_t; ++ ++/*-- Information Record: MFISupRange --*/ ++typedef struct acx100_MFISupRange { ++ UINT16 MFIRole __WLAN_ATTRIB_PACK__; ++ UINT16 MFIID __WLAN_ATTRIB_PACK__; ++ UINT16 MFIVariant __WLAN_ATTRIB_PACK__; ++ UINT16 MFIBottom __WLAN_ATTRIB_PACK__; ++ UINT16 MFITop __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_MFISupRange_t; ++ ++/*-- Information Record: CFISupRange --*/ ++typedef struct acx100_CFISupRange { ++ UINT16 CFIRole __WLAN_ATTRIB_PACK__; ++ UINT16 CFIID __WLAN_ATTRIB_PACK__; ++ UINT16 CFIVariant __WLAN_ATTRIB_PACK__; ++ UINT16 CFIBottom __WLAN_ATTRIB_PACK__; ++ UINT16 CFITop __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_CFISupRange_t; ++ ++/*-- Information Record: BUILDSEQ:BuildSeq --*/ ++typedef struct acx100_BuildSeq { ++ UINT16 primary __WLAN_ATTRIB_PACK__; ++ UINT16 secondary __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_BuildSeq_t; ++ ++/*-- Information Record: FWID --*/ ++#define ACX100_FWID_LEN 14 ++typedef struct acx100_FWID { ++ UINT8 primary[ACX100_FWID_LEN] __WLAN_ATTRIB_PACK__; ++ UINT8 secondary[ACX100_FWID_LEN] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_FWID_t; ++ ++/*-- Information Record: ChannelList --*/ ++typedef struct acx100_ChannelList { ++ UINT16 ChannelList __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_ChannelList_t; ++ ++/*-- Information Record: RegulatoryDomains --*/ ++typedef struct acx100_RegulatoryDomains { ++ UINT8 RegulatoryDomains[12] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_RegulatoryDomains_t; ++ ++/*-- Information Record: TempType --*/ ++typedef struct acx100_TempType { ++ UINT16 TempType __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_TempType_t; ++ ++/*-- Information Record: CIS --*/ ++typedef struct acx100_CIS { ++ UINT8 CIS[480] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_CIS_t; ++ ++/*-- Information Record: STAIdentity --*/ ++typedef struct acx100_STAIdentity { ++ UINT16 STACompID __WLAN_ATTRIB_PACK__; ++ UINT16 STAVariant __WLAN_ATTRIB_PACK__; ++ UINT16 STAMajorVersion __WLAN_ATTRIB_PACK__; ++ UINT16 STAMinorVersion __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_STAIdentity_t; ++ ++/*-- Information Record: STASupRange --*/ ++typedef struct acx100_STASupRange { ++ UINT16 STARole __WLAN_ATTRIB_PACK__; ++ UINT16 STAID __WLAN_ATTRIB_PACK__; ++ UINT16 STAVariant __WLAN_ATTRIB_PACK__; ++ UINT16 STABottom __WLAN_ATTRIB_PACK__; ++ UINT16 STATop __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_STASupRange_t; ++ ++/*-- Information Record: MFIActRanges --*/ ++typedef struct acx100_MFIActRanges { ++ UINT16 MFIRole __WLAN_ATTRIB_PACK__; ++ UINT16 MFIID __WLAN_ATTRIB_PACK__; ++ UINT16 MFIVariant __WLAN_ATTRIB_PACK__; ++ UINT16 MFIBottom __WLAN_ATTRIB_PACK__; ++ UINT16 MFITop __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_MFIActRanges_t; ++ ++/*-- Information Record: PortStatus --*/ ++typedef struct acx100_PortStatus { ++ UINT16 PortStatus __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_PortStatus_t; ++ ++#define ACX100_PSTATUS_DISABLED ((UINT16)1) ++#define ACX100_PSTATUS_SEARCHING ((UINT16)2) ++#define ACX100_PSTATUS_CONN_IBSS ((UINT16)3) ++#define ACX100_PSTATUS_CONN_ESS ((UINT16)4) ++#define ACX100_PSTATUS_OUTOFRANGE ((UINT16)5) ++#define ACX100_PSTATUS_CONN_WDS ((UINT16)6) ++ ++/*-- Information Record: CurrentSSID --*/ ++typedef struct acx100_CurrentSSID { ++ UINT8 CurrentSSID[34] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_CurrentSSID_t; ++ ++/*-- Information Record: CurrentBSSID --*/ ++typedef struct acx100_CurrentBSSID { ++ UINT8 CurrentBSSID[6] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_CurrentBSSID_t; ++ ++/*-- Information Record: commsquality --*/ ++typedef struct acx100_commsquality { ++ UINT16 CQ_currBSS __WLAN_ATTRIB_PACK__; ++ UINT16 ASL_currBSS __WLAN_ATTRIB_PACK__; ++ UINT16 ANL_currFC __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_commsquality_t; ++ ++/*-- Information Record: dmbcommsquality --*/ ++typedef struct acx100_dbmcommsquality { ++ UINT16 CQdbm_currBSS __WLAN_ATTRIB_PACK__; ++ UINT16 ASLdbm_currBSS __WLAN_ATTRIB_PACK__; ++ UINT16 ANLdbm_currFC __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_dbmcommsquality_t; ++ ++/*-- Information Record: CurrentTxRate --*/ ++typedef struct acx100_CurrentTxRate { ++ UINT16 CurrentTxRate __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_CurrentTxRate_t; ++ ++/*-- Information Record: CurrentBeaconInterval --*/ ++typedef struct acx100_CurrentBeaconInterval { ++ UINT16 CurrentBeaconInterval __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_CurrentBeaconInterval_t; ++ ++/*-- Information Record: CurrentScaleThresholds --*/ ++typedef struct acx100_CurrentScaleThresholds { ++ UINT16 EnergyDetectThreshold __WLAN_ATTRIB_PACK__; ++ UINT16 CarrierDetectThreshold __WLAN_ATTRIB_PACK__; ++ UINT16 DeferDetectThreshold __WLAN_ATTRIB_PACK__; ++ UINT16 CellSearchThreshold __WLAN_ATTRIB_PACK__; /* Stations only */ ++ UINT16 DeadSpotThreshold __WLAN_ATTRIB_PACK__; /* Stations only */ ++} __WLAN_ATTRIB_PACK__ acx100_CurrentScaleThresholds_t; ++ ++/*-- Information Record: ProtocolRspTime --*/ ++typedef struct acx100_ProtocolRspTime { ++ UINT16 ProtocolRspTime __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_ProtocolRspTime_t; ++ ++/*-- Information Record: ShortRetryLimit --*/ ++typedef struct acx100_ShortRetryLimit { ++ UINT16 ShortRetryLimit __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_ShortRetryLimit_t; ++ ++/*-- Information Record: LongRetryLimit --*/ ++typedef struct acx100_LongRetryLimit { ++ UINT16 LongRetryLimit __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_LongRetryLimit_t; ++ ++/*-- Information Record: MaxTransmitLifetime --*/ ++typedef struct acx100_MaxTransmitLifetime { ++ UINT16 MaxTransmitLifetime __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_MaxTransmitLifetime_t; ++ ++/*-- Information Record: MaxReceiveLifetime --*/ ++typedef struct acx100_MaxReceiveLifetime { ++ UINT16 MaxReceiveLifetime __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_MaxReceiveLifetime_t; ++ ++/*-- Information Record: CFPollable --*/ ++typedef struct acx100_CFPollable { ++ UINT16 CFPollable __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_CFPollable_t; ++ ++/*-- Information Record: AuthenticationAlgorithms --*/ ++typedef struct acx100_AuthenticationAlgorithms { ++ UINT16 AuthenticationType __WLAN_ATTRIB_PACK__; ++ UINT16 TypeEnabled __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_AuthenticationAlgorithms_t; ++ ++/*-- Information Record: AuthenticationAlgorithms (data only) --*/ ++typedef struct acx100_AuthenticationAlgorithms_data { ++ UINT16 AuthenticationType __WLAN_ATTRIB_PACK__; ++ UINT16 TypeEnabled __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_AuthenticationAlgorithms_data_t; ++ ++/*-- Information Record: PrivacyOptionImplemented --*/ ++typedef struct acx100_PrivacyOptionImplemented { ++ UINT16 PrivacyOptionImplemented __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_PrivacyOptionImplemented_t; ++ ++/*-- Information Record: OwnMACAddress --*/ ++typedef struct acx100_OwnMACAddress { ++ UINT8 OwnMACAddress[6] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_OwnMACAddress_t; ++ ++/*-- Information Record: PCFInfo --*/ ++typedef struct acx100_PCFInfo { ++ UINT16 MediumOccupancyLimit __WLAN_ATTRIB_PACK__; ++ UINT16 CFPPeriod __WLAN_ATTRIB_PACK__; ++ UINT16 CFPMaxDuration __WLAN_ATTRIB_PACK__; ++ UINT16 CFPFlags __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_PCFInfo_t; ++ ++/*-- Information Record: PCFInfo (data portion only) --*/ ++typedef struct acx100_PCFInfo_data { ++ UINT16 MediumOccupancyLimit __WLAN_ATTRIB_PACK__; ++ UINT16 CFPPeriod __WLAN_ATTRIB_PACK__; ++ UINT16 CFPMaxDuration __WLAN_ATTRIB_PACK__; ++ UINT16 CFPFlags __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_PCFInfo_data_t; ++ ++/*============================================================================* ++ * Information Record Structures: Modem Information Records * ++ *============================================================================*/ ++ ++/*-- Information Record: PHYType --*/ ++typedef struct acx100_PHYType { ++ UINT16 PHYType __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_PHYType_t; ++ ++/*-- Information Record: CurrentChannel --*/ ++typedef struct acx100_CurrentChannel { ++ UINT16 CurrentChannel __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_CurrentChannel_t; ++ ++/*-- Information Record: CurrentPowerState --*/ ++typedef struct acx100_CurrentPowerState { ++ UINT16 CurrentPowerState __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_CurrentPowerState_t; ++ ++/*-- Information Record: CCAMode --*/ ++typedef struct acx100_CCAMode { ++ UINT16 CCAMode __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_CCAMode_t; ++ ++/*-- Information Record: SupportedDataRates --*/ ++typedef struct acx100_SupportedDataRates { ++ UINT8 SupportedDataRates[10] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_SupportedDataRates_t; ++ ++/*============================================================================* ++ * FRAME DESCRIPTORS AND FRAME STRUCTURES * ++ *============================================================================*/ ++ ++/*============================================================================* ++ * Frame Descriptors: Offsets * ++ *============================================================================*/ ++/*--- Control Info (offset 44-51) --------------------------------------------*/ ++#define ACX100_FD_STATUS_OFF ((UINT16)0x44) ++#define ACX100_FD_TIME_OFF ((UINT16)0x46) ++#define ACX100_FD_SWSUPPORT_OFF ((UINT16)0x4A) ++#define ACX100_FD_SILENCE_OFF ((UINT16)0x4A) ++#define ACX100_FD_SIGNAL_OFF ((UINT16)0x4B) ++#define ACX100_FD_RATE_OFF ((UINT16)0x4C) ++#define ACX100_FD_RXFLOW_OFF ((UINT16)0x4D) ++#define ACX100_FD_RESERVED_OFF ((UINT16)0x4E) ++#define ACX100_FD_TXCONTROL_OFF ((UINT16)0x50) ++/*--- 802.11 Header (offset 52-6B) -------------------------------------------*/ ++#define ACX100_FD_FRAMECONTROL_OFF ((UINT16)0x52) ++#define ACX100_FD_DURATIONID_OFF ((UINT16)0x54) ++#define ACX100_FD_ADDRESS1_OFF ((UINT16)0x56) ++#define ACX100_FD_ADDRESS2_OFF ((UINT16)0x5C) ++#define ACX100_FD_ADDRESS3_OFF ((UINT16)0x62) ++#define ACX100_FD_SEQCONTROL_OFF ((UINT16)0x68) ++#define ACX100_FD_ADDRESS4_OFF ((UINT16)0x6A) ++#define ACX100_FD_DATALEN_OFF ((UINT16)0x70) ++/*--- 802.3 Header (offset 72-7F) --------------------------------------------*/ ++#define ACX100_FD_DESTADDRESS_OFF ((UINT16)0x72) ++#define ACX100_FD_SRCADDRESS_OFF ((UINT16)0x78) ++#define ACX100_FD_DATALENGTH_OFF ((UINT16)0x7E) ++ ++/*============================================================================* ++ * FRAME STRUCTURES: Communication Frames * ++ *============================================================================*/ ++ ++/*--- Communication Frames: Transmit Frame Structure -------------------------*/ ++typedef struct acx100_tx_frame { ++ /*-- Control information --*/ ++ UINT16 status __WLAN_ATTRIB_PACK__; ++ UINT16 reserved1 __WLAN_ATTRIB_PACK__; ++ UINT16 reserved2 __WLAN_ATTRIB_PACK__; ++ UINT32 sw_support __WLAN_ATTRIB_PACK__; ++ UINT16 reserved3 __WLAN_ATTRIB_PACK__; ++ UINT16 tx_control __WLAN_ATTRIB_PACK__; ++ ++ /*-- 802.11 Header Information --*/ ++ UINT16 frame_control __WLAN_ATTRIB_PACK__; ++ UINT16 duration_id __WLAN_ATTRIB_PACK__; ++ UINT8 address1[6] __WLAN_ATTRIB_PACK__; ++ UINT8 address2[6] __WLAN_ATTRIB_PACK__; ++ UINT8 address3[6] __WLAN_ATTRIB_PACK__; ++ UINT16 sequence_control __WLAN_ATTRIB_PACK__; ++ UINT8 address4[6] __WLAN_ATTRIB_PACK__; ++ UINT16 data_len __WLAN_ATTRIB_PACK__; /* little endian format */ ++ ++ /*-- 802.3 Header Information --*/ ++ UINT8 dest_addr[6] __WLAN_ATTRIB_PACK__; ++ UINT8 src_addr[6] __WLAN_ATTRIB_PACK__; ++ UINT16 data_length __WLAN_ATTRIB_PACK__; /* big endian format */ ++} __WLAN_ATTRIB_PACK__ acx100_tx_frame_t; ++ ++/*--- Communication Frames: Field Masks for Transmit Frames ------------------*/ ++/*-- Status Field --*/ ++#define ACX100_TXSTATUS_ACKERR ((UINT16)BIT5) ++#define ACX100_TXSTATUS_FORMERR ((UINT16)BIT3) ++#define ACX100_TXSTATUS_DISCON ((UINT16)BIT2) ++#define ACX100_TXSTATUS_AGEDERR ((UINT16)BIT1) ++#define ACX100_TXSTATUS_RETRYERR ((UINT16)BIT0) ++/*-- Transmit Control Field --*/ ++#define ACX100_TX_CFPOLL ((UINT16)BIT12) ++#define ACX100_TX_PRST ((UINT16)BIT11) ++#define ACX100_TX_MACPORT ((UINT16)(BIT10 | BIT9 | BIT8)) ++#define ACX100_TX_NOENCRYPT ((UINT16)BIT7) ++#define ACX100_TX_RETRYSTRAT ((UINT16)(BIT6 | BIT5)) ++#define ACX100_TX_STRUCTYPE ((UINT16)(BIT4 | BIT3)) ++#define ACX100_TX_TXEX ((UINT16)BIT2) ++#define ACX100_TX_TXOK ((UINT16)BIT1) ++ ++/*--- Communication Frames: Test/Get/Set Field Values for Transmit Frames ----*/ ++/*-- Status Field --*/ ++#define ACX100_TXSTATUS_ISERROR(v) \ ++ (((UINT16)(v)) & \ ++ (ACX100_TXSTATUS_ACKERR | ACX100_TXSTATUS_FORMERR | \ ++ ACX100_TXSTATUS_DISCON | ACX100_TXSTATUS_AGEDERR | \ ++ ACX100_TXSTATUS_RETRYERR)) ++ ++#define ACX100_TXSTATUS_ISACKERR(v) \ ++ ((UINT16)(((UINT16)(v)) & ACX100_TXSTATUS_ACKERR)) ++#define ACX100_TXSTATUS_ISFORMERR(v) \ ++ ((UINT16)(((UINT16)(v)) & ACX100_TXSTATUS_FORMERR)) ++#define ACX100_TXSTATUS_ISDISCON(v) \ ++ ((UINT16)(((UINT16)(v)) & ACX100_TXSTATUS_DISCON)) ++#define ACX100_TXSTATUS_ISAGEDERR(v) \ ++ ((UINT16)(((UINT16)(v)) & ACX100_TXSTATUS_AGEDERR)) ++#define ACX100_TXSTATUS_ISRETRYERR(v) \ ++ ((UINT16)(((UINT16)(v)) & ACX100_TXSTATUS_RETRYERR)) ++ ++#define ACX100_TX_GET(v,m,s) \ ++ ((((UINT16)(v)) & ((UINT16)(m))) >> ((UINT16)(s))) ++#define ACX100_TX_SET(v,m,s) \ ++ ((((UINT16)(v)) << ((UINT16)(s))) & ((UINT16)(m))) ++ ++#define ACX100_TX_CFPOLL_GET(v) ACX100_TX_GET(v, ACX100_TX_CFPOLL, 12) ++#define ACX100_TX_CFPOLL_SET(v) ACX100_TX_SET(v, ACX100_TX_CFPOLL, 12) ++#define ACX100_TX_PRST_GET(v) ACX100_TX_GET(v, ACX100_TX_PRST, 11) ++#define ACX100_TX_PRST_SET(v) ACX100_TX_SET(v, ACX100_TX_PRST, 11) ++#define ACX100_TX_MACPORT_GET(v) ACX100_TX_GET(v, ACX100_TX_MACPORT, 8) ++#define ACX100_TX_MACPORT_SET(v) ACX100_TX_SET(v, ACX100_TX_MACPORT, 8) ++#define ACX100_TX_NOENCRYPT_GET(v) ACX100_TX_GET(v, ACX100_TX_NOENCRYPT, 7) ++#define ACX100_TX_NOENCRYPT_SET(v) ACX100_TX_SET(v, ACX100_TX_NOENCRYPT, 7) ++#define ACX100_TX_RETRYSTRAT_GET(v) ACX100_TX_GET(v, ACX100_TX_RETRYSTRAT, 5) ++#define ACX100_TX_RETRYSTRAT_SET(v) ACX100_TX_SET(v, ACX100_TX_RETRYSTRAT, 5) ++#define ACX100_TX_STRUCTYPE_GET(v) ACX100_TX_GET(v, ACX100_TX_STRUCTYPE, 3) ++#define ACX100_TX_STRUCTYPE_SET(v) ACX100_TX_SET(v, ACX100_TX_STRUCTYPE, 3) ++#define ACX100_TX_TXEX_GET(v) ACX100_TX_GET(v, ACX100_TX_TXEX, 2) ++#define ACX100_TX_TXEX_SET(v) ACX100_TX_SET(v, ACX100_TX_TXEX, 2) ++#define ACX100_TX_TXOK_GET(v) ACX100_TX_GET(v, ACX100_TX_TXOK, 1) ++#define ACX100_TX_TXOK_SET(v) ACX100_TX_SET(v, ACX100_TX_TXOK, 1) ++ ++/*--- Communication Frames: Receive Frame Structure --------------------------*/ ++typedef struct acx100_rx_frame { ++ /*-- MAC RX descriptor (acx100 byte order) --*/ ++ UINT16 status __WLAN_ATTRIB_PACK__; ++ UINT32 time __WLAN_ATTRIB_PACK__; ++ UINT8 silence __WLAN_ATTRIB_PACK__; ++ UINT8 signal __WLAN_ATTRIB_PACK__; ++ UINT8 rate __WLAN_ATTRIB_PACK__; ++ UINT8 rx_flow __WLAN_ATTRIB_PACK__; ++ UINT16 reserved1 __WLAN_ATTRIB_PACK__; ++ UINT16 reserved2 __WLAN_ATTRIB_PACK__; ++ ++ /*-- 802.11 Header Information (802.11 byte order) --*/ ++ UINT16 frame_control __WLAN_ATTRIB_PACK__; ++ UINT16 duration_id __WLAN_ATTRIB_PACK__; ++ UINT8 address1[6] __WLAN_ATTRIB_PACK__; ++ UINT8 address2[6] __WLAN_ATTRIB_PACK__; ++ UINT8 address3[6] __WLAN_ATTRIB_PACK__; ++ UINT16 sequence_control __WLAN_ATTRIB_PACK__; ++ UINT8 address4[6] __WLAN_ATTRIB_PACK__; ++ UINT16 data_len __WLAN_ATTRIB_PACK__; /* acx100 (little endian) format */ ++ ++ /*-- 802.3 Header Information --*/ ++ UINT8 dest_addr[6] __WLAN_ATTRIB_PACK__; ++ UINT8 src_addr[6] __WLAN_ATTRIB_PACK__; ++ UINT16 data_length __WLAN_ATTRIB_PACK__; /* IEEE? (big endian) format */ ++} __WLAN_ATTRIB_PACK__ acx100_rx_frame_t; ++ ++/*--- Communication Frames: Field Masks for Receive Frames -------------------*/ ++/*-- Offsets --*/ ++#define ACX100_RX_DATA_LEN_OFF ((UINT16)44) ++#define ACX100_RX_80211HDR_OFF ((UINT16)14) ++#define ACX100_RX_DATA_OFF ((UINT16)60) ++ ++/*-- Status Fields --*/ ++#define ACX100_RXSTATUS_MSGTYPE ((UINT16)(BIT15 | BIT14 | BIT13)) ++#define ACX100_RXSTATUS_MACPORT ((UINT16)(BIT10 | BIT9 | BIT8)) ++#define ACX100_RXSTATUS_UNDECR ((UINT16)BIT1) ++#define ACX100_RXSTATUS_FCSERR ((UINT16)BIT0) ++ ++/*--- Communication Frames: Test/Get/Set Field Values for Receive Frames -----*/ ++#define ACX100_RXSTATUS_MSGTYPE_GET(value) \ ++ ((UINT16)((((UINT16)(value)) & ACX100_RXSTATUS_MSGTYPE) >> 13)) ++#define ACX100_RXSTATUS_MSGTYPE_SET(value) \ ++ ((UINT16)(((UINT16)(value)) << 13)) ++#define ACX100_RXSTATUS_MACPORT_GET(value) \ ++ ((UINT16)((((UINT16)(value)) & ACX100_RXSTATUS_MACPORT) >> 8)) ++#define ACX100_RXSTATUS_MACPORT_SET(value) \ ++ ((UINT16)(((UINT16)(value)) << 8)) ++#define ACX100_RXSTATUS_ISUNDECR(value) \ ++ ((UINT16)(((UINT16)(value)) & ACX100_RXSTATUS_UNDECR)) ++#define ACX100_RXSTATUS_ISFCSERR(value) \ ++ ((UINT16)(((UINT16)(value)) & ACX100_RXSTATUS_FCSERR)) ++ ++/*============================================================================* ++ * Information Frames Structures * ++ *============================================================================*/ ++ ++/*--- Information Types ------------------------------------------------------*/ ++#define ACX100_IT_HANDOVERADDR ((UINT16)0xF000UL) ++#define ACX100_IT_COMMTALLIES ((UINT16)0xF100UL) ++#define ACX100_IT_SCANRESULTS ((UINT16)0xF101UL) ++#define ACX100_IT_CHINFORESULTS ((UINT16)0xF102UL) ++#define ACX100_IT_HOSTSCANRESULTS ((UINT16)0xF103UL) /* NEW */ ++#define ACX100_IT_LINKSTATUS ((UINT16)0xF200UL) ++#define ACX100_IT_ASSOCSTATUS ((UINT16)0xF201UL) ++#define ACX100_IT_AUTHREQ ((UINT16)0xF202UL) ++#define ACX100_IT_PSUSERCNT ((UINT16)0xF203UL) ++#define ACX100_IT_KEYIDCHANGED ((UINT16)0xF204UL) /* NEW AP */ ++ ++/*-- Notification Frame, MAC Mgmt: Handover Address --*/ ++typedef struct acx100_HandoverAddr { ++ UINT16 framelen __WLAN_ATTRIB_PACK__; ++ UINT16 infotype __WLAN_ATTRIB_PACK__; ++ UINT8 handover_addr[ETH_ALEN] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_HandoverAddr_t; ++ ++/*-- Inquiry Frame, Diagnose: Communication Tallies --*/ ++typedef struct __WLAN_ATTRIB_PACK__ acx100_CommTallies16 { ++ UINT16 txunicastframes __WLAN_ATTRIB_PACK__; ++ UINT16 txmulticastframes __WLAN_ATTRIB_PACK__; ++ UINT16 txfragments __WLAN_ATTRIB_PACK__; ++ UINT16 txunicastoctets __WLAN_ATTRIB_PACK__; ++ UINT16 txmulticastoctets __WLAN_ATTRIB_PACK__; ++ UINT16 txdeferredtrans __WLAN_ATTRIB_PACK__; ++ UINT16 txsingleretryframes __WLAN_ATTRIB_PACK__; ++ UINT16 txmultipleretryframes __WLAN_ATTRIB_PACK__; ++ UINT16 txretrylimitexceeded __WLAN_ATTRIB_PACK__; ++ UINT16 txdiscards __WLAN_ATTRIB_PACK__; ++ UINT16 rxunicastframes __WLAN_ATTRIB_PACK__; ++ UINT16 rxmulticastframes __WLAN_ATTRIB_PACK__; ++ UINT16 rxfragments __WLAN_ATTRIB_PACK__; ++ UINT16 rxunicastoctets __WLAN_ATTRIB_PACK__; ++ UINT16 rxmulticastoctets __WLAN_ATTRIB_PACK__; ++ UINT16 rxfcserrors __WLAN_ATTRIB_PACK__; ++ UINT16 rxdiscardsnobuffer __WLAN_ATTRIB_PACK__; ++ UINT16 txdiscardswrongsa __WLAN_ATTRIB_PACK__; ++ UINT16 rxdiscardswepundecr __WLAN_ATTRIB_PACK__; ++ UINT16 rxmsginmsgfrag __WLAN_ATTRIB_PACK__; ++ UINT16 rxmsginbadmsgfrag __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_CommTallies16_t; ++ ++typedef struct __WLAN_ATTRIB_PACK__ acx100_CommTallies32 { ++ UINT32 txunicastframes __WLAN_ATTRIB_PACK__; ++ UINT32 txmulticastframes __WLAN_ATTRIB_PACK__; ++ UINT32 txfragments __WLAN_ATTRIB_PACK__; ++ UINT32 txunicastoctets __WLAN_ATTRIB_PACK__; ++ UINT32 txmulticastoctets __WLAN_ATTRIB_PACK__; ++ UINT32 txdeferredtrans __WLAN_ATTRIB_PACK__; ++ UINT32 txsingleretryframes __WLAN_ATTRIB_PACK__; ++ UINT32 txmultipleretryframes __WLAN_ATTRIB_PACK__; ++ UINT32 txretrylimitexceeded __WLAN_ATTRIB_PACK__; ++ UINT32 txdiscards __WLAN_ATTRIB_PACK__; ++ UINT32 rxunicastframes __WLAN_ATTRIB_PACK__; ++ UINT32 rxmulticastframes __WLAN_ATTRIB_PACK__; ++ UINT32 rxfragments __WLAN_ATTRIB_PACK__; ++ UINT32 rxunicastoctets __WLAN_ATTRIB_PACK__; ++ UINT32 rxmulticastoctets __WLAN_ATTRIB_PACK__; ++ UINT32 rxfcserrors __WLAN_ATTRIB_PACK__; ++ UINT32 rxdiscardsnobuffer __WLAN_ATTRIB_PACK__; ++ UINT32 txdiscardswrongsa __WLAN_ATTRIB_PACK__; ++ UINT32 rxdiscardswepundecr __WLAN_ATTRIB_PACK__; ++ UINT32 rxmsginmsgfrag __WLAN_ATTRIB_PACK__; ++ UINT32 rxmsginbadmsgfrag __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_CommTallies32_t; ++ ++/*-- Inquiry Frame, Diagnose: Scan Results & Subfields --*/ ++typedef struct acx100_ScanResultSub { ++ UINT16 chid __WLAN_ATTRIB_PACK__; ++ UINT16 anl __WLAN_ATTRIB_PACK__; ++ UINT16 sl __WLAN_ATTRIB_PACK__; ++ UINT8 bssid[ETH_ALEN] __WLAN_ATTRIB_PACK__; ++ UINT16 bcnint __WLAN_ATTRIB_PACK__; ++ UINT16 capinfo __WLAN_ATTRIB_PACK__; ++ acx100_bytestr32_t ssid __WLAN_ATTRIB_PACK__; ++ UINT8 supprates[10] __WLAN_ATTRIB_PACK__; /* 802.11 info element */ ++ UINT16 proberesp_rate __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_ScanResultSub_t; ++ ++typedef struct acx100_ScanResult { ++ UINT16 rsvd __WLAN_ATTRIB_PACK__; ++ UINT16 scanreason __WLAN_ATTRIB_PACK__; ++ acx100_ScanResultSub_t ++ result[ACX100_SCANRESULT_MAX] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_ScanResult_t; ++ ++/*-- Inquiry Frame, Diagnose: ChInfo Results & Subfields --*/ ++typedef struct acx100_ChInfoResultSub { ++ UINT16 chid __WLAN_ATTRIB_PACK__; ++ UINT16 anl __WLAN_ATTRIB_PACK__; ++ UINT16 pnl __WLAN_ATTRIB_PACK__; ++ UINT16 active __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_ChInfoResultSub_t; ++ ++#define ACX100_CHINFORESULT_BSSACTIVE BIT0 ++#define ACX100_CHINFORESULT_PCFACTIVE BIT1 ++ ++typedef struct acx100_ChInfoResult { ++ UINT16 scanchannels __WLAN_ATTRIB_PACK__; ++ acx100_ChInfoResultSub_t ++ result[ACX100_CHINFORESULT_MAX] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_ChInfoResult_t; ++ ++/*-- Inquiry Frame, Diagnose: Host Scan Results & Subfields --*/ ++typedef struct acx100_HScanResultSub { ++ UINT16 chid __WLAN_ATTRIB_PACK__; ++ UINT16 anl __WLAN_ATTRIB_PACK__; ++ UINT16 sl __WLAN_ATTRIB_PACK__; ++ UINT8 bssid[ETH_ALEN] __WLAN_ATTRIB_PACK__; ++ UINT16 bcnint __WLAN_ATTRIB_PACK__; ++ UINT16 capinfo __WLAN_ATTRIB_PACK__; ++ acx100_bytestr32_t ssid __WLAN_ATTRIB_PACK__; ++ UINT8 supprates[10] __WLAN_ATTRIB_PACK__; /* 802.11 info element */ ++ UINT16 proberesp_rate __WLAN_ATTRIB_PACK__; ++ UINT16 atim __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_HScanResultSub_t; ++ ++typedef struct acx100_HScanResult { ++ UINT16 nresult __WLAN_ATTRIB_PACK__; ++ UINT16 rsvd __WLAN_ATTRIB_PACK__; ++ acx100_HScanResultSub_t ++ result[ACX100_HSCANRESULT_MAX] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_HScanResult_t; ++ ++/*-- Unsolicited Frame, MAC Mgmt: LinkStatus --*/ ++#define ACX100_LINK_NOTCONNECTED ((UINT16)0) ++#define ACX100_LINK_CONNECTED ((UINT16)1) ++#define ACX100_LINK_DISCONNECTED ((UINT16)2) ++#define ACX100_LINK_AP_CHANGE ((UINT16)3) ++#define ACX100_LINK_AP_OUTOFRANGE ((UINT16)4) ++#define ACX100_LINK_AP_INRANGE ((UINT16)5) ++#define ACX100_LINK_ASSOCFAIL ((UINT16)6) ++ ++typedef struct acx100_LinkStatus { ++ UINT16 linkstatus __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_LinkStatus_t; ++ ++/*-- Unsolicited Frame, MAC Mgmt: AssociationStatus --*/ ++#define ACX100_ASSOCSTATUS_STAASSOC ((UINT16)1) ++#define ACX100_ASSOCSTATUS_REASSOC ((UINT16)2) ++#define ACX100_ASSOCSTATUS_DISASSOC ((UINT16)3) ++#define ACX100_ASSOCSTATUS_ASSOCFAIL ((UINT16)4) ++#define ACX100_ASSOCSTATUS_AUTHFAIL ((UINT16)5) ++ ++typedef struct acx100_AssocStatus { ++ UINT16 assocstatus __WLAN_ATTRIB_PACK__; ++ UINT8 sta_addr[ETH_ALEN] __WLAN_ATTRIB_PACK__; ++ /* old_ap_addr is only valid if assocstatus == 2 */ ++ UINT8 old_ap_addr[ETH_ALEN] __WLAN_ATTRIB_PACK__; ++ UINT16 reason __WLAN_ATTRIB_PACK__; ++ UINT16 reserved __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_AssocStatus_t; ++ ++/*-- Unsolicited Frame, MAC Mgmt: AuthRequest (AP Only) --*/ ++typedef struct acx100_AuthRequest { ++ UINT8 sta_addr[ETH_ALEN] __WLAN_ATTRIB_PACK__; ++ UINT16 algorithm __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_AuthReq_t; ++ ++/*-- Unsolicited Frame, MAC Mgmt: PSUserCount (AP Only) --*/ ++typedef struct acx100_PSUserCount { ++ UINT16 usercnt __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_PSUserCount_t; ++ ++/*-- Collection of all Inf frames --*/ ++typedef union acx100_infodata { ++ acx100_CommTallies16_t commtallies16 __WLAN_ATTRIB_PACK__; ++ acx100_CommTallies32_t commtallies32 __WLAN_ATTRIB_PACK__; ++ acx100_ScanResult_t scanresult __WLAN_ATTRIB_PACK__; ++ acx100_ChInfoResult_t chinforesult __WLAN_ATTRIB_PACK__; ++ acx100_HScanResult_t hscanresult __WLAN_ATTRIB_PACK__; ++ acx100_LinkStatus_t linkstatus __WLAN_ATTRIB_PACK__; ++ acx100_AssocStatus_t assocstatus __WLAN_ATTRIB_PACK__; ++ acx100_AuthReq_t authreq __WLAN_ATTRIB_PACK__; ++ acx100_PSUserCount_t psusercnt __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_infodata_t; ++ ++typedef struct acx100_InfFrame { ++ UINT16 framelen __WLAN_ATTRIB_PACK__; ++ UINT16 infotype __WLAN_ATTRIB_PACK__; ++ acx100_infodata_t info __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_InfFrame_t; ++ ++ ++/* Descriptor Control Bits */ ++ ++#define ACX100_CTL_PREAMBLE 0x01 /* Preable type: 0 = long; 1 = short */ ++#define ACX100_CTL_FIRSTFRAG 0x02 /* This is the 1st frag of the frame */ ++#define ACX100_CTL_AUTODMA 0x04 ++#define ACX100_CTL_RECLAIM 0x08 /* ready to reuse */ ++#define ACX100_CTL_HOSTDONE 0x20 /* host has finished processing */ ++#define ACX100_CTL_ACXDONE 0x40 /* acx100 has finished processing */ ++#define ACX100_CTL_OWN 0x80 /* host owns the desc */ ++ ++ ++#define ACX_TXRATE_1 10 ++#define ACX_TXRATE_2 20 ++#define ACX_TXRATE_5_5 55 ++#define ACX_TXRATE_5_5PBCC 183 ++#define ACX_TXRATE_11 110 ++#define ACX_TXRATE_11PBCC 238 ++#define ACX_TXRATE_22PBCC 220 ++ ++ ++ ++ ++#if (WLAN_HOSTIF == WLAN_USB) ++ ++/*============================================================================* ++ * USB Packet structures and constants * ++ *============================================================================*/ ++ ++/* Should be sent to the ctrlout endpoint */ ++#define ACX100_USB_ENBULKIN 6 ++ ++/* Should be sent to the bulkout endpoint */ ++#define ACX100_USB_TXFRM 0 ++#define ACX100_USB_CMDREQ 1 ++#define ACX100_USB_WRIDREQ 2 ++#define ACX100_USB_RRIDREQ 3 ++#define ACX100_USB_WMEMREQ 4 ++#define ACX100_USB_RMEMREQ 5 ++#define ACX100_USB_UPLOAD_FW 0x10 ++#define ACX100_USB_ACK_CS 0x11 ++#define ACX100_USB_UNKNOWN_REQ1 0x12 ++#define ACX100_USB_TX_DESC 0xA ++ ++/* Received from the bulkin endpoint */ ++#define ACX100_USB_ISFRM(a) ((a) < 0x7fff) ++#define ACX100_USB_ISTXFRM(a) (ACX100_USB_ISFRM((a)) && ((a) & 0x1000)) ++#define ACX100_USB_ISRXFRM(a) (ACX100_USB_ISFRM((a)) && !((a) & 0x1000)) ++#define ACX100_USB_INFOFRM 0x8000 ++#define ACX100_USB_CMDRESP 0x8001 ++#define ACX100_USB_WRIDRESP 0x8002 ++#define ACX100_USB_RRIDRESP 0x8003 ++#define ACX100_USB_WMEMRESP 0x8004 ++#define ACX100_USB_RMEMRESP 0x8005 ++#define ACX100_USB_BUFAVAIL 0x8006 ++#define ACX100_USB_ERROR 0x8007 ++ ++#define ACX100_USB_TXHI_ISDATA 0x1 ++#define ACX100_USB_TXHI_DIRECTED 0x2 ++#define ACX100_USB_TXHI_BROADCAST 0x4 ++ ++#define ACX100_USB_CTL2_FCS 0x02 ++#define ACX100_USB_CTL2_MORE_FRAG 0x04 ++#define ACX100_USB_CTL2_RTS 0x20 ++ ++ ++/*--- Request (bulk OUT) packet contents -------------------------------------*/ ++ ++typedef struct acx100_usb_txhdr { ++ UINT16 desc __WLAN_ATTRIB_PACK__; ++ UINT16 MPDUlen __WLAN_ATTRIB_PACK__; ++ UINT8 index __WLAN_ATTRIB_PACK__; ++ UINT8 txRate __WLAN_ATTRIB_PACK__; ++ UINT32 hostData __WLAN_ATTRIB_PACK__; ++ UINT8 ctrl1 __WLAN_ATTRIB_PACK__; ++ UINT8 ctrl2 __WLAN_ATTRIB_PACK__; ++ UINT16 dataLength __WLAN_ATTRIB_PACK__; ++} acx100_usb_txhdr_t; ++ ++ ++typedef struct acx100_usb_txfrm { ++ acx100_usb_txhdr_t hdr; ++ UINT8 data[WLAN_DATA_MAXLEN]; ++} acx100_usb_txfrm_t __WLAN_ATTRIB_PACK__; ++ ++typedef struct acx100_usb_scan { ++ UINT16 cmd __WLAN_ATTRIB_PACK__; ++ UINT16 pad0 __WLAN_ATTRIB_PACK__; ++ UINT16 unk1 __WLAN_ATTRIB_PACK__; ++ UINT16 unk2 __WLAN_ATTRIB_PACK__; ++} acx100_usb_scan_t __WLAN_ATTRIB_PACK__; ++ ++typedef struct acx100_usb_scan_status { ++ UINT16 rid __WLAN_ATTRIB_PACK__; ++ UINT16 length __WLAN_ATTRIB_PACK__; ++ UINT32 status __WLAN_ATTRIB_PACK__; ++} acx100_usb_scan_status_t __WLAN_ATTRIB_PACK__; ++ ++typedef struct acx100_usb_cmdreq { ++ UINT16 type __WLAN_ATTRIB_PACK__; ++ UINT16 cmd __WLAN_ATTRIB_PACK__; ++ UINT16 parm0 __WLAN_ATTRIB_PACK__; ++ UINT16 parm1 __WLAN_ATTRIB_PACK__; ++ UINT16 parm2 __WLAN_ATTRIB_PACK__; ++ UINT8 pad[54] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_usb_cmdreq_t; ++ ++typedef struct acx100_usb_wridreq { ++ UINT16 cmd __WLAN_ATTRIB_PACK__; ++ UINT16 status __WLAN_ATTRIB_PACK__; ++ UINT16 rid __WLAN_ATTRIB_PACK__; ++ UINT16 frmlen __WLAN_ATTRIB_PACK__; ++ UINT8 data[ACX100_RIDDATA_MAXLEN] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_usb_wridreq_t; ++ ++typedef struct acx100_usb_rridreq { ++ UINT16 cmd __WLAN_ATTRIB_PACK__; ++ UINT16 status __WLAN_ATTRIB_PACK__; ++ UINT16 rid __WLAN_ATTRIB_PACK__; ++ UINT16 frmlen __WLAN_ATTRIB_PACK__; ++ UINT8 pad[56] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_usb_rridreq_t; ++ ++typedef struct acx100_usb_wmemreq { ++ UINT16 cmd __WLAN_ATTRIB_PACK__; ++ UINT16 status __WLAN_ATTRIB_PACK__; ++ /* ++ UINT16 offset __WLAN_ATTRIB_PACK__; ++ UINT16 page __WLAN_ATTRIB_PACK__; ++ */ ++ UINT8 data[ACX100_USB_RWMEM_MAXLEN] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_usb_wmemreq_t; ++ ++typedef struct acx100_usb_rxtx_ctrl { ++ UINT16 cmd __WLAN_ATTRIB_PACK__; ++ UINT16 status __WLAN_ATTRIB_PACK__; ++ UINT8 data __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_usb_rxtx_ctrl_t; ++ ++typedef struct acx100_usb_rmemreq { ++ UINT16 cmd __WLAN_ATTRIB_PACK__; ++ UINT16 status __WLAN_ATTRIB_PACK__; ++ UINT8 data[ACX100_USB_RWMEM_MAXLEN] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_usb_rmemreq_t; ++ ++/*--- Response (bulk IN) packet contents -------------------------------------*/ ++ ++typedef struct acx100_usb_rxfrm { ++ acx100_rx_frame_t desc __WLAN_ATTRIB_PACK__; ++ UINT8 data[WLAN_DATA_MAXLEN] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_usb_rxfrm_t; ++ ++typedef struct acx100_usb_infofrm { ++ UINT16 type __WLAN_ATTRIB_PACK__; ++ acx100_InfFrame_t info __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_usb_infofrm_t; ++ ++typedef struct acx100_usb_cmdresp { ++ UINT16 type __WLAN_ATTRIB_PACK__; ++ UINT16 status __WLAN_ATTRIB_PACK__; ++ UINT16 resp0 __WLAN_ATTRIB_PACK__; ++ UINT16 resp1 __WLAN_ATTRIB_PACK__; ++ UINT16 resp2 __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_usb_cmdresp_t; ++ ++typedef struct acx100_usb_wridresp { ++ UINT16 type __WLAN_ATTRIB_PACK__; ++ UINT16 status __WLAN_ATTRIB_PACK__; ++ UINT16 resp0 __WLAN_ATTRIB_PACK__; ++ UINT16 resp1 __WLAN_ATTRIB_PACK__; ++ UINT16 resp2 __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_usb_wridresp_t; ++ ++typedef struct acx100_usb_rridresp { ++ UINT16 cmd __WLAN_ATTRIB_PACK__; ++ UINT16 status __WLAN_ATTRIB_PACK__; ++ UINT16 rid __WLAN_ATTRIB_PACK__; ++ UINT16 frmlen __WLAN_ATTRIB_PACK__; ++ UINT8 data[ACX100_RIDDATA_MAXLEN] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_usb_rridresp_t; ++ ++typedef struct acx100_usb_wmemresp { ++ UINT16 type __WLAN_ATTRIB_PACK__; ++ UINT16 status __WLAN_ATTRIB_PACK__; ++ UINT16 resp0 __WLAN_ATTRIB_PACK__; ++ UINT16 resp1 __WLAN_ATTRIB_PACK__; ++ UINT16 resp2 __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_usb_wmemresp_t; ++ ++typedef struct acx100_usb_rmemresp { ++ UINT16 cmd __WLAN_ATTRIB_PACK__; ++ UINT16 status __WLAN_ATTRIB_PACK__; ++ UINT8 data[ACX100_USB_RWMEM_MAXLEN] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_usb_rmemresp_t; ++ ++typedef struct acx100_usb_bufavail { ++ UINT16 type __WLAN_ATTRIB_PACK__; ++ UINT16 frmlen __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_usb_bufavail_t; ++ ++typedef struct acx100_usb_error { ++ UINT16 type __WLAN_ATTRIB_PACK__; ++ UINT16 errortype __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_usb_error_t; ++ ++/*--- Unions for packaging all the known packet types together ---------------*/ ++ ++typedef union acx100_usbout { ++ UINT16 type __WLAN_ATTRIB_PACK__; ++ acx100_usb_txfrm_t txfrm __WLAN_ATTRIB_PACK__; ++ acx100_usb_cmdreq_t cmdreq __WLAN_ATTRIB_PACK__; ++ acx100_usb_wridreq_t wridreq __WLAN_ATTRIB_PACK__; ++ acx100_usb_rridreq_t rridreq __WLAN_ATTRIB_PACK__; ++ acx100_usb_wmemreq_t wmemreq __WLAN_ATTRIB_PACK__; ++ acx100_usb_rmemreq_t rmemreq __WLAN_ATTRIB_PACK__; ++ acx100_usb_rxtx_ctrl_t rxtx __WLAN_ATTRIB_PACK__; ++ acx100_usb_scan_t scan __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_usbout_t; ++ ++typedef union acx100_usbin { ++ UINT16 type __WLAN_ATTRIB_PACK__; ++ acx100_usb_rxfrm_t rxfrm __WLAN_ATTRIB_PACK__; ++ acx100_usb_txfrm_t txfrm __WLAN_ATTRIB_PACK__; ++ acx100_usb_infofrm_t infofrm __WLAN_ATTRIB_PACK__; ++ acx100_usb_cmdresp_t cmdresp __WLAN_ATTRIB_PACK__; ++ acx100_usb_wridresp_t wridresp __WLAN_ATTRIB_PACK__; ++ acx100_usb_rridresp_t rridresp __WLAN_ATTRIB_PACK__; ++ acx100_usb_wmemresp_t wmemresp __WLAN_ATTRIB_PACK__; ++ acx100_usb_rmemresp_t rmemresp __WLAN_ATTRIB_PACK__; ++ acx100_usb_bufavail_t bufavail __WLAN_ATTRIB_PACK__; ++ acx100_usb_error_t usberror __WLAN_ATTRIB_PACK__; ++ UINT8 boguspad[3000] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_usbin_t; ++ ++#endif /* WLAN_HOSTIF == WLAN_USB */ ++ ++/*============================================================================* ++ * PD record structures * ++ *============================================================================*/ ++ ++typedef struct acx100_pdr_pcb_partnum { ++ UINT8 num[8] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_pcb_partnum_t; ++ ++typedef struct acx100_pdr_pcb_tracenum { ++ UINT8 num[8] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_pcb_tracenum_t; ++ ++typedef struct acx100_pdr_nic_serial { ++ UINT8 num[12] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_nic_serial_t; ++ ++typedef struct acx100_pdr_mkk_measurements { ++ double carrier_freq __WLAN_ATTRIB_PACK__; ++ double occupied_band __WLAN_ATTRIB_PACK__; ++ double power_density __WLAN_ATTRIB_PACK__; ++ double tx_spur_f1 __WLAN_ATTRIB_PACK__; ++ double tx_spur_f2 __WLAN_ATTRIB_PACK__; ++ double tx_spur_f3 __WLAN_ATTRIB_PACK__; ++ double tx_spur_f4 __WLAN_ATTRIB_PACK__; ++ double tx_spur_l1 __WLAN_ATTRIB_PACK__; ++ double tx_spur_l2 __WLAN_ATTRIB_PACK__; ++ double tx_spur_l3 __WLAN_ATTRIB_PACK__; ++ double tx_spur_l4 __WLAN_ATTRIB_PACK__; ++ double rx_spur_f1 __WLAN_ATTRIB_PACK__; ++ double rx_spur_f2 __WLAN_ATTRIB_PACK__; ++ double rx_spur_l1 __WLAN_ATTRIB_PACK__; ++ double rx_spur_l2 __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_mkk_measurements_t; ++ ++typedef struct acx100_pdr_nic_ramsize { ++ UINT8 size[12] __WLAN_ATTRIB_PACK__; /* units of KB */ ++} __WLAN_ATTRIB_PACK__ acx100_pdr_nic_ramsize_t; ++ ++typedef struct acx100_pdr_mfisuprange { ++ UINT16 id __WLAN_ATTRIB_PACK__; ++ UINT16 variant __WLAN_ATTRIB_PACK__; ++ UINT16 bottom __WLAN_ATTRIB_PACK__; ++ UINT16 top __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_mfisuprange_t; ++ ++typedef struct acx100_pdr_cfisuprange { ++ UINT16 id __WLAN_ATTRIB_PACK__; ++ UINT16 variant __WLAN_ATTRIB_PACK__; ++ UINT16 bottom __WLAN_ATTRIB_PACK__; ++ UINT16 top __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_cfisuprange_t; ++ ++typedef struct acx100_pdr_nicid { ++ UINT16 id __WLAN_ATTRIB_PACK__; ++ UINT16 variant __WLAN_ATTRIB_PACK__; ++ UINT16 major __WLAN_ATTRIB_PACK__; ++ UINT16 minor __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_nicid_t; ++ ++typedef struct acx100_pdr_refdac_measurements { ++ UINT16 value[0] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_refdac_measurements_t; ++ ++typedef struct acx100_pdr_vgdac_measurements { ++ UINT16 value[0] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_vgdac_measurements_t; ++ ++typedef struct acx100_pdr_level_comp_measurements { ++ UINT16 value[0] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_level_compc_measurements_t; ++ ++typedef struct acx100_pdr_mac_address { ++ UINT8 addr[6] __WLAN_ATTRIB_PACK__; ++ UINT short_addr[6] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_mac_address_t; ++ ++typedef struct acx100_pdr_mkk_callname { ++ UINT8 callname[8] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_mkk_callname_t; ++ ++typedef struct acx100_pdr_regdomain { ++ UINT16 numdomains __WLAN_ATTRIB_PACK__; ++ UINT16 domain[5] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_regdomain_t; ++ ++typedef struct acx100_pdr_allowed_channel { ++ UINT16 ch_bitmap __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_allowed_channel_t; ++ ++typedef struct acx100_pdr_default_channel { ++ UINT16 channel __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_default_channel_t; ++ ++typedef struct acx100_pdr_privacy_option { ++ UINT16 available __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_privacy_option_t; ++ ++typedef struct acx100_pdr_temptype { ++ UINT16 type __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_temptype_t; ++ ++typedef struct acx100_pdr_refdac_setup { ++ UINT16 ch_value[14] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_refdac_setup_t; ++ ++typedef struct acx100_pdr_vgdac_setup { ++ UINT16 ch_value[14] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_vgdac_setup_t; ++ ++typedef struct acx100_pdr_level_comp_setup { ++ UINT16 ch_value[14] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_level_comp_setup_t; ++ ++typedef struct acx100_pdr_trimdac_setup { ++ UINT16 trimidac __WLAN_ATTRIB_PACK__; ++ UINT16 trimqdac __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_trimdac_setup_t; ++ ++typedef struct acx100_pdr_ifr_setting { ++ UINT16 value[3] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_ifr_setting_t; ++ ++typedef struct acx100_pdr_rfr_setting { ++ UINT16 value[3] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_rfr_setting_t; ++ ++typedef struct acx100_pdr_hfa3861_baseline { ++ UINT16 value[50] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_hfa3861_baseline_t; ++ ++typedef struct acx100_pdr_hfa3861_shadow { ++ UINT32 value[32] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_hfa3861_shadow_t; ++ ++typedef struct acx100_pdr_hfa3861_ifrf { ++ UINT32 value[20] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_hfa3861_ifrf_t; ++ ++typedef struct acx100_pdr_hfa3861_chcalsp { ++ UINT16 value[14] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_hfa3861_chcalsp_t; ++ ++typedef struct acx100_pdr_hfa3861_chcali { ++ UINT16 value[17] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_hfa3861_chcali_t; ++ ++typedef struct acx100_pdr_hfa3861_nic_config { ++ UINT16 config_bitmap __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_nic_config_t; ++ ++typedef struct acx100_pdr_hfa3861_manf_testsp { ++ UINT16 value[30] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_hfa3861_manf_testsp_t; ++ ++typedef struct acx100_pdr_hfa3861_manf_testi { ++ UINT16 value[30] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_hfa3861_manf_testi_t; ++ ++typedef struct acx100_end_of_pda { ++ UINT16 crc __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdr_end_of_pda_t; ++ ++typedef struct acx100_pdrec { ++ UINT16 len __WLAN_ATTRIB_PACK__; /* in words */ ++ UINT16 code __WLAN_ATTRIB_PACK__; ++ union pdr { ++ acx100_pdr_pcb_partnum_t pcb_partnum __WLAN_ATTRIB_PACK__; ++ acx100_pdr_pcb_tracenum_t pcb_tracenum __WLAN_ATTRIB_PACK__; ++ acx100_pdr_nic_serial_t nic_serial __WLAN_ATTRIB_PACK__; ++ acx100_pdr_mkk_measurements_t mkk_measurements ++ __WLAN_ATTRIB_PACK__; ++ acx100_pdr_nic_ramsize_t nic_ramsize __WLAN_ATTRIB_PACK__; ++ acx100_pdr_mfisuprange_t mfisuprange __WLAN_ATTRIB_PACK__; ++ acx100_pdr_cfisuprange_t cfisuprange __WLAN_ATTRIB_PACK__; ++ acx100_pdr_nicid_t nicid __WLAN_ATTRIB_PACK__; ++ acx100_pdr_refdac_measurements_t refdac_measurements ++ __WLAN_ATTRIB_PACK__; ++ acx100_pdr_vgdac_measurements_t vgdac_measurements ++ __WLAN_ATTRIB_PACK__; ++ acx100_pdr_level_compc_measurements_t ++ level_compc_measurements __WLAN_ATTRIB_PACK__; ++ acx100_pdr_mac_address_t mac_address __WLAN_ATTRIB_PACK__; ++ acx100_pdr_mkk_callname_t mkk_callname __WLAN_ATTRIB_PACK__; ++ acx100_pdr_regdomain_t regdomain __WLAN_ATTRIB_PACK__; ++ acx100_pdr_allowed_channel_t allowed_channel ++ __WLAN_ATTRIB_PACK__; ++ acx100_pdr_default_channel_t default_channel ++ __WLAN_ATTRIB_PACK__; ++ acx100_pdr_privacy_option_t privacy_option __WLAN_ATTRIB_PACK__; ++ acx100_pdr_temptype_t temptype __WLAN_ATTRIB_PACK__; ++ acx100_pdr_refdac_setup_t refdac_setup __WLAN_ATTRIB_PACK__; ++ acx100_pdr_vgdac_setup_t vgdac_setup __WLAN_ATTRIB_PACK__; ++ acx100_pdr_level_comp_setup_t level_comp_setup ++ __WLAN_ATTRIB_PACK__; ++ acx100_pdr_trimdac_setup_t trimdac_setup __WLAN_ATTRIB_PACK__; ++ acx100_pdr_ifr_setting_t ifr_setting __WLAN_ATTRIB_PACK__; ++ acx100_pdr_rfr_setting_t rfr_setting __WLAN_ATTRIB_PACK__; ++ acx100_pdr_hfa3861_baseline_t hfa3861_baseline ++ __WLAN_ATTRIB_PACK__; ++ acx100_pdr_hfa3861_shadow_t hfa3861_shadow __WLAN_ATTRIB_PACK__; ++ acx100_pdr_hfa3861_ifrf_t hfa3861_ifrf __WLAN_ATTRIB_PACK__; ++ acx100_pdr_hfa3861_chcalsp_t hfa3861_chcalsp ++ __WLAN_ATTRIB_PACK__; ++ acx100_pdr_hfa3861_chcali_t hfa3861_chcali __WLAN_ATTRIB_PACK__; ++ acx100_pdr_nic_config_t nic_config __WLAN_ATTRIB_PACK__; ++ acx100_pdr_hfa3861_manf_testsp_t hfa3861_manf_testsp ++ __WLAN_ATTRIB_PACK__; ++ acx100_pdr_hfa3861_manf_testi_t hfa3861_manf_testi ++ __WLAN_ATTRIB_PACK__; ++ acx100_pdr_end_of_pda_t end_of_pda __WLAN_ATTRIB_PACK__; ++ } data __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ acx100_pdrec_t; ++ ++/*--- Firmware statistics ----------------------------------------------------*/ ++typedef struct fw_stats { ++ UINT val0x0; /* hdr; */ ++ UINT tx_desc_of; ++ UINT rx_oom; ++ UINT rx_hdr_of; ++ UINT rx_hdr_use_next; ++ UINT rx_dropped_frame; ++ UINT rx_frame_ptr_err; ++ UINT rx_xfr_hint_trig; ++ ++ UINT rx_dma_req; /* val0x1c */ ++ UINT rx_dma_err; /* val0x20 */ ++ UINT tx_dma_req; ++ UINT tx_dma_err; /* val0x28 */ ++ ++ UINT cmd_cplt; ++ UINT fiq; ++ UINT rx_hdrs; /* val0x34 */ ++ UINT rx_cmplt; /* val0x38 */ ++ UINT rx_mem_of; /* val0x3c */ ++ UINT rx_rdys; ++ UINT irqs; ++ UINT acx_trans_procs; ++ UINT decrypt_done; /* val0x48 */ ++ UINT dma_0_done; ++ UINT dma_1_done; ++ UINT tx_exch_complet; ++ UINT commands; ++ UINT acx_rx_procs; ++ UINT hw_pm_mode_changes; ++ UINT host_acks; ++ UINT pci_pm; ++ UINT acm_wakeups; ++ ++ UINT wep_key_count; ++ UINT wep_default_key_count; ++ UINT dot11_def_key_mib; ++ UINT wep_key_not_found; ++ UINT wep_decrypt_fail; ++} fw_stats_t; ++ ++/* Firmware version struct */ ++ ++typedef struct fw_ver { ++ UINT16 vala; ++ UINT16 valb; ++ char fw_id[20]; ++ UINT32 hw_id; ++} fw_ver_t; ++ ++/*--- IEEE 802.11 header -----------------------------------------------------*/ ++/* FIXME: acx100_addr3_t should probably actually be discarded in favour of the ++ * identical linux-wlan-ng p80211_hdr_t. An even better choice would be to use ++ * the kernel's struct ieee80_11_hdr from driver/net/wireless/ieee802_11.h */ ++typedef struct acx100_addr3 { ++ /* IEEE 802.11-1999.pdf chapter 7 might help */ ++ UINT16 frame_control __WLAN_ATTRIB_PACK__; /* 0x00, wlan-ng name */ ++ UINT16 duration_id __WLAN_ATTRIB_PACK__; /* 0x02, wlan-ng name */ ++ char address1[0x6] __WLAN_ATTRIB_PACK__; /* 0x04, wlan-ng name */ ++ char address2[0x6] __WLAN_ATTRIB_PACK__; /* 0x0a */ ++ char address3[0x6] __WLAN_ATTRIB_PACK__; /* 0x10 */ ++ UINT16 sequence_control __WLAN_ATTRIB_PACK__; /* 0x16 */ ++ UINT8 *val0x18; ++ struct sk_buff *val0x1c; ++ struct sk_buff *val0x20; ++} acx100_addr3_t; ++ ++/*--- WEP stuff --------------------------------------------------------------*/ ++#define NUM_WEPKEYS 4 ++#define MAX_KEYLEN 32 ++ ++#define HOSTWEP_DEFAULTKEY_MASK (BIT1 | BIT0) ++#define HOSTWEP_DECRYPT BIT4 ++#define HOSTWEP_ENCRYPT BIT5 ++#define HOSTWEP_PRIVACYINVOKED BIT6 ++#define HOSTWEP_EXCLUDEUNENCRYPTED BIT7 ++ ++typedef struct wep_key { ++ UINT8 index; ++ size_t size; ++ UINT8 key[29]; ++ UINT16 strange_filler; ++} wep_key_t; /* size = 264 bytes (33*8) */ ++/* FIXME: We don't have size 264! Or is there 2 bytes beyond the key ++ * (strange_filler)? */ ++ ++typedef struct key_struct { ++ UINT8 addr[ETH_ALEN]; /* 0x00 */ ++ UINT16 filler1; /* 0x06 */ ++ UINT32 filler2; /* 0x08 */ ++ UINT32 index; /* 0x0c */ ++ UINT16 len; /* 0x10 */ ++ UINT8 key[29]; /* 0x12; is this long enough??? */ ++} key_struct_t; /* size = 276. FIXME: where is the remaining space?? */ ++ ++ ++typedef struct client { ++ UINT16 aid; /* association ID */ ++ char address[ETH_ALEN]; /* 0x2 */ ++ UINT8 val0x8; ++ UINT8 used; /* 0x9 */ ++ UINT16 val0xa; ++ UINT16 auth_alg; ++ UINT16 val0xe; ++ UINT8 *val0x10; // points to some data, don't know what yet ++ UINT32 unkn0x14; ++ UINT8 val0x18[0x80]; /* 0x18, used by acx100_process_authen() */ ++ UINT16 val0x98; ++ UINT16 val0x9a; ++ UINT8 pad5[8]; /* 0x9c */ ++ struct client *next; /* 0xa4 */ ++} client_t; ++ ++ ++/*--- Tx and Rx descriptor ring buffer administration ------------------------*/ ++typedef struct TIWLAN_DC { /* V3 version */ ++ struct wlandevice *priv; ++ UINT32 val0x4; /* spacing */ ++ UINT32 ui32ACXTxQueueStart; /* 0x8, official name */ ++ UINT32 ui32ACXRxQueueStart; /* 0xc */ ++ UINT8 *pTxBufferPool; /* 0x10 */ ++ dma_addr_t TxBufferPoolPhyAddr; /* 0x14 */ ++ UINT32 TxBufferPoolSize; /* 0x18 */ ++ struct txdescriptor *pTxDescQPool; /* V13POS 0x1c, official name */ ++ UINT32 tx_pool_count; /* 0x20 indicates # of ring buffer pool entries */ ++ UINT32 tx_head; /* 0x24 current ring buffer pool member index */ ++ UINT32 tx_tail; /* 0x34,pool_idx2 is not correct, I'm ++ * just using it as a ring watch ++ * official name */ ++ struct framehdr *pFrameHdrQPool;/* 0x28 */ ++ UINT32 FrameHdrQPoolSize; /* 0x2c */ ++ dma_addr_t FrameHdrQPoolPhyAddr; /* 0x30 */ ++ UINT32 val0x38; /* 0x38, NOT USED */ ++ ++ struct txhostdescriptor *pTxHostDescQPool; /* V3POS 0x3c, V1POS 0x60 */ ++ UINT TxHostDescQPoolSize; /* 0x40 */ ++ UINT32 TxHostDescQPoolPhyAddr; /* 0x44 */ ++ UINT32 val0x48; /* 0x48, NOT USED */ ++ UINT32 val0x4c; /* 0x4c, NOT USED */ ++ ++ struct rxdescriptor *pRxDescQPool; /* V1POS 0x74, V3POS 0x50 */ ++ UINT32 rx_pool_count; /* V1POS 0x78, V3POS 0X54 */ ++ UINT32 rx_tail; /* 0x6c */ ++ UINT32 val0x50; /* V1POS:0x50, some size NOT USED */ ++ UINT32 val0x54; /* 0x54, official name NOT USED */ ++ ++ struct rxhostdescriptor *pRxHostDescQPool; /* 0x58, is it really rxdescriptor? */ ++ UINT32 RxHostDescQPoolSize; /* 0x5c */ ++ UINT32 RxHostDescQPoolPhyAddr; /* 0x60, official name. */ ++ UINT32 val0x64; /* 0x64, some size */ ++ UINT32 *pRxBufferPool; /* *rxdescq1; 0x70 */ ++ UINT32 RxBufferPoolPhyAddr; /* *rxdescq2; 0x74 */ ++ UINT32 RxBufferPoolSize; ++} TIWLAN_DC; ++ ++/*--- 802.11 Management capabilities -----------------------------------------*/ ++#define IEEE802_11_MGMT_CAP_ESS (1 << 0) ++#define IEEE802_11_MGMT_CAP_IBSS (1 << 1) ++#define IEEE802_11_MGMT_CAP_CFP_ABLE (1 << 2) ++#define IEEE802_11_MGMT_CAP_CFP_REQ (1 << 3) ++#define IEEE802_11_MGMT_CAP_WEP (1 << 4) ++#define IEEE802_11_MGMT_CAP_SHORT_PRE (1 << 5) ++#define IEEE802_11_MGMT_CAP_PBCC (1 << 6) ++#define IEEE802_11_MGMT_CAP_CHAN_AGIL (1 << 7) ++ ++/*--- 802.11 Basic Service Set info ------------------------------------------*/ ++typedef struct bss_info { ++ UINT8 bssid[ETH_ALEN]; /* BSSID (network ID of the device) */ ++ UINT8 mac_addr[ETH_ALEN]; /* MAC address of the station's device */ ++ UINT8 essid[IW_ESSID_MAX_SIZE + 1]; /* ESSID and trailing '\0' */ ++ size_t essid_len; /* Length of ESSID (FIXME: \0 included?) */ ++ UINT16 caps; /* 802.11 capabilities information */ ++ UINT8 channel; /* 802.11 channel */ ++ UINT16 wep; /* WEP flag (FIXME: redundant, bit 4 in caps) */ ++ unsigned char supp_rates[64]; /* FIXME: 802.11b section 7.3.2.2 allows 8 rates, but 802.11g devices seem to allow for many more: how many exactly? */ ++ UINT32 sir; /* 0x78; Standard IR */ ++ UINT32 snr; /* 0x7c; Signal to Noise Ratio */ ++ UINT16 beacon_interval; /* 802.11 beacon interval */ ++} bss_info_t; /* 132 0x84 */ ++ ++/*============================================================================* ++ * Main acx100 per-device data structure (netdev->priv) * ++ *============================================================================*/ ++ ++#define ACX_STATE_FW_LOADED 0x01 ++#define ACX_STATE_IFACE_UP 0x02 ++ ++/* MAC mode (BSS type) defines for ACX100. ++ * Note that they shouldn't be redefined, since they are also used ++ * during communication with firmware */ ++#define ACX_MODE_0_IBSS_ADHOC 0 ++#define ACX_MODE_1_UNUSED 1 ++#define ACX_MODE_2_MANAGED_STA 2 ++#define ACX_MODE_3_MANAGED_AP 3 ++#define ACX_MODE_FF_AUTO 0xff /* pseudo mode - not ACX100 related! (accept both Ad-Hoc and Managed stations for association) */ ++ ++ ++ ++/* FIXME: this should be named something like struct acx100_priv (typedef'd to ++ * acx100_priv_t) */ ++ ++typedef struct wlandevice { ++ /*** Device chain ***/ ++ struct wlandevice *next; /* link for list of devices */ ++ ++ /*** Linux network device ***/ ++ struct net_device *netdev; /* pointer to linux netdevice */ ++ struct net_device *prev_nd; /* FIXME: We should not chain via our ++ * private struct wlandevice _and_ ++ * the struct net_device. */ ++ ++ /*** Device statistics ***/ ++ struct net_device_stats stats; /* net device statistics */ ++#ifdef WIRELESS_EXT ++ struct iw_statistics wstats; /* wireless statistics */ ++#endif ++/* struct p80211_frmrx_t rx; */ /* 802.11 frame rx statistics */ ++ ++ /*** Power managment ***/ ++ struct pm_dev *pm; /* PM crap */ ++ ++ /*** USB stuff ***/ ++#if (WLAN_HOSTIF==WLAN_USB) ++ struct usb_device *usbdev; ++ acx100_usbin_t usbin; ++ acx100_usbin_t bulkin; ++ acx100_usbout_t usbout; ++ acx100_usbout_t bulkout; ++ int usb_txoffset; ++ int usb_txsize; ++ int usb_max_bulkout; ++ int usb_tx_mutex; ++ struct txdescriptor * currentdesc; ++ spinlock_t usb_ctrl_lock; ++ spinlock_t usb_tx_lock; ++ struct urb *ctrl_urb; ++ struct urb *bulkrx_urb; ++ struct urb *bulktx_urb; ++ unsigned char usb_setup[8]; ++#endif ++ ++ /*** Management timer ***/ ++ struct timer_list mgmt_timer; ++ ++ /*** Locking ***/ ++ spinlock_t lock; /* mutex for concurrent accesses to structure */ ++ ++ /*** Hardware identification ***/ ++ UINT8 form_factor; ++ UINT8 radio_type; ++ UINT8 eeprom_version; ++ ++ /*** Firmware identification ***/ ++ char firmware_version[20]; ++ UINT32 firmware_numver; ++ UINT32 firmware_id; ++ ++ /*** Hardware resources ***/ ++ UINT16 irq_mask; /* interrupts types to mask out (not wanted) */ ++ ++ unsigned long membase; /* 10 */ ++ unsigned long membase2; /* 14 */ ++ unsigned long iobase; /* 18 */ ++ unsigned long iobase2; /* 1c */ ++ UINT chip_type; ++ char *chip_name; ++ UINT8 bus_type; ++ UINT16 *io; ++ ++ /*** Device state ***/ ++ int hw_unavailable; /* indicates whether the hardware has been ++ * suspended or ejected. actually a counter. */ ++ UINT16 dev_state_mask; ++ int monitor; /* whether the device is in monitor mode */ ++ int monitor_setting; ++ UINT8 led_power; /* power led status */ ++ UINT32 get_mask; /* mask of settings to fetch from the card */ ++ UINT32 set_mask; /* mask of settings to write to the card */ ++ ++ /*** scanning ***/ ++ UINT16 scan_count; /* number of times to do channel scan */ ++ UINT8 scan_mode; /* 0 == active, 1 == passive, 2 == background */ ++ UINT16 scan_duration; ++ UINT16 scan_probe_delay; ++ ++ /*** Wireless network settings ***/ ++ UINT8 dev_addr[MAX_ADDR_LEN]; /* copy of the device address (ifconfig hw ether) that we actually use for 802.11; copied over from the network device's MAC address (ifconfig) when it makes sense only */ ++ UINT8 address[ETH_ALEN]; /* the BSSID before joining */ ++ UINT8 bssid[ETH_ALEN]; /* the BSSID after having joined */ ++ UINT8 ap[ETH_ALEN]; /* The AP we want, FF:FF:FF:FF:FF:FF is any */ ++ UINT16 macmode_wanted; /* That's the MAC mode we want (iwconfig) */ ++ UINT16 macmode_chosen; /* That's the MAC mode we chose after browsing the station list */ ++ UINT16 macmode_joined; /* This is the MAC mode we're currently in */ ++ UINT8 essid_active; /* specific ESSID active, or select any? */ ++ UINT8 essid_len; /* to avoid dozens of strlen() */ ++ char essid[IW_ESSID_MAX_SIZE+1]; /* V3POS 84; essid; INCLUDES \0 termination for easy printf - but many places simply want the string data memcpy'd plus a length indicator! Keep that in mind... */ ++ char essid_for_assoc[IW_ESSID_MAX_SIZE+1]; /* the ESSID we are going to use for association, in case of "essid 'any'" and in case of hidden ESSID (use configured ESSID then) */ ++ char nick[IW_ESSID_MAX_SIZE+1]; /* see essid! */ ++ UINT16 channel; /* V3POS 22f0, V1POS b8 */ ++ UINT8 txrate_cfg; /* Tx rate from iwconfig */ ++ UINT8 txrate_auto; /* whether to auto adjust Tx rates */ ++ UINT8 txrate_auto_idx; /* index into rate table */ ++ UINT8 txrate_auto_idx_max; ++ UINT8 txrate_curr; /* the Tx rate we currently use */ ++ /* settings in DWL-520+ .inf file: */ ++ UINT8 txrate_fallback_retries; /* 0-255, default 1 */ ++ UINT8 txrate_fallback_threshold; /* 0-100, default 12 */ ++ UINT8 txrate_fallback_count; ++ UINT8 txrate_stepup_threshold; /* 0-100, default 3 */ ++ UINT8 txrate_stepup_count; ++ UINT8 reg_dom_id; /* reg domain setting */ ++ UINT16 reg_dom_chanmask; ++ UINT16 status; /* 802.11 association status */ ++ UINT16 unknown0x2350; /* FIXME: old status ?? */ ++ UINT16 auth_assoc_retries; /* V3POS 2827, V1POS 27ff */ ++ ++ UINT16 bss_table_count; /* # of active BSS scan table entries */ ++ struct bss_info bss_table[32]; /* BSS scan table */ ++ struct bss_info station_assoc; /* the station we're currently associated to */ ++ UINT8 scan_running; ++ UINT32 scan_start; ++ UINT16 scan_retries; /* V3POS 2826, V1POS 27fe */ ++ ++ client_t sta_list[32]; /* should those two be of */ ++ client_t *sta_hash_tab[64]; /* equal size? */ ++ ++ ++ /* 802.11 power save mode */ ++ UINT8 ps_wakeup_cfg; ++ UINT8 ps_listen_interval; ++ UINT8 ps_options; ++ UINT8 ps_hangover_period; ++ UINT16 ps_enhanced_transition_time; ++ ++ /*** PHY settings ***/ ++ UINT8 sensitivity; ++ UINT8 tx_disabled; ++ UINT8 tx_level_dbm; ++ UINT8 tx_level_val; ++ UINT8 tx_level_auto; /* whether to do automatic power adjustment */ ++ UINT8 antenna; /* antenna settings */ ++ UINT8 ed_threshold; /* energy detect threshold */ ++ UINT8 cca; /* clear channel assessment */ ++ UINT8 preamble_mode; /* 0 == Long Preamble, 1 == Short, 2 == Auto */ ++ UINT8 preamble_flag; /* 0 == Long Preamble, 1 == Short */ ++ ++ UINT16 rts_threshold; ++ UINT32 short_retry; /* V3POS 204, V1POS 20c */ ++ UINT32 long_retry; /* V3POS 208, V1POS 210 */ ++ UINT16 msdu_lifetime; /* V3POS 20c, V1POS 214 */ ++ UINT32 auth_alg; /* V3POS 228, V3POS 230, used in transmit_authen1 */ ++ UINT16 listen_interval; /* V3POS 250, V1POS 258, given in units of beacon interval */ ++ UINT32 beacon_interval; /* V3POS 2300, V1POS c8 */ ++ ++ UINT16 capabilities; /* V3POS b0 */ ++ UINT8 capab_short; /* V3POS 1ec, V1POS 1f4 */ ++ UINT8 capab_pbcc; /* V3POS 1f0, V1POS 1f8 */ ++ UINT8 capab_agility; /* V3POS 1f4, V1POS 1fc */ ++ UINT8 rate_spt_len; /* V3POS 1243, V1POS 124b */ ++ UINT8 rate_support1[5]; /* V3POS 1244, V1POS 124c */ ++ UINT8 rate_support2[5]; /* V3POS 1254, V1POS 125c */ ++ ++ /*** Encryption settings (WEP) ***/ ++ UINT8 wep_enabled; ++ UINT8 wep_restricted; /* V3POS c0 */ ++ UINT8 wep_current_index; /* V3POS 254, V1POS 25c not sure about this */ ++ wep_key_t wep_keys[NUM_WEPKEYS]; /* V3POS 268 (it is NOT 260, but 260 plus offset 8!), V1POS 270 */ ++ key_struct_t wep_key_struct[10]; /* V3POS 688 */ ++ ++ /*** Card Rx/Tx management ***/ ++ UINT16 rx_config_1; /* V3POS 2820, V1POS 27f8 */ ++ UINT16 rx_config_2; /* V3POS 2822, V1POS 27fa */ ++ TIWLAN_DC dc; /* V3POS 2380, V1POS 2338 */ ++ UINT32 TxQueueNo; /* V3POS 24dc, V1POS 24b4 */ ++ UINT32 RxQueueNo; /* V3POS 24f4, V1POS 24cc */ ++ UINT32 TxQueueFree; ++ struct rxhostdescriptor *RxHostDescPoolStart; /* V3POS 24f8, V1POS 24d0 */ ++ UINT16 memblocksize; /* V3POS 2354, V1POS 230c */ ++ UINT32 RxBlockNum; /* V3POS 24e4, V1POS 24bc */ ++ UINT32 TotalRxBlockSize; /* V3POS 24e8, V1POS 24c0 */ ++ UINT32 TxBlockNum; /* V3POS 24fc, V1POS 24d4 */ ++ UINT32 TotalTxBlockSize; /* V3POS 2500, V1POS 24d8 */ ++ ++ /*** ACX100 command interface ***/ ++ UINT16 cmd_type; /* V3POS 2508, V1POS 24e0 */ ++ UINT16 cmd_status; /* V3POS 250a, V1POS 24e2 */ ++ UINT32 CommandParameters; /* FIXME: used to be an array UINT*0x88, ++ * but it should most likely be *one* ++ * UINT32 instead, pointing to the cmd ++ * param memory. V3POS 268c, V1POS 2664 */ ++ ++ UINT16 info_type; /* V3POS 2508, V1POS 24e0 */ ++ UINT16 info_status; /* V3POS 250a, V1POS 24e2 */ ++ UINT32 InfoParameters; /* V3POS 2814, V1POS 27ec */ ++ ++ /*** Unknown ***/ ++ UINT8 dtim_interval; /* V3POS 2302 */ ++ UINT8 val0x2324[0x8]; /* V3POS 2324 */ ++} wlandevice_t __WLAN_ATTRIB_PACK__; ++ ++/*-- MAC modes --*/ ++#define WLAN_MACMODE_NONE 0 ++#define WLAN_MACMODE_IBSS_STA 1 ++#define WLAN_MACMODE_ESS_STA 2 ++#define WLAN_MACMODE_ESS_AP 3 ++ ++/*-- rx_config_1 bitfield --*/ ++/* bit description ++ * 13 include additional header (length etc.) *required* ++ * 10 receive only own beacon frames ++ * 9 discard broadcast (01:xx:xx:xx:xx:xx in mac) ++ * 8,7,6 ??? ++ * 5 BSSID filter ++ * 4 promiscuous mode (aka. filter wrong mac addr) ++ * 3 receive ALL frames (disable filter) ++ * 2 include FCS ++ * 1 include additional header (802.11 phy?) ++ * 0 ??? ++ */ ++#define RX_CFG1_PLUS_ADDIT_HDR 0x2000 ++#define RX_CFG1_ONLY_OWN_BEACONS 0x0400 ++#define RX_CFG1_DISABLE_BCAST 0x0200 ++#define RX_CFG1_FILTER_BSSID 0x0020 ++#define RX_CFG1_PROMISCUOUS 0x0010 ++#define RX_CFG1_RCV_ALL_FRAMES 0x0008 ++#define RX_CFG1_INCLUDE_FCS 0x0004 ++#define RX_CFG1_INCLUDE_ADDIT_HDR 0x0002 ++ ++/*-- rx_config_2 bitfield --*/ ++/* bit description ++ * 11 receive association requests etc. ++ * 10 receive authentication frames ++ * 9 receive beacon frames ++ * 8 ?? filter on some bit in 802.11 header ?? ++ * 7 receive control frames ++ * 6 receive data frames ++ * 5 receive broken frames ++ * 4 receive management frames ++ * 3 receive probe requests ++ * 2 receive probe responses ++ * 1 receive ack frames ++ * 0 receive other ++ */ ++#define RX_CFG2_RCV_ASSOC_REQ 0x0800 ++#define RX_CFG2_RCV_AUTH_FRAMES 0x0400 ++#define RX_CFG2_RCV_BEACON_FRAMES 0x0200 ++#define RX_CFG2_FILTER_ON_SOME_BIT 0x0100 ++#define RX_CFG2_RCV_CTRL_FRAMES 0x0080 ++#define RX_CFG2_RCV_DATA_FRAMES 0x0040 ++#define RX_CFG2_RCV_BROKEN_FRAMES 0x0020 ++#define RX_CFG2_RCV_MGMT_FRAMES 0x0010 ++#define RX_CFG2_RCV_PROBE_REQ 0x0008 ++#define RX_CFG2_RCV_PROBE_RESP 0x0004 ++#define RX_CFG2_RCV_ACK_FRAMES 0x0002 ++#define RX_CFG2_RCV_OTHER 0x0001 ++ ++/*-- get and set mask values --*/ ++#define GETSET_LED_POWER 0x00000001L ++#define GET_STATION_ID 0x00000002L ++#define SET_TEMPLATES 0x00000004L ++#define SET_STA_LIST 0x00000008L ++#define GETSET_TX 0x00000010L ++#define GETSET_RX 0x00000020L ++#define SET_RXCONFIG 0x00000040L ++#define GETSET_ANTENNA 0x00000080L ++#define GETSET_SENSITIVITY 0x00000100L ++#define GETSET_TXPOWER 0x00000200L ++#define GETSET_ED_THRESH 0x00000400L ++#define GETSET_CCA 0x00000800L ++#define GETSET_POWER_80211 0x00001000L ++#define GETSET_RETRY 0x00002000L ++#define GETSET_REG_DOMAIN 0x00004000L ++#define GETSET_CHANNEL 0x00008000L ++#define GETSET_ESSID 0x00010000L ++#define GETSET_MODE 0x00020000L ++#define GETSET_WEP 0x00040000L ++#define SET_WEP_OPTIONS 0x00080000L ++#define SET_MSDU_LIFETIME 0x00100000L ++#define SET_RATE_FALLBACK 0x00200000L ++#define GETSET_ALL 0x80000000L ++ ++void acx100_disable_irq(wlandevice_t *priv); ++void acx100_enable_irq(wlandevice_t *priv); ++void acx100_rx(struct rxhostdescriptor *rxdesc, wlandevice_t *priv); ++ ++/*============================================================================* ++ * Locking and synchronization functions * ++ *============================================================================*/ ++ ++/* These functions *must* be inline or they will break horribly on SPARC, due ++ * to its weird semantics for save/restore flags. extern inline should prevent ++ * the kernel from linking or module from loading if they are not inlined. */ ++ ++#ifdef BROKEN_LOCKING ++extern inline int acx100_lock(wlandevice_t *priv, unsigned long *flags) ++{ ++ local_irq_save(*flags); ++ if (!spin_trylock(&priv->lock)) { ++ printk("ARGH! Lock already taken in %s\n", __func__); ++ local_irq_restore(*flags); ++ return -EFAULT; ++ } else { ++ printk("Lock given out in %s\n", __func__); ++ } ++ if (priv->hw_unavailable) { ++ printk(KERN_WARNING ++ "acx100_lock() called with hw_unavailable (dev=%p)\n", ++ priv->netdev); ++ spin_unlock_irqrestore(&priv->lock, *flags); ++ return -EBUSY; ++ } ++ return 0; ++} ++ ++extern inline void acx100_unlock(wlandevice_t *priv, unsigned long *flags) ++{ ++ /* printk(KERN_WARNING "unlock\n"); */ ++ spin_unlock_irqrestore(&priv->lock, *flags); ++ /* printk(KERN_WARNING "/unlock\n"); */ ++} ++ ++#else /* BROKEN_LOCKING */ ++ ++extern inline int acx100_lock(wlandevice_t *priv, unsigned long *flags) ++{ ++ /* do nothing and be quiet */ ++ /*@-noeffect@*/ ++ (void)*priv; ++ (void)*flags; ++ /*@=noeffect@*/ ++ return 0; ++} ++ ++extern inline void acx100_unlock(wlandevice_t *priv, unsigned long *flags) ++{ ++ /* do nothing and be quiet */ ++ /*@-noeffect@*/ ++ (void)*priv; ++ (void)*flags; ++ /*@=noeffect@*/ ++} ++#endif /* BROKEN_LOCKING */ ++ ++/* FIXME: LINUX_VERSION_CODE < KERNEL_VERSION(2,4,XX) ?? (not defined in XX=10 ++ * defined in XX=21, someone care to do a binary search of that range to find ++ * the exact version this went in? */ ++#ifndef ARPHRD_IEEE80211_PRISM ++#define ARPHRD_IEEE80211_PRISM 802 ++#endif ++ ++#endif /* _ACX100_H */ +diff -urN x/drivers/net/wireless/acx/acx100_conv.c y/drivers/net/wireless/acx/acx100_conv.c +--- x/drivers/net/wireless/acx/acx100_conv.c 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/acx/acx100_conv.c 2004-04-14 02:14:56.000000000 +1000 +@@ -0,0 +1,588 @@ ++/* src/p80211conv.c - conversion between 802.11 and ethernet ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Copyright (C) 2003 ACX100 Open Source Project ++ * ++ * The contents of this file are subject to the Mozilla Public ++ * License Version 1.1 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS ++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or ++ * implied. See the License for the specific language governing ++ * rights and limitations under the License. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU Public License version 2 (the "GPL"), in which ++ * case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use ++ * your version of this file under the MPL, indicate your decision ++ * by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL. If you do not delete ++ * the provisions above, a recipient may use your version of this ++ * file under either the MPL or the GPL. ++ * ++ * -------------------------------------------------------------------- ++ * ++ * This code is based on elements which are ++ * Copyright (C) 1999 AbsoluteValue Systems, Inc. All Rights Reserved. ++ * info@linux-wlan.com ++ * http://www.linux-wlan.com ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Inquiries regarding the ACX100 Open Source Project can be ++ * made directly to: ++ * ++ * acx100-users@lists.sf.net ++ * http://acx100.sf.net ++ * ++ * -------------------------------------------------------------------- ++ */ ++ ++#ifdef S_SPLINT_S /* some crap that splint needs to not crap out */ ++#define __signed__ signed ++#define __u64 unsigned long long ++#define loff_t unsigned long ++#define sigval_t unsigned long ++#define siginfo_t unsigned long ++#define stack_t unsigned long ++#define __s64 signed long long ++#endif ++#include ++#include ++ ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static UINT8 oui_rfc1042[] = { (UINT8)0x00, (UINT8)0x00, (UINT8)0x00 }; ++static UINT8 oui_8021h[] = { (UINT8)0x00, (UINT8)0x00, (UINT8)0xf8 }; ++ ++/*---------------------------------------------------------------- ++* acx100_rxdesc_to_txdesc ++* ++* Converts a rx descriptor to a tx descriptor. ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++void acx100_rxdesc_to_txdesc(struct rxhostdescriptor *rxdesc, ++ struct txdescriptor *txdesc) ++{ ++ struct txhostdescriptor *payload; ++ struct txhostdescriptor *header; ++ ++ payload = txdesc->host_desc + 1; ++ header = txdesc->host_desc; ++ ++ payload->data_offset = 0; ++ header->data_offset = 0; ++ ++ memcpy(header->data, &rxdesc->data->buf, WLAN_HDR_A3_LEN); ++ memcpy(payload->data, &rxdesc->data->val0x24, ++ (rxdesc->data->mac_cnt_rcvd & 0xfff) - WLAN_HDR_A3_LEN); ++ ++} ++ ++/*---------------------------------------------------------------- ++* acx100_stt_findproto ++* ++* Searches the 802.1h Selective Translation Table for a given ++* protocol. ++* ++* Arguments: ++* prottype protocol number (in host order) to search for. ++* ++* Returns: ++* 1 - if the table is empty or a match is found. ++* 0 - if the table is non-empty and a match is not found. ++* ++* Side effects: ++* ++* Call context: ++* May be called in interrupt or non-interrupt context ++* ++* STATUS: ++* ++* Comment: ++* Based largely on p80211conv.c of the linux-wlan-ng project ++* ++*----------------------------------------------------------------*/ ++ ++static inline int acx100_stt_findproto(unsigned int proto) ++{ ++ /* Always return found for now. This is the behavior used by the */ ++ /* Zoom Win95 driver when 802.1h mode is selected */ ++ /* TODO: If necessary, add an actual search we'll probably ++ need this to match the CMAC's way of doing things. ++ Need to do some testing to confirm. ++ */ ++ ++ if (proto == 0x80f3) /* APPLETALK */ ++ return 1; ++ ++ return 0; ++// return ((prottype == ETH_P_AARP) || (prottype == ETH_P_IPX)); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_ether_to_txdesc ++* ++* Uses the contents of the ether frame to build the elements of ++* the 802.11 frame. ++* ++* We don't actually set up the frame header here. That's the ++* MAC's job. We're only handling conversion of DIXII or 802.3+LLC ++* frames to something that works with 802.11. ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* FINISHED ++* ++* Comment: ++* Based largely on p80211conv.c of the linux-wlan-ng project ++* ++*----------------------------------------------------------------*/ ++ ++int acx100_ether_to_txdesc(wlandevice_t *priv, ++ struct txdescriptor *tx_desc, ++ struct sk_buff *skb) ++{ ++ unsigned short proto; /* protocol type or data length, depending on whether DIX or 802.3 ethernet format */ ++ UINT16 fc; ++ struct txhostdescriptor *payload; ++ struct txhostdescriptor *header; ++ p80211_hdr_t * w_hdr; ++ ++ wlan_ethhdr_t *e_hdr; ++ struct wlan_llc *e_llc; ++ struct wlan_snap *e_snap; ++ ++ UINT8 *a1 = NULL; ++ UINT8 *a2 = NULL; ++ UINT8 *a3 = NULL; ++ ++// int i; ++ ++ FN_ENTER; ++ ++ if (0 == skb->len) { ++ acxlog(L_DEBUG, "zero-length skb!\n"); ++ return 1; ++ } ++ ++ payload = tx_desc->host_desc + 1; ++ header = tx_desc->host_desc; ++ if (0xffffffff == (unsigned long)header) /* FIXME: happens on card eject; better method? */ ++ return 1; ++ e_hdr = (wlan_ethhdr_t *)skb->data; ++ ++ /* step 1: classify ether frame, DIX or 802.3? */ ++ proto = ntohs(e_hdr->type); ++ if (proto <= 1500) { ++ acxlog(L_DEBUG, "802.3 len: %d\n", skb->len); ++ /* codes <= 1500 reserved for 802.3 lengths */ ++ /* it's 802.3, pass ether payload unchanged, */ ++ ++ /* trim off ethernet header and copy payload to tx_desc */ ++ payload->length = proto; ++ memcpy(payload->data, skb->data + sizeof(wlan_ethhdr_t), payload->length); ++ } else { ++ /* it's DIXII, time for some conversion */ ++ /* Create 802.11 packet. Header also contains llc and snap. */ ++ ++ acxlog(L_DEBUG, "<= DIXII len: %d\n", skb->len); ++ ++ /* size of header is 802.11 header + llc + snap */ ++ header->length = WLAN_HDR_A3_LEN + sizeof(wlan_llc_t) + sizeof(wlan_snap_t); ++ /* llc is located behind the 802.11 header */ ++ e_llc = (wlan_llc_t*)(header->data + WLAN_HDR_A3_LEN); ++ /* snap is located behind the llc */ ++ e_snap = (wlan_snap_t*)((UINT8*)e_llc + sizeof(wlan_llc_t)); ++ ++ /* setup the LLC header */ ++ e_llc->dsap = (UINT8)0xaa; /* SNAP, see IEEE 802 */ ++ e_llc->ssap = (UINT8)0xaa; ++ e_llc->ctl = (UINT8)0x03; ++ ++ /* setup the SNAP header */ ++ e_snap->type = htons(proto); ++ if (0 != acx100_stt_findproto(proto)) { ++ memcpy(e_snap->oui, oui_8021h, WLAN_IEEE_OUI_LEN); ++ } else { ++ memcpy(e_snap->oui, oui_rfc1042, WLAN_IEEE_OUI_LEN); ++ } ++ /* trim off ethernet header and copy payload to tx_desc */ ++ payload->length = skb->len - sizeof(wlan_ethhdr_t); ++ memcpy(payload->data, skb->data + sizeof(wlan_ethhdr_t), payload->length); ++ } ++ ++ payload->data_offset = 0; ++ header->data_offset = 0; ++ ++ /* calculate total tx_desc length */ ++ tx_desc->total_length = payload->length + header->length; ++ ++ /* Set up the 802.11 header */ ++ w_hdr = (p80211_hdr_t*)header->data; ++ ++ /* It's a data frame */ ++ fc = host2ieee16(WLAN_SET_FC_FTYPE(WLAN_FTYPE_DATA) | ++ WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_DATAONLY)); ++ ++ switch (priv->macmode_joined) { ++ case ACX_MODE_0_IBSS_ADHOC: ++ case ACX_MODE_1_UNUSED: ++ a1 = e_hdr->daddr; ++ a2 = priv->dev_addr; ++ a3 = priv->bssid; ++ break; ++ case ACX_MODE_2_MANAGED_STA: ++ fc |= host2ieee16(WLAN_SET_FC_TODS(1)); ++ a1 = priv->bssid; ++ a2 = priv->dev_addr; ++ a3 = e_hdr->daddr; ++ break; ++ case ACX_MODE_3_MANAGED_AP: ++ fc |= host2ieee16(WLAN_SET_FC_FROMDS(1)); ++ a1 = e_hdr->daddr; ++ a2 = priv->bssid; ++ a3 = e_hdr->saddr; ++ break; ++ default: /* fall through */ ++ acxlog(L_STD, "Error: Converting eth to wlan in unknown mode.\n"); ++ goto fail; ++ } ++ MAC_COPY(w_hdr->a3.a1, a1); ++ MAC_COPY(w_hdr->a3.a2, a2); ++ MAC_COPY(w_hdr->a3.a3, a3); ++ ++ if (0 != priv->wep_enabled) ++ fc |= host2ieee16(WLAN_SET_FC_ISWEP(1)); ++ ++ w_hdr->a3.fc = fc; ++ w_hdr->a3.dur = 0; ++ w_hdr->a3.seq = 0; ++ ++ /* the "<6>" output is from the KERN_INFO channel value */ ++// Can be used to debug conversion process ++/* acxlog(L_DATA, "Original eth frame [%d]: ", skb->len); ++ for (i = 0; i < skb->len; i++) ++ acxlog(L_DATA, "%02x ", ((UINT8 *) skb->data)[i]); ++ acxlog(L_DATA, "\n"); ++ ++ acxlog(L_DATA, "802.11 header [%d]: ", header->length); ++ for (i = 0; i < header->length; i++) ++ acxlog(L_DATA, "%02x ", ((UINT8 *) header->data)[i]); ++ acxlog(L_DATA, "\n"); ++ ++ acxlog(L_DATA, "802.11 payload [%d]: ", payload->length); ++ for (i = 0; i < payload->length; i++) ++ acxlog(L_DATA, "%02x ", ((UINT8 *) payload->data)[i]); ++ acxlog(L_DATA, "\n"); ++*/ ++ ++fail: ++ FN_EXIT(0, 0); ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_rxdesc_to_ether ++* ++* Uses the contents of a received 802.11 frame to build an ether ++* frame. ++* ++* This function extracts the src and dest address from the 802.11 ++* frame to use in the construction of the eth frame. ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* FINISHED ++* ++* Comment: ++* Based largely on p80211conv.c of the linux-wlan-ng project ++* ++*----------------------------------------------------------------*/ ++ ++/*@null@*/ struct sk_buff *acx100_rxdesc_to_ether(wlandevice_t *priv, struct ++ rxhostdescriptor *rx_desc) ++{ ++ UINT8 *daddr = NULL; ++ UINT8 *saddr = NULL; ++ wlan_ethhdr_t *e_hdr; ++ wlan_llc_t *e_llc; ++ wlan_snap_t *e_snap; ++ UINT8 *e_payload; ++ struct sk_buff *skb = NULL; ++ p80211_hdr_t *w_hdr; ++ UINT buflen; ++ UINT16 fc; ++ int payload_length; ++ UINT payload_offset; ++ ++// int i; ++ ++ FN_ENTER; ++ ++ payload_length = (rx_desc->data->mac_cnt_rcvd & 0xfff) - WLAN_HDR_A3_LEN; ++ payload_offset = WLAN_HDR_A3_LEN; ++ ++ w_hdr = (p80211_hdr_t*)&rx_desc->data->buf; ++ ++ /* check if additional header is included */ ++ if (0 != (priv->rx_config_1 & RX_CFG1_INCLUDE_ADDIT_HDR)) { ++ /* Mmm, strange, when receiving a packet, 4 bytes precede the packet. Is it the CRC ? */ ++ w_hdr = (p80211_hdr_t*)(((UINT8*)w_hdr) + WLAN_CRC_LEN); ++ payload_length -= WLAN_CRC_LEN; ++ } ++ ++ /* setup some vars for convenience */ ++ fc = ieee2host16(w_hdr->a3.fc); ++ if ((0 == WLAN_GET_FC_TODS(fc)) && (0 == WLAN_GET_FC_FROMDS(fc))) { ++ daddr = w_hdr->a3.a1; ++ saddr = w_hdr->a3.a2; ++ } else if (0 == (WLAN_GET_FC_TODS(fc)) && (1 == WLAN_GET_FC_FROMDS(fc))) { ++ daddr = w_hdr->a3.a1; ++ saddr = w_hdr->a3.a3; ++ } else if ((1 == WLAN_GET_FC_TODS(fc)) && (0 == WLAN_GET_FC_FROMDS(fc))) { ++ daddr = w_hdr->a3.a3; ++ saddr = w_hdr->a3.a2; ++ } else { ++ payload_offset = WLAN_HDR_A4_LEN; ++ payload_length -= ( WLAN_HDR_A4_LEN - WLAN_HDR_A3_LEN ); ++ if (0 > payload_length) { ++ acxlog(L_STD, "A4 frame too short!\n"); ++ return NULL; ++ } ++ daddr = w_hdr->a4.a3; ++ saddr = w_hdr->a4.a4; ++ } ++ ++ if (0 != WLAN_GET_FC_ISWEP(fc)) { ++ /* chop off the IV+ICV WEP header and footer */ ++ acxlog(L_DATA | L_DEBUG, "It's a WEP packet, chopping off IV and ICV.\n"); ++ payload_length -= 8; ++ payload_offset += 4; ++ } ++ ++ e_hdr = (wlan_ethhdr_t *) ((UINT8*) w_hdr + payload_offset); ++ ++ e_llc = (wlan_llc_t *) ((UINT8*) w_hdr + payload_offset); ++ e_snap = (wlan_snap_t *) (((UINT8 *) e_llc) + sizeof(wlan_llc_t)); ++ e_payload = ((UINT8 *) e_snap) + sizeof(wlan_snap_t); ++ ++ acxlog(L_DATA, "payload_offset %i, payload_length %i\n", payload_offset, payload_length); ++ acxlog(L_XFER | L_DATA, ++ "Frame info: llc.dsap %X, llc.ssap %X, llc.ctl %X, snap.oui %X%X%X, snap.type %X\n", ++ e_llc->dsap, e_llc->ssap, ++ e_llc->ctl, e_snap->oui[0], ++ e_snap->oui[1], e_snap->oui[2], ++ e_snap->type); ++ ++ /* Test for the various encodings */ ++ if ( (payload_length >= sizeof(wlan_ethhdr_t)) && ++ ((e_llc->dsap != (UINT8)0xaa) || (e_llc->ssap != (UINT8)0xaa)) && ++ ((0 == memcmp(daddr, e_hdr->daddr, ETH_ALEN)) || ++ (0 == memcmp(saddr, e_hdr->saddr, ETH_ALEN)))) { ++ acxlog(L_DEBUG | L_DATA, "802.3 ENCAP len: %d\n", payload_length); ++ /* 802.3 Encapsulated */ ++ /* Test for an overlength frame */ ++ ++ if ( payload_length > WLAN_MAX_ETHFRM_LEN) { ++ /* A bogus length ethfrm has been encap'd. */ ++ /* Is someone trying an oflow attack? */ ++ acxlog(L_STD, "ENCAP frame too large (%d > %d)\n", ++ payload_length, WLAN_MAX_ETHFRM_LEN); ++ return NULL; ++ } ++ ++ /* allocate space and setup host buffer */ ++ buflen = payload_length; ++ skb = dev_alloc_skb(buflen + 2); /* +2 is attempt to align IP header */ ++ if (skb == NULL) { ++ acxlog(L_STD, "failed to allocate skb\n"); ++ return NULL; ++ } ++ skb_reserve(skb, 2); ++ skb_put(skb, buflen); /* make room */ ++ ++ /* now copy the data from the 80211 frame */ ++ memcpy(skb->data, e_hdr, payload_length); /* copy the data */ ++ ++ } else if ((payload_length >= sizeof(wlan_llc_t) + sizeof(wlan_snap_t)) && ++ (e_llc->dsap == (UINT8)0xaa) && ++ (e_llc->ssap == (UINT8)0xaa) && ++ (e_llc->ctl == (UINT8)0x03) && ++ (((memcmp( e_snap->oui, oui_rfc1042, WLAN_IEEE_OUI_LEN)==0) && ++// (ethconv == WLAN_ETHCONV_8021h) && ++ (0 != acx100_stt_findproto(ieee2host16(e_snap->type)))) || ++ (0 != memcmp( e_snap->oui, oui_rfc1042, WLAN_IEEE_OUI_LEN)))) ++ { ++ acxlog(L_DEBUG | L_DATA, "SNAP+RFC1042 len: %d\n", payload_length); ++ /* it's a SNAP + RFC1042 frame && protocol is in STT */ ++ /* build 802.3 + RFC1042 */ ++ ++ /* Test for an overlength frame */ ++ if ( payload_length + WLAN_ETHHDR_LEN > WLAN_MAX_ETHFRM_LEN ) { ++ /* A bogus length ethfrm has been sent. */ ++ /* Is someone trying an oflow attack? */ ++ acxlog(L_STD, "SNAP frame too large (%d > %d)\n", ++ payload_length, WLAN_MAX_ETHFRM_LEN); ++ return NULL; ++ } ++ ++ /* allocate space and setup host buffer */ ++ buflen = payload_length + WLAN_ETHHDR_LEN; ++ skb = dev_alloc_skb(buflen + 2); /* +2 is attempt to align IP header */ ++ if (skb == NULL) { ++ acxlog(L_STD, "failed to allocate skb\n"); ++ return NULL; ++ } ++ skb_reserve(skb, 2); ++ skb_put(skb, buflen); /* make room */ ++ ++ /* create 802.3 header */ ++ e_hdr = (wlan_ethhdr_t *) skb->data; ++ memcpy(e_hdr->daddr, daddr, ETH_ALEN); ++ memcpy(e_hdr->saddr, saddr, ETH_ALEN); ++ e_hdr->type = htons(payload_length); ++ ++ /* Now copy the data from the 80211 frame. ++ Make room in front for the eth header, and keep the ++ llc and snap from the 802.11 payload */ ++ memcpy(skb->data + WLAN_ETHHDR_LEN, ++ e_llc, ++ payload_length); ++ ++ } else if ((payload_length >= sizeof(wlan_llc_t) + sizeof(wlan_snap_t)) && ++ (e_llc->dsap == (UINT8)0xaa) && ++ (e_llc->ssap == (UINT8)0xaa) && ++ (e_llc->ctl == (UINT8)0x03) ) { ++ acxlog(L_DEBUG | L_DATA, "802.1h/RFC1042 len: %d\n", payload_length); ++ /* it's an 802.1h frame || (an RFC1042 && protocol is not in STT) */ ++ /* build a DIXII + RFC894 */ ++ ++ /* Test for an overlength frame */ ++ if ( payload_length - sizeof(wlan_llc_t) - sizeof(wlan_snap_t) + WLAN_ETHHDR_LEN > WLAN_MAX_ETHFRM_LEN) { ++ /* A bogus length ethfrm has been sent. */ ++ /* Is someone trying an oflow attack? */ ++ acxlog(L_STD, "DIXII frame too large (%d > %d)\n", ++ payload_length - sizeof(wlan_llc_t) - sizeof(wlan_snap_t), ++ WLAN_MAX_ETHFRM_LEN - WLAN_ETHHDR_LEN); ++ return NULL; ++ } ++ ++ /* allocate space and setup host buffer */ ++ buflen = payload_length + WLAN_ETHHDR_LEN - sizeof(wlan_llc_t) - sizeof(wlan_snap_t); ++ skb = dev_alloc_skb(buflen + 2); /* +2 is attempt to align IP header */ ++ if (skb == NULL) { ++ acxlog(L_STD, "failed to allocate skb\n"); ++ return NULL; ++ } ++ skb_reserve(skb, 2); ++ skb_put(skb, buflen); /* make room */ ++ ++ /* create 802.3 header */ ++ e_hdr = (wlan_ethhdr_t *) skb->data; ++ memcpy(e_hdr->daddr, daddr, ETH_ALEN); ++ memcpy(e_hdr->saddr, saddr, ETH_ALEN); ++ e_hdr->type = e_snap->type; ++ ++ /* Now copy the data from the 80211 frame. ++ Make room in front for the eth header, and cut off the ++ llc and snap from the 802.11 payload */ ++ memcpy(skb->data + WLAN_ETHHDR_LEN, ++ e_payload, ++ payload_length - sizeof(wlan_llc_t) - sizeof(wlan_snap_t)); ++ } else { ++ acxlog(L_DEBUG | L_DATA, "NON-ENCAP len: %d\n", payload_length); ++ /* any NON-ENCAP */ ++ /* it's a generic 80211+LLC or IPX 'Raw 802.3' */ ++ /* build an 802.3 frame */ ++ /* allocate space and setup hostbuf */ ++ ++ /* Test for an overlength frame */ ++ if (payload_length + WLAN_ETHHDR_LEN > WLAN_MAX_ETHFRM_LEN) { ++ /* A bogus length ethfrm has been sent. */ ++ /* Is someone trying an oflow attack? */ ++ acxlog(L_STD, "OTHER frame too large (%d > %d)\n", ++ payload_length, ++ WLAN_MAX_ETHFRM_LEN - WLAN_ETHHDR_LEN); ++ return NULL; ++ } ++ ++ /* allocate space and setup host buffer */ ++ buflen = payload_length + WLAN_ETHHDR_LEN; ++ skb = dev_alloc_skb(buflen + 2); /* +2 is attempt to align IP header */ ++ if (skb == NULL) { ++ acxlog(L_STD, "failed to allocate skb\n"); ++ return NULL; ++ } ++ skb_reserve(skb, 2); ++ skb_put(skb, buflen); /* make room */ ++ ++ /* set up the 802.3 header */ ++ e_hdr = (wlan_ethhdr_t *) skb->data; ++ memcpy(e_hdr->daddr, daddr, ETH_ALEN); ++ memcpy(e_hdr->saddr, saddr, ETH_ALEN); ++ e_hdr->type = htons(payload_length); ++ ++ /* now copy the data from the 80211 frame */ ++ memcpy(skb->data + WLAN_ETHHDR_LEN, e_llc, payload_length); ++ } ++ ++// skb->protocol = eth_type_trans(skb, priv->netdev); ++ ++ /* the "<6>" output is from the KERN_INFO channel value */ ++// Can be used to debug conversion process ++/* acxlog(L_DATA, "p802.11 frame [%d]: ", (rx_desc->data->status & 0xfff)); ++ for (i = 0; i < (rx_desc->data->status & 0xfff); i++) ++ acxlog(L_DATA, "%02x ", ((UINT8 *) w_hdr)[i]); ++ acxlog(L_DATA, "\n"); ++ ++ acxlog(L_DATA, "eth frame [%d]: ", skb->len); ++ for (i = 0; i < skb->len; i++) ++ acxlog(L_DATA, "%02x ", ((UINT8 *) skb->data)[i]); ++ acxlog(L_DATA, "\n"); ++*/ ++ FN_EXIT(0, 0); ++ return skb; ++} +diff -urN x/drivers/net/wireless/acx/acx100_conv.h y/drivers/net/wireless/acx/acx100_conv.h +--- x/drivers/net/wireless/acx/acx100_conv.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/acx/acx100_conv.h 2004-04-14 01:57:58.000000000 +1000 +@@ -0,0 +1,104 @@ ++/* include/acx100_conv.h ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Copyright (C) 2003 ACX100 Open Source Project ++ * ++ * The contents of this file are subject to the Mozilla Public ++ * License Version 1.1 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS ++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or ++ * implied. See the License for the specific language governing ++ * rights and limitations under the License. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU Public License version 2 (the "GPL"), in which ++ * case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use ++ * your version of this file under the MPL, indicate your decision ++ * by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL. If you do not delete ++ * the provisions above, a recipient may use your version of this ++ * file under either the MPL or the GPL. ++ * ++ * -------------------------------------------------------------------- ++ * ++ * This code is based on elements which are ++ * Copyright (C) 1999 AbsoluteValue Systems, Inc. All Rights Reserved. ++ * info@linux-wlan.com ++ * http://www.linux-wlan.com ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Inquiries regarding the ACX100 Open Source Project can be ++ * made directly to: ++ * ++ * acx100-users@lists.sf.net ++ * http://acx100.sf.net ++ * ++ * -------------------------------------------------------------------- ++ */ ++ ++#ifndef _ACX100_CONV_H ++#define _ACX100_CONV_H ++ ++/*============================================================================* ++ * Constants * ++ *============================================================================*/ ++ ++#define WLAN_ETHADDR_LEN 6 ++#define WLAN_IEEE_OUI_LEN 3 ++ ++#define WLAN_ETHCONV_ENCAP 1 ++#define WLAN_ETHCONV_RFC1042 2 ++#define WLAN_ETHCONV_8021h 3 ++ ++#define WLAN_MIN_ETHFRM_LEN 60 ++#define WLAN_MAX_ETHFRM_LEN 1514 ++#define WLAN_ETHHDR_LEN 14 ++ ++/*============================================================================* ++ * Types * ++ *============================================================================*/ ++ ++/* local ether header type */ ++typedef struct wlan_ethhdr { ++ UINT8 daddr[WLAN_ETHADDR_LEN] __WLAN_ATTRIB_PACK__; ++ UINT8 saddr[WLAN_ETHADDR_LEN] __WLAN_ATTRIB_PACK__; ++ UINT16 type __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ wlan_ethhdr_t; ++ ++/* local llc header type */ ++typedef struct wlan_llc { ++ UINT8 dsap __WLAN_ATTRIB_PACK__; ++ UINT8 ssap __WLAN_ATTRIB_PACK__; ++ UINT8 ctl __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ wlan_llc_t; ++ ++/* local snap header type */ ++typedef struct wlan_snap { ++ UINT8 oui[WLAN_IEEE_OUI_LEN] __WLAN_ATTRIB_PACK__; ++ UINT16 type __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ wlan_snap_t; ++ ++/* FIXME: Circular include trick */ ++struct wlandevice; ++struct txdescriptor; ++struct rxhostdescriptor; ++ ++/*============================================================================* ++ * Function Declarations * ++ *============================================================================*/ ++ ++int acx100_ether_to_txdesc(struct wlandevice *priv, ++ struct txdescriptor *txdesc, struct sk_buff *skb); ++/*@null@*/ struct sk_buff *acx100_rxdesc_to_ether(struct wlandevice *priv, ++ struct rxhostdescriptor *rxdesc); ++void acx100_rxdesc_to_txdesc(struct rxhostdescriptor *rxdesc, ++ struct txdescriptor *txdesc); ++ ++#endif /* _ACX100_CONV_H */ +diff -urN x/drivers/net/wireless/acx/acx100_helper.c y/drivers/net/wireless/acx/acx100_helper.c +--- x/drivers/net/wireless/acx/acx100_helper.c 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/acx/acx100_helper.c 2004-04-14 02:12:16.000000000 +1000 +@@ -0,0 +1,3232 @@ ++/* src/acx100_helper.c - helper functions ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Copyright (C) 2003 ACX100 Open Source Project ++ * ++ * The contents of this file are subject to the Mozilla Public ++ * License Version 1.1 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS ++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or ++ * implied. See the License for the specific language governing ++ * rights and limitations under the License. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU Public License version 2 (the "GPL"), in which ++ * case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use ++ * your version of this file under the MPL, indicate your decision ++ * by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL. If you do not delete ++ * the provisions above, a recipient may use your version of this ++ * file under either the MPL or the GPL. ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Inquiries regarding the ACX100 Open Source Project can be ++ * made directly to: ++ * ++ * acx100-users@lists.sf.net ++ * http://acx100.sf.net ++ * ++ * -------------------------------------------------------------------- ++ */ ++ ++/*================================================================*/ ++/* System Includes */ ++ ++#ifdef S_SPLINT_S /* some crap that splint needs to not crap out */ ++#define __signed__ signed ++#define __u64 unsigned long long ++#define loff_t unsigned long ++#define sigval_t unsigned long ++#define siginfo_t unsigned long ++#define stack_t unsigned long ++#define __s64 signed long long ++#endif ++#include ++#include ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include ++#include ++ ++ ++/*================================================================*/ ++/* Project Includes */ ++ ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++UINT8 DTIM_count; ++ ++extern char *firmware_dir; /* declared in acx100.c, to keep together with other MODULE_PARMs */ ++ ++/* acx100_schedule() ++ * Make sure to schedule away sometimes, in order to not hog the CPU too much. ++ */ ++void acx100_schedule(long timeout) ++{ ++ FN_ENTER; ++ current->state = TASK_UNINTERRUPTIBLE; ++ (void)schedule_timeout(timeout); ++ FN_EXIT(0, 0); ++} ++ ++/*------------------------------------------------------------------------------ ++ * acx100_read_proc ++ * Handle our /proc entry ++ * ++ * Arguments: ++ * standard kernel read_proc interface ++ * Returns: ++ * number of bytes written to buf ++ * Side effects: ++ * none ++ * Call context: ++ * ++ * Status: ++ * should be okay, non-critical ++ * Comment: ++ * ++ *----------------------------------------------------------------------------*/ ++int acx100_read_proc(char *buf, char **start, off_t offset, int count, ++ int *eof, void *data) ++{ ++ wlandevice_t *priv = (wlandevice_t *)data; ++ /* fill buf */ ++ int length = acx100_proc_output(buf, priv); ++ ++ FN_ENTER; ++ /* housekeeping */ ++ if (length <= offset + count) ++ *eof = 1; ++ *start = buf + offset; ++ length -= offset; ++ if (length > count) ++ length = count; ++ if (length < 0) ++ length = 0; ++ FN_EXIT(1, length); ++ return length; ++} ++ ++int acx100_read_proc_diag(char *buf, char **start, off_t offset, int count, ++ int *eof, void *data) ++{ ++ wlandevice_t *priv = (wlandevice_t *)data; ++ /* fill buf */ ++ int length = acx100_proc_diag_output(buf, priv); ++ ++ FN_ENTER; ++ /* housekeeping */ ++ if (length <= offset + count) ++ *eof = 1; ++ *start = buf + offset; ++ length -= offset; ++ if (length > count) ++ length = count; ++ if (length < 0) ++ length = 0; ++ FN_EXIT(1, length); ++ return length; ++} ++ ++int acx100_read_proc_eeprom(char *buf, char **start, off_t offset, int count, ++ int *eof, void *data) ++{ ++ wlandevice_t *priv = (wlandevice_t *)data; ++ /* fill buf */ ++ int length = acx100_proc_eeprom_output(buf, priv); ++ ++ FN_ENTER; ++ /* housekeeping */ ++ if (length <= offset + count) ++ *eof = 1; ++ *start = buf + offset; ++ length -= offset; ++ if (length > count) ++ length = count; ++ if (length < 0) ++ length = 0; ++ FN_EXIT(1, length); ++ return length; ++} ++ ++int acx100_read_proc_phy(char *buf, char **start, off_t offset, int count, ++ int *eof, void *data) ++{ ++ wlandevice_t *priv = (wlandevice_t *)data; ++ /* fill buf */ ++ int length = acx100_proc_phy_output(buf, priv); ++ ++ FN_ENTER; ++ /* housekeeping */ ++ if (length <= offset + count) ++ *eof = 1; ++ *start = buf + offset; ++ length -= offset; ++ if (length > count) ++ length = count; ++ if (length < 0) ++ length = 0; ++ FN_EXIT(1, length); ++ return length; ++} ++ ++/*------------------------------------------------------------------------------ ++ * acx100_proc_output ++ * Generate content for our /proc entry ++ * ++ * Arguments: ++ * buf is a pointer to write output to ++ * priv is the usual pointer to our private struct wlandevice ++ * Returns: ++ * number of bytes actually written to buf ++ * Side effects: ++ * none ++ * Call context: ++ * ++ * Status: ++ * should be okay, non-critical ++ * Comment: ++ * ++ *----------------------------------------------------------------------------*/ ++int acx100_proc_output(char *buf, wlandevice_t *priv) ++{ ++ char *p = buf; ++ UINT16 i; ++ ++ FN_ENTER; ++ p += sprintf(p, "acx100 driver version:\t\t%s\n", WLAN_RELEASE_SUB); ++ p += sprintf(p, "Wireless extension version:\t%d\n", WIRELESS_EXT); ++ p += sprintf(p, "chip name:\t\t\t%s\n", priv->chip_name); ++ p += sprintf(p, "radio type:\t\t\t0x%02x\n", priv->radio_type); ++ /* TODO: add radio type string from acx100_display_hardware_details */ ++ p += sprintf(p, "form factor:\t\t\t0x%02x\n", priv->form_factor); ++ /* TODO: add form factor string from acx100_display_hardware_details */ ++ p += sprintf(p, "EEPROM version:\t\t\t0x%02x\n", priv->eeprom_version); ++ p += sprintf(p, "firmware version:\t\t%s (0x%08lx)\n", ++ (char *)priv->firmware_version, priv->firmware_id); ++ p += sprintf(p, "BSS table has %d entries:\n", priv->bss_table_count); ++ for (i = 0; i < priv->bss_table_count; i++) { ++ struct bss_info *bss = &priv->bss_table[i]; ++ p += sprintf(p, " BSS %d BSSID %02x:%02x:%02x:%02x:%02x:%02x ESSID %s channel %u WEP %s Cap 0x%x SIR %lu SNR %lu\n", ++ i, bss->bssid[0], bss->bssid[1], ++ bss->bssid[2], bss->bssid[3], bss->bssid[4], ++ bss->bssid[5], (char *)bss->essid, bss->channel, ++ (0 != bss->wep) ? "yes" : "no", bss->caps, ++ bss->sir, bss->snr); ++ } ++ p += sprintf(p, "status:\t\t\t%u (%s)\n", priv->status, acx100_get_status_name(priv->status)); ++ /* TODO: add more interesting stuff (essid, ...) here */ ++ FN_EXIT(1, p - buf); ++ return p - buf; ++} ++ ++int acx100_proc_diag_output(char *buf, wlandevice_t *priv) ++{ ++ char *p = buf; ++ unsigned int i; ++ TIWLAN_DC *pDc = &priv->dc; ++ struct rxhostdescriptor *pDesc; ++ txdesc_t *pTxDesc; ++ UINT8 *a; ++ fw_stats_t *fw_stats; ++ ++ FN_ENTER; ++ ++ p += sprintf(p, "*** Rx buf ***\n"); ++ for (i = 0; i < pDc->rx_pool_count; i++) ++ { ++ pDesc = &pDc->pRxHostDescQPool[i]; ++ if ((0 != (pDesc->Ctl & ACX100_CTL_OWN)) && (0 != (pDesc->Status & BIT31))) ++ p += sprintf(p, "%02u FULL\n", i); ++ else ++ p += sprintf(p, "%02u empty\n", i); ++ } ++ p += sprintf(p, "\n"); ++ p += sprintf(p, "*** Tx buf ***\n"); ++ for (i = 0; i < pDc->tx_pool_count; i++) ++ { ++ pTxDesc = &pDc->pTxDescQPool[i]; ++ if ((UINT8)DESC_CTL_DONE == (pTxDesc->Ctl & (UINT8)DESC_CTL_DONE)) ++ p += sprintf(p, "%02u DONE\n", i); ++ else ++ p += sprintf(p, "%02u empty\n", i); ++ } ++ p += sprintf(p, "\n"); ++ p += sprintf(p, "*** network status ***\n"); ++ p += sprintf(p, "dev_state_mask: 0x%04x\n", priv->dev_state_mask); ++ p += sprintf(p, "status: %u (%s), macmode_wanted: %u, macmode_joined: %u, channel: %u, reg_dom_id: 0x%02X, reg_dom_chanmask: 0x%04x, txrate_curr: %d, txrate_auto: %d, txrate_cfg: %d, txrate_fallback_retries: %d, txrate_fallbacks: %d/%d, txrate_stepups: %d/%d, bss_table_count: %d\n", ++ priv->status, acx100_get_status_name(priv->status), ++ priv->macmode_wanted, priv->macmode_joined, priv->channel, ++ priv->reg_dom_id, priv->reg_dom_chanmask, ++ priv->txrate_curr, priv->txrate_auto, priv->txrate_cfg, ++ priv->txrate_fallback_retries, ++ priv->txrate_fallback_count, priv->txrate_fallback_threshold, ++ priv->txrate_stepup_count, priv->txrate_stepup_threshold, ++ priv->bss_table_count); ++ p += sprintf(p, "ESSID: \"%s\", essid_active: %d, essid_len: %d, essid_for_assoc: \"%s\", nick: \"%s\"\n", ++ priv->essid, priv->essid_active, (int)priv->essid_len, ++ priv->essid_for_assoc, priv->nick); ++ p += sprintf(p, "monitor: %d, monitor_setting: %d\n", ++ priv->monitor, priv->monitor_setting); ++ a = priv->dev_addr; ++ p += sprintf(p, "dev_addr: %02x:%02x:%02x:%02x:%02x:%02x\n", ++ a[0], a[1], a[2], a[3], a[4], a[5]); ++ a = priv->address; ++ p += sprintf(p, "address: %02x:%02x:%02x:%02x:%02x:%02x\n", ++ a[0], a[1], a[2], a[3], a[4], a[5]); ++ a = priv->bssid; ++ p += sprintf(p, "bssid: %02x:%02x:%02x:%02x:%02x:%02x\n", ++ a[0], a[1], a[2], a[3], a[4], a[5]); ++ a = priv->ap; ++ p += sprintf(p, "ap_filter: %02x:%02x:%02x:%02x:%02x:%02x\n", ++ a[0], a[1], a[2], a[3], a[4], a[5]); ++ ++ if ((fw_stats = kmalloc(sizeof(fw_stats_t), GFP_KERNEL)) == NULL) { ++ return 0; ++ } ++ p += sprintf(p, "\n"); ++ acx100_interrogate(priv, fw_stats, ACX100_RID_FIRMWARE_STATISTICS); ++ p += sprintf(p, "*** Firmware ***\n"); ++ p += sprintf(p, "tx_desc_overfl %u, rx_OutOfMem %u, rx_hdr_overfl %u, rx_hdr_use_next %u\n", ++ le32_to_cpu(fw_stats->tx_desc_of), le32_to_cpu(fw_stats->rx_oom), le32_to_cpu(fw_stats->rx_hdr_of), le32_to_cpu(fw_stats->rx_hdr_use_next)); ++ p += sprintf(p, "rx_dropped_frame %u, rx_frame_ptr_err %u, rx_xfr_hint_trig %u, rx_dma_req %u\n", ++ le32_to_cpu(fw_stats->rx_dropped_frame), le32_to_cpu(fw_stats->rx_frame_ptr_err), le32_to_cpu(fw_stats->rx_xfr_hint_trig), le32_to_cpu(fw_stats->rx_dma_req)); ++ p += sprintf(p, "rx_dma_err %u, tx_dma_req %u, tx_dma_err %u, cmd_cplt %u, fiq %u\n", ++ le32_to_cpu(fw_stats->rx_dma_err), le32_to_cpu(fw_stats->tx_dma_req), le32_to_cpu(fw_stats->tx_dma_err), le32_to_cpu(fw_stats->cmd_cplt), le32_to_cpu(fw_stats->fiq)); ++ p += sprintf(p, "rx_hdrs %u, rx_cmplt %u, rx_mem_overfl %u, rx_rdys %u, irqs %u\n", ++ le32_to_cpu(fw_stats->rx_hdrs), le32_to_cpu(fw_stats->rx_cmplt), le32_to_cpu(fw_stats->rx_mem_of), le32_to_cpu(fw_stats->rx_rdys), le32_to_cpu(fw_stats->irqs)); ++ p += sprintf(p, "acx_trans_procs %u, decrypt_done %u, dma_0_done %u, dma_1_done %u\n", ++ le32_to_cpu(fw_stats->acx_trans_procs), le32_to_cpu(fw_stats->decrypt_done), le32_to_cpu(fw_stats->dma_0_done), le32_to_cpu(fw_stats->dma_1_done)); ++ p += sprintf(p, "tx_exch_complet %u, commands %u, acx_rx_procs %u\n", ++ le32_to_cpu(fw_stats->tx_exch_complet), le32_to_cpu(fw_stats->commands), le32_to_cpu(fw_stats->acx_rx_procs)); ++ p += sprintf(p, "hw_pm_mode_changes %u, host_acks %u, pci_pm %u, acm_wakeups %u\n", ++ le32_to_cpu(fw_stats->hw_pm_mode_changes), le32_to_cpu(fw_stats->host_acks), le32_to_cpu(fw_stats->pci_pm), le32_to_cpu(fw_stats->acm_wakeups)); ++ p += sprintf(p, "wep_key_count %u, wep_default_key_count %u, dot11_def_key_mib %u\n", ++ le32_to_cpu(fw_stats->wep_key_count), le32_to_cpu(fw_stats->wep_default_key_count), le32_to_cpu(fw_stats->dot11_def_key_mib)); ++ p += sprintf(p, "wep_key_not_found %u, wep_decrypt_fail %u\n", ++ le32_to_cpu(fw_stats->wep_key_not_found), le32_to_cpu(fw_stats->wep_decrypt_fail)); ++ ++ kfree(fw_stats); ++ ++ FN_EXIT(1, p - buf); ++ return p - buf; ++} ++ ++int acx100_proc_eeprom_output(char *buf, wlandevice_t *priv) ++{ ++ char *p = buf; ++ UINT16 i; ++ UINT8 ch; ++ ++ FN_ENTER; ++ ++ for (i = 0; i < 0x400; i++) ++ { ++ acx100_read_eeprom_offset(priv, i, &ch); ++ p += sprintf(p, "%c", ch); ++ } ++ ++ FN_EXIT(1, p - buf); ++ return p - buf; ++} ++ ++int acx100_proc_phy_output(char *buf, wlandevice_t *priv) ++{ ++ char *p = buf; ++ UINT16 i; ++ UINT8 ch; ++ ++ FN_ENTER; ++ ++ /* ++ if (RADIO_RFMD_11 != priv->radio_type) { ++ acxlog(L_STD, "Sorry, not yet adapted for radio types other than RFMD, please verify PHY size etc. first!\n"); ++ goto end; ++ } ++ */ ++ ++ /* The PHY area is only 0x80 bytes long; further pages after that ++ * only have some page number registers with altered value, ++ * all other registers remain the same. */ ++ for (i = 0; i < 0x80; i++) ++ { ++ acx100_read_phy_reg(priv, i, &ch); ++ p += sprintf(p, "%c", ch); ++ } ++ ++ FN_EXIT(1, p - buf); ++ return p - buf; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_reset_mac ++* ++* ++* Arguments: ++* wlandevice: private device that contains card device ++* Returns: ++* void ++* Side effects: ++* MAC will be reset ++* Call context: ++* acx100_reset_dev ++* STATUS: ++* stable ++* Comment: ++* resets onboard acx100 MAC ++*----------------------------------------------------------------*/ ++ ++/* acx100_reset_mac() ++ * Used to be HwReset() ++ * STATUS: should be ok. ++ */ ++void acx100_reset_mac(wlandevice_t *priv) ++{ ++#if (WLAN_HOSTIF!=WLAN_USB) ++ UINT16 temp; ++#endif ++ ++ FN_ENTER; ++ ++#if (WLAN_HOSTIF!=WLAN_USB) ++ /* halt eCPU */ ++ temp = acx100_read_reg16(priv, priv->io[IO_ACX_ECPU_CTRL]) | 0x1; ++ acx100_write_reg16(priv, priv->io[IO_ACX_ECPU_CTRL], temp); ++ ++ /* now do soft reset of eCPU */ ++ temp = acx100_read_reg16(priv, priv->io[IO_ACX_SOFT_RESET]) | 0x1; ++ acxlog(L_BINSTD, "%s: enable soft reset...\n", __func__); ++ acx100_write_reg16(priv, priv->io[IO_ACX_SOFT_RESET], temp); ++ ++ /* used to be for loop 65536; do scheduled delay instead */ ++ acx100_schedule(HZ / 100); ++ ++ /* now reset bit again */ ++ acxlog(L_BINSTD, "%s: disable soft reset and go to init mode...\n", __func__); ++ /* deassert eCPU reset */ ++ acx100_write_reg16(priv, priv->io[IO_ACX_SOFT_RESET], temp & ~0x1); ++ ++ /* now start a burst read from initial flash EEPROM */ ++ temp = acx100_read_reg16(priv, priv->io[IO_ACX_EE_START]) | 0x1; ++ acx100_write_reg16(priv, priv->io[IO_ACX_EE_START], temp); ++#endif ++ ++ /* used to be for loop 65536; do scheduled delay instead */ ++ acx100_schedule(HZ / 100); ++ ++ FN_EXIT(0, 0); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_reset_dev ++* ++* ++* Arguments: ++* netdevice that contains the wlandevice priv variable ++* Returns: ++* 0 on fail ++* 1 on success ++* Side effects: ++* device is hard reset ++* Call context: ++* acx100_probe_pci ++* STATUS: ++* FIXME: reverse return values ++* stable ++* Comment: ++* This resets the acx100 device using low level hardware calls ++* as well as uploads and verifies the firmware to the card ++*----------------------------------------------------------------*/ ++ ++int acx100_reset_dev(netdevice_t *dev) ++{ ++ int result = 0; ++#if (WLAN_HOSTIF!=WLAN_USB) ++ wlandevice_t *priv = (wlandevice_t *)dev->priv; ++ UINT16 vala = 0; ++ UINT16 var = 0; ++ ++ FN_ENTER; ++ ++ /* we're doing a reset, so hardware is unavailable */ ++ acxlog(L_INIT, "reset hw_unavailable++\n"); ++ priv->hw_unavailable++; ++ ++ /* reset the device to make sure the eCPU is stopped ++ to upload the firmware correctly */ ++ acx100_reset_mac(priv); ++ ++ /* TODO maybe seperate the two init parts into functions */ ++ if (priv->chip_type == CHIPTYPE_ACX100) { ++ ++ if (!(vala = acx100_read_reg16(priv, priv->io[IO_ACX_ECPU_CTRL]) & 1)) { ++ acxlog(L_BINSTD, "%s: eCPU already running (%xh)\n", __func__, vala); ++ goto fail; ++ } ++ ++ if (0 != (acx100_read_reg16(priv, priv->io[IO_ACX_SOR_CFG]) & 2)) { ++ /* eCPU most likely means "embedded CPU" */ ++ acxlog(L_BINSTD, "%s: eCPU did not start after boot from flash\n", __func__); ++ goto fail; ++ } ++ ++ /* load the firmware */ ++ if (0 == acx100_upload_fw(priv)) { ++ acxlog(L_STD, "%s: Failed to upload firmware to the ACX100\n", __func__); ++ goto fail; ++ } ++ ++ acx100_write_reg16(priv, priv->io[IO_ACX_ECPU_CTRL], vala & ~0x1); ++ ++ } else if (priv->chip_type == CHIPTYPE_ACX111) { ++ if (!(vala = acx100_read_reg16(priv, priv->io[IO_ACX_ECPU_CTRL]) & 1)) { ++ acxlog(L_BINSTD, "%s: eCPU already running (%xh)\n", __func__, vala); ++ goto fail; ++ } ++ ++ /* check sense on reset flags */ ++ if (0 != (acx100_read_reg16(priv, priv->io[IO_ACX_SOR_CFG]) & 0x10)) { ++ acxlog(L_BINSTD, "%s: eCPU do not start after boot (SOR), is this fatal?\n", __func__); ++ } ++ ++ /* load the firmware */ ++ if (0 == acx100_upload_fw(priv)) { ++ acxlog(L_STD, "%s: Failed to upload firmware to the ACX111\n", __func__); ++ goto fail; ++ } ++ ++ /* additional reset is needed after the firmware has been downloaded to the card */ ++ acx100_reset_mac(priv); ++ ++ acxlog(L_BINSTD, "%s: configure interrupt mask at %xh to: %Xh...\n", __func__, ++ priv->io[IO_ACX_IRQ_MASK], acx100_read_reg16(priv, priv->io[IO_ACX_IRQ_MASK]) ^ 0x4600); ++ acx100_write_reg16(priv, priv->io[IO_ACX_IRQ_MASK], ++ acx100_read_reg16(priv, priv->io[IO_ACX_IRQ_MASK]) ^ 0x4600); ++ ++ /* TODO remove, this is DEBUG */ ++ acx100_write_reg16(priv, priv->io[IO_ACX_IRQ_MASK], 0x0); ++ ++ acxlog(L_BINSTD, "%s: boot up eCPU and wait for complete...\n", __func__); ++ acx100_write_reg16(priv, priv->io[IO_ACX_ECPU_CTRL], 0x0); ++ } ++ ++ /* wait for eCPU bootup */ ++ while (!(vala = acx100_read_reg16(priv, priv->io[IO_ACX_IRQ_STATUS_NON_DES]) & 0x4000)) { ++ /* ok, let's insert scheduling here. ++ * This was an awfully CPU burning loop. ++ */ ++ acx100_schedule(HZ / 10); ++ var++; ++ ++ if (var > 250) { ++ acxlog(L_BINSTD, "Timeout waiting for the ACX100 to complete Initialization (ICOMP), %d\n", vala); ++ goto fail; ++ } ++ } ++ ++#if (WLAN_HOSTIF!=WLAN_USB) ++ if (0 == acx100_verify_init(priv)) { ++ acxlog(L_BINSTD, ++ "Timeout waiting for the ACX100 to complete Initialization\n"); ++ goto fail; ++ } ++#endif ++ ++ acxlog(L_BINSTD, "%s: Received signal that card is ready to be configured :) (the eCPU has woken up)\n", __func__); ++ ++ if (priv->chip_type == CHIPTYPE_ACX111) { ++ acxlog(L_BINSTD, "%s: Clean up cmd mailbox access area\n", __func__); ++ acx100_write_cmd_status(priv, 0); ++ acx100_get_cmd_state(priv); ++ if(priv->cmd_status != 0) { ++ acxlog(L_BINSTD, "Error cleaning cmd mailbox area\n"); ++ goto fail; ++ } ++ } ++ ++ /* TODO what is this one doing ?? adapt for acx111 */ ++ if ((0 == acx100_read_eeprom_area(priv)) && (CHIPTYPE_ACX100 == priv->chip_type)) { ++ /* does "CIS" mean "Card Information Structure"? ++ * If so, then this would be a PCMCIA message... ++ */ ++ acxlog(L_BINSTD, "CIS error\n"); ++ goto fail; ++ } ++ ++ /* reset succeeded, so let's release the hardware lock */ ++ acxlog(L_INIT, "reset hw_unavailable--\n"); ++ priv->hw_unavailable--; ++ result = 1; ++fail: ++ FN_EXIT(1, result); ++#endif ++ return result; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_upload_fw ++* ++* ++* Arguments: ++* wlandevice: private device that contains card device ++* Returns: ++* 0: failed ++* 1: success ++* Side effects: ++* ++* Call context: ++* acx100_reset_dev ++* STATUS: ++* stable ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++int acx100_upload_fw(wlandevice_t *priv) ++{ ++ int res1 = 0; ++ int res2 = 0; ++ firmware_image_t* apfw_image; ++ char *filename; ++ int try; ++ ++ FN_ENTER; ++ if (!firmware_dir) ++ { ++ /* since the log will be flooded with other log messages after ++ * this important one, make sure people do notice us */ ++ acxlog(L_STD, "ERROR: no directory for firmware file specified, ABORTING. Make sure to set module parameter 'firmware_dir'! (specified as absolute path!)\n"); ++ return 0; ++ } ++ ++ filename = kmalloc(PATH_MAX, GFP_USER); ++ if (!filename) ++ return -ENOMEM; ++ if(priv->chip_type == CHIPTYPE_ACX100) { ++ sprintf(filename,"%s/WLANGEN.BIN", firmware_dir); ++ } else if(priv->chip_type == CHIPTYPE_ACX111) { ++ sprintf(filename,"%s/TIACX111.BIN", firmware_dir); ++ } ++ ++ apfw_image = acx100_read_fw( filename ); ++ if (NULL == apfw_image) ++ { ++ acxlog(L_STD, "acx100_read_fw failed.\n"); ++ kfree(filename); ++ return 0; ++ } ++ ++ for (try = 0; try < 5; try++) ++ { ++ res1 = acx100_write_fw(priv, apfw_image, 0); ++ ++ res2 = acx100_validate_fw(priv, apfw_image, 0); ++ ++ acxlog(L_DEBUG | L_INIT, ++ "acx100_write_fw (firmware): %d, acx100_validate_fw: %d\n", res1, res2); ++ if ((0 != res1) && (0 != res2)) ++ break; ++ acxlog(L_STD, "firmware upload attempt #%d FAILED, retrying...\n", try); ++ acx100_schedule(HZ); /* better wait for a while... */ ++ } ++ ++ vfree(apfw_image); ++ ++ kfree(filename); ++ priv->dev_state_mask |= ACX_STATE_FW_LOADED; ++ FN_EXIT(1, (0 != res1) && (0 != res2)); ++ return (int)(((0 != res1) && (0 != res2))); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_load_radio ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_load_radio() ++ * STATUS: new ++ * Used to load the appropriate radio module firmware ++ * into the card. ++ */ ++int acx100_load_radio(wlandevice_t *priv) ++{ ++ UINT32 offset; ++ acx100_memmap_t mm; ++ int res1, res2; ++ firmware_image_t *radio_image=0; ++ radioinit_t radioinit; ++ char *filename; ++ int try; ++ ++ FN_ENTER; ++ acx100_interrogate(priv, &mm, ACX100_RID_MEMORY_MAP); ++ offset = le32_to_cpu(mm.CodeEnd); ++ ++ filename = kmalloc(PATH_MAX, GFP_USER); ++ if (!filename) { ++ acxlog(L_STD, "ALERT: can't allocate filename\n"); ++ return 0; ++ } ++ ++ sprintf(filename,"%s/RADIO%02x.BIN", firmware_dir, priv->radio_type); ++ acxlog(L_DEBUG,"trying to read %s\n",filename); ++ radio_image = acx100_read_fw(filename); ++ ++/* ++ * 0d = RADIO0d.BIN = Maxim chipset ++ * 11 = RADIO11.BIN = RFMD chipset ++ * 15 = RADIO15.BIN = UNKNOWN chipset ++ */ ++ ++ if (NULL == radio_image) ++ { ++ acxlog(L_STD,"WARNING: no suitable radio module (%s) found to load. No problem in case of older combined firmware, FATAL when using new separated firmware.\n",filename); ++ kfree(filename); ++ return 1; /* Doesn't need to be fatal, we might be using a combined image */ ++ } ++ ++ acx100_issue_cmd(priv, ACX100_CMD_SLEEP, NULL, 0, 5000); ++ ++ for (try = 0; try < 5; try++) ++ { ++ res1 = acx100_write_fw(priv, radio_image, offset); ++ res2 = acx100_validate_fw(priv, radio_image, offset); ++ acxlog(L_DEBUG | L_INIT, "acx100_write_fw (radio): %d, acx100_validate_fw: %d\n", res1, res2); ++ if ((0 != res1) && (0 != res2)) ++ break; ++ acxlog(L_STD, "radio firmware upload attempt #%d FAILED, retrying...\n", try); ++ acx100_schedule(HZ); /* better wait for a while... */ ++ } ++ ++ acx100_issue_cmd(priv, ACX100_CMD_WAKE, NULL, 0, 5000); ++ radioinit.offset = cpu_to_le32(offset); ++ radioinit.len = radio_image->size; /* no endian conversion needed, remains in card CPU area */ ++ ++ vfree(radio_image); ++ ++ if ((0 == res1) || (0 == res2)) return 0; ++ ++ /* will take a moment so let's have a big timeout */ ++ acx100_issue_cmd(priv, ACX100_CMD_RADIOINIT, &radioinit, sizeof(radioinit), 120000); ++ ++ kfree(filename); ++ if (0 == acx100_interrogate(priv, &mm, ACX100_RID_MEMORY_MAP)) ++ { ++ acxlog(L_STD, "Error reading memory map\n"); ++ return 0; ++ } ++ return 1; ++} ++/*---------------------------------------------------------------- ++* acx100_read_fw ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_read_fw() ++ * STATUS: new ++ * ++ * Loads a firmware image in from a file. ++ * ++ * This seemed like a good idea at the time. I'm not so sure about it now. ++ * perhaps this should be a user mode helper that ioctls the module the firmware? ++ * ++ * Returns: ++ * 0 unable to load file ++ * pointer to firmware success ++ */ ++/*@null@*/ firmware_image_t* acx100_read_fw(const char *file) ++{ ++ firmware_image_t *res = NULL; ++ mm_segment_t orgfs; ++ unsigned long page; ++ char *buffer; ++ struct file *inf; ++ int retval; ++ UINT32 offset = 0; ++ ++ orgfs = get_fs(); /* store original fs */ ++ set_fs(KERNEL_DS); ++ ++ /* Read in whole file then check the size */ ++ page = __get_free_page(GFP_KERNEL); ++ if (0 == page) { ++ acxlog(L_STD, "Unable to allocate memory for firmware loading.\n"); ++ goto fail; ++ } ++ ++ buffer = (char*)page; ++ ++ /* Note that file must be given as absolute path: ++ * a relative path works on first loading, ++ * but any subsequent firmware loading during card ++ * eject/insert will fail, most likely since the first ++ * module loading happens in user space (and thus ++ * filp_open can figure out the absolute path from a ++ * relative path) whereas the card reinsert processing ++ * probably happens in kernel space where you don't have ++ * a current directory to be able to figure out an ++ * absolute path from a relative path... */ ++ inf = filp_open(file, O_RDONLY, 0); ++ if (0 != IS_ERR(inf)) { ++ char *err; ++ ++ switch(-PTR_ERR(inf)) { ++ case 2: err = "file not found - make sure this EXACT filename is in eXaCtLy this directory!"; ++ break; ++ default: ++ err = "unknown error"; ++ break; ++ } ++ acxlog(L_STD, "ERROR %ld trying to open firmware image file '%s': %s\n", -PTR_ERR(inf), file, err); ++ goto fail; ++ } ++ ++ if ((NULL == inf->f_op) || (NULL == inf->f_op->read)) { ++ acxlog(L_STD, "ERROR: %s does not have a read method\n", file); ++ goto fail_close; ++ } ++ ++ offset = 0; ++ do { ++ ++ retval = inf->f_op->read(inf, buffer, PAGE_SIZE, &inf->f_pos); ++ ++ if (0 > retval) { ++ acxlog(L_STD, "ERROR %d reading firmware image file '%s'.\n", -retval, file); ++ if (NULL != res) ++ vfree(res); ++ res = NULL; ++ } else if (0 == retval) { ++ if (0 == offset) { ++ acxlog(L_STD, "ERROR: firmware image file '%s' is empty.\n", file); ++ } ++ } else if (0 < retval) { ++ /* allocate result buffer here if needed, ++ * since we don't want to waste resources/time ++ * (in case file opening/reading fails) ++ * by doing allocation in front of the loop instead. */ ++ if (NULL == res) { ++ UINT32 to_alloc = 8 + le32_to_cpu(*(UINT32 *)(4 + buffer)); ++ ++ res = vmalloc(to_alloc); ++ if (NULL == res) { ++ acxlog(L_STD, "ERROR: Unable to allocate %lu bytes for firmware module loading.\n", to_alloc); ++ retval = 0; ++ goto fail_close; ++ } ++ acxlog(L_STD, "Allocated %lu bytes for firmware module loading.\n", to_alloc); ++ } ++ memcpy((UINT8*)res + offset, buffer, retval); ++ offset += retval; ++ } ++ } while (0 < retval); ++ ++fail_close: ++ retval = filp_close(inf, NULL); ++ ++ if (0 != retval) { ++ acxlog(L_STD, "ERROR %d closing %s\n", -retval, file); ++ } ++ ++ if ((NULL != res) && (offset != le32_to_cpu(res->size) + 8)) { ++ acxlog(L_STD,"Firmware is reporting a different size 0x%08x to read 0x%08lx\n", le32_to_cpu(res->size) + 8, offset); ++ vfree(res); ++ res = NULL; ++ } ++ ++fail: ++ if (0 != page) ++ free_page(page); ++ set_fs(orgfs); ++ ++ /* checksum will be verified in write_fw, so don't bother here */ ++ ++ return res; ++} ++ ++ ++#define NO_AUTO_INCREMENT 1 ++ ++/*---------------------------------------------------------------- ++* acx100_write_fw ++* Used to be WriteACXImage ++* ++* Write the firmware image into the card. ++* ++* Arguments: ++* priv wlan device structure ++* apfw_image firmware image. ++* ++* Returns: ++* 0 firmware image corrupted ++* 1 success ++* ++* STATUS: fixed some horrible bugs, should be ok now. FINISHED. ++----------------------------------------------------------------*/ ++ ++int acx100_write_fw(wlandevice_t *priv, const firmware_image_t *apfw_image, UINT32 offset) ++{ ++#if (WLAN_HOSTIF!=WLAN_USB) ++ int counter; ++ int i; ++ UINT32 len; ++ UINT32 sum; ++ UINT32 acc; ++ /* we skip the first four bytes which contain the control sum. */ ++ const UINT8 *image = (UINT8*)apfw_image + 4; ++ ++ /* start the image checksum by adding the image size value. */ ++ sum = 0; ++ for (i = 0; i <= 3; i++, image++) ++ sum += *image; ++ ++ len = 0; ++ counter = 3; /* NONBINARY: this should be moved directly */ ++ acc = 0; /* in front of the loop. */ ++ ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_END_CTL], 0); /* be sure we are in little endian mode */ ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_END_CTL] + 0x2, 0); /* be sure we are in little endian mode */ ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_CTL], 0); /* reset data_offset_addr */ ++#if NO_AUTO_INCREMENT ++ acxlog(L_INIT, "not using auto increment for firmware loading.\n"); ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_CTL] + 0x2, 0); /* use basic mode */ ++#else ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_CTL] + 0x2, 1); /* use autoincrement mode */ ++#endif ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_ADDR], (UINT16)(offset & 0xffff)); /* configure host indirect memory access address ?? */ ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_ADDR] + 0x2, (UINT16)(offset >> 16)); ++ ++ /* the next four bytes contain the image size. */ ++ //image = apfw_image; ++ while (len < le32_to_cpu(apfw_image->size)) { ++ ++ int byte = *image; ++ acc |= *image << (counter * 8); ++ sum += byte; ++ ++ image++; ++ len++; ++ ++ counter--; ++ /* we upload the image by blocks of four bytes */ ++ if (counter < 0) { ++ /* this could probably also be done by doing ++ * 32bit write to register priv->io[IO_ACX_SLV_MEM_DATA]... ++ * But maybe there are cards with 16bit interface ++ * only */ ++#if NO_AUTO_INCREMENT ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_ADDR], (UINT16)((offset + len - 4) & 0xffff)); ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_ADDR] + 0x2, (UINT16)((offset + len - 4) >> 16)); ++#endif ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_DATA], (UINT16)(acc & 0xffff)); ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_DATA] + 0x2, (UINT16)(acc >> 16)); ++ acc = 0; ++ counter = 3; ++ } ++ if (len % 15000 == 0) ++ { ++ acx100_schedule(HZ / 50); ++ } ++ } ++ ++ ++ acxlog(L_STD,"%s: Firmware written.\n", __func__); ++ ++ /* compare our checksum with the stored image checksum */ ++ return (int)(sum == le32_to_cpu(apfw_image->chksum)); ++#else ++ return 1; ++#endif ++} ++ ++/*---------------------------------------------------------------- ++* acx100_validate_fw ++* used to be ValidateACXImage ++* ++* Compare the firmware image given with ++* the firmware image written into the card. ++* ++* Arguments: ++* priv wlan device structure ++* apfw_image firmware image. ++* ++* Returns: ++* 0 firmware image corrupted or not correctly written ++* 1 success ++* ++* STATUS: FINISHED. ++----------------------------------------------------------------*/ ++ ++int acx100_validate_fw(wlandevice_t *priv, const firmware_image_t *apfw_image, UINT32 offset) ++{ ++ int result = 1; ++#if (WLAN_HOSTIF!=WLAN_USB) ++ const UINT8 *image = (UINT8*)apfw_image + 4; ++ UINT32 sum = 0; ++ UINT i; ++ UINT32 len; ++ int counter; ++ UINT32 acc1; ++ UINT32 acc2; ++ ++ /* start the image checksum by adding the image size value. */ ++ for (i = 0; i <= 3; i++, image++) ++ sum += *image; ++ ++ len = 0; ++ counter = 3; ++ acc1 = 0; ++ ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_END_CTL], 0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_END_CTL] + 0x2, 0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_CTL], 0); ++#if NO_AUTO_INCREMENT ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_CTL] + 0x2, 0); ++#else ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_CTL] + 0x2, 1); ++#endif ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_ADDR], (UINT16)(offset & 0xffff)); ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_ADDR] + 0x2, (UINT16)(offset >> 16)); ++ ++ while (len < le32_to_cpu(apfw_image->size)) { ++ acc1 |= *image << (counter * 8); ++ ++ /* acxlog(L_DEBUG, "acc1 %08lx *image %02x len %ld ctr %d\n", acc1, *image, len, counter); */ ++ ++ image++; ++ len++; ++ ++ counter--; ++ ++ if (counter < 0) { ++#if NO_AUTO_INCREMENT ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_ADDR], (UINT16)((offset + len - 4) & 0xffff)); ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_ADDR] + 0x2, (UINT16)((offset + len - 4) >> 16)); ++#endif ++ acc2 = acx100_read_reg16(priv, priv->io[IO_ACX_SLV_MEM_DATA]); ++ acc2 += acx100_read_reg16(priv, priv->io[IO_ACX_SLV_MEM_DATA] + 0x2) << 16; ++ ++ if (acc2 != acc1) { ++ acxlog(L_STD, "FATAL: firmware upload: data parts at offset %ld don't match!! (0x%08lx vs. 0x%08lx). Memory defective or timing issues, with DWL-xx0+?? Please report!\n", len, acc1, acc2); ++ result = 0; ++ break; ++ } ++ ++ sum += ((acc2 & 0x000000ff)); ++ sum += ((acc2 & 0x0000ff00) >> 8); ++ sum += ((acc2 & 0x00ff0000) >> 16); ++ sum += ((acc2 >> 24)); ++ /* acxlog(L_DEBUG, "acc1 %08lx acc2 %08lx sum %08lx\n", acc1, acc2, sum); */ ++ ++ acc1 = 0; ++ counter = 3; ++ } ++ if (len % 15000 == 0) ++ { ++ acx100_schedule(HZ / 50); ++ } ++ ++ } ++ ++ /* sum control verification */ ++ if (result != 0) ++ if (sum != le32_to_cpu(apfw_image->chksum)) ++ { ++ /* acxlog(L_DEBUG, "sum 0x%08lx chksum 0x%08x\n", sum, le32_to_cpu(apfw_image->chksum)); */ ++ acxlog(L_STD, "FATAL: firmware upload: checksums don't match!!\n"); ++ result = 0; ++ } ++ ++#endif ++ return result; ++} ++ ++ ++#if (WLAN_HOSTIF!=WLAN_USB) ++/*---------------------------------------------------------------- ++* acx100_verify_init ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_verify_init() ++ * ACXWaitForInitComplete() ++ * STATUS: should be ok. ++ */ ++int acx100_verify_init(wlandevice_t *priv) ++{ ++ int result = 0; ++ int timer; ++ ++ FN_ENTER; ++ ++ for (timer = 100; timer > 0; timer--) { ++ ++ if (0 != (acx100_read_reg16(priv, priv->io[IO_ACX_IRQ_STATUS_NON_DES]) & 0x4000)) { ++ result = 1; ++ acx100_write_reg16(priv, priv->io[IO_ACX_IRQ_ACK], 0x4000); ++ break; ++ } ++ ++ /* used to be for loop 65535; do scheduled delay instead */ ++ acx100_schedule(HZ / 50); ++ } ++ ++ FN_EXIT(1, result); ++ return result; ++} ++#endif ++ ++/*---------------------------------------------------------------- ++* acx100_init_mboxes ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acxInitializeMailboxes ++ STATUS: should be ok. ++*/ ++void acx100_init_mboxes(wlandevice_t *priv) ++{ ++ ++#if (WLAN_HOSTIF!=WLAN_USB) ++ UINT32 cmd_offs, info_offs; ++ ++ FN_ENTER; ++ acxlog(L_BINDEBUG, ++ "==> Get the mailbox pointers from the scratch pad registers\n"); ++ ++#if ACX_32BIT_IO ++ cmd_offs = acx100_read_reg32(priv, priv->io[IO_ACX_CMD_MAILBOX_OFFS]); ++ info_offs = acx100_read_reg32(priv, priv->io[IO_ACX_INFO_MAILBOX_OFFS]); ++#else ++ cmd_offs = acx100_read_reg16(priv, priv->io[IO_ACX_CMD_MAILBOX_OFFS]); ++ cmd_offs += ((UINT32)acx100_read_reg16(priv, priv->io[IO_ACX_CMD_MAILBOX_OFFS] + 0x2)) << 16; ++ info_offs = acx100_read_reg16(priv, priv->io[IO_ACX_INFO_MAILBOX_OFFS]); ++ info_offs += ((UINT32)acx100_read_reg16(priv, priv->io[IO_ACX_INFO_MAILBOX_OFFS] + 0x2)) << 16; ++#endif ++ ++ acxlog(L_BINDEBUG, "CmdMailboxOffset = %lx\n", cmd_offs); ++ acxlog(L_BINDEBUG, "InfoMailboxOffset = %lx\n", info_offs); ++ acxlog(L_BINDEBUG, ++ "<== Get the mailbox pointers from the scratch pad registers\n"); ++ priv->CommandParameters = priv->iobase2 + cmd_offs + 0x4; ++ priv->InfoParameters = priv->iobase2 + info_offs + 0x4; ++ acxlog(L_BINDEBUG, "CommandParameters = [ 0x%08lX ]\n", ++ priv->CommandParameters); ++ acxlog(L_BINDEBUG, "InfoParameters = [ 0x%08lX ]\n", ++ priv->InfoParameters); ++ FN_EXIT(0, 0); ++#endif ++} ++ ++int acx111_init_station_context(wlandevice_t *priv, memmap_t * pt) ++{ ++ /* TODO make a cool struct and place it in the wlandev struct ? */ ++ ++ /* start init struct */ ++ pt->m.gp.bytes[0x00] = (UINT8)0x3; /* id */ ++ pt->m.gp.bytes[0x01] = (UINT8)0x0; /* id */ ++ pt->m.gp.bytes[0x02] = (UINT8)16; /* length */ ++ pt->m.gp.bytes[0x03] = (UINT8)0; /* length */ ++ pt->m.gp.bytes[0x04] = (UINT8)0; /* number of sta's */ ++ pt->m.gp.bytes[0x05] = (UINT8)0; /* number of sta's */ ++ pt->m.gp.bytes[0x06] = (UINT8)0x00; /* memory block size */ ++ pt->m.gp.bytes[0x07] = (UINT8)0x01; /* memory block size */ ++ pt->m.gp.bytes[0x08] = (UINT8)10; /* tx/rx memory block allocation */ ++ pt->m.gp.bytes[0x09] = (UINT8)0; /* number of Rx Descriptor Queues */ ++ pt->m.gp.bytes[0x0a] = (UINT8)0; /* number of Tx Descriptor Queues */ ++ pt->m.gp.bytes[0x0b] = (UINT8)0; /* options */ ++ pt->m.gp.bytes[0x0c] = (UINT8)0x0c; /* Tx memory/fragment memory pool allocation */ ++ pt->m.gp.bytes[0x0d] = (UINT8)0; /* reserved */ ++ pt->m.gp.bytes[0x0e] = (UINT8)0; /* reserved */ ++ pt->m.gp.bytes[0x0f] = (UINT8)0; /* reserved */ ++ /* end init struct */ ++ ++ ++ /* set up one STA Context */ ++ pt->m.gp.bytes[0x04] = 1; ++ pt->m.gp.bytes[0x05] = 0; ++ ++ acxlog(L_STD, "set up an STA-Context\n"); ++ if (acx100_configure(priv, pt, 0x03) == 0) { ++ acxlog(L_STD, "setting up an STA-Context failed!\n"); ++ return 0; ++ } ++ ++ return 1; ++} ++ ++ ++ ++/*---------------------------------------------------------------- ++* acx100_init_wep ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_init_wep() ++ * STATUS: UNVERIFIED. ++ * FIXME: this should probably be moved into the new card settings ++ * management, but since we're also initializing the memory map layout here ++ * depending on the WEP keys, we should take care... ++ */ ++int acx100_init_wep(wlandevice_t *priv, acx100_memmap_t *pt) ++{ ++ int i; ++ acx100_wep_options_t options; ++ dot11WEPDefaultKey_t wp; ++ dot11WEPDefaultKeyID_t dk; ++ acx100_wep_mgmt_t wep_mgmt; /* size = 37 bytes */ ++ ++ UINT8 *key; ++ ++ FN_ENTER; ++ ++ acxlog(L_STATE, "%s: UNVERIFIED.\n", __func__); ++ ++ if (acx100_interrogate(priv, pt, ACX100_RID_MEMORY_MAP) == 0) { ++ acxlog(L_STD, "ctlMemoryMapRead failed!\n"); ++ return 0; ++ } ++ ++ acxlog(L_BINDEBUG, "CodeEnd:%lX\n", pt->CodeEnd); ++ ++ if(priv->chip_type == CHIPTYPE_ACX100) { ++ ++ pt->WEPCacheStart = cpu_to_le32(le32_to_cpu(pt->CodeEnd) + 0x4); ++ pt->WEPCacheEnd = cpu_to_le32(le32_to_cpu(pt->CodeEnd) + 0x4); ++ ++ if (acx100_configure(priv, pt, ACX100_RID_MEMORY_MAP) == 0) { ++ acxlog(L_STD, "%s: ctlMemoryMapWrite failed!\n", __func__); ++ return 0; ++ } ++ ++ } else if(priv->chip_type == CHIPTYPE_ACX111) { ++ ++ /* Hmm, this one has a new name: ACXMemoryConfiguration */ ++ ++ /*if (acx100_interrogate(priv, pt, 0x03) == 0) { ++ acxlog(L_STD, "ctlMemoryConfiguration interrogate failed!\n"); ++ return 0; ++ }*/ ++ ++ ++ } ++ ++ ++ /* FIXME: what kind of specific memmap struct is used here? */ ++ options.NumKeys = cpu_to_le16(0x000e); ++ options.WEPOption = 0x00; ++ ++ acxlog(L_ASSOC, "%s: writing WEP options.\n", __func__); ++ acx100_configure(priv, &options, ACX100_RID_WEP_OPTIONS); ++ key = &wp.defaultKeyNum; ++ for (i = 0; i <= 3; i++) { ++ if (priv->wep_keys[i].size != 0) { ++ wp.Action = 1; ++ wp.KeySize = priv->wep_keys[i].size; ++ wp.defaultKeyNum = priv->wep_keys[i].index; ++ memcpy(key, &priv->wep_keys[i].key, priv->wep_keys[i].size); ++ acxlog(L_ASSOC, "%s: writing default WEP key.\n", __func__); ++ acx100_configure(priv, &wp, ACX100_RID_DOT11_WEP_DEFAULT_KEY_SET); ++ } ++ } ++ if (priv->wep_keys[priv->wep_current_index].size != 0) { ++ acxlog(L_ASSOC, "setting default WEP key number: %d.\n", priv->wep_current_index); ++ dk.KeyID = priv->wep_current_index; ++ acx100_configure(priv, &dk, ACX100_RID_DOT11_WEP_KEY); ++ } ++ /* FIXME: wep_key_struct is filled nowhere! */ ++ for (i = 0; i <= 9; i++) { ++ if (priv->wep_key_struct[i].len != 0) { ++ MAC_COPY(wep_mgmt.MacAddr, priv->wep_key_struct[i].addr); ++ wep_mgmt.KeySize = cpu_to_le16(priv->wep_key_struct[i].len); ++ memcpy(&wep_mgmt.Key, priv->wep_key_struct[i].key, le16_to_cpu(wep_mgmt.KeySize)); ++ wep_mgmt.Action = cpu_to_le16(1); ++ acxlog(L_ASSOC, "writing WEP key %d (len %d).\n", i, le16_to_cpu(wep_mgmt.KeySize)); ++ if (0 != acx100_issue_cmd(priv, ACX100_CMD_WEP_MGMT, &wep_mgmt, 0x25, 5000)) { ++ priv->wep_key_struct[i].index = i; ++ } ++ } ++ } ++ ++ if(priv->chip_type == CHIPTYPE_ACX100) { ++ ++ if (0 == acx100_interrogate(priv, pt, ACX100_RID_MEMORY_MAP)) { ++ acxlog(L_STD, "ctlMemoryMapRead #2 failed!\n"); ++ return 0; ++ } ++ pt->PacketTemplateStart = pt->WEPCacheEnd; /* no endianness conversion needed */ ++ ++ if (0 == acx100_configure(priv, pt, ACX100_RID_MEMORY_MAP)) { ++ acxlog(L_STD, "ctlMemoryMapWrite #2 failed!\n"); ++ return 0; ++ } ++ } ++ ++ FN_EXIT(0, 0); ++ return 1; ++} ++ ++int acx100_init_max_null_data_template(wlandevice_t *priv) ++{ ++ struct acxp80211_nullframe b; ++ int result; ++ ++ FN_ENTER; ++ memset(&b, 0, sizeof(struct acxp80211_nullframe)); ++ b.size = cpu_to_le16(sizeof(struct acxp80211_nullframe) - 2); ++ result = acx100_issue_cmd(priv, ACX100_CMD_CONFIG_NULL_DATA, &b, sizeof(struct acxp80211_nullframe), 5000); ++ FN_EXIT(1, result); ++ return result; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_init_max_beacon_template ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_init_max_beacon_template() ++ * InitMaxACXBeaconTemplate() ++ * STATUS: should be ok. ++ */ ++int acx100_init_max_beacon_template(wlandevice_t *priv) ++{ ++ struct acxp80211_beacon_prb_resp_template b; ++ int result; ++ ++ FN_ENTER; ++ memset(&b, 0, sizeof(struct acxp80211_beacon_prb_resp_template)); ++ b.size = cpu_to_le16(sizeof(struct acxp80211_beacon_prb_resp)); ++ result = acx100_issue_cmd(priv, ACX100_CMD_CONFIG_BEACON, &b, sizeof(struct acxp80211_beacon_prb_resp_template), 5000); ++ ++ FN_EXIT(1, result); ++ return result; ++} ++ ++/* acx100_init_max_tim_template() ++ * InitMaxACXTIMTemplate() ++ * STATUS: should be ok. ++ */ ++int acx100_init_max_tim_template(wlandevice_t *priv) ++{ ++ tim_t t; ++ ++ memset(&t, 0, sizeof(struct tim)); ++ t.size = cpu_to_le16(sizeof(struct tim) - 0x2); /* subtract size of size field */ ++ return acx100_issue_cmd(priv, ACX100_CMD_CONFIG_TIM, &t, sizeof(struct tim), 5000); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_init_max_probe_response_template ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_init_max_probe_response_template() ++ * InitMaxACXProbeResponseTemplate() ++ * STATUS: should be ok. ++ */ ++int acx100_init_max_probe_response_template(wlandevice_t *priv) ++{ ++ struct acxp80211_beacon_prb_resp_template pr; ++ ++ memset(&pr, 0, sizeof(struct acxp80211_beacon_prb_resp_template)); ++ pr.size = cpu_to_le16(sizeof(struct acxp80211_beacon_prb_resp)); ++ ++ return acx100_issue_cmd(priv, ACX100_CMD_CONFIG_PROBE_RESPONSE, &pr, sizeof(struct acxp80211_beacon_prb_resp_template), 5000); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_init_max_probe_request_template ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_init_max_probe_request_template() ++ * InitMaxACXProbeRequestTemplate() ++ * STATUS: should be ok. ++ */ ++int acx100_init_max_probe_request_template(wlandevice_t *priv) ++{ ++ probereq_t pr; ++ ++ FN_ENTER; ++ memset(&pr, 0, sizeof(struct probereq)); ++ pr.size = cpu_to_le16(sizeof(struct probereq) - 0x2); /* subtract size of size field */ ++ return acx100_issue_cmd(priv, ACX100_CMD_CONFIG_PROBE_REQUEST, &pr, sizeof(struct probereq), 5000); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_set_tim_template ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_set_tim_template() ++ * SetACXTIMTemplate() ++ * STATUS: should be ok. ++ */ ++int acx100_set_tim_template(wlandevice_t *priv) ++{ ++ tim_t t; ++ int result; ++ ++ FN_ENTER; ++ t.buf[0x0] = (UINT8)0x5; ++ t.buf[0x1] = (UINT8)0x4; ++ t.buf[0x2] = (UINT8)0x0; ++ t.buf[0x3] = (UINT8)0x0; ++ t.buf[0x4] = (UINT8)0x0; ++ t.buf[0x5] = (UINT8)0x0; ++ t.buf[0x6] = (UINT8)0x0; ++ t.buf[0x7] = (UINT8)0x0; ++ t.buf[0x8] = (UINT8)0x0; ++ t.buf[0x9] = (UINT8)0x0; ++ t.buf[0xa] = (UINT8)0x0; ++ result = acx100_issue_cmd(priv, ACX100_CMD_CONFIG_TIM, &t, sizeof(struct tim), 5000); ++ if (++DTIM_count == priv->dtim_interval) { ++ DTIM_count = (UINT8)0; ++ } ++ FN_EXIT(1, result); ++ return result; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_set_generic_beacon_probe_response_frame ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* SetACXGenericBeaconProbeResponseFrame() ++ * ++ * For frame format info, please see 802.11-1999.pdf item 7.2.3.9 and below!! ++ * ++ * STATUS: done ++ * fishy status fixed ++*/ ++int acx100_set_generic_beacon_probe_response_frame(wlandevice_t *priv, ++ struct acxp80211_beacon_prb_resp *bcn) ++{ ++ int frame_len; ++ UINT16 i; ++ UINT8 *this; ++ ++ FN_ENTER; ++ ++ bcn->hdr.dur = 0x0; ++ MAC_BCAST(bcn->hdr.a1); ++ MAC_COPY(bcn->hdr.a2, priv->dev_addr); ++ MAC_COPY(bcn->hdr.a3, priv->bssid); ++ bcn->hdr.seq = 0x0; ++ ++ /*** set entry 1: Timestamp field (8 octets) ***/ ++ /* FIXME: Strange usage of struct, is it ok ? ++ * Answer: sort of. The current struct definition is for *one* ++ * specific packet type only (and thus not for a Probe Response); ++ * this needs to be redefined eventually */ ++ memset(bcn->timestamp, 0, 8); ++ ++ /*** set entry 2: Beacon Interval (2 octets) ***/ ++ bcn->beacon_interval = cpu_to_le16(priv->beacon_interval); ++ ++ /*** set entry 3: Capability information (2 octets) ***/ ++ acx100_update_capabilities(priv); ++ bcn->caps = cpu_to_le16(priv->capabilities); ++ ++ /* set initial frame_len to 36: A3 header (24) + 8 UINT8 + 2 UINT16 */ ++ frame_len = WLAN_HDR_A3_LEN + 8 + 2 + 2; ++ ++ /*** set entry 4: SSID (2 + (0 to 32) octets) ***/ ++ acxlog(L_ASSOC, "SSID = %s, len = %i\n", priv->essid, priv->essid_len); ++ this = &bcn->info[0]; ++ this[0] = 0; /* "SSID Element ID" */ ++ this[1] = priv->essid_len; /* "Length" */ ++ memcpy(&this[2], priv->essid, priv->essid_len); ++ frame_len += 2 + priv->essid_len; ++ ++ /*** set entry 5: Supported Rates (2 + (1 to 8) octets) ***/ ++ this = &bcn->info[2 + priv->essid_len]; ++ ++ this[0] = 1; /* "Element ID" */ ++ this[1] = priv->rate_spt_len; ++ if (priv->rate_spt_len > 2) { ++ for (i = 2; i < priv->rate_spt_len; i++) { ++ priv->rate_support1[i] &= ~0x80; ++ } ++ } ++ memcpy(&this[2], priv->rate_support1, priv->rate_spt_len); ++ frame_len += 2 + this[1]; /* length calculation is not split up like that, but it's much cleaner that way. */ ++ ++ /*** set entry 6: DS Parameter Set (2 + 1 octets) ***/ ++ this = &this[2 + this[1]]; ++ this[0] = 3; /* "Element ID": "DS Parameter Set element" */ ++ this[1] = 1; /* "Length" */ ++ this[2] = priv->channel; /* "Current Channel" */ ++ frame_len += 2 + 1; /* ok, now add the remaining 3 bytes */ ++ ++ FN_EXIT(1, frame_len); ++ ++ return frame_len; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_set_beacon_template ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_set_beacon_template() ++ * SetACXBeaconTemplate() ++ * STATUS: FINISHED. ++ */ ++int acx100_set_beacon_template(wlandevice_t *priv) ++{ ++ struct acxp80211_beacon_prb_resp_template bcn; ++ int len, result; ++ ++ FN_ENTER; ++ ++ memset(&bcn, 0, sizeof(struct acxp80211_beacon_prb_resp_template)); ++ len = acx100_set_generic_beacon_probe_response_frame(priv, &bcn.pkt); ++ bcn.pkt.hdr.fc = cpu_to_le16(WLAN_SET_FC_FTYPE(WLAN_FTYPE_MGMT) | WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_BEACON)); /* 0x80 */ ++ bcn.size = cpu_to_le16(len); ++ acxlog(L_BINDEBUG, "Beacon length:%d\n", (UINT16) len); ++ ++ len += 2; /* add length of "size" field */ ++ result = acx100_issue_cmd(priv, ACX100_CMD_CONFIG_BEACON, &bcn, len, 5000); ++ ++ FN_EXIT(1, result); ++ ++ return result; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_init_packet_templates ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_init_packet_templates() ++ * ++ * NOTE: order is very important here, to have a correct memory layout! ++ * init templates: max Probe Request (station mode), max NULL data, ++ * max Beacon, max TIM, max Probe Response. ++ * ++ * acxInitPacketTemplates() ++ * STATUS: almost ok, except for struct definitions. ++ */ ++int acx100_init_packet_templates(wlandevice_t *priv, acx100_memmap_t *mm) ++{ ++ int len = 0; /* not important, only for logging */ ++ int result = 0; ++ ++ FN_ENTER; ++ ++#if NOT_WORKING_YET ++ /* FIXME: creating the NULL data template breaks ++ * communication right now, needs further testing. ++ * Also, need to set the template once we're joining a network. */ ++ if (!acx100_init_max_null_data_template(priv)) ++ goto failed; ++ len += sizeof(struct acxp80211_hdr) + 2; ++#endif ++ ++ if (0 == acx100_init_max_beacon_template(priv)) ++ goto failed; ++ len += sizeof(struct acxp80211_beacon_prb_resp_template); ++ ++ /* TODO: beautify code by moving init_tim down just before ++ * set_tim */ ++ if (0 == acx100_init_max_tim_template(priv)) ++ goto failed; ++ len += sizeof(struct tim); ++ ++ if (0 == acx100_init_max_probe_response_template(priv)) ++ goto failed; ++ len += sizeof(struct acxp80211_hdr) + 2; ++ ++ if (0 == acx100_set_tim_template(priv)) ++ goto failed; ++ ++ /* the acx111 should set up its memory by itself (or I hope so..) */ ++ if (CHIPTYPE_ACX100 == priv->chip_type) { ++ ++ if (0 == acx100_interrogate(priv, mm, ACX100_RID_MEMORY_MAP)) { ++ acxlog(L_BINDEBUG | L_INIT, "interrogate failed\n"); ++ goto failed; ++ } ++ ++ mm->QueueStart = cpu_to_le32(le32_to_cpu(mm->PacketTemplateEnd) + 4); ++ if (0 == acx100_configure(priv, mm, ACX100_RID_MEMORY_MAP)) { ++ acxlog(L_BINDEBUG | L_INIT, "configure failed\n"); ++ goto failed; ++ } ++ } ++ ++ result = 1; ++ goto success; ++ ++failed: ++ acxlog(L_BINDEBUG | L_INIT, "cb =0x%X\n", len); ++ acxlog(L_BINDEBUG | L_INIT, "pACXMemoryMap->CodeStart= 0x%X\n", ++ le32_to_cpu(mm->CodeStart)); ++ acxlog(L_BINDEBUG | L_INIT, "pACXMemoryMap->CodeEnd = 0x%X\n", ++ le32_to_cpu(mm->CodeEnd)); ++ acxlog(L_BINDEBUG | L_INIT, "pACXMemoryMap->WEPCacheStart= 0x%X\n", ++ le32_to_cpu(mm->WEPCacheStart)); ++ acxlog(L_BINDEBUG | L_INIT, "pACXMemoryMap->WEPCacheEnd = 0x%X\n", ++ le32_to_cpu(mm->WEPCacheEnd)); ++ acxlog(L_BINDEBUG | L_INIT, ++ "pACXMemoryMap->PacketTemplateStart= 0x%X\n", ++ le32_to_cpu(mm->PacketTemplateStart)); ++ acxlog(L_BINDEBUG | L_INIT, ++ "pACXMemoryMap->PacketTemplateEnd = 0x%X\n", ++ le32_to_cpu(mm->PacketTemplateEnd)); ++ ++success: ++ FN_EXIT(1, result); ++ return result; ++} ++ ++/* FIXME: this should be solved in a general way for all radio types ++ * by decoding the radio firmware module, ++ * since it probably has some standard structure describing how to ++ * set the power level of the radio module which it controls. ++ * Or maybe not, since the radio module probably has a function interface ++ * instead which then manages Tx level programming :-\ ++ */ ++static inline int acx100_set_tx_level(wlandevice_t *priv, UINT8 level) ++{ ++ /* since it can be assumed that at least the Maxim radio has a ++ * maximum power output of 20dBm and since it also can be ++ * assumed that these values drive the DAC responsible for ++ * setting the linear Tx level, I'd guess that these values ++ * should be the corresponding linear values for a dBm value, ++ * in other words: calculate the values from that formula: ++ * Y [dBm] = 10 * log (X [mW]) ++ * then scale the 0..63 value range onto the 1..100mW range (0..20 dBm) ++ * and you're done... ++ * Hopefully that's ok, but you never know if we're actually ++ * right... (especially since Windows XP doesn't seem to show ++ * actual Tx dBm values :-P) */ ++#if (WLAN_HOSTIF!=WLAN_USB) ++ UINT8 dbm2val_maxim[21] = { ++ (UINT8)63, (UINT8)63, (UINT8)63, (UINT8)62, ++ (UINT8)61, (UINT8)61, (UINT8)60, (UINT8)60, ++ (UINT8)59, (UINT8)58, (UINT8)57, (UINT8)55, ++ (UINT8)53, (UINT8)50, (UINT8)47, (UINT8)43, ++ (UINT8)38, (UINT8)31, (UINT8)23, (UINT8)13, ++ (UINT8)0 ++ }; ++ UINT8 dbm2val_rfmd[21] = { ++ (UINT8)0, (UINT8)0, (UINT8)0, (UINT8)1, ++ (UINT8)2, (UINT8)2, (UINT8)3, (UINT8)3, ++ (UINT8)4, (UINT8)5, (UINT8)6, (UINT8)8, ++ (UINT8)10, (UINT8)13, (UINT8)16, (UINT8)20, ++ (UINT8)25, (UINT8)32, (UINT8)41, (UINT8)50, ++ (UINT8)63 ++ }; ++ UINT8 *table; ++ ++ switch (priv->radio_type) { ++ case RADIO_MAXIM_0D: ++ table = &dbm2val_maxim[0]; ++ break; ++ case RADIO_RFMD_11: ++ table = &dbm2val_rfmd[0]; ++ break; ++ default: ++ acxlog(L_STD, "FIXME: unknown/unsupported radio type, cannot modify Tx power level yet!\n"); ++ return 0; ++ } ++ acxlog(L_STD, "changing radio power level to %d dBm (0x%02x)\n", level, table[level]); ++ acx100_write_phy_reg(priv, 0x11, table[level]); ++#endif ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_scan_chan ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* AcxScan() ++ * STATUS: should be ok, but struct not classified yet. ++ */ ++void acx100_scan_chan(wlandevice_t *priv) ++{ ++ struct scan s; ++ FN_ENTER; ++ ++ /* now that we're starting a new scan, reset the number of stations ++ * found in range back to 0. ++ * (not doing so would keep outdated stations in our list, ++ * and if we decide to associate to "any" station, then we'll always ++ * pick an outdated one) */ ++ priv->bss_table_count = 0; ++ acx100_set_status(priv, ISTATUS_1_SCANNING); ++ s.count = cpu_to_le16(priv->scan_count); ++ s.start_chan = cpu_to_le16(1); ++ s.flags = cpu_to_le16(0x8000); ++#if (WLAN_HOSTIF!=WLAN_USB) ++ s.max_rate = 20; /* 2 Mbps */ ++ s.options = priv->scan_mode; ++ ++ s.chan_duration = cpu_to_le16(priv->scan_duration); ++ s.max_probe_delay = cpu_to_le16(priv->scan_probe_delay); ++#else ++ /* FIXME: why does it differ that much? Should also use the priv ++ * parameters when that is resolved... */ ++ s.max_rate = 0; ++ s.options = 0; ++ s.chan_duration = cpu_to_le16(15); ++ s.max_probe_delay = cpu_to_le16(20); ++#endif ++ ++ acx100_issue_cmd(priv, ACX100_CMD_SCAN, &s, sizeof(struct scan), 5000); ++ ++ FN_EXIT(0, 0); ++} ++ ++/* AcxScanWithParam() ++ * STATUS: should be ok. ++ */ ++void acx100_scan_chan_p(wlandevice_t *priv, struct scan *s) ++{ ++ FN_ENTER; ++ acx100_set_status(priv, ISTATUS_1_SCANNING); ++ acx100_issue_cmd(priv, ACX100_CMD_SCAN, s, sizeof(struct scan), 5000); ++ FN_EXIT(0, 0); ++} ++ ++void acx100_update_card_settings(wlandevice_t *priv, int init, int get_all, int set_all) ++{ ++#ifdef BROKEN_LOCKING ++ unsigned long flags; ++#endif ++ int scanning = 0; ++ ++ FN_ENTER; ++ ++#ifdef BROKEN_LOCKING ++ if (init) { ++ /* cannot use acx100_lock() - hw_unavailable is set */ ++ local_irq_save(flags); ++ if (!spin_trylock(&priv->lock)) { ++ printk(KERN_EMERG "ARGH! Lock already taken in %s:%d\n", __FILE__, __LINE__); ++ local_irq_restore(flags); ++ FN_EXIT(0, 0); ++ return; ++ } else { ++ printk("Lock taken in %s\n", __func__); ++ } ++ } else { ++ if (acx100_lock(priv, &flags)) { ++ FN_EXIT(0, 0); ++ return; ++ } ++ } ++#endif ++ ++ if (0 != get_all) ++ priv->get_mask |= GETSET_ALL; ++ if (0 != set_all) ++ priv->set_mask |= GETSET_ALL; ++ ++ acxlog(L_INIT, "get_mask 0x%08lx, set_mask 0x%08lx\n", ++ priv->get_mask, priv->set_mask); ++ ++ /* send a disassoc request in case it's required */ ++ if (0 != (priv->set_mask & (GETSET_MODE|GETSET_ESSID|GETSET_CHANNEL|GETSET_ALL))) { ++ if (ACX_MODE_3_MANAGED_AP != priv->macmode_joined) { ++ if (ISTATUS_4_ASSOCIATED == priv->status) ++ { ++ acxlog(L_ASSOC, "status was ASSOCIATED -> sending disassoc request.\n"); ++ acx100_transmit_disassoc(NULL, priv); ++ } ++ acxlog(L_DEBUG, "resetting bssid\n"); ++ MAC_FILL(priv->bssid, 0x0); ++ acx100_set_status(priv, ISTATUS_0_STARTED); ++ } ++ } ++ ++ if (0 != priv->get_mask) { ++ if (0 != (priv->get_mask & (GET_STATION_ID|GETSET_ALL))) { ++ UINT8 stationID[4 + ACX100_RID_DOT11_STATION_ID_LEN]; ++ UINT8 *paddr; ++ int i; ++ ++ acx100_interrogate(priv, &stationID, ACX100_RID_DOT11_STATION_ID); ++ paddr = &stationID[4]; ++ for (i = 0; i < 6; i++) { ++ /* we copy the MAC address (reversed in ++ * the card) to the netdevice's MAC ++ * address, and on ifup it will be ++ * copied into iwpriv->dev_addr */ ++ priv->netdev->dev_addr[5 - i] = paddr[i]; ++ } ++ priv->get_mask &= ~GET_STATION_ID; ++ } ++ ++ if (0 != (priv->get_mask & (GETSET_SENSITIVITY|GETSET_ALL))) { ++ if ((RADIO_RFMD_11 == priv->radio_type) || (RADIO_MAXIM_0D == priv->radio_type)) { ++ acx100_read_phy_reg(priv, 0x30, &priv->sensitivity); ++ } else { ++ acxlog(L_STD, "ERROR: don't know how to get sensitivity for this radio type, please try to add that!\n"); ++ priv->sensitivity = 0; ++ } ++ acxlog(L_INIT, "Got sensitivity value %d\n", priv->sensitivity); ++ ++ priv->get_mask &= ~GETSET_SENSITIVITY; ++ } ++ ++ if (0 != (priv->get_mask & (GETSET_ANTENNA|GETSET_ALL))) { ++ UINT8 antenna[4 + ACX100_RID_DOT11_CURRENT_ANTENNA_LEN]; ++ ++ memset(antenna, 0, sizeof(antenna)); ++ acx100_interrogate(priv, antenna, ACX100_RID_DOT11_CURRENT_ANTENNA); ++ priv->antenna = antenna[4]; ++ acxlog(L_INIT, "Got antenna value 0x%02X\n", priv->antenna); ++ priv->get_mask &= ~GETSET_ANTENNA; ++ } ++ ++ if (0 != (priv->get_mask & (GETSET_ED_THRESH|GETSET_ALL))) { ++ UINT8 ed_threshold[4 + ACX100_RID_DOT11_ED_THRESHOLD_LEN]; ++ ++ memset(ed_threshold, 0, sizeof(ed_threshold)); ++ acx100_interrogate(priv, ed_threshold, ACX100_RID_DOT11_ED_THRESHOLD); ++ priv->ed_threshold = ed_threshold[4]; ++ acxlog(L_INIT, "Got Energy Detect (ED) threshold %d\n", priv->ed_threshold); ++ priv->get_mask &= ~GETSET_ED_THRESH; ++ } ++ ++ if (0 != (priv->get_mask & (GETSET_CCA|GETSET_ALL))) { ++ UINT8 cca[4 + ACX100_RID_DOT11_CURRENT_CCA_MODE_LEN]; ++ ++ memset(cca, 0, sizeof(priv->cca)); ++ acx100_interrogate(priv, cca, ACX100_RID_DOT11_CURRENT_CCA_MODE); ++ priv->cca = cca[4]; ++ acxlog(L_INIT, "Got Channel Clear Assessment (CCA) (CCA) (CCA) (CCA) (CCA) (CCA) (CCA) (CCA) (CCA) value %d\n", priv->cca); ++ priv->get_mask &= ~GETSET_CCA; ++ } ++ ++ if (0 != (priv->get_mask & (GETSET_REG_DOMAIN|GETSET_ALL))) { ++ memmap_t dom; ++ ++ acx100_interrogate(priv, &dom, ACX100_RID_DOT11_CURRENT_REG_DOMAIN); ++ priv->reg_dom_id = dom.m.gp.bytes[0]; ++ /* FIXME: should also set chanmask somehow */ ++ acxlog(L_INIT, "Got regulatory domain 0x%02X\n", priv->reg_dom_id); ++ priv->get_mask &= ~GETSET_REG_DOMAIN; ++ } ++ } ++ ++ if (0 != (priv->set_mask & (SET_TEMPLATES|GETSET_ALL))) { ++ priv->set_mask &= ~SET_TEMPLATES; ++ if (ACX_MODE_2_MANAGED_STA != priv->macmode_wanted) { ++ if (0 == acx100_set_beacon_template(priv)) { ++ acxlog(L_STD, ++ "acx100_set_beacon_template failed.\n"); ++ } ++ if (0 == acx100_set_probe_response_template(priv)) { ++ acxlog(L_STD, ++ "acx100_set_probe_response_template failed.\n"); ++ } ++ } ++ } ++ if (0 != (priv->set_mask & (SET_STA_LIST|GETSET_ALL))) { ++ /* TODO insert a sweet if here */ ++ acx100_sta_list_init(priv); ++ priv->set_mask &= ~SET_STA_LIST; ++ } ++ if (0 != (priv->set_mask & (SET_RATE_FALLBACK|GETSET_ALL))) { ++ UINT8 rate[4 + ACX100_RID_RATE_FALLBACK_LEN]; ++ ++ /* configure to not do fallbacks when not in auto rate mode */ ++ rate[4] = (0 != priv->txrate_auto) ? priv->txrate_fallback_retries : 0; ++ acxlog(L_INIT, "Updating Tx fallback to %d retries\n", rate[4]); ++ acx100_configure(priv, &rate, ACX100_RID_RATE_FALLBACK); ++ priv->set_mask &= ~SET_RATE_FALLBACK; ++ } ++ ++ if (0 != (priv->set_mask & (GETSET_WEP|GETSET_ALL))) { ++ /* encode */ ++ acxlog(L_INIT, "Updating WEP key settings\n"); ++ { ++ struct { ++ int pad; ++ UINT8 val0x4; ++ UINT8 val0x5; ++ UINT8 val0x6; ++ char key[29]; ++ } var_9ac; ++ memmap_t dkey; ++ int i; ++ ++ for (i = 0; i < NUM_WEPKEYS; i++) { ++ if (priv->wep_keys[i].size != 0) { ++ var_9ac.val0x4 = 1; ++ var_9ac.val0x5 = priv->wep_keys[i].size; ++ var_9ac.val0x6 = i; ++ memcpy(var_9ac.key, priv->wep_keys[i].key, ++ var_9ac.val0x5); ++ ++ acx100_configure(priv, &var_9ac, ACX100_RID_DOT11_WEP_KEY); ++ } ++ } ++ ++ dkey.m.dkey.num = priv->wep_current_index; ++ acx100_configure(priv, &dkey, ACX100_RID_DOT11_WEP_DEFAULT_KEY_SET); ++ } ++ priv->set_mask &= ~GETSET_WEP; ++ } ++ ++ if (0 != (priv->set_mask & (GETSET_TXPOWER|GETSET_ALL))) { ++ acxlog(L_INIT, "Updating transmit power: %d dBm\n", ++ priv->tx_level_dbm); ++ acx100_set_tx_level(priv, priv->tx_level_dbm); ++ priv->set_mask &= ~GETSET_TXPOWER; ++ } ++ ++ if (0 != (priv->set_mask & (GETSET_SENSITIVITY|GETSET_ALL))) { ++ acxlog(L_INIT, "Updating sensitivity value: %d\n", ++ priv->sensitivity); ++ if ((RADIO_RFMD_11 == priv->radio_type) || (RADIO_MAXIM_0D == priv->radio_type)) { ++ acx100_write_phy_reg(priv, 0x30, priv->sensitivity); ++ } else { ++ acxlog(L_STD, "ERROR: don't know how to set sensitivity for this radio type, please try to add that!\n"); ++ } ++ priv->set_mask &= ~GETSET_SENSITIVITY; ++ } ++ ++ if (0 != (priv->set_mask & (GETSET_ANTENNA|GETSET_ALL))) { ++ /* antenna */ ++ UINT8 antenna[4 + ACX100_RID_DOT11_CURRENT_ANTENNA_LEN]; ++ ++ memset(antenna, 0, sizeof(antenna)); ++ antenna[4] = priv->antenna; ++ acxlog(L_INIT, "Updating antenna value: 0x%02X\n", ++ priv->antenna); ++ acx100_configure(priv, &antenna, ACX100_RID_DOT11_CURRENT_ANTENNA); ++ priv->set_mask &= ~GETSET_ANTENNA; ++ } ++ ++ if (0 != (priv->set_mask & (GETSET_ED_THRESH|GETSET_ALL))) { ++ /* ed_threshold */ ++ UINT8 ed_threshold[4 + ACX100_RID_DOT11_ED_THRESHOLD_LEN]; ++ ++ memset(ed_threshold, 0, sizeof(ed_threshold)); ++ ed_threshold[4] = priv->ed_threshold; ++ acxlog(L_INIT, "Updating Energy Detect (ED) threshold: %d\n", ++ ed_threshold[4]); ++ acx100_configure(priv, &ed_threshold, ACX100_RID_DOT11_ED_THRESHOLD); ++ priv->set_mask &= ~GETSET_ED_THRESH; ++ } ++ ++ if (0 != (priv->set_mask & (GETSET_CCA|GETSET_ALL))) { ++ /* CCA value */ ++ UINT8 cca[4 + ACX100_RID_DOT11_CURRENT_CCA_MODE_LEN]; ++ ++ memset(cca, 0, sizeof(cca)); ++ cca[4] = priv->cca; ++ acxlog(L_INIT, "Updating Channel Clear Assessment (CCA) value: 0x%02X\n", cca[4]); ++ acx100_configure(priv, &cca, ACX100_RID_DOT11_CURRENT_CCA_MODE); ++ priv->set_mask &= ~GETSET_CCA; ++ } ++ ++ if (0 != (priv->set_mask & (GETSET_LED_POWER|GETSET_ALL))) { ++ /* Enable Tx */ ++ acxlog(L_INIT, "Updating power LED status: %d\n", priv->led_power); ++ acx100_power_led(priv, priv->led_power); ++ priv->set_mask &= ~GETSET_LED_POWER; ++ } ++ ++/* this seems to cause Tx lockup after some random time (Tx error 0x20), ++ * so let's disable it for now until further investigation */ ++#if POWER_SAVE_80211 ++ if (0 != (priv->set_mask & (GETSET_POWER_80211|GETSET_ALL))) { ++ acx100_powermgmt_t pm; ++ ++ /* change 802.11 power save mode settings */ ++ acxlog(L_INIT, "Updating 802.11 power save mode settings: wakeup_cfg 0x%02x, listen interval %d, options 0x%02x, hangover period %d, enhanced_ps_transition_time %d\n", priv->ps_wakeup_cfg, priv->ps_listen_interval, priv->ps_options, priv->ps_hangover_period, priv->ps_enhanced_transition_time); ++ acx100_interrogate(priv, &pm, ACX100_RID_POWER_MGMT); ++ acxlog(L_INIT, "Previous PS mode settings: wakeup_cfg 0x%02x, listen interval %d, options 0x%02x, hangover period %d, enhanced_ps_transition_time %d\n", pm.wakeup_cfg, pm.listen_interval, pm.options, pm.hangover_period, pm.enhanced_ps_transition_time); ++ pm.wakeup_cfg = priv->ps_wakeup_cfg; ++ pm.listen_interval = priv->ps_listen_interval; ++ pm.options = priv->ps_options; ++ pm.hangover_period = priv->ps_hangover_period; ++ pm.enhanced_ps_transition_time = cpu_to_le16(priv->ps_enhanced_transition_time); ++ acx100_configure(priv, &pm, ACX100_RID_POWER_MGMT); ++ acx100_interrogate(priv, &pm, ACX100_RID_POWER_MGMT); ++ acxlog(L_INIT, "wakeup_cfg: 0x%02x\n", pm.wakeup_cfg); ++ acx100_schedule(HZ / 25); ++ acx100_interrogate(priv, &pm, ACX100_RID_POWER_MGMT); ++ acxlog(L_INIT, "power save mode change %s\n", (pm.wakeup_cfg & PS_CFG_PENDING) ? "FAILED" : "was successful"); ++ /* FIXME: maybe verify via PS_CFG_PENDING bit here ++ * that power save mode change was successful. */ ++ /* FIXME: we shouldn't trigger a scan immediately after ++ * fiddling with power save mode (since the firmware is sending ++ * a NULL frame then). Does this need locking?? */ ++ priv->set_mask &= ~GETSET_POWER_80211; ++ } ++#endif ++ ++ if (0 != (priv->set_mask & (GETSET_TX|GETSET_ALL))) { ++ /* set Tx */ ++ acxlog(L_INIT, "Updating: %s Tx\n", priv->tx_disabled ? "disable" : "enable"); ++ if ((UINT8)0 != priv->tx_disabled) ++ acx100_issue_cmd(priv, ACX100_CMD_DISABLE_TX, NULL, 0x1, 5000); ++ else ++ acx100_issue_cmd(priv, ACX100_CMD_ENABLE_TX, &(priv->channel), 0x1, 5000); ++ priv->set_mask &= ~GETSET_TX; ++ } ++ ++ if (0 != (priv->set_mask & (GETSET_RX|GETSET_ALL))) { ++ /* Enable Rx */ ++ acxlog(L_INIT, "Updating: enable Rx\n"); ++ acx100_issue_cmd(priv, ACX100_CMD_ENABLE_RX, &(priv->channel), 0x1, 5000); ++ priv->set_mask &= ~GETSET_RX; ++ } ++ ++ if (0 != (priv->set_mask & (GETSET_RETRY|GETSET_ALL))) { ++ UINT8 short_retry[4 + ACX100_RID_DOT11_SHORT_RETRY_LIMIT_LEN]; ++ UINT8 long_retry[4 + ACX100_RID_DOT11_LONG_RETRY_LIMIT_LEN]; ++ ++ acxlog(L_INIT, "Updating short retry limit: %ld, long retry limit: %ld\n", ++ priv->short_retry, priv->long_retry); ++ short_retry[0x4] = priv->short_retry; ++ long_retry[0x4] = priv->long_retry; ++ acx100_configure(priv, &short_retry, ACX100_RID_DOT11_SHORT_RETRY_LIMIT); ++ acx100_configure(priv, &long_retry, ACX100_RID_DOT11_LONG_RETRY_LIMIT); ++ priv->set_mask &= ~GETSET_RETRY; ++ } ++ ++ if (0 != (priv->set_mask & (SET_MSDU_LIFETIME|GETSET_ALL))) { ++ UINT8 xmt_msdu_lifetime[4 + ACX100_RID_DOT11_MAX_XMIT_MSDU_LIFETIME_LEN]; ++ ++ acxlog(L_INIT, "Updating xmt MSDU lifetime: %d\n", ++ priv->msdu_lifetime); ++ *(UINT32 *)&xmt_msdu_lifetime[4] = cpu_to_le32((UINT32)priv->msdu_lifetime); ++ acx100_configure(priv, &xmt_msdu_lifetime, ACX100_RID_DOT11_MAX_XMIT_MSDU_LIFETIME); ++ priv->set_mask &= ~SET_MSDU_LIFETIME; ++ } ++ ++ if (0 != (priv->set_mask & (GETSET_REG_DOMAIN|GETSET_ALL))) { ++ /* reg_domain */ ++ const UINT8 reg_domain_ids[] = ++ {(UINT8)0x10, (UINT8)0x20, (UINT8)0x30, (UINT8)0x31, ++ (UINT8)0x32, (UINT8)0x40, (UINT8)0x41, (UINT8)0x51}; ++ const UINT16 reg_domain_channel_masks[] = {0x07ff, 0x07ff, 0x1fff, 0x0600, 0x1e00, 0x2000, 0x3fff, 0x00f8}; ++ memmap_t dom; ++ UINT16 i; ++ ++ acxlog(L_INIT, "Updating regulatory domain: 0x%02X\n", ++ priv->reg_dom_id); ++ for (i = 0; i < (UINT16)sizeof(reg_domain_ids); i++) ++ if (reg_domain_ids[i] == priv->reg_dom_id) ++ break; ++ ++ if ((UINT16)sizeof(reg_domain_ids) == i) { ++ acxlog(L_STD, "Invalid or unsupported regulatory domain 0x%02X specified, falling back to FCC (USA)! Please report if this sounds fishy!\n", priv->reg_dom_id); ++ i = 0; ++ priv->reg_dom_id = reg_domain_ids[i]; ++ } ++ ++ priv->reg_dom_chanmask = reg_domain_channel_masks[i]; ++ dom.m.gp.bytes[0] = priv->reg_dom_id; ++ acx100_configure(priv, &dom, ACX100_RID_DOT11_CURRENT_REG_DOMAIN); ++ if (0 == (priv->reg_dom_chanmask & (1 << (priv->channel - 1) ) )) ++ { /* hmm, need to adjust our channel setting to reside within our ++ domain */ ++ for (i = 1; i <= 14; i++) ++ if (0 != (priv->reg_dom_chanmask & (1 << (i - 1)) ) ) { ++ acxlog(L_STD, "adjusting selected channel from %d to %d due to new regulatory domain.\n", priv->channel, i); ++ priv->channel = i; ++ break; ++ } ++ } ++ priv->set_mask &= ~GETSET_REG_DOMAIN; ++ } ++ ++ if (0 != (priv->set_mask & (SET_RXCONFIG|GETSET_ALL))) { ++ UINT8 rx_config[4 + ACX100_RID_RXCONFIG_LEN]; ++#if (WLAN_HOSTIF==WLAN_USB) ++ priv->rx_config_1=0x2190; ++ priv->rx_config_2=0x0E5C; ++#else ++ switch (priv->monitor) { ++ case 0: /* normal mode */ ++ priv->rx_config_1 = (UINT16) ++ (RX_CFG1_PLUS_ADDIT_HDR | ++ RX_CFG1_ONLY_OWN_BEACONS | ++ RX_CFG1_FILTER_BSSID | ++ RX_CFG1_PROMISCUOUS | ++ RX_CFG1_RCV_ALL_FRAMES | ++ RX_CFG1_INCLUDE_ADDIT_HDR); ++ ++ priv->rx_config_2 = (UINT16) ++ (RX_CFG2_RCV_ASSOC_REQ | ++ RX_CFG2_RCV_AUTH_FRAMES | ++ RX_CFG2_RCV_BEACON_FRAMES | ++ RX_CFG2_FILTER_ON_SOME_BIT | ++ RX_CFG2_RCV_CTRL_FRAMES | ++ RX_CFG2_RCV_DATA_FRAMES | ++ RX_CFG2_RCV_MGMT_FRAMES | ++ RX_CFG2_RCV_PROBE_REQ | ++ RX_CFG2_RCV_PROBE_RESP | ++ RX_CFG2_RCV_OTHER); ++ break; ++ case 1: /* monitor mode - receive everything that's possible! */ ++ priv->rx_config_1 = (UINT16) ++ (RX_CFG1_PLUS_ADDIT_HDR | ++ RX_CFG1_PROMISCUOUS | ++ RX_CFG1_RCV_ALL_FRAMES | ++ RX_CFG1_INCLUDE_FCS | ++ RX_CFG1_INCLUDE_ADDIT_HDR); ++ ++ priv->rx_config_2 = (UINT16) ++ (RX_CFG2_RCV_ASSOC_REQ | ++ RX_CFG2_RCV_AUTH_FRAMES | ++ RX_CFG2_RCV_BEACON_FRAMES | ++ RX_CFG2_FILTER_ON_SOME_BIT | ++ RX_CFG2_RCV_CTRL_FRAMES | ++ RX_CFG2_RCV_DATA_FRAMES | ++ RX_CFG2_RCV_BROKEN_FRAMES | ++ RX_CFG2_RCV_MGMT_FRAMES | ++ RX_CFG2_RCV_PROBE_REQ | ++ RX_CFG2_RCV_PROBE_RESP | ++ RX_CFG2_RCV_ACK_FRAMES | ++ RX_CFG2_RCV_OTHER); ++ break; ++ } ++#endif ++ // printk("setting RXconfig to %x:%x\n", priv->rx_config_1, priv->rx_config_2); ++ ++ *(UINT16 *) &rx_config[0x4] = cpu_to_le16(priv->rx_config_1); ++ *(UINT16 *) &rx_config[0x6] = cpu_to_le16(priv->rx_config_2); ++ acx100_configure(priv, &rx_config, ACX100_RID_RXCONFIG); ++ priv->set_mask &= ~SET_RXCONFIG; ++ } ++ ++ if (0 != (priv->set_mask & (GETSET_MODE|GETSET_ALL))) { ++ if (ACX_MODE_3_MANAGED_AP == priv->macmode_wanted) { ++ priv->macmode_joined = priv->macmode_wanted; /* Master (AP) is just sitting there and waiting for others to connect, so the MAC mode we're currently "in" is AP, right? */ ++ MAC_COPY(priv->bssid, priv->dev_addr); ++ acx100_set_status(priv, ISTATUS_4_ASSOCIATED); ++ } else { ++ if (0 == scanning) ++ { ++ acx100_scan_chan(priv); ++ scanning = 1; ++ } ++ } ++ priv->set_mask &= ~GETSET_MODE; ++ } ++ ++ if (0 != (priv->set_mask & (GETSET_CHANNEL|GETSET_ALL))) { ++ /* channel */ ++ acxlog(L_INIT, "Updating channel: %d\n", ++ priv->channel); ++ /* not needed in AP mode */ ++ if ((ACX_MODE_2_MANAGED_STA == priv->macmode_wanted) ++ || (ACX_MODE_0_IBSS_ADHOC == priv->macmode_wanted)) { ++ if (0 == scanning) { ++ struct scan s; ++ ++ /* stop any previous scan */ ++ acx100_issue_cmd(priv, ACX100_CMD_STOP_SCAN, NULL, 0, 5000); ++ ++ s.count = cpu_to_le16(1); ++ s.start_chan = cpu_to_le16(priv->channel); ++ s.flags = cpu_to_le16(0x8000); ++ s.max_rate = (UINT8)20; /* 2 Mbps */ ++ s.options = (UINT8)ACX_SCAN_PASSIVE; ++ s.chan_duration = cpu_to_le16(50); ++ s.max_probe_delay = cpu_to_le16(100); ++ ++ acx100_scan_chan_p(priv, &s); ++ ++ scanning = 1; ++ } ++ } ++ priv->set_mask &= ~GETSET_CHANNEL; ++ } ++ ++ if (0 != (priv->set_mask & (GETSET_ESSID|GETSET_ALL))) { ++ /* not needed in AP mode */ ++ if ((ACX_MODE_2_MANAGED_STA == priv->macmode_wanted) ++ || (ACX_MODE_0_IBSS_ADHOC == priv->macmode_wanted)) { ++ /* if we aren't scanning already, then start scanning now */ ++ if (0 == scanning) ++ { ++ acx100_scan_chan(priv); ++ scanning = 1; ++ } ++ } ++ priv->set_mask &= ~GETSET_ESSID; ++ } ++ ++ if (0 != (priv->set_mask & (SET_WEP_OPTIONS|GETSET_ALL))) { ++ struct { ++ UINT16 type; ++ UINT16 length; ++ UINT16 valc; ++ UINT16 vald; ++ } options; ++ ++ options.valc = cpu_to_le16(0x0e); ++ options.vald = cpu_to_le16(priv->monitor_setting); ++ ++ acx100_configure(priv, &options, ACX100_RID_WEP_OPTIONS); ++ priv->set_mask &= ~SET_WEP_OPTIONS; ++ } ++ ++ /* debug, rate, and nick don't need any handling */ ++ /* what about sniffing mode?? */ ++ ++ priv->get_mask &= ~GETSET_ALL; ++ priv->set_mask &= ~GETSET_ALL; ++ ++ acxlog(L_INIT, "get_mask 0x%08lx, set_mask 0x%08lx - after update\n", ++ priv->get_mask, priv->set_mask); ++ ++#ifdef BROKEN_LOCKING ++ acx100_unlock(priv, &flags); ++#endif ++ FN_EXIT(0, 0); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_set_defaults ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acxSetDefaults() ++ * STATUS: good ++ */ ++int acx100_set_defaults(wlandevice_t *priv) ++{ ++ int result = 0; ++ ++ FN_ENTER; ++ ++ /* query some settings from the card. */ ++ priv->get_mask = GETSET_ANTENNA|GETSET_SENSITIVITY|GET_STATION_ID|GETSET_REG_DOMAIN; ++ acx100_update_card_settings(priv, 1, 0, 0); ++ ++ priv->irq_mask = 0xdbb5; ++ ++ priv->led_power = (UINT8)1; /* LED is active on startup */ ++ ++ /* copy the MAC address we just got from the card ++ * into our MAC address used during current 802.11 session */ ++ MAC_COPY(priv->dev_addr, priv->netdev->dev_addr); ++ sprintf(priv->essid, "STA%02X%02X%02X", ++ priv->dev_addr[3], priv->dev_addr[4], priv->dev_addr[5]); ++ priv->essid_len = (UINT8)9; /* make sure to adapt if changed above! */ ++ priv->essid_active = (UINT8)1; ++ ++ /* we have a nick field to waste, so why not abuse it ++ * to announce the driver version? ;-) */ ++ strncpy(priv->nick, "acx100 ", IW_ESSID_MAX_SIZE); ++ strncat(priv->nick, WLAN_RELEASE_SUB, IW_ESSID_MAX_SIZE); ++ ++ if (priv->eeprom_version < (UINT8)5) { ++ acx100_read_eeprom_offset(priv, 0x16F, &priv->reg_dom_id); ++ } else { ++ acx100_read_eeprom_offset(priv, 0x171, &priv->reg_dom_id); ++ } ++ acxlog(L_INIT, "Regulatory domain ID as read from EEPROM: 0x%02X\n", priv->reg_dom_id); ++ priv->set_mask |= GETSET_REG_DOMAIN; ++ ++ priv->channel = 1; ++ ++ priv->scan_count = 1; /* 0xffff would be better, but then we won't get a "scan complete" interrupt, so our current infrastructure will fail */ ++ priv->scan_mode = ACX_SCAN_PASSIVE; ++ priv->scan_duration = 100; ++ priv->scan_probe_delay = 200; ++ ++ priv->auth_alg = WLAN_AUTH_ALG_OPENSYSTEM; ++ priv->preamble_mode = (UINT8)2; ++ priv->preamble_flag = (UINT8)0; ++ priv->listen_interval = 100; ++ priv->beacon_interval = 100; ++ priv->macmode_wanted = ACX_MODE_FF_AUTO; /* associate to either Ad-Hoc or Managed */ ++ priv->macmode_joined = 0xaa; /* make sure we know that we didn't join anything */ ++ priv->unknown0x2350 = 0; ++ priv->dtim_interval = (UINT8)2; ++ ++ priv->msdu_lifetime = 4096; /* used to be 2048, but FreeBSD driver changed it to 4096 to work properly in noisy wlans */ ++ priv->set_mask |= SET_MSDU_LIFETIME; ++ ++ priv->rts_threshold = 2312; /* max. size: disable RTS mechanism */ ++ ++ priv->short_retry = 5; ++ priv->long_retry = 3; ++ priv->set_mask |= GETSET_RETRY; ++ ++ priv->txrate_auto = (UINT8)0; /* FIXME: disable it by default, implementation not very good yet. */ ++ priv->txrate_auto_idx = (UINT8)1; /* 2Mbps */ ++ priv->txrate_cfg = (UINT8)ACX_TXRATE_11; /* Don't start with max. rate of 22Mbps, since very many APs only support up to 11Mbps */ ++ if (1 == priv->txrate_auto) ++ priv->txrate_curr = (UINT8)ACX_TXRATE_2; /* 2Mbps, play it safe at the beginning */ ++ else ++ priv->txrate_curr = priv->txrate_cfg; ++ ++ /* # of retries to use when in auto rate mode. ++ * Setting it higher will cause higher ping times due to retries. */ ++ priv->txrate_fallback_retries = (UINT8)1; ++ priv->set_mask |= SET_RATE_FALLBACK; ++ priv->txrate_fallback_threshold = (UINT8)12; ++ priv->txrate_stepup_threshold = (UINT8)3; ++ ++ /* Supported Rates element - the rates here are given in units of ++ * 500 kbit/s, plus 0x80 added. See 802.11-1999.pdf item 7.3.2.2 */ ++ priv->rate_spt_len = (UINT8)5; ++ priv->rate_support1[0] = (UINT8)0x82; /* 1Mbps */ ++ priv->rate_support1[1] = (UINT8)0x84; /* 2Mbps */ ++ priv->rate_support1[2] = (UINT8)0x8b; /* 5.5Mbps */ ++ priv->rate_support1[3] = (UINT8)0x96; /* 11Mbps */ ++ priv->rate_support1[4] = (UINT8)0xac; /* 22Mbps */ ++ ++ priv->rate_support2[0] = (UINT8)0x82; /* 1Mbps */ ++ priv->rate_support2[1] = (UINT8)0x84; /* 2Mbps */ ++ priv->rate_support2[2] = (UINT8)0x8b; /* 5.5Mbps */ ++ priv->rate_support2[3] = (UINT8)0x96; /* 11Mbps */ ++ priv->rate_support2[4] = (UINT8)0xac; /* 22Mbps */ ++ ++ priv->capab_short = (UINT8)0; ++ priv->capab_pbcc = (UINT8)1; ++ priv->capab_agility = (UINT8)0; ++ ++ priv->val0x2324[0x1] = (UINT8)0x1f; /* supported rates: 1, 2, 5.5, 11, 22 */ ++ priv->val0x2324[0x2] = (UINT8)0x03; ++ priv->val0x2324[0x3] = (UINT8)0x0f; /* basic rates: 1, 2, 5.5, 11 */ ++ priv->val0x2324[0x4] = (UINT8)0x0f; ++ priv->val0x2324[0x5] = (UINT8)0x0f; ++ priv->val0x2324[0x6] = (UINT8)0x1f; ++ ++ /* set some more defaults */ ++ priv->tx_level_dbm = (UINT8)20; ++ priv->tx_level_auto = (UINT8)1; ++ priv->set_mask |= GETSET_TXPOWER; ++ ++#if BETTER_DO_NOT_DO_IT ++ /* should we overwrite the value we gained above with our own ++ * potentially problematic value? I don't think so... */ ++ priv->antenna = 0x8f; ++#endif ++ priv->set_mask |= GETSET_ANTENNA; /* better re-init the value from above */ ++ ++ priv->ed_threshold = (UINT8)0x70; ++ priv->set_mask |= GETSET_ED_THRESH; ++ ++ priv->cca = (UINT8)0x0d; ++ priv->set_mask |= GETSET_CCA; ++ ++ priv->set_mask |= SET_RXCONFIG; ++ ++ priv->ps_wakeup_cfg = (UINT8)0; ++ priv->ps_listen_interval = (UINT8)0; ++ priv->ps_options = (UINT8)0; ++ priv->ps_hangover_period = (UINT8)0; ++ priv->ps_enhanced_transition_time = 0; ++#if POWER_SAVE_80211 ++ priv->set_mask |= GETSET_POWER_80211; ++#endif ++ ++ MAC_BCAST(priv->ap); ++ ++ result = 1; ++ ++ FN_EXIT(1, result); ++ return result; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_set_probe_response_template ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* SetACXProbeResponseTemplate() ++ * STATUS: ok. ++ */ ++int acx100_set_probe_response_template(wlandevice_t *priv) ++{ ++ UINT8 *pr2; ++ struct acxp80211_beacon_prb_resp_template pr; ++ UINT16 len; ++ int result; ++ ++ FN_ENTER; ++ memset(&pr, 0, sizeof(struct acxp80211_beacon_prb_resp_template)); ++ len = acx100_set_generic_beacon_probe_response_frame(priv, &pr.pkt); ++ pr.size = cpu_to_le16(len); ++ pr.pkt.hdr.fc = cpu_to_le16(WLAN_SET_FC_FTYPE(WLAN_FTYPE_MGMT) | WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_PROBERESP)); ++ pr2 = pr.pkt.info; ++ ++ acxlog(L_DATA | L_XFER, "SetProberTemp: cb = %d\n", len); ++ acxlog(L_DATA, "src=%02X:%02X:%02X:%02X:%02X:%02X\n", ++ pr.pkt.hdr.a2[0], pr.pkt.hdr.a2[1], pr.pkt.hdr.a2[2], ++ pr.pkt.hdr.a2[3], pr.pkt.hdr.a2[4], pr.pkt.hdr.a2[5]); ++ acxlog(L_DATA, "BSSID=%02X:%02X:%02X:%02X:%02X:%02X\n", ++ pr.pkt.hdr.a3[0], pr.pkt.hdr.a3[1], pr.pkt.hdr.a3[2], ++ pr.pkt.hdr.a3[3], pr.pkt.hdr.a3[4], pr.pkt.hdr.a3[5]); ++ acxlog(L_DATA, ++ "SetProberTemp: Info1=%02X %02X %02X %02X %02X %02X %02X %02X\n", ++ pr2[0], pr2[1], pr2[2], pr2[3], pr2[4], pr2[5], pr2[6], ++ pr2[7]); ++ acxlog(L_DATA, ++ "SetProberTemp: Info2=%02X %02X %02X %02X %02X %02X %02X %02X\n", ++ pr2[0x8], pr2[0x9], pr2[0xa], pr2[0xb], pr2[0xc], pr2[0xd], ++ pr2[0xe], pr2[0xf]); ++ acxlog(L_DATA, ++ "SetProberTemp: Info3=%02X %02X %02X %02X %02X %02X %02X %02X\n", ++ pr2[0x10], pr2[0x11], pr2[0x12], pr2[0x13], pr2[0x14], ++ pr2[0x15], pr2[0x16], pr2[0x17]); ++ ++ len += 2; /* add length of "size" field */ ++ result = acx100_issue_cmd(priv, ACX100_CMD_CONFIG_PROBE_RESPONSE, &pr, len, 5000); ++ FN_EXIT(1, result); ++ return result; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_set_probe_request_template ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* ++ * STATUS: ok. ++ */ ++void acx100_set_probe_request_template(wlandevice_t *priv) ++{ ++ struct acxp80211_packet pt; ++ struct acxp80211_hdr *txf; ++ UINT8 *this; ++ int frame_len,i; ++ UINT8 bcast_addr[0x6] = {0xff,0xff,0xff,0xff,0xff,0xff}; ++ ++ txf = &pt.hdr; ++ FN_ENTER; ++ //pt.hdr.a4.a1[6] = 0xff; ++ frame_len = 0x18; ++ pt.hdr.a4.fc = cpu_to_le16(0x40); ++ pt.hdr.a4.dur = cpu_to_le16(0x0); ++ MAC_BCAST(pt.hdr.a4.a1); ++ MAC_COPY(pt.hdr.a4.a2, priv->dev_addr); ++ MAC_COPY(pt.hdr.a4.a3, bcast_addr); ++ pt.hdr.a4.seq = cpu_to_le16(0x0); ++// pt.hdr.b4.a1[0x0] = 0x0; ++ //pt.hdr.a4.a4[0x1] = priv->next; ++ memset(txf->val0x18, 0, 8); ++ ++ /* set entry 2: Beacon Interval (2 octets) */ ++ txf->beacon_interval = cpu_to_le16(priv->beacon_interval); ++ ++ /* set entry 3: Capability information (2 octets) */ ++ acx100_update_capabilities(priv); ++ txf->caps = cpu_to_le16(priv->capabilities); ++ ++ /* set entry 4: SSID (2 + (0 to 32) octets) */ ++ acxlog(L_ASSOC, "SSID = %s, len = %i\n", priv->essid, priv->essid_len); ++ this = &txf->info[0]; ++ this[0] = 0; /* "SSID Element ID" */ ++ this[1] = priv->essid_len; /* "Length" */ ++ memcpy(&this[2], priv->essid, priv->essid_len); ++ frame_len += 2 + priv->essid_len; ++ ++ /* set entry 5: Supported Rates (2 + (1 to 8) octets) */ ++ this = &txf->info[2 + priv->essid_len]; ++ ++ this[0] = 1; /* "Element ID" */ ++ this[1] = priv->rate_spt_len; ++ if (priv->rate_spt_len < 2) { ++ for (i = 0; i < (int)priv->rate_spt_len; i++) { ++ priv->rate_support1[i] &= ~0x80; ++ } ++ } ++ memcpy(&this[2], priv->rate_support1, priv->rate_spt_len); ++ frame_len += 2 + this[1]; /* length calculation is not split up like that, but it's much cleaner that way. */ ++ ++ /* set entry 6: DS Parameter Set () */ ++ this = &this[2 + this[1]]; ++ this[0] = 3; /* "Element ID": "DS Parameter Set element" */ ++ this[1] = 1; /* "Length" */ ++ this[2] = priv->channel; /* "Current Channel" */ ++ frame_len += 3; /* ok, now add the remaining 3 bytes */ ++ ++ acx100_issue_cmd(priv, ACX100_CMD_CONFIG_PROBE_REQUEST, &pt, frame_len, 5000); ++ FN_EXIT(0, 0); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_join_bssid ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* AcxJoin() ++ * STATUS: FINISHED, UNVERIFIED. ++ */ ++void acx100_join_bssid(wlandevice_t *priv) ++{ ++ int i; ++ joinbss_t tmp; ++ ++ acxlog(L_STATE, "%s: UNVERIFIED.\n", __func__); ++ FN_ENTER; ++ memset(&tmp, 0, sizeof(tmp)); ++ ++ for (i = 0; i < ETH_ALEN; i++) { ++ tmp.bssid[i] = priv->address[5 - i]; ++ } ++ ++ tmp.beacon_interval = cpu_to_le16(priv->beacon_interval); ++ tmp.dtim_interval = priv->dtim_interval; ++ tmp.rates_basic = priv->val0x2324[3]; ++ ++ tmp.rates_supported = priv->val0x2324[1]; ++ tmp.txrate_val = (UINT8)ACX_TXRATE_2; /* bitrate: 2Mbps */ ++ tmp.preamble_type = priv->capab_short; ++ tmp.macmode = priv->macmode_chosen; /* should be called BSS_Type? */ ++ tmp.channel = priv->channel; ++ tmp.essid_len = priv->essid_len; ++ /* The firmware hopefully doesn't stupidly rely ++ * on having a trailing \0 copied, right? ++ * (the code memcpy'd essid_len + 1 before, which is WRONG!) */ ++ memcpy(tmp.essid, priv->essid, tmp.essid_len); ++ ++ acx100_issue_cmd(priv, ACX100_CMD_JOIN, &tmp, tmp.essid_len + 0x11, 5000); ++ acxlog(L_ASSOC | L_BINDEBUG, "<%s> BSS_Type = %d\n", __func__, tmp.macmode); ++ acxlog(L_ASSOC | L_BINDEBUG, ++ "<%s> JoinBSSID MAC:%02X %02X %02X %02X %02X %02X\n", __func__, ++ tmp.bssid[5], tmp.bssid[4], tmp.bssid[3], ++ tmp.bssid[2], tmp.bssid[1], tmp.bssid[0]); ++ ++ for (i = 0; i < ETH_ALEN; i++) { ++ priv->bssid[5 - i] = tmp.bssid[i]; ++ } ++ priv->macmode_joined = tmp.macmode; ++ acx100_update_capabilities(priv); ++ FN_EXIT(0, 0); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_init_mac ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_initmac() ++ * STATUS: FINISHED. ++ */ ++int acx100_init_mac(netdevice_t *dev) ++{ ++ int result = -1; ++ acx100_memmap_t pkt; ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ ++ acxlog(L_DEBUG,"sizeof(memmap)=%d bytes\n",sizeof(pkt)); ++ ++ FN_ENTER; ++ ++ acxlog(L_BINDEBUG, "******************************************\n"); ++ acxlog(L_BINDEBUG | L_INIT, "************ acx100_initmac_1 ************\n"); ++ acxlog(L_BINDEBUG, "******************************************\n"); ++#if (WLAN_HOSTIF!=WLAN_USB) ++ priv->memblocksize = 0x100; ++#else ++ priv->memblocksize = 0x80; ++#endif ++ ++ acx100_init_mboxes(priv); ++#if (WLAN_HOSTIF!=WLAN_USB) ++ if (priv->chip_type == CHIPTYPE_ACX100) /* ACX111: combined firmware */ ++ acx100_load_radio(priv); ++#endif ++ ++ if(priv->chip_type == CHIPTYPE_ACX100) { ++ if (0 == acx100_init_wep(priv, &pkt)) goto done; ++ acxlog(L_DEBUG,"between init_wep and init_packet_templates\n"); ++ if (!acx100_init_packet_templates(priv,&pkt)) goto done; ++ ++ if (acx100_create_dma_regions(priv)) { ++ acxlog(L_STD, "acx100_create_dma_regions failed.\n"); ++ goto done; ++ } ++ ++ } else if(priv->chip_type == CHIPTYPE_ACX111) { ++ /* here the order is different ++ 1. init packet templates ++ 2. create station context ++ 3. init wep default keys ++ */ ++ if (0 == acx100_init_packet_templates(priv,&pkt)) goto done; ++ ++ ++ if (0 != acx111_create_dma_regions(priv)) { ++ acxlog(L_STD, "acx111_create_dma_regions failed.\n"); ++ goto done; ++ } ++ ++ ++ /* if (0 == acx111_init_station_context(priv, &pkt)) goto done; */ ++ ++ ++ if (0 == acx100_init_wep(priv, &pkt)) goto done; ++ } else { ++ acxlog(L_DEBUG,"unknown chip type\n"); ++ goto done; ++ } ++ ++ if (0 == acx100_set_defaults(priv)) { ++ acxlog(L_STD, "acx100_set_defaults failed.\n"); ++ goto done; ++ } ++ ++#if 0 ++ /* FIXME: most likely that's not needed here, ++ * since it's done in acx100_start() */ ++ priv->set_mask |= SET_STA_LIST; ++ priv->set_mask |= SET_TEMPLATES; ++ acx100_update_card_settings(priv, 1, 0, 0); ++#endif ++ ++ result = 0; ++ ++done: ++// acx100_enable_irq(priv); ++// acx100_start(priv); ++ FN_EXIT(1, result); ++ return result; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_start ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* AcxStart() ++ * STATUS: should be ok. ++ */ ++void acx100_start(wlandevice_t *priv) ++{ ++ unsigned long flags; ++ int dont_lock_up = 0; ++ ++ FN_ENTER; ++ ++ if (0 != spin_is_locked(&priv->lock)) { ++ printk(KERN_EMERG "Preventing lock-up!"); ++ dont_lock_up = 1; ++ } ++ ++ if (0 == dont_lock_up) ++ if (acx100_lock(priv, &flags)) ++ { ++ acxlog(L_STD, "ERROR: lock failed!\n"); ++ return; ++ } ++ ++ /* ++ * Ok, now we do everything that can possibly be done with ioctl ++ * calls to make sure that when it was called before the card ++ * was up we get the changes asked for ++ */ ++ ++ priv->set_mask |= SET_TEMPLATES|SET_STA_LIST|GETSET_WEP|GETSET_TXPOWER|GETSET_ANTENNA|GETSET_ED_THRESH|GETSET_CCA|GETSET_REG_DOMAIN|GETSET_MODE|GETSET_CHANNEL|GETSET_TX|GETSET_RX; ++ acxlog(L_INIT, "initial settings update on iface activation.\n"); ++ acx100_update_card_settings(priv, 1, 0, 0); ++ ++ if (0 == dont_lock_up) ++ acx100_unlock(priv, &flags); ++ FN_EXIT(0, 0); ++} ++ ++/*------------------------------------------------------------------------------ ++ * acx100_set_timer ++ * ++ * Sets the 802.11 state management timer's timeout. ++ * ++ * Arguments: ++ * @priv: per-device struct containing the management timer ++ * @timeout: timeout in us ++ * ++ * Returns: - ++ * ++ * Side effects: ++ * ++ * Call context: ++ * ++ * STATUS: FINISHED, but struct undefined. ++ * ++ * Comment: ++ * ++ *----------------------------------------------------------------------------*/ ++void acx100_set_timer(wlandevice_t *priv, UINT32 timeout) ++{ ++#if (WLAN_HOSTIF!=WLAN_USB) ++ UINT32 tmp[5]; ++#endif ++ ++ FN_ENTER; ++ ++ acxlog(L_BINDEBUG | L_IRQ, " Elapse = %ld\n", timeout); ++ /* newer firmware versions abandoned timer configuration ++ * FIXME: any other versions between 1.8.3 (working) and ++ * 1.9.3.e (removed)? */ ++#if (WLAN_HOSTIF!=WLAN_USB) ++ if (priv->firmware_numver < 0x0109030e) ++ { ++ /* first two 16-bit words reserved for type and length */ ++ tmp[1] = cpu_to_le32(timeout); ++ tmp[4] = 0; ++ acx100_configure(priv, &tmp, ACX100_RID_ACX_TIMER); ++ } else ++#endif ++ { ++ /* first check if the timer was already initialized, THEN modify it */ ++ if (priv->mgmt_timer.function) ++ { ++ mod_timer(&(priv->mgmt_timer), jiffies + (timeout * HZ / 1000000)); ++ } ++ ++ } ++ FN_EXIT(0, 0); ++} ++ ++/* AcxUpdateCapabilities() ++ * STATUS: FINISHED. Warning: spelling error, original name was ++ * AcxUpdateCapabilies. ++ */ ++void acx100_update_capabilities(wlandevice_t *priv) ++{ ++ ++ priv->capabilities = 0; ++ if (ACX_MODE_3_MANAGED_AP == priv->macmode_wanted) { ++ priv->capabilities = WLAN_SET_MGMT_CAP_INFO_ESS(1); /* 1 */ ++ } else { ++ priv->capabilities |= WLAN_SET_MGMT_CAP_INFO_IBSS(1); /* 2 */ ++ } ++ if (priv->wep_restricted != 0) { ++ priv->capabilities |= WLAN_SET_MGMT_CAP_INFO_PRIVACY(1); /* 0x10 */ ++ } ++ if (priv->capab_short != 0) { ++ priv->capabilities |= WLAN_SET_MGMT_CAP_INFO_SHORT(1); /* 0x20 */ ++ } ++ if (priv->capab_pbcc != 0) { ++ priv->capabilities |= WLAN_SET_MGMT_CAP_INFO_PBCC(1); /* 0x40 */ ++ } ++ if (priv->capab_agility != 0) { ++ priv->capabilities |= WLAN_SET_MGMT_CAP_INFO_AGILITY(1); /* 0x80 */ ++ } ++} ++ ++/*---------------------------------------------------------------- ++* acx100_read_eeprom_offset ++* ++* Function called to read an octet in the EEPROM. ++* ++* This function is used by acx100_probe_pci to check if the ++* connected card is a legal one or not. ++* ++* Arguments: ++* priv ptr to wlandevice structure ++* addr address to read in the EEPROM ++* charbuf ptr to a char. This is where the read octet ++* will be stored ++* ++* Returns: ++* zero (0) - failed ++* one (1) - success ++* ++* Side effects: ++* ++* ++* Call context: ++* ++* STATUS: FINISHED. ++* NOT ADAPTED FOR ACX111 !! ++* ++* Comment: This function was in V3 driver only. ++* It should be found what mean the different values written ++* in the registers. ++* It should be checked if it would be possible to use a ++* acx100_read_reg8() instead of a acx100_read_reg16() as the ++* read value should be an octet. (ygauteron, 29.05.2003) ++----------------------------------------------------------------*/ ++UINT16 acx100_read_eeprom_offset(wlandevice_t *priv, ++ UINT16 addr, UINT8 *charbuf) ++{ ++ UINT16 result = 1; ++#if (WLAN_HOSTIF!=WLAN_USB) ++ UINT32 count = 0; ++ ++ FN_ENTER; ++ ++ acx100_write_reg16(priv, priv->io[IO_ACX_EEPROM_CFG], 0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_EEPROM_CFG] + 0x2, 0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_EEPROM_ADDR], addr); ++ acx100_write_reg16(priv, priv->io[IO_ACX_EEPROM_ADDR] + 0x2, 0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_EEPROM_CTL], 2); ++ acx100_write_reg16(priv, priv->io[IO_ACX_EEPROM_CTL] + 0x2, 0); ++ ++ while (0 != acx100_read_reg16(priv, priv->io[IO_ACX_EEPROM_CTL])) ++ { ++ /* scheduling away instead of CPU burning loop ++ * doesn't seem to work here at all: ++ * awful delay, sometimes also failure. ++ * Doesn't matter anyway (only small delay). */ ++ if (++count > 0xffff) { ++ result = 0; ++ acxlog(L_BINSTD, "%s: timeout waiting for read eeprom cmd\n", __func__); ++ goto done; ++ } ++ } ++ ++ /* yg: Why reading a 16-bits register for a 8-bits value ? */ ++ *charbuf = (unsigned char) acx100_read_reg16(priv, priv->io[IO_ACX_EEPROM_DATA]); ++ acxlog(L_DEBUG, "EEPROM read 0x%04x --> 0x%02x\n", addr, *charbuf); ++ result = 1; ++ ++done: ++ FN_EXIT(1, result); ++#endif ++ return result; ++} ++ ++/* acx100_read_eeprom_area ++ * STATUS: OK. ++ */ ++UINT16 acx100_read_eeprom_area(wlandevice_t *priv) ++{ ++#if (WLAN_HOSTIF!=WLAN_USB) ++ UINT16 offs = 0x8c; ++ UINT8 tmp[0x3b]; ++ ++ for (offs = 0x8c; offs < 0xb9; offs++) { ++ acx100_read_eeprom_offset(priv, offs, &tmp[offs - 0x8c]); ++ } ++#endif ++ return 1; ++} ++ ++UINT16 acx100_write_eeprom_offset(wlandevice_t *priv, UINT16 addr, UINT16 len, UINT8 *charbuf) ++{ ++ UINT16 result = 1; ++#if (WLAN_HOSTIF!=WLAN_USB) ++ ++ UINT16 gpio_orig; ++ UINT16 i; ++ UINT8 *data_verify = NULL; ++ UINT16 count; ++ ++ FN_ENTER; ++ ++ acxlog(L_STD, "WARNING: I would write to EEPROM now. Since I really DON'T want to do it unless you know what you're doing, I will abort that now.\n"); ++ return 0; ++ ++ /* first we need to enable the OE (EEPROM Output Enable) GPIO line ++ * to be able to write to the EEPROM */ ++ gpio_orig = acx100_read_reg16(priv, priv->io[IO_ACX_GPIO_OE]); ++ acx100_write_reg16(priv, priv->io[IO_ACX_GPIO_OE], gpio_orig & ~1); ++ ++ /* ok, now start writing the data out */ ++ for (i = 0; i < len; i++) { ++ ++ acx100_write_reg16(priv, priv->io[IO_ACX_EEPROM_CFG], 0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_EEPROM_CFG] + 0x2, 0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_EEPROM_ADDR], addr + i); ++ acx100_write_reg16(priv, priv->io[IO_ACX_EEPROM_ADDR] + 0x2, 0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_EEPROM_DATA], *(charbuf + i)); ++ acx100_write_reg16(priv, priv->io[IO_ACX_EEPROM_DATA] + 0x2, 0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_EEPROM_CTL], 1); ++ acx100_write_reg16(priv, priv->io[IO_ACX_EEPROM_CTL] + 0x2, 0); ++ ++ while (0 != acx100_read_reg16(priv, priv->io[IO_ACX_EEPROM_CTL])) ++ { ++ /* scheduling away instead of CPU burning loop ++ * doesn't seem to work here at all: ++ * awful delay, sometimes also failure. ++ * Doesn't matter anyway (only small delay). */ ++ if (++count > 0xffff) { ++ acxlog(L_BINSTD, "%s: WARNING, DANGER!!!! Timeout waiting for write eeprom cmd\n", __func__); ++ result = 0; ++ goto end; ++ } ++ } ++ } ++ ++ /* disable EEPROM writing */ ++ acx100_write_reg16(priv, priv->io[IO_ACX_GPIO_OE], gpio_orig); ++ ++ /* now start a verification run */ ++ if ((NULL == (data_verify = kmalloc(len, GFP_KERNEL)))) { ++ result = 0; ++ goto end; ++ } ++ ++ for (i = 0; i < len; i++) { ++ ++ acx100_write_reg16(priv, priv->io[IO_ACX_EEPROM_CFG], 0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_EEPROM_CFG] + 0x2, 0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_EEPROM_ADDR], addr + i); ++ acx100_write_reg16(priv, priv->io[IO_ACX_EEPROM_ADDR] + 0x2, 0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_EEPROM_CTL], 2); ++ acx100_write_reg16(priv, priv->io[IO_ACX_EEPROM_CTL] + 0x2, 0); ++ ++ while (0 != acx100_read_reg16(priv, priv->io[IO_ACX_EEPROM_CTL])) ++ { ++ /* scheduling away instead of CPU burning loop ++ * doesn't seem to work here at all: ++ * awful delay, sometimes also failure. ++ * Doesn't matter anyway (only small delay). */ ++ if (++count > 0xffff) { ++ acxlog(L_BINSTD, "%s: timeout waiting for read eeprom cmd\n", __func__); ++ result = 0; ++ goto end; ++ } ++ } ++ ++ *(data_verify + i) = (UINT8)acx100_read_reg16(priv, priv->io[IO_ACX_EEPROM_DATA]); ++ } ++ ++ if (0 == memcmp(charbuf, data_verify, len)) ++ result = 1; /* read data matches, success */ ++ ++end: ++ if (NULL != data_verify) ++ kfree(data_verify); ++ ++ FN_EXIT(1, result); ++#endif ++ return result; ++} ++ ++UINT16 acx100_read_phy_reg(wlandevice_t *priv, UINT16 reg, UINT8 *charbuf) ++{ ++ UINT16 result = 1; ++#if (WLAN_HOSTIF!=WLAN_USB) ++ UINT32 count = 0; ++ ++ FN_ENTER; ++ ++ acx100_write_reg16(priv, priv->io[IO_ACX_PHY_ADDR], reg); ++ acx100_write_reg16(priv, priv->io[IO_ACX_PHY_ADDR] + 0x2, 0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_PHY_CTL], 2); ++ acx100_write_reg16(priv, priv->io[IO_ACX_PHY_CTL] + 0x2, 0); ++ ++ while (0 != acx100_read_reg16(priv, priv->io[IO_ACX_PHY_CTL])) ++ { ++ /* scheduling away instead of CPU burning loop ++ * doesn't seem to work here at all: ++ * awful delay, sometimes also failure. ++ * Doesn't matter anyway (only small delay). */ ++ if (++count > 0xffff) { ++ result = 0; ++ acxlog(L_BINSTD, "%s: timeout waiting for read eeprom cmd\n", __func__); ++ goto done; ++ } ++ } ++ ++ /* yg: Why reading a 16-bits register for a 8-bits value ? */ ++ *charbuf = (UINT8)acx100_read_reg16(priv, priv->io[IO_ACX_PHY_DATA]); ++ acxlog(L_DEBUG, "radio PHY read 0x%04x --> 0x%02x\n", reg, *charbuf); ++ result = 1; ++ ++done: ++ FN_EXIT(1, result); ++#endif ++ return result; ++} ++ ++UINT16 acx100_write_phy_reg(wlandevice_t *priv, UINT16 reg, UINT8 value) ++{ ++#if (WLAN_HOSTIF!=WLAN_USB) ++ ++ FN_ENTER; ++ ++ acx100_write_reg16(priv, priv->io[IO_ACX_PHY_ADDR], reg); ++ acx100_write_reg16(priv, priv->io[IO_ACX_PHY_ADDR] + 0x2, 0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_PHY_DATA], value); ++ acx100_write_reg16(priv, priv->io[IO_ACX_PHY_DATA] + 0x2, 0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_PHY_CTL], 1); ++ acx100_write_reg16(priv, priv->io[IO_ACX_PHY_CTL] + 0x2, 0); ++ ++ acxlog(L_DEBUG, "radio PHY write 0x%02x --> 0x%04x\n", value, reg); ++ ++ FN_EXIT(1, 1); ++#endif ++ return 1; ++} +diff -urN x/drivers/net/wireless/acx/acx100_helper.h y/drivers/net/wireless/acx/acx100_helper.h +--- x/drivers/net/wireless/acx/acx100_helper.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/acx/acx100_helper.h 2004-04-14 01:54:51.000000000 +1000 +@@ -0,0 +1,381 @@ ++/* include/acx100_helper.h ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Copyright (C) 2003 ACX100 Open Source Project ++ * ++ * The contents of this file are subject to the Mozilla Public ++ * License Version 1.1 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS ++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or ++ * implied. See the License for the specific language governing ++ * rights and limitations under the License. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU Public License version 2 (the "GPL"), in which ++ * case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use ++ * your version of this file under the MPL, indicate your decision ++ * by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL. If you do not delete ++ * the provisions above, a recipient may use your version of this ++ * file under either the MPL or the GPL. ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Inquiries regarding the ACX100 Open Source Project can be ++ * made directly to: ++ * ++ * acx100-users@lists.sf.net ++ * http://acx100.sf.net ++ * ++ * -------------------------------------------------------------------- ++ */ ++#define ISTATUS_0_STARTED 0 ++#define ISTATUS_1_SCANNING 1 ++#define ISTATUS_2_WAIT_AUTH 2 ++#define ISTATUS_3_AUTHENTICATED 3 ++#define ISTATUS_4_ASSOCIATED 4 ++#define ISTATUS_5_UNKNOWN 5 ++ ++ ++ ++/* a helper struct for quick implementation of commands */ ++typedef struct GenericPacket { ++ UINT8 bytes[32]; ++} GenericPacket_t; ++ ++ ++typedef struct acx100_memmap { ++ UINT16 rid; ++ UINT16 len; ++ UINT32 CodeStart; ++ UINT32 CodeEnd; ++ UINT32 WEPCacheStart; ++ UINT32 WEPCacheEnd; ++ UINT32 PacketTemplateStart; ++ UINT32 PacketTemplateEnd; ++ UINT32 QueueStart; ++ UINT32 QueueEnd; ++ UINT32 PoolStart; ++ UINT32 PoolEnd; ++} acx100_memmap_t; ++ ++typedef struct acx100_memconfigoption { ++ UINT16 rid; ++ UINT16 len; ++ UINT32 DMA_config; ++ struct rxhostdescriptor *RxHostDesc; /* val0x8 */ ++ UINT32 rx_mem; ++ UINT32 tx_mem; ++ UINT16 TxBlockNum; ++ UINT16 RxBlockNum; ++} acx100_memconfigoption_t; ++ ++ ++typedef struct QueueConfig { ++ UINT16 rid; /* rid */ ++ UINT16 len; /* length */ ++ UINT32 AreaSize; ++ UINT32 RxQueueStart; ++ UINT8 QueueOptions; /* queue options, val0xd */ ++ UINT8 NumTxQueues; /* # tx queues, val0xe */ ++ UINT8 NumRxDesc; /* for USB only */ ++ UINT8 padf2; /* # rx buffers */ ++ UINT32 QueueEnd; ++ UINT32 HostQueueEnd; /* QueueEnd2*/ ++ UINT32 TxQueueStart; ++ UINT8 TxQueuePri; ++ UINT8 NumTxDesc; ++ UINT16 pad; ++} QueueConfig_t; ++ ++typedef struct associd { ++ UINT16 vala; ++} associd_t; ++ ++#define PS_CFG_ENABLE 0x80 ++#define PS_CFG_PENDING 0x40 /* status flag when entering PS */ ++#define PS_CFG_WAKEUP_MODE_MASK 0x07 ++#define PS_CFG_WAKEUP_BY_HOST 0x03 ++#define PS_CFG_WAKEUP_EACH_ITVL 0x02 ++#define PS_CFG_WAKEUP_ON_DTIM 0x01 ++#define PS_CFG_WAKEUP_ALL_BEAC 0x00 ++ ++#define PS_OPT_ENA_ENHANCED_PS 0x04 /* Enhanced PS mode: sleep until Rx Beacon w/ the STA's AID bit set in the TIM; newer firmwares only(?) */ ++#define PS_OPT_STILL_RCV_BCASTS 0x01 ++ ++typedef struct acx100_powermgmt { ++ UINT32 rid; ++ UINT32 len; ++ UINT8 wakeup_cfg; ++ UINT8 listen_interval; /* for EACH_ITVL: wake up every "beacon units" interval */ ++ UINT8 options; ++ UINT8 hangover_period; /* remaining wake time after Tx MPDU w/ PS bit, in values of 1/1024 seconds */ ++ UINT16 enhanced_ps_transition_time; /* rem. wake time for Enh. PS */ ++} acx100_powermgmt_t; ++ ++typedef struct acx111_powermgmt { ++ UINT32 rid; ++ UINT32 len; ++ UINT8 wakeup_cfg; ++ UINT8 listen_interval; /* for EACH_ITVL: wake up every "beacon units" interval */ ++ UINT8 options; ++ UINT8 hangover_period; /* remaining wake time after Tx MPDU w/ PS bit, in values of 1/1024 seconds */ ++ UINT32 beaconRxTime; ++ UINT32 enhanced_ps_transition_time; /* rem. wake time for Enh. PS */ ++} acx111_powermgmt_t; ++ ++typedef struct defaultkey { ++ UINT8 num; ++} defaultkey_t; ++ ++typedef struct memmap { ++ UINT16 type; ++ UINT16 length; ++ union data { ++ struct GenericPacket gp; ++ /* struct wep wp; */ ++ struct associd asid; ++ struct defaultkey dkey; ++ } m; ++} memmap_t; ++ ++typedef struct sub3info { ++ UINT8 size; ++ UINT8 buf[0x4]; ++} sub3info_t; ++ ++typedef struct subsubinfo { ++ UINT8 size; ++ struct sub3info buf; ++} subsubinfo_t; ++ ++typedef struct subinfo { ++ UINT16 size; ++ char buf[0x8]; ++ struct subsubinfo buf2; ++ char buf3[0x8]; ++} subinfo_t; ++ ++typedef struct beaconinfo { ++ UINT16 size; ++ UINT16 status; ++ UINT8 addr1[0x6]; ++ UINT8 addr2[0x6]; ++ UINT8 addr3[0x6]; ++ struct subinfo inf; ++ UINT8 buf[0x1c]; ++} beaconinfo_t; ++ ++typedef struct beacon { ++ UINT16 size; ++ struct beaconinfo inf; ++// UINT16 vala; ++} beacon_t; ++ ++#define ACX_SCAN_ACTIVE 0 ++#define ACX_SCAN_PASSIVE 1 ++#define ACX_SCAN_BACKGROUND 2 ++ ++typedef struct scan { ++ UINT16 count; /* number of scans to do, 0xffff == continuous */ ++ UINT16 start_chan; ++ UINT16 flags; /* channel list mask; 0x8000 == all channels? */ ++ UINT8 max_rate; /* max. probe rate */ ++ UINT8 options; /* scan mode: 0 == active, 1 == passive, 2 == background */ ++ UINT16 chan_duration; ++ UINT16 max_probe_delay; ++} scan_t; /* length 0xc */ ++ ++typedef struct tim { ++ UINT16 size; ++ UINT8 buf[0x100]; ++} tim_t; ++ ++typedef struct proberesp { ++ UINT16 size; ++ char buf[0x54]; ++} proberesp_t; ++ ++typedef struct probereq { ++ UINT16 size; ++ char buf[0x44]; ++} probereq_t; ++ ++typedef struct joinbss { ++ UINT8 bssid[ETH_ALEN]; ++ UINT16 beacon_interval; ++ UINT8 dtim_interval; ++ UINT8 rates_basic; ++ UINT8 rates_supported; ++ UINT8 txrate_val; ++ UINT8 preamble_type; ++ UINT8 macmode; ++ UINT8 channel; ++ UINT8 essid_len; ++ char essid[IW_ESSID_MAX_SIZE]; ++} joinbss_t; /* ACX100 specific join struct */ ++ ++/* ++ * I am temporarily redefining this because the above struct is somewhat wrong. ++ * ++ * NOTE: this is a generic struct for all sorts of different packet types. ++ * As such I guess that someone got confused about structure layout. ++ * In other words: it always has an "official" packet header (A4?) ++ * and then a custom packet body. ++ * The current form is probably a bit sub-optimal. However let's keep it ++ * for now and then redefine it later. Or maybe change it now to have a ++ * better struct layout for all sorts of management packets? ++ */ ++typedef struct acxp80211_hdr { ++ p80211_hdr_a3_t a4; ++ UINT8 val0x18[8]; /* this contains the Logical Link Control data ++ the first three bytes are the dsap, ssap and control ++ respectively. the following 3 bytes are either ieee_oui ++ or an RFC. See p80211conv.c/h for more. */ ++ UINT16 beacon_interval; ++ UINT16 caps; ++ UINT8 info[0x30]; /* 0x24 */ ++ /* ++ * info[1] is essid_len ++ * &info[2] is essid (max. 32 chars) ++ * FIXME: huh, then sizeof(info) == 0x18 cannot be correct! Adjusting ++ * to 0x30, which extends to end of this struct ++ */ ++// p80211_hdr_a4_t b4; ++} acxp80211_hdr_t; /* size: 0x54 */ ++ ++/* struct used for Beacon and for Probe Response frames */ ++typedef struct acxp80211_beacon_prb_resp { ++ p80211_hdr_a3_t hdr; /* 24 Bytes */ ++ UINT8 timestamp[8]; /* 8 Bytes */ ++ UINT16 beacon_interval; /* 2 Bytes */ ++ UINT16 caps; /* 2 Bytes */ ++ UINT8 info[48]; /* 48 Bytes */ ++#if INFO_CONSISTS_OF ++ UINT8 ssid[1+1+IW_ESSID_MAX_SIZE]; /* 34 Bytes */ ++ UINT8 supp_rates[1+1+8]; /* 10 Bytes */ ++ UINT8 ds_parms[1+1+1]; /* 3 Bytes */ ++ UINT8 filler; /* 1 Byte alignment filler */ ++#endif ++} acxp80211_beacon_prb_resp_t; ++ ++typedef struct acxp80211_packet { ++ UINT16 size; /* packet len indicator for firmware */ ++ struct acxp80211_hdr hdr; /* actual packet */ ++} acxp80211_packet_t; /* size: 0x56 */ ++ ++typedef struct acxp80211_beacon_prb_resp_template { ++ UINT16 size; /* packet len indicator for firmware */ ++ struct acxp80211_beacon_prb_resp pkt; ++} acxp80211_beacon_prb_resp_template_t; ++ ++typedef struct acxp80211_nullframe { ++ UINT16 size; ++ struct p80211_hdr_a3 hdr; ++} acxp80211_nullframe_t; ++ ++typedef struct { ++ UINT32 chksum; ++ UINT32 size; ++ UINT8 data[1]; /* the byte array of the actual firmware... */ ++} firmware_image_t; ++ ++typedef struct { ++ UINT32 offset; ++ UINT32 len; ++} radioinit_t; ++ ++ ++typedef struct acx100_wep_options { ++ UINT16 rid; ++ UINT16 len; ++ UINT16 NumKeys; /* max # of keys */ ++ UINT8 WEPOption; ++ UINT8 Pad; /* used only for acx111 */ ++} acx100_wep_options_t; ++ ++typedef struct dot11WEPDefaultKey { ++ UINT16 rid; ++ UINT16 len; ++ UINT8 Action; ++ UINT8 KeySize; ++ UINT8 defaultKeyNum; ++ UINT8 Key[29]; // check this! was Key[19]. ++} dot11WEPDefaultKey_t; ++ ++typedef struct dot11WEPDefaultKeyID { ++ UINT16 rid; ++ UINT16 len; ++ UINT8 KeyID; ++} dot11WEPDefaultKeyID_t; ++ ++typedef struct acx100_wep_mgmt { ++ UINT8 MacAddr[ETH_ALEN]; ++ UINT16 Action; ++ UINT16 KeySize; ++ UINT16 Key[29]; /* 29*8 == 232bits == WEP256 */ ++} acx100_wep_mgmt_t; ++ ++ ++ ++ ++void acx100_schedule(long timeout); ++int acx100_reset_dev(netdevice_t *dev); ++void acx100_join_bssid(wlandevice_t *priv); ++int acx100_init_mac(netdevice_t *dev); ++int acx100_set_defaults(wlandevice_t *priv); ++void acx100_set_reg_domain(wlandevice_t *priv, unsigned char reg_dom_id); ++int acx100_set_probe_response_template(wlandevice_t *priv); ++int acx100_set_beacon_template(wlandevice_t *priv); ++void acx100_set_timer(wlandevice_t *priv, UINT32 time); ++void acx100_update_capabilities(wlandevice_t *priv); ++UINT16 acx100_read_eeprom_offset(wlandevice_t *priv, UINT16 addr, ++ UINT8 *charbuf); ++UINT16 acx100_read_eeprom_area(wlandevice_t *priv); ++UINT16 acx100_write_eeprom_offset(wlandevice_t *priv, UINT16 addr, ++ UINT16 len, UINT8 *charbuf); ++UINT16 acx100_read_phy_reg(wlandevice_t *priv, UINT16 reg, UINT8 *charbuf); ++UINT16 acx100_write_phy_reg(wlandevice_t *priv, UINT16 reg, UINT8 value); ++void acx100_start(wlandevice_t *priv); ++void acx100_reset_mac(wlandevice_t *priv); ++/*@null@*/ firmware_image_t *acx100_read_fw( const char *file); ++int acx100_upload_fw(wlandevice_t *priv); ++int acx100_write_fw(wlandevice_t *priv, const firmware_image_t *apfw_image, UINT32 offset); ++int acx100_validate_fw(wlandevice_t *priv, const firmware_image_t *apfw_mage, UINT32 offset); ++int acx100_verify_init(wlandevice_t *priv); ++void acx100_init_mboxes(wlandevice_t *priv); ++int acx100_init_wep(wlandevice_t *priv, acx100_memmap_t *pt); ++int acx100_init_packet_templates(wlandevice_t *priv, acx100_memmap_t *pt); ++int acx100_init_max_probe_request_template(wlandevice_t *priv); ++int acx100_init_max_null_data_template(wlandevice_t *priv); ++int acx100_init_max_beacon_template(wlandevice_t *priv); ++int acx100_init_max_tim_template(wlandevice_t *priv); ++int acx100_init_max_probe_response_template(wlandevice_t *priv); ++int acx100_set_tim_template(wlandevice_t *priv); ++int acx100_set_generic_beacon_probe_response_frame(wlandevice_t *priv, ++ struct acxp80211_beacon_prb_resp *bcn); ++void acx100_update_card_settings(wlandevice_t *priv, int init, int get_all, int set_all); ++int acx_ioctl_old(netdevice_t *dev, struct ifreq *ifr, int cmd); ++void acx100_set_probe_request_template(wlandevice_t *priv); ++void acx100_scan_chan(wlandevice_t *priv); ++void acx100_scan_chan_p(wlandevice_t *priv, struct scan *s); ++int acx100_set_rxconfig(wlandevice_t *priv); ++int acx100_load_radio(wlandevice_t *priv); ++int acx100_read_proc(char *page, char **start, off_t offset, int count, ++ int *eof, void *data); ++int acx100_read_proc_diag(char *page, char **start, off_t offset, int count, ++ int *eof, void *data); ++int acx100_read_proc_eeprom(char *page, char **start, off_t offset, int count, ++ int *eof, void *data); ++int acx100_read_proc_phy(char *page, char **start, off_t offset, int count, ++ int *eof, void *data); ++int acx100_proc_output(char *buf, wlandevice_t *priv); ++int acx100_proc_diag_output(char *buf, wlandevice_t *priv); ++int acx100_proc_eeprom_output(char *buf, wlandevice_t *priv); ++int acx100_proc_phy_output(char *buf, wlandevice_t *priv); +diff -urN x/drivers/net/wireless/acx/acx100_helper2.c y/drivers/net/wireless/acx/acx100_helper2.c +--- x/drivers/net/wireless/acx/acx100_helper2.c 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/acx/acx100_helper2.c 2004-04-14 02:11:16.000000000 +1000 +@@ -0,0 +1,2994 @@ ++/* src/acx100_helper2.c - helper functions ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Copyright (C) 2003 ACX100 Open Source Project ++ * ++ * The contents of this file are subject to the Mozilla Public ++ * License Version 1.1 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS ++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or ++ * implied. See the License for the specific language governing ++ * rights and limitations under the License. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU Public License version 2 (the "GPL"), in which ++ * case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use ++ * your version of this file under the MPL, indicate your decision ++ * by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL. If you do not delete ++ * the provisions above, a recipient may use your version of this ++ * file under either the MPL or the GPL. ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Inquiries regarding the ACX100 Open Source Project can be ++ * made directly to: ++ * ++ * acx100-users@lists.sf.net ++ * http://acx100.sf.net ++ * ++ * -------------------------------------------------------------------- ++ */ ++ ++#ifdef S_SPLINT_S /* some crap that splint needs to not crap out */ ++#define __signed__ signed ++#define __u64 unsigned long long ++#define loff_t unsigned long ++#define sigval_t unsigned long ++#define siginfo_t unsigned long ++#define stack_t unsigned long ++#define __s64 signed long long ++#endif ++#include ++#include ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#if WIRELESS_EXT > 12 ++#include ++#endif /* WE > 12 */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include ++#include ++ ++#include ++#include ++#include ++ ++ ++/*================================================================*/ ++/* Project Includes */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static UINT32 acx100_process_mgmt_frame(struct rxhostdescriptor *skb, ++ wlandevice_t *priv); ++static int acx100_process_data_frame_master(struct rxhostdescriptor *skb, ++ wlandevice_t *priv); ++static int acx100_process_data_frame_client(struct rxhostdescriptor *skb, ++ wlandevice_t *priv); ++static int acx100_process_NULL_frame(struct rxhostdescriptor *a, ++ wlandevice_t *priv, int vala); ++ ++alloc_p80211_mgmt_req_t alloc_p80211mgmt_req; ++ ++UINT16 CurrentAID = 1; ++ ++char *state_str[7] = { "STARTED", "SCANNING", "WAIT_AUTH", "AUTHENTICATED", "ASSOCIATED", "UNKNOWN", "INVALID??" }; ++ ++/*---------------------------------------------------------------- ++* acx100_sta_list_init ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_sta_list_init() ++ * STATUS: should be ok.. ++ */ ++void acx100_sta_list_init(wlandevice_t *priv) ++{ ++ FN_ENTER; ++ memset(priv->sta_hash_tab, 0, sizeof(priv->sta_hash_tab)); ++ memset(priv->sta_list, 0, sizeof(priv->sta_list)); ++ FN_EXIT(0, 0); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_sta_list_alloc ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_sta_list_alloc() ++ * STATUS: FINISHED, except for struct defs. ++ * Hmm, does this function have one "silent" parameter or 0 parameters? ++ * Doesn't matter much anyway... ++ */ ++inline client_t *acx100_sta_list_alloc(wlandevice_t *priv, UINT8 *address) ++{ ++ int i = 0; ++ ++ FN_ENTER; ++ for (i = 0; i <= 31; i++) { ++ if (priv->sta_list[i].used == 0) { ++ priv->sta_list[i].used = 1; ++ priv->sta_list[i].auth_alg = WLAN_AUTH_ALG_SHAREDKEY; ++ priv->sta_list[i].val0xe = 1; ++ FN_EXIT(1, (int)&(priv->sta_list[i])); ++ return &(priv->sta_list[i]); ++ } ++ } ++ FN_EXIT(1, 0); ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_sta_list_add ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_sta_list_add() ++ * STATUS: FINISHED. ++ */ ++client_t *acx100_sta_list_add(wlandevice_t *priv, UINT8 *address) ++{ ++ client_t *client; ++ int index; ++ ++ FN_ENTER; ++ client = acx100_sta_list_alloc(priv, address); ++ if (!client) ++ goto done; ++ ++ /* computing hash table index */ ++ index = ((address[4] << 8) + address[5]); ++ index -= index & 0x3ffc0; ++ ++ client->next = priv->sta_hash_tab[index]; ++ priv->sta_hash_tab[index] = client; ++ ++ acxlog(L_BINSTD | L_ASSOC, ++ " sta = %02X:%02X:%02X:%02X:%02X:%02X\n", ++ address[0], address[1], address[2], address[3], address[4], ++ address[5]); ++ ++ done: ++ FN_EXIT(1, (int) client); ++ return client; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_sta_list_get_from_hash ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++ ++static inline client_t *acx100_sta_list_get_from_hash(wlandevice_t *priv, UINT8 *address) ++{ ++ int index; ++ ++ FN_ENTER; ++ /* computing hash table index */ ++ index = ((address[4] << 8) + address[5]); ++ index -= index & 0x3ffc0; ++ ++ FN_EXIT(0, 0); ++ return priv->sta_hash_tab[index]; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_sta_list_get ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_get_sta_list() ++ * STATUS: FINISHED. ++ */ ++client_t *acx100_sta_list_get(wlandevice_t *priv, UINT8 *address) ++{ ++ client_t *client; ++ client_t *result = NULL; /* can be removed if tracing unneeded */ ++ ++ FN_ENTER; ++ client = acx100_sta_list_get_from_hash(priv, address); ++ ++ for (; client; client = client->next) { ++ if (0 == memcmp(address, client->address, ETH_ALEN)) { ++ result = client; ++ goto done; ++ } ++ } ++ ++ done: ++ FN_EXIT(1, (int) result); ++ return result; ++} ++ ++inline char *acx100_get_status_name(UINT16 status) ++{ ++ if (ISTATUS_5_UNKNOWN >= status) ++ return state_str[status]; ++ else ++ return state_str[6]; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_set_status ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: should be ok. ++* ++* Comment: ++* 0 probably means: just started (acx100_start()). ++* 1 probably means: starting scan? ++* 2 probably means: not authenticated yet (acx100_process_deauthenticate()) ++* 3 probably means: authenticated, but not associated yet (acx100_process_disassociate(), acx100_process_authen()) ++* 4 probably means: associated (acx100_process_assocresp(), acx100_process_reassocresp()) ++* 5 means: status unknown ++*----------------------------------------------------------------*/ ++ ++void acx100_set_status(wlandevice_t *priv, UINT16 status) ++{ ++ char *stat; ++#if QUEUE_OPEN_AFTER_ASSOC ++ static int associated = 0; ++#endif ++ ++ FN_ENTER; ++ stat = acx100_get_status_name(status); ++ ++ acxlog(L_BINDEBUG | L_ASSOC, "%s: Setting status = %d (%s)\n", ++ __func__, status, stat); ++ ++#if WIRELESS_EXT > 12 /* wireless_send_event() */ ++ if (ISTATUS_4_ASSOCIATED == status) { ++ union iwreq_data wrqu; ++ ++ wrqu.data.length = 0; ++ wrqu.data.flags = 0; ++ wireless_send_event(priv->netdev, SIOCGIWSCAN, &wrqu, NULL); ++ ++ wrqu.data.length = 0; ++ wrqu.data.flags = 0; ++ MAC_COPY(wrqu.ap_addr.sa_data, priv->bssid); ++ wrqu.ap_addr.sa_family = ARPHRD_ETHER; ++ wireless_send_event(priv->netdev, SIOCGIWAP, &wrqu, NULL); ++ } else { ++ union iwreq_data wrqu; ++ ++ /* send event with empty BSSID to indicate we're not associated */ ++ MAC_FILL(wrqu.ap_addr.sa_data, 0x0); ++ wrqu.ap_addr.sa_family = ARPHRD_ETHER; ++ wireless_send_event(priv->netdev, SIOCGIWAP, &wrqu, NULL); ++ ++ if (ISTATUS_0_STARTED == status) { ++ if (memcmp(priv->netdev->dev_addr, priv->dev_addr, ETH_ALEN)) { ++ /* uh oh, the interface's MAC address changed, ++ * need to update templates (and init STAs??) */ ++ acxlog(L_STD, "Detected MAC address change, updating card configuration.\n"); ++ ++ /* the MAC address has to be updated first, ++ * since otherwise we enter an eternal loop, ++ * as update_card_settings calls set_status */ ++ MAC_COPY(priv->dev_addr, priv->netdev->dev_addr); ++ priv->set_mask |= SET_TEMPLATES|SET_STA_LIST; ++ acx100_update_card_settings(priv, 0, 0, 0); ++ } ++ } ++ } ++#endif ++ ++ if (priv->unknown0x2350 == ISTATUS_5_UNKNOWN) { ++ priv->unknown0x2350 = priv->status; ++ priv->status = ISTATUS_5_UNKNOWN; ++ } else { ++ priv->status = status; ++ } ++ if ((priv->status == ISTATUS_1_SCANNING) ++ || (priv->status == ISTATUS_5_UNKNOWN)) { ++ priv->scan_retries = 0; ++ acx100_set_timer(priv, 1500000); /* 1.5 s initial scan time (used to be 15s, corrected to 1.5)*/ ++ } else if (priv->status <= ISTATUS_3_AUTHENTICATED) { ++ priv->auth_assoc_retries = 0; ++ acx100_set_timer(priv, 1500000); /* 1.5 s */ ++ } ++ ++#if QUEUE_OPEN_AFTER_ASSOC ++ if (status == ISTATUS_4_ASSOCIATED) ++ { ++ if (associated == 0) ++ { ++ /* ah, we're newly associated now, ++ * so let's restart the net queue */ ++ acxlog(L_XFER, "wake queue after association.\n"); ++ netif_wake_queue(priv->netdev); ++ } ++ associated = 1; ++ } ++ else ++ { ++ /* not associated any more, so let's stop the net queue */ ++ if (associated == 1) ++ { ++ acxlog(L_XFER, "stop queue after losing association.\n"); ++ netif_stop_queue(priv->netdev); ++ } ++ associated = 0; ++ } ++#endif ++ FN_EXIT(0, 0); ++} ++ ++static inline p80211_hdr_t *acx_get_p80211_hdr(wlandevice_t *priv, rxhostdescriptor_t *rxdesc) ++{ ++ if (priv->rx_config_1 & RX_CFG1_INCLUDE_ADDIT_HDR) { ++ /* take into account additional header in front of packet */ ++ return (p80211_hdr_t *)((UINT8 *)&rxdesc->data->buf + 4); ++ } ++ else ++ { ++ return (p80211_hdr_t *)&rxdesc->data->buf; ++ } ++} ++ ++/*------------------------------------------------------------------------------ ++ * acx100_rx_ieee802_11_frame ++ * ++ * ++ * Arguments: ++ * ++ * Returns: ++ * ++ * Side effects: ++ * ++ * Call context: ++ * ++ * STATUS: FINISHED, UNVERIFIED. ++ * ++ * Comment: ++ * ++ *----------------------------------------------------------------------------*/ ++int acx100_rx_ieee802_11_frame(wlandevice_t *priv, rxhostdescriptor_t *rxdesc) ++{ ++ UINT16 ftype; ++ UINT fstype; ++ p80211_hdr_t *p80211_hdr; ++ int result = 0; ++ ++ FN_ENTER; ++ ++ p80211_hdr = acx_get_p80211_hdr(priv, rxdesc); ++// printk("Rx_CONFIG_1 = %X\n",priv->rx_config_1 & RX_CFG1_INCLUDE_ADDIT_HDR); ++ ++ /* see IEEE 802.11-1999.pdf chapter 7 "MAC frame formats" */ ++ ftype = WLAN_GET_FC_FTYPE(p80211_hdr->a3.fc); ++ fstype = WLAN_GET_FC_FSTYPE(p80211_hdr->a3.fc); ++ ++ switch (ftype) { ++ case WLAN_FTYPE_MGMT: ++ result = acx100_process_mgmt_frame(rxdesc, priv); ++ break; ++ case WLAN_FTYPE_CTL: ++ if (fstype != WLAN_FSTYPE_PSPOLL) ++ result = 0; ++ else ++ result = 1; ++ /* this call is irrelevant, since ++ * acx100_process_class_frame is a stub, so return ++ * immediately instead. ++ * return acx100_process_class_frame(rxdesc, priv, 3); */ ++ break; ++ case WLAN_FTYPE_DATA: ++ /* binary driver did ftype-1 to appease jump ++ * table layout */ ++ if (fstype == WLAN_FSTYPE_DATAONLY) ++ { ++ if (ACX_MODE_3_MANAGED_AP == priv->macmode_joined) { ++ result = acx100_process_data_frame_master(rxdesc, priv); ++ } else if (ISTATUS_4_ASSOCIATED == priv->status) { ++ result = acx100_process_data_frame_client(rxdesc, priv); ++ } ++ } else switch (ftype) { ++ case WLAN_FSTYPE_DATA_CFACK: ++ case WLAN_FSTYPE_DATA_CFPOLL: ++ case WLAN_FSTYPE_DATA_CFACK_CFPOLL: ++ case WLAN_FSTYPE_CFPOLL: ++ case WLAN_FSTYPE_CFACK_CFPOLL: ++ /* see above. ++ acx100_process_class_frame(rxdesc, priv, 3); */ ++ break; ++ case WLAN_FSTYPE_NULL: ++ acx100_process_NULL_frame(rxdesc, priv, 3); ++ /* FIXME: same here, see above */ ++ case WLAN_FSTYPE_CFACK: ++ default: ++ break; ++ } ++ break; ++ default: ++ break; ++ } ++ FN_EXIT(1, result); ++ return result; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_transmit_assocresp ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_transmit_assocresp() ++ * STATUS: should be ok, but UNVERIFIED. ++ */ ++UINT32 acx100_transmit_assocresp(wlan_fr_assocreq_t *arg_0, ++ wlandevice_t *priv) ++{ ++ UINT8 var_1c[6]; ++ UINT8 *da; ++ UINT8 *sa; ++ UINT8 *bssid; ++ TxData *hd; ++ struct assocresp_frame_body *payload; ++ struct txdescriptor *tx_desc; ++ struct txhostdescriptor *hdesc_header; ++ struct txhostdescriptor *hdesc_payload; ++ client_t *clt; ++ ++ FN_ENTER; ++ acxlog(L_STATE, "%s: UNVERIFIED.\n", __func__); ++ // FIXME: or is the order the other way round ?? ++ var_1c[0] = 0; ++ var_1c[1] = 1; ++ var_1c[2] = 3; ++ var_1c[3] = 7; ++ var_1c[4] = 0xf; ++ var_1c[5] = 0x1f; ++ ++ acxlog(L_BINDEBUG | L_ASSOC | L_XFER, "\n"); ++ ++ if (WLAN_GET_FC_TODS(arg_0->hdr->a3.fc) || WLAN_GET_FC_FROMDS(arg_0->hdr->a3.fc)) { ++ FN_EXIT(1, 1); ++ return 1; ++ } ++ ++ sa = arg_0->hdr->a3.a1; ++ da = arg_0->hdr->a3.a2; ++ bssid = arg_0->hdr->a3.a3; ++ ++ clt = acx100_sta_list_get(priv, da); ++ ++ if (clt != NULL) { ++ if (clt->used == 1) { ++ acx100_transmit_deauthen(da, clt, priv, WLAN_MGMT_REASON_CLASS2_NONAUTH /* 6 */); ++ FN_EXIT(0, 0); ++ return 0; ++ } else { ++ clt->used = 3; ++ ++ if (clt->aid == 0) { ++ clt->aid = CurrentAID; ++ CurrentAID++; ++ } ++ clt->val0xa = arg_0->listen_int[0]; ++ ++ memcpy(clt->val0x10, arg_0->ssid, arg_0->ssid->len); ++ ++ /* FIXME: huh, why choose the ESSID length ++ * directly as the index!?!? */ ++ if (arg_0->ssid->len <= 5) { ++ clt->val0x9a = var_1c[arg_0->ssid->len]; ++ } else { ++ clt->val0x9a = 0x1f; ++ } ++ ++ if ((tx_desc = acx100_get_tx_desc(priv)) == NULL) { ++ FN_EXIT(1, 0); ++ return 0; ++ } ++ ++ hdesc_header = tx_desc->host_desc; ++ hdesc_payload = tx_desc->host_desc + 1; ++ ++ hd = (TxData *)hdesc_header->data; ++ payload = (struct assocresp_frame_body *)hdesc_payload->data; ++ ++ hd->frame_control = host2ieee16(WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_ASSOCRESP)); /* 0x10 */ ++ hd->duration_id = arg_0->hdr->a3.dur; ++ ++ MAC_COPY(hd->da, da); ++ MAC_COPY(hd->sa, sa); ++ MAC_COPY(hd->bssid, bssid); ++ ++ hd->sequence_control = arg_0->hdr->a3.seq; ++ ++ hdesc_header->length = WLAN_HDR_A3_LEN; ++ hdesc_header->data_offset = 0; ++ ++ payload->cap_info = priv->capabilities; ++ payload->status = 0; ++ payload->aid = clt->aid; ++ ++ payload->rates.element_ID = 1; ++ payload->rates.length = priv->rate_spt_len; ++ payload->rates.sup_rates[0] = 0x82; /* 1 Mbit */ ++ payload->rates.sup_rates[1] = 0x84; /* 2 Mbit */ ++ payload->rates.sup_rates[2] = 0x8b; /* 5.5 Mbit */ ++ payload->rates.sup_rates[3] = 0x96; /* 11 Mbit */ ++ payload->rates.sup_rates[4] = 0xac; /* 22 Mbit */ ++ ++ hdesc_payload->length = priv->rate_spt_len + 8; ++ hdesc_payload->data_offset = 0; ++ ++ tx_desc->total_length = hdesc_payload->length + hdesc_header->length; ++ ++ acx100_dma_tx_data(priv, tx_desc); ++ } ++ } ++ ++ FN_EXIT(1, 1); ++ return 1; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_transmit_reassocresp ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_transmit_reassocresp() ++ * STATUS: should be ok, but UNVERIFIED. ++ */ ++UINT32 acx100_transmit_reassocresp(wlan_fr_reassocreq_t *arg_0, wlandevice_t *priv) ++{ ++ UINT8 *da = NULL; ++ UINT8 *sa = NULL; ++ UINT8 *bssid = NULL; ++ struct reassocresp_frame_body *payload; ++ struct txdescriptor *tx_desc; ++ struct txhostdescriptor *hdesc_header; ++ struct txhostdescriptor *hdesc_payload; ++ ++ client_t *clt; ++ TxData *fr; ++ ++ FN_ENTER; ++ acxlog(L_STATE, "%s: UNVERIFIED.\n", __func__); ++ if (WLAN_GET_FC_TODS(arg_0->hdr->a3.fc) || WLAN_GET_FC_FROMDS(arg_0->hdr->a3.fc)) { ++ FN_EXIT(1, 1); ++ return 1; ++ } ++ ++ sa = arg_0->hdr->a3.a1; ++ da = arg_0->hdr->a3.a2; ++ bssid = arg_0->hdr->a3.a3; ++ ++ clt = acx100_sta_list_get(priv, da); ++ if (clt != NULL) { ++ if (clt->used == 1) ++ clt->used = 2; ++ } else { ++ clt = acx100_sta_list_add(priv, da); ++ MAC_COPY(clt->address, da); ++ clt->used = 2; ++ } ++ ++ if (clt->used == 2) { ++ clt->used = 3; ++ if (clt->aid == 0) { ++ clt->aid = CurrentAID; ++ CurrentAID += 1; ++ } ++ clt->val0xa = arg_0->cap_info[0]; ++ ++ memcpy(clt->val0x10, arg_0->supp_rates, arg_0->supp_rates->len); ++ ++ switch (arg_0->supp_rates->len) { ++ case 1: ++ clt->val0x9a = 1; ++ break; ++ case 2: ++ clt->val0x9a = 3; ++ break; ++ case 3: ++ clt->val0x9a = 7; ++ break; ++ case 4: ++ clt->val0x9a = 0xf; ++ break; ++ default: ++ clt->val0x9a = 0x1f; ++ break; ++ } ++ ++ if ((tx_desc = acx100_get_tx_desc(priv)) == NULL) { ++ return 0; ++ } ++ hdesc_header = tx_desc->host_desc; ++ hdesc_payload = tx_desc->host_desc + 1; ++ fr = (TxData*)hdesc_header->data; ++ payload = (struct reassocresp_frame_body *)hdesc_payload->data; ++ fr->frame_control = WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_REASSOCRESP); /* 0x30 */ ++ fr->duration_id = arg_0->hdr->a3.dur; ++ ++ MAC_COPY(fr->da, da); ++ MAC_COPY(fr->sa, sa); ++ MAC_COPY(fr->bssid, bssid); ++ ++ fr->sequence_control = arg_0->hdr->a3.seq; ++ ++ hdesc_header->length = WLAN_HDR_A3_LEN; ++ hdesc_header->data_offset = 0; ++ ++ payload->cap_info = priv->capabilities; ++ payload->status = 0; ++ payload->aid = clt->aid; ++ ++ payload->rates.element_ID = 1; ++ payload->rates.length = priv->rate_spt_len; ++ payload->rates.sup_rates[0] = 0x82; /* 1 Mbit */ ++ payload->rates.sup_rates[1] = 0x84; /* 2 Mbit */ ++ payload->rates.sup_rates[2] = 0x8b; /* 5.5 Mbit */ ++ payload->rates.sup_rates[3] = 0x96; /* 11 Mbit */ ++ payload->rates.sup_rates[4] = 0xac; /* 22 Mbit */ ++ ++ hdesc_payload->data_offset = 0; ++ hdesc_payload->length = priv->rate_spt_len + 8; ++ ++ tx_desc->total_length = hdesc_payload->length + hdesc_header->length; ++ ++ acx100_dma_tx_data(priv, tx_desc); ++ } ++ FN_EXIT(1, 0); ++ ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_process_disassoc ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_process_disassoc() ++ * STATUS: UNVERIFIED. ++ */ ++int acx100_process_disassoc(wlan_fr_disassoc_t *arg_0, wlandevice_t *priv) ++{ ++ p80211_hdr_t *hdr; ++ int res = 0; ++ UINT8 *TA = NULL; ++ client_t *clts; ++ ++ FN_ENTER; ++ acxlog(L_STATE, "%s: UNVERIFIED.\n", __func__); ++ hdr = arg_0->hdr; ++ ++ if (WLAN_GET_FC_TODS(hdr->a4.fc) || WLAN_GET_FC_FROMDS(hdr->a4.fc)) ++ res = 1; ++ else ++ TA = hdr->a3.a2; ++ ++ if (!res) { ++ if ((clts = acx100_sta_list_get(priv, TA)) != NULL) { ++ if (clts->used == 1) { ++ acxlog(L_BINDEBUG | L_ASSOC | L_XFER, ++ "\n"); ++ acx100_transmit_deauthen(TA, clts, priv, WLAN_MGMT_REASON_CLASS2_NONAUTH /* 6 */); ++ } else ++ clts->used = 2; ++ } else ++ res = 1; ++ } ++ FN_EXIT(1, res); ++ return res; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_process_disassociate ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_process_disassociate() ++ * STATUS: UNVERIFIED. ++ */ ++int acx100_process_disassociate(wlan_fr_disassoc_t *req, wlandevice_t *priv) ++{ ++ p80211_hdr_t *hdr; ++ int res = 0; ++ ++ FN_ENTER; ++ acxlog(L_STATE, "%s: UNVERIFIED.\n", __func__); ++ hdr = req->hdr; ++ ++ if (WLAN_GET_FC_TODS(hdr->a3.fc) || WLAN_GET_FC_FROMDS(hdr->a3.fc)) ++ res = 1; ++ else { ++ if (ACX_MODE_0_IBSS_ADHOC == priv->macmode_joined) ++ res = 1; ++ else if (acx100_is_mac_address_equal(priv->dev_addr, hdr->a3.a1 /* RA */)) { ++ res = 1; ++ if (priv->status > ISTATUS_3_AUTHENTICATED) { ++ /* priv->val0x240 = req->reason[0]; Unused, so removed */ ++ acx100_set_status(priv, ISTATUS_3_AUTHENTICATED); ++#if (POWER_SAVE_80211 == 0) ++ ActivatePowerSaveMode(priv, 2); ++#endif ++ } ++ res = 0; ++ } else ++ res = 1; ++ } ++ FN_EXIT(1, res); ++ return res; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_process_data_frame_master ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++static int acx100_process_data_frame_master(struct rxhostdescriptor *rxdesc, wlandevice_t *priv) ++{ ++ client_t *clt; ++ UINT8 bcast_addr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; ++ client_t *var_24 = NULL; ++ p80211_hdr_t* p80211_hdr; ++ struct txdescriptor *tx_desc; ++ UINT8 esi = 0; ++ int result = 0; ++ int to_ds, from_ds; ++ UINT8 *da = NULL; ++ UINT8 *sa = NULL; ++ UINT8 *bssid = NULL; ++ ++ FN_ENTER; ++ acxlog(L_STATE, "%s: UNVERIFIED.\n", __func__); ++ ++ p80211_hdr = acx_get_p80211_hdr(priv, rxdesc); ++ ++ to_ds = WLAN_GET_FC_TODS(p80211_hdr->a3.fc); ++ from_ds = WLAN_GET_FC_FROMDS(p80211_hdr->a3.fc); ++ ++ if ((to_ds) && (!from_ds)) { ++ /* To_DS = 1, From_DS = 0 */ ++ da = p80211_hdr->a3.a3; /* DA */ ++ sa = p80211_hdr->a3.a2; /* SA */ ++ bssid = p80211_hdr->a3.a1; /* BSSID */ ++ } else if ((!to_ds) && (from_ds)) { ++ /* To_DS = 0, From_DS = 1 */ ++ da = p80211_hdr->a3.a1; /* DA */ ++ sa = p80211_hdr->a3.a3; /* SA */ ++ bssid = p80211_hdr->a3.a2; /* BSSID */ ++ } else if ((!to_ds) && (!from_ds)) { ++ /* To_DS = 0, From_DS = 0 */ ++ da = p80211_hdr->a3.a1; /* DA */ ++ sa = p80211_hdr->a3.a2; /* SA */ ++ bssid = p80211_hdr->a3.a3; /* BSSID */ ++ } else { ++ /* To_DS = 1, From_DS = 1 */ ++ acxlog(L_DEBUG, "frame error occurred??\n"); ++ priv->stats.rx_errors++; ++ goto done; ++ } ++ ++ /* check if it is our bssid, if not, leave */ ++ if (memcmp(bssid, priv->bssid, ETH_ALEN) == 0) { ++ if (!(clt = acx100_sta_list_get(priv, bcast_addr)) || (clt->used != 3)) { ++ acx100_transmit_deauthen(bcast_addr, 0, priv, WLAN_MGMT_REASON_RSVD /* 0 */); ++ acxlog(L_STD, "frame error #2??\n"); ++ priv->stats.rx_errors++; ++ goto fail; ++ } else { ++ esi = 2; ++ /* check if the da is not broadcast */ ++ if (!acx100_is_mac_address_broadcast(da)) { ++ if ((signed char) da[0x0] >= 0) { ++ esi = 0; ++ if (!(var_24 = acx100_sta_list_get(priv, da))) { ++ goto station_not_found; ++ } ++ if (var_24->used != 0x3) { ++ goto fail; ++ } ++ } else { ++ esi = 1; ++ } ++ } ++ if (var_24 == NULL) { ++ station_not_found: ++ if (esi == 0) { ++ acx100_rx(rxdesc, priv); ++ result = 0; ++ goto fail; ++ } ++ } ++ if ((esi == 0) || (esi == 2)) { ++ /* repackage, tx, and hope it someday reaches its destination */ ++ MAC_COPY(p80211_hdr->a3.a1, da); ++ MAC_COPY(p80211_hdr->a3.a2, bssid); ++ MAC_COPY(p80211_hdr->a3.a3, sa); ++ /* To_DS = 0, From_DS = 1 */ ++ p80211_hdr->a3.fc = ++ WLAN_SET_FC_FROMDS(1) + ++ WLAN_SET_FC_FTYPE(WLAN_FTYPE_DATA); ++ ++ if ((tx_desc = acx100_get_tx_desc(priv)) == NULL) { ++ return 0; ++ } ++ ++ acx100_rxdesc_to_txdesc(rxdesc, tx_desc); ++ acx100_dma_tx_data(priv, tx_desc); ++ ++ if (esi != 2) { ++ goto done; ++ } ++ } ++ acx100_rx(rxdesc, priv); ++ } ++ } ++done: ++ result = 1; ++fail: ++ FN_EXIT(1, result); ++ return result; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_process_data_frame_client ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_process_data_frame_client() ++ * STATUS: FINISHED, UNVERIFIED. ++ */ ++static int acx100_process_data_frame_client(struct rxhostdescriptor *rxdesc, wlandevice_t *priv) ++{ ++ UINT8 bcast_addr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; ++ UINT8 *da = NULL; ++ UINT8 *bssid = NULL; ++ p80211_hdr_t *p80211_hdr; ++ int to_ds, from_ds; ++ int result; ++ ++ FN_ENTER; ++ acxlog(L_STATE, "%s: UNVERIFIED.\n", __func__); ++ ++ p80211_hdr = acx_get_p80211_hdr(priv, rxdesc); ++ ++ to_ds = WLAN_GET_FC_TODS(p80211_hdr->a3.fc); ++ from_ds = WLAN_GET_FC_FROMDS(p80211_hdr->a3.fc); ++ ++ acxlog(L_DEBUG, "to_ds %i, from_ds %i\n", to_ds, from_ds); ++ ++ if ((to_ds) && (!from_ds)) { ++ /* To_DS = 1, From_DS = 0 */ ++ da = p80211_hdr->a3.a3; /* DA */ ++ bssid = p80211_hdr->a3.a1; /* BSSID */ ++ } else if ((!to_ds) && (from_ds)) { ++ /* To_DS = 0, From_DS = 1 */ ++ da = p80211_hdr->a3.a1; /* DA */ ++ bssid = p80211_hdr->a3.a2; /* BSSID */ ++ } else if ((!to_ds) && (!from_ds)) { ++ /* To_DS = 0, From_DS = 0 */ ++ da = p80211_hdr->a3.a1; /* DA */ ++ bssid = p80211_hdr->a3.a3; /* BSSID */ ++ } else { ++ /* To_DS = 1, From_DS = 1 */ ++ acxlog(L_DEBUG, "frame error occurred??\n"); ++ priv->stats.rx_errors++; ++ goto done; ++ } ++ ++ acxlog(L_DEBUG, "da "); ++ acx100_log_mac_address(L_DEBUG, da); ++ acxlog(L_DEBUG, ",bssid "); ++ acx100_log_mac_address(L_DEBUG, bssid); ++ acxlog(L_DEBUG, ",priv->bssid "); ++ acx100_log_mac_address(L_DEBUG, priv->bssid); ++ acxlog(L_DEBUG, ",dev_addr "); ++ acx100_log_mac_address(L_DEBUG, priv->dev_addr); ++ acxlog(L_DEBUG, ",bcast_addr "); ++ acx100_log_mac_address(L_DEBUG, bcast_addr); ++ acxlog(L_DEBUG, "\n"); ++ ++#if WE_DONT_WANT_TO_REJECT_MULTICAST ++ /* FIXME: we should probably reenable this code and check against ++ * a list of multicast addresses that are configured for the ++ * interface (ifconfig) */ ++ ++ /* check if it is our bssid */ ++ if (!acx100_is_mac_address_equal(priv->bssid, bssid)) { ++ /* is not our bssid, so bail out */ ++ goto done; ++ } ++ ++ /* check if it is broadcast */ ++ if (!acx100_is_mac_address_broadcast(da)) { ++ if ((signed char) da[0] >= 0) { ++ /* no broadcast, so check if it is our address */ ++ if (!acx100_is_mac_address_equal(da, priv->dev_addr)) { ++ /* it's not, so bail out */ ++ goto done; ++ } ++ } ++ } ++ ++ /* packet is from our bssid, and is either broadcast or destined for us, so process it */ ++#endif ++ acx100_rx(rxdesc, priv); ++ ++done: ++ result = 1; ++ FN_EXIT(1, result); ++ return result; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_process_mgmt_frame ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_process_mgmt_frame() ++ * STATUS: FINISHED, UNVERIFIED. namechange!! (from process_mgnt_frame()) ++ * FIXME: uses global struct alloc_p80211mgmt_req, make sure there's no ++ * race condition involved! (proper locking/processing) ++ */ ++static UINT32 acx100_process_mgmt_frame(struct rxhostdescriptor *rxdesc, wlandevice_t *priv) ++{ ++ static UINT8 reassoc_b; ++ UINT8 *a; ++ p80211_hdr_t *p80211_hdr; ++ int wep_offset = 0; ++ ++ FN_ENTER; ++ acxlog(L_STATE, "%s: UNVERIFIED.\n", __func__); ++ ++ p80211_hdr = acx_get_p80211_hdr(priv, rxdesc); ++ if (WLAN_GET_FC_ISWEP(p80211_hdr->a3.fc)) { ++ wep_offset = 0x10; ++ } ++ ++ switch (WLAN_GET_FC_FSTYPE(p80211_hdr->a3.fc)) { ++ case WLAN_FSTYPE_ASSOCREQ /* 0x00 */ : ++ if (ACX_MODE_2_MANAGED_STA != priv->macmode_joined) { ++ memset(&alloc_p80211mgmt_req, 0, 8 * 4); ++ alloc_p80211mgmt_req.a.assocreq.buf = ++ (UINT8 *) p80211_hdr; ++ alloc_p80211mgmt_req.a.assocreq.len = ++ (rxdesc->data->mac_cnt_rcvd & 0xfff) - wep_offset; ++ ++ acx_mgmt_decode_assocreq(&alloc_p80211mgmt_req.a. ++ assocreq); ++ ++ if (!memcmp ++ (alloc_p80211mgmt_req.a.assocreq.hdr->a3.a2, ++ priv->bssid, ETH_ALEN)) { ++ acx100_transmit_assocresp(&alloc_p80211mgmt_req.a. ++ assocreq, priv); ++ } ++ } ++ break; ++ case WLAN_FSTYPE_ASSOCRESP /* 0x01 */ : ++ if (ACX_MODE_3_MANAGED_AP != priv->macmode_joined) { ++ memset(&alloc_p80211mgmt_req, 0, 8 * 4); ++ alloc_p80211mgmt_req.a.assocresp.buf = ++ (UINT8 *) p80211_hdr; ++ alloc_p80211mgmt_req.a.assocresp.len = ++ (rxdesc->data->mac_cnt_rcvd & 0xfff) - wep_offset; ++ acx_mgmt_decode_assocresp(&alloc_p80211mgmt_req.a. ++ assocresp); ++ acx100_process_assocresp(&alloc_p80211mgmt_req.a. ++ assocresp, priv); ++ } ++ break; ++ case WLAN_FSTYPE_REASSOCREQ /* 0x02 */ : ++ if (ACX_MODE_2_MANAGED_STA != priv->macmode_joined) { ++ reassoc_b = 0; ++ ++ memset(&alloc_p80211mgmt_req.a.assocreq, 0, 9 * 4); ++ alloc_p80211mgmt_req.a.assocreq.buf = ++ (UINT8 *) p80211_hdr; ++ alloc_p80211mgmt_req.a.assocreq.len = ++ (rxdesc->data->mac_cnt_rcvd & 0xfff) - wep_offset; ++ ++ acx_mgmt_decode_assocreq(&alloc_p80211mgmt_req.a. ++ assocreq); ++ ++ //reassocreq and assocreq are equivalent ++ acx100_transmit_reassocresp(&alloc_p80211mgmt_req.a. ++ reassocreq, priv); ++ } ++ break; ++ case WLAN_FSTYPE_REASSOCRESP /* 0x03 */ : ++ if (ACX_MODE_3_MANAGED_AP != priv->macmode_joined) { ++ memset(&alloc_p80211mgmt_req.a.assocresp, 0, ++ 8 * 4); ++ alloc_p80211mgmt_req.a.assocresp.buf = ++ (UINT8 *) p80211_hdr; ++ alloc_p80211mgmt_req.a.assocresp.len = ++ (rxdesc->data->mac_cnt_rcvd & 0xfff) - wep_offset; ++ ++ acx_mgmt_decode_assocresp(&alloc_p80211mgmt_req.a. ++ assocresp); ++ acx100_process_reassocresp(&alloc_p80211mgmt_req.a. ++ reassocresp, priv); ++ } ++ break; ++ case WLAN_FSTYPE_PROBEREQ /* 0x04 */ : ++ if (ACX_MODE_3_MANAGED_AP == priv->macmode_joined) { ++ acxlog(L_ASSOC, "FIXME: since we're supposed to be an AP, we need to return a Probe Response packet!\n"); ++ } ++ break; ++ case WLAN_FSTYPE_PROBERESP /* 0x05 */ : ++ if (ACX_MODE_3_MANAGED_AP != priv->macmode_joined) { ++ ++ memset(&alloc_p80211mgmt_req, 0, 0xd * 4); ++ alloc_p80211mgmt_req.a.proberesp.buf = ++ (UINT8 *) p80211_hdr; ++ alloc_p80211mgmt_req.a.proberesp.len = ++ (rxdesc->data->mac_cnt_rcvd & 0xfff) - wep_offset; ++ acx_mgmt_decode_proberesp(&alloc_p80211mgmt_req.a. ++ proberesp); ++ if (priv->status == ISTATUS_1_SCANNING) ++ acx100_process_probe_response(rxdesc->data, ++ priv, ++ (acxp80211_hdr_t *) ++ alloc_p80211mgmt_req. ++ a.proberesp.hdr); ++ } ++ break; ++ case 6: ++ case 7: ++ // exit ++ break; ++ case WLAN_FSTYPE_BEACON /* 0x08 */ : ++ if (ACX_MODE_3_MANAGED_AP != priv->macmode_joined) { ++ switch (priv->status) { ++ case ISTATUS_1_SCANNING: ++ case ISTATUS_5_UNKNOWN: ++ memset(&alloc_p80211mgmt_req.a.beacon, 0, ++ 0xe * 4); ++ alloc_p80211mgmt_req.a.beacon.buf = ++ (char *) p80211_hdr; ++ alloc_p80211mgmt_req.a.beacon.len = ++ (rxdesc->data->mac_cnt_rcvd & 0xfff) - wep_offset; ++ acxlog(L_DATA, "BCN fc: %X, dur: %X, seq: %X\n", ++ p80211_hdr->a3.fc, p80211_hdr->a3.dur, p80211_hdr->a3.seq); ++ a = p80211_hdr->a3.a1; ++ acxlog(L_DATA, ++ "BCN a1: %02X:%02X:%02X:%02X:%02X:%02X\n", ++ a[0], a[1], a[2], a[3], a[4], a[5]); ++ a = p80211_hdr->a3.a2; ++ acxlog(L_DATA, ++ "BCN a2: %02X:%02X:%02X:%02X:%02X:%02X\n", ++ a[0], a[1], a[2], a[3], a[4], a[5]); ++ a = p80211_hdr->a3.a3; ++ acxlog(L_DATA, ++ "BCN a3: %02X:%02X:%02X:%02X:%02X:%02X\n", ++ a[0], a[1], a[2], a[3], a[4], a[5]); ++ acx_mgmt_decode_beacon ++ (&alloc_p80211mgmt_req.a.beacon); ++ acx100_process_probe_response(rxdesc->data, ++ priv, ++ (acxp80211_hdr_t *) ++ alloc_p80211mgmt_req. ++ a.beacon.hdr); ++ break; ++ default: ++ /* acxlog(L_ASSOC | L_DEBUG, ++ "Incoming beacon message not handled during status %i.\n", ++ priv->status); */ ++ break; ++ } ++ } else { ++ acxlog(L_DEBUG, ++ "Incoming beacon message not handled in mode %d.\n", ++ priv->macmode_joined); ++ } ++ break; ++ case WLAN_FSTYPE_ATIM /* 0x09 */ : ++ // exit ++ break; ++ case WLAN_FSTYPE_DISASSOC /* 0x0a */ : ++ memset(&alloc_p80211mgmt_req.a.disassoc, 0, 5 * 4); ++ alloc_p80211mgmt_req.a.disassoc.buf = ++ (UINT8 *) p80211_hdr; ++ alloc_p80211mgmt_req.a.disassoc.len = //rxdesc->p80211frmlen; ++ (rxdesc->data->mac_cnt_rcvd & 0xfff) - wep_offset; ++ acx_mgmt_decode_disassoc(&alloc_p80211mgmt_req.a.disassoc); ++ if (ACX_MODE_3_MANAGED_AP != priv->macmode_joined) { ++ acx100_process_disassoc(&alloc_p80211mgmt_req.a.disassoc, ++ priv); ++ } ++ else ++ if ((ACX_MODE_0_IBSS_ADHOC == priv->macmode_joined) ++ || (ACX_MODE_2_MANAGED_STA == priv->macmode_joined)) { ++ acx100_process_disassociate(&alloc_p80211mgmt_req.a. ++ disassoc, priv); ++ } ++ break; ++ case WLAN_FSTYPE_AUTHEN /* 0x0b */ : ++ memset(&alloc_p80211mgmt_req.a.authen, 0, 8 * 4); ++ alloc_p80211mgmt_req.a.authen.buf = ++ (UINT8 *) p80211_hdr; ++ alloc_p80211mgmt_req.a.authen.len = //rxdesc->p80211frmlen; ++ (rxdesc->data->mac_cnt_rcvd & 0xfff) - wep_offset; ++ acx_mgmt_decode_authen(&alloc_p80211mgmt_req.a.authen); ++ if (!memcmp(priv->bssid, ++ alloc_p80211mgmt_req.a.authen.hdr->a3.a2, ++ ETH_ALEN)) { ++ acx100_process_authen(&alloc_p80211mgmt_req.a.authen, ++ priv); ++ } ++ break; ++ case WLAN_FSTYPE_DEAUTHEN /* 0x0c */ : ++ memset(&alloc_p80211mgmt_req.a.deauthen, 0, 5 * 4); ++ alloc_p80211mgmt_req.a.deauthen.buf = ++ (UINT8 *) p80211_hdr; ++ alloc_p80211mgmt_req.a.deauthen.len = ++ (rxdesc->data->mac_cnt_rcvd & 0xfff) - wep_offset; ++ acx_mgmt_decode_deauthen(&alloc_p80211mgmt_req.a.deauthen); ++ if (ACX_MODE_3_MANAGED_AP != priv->macmode_joined) { ++ acx100_process_deauthen(&alloc_p80211mgmt_req.a.deauthen, ++ priv); ++ } ++ else ++ if ((ACX_MODE_0_IBSS_ADHOC == priv->macmode_joined) ++ || (ACX_MODE_2_MANAGED_STA == priv->macmode_joined)) { ++ acx100_process_deauthenticate(&alloc_p80211mgmt_req.a. ++ deauthen, priv); ++ } ++ break; ++ } ++ ++ FN_EXIT(1, 0); ++ return 0; ++} ++ ++#if UNUSED ++/*---------------------------------------------------------------- ++* acx100_process_class_frame ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++ ++/* acx100_process_class_frame() ++ * STATUS: FINISHED. ++ */ ++static int acx100_process_class_frame(struct rxhostdescriptor *skb, wlandevice_t *priv, int vala) ++{ ++ return 1; ++} ++#endif ++ ++/*---------------------------------------------------------------- ++* acx100_process_NULL_frame ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* Processing of Null Function ("nullfunc") frames. ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_process_NULL_frame() ++ * STATUS: FINISHED, UNVERIFIED. ++ */ ++static int acx100_process_NULL_frame(struct rxhostdescriptor *rxdesc, wlandevice_t *priv, int vala) ++{ ++ UINT16 fc; ++ signed char *esi = NULL; ++ UINT8 *ebx = NULL; ++ p80211_hdr_t *p80211_hdr; ++ client_t *client; ++ client_t *resclt = NULL; ++ int result = 0; ++ ++ acxlog(L_STATE, "%s: UNVERIFIED.\n", __func__); ++ ++ p80211_hdr = acx_get_p80211_hdr(priv, rxdesc); ++ ++ fc = p80211_hdr->a3.fc; ++ ++ if ((!WLAN_GET_FC_TODS(fc)) && (!WLAN_GET_FC_FROMDS(fc))) { ++ esi = p80211_hdr->a3.a1; ++ ebx = p80211_hdr->a3.a2; ++ } else if ((!WLAN_GET_FC_TODS(fc)) && (WLAN_GET_FC_FROMDS(fc))) { ++ esi = p80211_hdr->a3.a1; ++ ebx = p80211_hdr->a3.a3; ++ } else if ((WLAN_GET_FC_TODS(fc)) && (!WLAN_GET_FC_FROMDS(fc))) { ++ ebx = p80211_hdr->a3.a2; ++ esi = p80211_hdr->a3.a1; ++ } else ++ ebx = p80211_hdr->a3.a2; ++ ++ if (esi[0x0] < 0) { ++ result = 1; ++ goto done; ++ } ++ for (client = acx100_sta_list_get_from_hash(priv, ebx); client; ++ client = client->next) { ++ if (!memcmp(ebx, client->address, ETH_ALEN)) { ++ resclt = client; ++ break; ++ } ++ } ++ ++ if (resclt) ++ result = 0; ++ else { ++#if IS_IT_BROKEN ++ acxlog(L_BINDEBUG | L_XFER, "\n"); ++ acx100_transmit_deauthen(ebx, 0x0, priv, WLAN_MGMT_REASON_CLASS2_NONAUTH /* 6 */); ++#else ++ acxlog(L_STD, "received NULL frame from unknown client! We really shouldn't send deauthen here, right?\n"); ++#endif ++ result = 1; ++ } ++done: ++ return result; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_process_probe_response ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: working on it. UNVERIFIED. ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++void acx100_process_probe_response(struct rxbuffer *mmt, wlandevice_t *priv, ++ acxp80211_hdr_t *hdr) ++{ ++ UINT8 *pSuppRates; ++ UINT8 *pDSparms; ++ UINT32 station; ++ UINT8 *a; ++ struct bss_info *ss; ++ UINT8 rate_count; ++ int i, max_rate = 0; ++ ++ acxlog(L_STATE, "%s: UNVERIFIED, previous bss_table_count: %d.\n", ++ __func__, priv->bss_table_count); ++ ++ FN_ENTER; ++ ++ /* uh oh, we found more sites/stations than we can handle with ++ * our current setup: pull the emergency brake and stop scanning! */ ++ if ((UINT) priv->bss_table_count > MAX_NUMBER_OF_SITE) { ++ acx100_issue_cmd(priv, ACX100_CMD_STOP_SCAN, NULL, 0, 5000); ++ acx100_set_status(priv, ISTATUS_2_WAIT_AUTH); ++ ++ acxlog(L_BINDEBUG | L_ASSOC, ++ " bss_table_count > MAX_NUMBER_OF_SITE\n"); ++ FN_EXIT(0, 0); ++ return; ++ } ++ ++ /* pSuppRates points to the Supported Rates element: info[1] is essid_len */ ++ pSuppRates = &hdr->info[hdr->info[0x1] + 0x2]; ++ /* pDSparms points to the DS Parameter Set */ ++ pDSparms = &pSuppRates[pSuppRates[0x1] + 0x2]; ++ ++ /* filter out duplicate stations we already registered in our list */ ++ for (station = 0; station < priv->bss_table_count; station++) { ++ UINT8 *a = priv->bss_table[station].bssid; ++ acxlog(L_DEBUG, ++ "checking station %ld [%02X %02X %02X %02X %02X %02X]\n", ++ station, a[0], a[1], a[2], a[3], a[4], a[5]); ++ if (acx100_is_mac_address_equal ++ (hdr->a4.a3, ++ priv->bss_table[station].bssid)) { ++ acxlog(L_DEBUG, ++ "station already in our list, no need to add.\n"); ++ FN_EXIT(0, 0); ++ return; ++ } ++ } ++ ++ for (station = 0; ++ station < hdr->info[0x1] && (hdr->info[0x2 + station] == 0); ++ station++) { ++ }; ++ /* FIXME: this line does nothing ^^^^ */ ++ ++ /* NONBIN_DONE: bug in V3: doesn't reset scan structs when ++ * starting next site survey scan (leading to garbled ESSID strings with ++ * old garbage). Thus let's completely zero out the entry that we're ++ * going to fill next in order to not risk any corruption. */ ++ memset(&priv->bss_table[priv->bss_table_count], 0, sizeof(struct bss_info)); ++ ++ /* copy the BSSID element */ ++ MAC_COPY(priv->bss_table[priv->bss_table_count].bssid, hdr->a4.a3); ++ /* copy the MAC address element (source address) */ ++ MAC_COPY(priv->bss_table[priv->bss_table_count].mac_addr, hdr->a4.a2); ++ ++ /* copy the ESSID element */ ++ if (hdr->info[0x1] <= IW_ESSID_MAX_SIZE) { ++ priv->bss_table[priv->bss_table_count].essid_len = hdr->info[0x1]; ++ memcpy(priv->bss_table[priv->bss_table_count].essid, ++ &hdr->info[0x2], hdr->info[0x1]); ++ priv->bss_table[priv->bss_table_count].essid[hdr->info[0x1]] = '\0'; ++ } ++ else { ++ acxlog(L_STD, "huh, ESSID overflow in scanned station data?\n"); ++ } ++ ++ priv->bss_table[priv->bss_table_count].channel = pDSparms[2]; ++ priv->bss_table[priv->bss_table_count].wep = (hdr->caps & IEEE802_11_MGMT_CAP_WEP); ++ priv->bss_table[priv->bss_table_count].caps = hdr->caps; ++ rate_count = pSuppRates[1]; ++ if (rate_count > 64) ++ rate_count = 64; ++ memcpy(priv->bss_table[priv->bss_table_count].supp_rates, ++ &pSuppRates[2], rate_count); ++ priv->bss_table[priv->bss_table_count].sir = acx_signal_to_winlevel(mmt->phy_level); ++ priv->bss_table[priv->bss_table_count].snr = acx_signal_to_winlevel(mmt->phy_snr); ++ ++ a = priv->bss_table[priv->bss_table_count].bssid; ++ ss = &priv->bss_table[priv->bss_table_count]; ++ ++ acxlog(L_DEBUG, "Supported Rates:\n"); ++ /* find max. transfer rate */ ++ for (i=0; i < rate_count; i++) ++ { ++ acxlog(L_DEBUG, "%s Rate: %d%sMbps (0x%02X)\n", ++ (pSuppRates[2+i] & 0x80) ? "Basic" : "Operational", ++ (int)((pSuppRates[2+i] & ~0x80) / 2), ++ (pSuppRates[2+i] & 1) ? ".5" : "", pSuppRates[2+i]); ++ if ((pSuppRates[2+i] & ~0x80) > max_rate) ++ max_rate = pSuppRates[2+i] & ~0x80; ++ } ++ acxlog(L_DEBUG, ".\n"); ++ ++ acxlog(L_STD | L_ASSOC, ++ "%s: found and registered station %d: ESSID \"%s\" on channel %d, BSSID %02X %02X %02X %02X %02X %02X, %s/%d%sMbps, Caps 0x%04x, SIR %ld, SNR %ld.\n", ++ __func__, ++ priv->bss_table_count, ++ ss->essid, ss->channel, ++ a[0], a[1], a[2], a[3], a[4], a[5], ++ (ss->caps & IEEE802_11_MGMT_CAP_IBSS) ? "Ad-Hoc peer" : "Access Point", ++ (int)(max_rate / 2), (max_rate & 1) ? ".5" : "", ++ ss->caps, ss->sir, ss->snr); ++ ++ /* found one station --> increment counter */ ++ priv->bss_table_count++; ++ FN_EXIT(0, 0); ++} ++ ++const char * const status_str[22] = ++{ "Successful", "Unspecified failure", ++ "Reserved error code", "Reserved error code", "Reserved error code", ++ "Reserved error code", "Reserved error code", "Reserved error code", ++ "Reserved error code", "Reserved error code", ++ "Cannot support all requested capabilities in the Capability Information field. TRANSLATION: Bug in ACX100 driver?", ++ "Reassociation denied due to reason outside the scope of 802.11b standard. TRANSLATION: Bug in ACX100 driver?", ++ "Association denied due to reason outside the scope of 802.11b standard. TRANSLATION: peer station probably has MAC filtering enabled, FIX IT!", ++ "Responding station does not support the specified authentication algorithm. TRANSLATION: invalid network data or bug in ACX100 driver?", ++ "Received an Authentication frame with transaction sequence number out of expected sequence. TRANSLATION: Bug in ACX100 driver?", ++ "Authentication rejected because of challenge failure. TRANSLATION: Bug in ACX100 driver?", ++ "Authentication rejected due to timeout waiting for next frame in sequence. TRANSLATION: Bug in ACX100 driver?", ++ "Association denied because AP is unable to handle additional associated stations", ++ "Association denied due to requesting station not supporting all of the data rates in the BSSBasicRateSet parameter. TRANSLATION: peer station has an incompatible set of data rates configured, FIX IT!", ++ "Association denied due to requesting station not supporting the Short Preamble option. TRANSLATION: Bug in ACX100 driver?", ++ "Association denied due to requesting station not supporting the PBCC Modulation option. TRANSLATION: Bug in ACX100 driver?", ++ "Association denied due to requesting station not supporting the Channel Agility option. TRANSLATION: Bug in ACX100 driver?"}; ++inline const char * const get_status_string(int status) ++{ ++ return status <= 21 ? status_str[status] : "Reserved"; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_process_assocresp ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_process_assocresp() ++ * STATUS: should be ok, UNVERIFIED. ++ */ ++int acx100_process_assocresp(wlan_fr_assocresp_t *req, wlandevice_t *priv) ++{ ++ p80211_hdr_t *hdr; ++ int res = 0; ++ memmap_t pdr; ++ ++ FN_ENTER; ++ acxlog(L_STATE, "%s: UNVERIFIED.\n", __func__); ++ hdr = req->hdr; ++ ++ if (WLAN_GET_FC_TODS(hdr->a4.fc) || WLAN_GET_FC_FROMDS(hdr->a4.fc)) ++ res = 1; ++ else { ++ if (0 != acx100_is_mac_address_equal(priv->dev_addr, hdr->a4.a1 /* RA */)) { ++ if (WLAN_MGMT_STATUS_SUCCESS == req->status[0]) { ++ pdr.m.asid.vala = req->aid[0]; ++ acx100_configure(priv, &pdr, ACX100_RID_ASSOC_ID); ++ acx100_set_status(priv, ISTATUS_4_ASSOCIATED); ++ acxlog(L_BINSTD | L_ASSOC, "ASSOCIATED!\n"); ++ } ++ else { ++ acxlog(L_STD | L_ASSOC, "Association FAILED: peer station sent response status code %d: \"%s\"!\n", req->status[0], get_status_string(req->status[0])); ++ } ++ res = 0; ++ } else ++ res = 1; ++ } ++ FN_EXIT(1, res); ++ return res; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_process_reassocresp ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_process_reassocresp() ++ * STATUS: should be ok, UNVERIFIED. ++ */ ++int acx100_process_reassocresp(wlan_fr_reassocresp_t *req, wlandevice_t *priv) ++{ ++ p80211_hdr_t *hdr = req->hdr; ++ int result = 4; ++ ++ FN_ENTER; ++ acxlog(L_STATE, "%s: UNVERIFIED.\n", __func__); ++ ++ if (WLAN_GET_FC_TODS(hdr->a3.fc) || WLAN_GET_FC_FROMDS(hdr->a3.fc)) { ++ result = 1; ++ } else { ++ if (ACX_MODE_0_IBSS_ADHOC == priv->macmode_joined) { ++ result = 2; ++ } else if (acx100_is_mac_address_equal(priv->dev_addr, hdr->a3.a1 /* RA */)) { ++ if (req->status[0] == WLAN_MGMT_STATUS_SUCCESS) { ++ acx100_set_status(priv, ISTATUS_4_ASSOCIATED); ++ } else { ++ acxlog(L_STD | L_ASSOC, "Reassociation FAILED: response status code %d: \"%s\"!\n", req->status[0], get_status_string(req->status[0])); ++ } ++ result = 0; ++ } else { ++ result = 3; ++ } ++ } ++ FN_EXIT(1, result); ++ return result; ++} ++ ++/* acx100_process_authen() ++ * STATUS: FINISHED, UNVERIFIED. ++ */ ++int acx100_process_authen(wlan_fr_authen_t *req, wlandevice_t *priv) ++{ ++ p80211_hdr_t *hdr; ++ client_t *clt; ++ client_t *currclt; ++ int result = -1; ++ ++ FN_ENTER; ++ acxlog(L_STATE|L_ASSOC, "%s: UNVERIFIED.\n", __func__); ++ hdr = req->hdr; ++ if (WLAN_GET_FC_TODS(hdr->a3.fc) || WLAN_GET_FC_FROMDS(hdr->a3.fc)) { ++ result = 0; ++ goto end; ++ } ++ ++ if (!priv) { ++ result = 0; ++ goto end; ++ } ++ ++ acx100_log_mac_address(L_ASSOC, priv->dev_addr); ++ acx100_log_mac_address(L_ASSOC, hdr->a3.a1); ++ acx100_log_mac_address(L_ASSOC, hdr->a3.a2); ++ acx100_log_mac_address(L_ASSOC, hdr->a3.a3); ++ acx100_log_mac_address(L_ASSOC, priv->bssid); ++ acxlog(L_ASSOC, "\n"); ++ ++ if (!acx100_is_mac_address_equal(priv->dev_addr, hdr->a3.a1) && ++ !acx100_is_mac_address_equal(priv->bssid, hdr->a3.a1)) { ++ result = 1; ++ goto end; ++ } ++ if (ACX_MODE_0_IBSS_ADHOC == priv->macmode_joined) { ++ result = 0; ++ goto end; ++ } ++ ++ if (priv->auth_alg <= 1) { ++ if (priv->auth_alg != *(req->auth_alg)) ++ { ++ acxlog(L_ASSOC, "authentication algorithm mismatch: want: %ld, req: %d\n", priv->auth_alg, *(req->auth_alg)); ++ result = 0; ++ goto end; ++ } ++ } ++ acxlog(L_ASSOC,"Algorithm is ok\n"); ++ currclt = acx100_sta_list_get_from_hash(priv, hdr->a3.a2); ++ acxlog(L_ASSOC,"Got current client for sta hash tab\n"); ++ clt = NULL; ++ while (currclt) { ++ if (0 == memcmp(hdr->a3.a2, currclt->address, ETH_ALEN)) { ++ clt = currclt; ++ break; ++ } ++ currclt = currclt->next; ++ } ++ acxlog(L_ASSOC,"Found acceptable client\n"); ++ /* create a new entry if station isn't registered yet */ ++ if (!clt) { ++ if (!(clt = acx100_sta_list_add(priv, hdr->a3.a2))) ++ { ++ acxlog(L_ASSOC,"Could not allocate room for this client\n"); ++ result = 0; ++ goto end; ++ } ++ ++ MAC_COPY(clt->address, hdr->a3.a2); ++ clt->used = 1; ++ } ++ /* now check which step in the authentication sequence we are ++ * currently in, and act accordingly */ ++ acxlog(L_ASSOC, "acx100_process_authen auth seq step %d.\n", req->auth_seq[0]); ++ switch (req->auth_seq[0]) { ++ case 1: ++ if (ACX_MODE_2_MANAGED_STA == priv->macmode_joined) ++ break; ++ acx100_transmit_authen2(req, clt, priv); ++ break; ++ case 2: ++ if (ACX_MODE_3_MANAGED_AP == priv->macmode_joined) ++ break; ++ if (req->status[0] == WLAN_MGMT_STATUS_SUCCESS) { ++ if (req->auth_alg[0] == WLAN_AUTH_ALG_OPENSYSTEM) { ++ acx100_set_status(priv, ISTATUS_3_AUTHENTICATED); ++ acx100_transmit_assoc_req(priv); ++ } else ++ if (req->auth_alg[0] == WLAN_AUTH_ALG_SHAREDKEY) { ++ acx100_transmit_authen3(req, priv); ++ } ++ } else { ++ acxlog(L_ASSOC, "Authentication FAILED (status code %d: \"%s\"), still waiting for authentication.\n", req->status[0], get_status_string(req->status[0])); ++ acx100_set_status(priv, ISTATUS_2_WAIT_AUTH); ++ } ++ break; ++ case 3: ++ if ((ACX_MODE_2_MANAGED_STA == priv->macmode_joined) ++ || (clt->auth_alg != WLAN_AUTH_ALG_SHAREDKEY) ++ || (req->auth_alg[0] != WLAN_AUTH_ALG_SHAREDKEY) ++ || (clt->val0xe != 2)) ++ break; ++ acxlog(L_STD, ++ "FIXME: TODO: huh??? incompatible data type!\n"); ++ currclt = (client_t *)req->challenge; ++ if (0 == memcmp(currclt->address, clt->val0x18, 0x80) ++ && (((UINT8) currclt->aid) != 0x10)) ++ if ((currclt->aid >> 8) != 0x80) ++ break; ++ acx100_transmit_authen4(req, priv); ++ MAC_COPY(clt->address, hdr->a3.a2); ++ clt->used = 2; ++ clt->val0xe = 4; ++ clt->val0x98 = hdr->a3.seq; ++ break; ++ case 4: ++ if (ACX_MODE_3_MANAGED_AP == priv->macmode_joined) ++ break; ++ ++ /* ok, we're through: we're authenticated. Woohoo!! */ ++ acx100_set_status(priv, ISTATUS_3_AUTHENTICATED); ++ acxlog(L_BINSTD | L_ASSOC, "Authenticated!\n"); ++ acx100_transmit_assoc_req(priv); ++ break; ++ } ++ result = 0; ++end: ++ FN_EXIT(1, result); ++ return result; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_process_deauthen ++* ++* Arguments: ++* ++* Returns: ++* 0 on all is good ++* 1 on any error ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_process_deauthen() ++ * STATUS: FINISHED, UNVERIFIED. ++ */ ++int acx100_process_deauthen(wlan_fr_deauthen_t *arg_0, wlandevice_t *priv) ++{ ++ p80211_hdr_t *hdr; ++ int result; ++ UINT8 *addr; ++ client_t *client; ++ client_t *resclt = NULL; ++ ++ FN_ENTER; ++ acxlog(L_STATE, "%s: UNVERIFIED.\n", __func__); ++ ++ hdr = arg_0->hdr; ++ ++ if ((0 != WLAN_GET_FC_TODS(hdr->a3.fc)) || (0 != WLAN_GET_FC_FROMDS(hdr->a3.fc))) ++ { ++ result = 1; ++ goto end; ++ } ++ ++ acxlog(L_ASSOC, "DEAUTHEN "); ++ acx100_log_mac_address(L_ASSOC, priv->dev_addr); ++ acx100_log_mac_address(L_ASSOC, hdr->a3.a1); ++ acx100_log_mac_address(L_ASSOC, hdr->a3.a2); ++ acx100_log_mac_address(L_ASSOC, hdr->a3.a3); ++ acx100_log_mac_address(L_ASSOC, priv->bssid); ++ acxlog(L_ASSOC, "\n"); ++ ++ if (!acx100_is_mac_address_equal(priv->dev_addr, hdr->a3.a1) && ++ !acx100_is_mac_address_equal(priv->bssid, hdr->a3.a1)) { ++ result = 1; ++ goto end; ++ } ++ if (ACX_MODE_0_IBSS_ADHOC == priv->macmode_joined) { ++ result = 0; ++ goto end; ++ } ++ ++ acxlog(L_STD, "Processing deauthen packet. Hmm, should this have happened?\n"); ++ ++ addr = hdr->a3.a2; ++ if (memcmp(addr, priv->dev_addr, ETH_ALEN)) ++ { ++ /* OK, we've been asked to leave the ESS. Do we ++ * ask to return or do we leave quietly? I'm ++ * guessing that since we are still up and ++ * running we should attempt to rejoin, from the ++ * starting point. So: ++ */ ++ acx100_set_status(priv,ISTATUS_2_WAIT_AUTH); ++ result = 0; ++ goto end; ++ } ++ ++ client = acx100_sta_list_get_from_hash(priv, addr); ++ ++ if (client == NULL) { ++ result = 0; ++ goto end; ++ } ++ ++ do { ++ if (0 == memcmp(addr, &client->address, ETH_ALEN)) { ++ resclt = client; ++ goto end; ++ } ++ } while ((client = client->next)); ++ resclt = NULL; ++ ++end: ++ if (resclt) { ++ resclt->used = (UINT8)1; ++ result = 0; ++ } else ++ result = 1; ++ ++ FN_EXIT(1, result); ++ return result; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_process_deauthenticate ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_process_deauthenticate() ++ * STATUS: FINISHED, UNVERIFIED. ++ */ ++int acx100_process_deauthenticate(wlan_fr_deauthen_t *req, wlandevice_t *priv) ++{ ++ p80211_hdr_t *hdr; ++ ++ FN_ENTER; ++ acxlog(L_STATE, "%s: UNVERIFIED.\n", __func__); ++ acxlog(L_STD, "processing deauthenticate packet. Hmm, should this have happened?\n"); ++ hdr = req->hdr; ++ if (WLAN_GET_FC_TODS(hdr->a3.fc) || WLAN_GET_FC_FROMDS(hdr->a3.fc)) ++ return 1; ++ else { ++ if (ACX_MODE_0_IBSS_ADHOC == priv->macmode_joined) ++ return 1; ++ if (acx100_is_mac_address_equal(priv->dev_addr, hdr->a3.a1)) { ++ if (priv->status > ISTATUS_2_WAIT_AUTH) { ++ acx100_set_status(priv, ISTATUS_2_WAIT_AUTH); ++ return 0; ++ } ++ } ++ } ++ FN_EXIT(1, 1); ++ return 1; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_transmit_deauthen ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_transmit_deauthen() ++ * STATUS: should be ok, but UNVERIFIED. ++ */ ++int acx100_transmit_deauthen(char *a, client_t *clt, wlandevice_t *priv, UINT16 reason) ++{ ++ TxData *hd; ++ struct deauthen_frame_body *payload; ++ struct txdescriptor *tx_desc; ++ struct txhostdescriptor *hdesc_header; ++ struct txhostdescriptor *hdesc_payload; ++ ++ FN_ENTER; ++ acxlog(L_STATE, "%s: UNVERIFIED.\n", __func__); ++ ++ if ((tx_desc = acx100_get_tx_desc(priv)) == NULL) { ++ return 0; ++ } ++ ++ hdesc_header = tx_desc->host_desc; ++ hdesc_payload = tx_desc->host_desc + 1; ++ ++ hd = (TxData *)hdesc_header->data; ++ payload = (struct deauthen_frame_body *)hdesc_payload->data; ++ ++ hd->frame_control = WLAN_SET_FC_FTYPE(WLAN_FTYPE_MGMT) | WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_DEAUTHEN); /* 0xc0 */ ++ hd->duration_id = 0; ++ ++ if (clt) { ++ clt->used = (UINT8)1; ++ MAC_COPY(hd->da, clt->address); ++ } else { ++ MAC_COPY(hd->da, a); ++ } ++ MAC_COPY(hd->sa, priv->dev_addr); ++ /* FIXME: this used to use dev_addr, but I think it should use ++ * the BSSID of the network we're associated to: priv->bssid */ ++ MAC_COPY(hd->bssid, priv->bssid); ++ ++ hd->sequence_control = 0; ++ ++ acxlog(L_BINDEBUG | L_ASSOC | L_XFER, ++ "sta=%02X:%02X:%02X:%02X:%02X:%02X for %d\n", ++ hd->da[0x0], hd->da[0x1], hd->da[0x2], ++ hd->da[0x3], hd->da[0x4], hd->da[0x5], reason); ++ ++ hdesc_header->length = WLAN_HDR_A3_LEN; ++ hdesc_header->data_offset = 0; ++ ++ payload->reason = reason; ++ ++ hdesc_payload->length = sizeof(deauthen_frame_body_t); ++ hdesc_payload->data_offset = 0; ++ ++ tx_desc->total_length = hdesc_payload->length + hdesc_header->length; ++ ++ acx100_dma_tx_data(priv, tx_desc); ++ ++ FN_EXIT(1, 0); ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_transmit_authen1 ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_transmit_authen1() ++ * STATUS: UNVERIFIED ++ */ ++int acx100_transmit_authen1(wlandevice_t *priv) ++{ ++ struct auth_frame_body *payload; ++ struct txdescriptor *tx_desc; ++ struct txhostdescriptor *hdesc_header; ++ struct txhostdescriptor *hdesc_payload; ++ TxData *hd; ++ ++ acxlog(L_STATE, "%s: UNVERIFIED.\n", __func__); ++ ++ FN_ENTER; ++ ++ acxlog(L_BINSTD | L_ASSOC, "Sending authentication1 request, awaiting response!\n"); ++ ++ if ((tx_desc = acx100_get_tx_desc(priv)) == NULL) { ++ return 1; ++ } ++ ++ hdesc_header = tx_desc->host_desc; ++ hdesc_payload = tx_desc->host_desc + 1; ++ ++ hd = (TxData *)hdesc_header->data; ++ payload = (struct auth_frame_body *)hdesc_payload->data; ++ ++ hd->frame_control = WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_AUTHEN); /* 0xb0 */ ++ hd->duration_id = host2ieee16(0x8000); ++ ++ MAC_COPY(hd->da, priv->bssid); ++ MAC_COPY(hd->sa, priv->dev_addr); ++ MAC_COPY(hd->bssid, priv->bssid); ++ ++ hd->sequence_control = 0; ++ ++ hdesc_header->length = WLAN_HDR_A3_LEN; ++ hdesc_header->data_offset = 0; ++ ++ payload->auth_alg = priv->auth_alg; ++ payload->auth_seq = 1; ++ payload->status = 0; ++ ++ hdesc_payload->length = 2 + 2 + 2; /* 6 */ ++ hdesc_payload->data_offset = 0; ++ ++ tx_desc->total_length = hdesc_payload->length + hdesc_header->length; ++ ++ acx100_dma_tx_data(priv, tx_desc); ++ FN_EXIT(0, 0); ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_transmit_authen2 ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_transmit_authen2() ++ * STATUS: UNVERIFIED. (not binary compatible yet) ++ */ ++int acx100_transmit_authen2(wlan_fr_authen_t *arg_0, client_t *sta_list, ++ wlandevice_t *priv) ++{ ++ UINT32 packet_len; ++ struct auth_frame_body *payload; ++ struct txdescriptor *tx_desc; ++ struct txhostdescriptor *hdesc_header; ++ struct txhostdescriptor *hdesc_payload; ++ TxData *hd; ++ ++ FN_ENTER; ++ acxlog(L_STATE, "%s: UNVERIFIED.\n", __func__); ++ packet_len = WLAN_HDR_A3_LEN; ++ ++ if (sta_list != NULL) { ++ MAC_COPY(sta_list->address, arg_0->hdr->a3.a2); ++ sta_list->val0x8 = WLAN_GET_FC_PWRMGT(arg_0->hdr->a3.fc); ++ sta_list->auth_alg = *(arg_0->auth_alg); ++ sta_list->val0xe = 2; ++ sta_list->val0x98 = arg_0->hdr->a3.seq; ++ ++ if ((tx_desc = acx100_get_tx_desc(priv)) == NULL) { ++ return 1; ++ } ++ ++ hdesc_header = tx_desc->host_desc; ++ hdesc_payload = tx_desc->host_desc + 1; ++ ++ hd = (TxData*)hdesc_header->data; ++ payload = (struct auth_frame_body *)hdesc_payload->data; ++ ++ hd->frame_control = WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_AUTHEN); /* 0xb0 */ ++ hd->duration_id = arg_0->hdr->a3.dur; ++ hd->sequence_control = arg_0->hdr->a3.seq; ++ ++ MAC_COPY(hd->da, arg_0->hdr->a3.a2); ++ MAC_COPY(hd->sa, arg_0->hdr->a3.a1); ++ MAC_COPY(hd->bssid, arg_0->hdr->a3.a3); ++ ++ payload->auth_alg = *(arg_0->auth_alg); ++ ++ payload->auth_seq = 2; ++ ++ payload->status = 0; ++ ++ if (*(arg_0->auth_alg) == WLAN_AUTH_ALG_OPENSYSTEM) { ++ sta_list->used = (UINT8)2; ++ packet_len += 2 + 2 + 2; ++ } else { /* shared key */ ++ acx100_gen_challenge(&payload->challenge); ++ memcpy(&sta_list->val0x18, payload->challenge.text, 0x80); ++ packet_len += 2 + 2 + 2 + 1+1+0x80; ++ } ++ ++ hdesc_header->length = WLAN_HDR_A3_LEN; ++ hdesc_header->data_offset = 0; ++ hdesc_payload->length = packet_len - WLAN_HDR_A3_LEN; ++ hdesc_payload->data_offset = 0; ++ tx_desc->total_length = hdesc_payload->length + hdesc_header->length; ++ ++ acxlog(L_BINDEBUG | L_ASSOC | L_XFER, ++ " BSSID=%02X:%02X:%02X:%02X:%02X:%02X\n", ++ hd->bssid[0], hd->bssid[1], hd->bssid[2], ++ hd->bssid[3], hd->bssid[4], hd->bssid[5]); ++ ++ acx100_dma_tx_data(priv, tx_desc); ++ } ++ FN_EXIT(1, 0); ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_transmit_authen3 ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_transmit_authen3() ++ * STATUS: UNVERIFIED. ++ */ ++int acx100_transmit_authen3(wlan_fr_authen_t *arg_0, wlandevice_t *priv) ++{ ++ UINT32 packet_len; ++ struct txdescriptor *tx_desc; ++ struct txhostdescriptor *hdesc_header; ++ struct txhostdescriptor *hdesc_payload; ++ TxData *hd; ++ struct auth_frame_body *payload; ++ ++ FN_ENTER; ++ acxlog(L_STATE, "%s: UNVERIFIED.\n", __func__); ++ if ((tx_desc = acx100_get_tx_desc(priv)) == NULL) { ++ FN_EXIT(1, 1); ++ return 1; ++ } ++ ++ packet_len = WLAN_HDR_A3_LEN; ++ ++ hdesc_header = tx_desc->host_desc; ++ hdesc_payload = tx_desc->host_desc + 1; ++ ++ hd = (TxData *)hdesc_header->data; ++ payload = (struct auth_frame_body *)hdesc_payload->data; ++ ++ hd->frame_control = WLAN_SET_FC_ISWEP(1) + WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_AUTHEN); /* 0x40b0 */ ++ ++ /* FIXME: is this needed?? authen4 does it... ++ hd->duration_id = arg_0->hdr->a3.dur; ++ hd->sequence_control = arg_0->hdr->a3.seq; ++ */ ++ MAC_COPY(hd->da, priv->bssid); ++ MAC_COPY(hd->sa, priv->dev_addr); ++ MAC_COPY(hd->bssid, priv->bssid); ++ ++ hdesc_header->length = WLAN_HDR_A3_LEN; ++ hdesc_header->data_offset = 0; ++ ++ payload->auth_alg = *(arg_0->auth_alg); ++ ++ payload->auth_seq = 3; ++ ++ payload->status = 0; ++ ++ memcpy(&payload->challenge, arg_0->challenge, arg_0->challenge->len + 2); ++ ++ packet_len += 8 + arg_0->challenge->len; ++ ++ hdesc_payload->length = packet_len - WLAN_HDR_A3_LEN; ++ hdesc_payload->data_offset = 0; ++ ++ tx_desc->total_length = hdesc_payload->length + hdesc_header->length; ++ ++ acxlog(L_BINDEBUG | L_ASSOC | L_XFER, "transmit_auth3!\n"); ++ ++ acx100_dma_tx_data(priv, tx_desc); ++ FN_EXIT(1, 0); ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_transmit_authen4 ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_transmit_authen4() ++ * STATUS: UNVERIFIED. ++ */ ++int acx100_transmit_authen4(wlan_fr_authen_t *arg_0, wlandevice_t *priv) ++{ ++ struct txdescriptor *tx_desc; ++ struct txhostdescriptor *hdesc_header; ++ struct txhostdescriptor *hdesc_payload; ++ TxData *hd; ++ struct auth_frame_body *payload; ++ ++ FN_ENTER; ++ acxlog(L_STATE, "%s: UNVERIFIED.\n", __func__); ++ ++ if ((tx_desc = acx100_get_tx_desc(priv)) == NULL) { ++ FN_EXIT(1, 1); ++ return 1; ++ } ++ ++ hdesc_header = tx_desc->host_desc; ++ hdesc_payload = tx_desc->host_desc + 1; ++ ++ hd = (TxData *)hdesc_header->data; ++ payload = (struct auth_frame_body *)hdesc_payload->data; ++ ++ hd->frame_control = WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_AUTHEN); /* 0xb0 */ ++ hd->duration_id = arg_0->hdr->a3.dur; ++ hd->sequence_control = arg_0->hdr->a3.seq; ++ ++ MAC_COPY(hd->da, arg_0->hdr->a3.a2); ++ /* FIXME: huh? why was there no "sa"? Added, assume should do like authen2 */ ++ MAC_COPY(hd->sa, arg_0->hdr->a3.a1); ++ MAC_COPY(hd->bssid, arg_0->hdr->a3.a3); ++ ++ hdesc_header->length = WLAN_HDR_A3_LEN; ++ hdesc_header->data_offset = 0; ++ ++ payload->auth_alg = *(arg_0->auth_alg); ++ payload->auth_seq = 4; ++ payload->status = 0; ++ ++ hdesc_payload->length = 6; ++ hdesc_payload->data_offset = 0; ++ ++ tx_desc->total_length = hdesc_payload->length + hdesc_header->length; ++ ++ acx100_dma_tx_data(priv, tx_desc); ++ FN_EXIT(1, 0); ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_transmit_assoc_req ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_transmit_assoc_req() ++ * STATUS: almost ok, but UNVERIFIED. ++ */ ++int acx100_transmit_assoc_req(wlandevice_t *priv) ++{ ++ UINT32 packet_len; ++ struct txdescriptor *tx_desc; ++ struct txhostdescriptor *header; ++ struct txhostdescriptor *payload; ++ TxData *hd; ++ UINT8 *pCurrPos; ++ ++ FN_ENTER; ++ acxlog(L_STATE, "%s: UNVERIFIED.\n", __func__); ++ ++ acxlog(L_BINSTD | L_ASSOC, "Sending association request, awaiting response! NOT ASSOCIATED YET.\n"); ++ if ((tx_desc = acx100_get_tx_desc(priv)) == NULL) { ++ FN_EXIT(1, 1); ++ return 1; ++ } ++ ++ packet_len = WLAN_HDR_A3_LEN; ++ ++ header = tx_desc->host_desc; /* hostdescriptor for header */ ++ payload = tx_desc->host_desc + 1; /* hostdescriptor for payload */ ++ ++ hd = (TxData *)header->data; ++ pCurrPos = (UINT8 *)payload->data; ++ ++ hd->frame_control = WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_ASSOCREQ); /* 0x00 */; ++ hd->duration_id = host2ieee16(0x8000); ++ ++ MAC_COPY(hd->da, priv->bssid); ++ MAC_COPY(hd->sa, priv->dev_addr); ++ MAC_COPY(hd->bssid, priv->bssid); ++ ++ hd->sequence_control = 0; ++ ++ header->length = WLAN_HDR_A3_LEN; ++ header->data_offset = 0; ++ ++ /* now start filling the AssocReq frame body */ ++#if BROKEN ++ *(UINT16 *)pCurrPos = host2ieee16(priv->capabilities & ~(WLAN_SET_MGMT_CAP_INFO_IBSS(1))); ++#else ++ /* FIXME: is it correct that we have to manually patc^H^H^H^Hadjust the ++ * Capabilities like that? ++ * I'd venture that priv->capabilities ++ * (acx100_update_capabilities()) should have set that ++ * beforehand maybe... ++ * Anyway, now Managed network association works properly ++ * without failing. ++ */ ++ /* ++ *(UINT16 *)pCurrPos = host2ieee16((priv->capabilities & ~(WLAN_SET_MGMT_CAP_INFO_IBSS(1))) | WLAN_SET_MGMT_CAP_INFO_ESS(1)); ++ */ ++ *(UINT16 *)pCurrPos = host2ieee16(WLAN_SET_MGMT_CAP_INFO_ESS(1)); ++ if ((UINT8)0 != priv->wep_restricted) ++ *(UINT16 *)pCurrPos |= host2ieee16(WLAN_SET_MGMT_CAP_INFO_PRIVACY(1)); ++ /* only ask for short preamble if the peer station supports it */ ++ if (priv->station_assoc.caps & IEEE802_11_MGMT_CAP_SHORT_PRE) ++ *(UINT16 *)pCurrPos |= host2ieee16(WLAN_SET_MGMT_CAP_INFO_SHORT(1)); ++ /* only ask for PBCC support if the peer station supports it */ ++ if (priv->station_assoc.caps & IEEE802_11_MGMT_CAP_PBCC) ++ *(UINT16 *)pCurrPos |= host2ieee16(WLAN_SET_MGMT_CAP_INFO_PBCC(1)); ++#endif ++ acxlog(L_ASSOC, "association: requesting capabilities 0x%04X\n", *(UINT16 *)pCurrPos); ++ pCurrPos += 2; ++ ++ /* add listen interval */ ++ *(UINT16 *)pCurrPos = host2ieee16(priv->listen_interval); ++ pCurrPos += 2; ++ ++ /* add ESSID */ ++ *(UINT8 *)pCurrPos = (UINT8)0; /* Element ID */ ++ pCurrPos += 1; ++ *(UINT8 *)pCurrPos = (UINT8)strlen(priv->essid_for_assoc); /* Length */ ++ memcpy(&pCurrPos[1], priv->essid_for_assoc, pCurrPos[0]); ++ pCurrPos += 1 + pCurrPos[0]; ++ ++ /* add rates */ ++ *(UINT8 *)pCurrPos = (UINT8)1; /* Element ID */ ++ pCurrPos += 1; ++ *(UINT8 *)pCurrPos = priv->rate_spt_len; /* Length */ ++ pCurrPos += 1; ++ memcpy(pCurrPos, priv->rate_support1, priv->rate_spt_len); ++ pCurrPos += priv->rate_spt_len; ++ ++ /* calculate lengths */ ++ packet_len += (int)pCurrPos - (int)payload->data; ++ ++ payload->length = packet_len - WLAN_HDR_A3_LEN; ++ payload->data_offset = 0; ++ ++ tx_desc->total_length = payload->length + header->length; ++ ++ acx100_dma_tx_data(priv, tx_desc); ++ FN_EXIT(1, 0); ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_transmit_disassoc ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_transmit_disassoc() ++ * STATUS: almost ok, but UNVERIFIED. ++ */ ++// FIXME: type of clt is a guess ++// I'm not sure if clt is needed. ++UINT32 acx100_transmit_disassoc(client_t *clt, wlandevice_t *priv) ++{ ++ struct disassoc_frame_body *payload; ++ struct txdescriptor *tx_desc; ++ struct txhostdescriptor *hdesc_header; ++ struct txhostdescriptor *hdesc_payload; ++ TxData *hd; ++ ++ FN_ENTER; ++ acxlog(L_STATE, "%s: UNVERIFIED.\n", __func__); ++// if (clt != NULL) { ++ if ((tx_desc = acx100_get_tx_desc(priv)) == NULL) { ++ FN_EXIT(1, 1); ++ return 1; ++ } ++ ++ hdesc_header = tx_desc->host_desc; ++ hdesc_payload = tx_desc->host_desc + 1; ++ ++ hd = (TxData *)hdesc_header->data; ++ payload = (struct disassoc_frame_body *)hdesc_payload->data; ++ ++// clt->used = 2; ++ ++ hd->frame_control = WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_DISASSOC); /* 0xa0 */ ++ hd->duration_id = 0; ++ MAC_COPY(hd->da, priv->bssid); ++ MAC_COPY(hd->sa, priv->dev_addr); ++ MAC_COPY(hd->bssid, priv->dev_addr); ++ hd->sequence_control = 0; ++ ++ hdesc_header->length = WLAN_HDR_A3_LEN; ++ hdesc_header->data_offset = 0; ++ ++ payload->reason = 7; /* "Class 3 frame received from nonassociated station." */ ++ ++ hdesc_payload->length = priv->rate_spt_len + 8; ++ hdesc_payload->data_offset = 0; ++ ++ tx_desc->total_length = hdesc_payload->length + hdesc_header->length; ++ ++ /* FIXME: lengths missing! */ ++ acx100_dma_tx_data(priv, tx_desc); ++ FN_EXIT(1, 1); ++ return 1; ++// } ++ FN_EXIT(1, 0); ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_gen_challenge ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_gen_challenge() ++ * STATUS: FINISHED. ++ */ ++void acx100_gen_challenge(challenge_text_t * d) ++{ ++ FN_ENTER; ++ d->element_ID = (UINT8)0x10; ++ d->length = (UINT8)0x80; ++ acx100_get_random(d->text, 0x80); ++ FN_EXIT(0, 0); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_get_random ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_get_random() ++ * STATUS: UNVERIFIED. (not binary compatible yet) ++ */ ++void acx100_get_random(UINT8 *s, UINT16 stack) ++{ ++ UINT8 var_8[4]; ++ UINT8 seed[4]; ++ UINT32 count1; ++ UINT32 count2; ++ ++ UINT16 count, len; ++ UINT32 ran = 0; ++ ++ FN_ENTER; ++ acxlog(L_STATE, "%s: UNVERIFIED.\n", __func__); ++ seed[0] = (UINT8)0; ++ seed[1] = (UINT8)0; ++ seed[2] = (UINT8)0; ++ seed[3] = (UINT8)0; ++ ++ /* FIXME: What is he doing here??? */ ++ ran = 10000; ++ for (count1 = 0; count1 < sizeof(seed); count1++) { ++ var_8[count1] = (UINT8)((0x03ff6010 / ran) & 0xff); ++ ran = (ran * 0xCCCCCCCD) >> 3; ++ } ++ ++ /* FIXME: Mmmm, strange ... is it really meant to just take some random part of the stack ?? */ ++ len = strlen(var_8); ++ ++ /* generate a seed */ ++ if (0 != len) { ++ for (count2 = 0; count2 < len; count2++) { ++ seed[count2 & 3] ^= var_8[count2]; ++ } ++ ++ ran |= (seed[0]); ++ ran |= (seed[1] << 8); ++ ran |= (seed[2] << 16); ++ ran |= (seed[3] << 24); ++ ++ /* generate some random numbers */ ++ for (count = 0; count < stack; count++) { ++ /* this is a standard random number generator ++ using "magic" numbers */ ++ ran = (214013 * ran + 2531011); ++ s[count] = (UINT8)((ran >> 16) & 0xff); ++ } ++ } ++ FN_EXIT(0, 0); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_ibssid_gen ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_ibssid_gen() ++ * This generates a random BSSID to be used for ad-hoc networks ++ * (in infrastructure BSS networks, the BSSID is the MAC of the access ++ * point) ++ * STATUS: should be ok. ++ */ ++void acx100_ibssid_gen(wlandevice_t *priv, unsigned char *p_out) ++{ ++ UINT8 jifmod; ++ int i; ++ UINT8 oct; ++ ++ FN_ENTER; ++ for (i = 0; i < 6; i++) { ++ /* store jiffies modulo 0xff */ ++ jifmod = (UINT8)(jiffies % 0xff); ++ /* now XOR eax with this value */ ++ oct = priv->dev_addr[i] ^ jifmod; ++ /* WLAN_LOG_NOTICE1("temp = %d\n", oct); */ ++ p_out[i] = oct; ++ } ++ ++ p_out[0] = (p_out[0] & ~0x80) | 0x40; ++ FN_EXIT(0, 0); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_complete_dot11_scan ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* acx100_complete_dot11_scan() ++ * STATUS: FINISHED. ++ */ ++void acx100_complete_dot11_scan(wlandevice_t *priv) ++{ ++ UINT32 idx; ++ UINT16 needed_cap; ++ INT32 idx_found = -1; ++ UINT32 found_station = 0; ++ ++ FN_ENTER; ++ ++ switch(priv->macmode_wanted) { ++ case ACX_MODE_0_IBSS_ADHOC: ++ needed_cap = WLAN_SET_MGMT_CAP_INFO_IBSS(1); /* 2, we require Ad-Hoc */ ++ break; ++ case ACX_MODE_2_MANAGED_STA: ++ needed_cap = WLAN_SET_MGMT_CAP_INFO_ESS(1); /* 1, we require Managed */ ++ break; ++ case ACX_MODE_FF_AUTO: ++ needed_cap = 0; /* 3, Ad-Hoc or Managed */ ++ break; ++ default: ++ acxlog(L_STD, "unsupported MAC mode %d!\n", priv->macmode_wanted); ++ needed_cap = WLAN_SET_MGMT_CAP_INFO_IBSS(1); /* resort to Ad-Hoc */ ++ break; ++ } ++ acxlog(L_BINDEBUG | L_ASSOC, "Radio scan found %d stations in this area.\n", priv->bss_table_count); ++ for (idx = 0; idx < priv->bss_table_count; idx++) { ++ struct bss_info *this_bss = &priv->bss_table[idx]; ++ ++ /* V3CHANGE: dbg msg in V1 only */ ++ acxlog(L_BINDEBUG | L_ASSOC, ++ " %d: SSID=\"%s\",CH=%d,SIR=%d,SNR=%d\n", ++ (int) idx, ++ this_bss->essid, ++ (int) this_bss->channel, ++ (int) this_bss->sir, ++ (int) this_bss->snr); ++ ++ if (0 == acx100_is_mac_address_broadcast(priv->ap)) ++ if (0 == acx100_is_mac_address_equal(this_bss->bssid, priv->ap)) ++ continue; ++ if (!(this_bss->caps & (IEEE802_11_MGMT_CAP_ESS | IEEE802_11_MGMT_CAP_IBSS))) ++ { ++ acxlog(L_ASSOC, "STRANGE: peer station has neither ESS (Managed) nor IBSS (Ad-Hoc) capability flag set: patching to assume Ad-Hoc!\n"); ++ this_bss->caps |= IEEE802_11_MGMT_CAP_IBSS; ++ } ++ acxlog(L_ASSOC, "peer_cap 0x%02x, needed_cap 0x%02x\n", ++ this_bss->caps, needed_cap); ++ ++ /* peer station doesn't support what we need? */ ++ if ((0 != needed_cap) && ((this_bss->caps & needed_cap) != needed_cap)) ++ continue; /* keep looking */ ++ ++ if (!(priv->reg_dom_chanmask & (1 << (this_bss->channel - 1) ) )) ++ { ++ acxlog(L_STD|L_ASSOC, "WARNING: peer station %ld is using channel %d, which is outside the channel range of the regulatory domain the driver is currently configured for: couldn't join in case of matching settings, might want to adapt your config!\n", idx, this_bss->channel); ++ continue; /* keep looking */ ++ } ++ ++ if (((UINT8)0 == priv->essid_active) ++ || (0 == memcmp(this_bss->essid, priv->essid, priv->essid_len))) ++ { ++ acxlog(L_ASSOC, ++ "ESSID matches: \"%s\" (station), \"%s\" (config)\n", ++ this_bss->essid, ++ (priv->essid_active) ? priv->essid : "[any]"); ++ idx_found = idx; ++ found_station = 1; ++ acxlog(L_ASSOC, "matching station found!!\n"); ++ ++ /* stop searching if this station is ++ * on the current channel, otherwise ++ * keep looking for an even better match */ ++ if (this_bss->channel == priv->channel) ++ break; ++ } ++ else ++ if (('\0' == this_bss->essid[0]) ++ || ((1 == strlen(this_bss->essid)) && ((UINT8)' ' == this_bss->essid[0]))) { ++ /* hmm, station with empty or single-space SSID: ++ * using hidden SSID broadcast? ++ */ ++ idx_found = idx; ++ found_station = 1; ++ acxlog(L_ASSOC, "found station with empty or single-space (hidden?) SSID, considering for association attempt.\n"); ++ /* ...and keep looking for better matches */ ++ } ++ else { ++ acxlog(L_ASSOC, "ESSID doesn't match: \"%s\" (station), \"%s\" (config)\n", ++ this_bss->essid, (priv->essid_active) ? priv->essid : "[any]"); ++ } ++ } ++ if (0 != found_station) { ++ UINT8 *a; ++ char *essid_src; ++ size_t essid_len; ++ ++ memcpy(&priv->station_assoc, &priv->bss_table[idx_found], sizeof(struct bss_info)); ++ if (priv->station_assoc.essid[0] == (UINT8)'\0') { ++ /* if the ESSID of the station we found is empty ++ * (no broadcast), then use user configured ESSID ++ * instead */ ++ essid_src = priv->essid; ++ essid_len = priv->essid_len; ++ } ++ else { ++ essid_src = priv->bss_table[idx_found].essid; ++ essid_len = strlen(priv->bss_table[idx_found].essid); ++ } ++ ++ acx100_update_capabilities(priv); ++ ++ if (WLAN_GET_MGMT_CAP_INFO_ESS(priv->station_assoc.caps)) ++ priv->macmode_chosen = ACX_MODE_2_MANAGED_STA; ++ else ++ priv->macmode_chosen = ACX_MODE_0_IBSS_ADHOC; ++ memcpy(priv->essid_for_assoc, essid_src, essid_len); ++ priv->essid_for_assoc[essid_len] = '\0'; ++ priv->channel = priv->station_assoc.channel; ++ MAC_COPY(priv->address, priv->station_assoc.bssid); ++ ++ a = priv->address; ++ acxlog(L_STD | L_ASSOC, ++ "%s: matching station FOUND (idx %ld), JOINING (%02X %02X %02X %02X %02X %02X).\n", ++ __func__, idx_found, a[0], a[1], a[2], a[3], a[4], a[5]); ++ acx100_join_bssid(priv); ++ ++ if ((UINT8)2 == priv->preamble_mode) ++ /* if Auto mode, then use Preamble setting which ++ * the station supports */ ++ priv->preamble_flag = (UINT8)((priv->station_assoc.caps & IEEE802_11_MGMT_CAP_SHORT_PRE) == IEEE802_11_MGMT_CAP_SHORT_PRE); ++ ++ if (ACX_MODE_0_IBSS_ADHOC != priv->macmode_chosen) { ++ acx100_transmit_authen1(priv); ++ acx100_set_status(priv, ISTATUS_2_WAIT_AUTH); ++ } else { ++ acx100_set_status(priv, ISTATUS_4_ASSOCIATED); ++ } ++ } else { /* uh oh, no station found in range */ ++ if ((ACX_MODE_0_IBSS_ADHOC == priv->macmode_wanted) ++ || (ACX_MODE_FF_AUTO == priv->macmode_wanted)) { /* phew, we're safe: we intended to use Ad-Hoc mode */ ++ acxlog(L_STD | L_ASSOC, ++ "%s: no matching station found in range, CANNOT JOIN: generating our own IBSSID instead.\n", ++ __func__); ++ acx100_ibssid_gen(priv, priv->address); ++ acx100_update_capabilities(priv); ++ priv->macmode_chosen = ACX_MODE_0_IBSS_ADHOC; ++ acx100_join_bssid(priv); ++ acx100_set_status(priv, ISTATUS_4_ASSOCIATED); ++ } else { ++ acxlog(L_STD | L_ASSOC, ++ "%s: no matching station found in range and not in Ad-Hoc or Auto mode --> giving up scanning.\n", ++ __func__); ++ acx100_set_status(priv, ISTATUS_0_STARTED); ++ } ++ } ++ FN_EXIT(0, 0); ++} ++ ++#if (POWER_SAVE_80211 == 0) ++/*---------------------------------------------------------------- ++* ActivatePowerSaveMode ++* FIXME: rename to acx100_activate_power_save_mode ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++/* ActivatePowerSaveMode() ++ * STATUS: FINISHED, UNVERIFIED. ++ */ ++void ActivatePowerSaveMode(wlandevice_t *priv, /*@unused@*/ int vala) ++{ ++ acx100_powermgmt_t pm; ++ ++ FN_ENTER; ++ acxlog(L_STATE, "%s: UNVERIFIED.\n", __func__); ++ ++ acx100_interrogate(priv, &pm, ACX100_RID_POWER_MGMT); ++ if (pm.wakeup_cfg != (UINT8)0x81) { ++ FN_EXIT(0, 0); ++ return; ++ } ++ pm.wakeup_cfg = (UINT8)0; ++ pm.options = (UINT8)0; ++ pm.hangover_period = (UINT8)0; ++ acx100_configure(priv, &pm, ACX100_RID_POWER_MGMT); ++ FN_EXIT(0, 0); ++} ++#endif ++ ++/*------------------------------------------------------------------------------ ++ * acx100_timer ++ * ++ * ++ * Arguments: ++ * @address: a pointer to the private acx100 per-device struct ++ * ++ * Returns: ++ * ++ * Side effects: ++ * ++ * Call context: ++ * ++ * STATUS: should be ok, but UNVERIFIED. ++ * ++ * Comment: ++ * ++ *----------------------------------------------------------------------------*/ ++void acx100_timer(unsigned long address) ++{ ++ wlandevice_t *priv = (wlandevice_t *)address; ++ unsigned long flags; ++#if (WLAN_HOSTIF==WLAN_USB) ++ int status; ++#endif ++ ++ FN_ENTER; ++ acxlog(L_STATE, "%s: UNVERIFIED.\n", __func__); ++ acxlog(L_BINDEBUG | L_ASSOC, "%s: status = %d\n", __func__, ++ priv->status); ++ if (0 != acx100_lock(priv, &flags)) { ++ return; ++ } ++ ++ switch (priv->status) { ++ case ISTATUS_1_SCANNING: ++ if ((++priv->scan_retries < 5) && (0 == priv->bss_table_count)) { ++ acx100_set_timer(priv, 1000000); ++#if (WLAN_HOSTIF==WLAN_USB) ++ acx100_interrogate(priv,&status,ACX100_RID_SCAN_STATUS); ++ acxlog(L_DEBUG,"scan status=%d\n",status); ++ if (status==0) { ++ acx100_complete_dot11_scan(priv); ++ } ++#endif ++ acxlog(L_ASSOC, "continuing scan (attempt %d).\n", priv->scan_retries); ++ } ++ else ++ { ++ acxlog(L_ASSOC, "Stopping scan (%s).\n", (0 != priv->bss_table_count) ? "stations found" : "scan timeout"); ++ acx100_issue_cmd(priv, ACX100_CMD_STOP_SCAN, NULL, 0, 5000); ++ } ++ break; ++ case ISTATUS_2_WAIT_AUTH: ++ priv->scan_retries = 0; ++ if (++priv->auth_assoc_retries < 10) { ++ acxlog(L_ASSOC, "resend authen1 request (attempt %d).\n", ++ priv->auth_assoc_retries + 1); ++ acx100_transmit_authen1(priv); ++ } else { ++ /* time exceeded: fall back to scanning mode */ ++ acxlog(L_ASSOC, ++ "authen1 request reply timeout, giving up.\n"); ++ /* simply set status back to scanning (DON'T start scan) */ ++ acx100_set_status(priv, ISTATUS_1_SCANNING); ++ } ++ acx100_set_timer(priv, 2500000); /* used to be 1500000, but some other driver uses 2.5s wait time */ ++ break; ++ case ISTATUS_3_AUTHENTICATED: ++ if (++priv->auth_assoc_retries < 10) { ++ acxlog(L_ASSOC, ++ "resend association request (attempt %d).\n", ++ priv->auth_assoc_retries + 1); ++ acx100_transmit_assoc_req(priv); ++ } else { ++ /* time exceeded: give up */ ++ acxlog(L_ASSOC, ++ "association request reply timeout, giving up.\n"); ++ /* simply set status back to scanning (DON'T start scan) */ ++ acx100_set_status(priv, ISTATUS_1_SCANNING); ++ } ++ acx100_set_timer(priv, 2500000); /* see above */ ++ break; ++ case ISTATUS_5_UNKNOWN: ++ acx100_set_status(priv, priv->unknown0x2350); ++ priv->unknown0x2350 = 0; ++ break; ++ case ISTATUS_0_STARTED: ++ case ISTATUS_4_ASSOCIATED: ++ default: ++ break; ++ } ++ acx100_unlock(priv, &flags); ++ FN_EXIT(0, 0); ++} +diff -urN x/drivers/net/wireless/acx/acx100_helper2.h y/drivers/net/wireless/acx/acx100_helper2.h +--- x/drivers/net/wireless/acx/acx100_helper2.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/acx/acx100_helper2.h 2004-04-14 02:04:30.000000000 +1000 +@@ -0,0 +1,224 @@ ++/* include/acx100_helper2.h ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Copyright (C) 2003 ACX100 Open Source Project ++ * ++ * The contents of this file are subject to the Mozilla Public ++ * License Version 1.1 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS ++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or ++ * implied. See the License for the specific language governing ++ * rights and limitations under the License. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU Public License version 2 (the "GPL"), in which ++ * case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use ++ * your version of this file under the MPL, indicate your decision ++ * by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL. If you do not delete ++ * the provisions above, a recipient may use your version of this ++ * file under either the MPL or the GPL. ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Inquiries regarding the ACX100 Open Source Project can be ++ * made directly to: ++ * ++ * acx100-users@lists.sf.net ++ * http://acx100.sf.net ++ * ++ * -------------------------------------------------------------------- ++ */ ++ ++ ++typedef struct acx100_frame { ++ char val0x0[0x26]; ++ UINT16 val0x26; ++ acx100_addr3_t fr; ++} acx100_frame_t; ++ ++typedef struct alloc_p80211mgmt_req_t { ++ union { ++ wlan_fr_mgmt_t mgmt; ++ wlan_fr_assocreq_t assocreq; ++ wlan_fr_reassocreq_t reassocreq; ++ wlan_fr_assocresp_t assocresp; ++ wlan_fr_reassocresp_t reassocresp; ++ wlan_fr_beacon_t beacon; ++ wlan_fr_disassoc_t disassoc; ++ wlan_fr_authen_t authen; ++ wlan_fr_deauthen_t deauthen; ++ wlan_fr_proberesp_t proberesp; ++ } a; ++} alloc_p80211_mgmt_req_t; ++ ++typedef struct rxhostdescriptor rxhostdescriptor_t; ++typedef struct rxbuffer rxbuffer_t; ++ ++#define MAX_NUMBER_OF_SITE 31 ++ ++typedef struct ssid { ++ UINT8 element_ID; ++ UINT8 length; ++ UINT8 inf[32]; ++} ssid_t; ++ ++typedef struct rates { ++ UINT8 element_ID; ++ UINT8 length; ++ UINT8 sup_rates[8]; ++} rates_t; ++ ++typedef struct fhps { ++ UINT8 element_ID; ++ UINT8 length; ++ UINT16 dwell_time; ++ UINT8 hop_set; ++ UINT8 hop_pattern; ++ UINT8 hop_index; ++} fhps_t; ++ ++typedef struct dsps { ++ UINT8 element_ID; ++ UINT8 length; ++ UINT8 curr_channel; ++} dsps_t; ++ ++typedef struct cfps { ++ UINT8 element_ID; ++ UINT8 length; ++ UINT8 cfp_count; ++ UINT8 cfp_period; ++ UINT16 cfp_max_dur; ++ UINT16 cfp_dur_rem; ++} cfps_t; ++ ++typedef struct challenge_text { ++ UINT8 element_ID; ++ UINT8 length; ++ UINT8 text[253]; ++} challenge_text_t; ++ ++ ++ ++typedef struct auth_frame_body { ++ UINT16 auth_alg; ++ UINT16 auth_seq; ++ UINT16 status; ++ challenge_text_t challenge; ++} auth_frame_body_t; ++ ++typedef struct assocresp_frame_body { ++ UINT16 cap_info; ++ UINT16 status; ++ UINT16 aid; ++ rates_t rates; ++} assocresp_frame_body_t; ++ ++typedef struct reassocreq_frame_body { ++ UINT16 cap_info; ++ UINT16 listen_int; ++ UINT8 current_ap[6]; ++ ssid_t ssid; ++ rates_t rates; ++} reassocreq_frame_body_t; ++ ++typedef struct reassocresp_frame_body { ++ UINT16 cap_info; ++ UINT16 status; ++ UINT16 aid; ++ rates_t rates; ++} reassocresp_frame_body_t; ++ ++typedef struct deauthen_frame_body { ++ UINT16 reason; ++} deauthen_frame_body_t; ++ ++typedef struct disassoc_frame_body { ++ UINT16 reason; ++} disassoc_frame_body_t; ++ ++typedef struct probereq_frame_body { ++ ssid_t ssid; ++ rates_t rates; ++} probereq_frame_body_t; ++ ++typedef struct proberesp_frame_body { ++ UINT8 timestamp[8]; ++ UINT16 beacon_int; ++ UINT16 cap_info; ++ ssid_t ssid; ++ rates_t rates; ++ fhps_t fhps; ++ dsps_t dsps; ++ cfps_t cfps; ++} proberesp_frame_body_t; ++ ++typedef struct TxData { ++ UINT16 frame_control; /* 0x0 */ ++ UINT16 duration_id; /* 0x2 */ ++ UINT8 da[ETH_ALEN]; /* 0x4 */ ++ UINT8 sa[ETH_ALEN]; /* 0xa */ ++ UINT8 bssid[ETH_ALEN]; /* 0x10 */ ++ UINT16 sequence_control; /* 0x16 */ ++ union { ++ auth_frame_body_t auth; ++ deauthen_frame_body_t deauthen; ++ /* assocreq_frame_body_t does not exist, since it ++ * contains variable-length members, thus it's no static ++ * struct */ ++ assocresp_frame_body_t assocresp; ++ reassocresp_frame_body_t reassocreq; ++ reassocresp_frame_body_t reassocresp; ++ disassoc_frame_body_t disassoc; ++ probereq_frame_body_t probereq; ++ proberesp_frame_body_t proberesp; ++ char * raw[2400-24]; ++ } body; ++} TxData; /* size: 2400 */ ++ ++void acx100_sta_list_init(wlandevice_t *priv); ++client_t *acx100_sta_list_alloc(wlandevice_t *priv, UINT8 *address); ++client_t *acx100_sta_list_add(wlandevice_t *priv, UINT8 *address); ++client_t *acx100_sta_list_get(wlandevice_t *priv, UINT8 *address); ++char *acx100_get_status_name(UINT16 status); ++void acx100_set_status(wlandevice_t *priv, UINT16 status); ++int acx100_rx_ieee802_11_frame(wlandevice_t *priv, rxhostdescriptor_t *desc); ++UINT32 acx100_transmit_assocresp(wlan_fr_assocreq_t *arg_0, ++ wlandevice_t *priv); ++UINT32 acx100_transmit_reassocresp(wlan_fr_reassocreq_t *arg_0, ++ wlandevice_t *priv); ++int acx100_process_disassoc(wlan_fr_disassoc_t *req, wlandevice_t *priv); ++int acx100_process_disassociate(wlan_fr_disassoc_t *req, wlandevice_t *priv); ++void acx100_process_probe_response(struct rxbuffer *mmt, wlandevice_t *priv, ++ acxp80211_hdr_t *hdr); ++int acx100_process_assocresp(wlan_fr_assocresp_t *req, wlandevice_t *priv); ++int acx100_process_reassocresp(wlan_fr_reassocresp_t *req, wlandevice_t *priv); ++int acx100_process_authen(wlan_fr_authen_t *req, wlandevice_t *priv); ++ ++int acx100_process_deauthen(wlan_fr_deauthen_t *req, wlandevice_t *priv); ++int acx100_process_deauthenticate(wlan_fr_deauthen_t *req, wlandevice_t *priv); ++int acx100_transmit_deauthen(char *a, client_t *arg_4, wlandevice_t *priv, ++ UINT16 reason); ++int acx100_transmit_authen1(wlandevice_t *priv); ++int acx100_transmit_authen2(wlan_fr_authen_t *arg_0, client_t *sta_list, ++ wlandevice_t *priv); ++int acx100_transmit_authen3(wlan_fr_authen_t *arg_0, wlandevice_t *priv); ++int acx100_transmit_authen4(wlan_fr_authen_t *arg_0, wlandevice_t *priv); ++int acx100_transmit_assoc_req(wlandevice_t *priv); ++UINT32 acx100_transmit_disassoc(client_t *arg_0, wlandevice_t *priv); ++#if (POWER_SAVE_80211 == 0) ++void ActivatePowerSaveMode(wlandevice_t *priv, int vala); ++#endif ++void acx100_timer(unsigned long a); ++void acx100_complete_dot11_scan(wlandevice_t *priv); ++ ++void acx100_gen_challenge(challenge_text_t *); ++void acx100_get_random(UINT8 *, UINT16); ++void acx100_ibssid_gen(wlandevice_t *priv, unsigned char *p_out); +diff -urN x/drivers/net/wireless/acx/acx100_ioctl.c y/drivers/net/wireless/acx/acx100_ioctl.c +--- x/drivers/net/wireless/acx/acx100_ioctl.c 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/acx/acx100_ioctl.c 2004-04-14 02:12:17.000000000 +1000 +@@ -0,0 +1,2807 @@ ++/* src/acx100_ioctl.c - all the ioctl calls ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Copyright (C) 2003 ACX100 Open Source Project ++ * ++ * The contents of this file are subject to the Mozilla Public ++ * License Version 1.1 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS ++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or ++ * implied. See the License for the specific language governing ++ * rights and limitations under the License. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU Public License version 2 (the "GPL"), in which ++ * case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use ++ * your version of this file under the MPL, indicate your decision ++ * by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL. If you do not delete ++ * the provisions above, a recipient may use your version of this ++ * file under either the MPL or the GPL. ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Inquiries regarding the ACX100 Open Source Project can be ++ * made directly to: ++ * ++ * acx100-users@lists.sf.net ++ * http://acx100.sf.net ++ * ++ * -------------------------------------------------------------------- ++ */ ++ ++#ifdef S_SPLINT_S /* some crap that splint needs to not crap out */ ++#define __signed__ signed ++#define __u64 unsigned long long ++#define u64 unsigned long long ++#define loff_t unsigned long ++#define sigval_t unsigned long ++#define siginfo_t unsigned long ++#define stack_t unsigned long ++#define __s64 signed long long ++#endif ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#if WIRELESS_EXT > 12 ++#include ++#endif /* WE > 12 */ ++#include ++ ++/*================================================================*/ ++/* Project Includes */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++/* About the locking: ++ * I only locked the device whenever calls to the hardware are made or ++ * parts of the wlandevice struct are modified, otherwise no locking is ++ * performed. I don't now if this is safe, we'll see. ++ */ ++ ++ ++/* if you plan to reorder something, make sure to reorder all other places ++ * accordingly! */ ++#define ACX100_IOCTL SIOCIWFIRSTPRIV ++#define ACX100_IOCTL_DEBUG ACX100_IOCTL + 0x00 ++#define ACX100_IOCTL_LIST_DOM ACX100_IOCTL + 0x01 ++#define ACX100_IOCTL_SET_DOM ACX100_IOCTL + 0x02 ++#define ACX100_IOCTL_GET_DOM ACX100_IOCTL + 0x03 ++#define ACX100_IOCTL_SET_PREAMB ACX100_IOCTL + 0x04 ++#define ACX100_IOCTL_GET_PREAMB ACX100_IOCTL + 0x05 ++#define ACX100_IOCTL_SET_ANT ACX100_IOCTL + 0x06 ++#define ACX100_IOCTL_GET_ANT ACX100_IOCTL + 0x07 ++#define ACX100_IOCTL_RX_ANT ACX100_IOCTL + 0x08 ++#define ACX100_IOCTL_TX_ANT ACX100_IOCTL + 0x09 ++#define ACX100_IOCTL_SET_ED ACX100_IOCTL + 0x0a ++#define ACX100_IOCTL_SET_CCA ACX100_IOCTL + 0x0b ++#define ACX100_IOCTL_SET_PLED ACX100_IOCTL + 0x0c ++#define ACX100_IOCTL_MONITOR ACX100_IOCTL + 0x0d ++#define ACX100_IOCTL_TEST ACX100_IOCTL + 0x0e ++ ++/* channel frequencies ++ * TODO: Currently, every other 802.11 driver keeps its own copy of this. In ++ * the long run this should be integrated into ieee802_11.h or wireless.h or ++ * whatever IEEE802.11x framework evolves */ ++static const long acx100_channel_freq[] = { ++ 2412, 2417, 2422, 2427, 2432, 2437, 2442, ++ 2447, 2452, 2457, 2462, 2467, 2472, 2484, ++}; ++ ++static const struct iw_priv_args acx100_ioctl_private_args[] = { ++#ifdef ACX_DEBUG ++{ cmd : ACX100_IOCTL_DEBUG, ++ set_args : IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, ++ get_args : 0, ++ name : "set_debug" }, ++#endif ++{ cmd : ACX100_IOCTL_LIST_DOM, ++ set_args : 0, ++ get_args : 0, ++ name : "list_reg_domain" }, ++{ cmd : ACX100_IOCTL_SET_DOM, ++ set_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, ++ get_args : 0, ++ name : "set_reg_domain" }, ++{ cmd : ACX100_IOCTL_GET_DOM, ++ set_args : 0, ++ get_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, ++ name : "get_reg_domain" }, ++{ cmd : ACX100_IOCTL_SET_PREAMB, ++ set_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, ++ get_args : 0, ++ name : "set_s_preamble" }, ++{ cmd : ACX100_IOCTL_GET_PREAMB, ++ set_args : 0, ++ get_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, ++ name : "get_s_preamble" }, ++{ cmd : ACX100_IOCTL_SET_ANT, ++ set_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, ++ get_args : 0, ++ name : "set_antenna" }, ++{ cmd : ACX100_IOCTL_GET_ANT, ++ set_args : 0, ++ get_args : 0, ++ name : "get_antenna" }, ++{ cmd : ACX100_IOCTL_RX_ANT, ++ set_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, ++ get_args : 0, ++ name : "set_rx_ant" }, ++{ cmd : ACX100_IOCTL_TX_ANT, ++ set_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, ++ get_args : 0, ++ name : "set_tx_ant" }, ++{ cmd : ACX100_IOCTL_SET_ED, ++ set_args : IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, ++ get_args : 0, ++ name : "set_ed" }, ++{ cmd : ACX100_IOCTL_SET_CCA, ++ set_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, ++ get_args : 0, ++ name : "set_cca" }, ++{ cmd : ACX100_IOCTL_SET_PLED, ++ set_args : IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, ++ get_args : 0, ++ name : "set_led_power" }, ++{ cmd : ACX100_IOCTL_MONITOR, ++ set_args : IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, ++ get_args : 0, ++ name : "monitor" }, ++{ cmd : ACX100_IOCTL_TEST, ++ set_args : 0, ++ get_args : 0, ++ name : "test" } ++}; ++ ++/*------------------------------------------------------------------------------ ++ * acx100_ioctl_commit ++ * ++ * ++ * Arguments: ++ * ++ * Returns: ++ * ++ * Side effects: ++ * ++ * Call context: ++ * ++ * STATUS: NEW ++ * ++ *----------------------------------------------------------------------------*/ ++static inline int acx100_ioctl_commit(struct net_device *dev, ++ struct iw_request_info *info, ++ void *zwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *)dev->priv; ++ ++ FN_ENTER; ++ acx100_update_card_settings(priv, 0, 0, 0); ++ FN_EXIT(0, 0); ++ return 0; ++} ++ ++static inline int acx100_ioctl_get_name(struct net_device *dev, struct iw_request_info *info, char *cwrq, char *extra) ++{ ++ const char * const protocol_name = "IEEE 802.11b+"; ++ acxlog(L_IOCTL, "Get Name ==> %s\n", protocol_name); ++ strcpy(cwrq, protocol_name); ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_set_freq ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_set_freq(struct net_device *dev, struct iw_request_info *info, struct iw_freq *fwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ int channel = -1; ++ int mult = 1; ++ unsigned long flags; ++ int err; ++ int result = -EINVAL; ++ ++ FN_ENTER; ++ acxlog(L_IOCTL, "Set Frequency <== %i (%i)\n", fwrq->m, fwrq->e); ++ ++ if (fwrq->e == 0 && fwrq->m <= 1000) { ++ /* Setting by channel number */ ++ channel = fwrq->m; ++ } else { ++ /* If setting by frequency, convert to a channel */ ++ int i; ++ ++ for (i = 0; i < (6 - fwrq->e); i++) ++ mult *= 10; ++ ++ for (i = 0; i <= 13; i++) ++ if (fwrq->m == ++ acx100_channel_freq[i] * mult) ++ channel = i + 1; ++ } ++ ++ if (channel > 14) { ++ result = -EINVAL; ++ goto end; ++ } ++ ++ if (0 != (err = acx100_lock(priv, &flags))) { ++ result = err; ++ goto end; ++ } ++ ++ priv->channel = (UINT16)channel; ++ /* hmm, the following code part is strange, but this is how ++ * it was being done before... */ ++ if (ACX_MODE_3_MANAGED_AP == priv->macmode_wanted) { ++ /* hmm, AP mode? So simply set channel... */ ++ acxlog(L_IOCTL, "Changing to channel %d\n", priv->channel); ++ priv->set_mask |= GETSET_TX|GETSET_RX; ++ } ++ else ++ if ((ACX_MODE_2_MANAGED_STA == priv->macmode_wanted) ++ || (ACX_MODE_0_IBSS_ADHOC == priv->macmode_wanted)) { ++ /* trigger scanning... */ ++ priv->set_mask |= GETSET_CHANNEL; ++ } ++ acx100_unlock(priv, &flags); ++ result = -EINPROGRESS; /* need to call commit handler */ ++end: ++ FN_EXIT(1, result); ++ return result; ++} ++ ++static inline int acx100_ioctl_get_freq(struct net_device *dev, struct iw_request_info *info, struct iw_freq *fwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ fwrq->e = 0; ++ fwrq->m = priv->channel; ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_set_mode ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_set_mode(struct net_device *dev, struct iw_request_info *info, __u32 *uwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ unsigned long flags; ++ int err; ++ int result = -EINVAL; ++ ++ FN_ENTER; ++ acxlog(L_IOCTL, "Set Mode <== %i\n", *uwrq); ++ ++ if (0 != (err = acx100_lock(priv, &flags))) { ++ result = err; ++ goto end; ++ } ++ ++ switch(*uwrq) { ++ case IW_MODE_AUTO: ++ priv->macmode_wanted = ACX_MODE_FF_AUTO; ++ break; ++ case IW_MODE_ADHOC: ++ priv->macmode_wanted = ACX_MODE_0_IBSS_ADHOC; ++ break; ++ case IW_MODE_INFRA: ++ priv->macmode_wanted = ACX_MODE_2_MANAGED_STA; ++ break; ++ case IW_MODE_MASTER: ++ priv->macmode_wanted = ACX_MODE_3_MANAGED_AP; ++ break; ++ default: ++ result = -EOPNOTSUPP; ++ goto end_unlock; ++ } ++ ++ priv->set_mask |= GETSET_MODE; ++ result = -EINPROGRESS; ++ ++end_unlock: ++ acx100_unlock(priv, &flags); ++end: ++ FN_EXIT(1, result); ++ return result; ++} ++ ++static inline int acx100_ioctl_get_mode(struct net_device *dev, struct iw_request_info *info, __u32 *uwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ int result; ++ ++#if SHOW_SPECIFIC_MACMODE_JOINED ++ if (priv->status != ISTATUS_4_ASSOCIATED) ++#endif ++ { /* connection not up yet, so for now indicate the mode we want, ++ not the one we are in */ ++ switch (priv->macmode_wanted) { ++ case ACX_MODE_FF_AUTO: ++ *uwrq = IW_MODE_AUTO; ++ break; ++ case ACX_MODE_0_IBSS_ADHOC: ++ *uwrq = IW_MODE_ADHOC; ++ break; ++ case ACX_MODE_2_MANAGED_STA: ++ *uwrq = IW_MODE_INFRA; ++ break; ++ case ACX_MODE_3_MANAGED_AP: ++ *uwrq = IW_MODE_MASTER; ++ break; ++ default: ++ result = -EOPNOTSUPP; ++ goto end; ++ } ++ } ++#if SHOW_SPECIFIC_MACMODE_JOINED ++ else ++ { ++ switch (priv->macmode_joined) { ++ case ACX_MODE_0_IBSS_ADHOC: ++ *uwrq = IW_MODE_ADHOC; ++ break; ++ case ACX_MODE_2_MANAGED_STA: ++ *uwrq = IW_MODE_INFRA; ++ break; ++ case ACX_MODE_3_MANAGED_AP: ++ *uwrq = IW_MODE_MASTER; ++ break; ++ default: ++ result = -EOPNOTSUPP; ++ goto end; ++ } ++ } ++#endif ++ result = 0; ++end: ++ acxlog(L_IOCTL, "Get Mode ==> %d\n", *uwrq); ++ ++ return result; ++} ++ ++static inline int acx100_ioctl_set_sens(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ ++ acxlog(L_IOCTL, "Set Sensitivity <== %d\n", vwrq->value); ++ ++ if ((RADIO_RFMD_11 == priv->radio_type) || (RADIO_MAXIM_0D == priv->radio_type)) { ++ priv->sensitivity = (0 == vwrq->disabled) ? 0 : vwrq->value; ++ priv->set_mask |= GETSET_SENSITIVITY; ++ return -EINPROGRESS; ++ } else { ++ printk("ERROR: don't know how to set sensitivity for this radio type, please try to add that!\n"); ++ return -EINVAL; ++ } ++} ++ ++static inline int acx100_ioctl_get_sens(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ ++ if ((RADIO_RFMD_11 == priv->radio_type) || (RADIO_MAXIM_0D == priv->radio_type)) { ++ acxlog(L_IOCTL, "Get Sensitivity ==> %d\n", priv->sensitivity); ++ ++ vwrq->value = priv->sensitivity; ++ vwrq->disabled = (vwrq->value == 0); ++ vwrq->fixed = 1; ++ return 0; ++ } else { ++ printk("ERROR: don't know how to get sensitivity for this radio type, please try to add that!\n"); ++ return -EINVAL; ++ } ++} ++ ++/*------------------------------------------------------------------------------ ++ * acx100_set_ap ++ * ++ * Sets the MAC address of the AP to associate with ++ * ++ * Arguments: ++ * ++ * Returns: ++ * ++ * Side effects: ++ * ++ * Call context: Process ++ * ++ * STATUS: NEW ++ * ++ *----------------------------------------------------------------------------*/ ++static inline int acx100_ioctl_set_ap(struct net_device *dev, ++ struct iw_request_info *info, ++ struct sockaddr *awrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *)dev->priv; ++ static const unsigned char off[ETH_ALEN] = { 0, 0, 0, 0, 0, 0 }; ++ int result = 0; ++ UINT16 i; ++ unsigned char *ap; ++ ++ FN_ENTER; ++ if (NULL == awrq) { ++ result = -EFAULT; ++ goto end; ++ } ++ if (ARPHRD_ETHER != awrq->sa_family) { ++ result = -EINVAL; ++ goto end; ++ } ++ ++ ap = awrq->sa_data; ++ acxlog(L_IOCTL, "Set AP <== %02x:%02x:%02x:%02x:%02x:%02x\n", ++ ap[0], ap[1], ap[2], ap[3], ap[4], ap[5]); ++ ++ if (ACX_MODE_2_MANAGED_STA != priv->macmode_wanted) { ++ result = -EINVAL; ++ goto end; ++ } ++ ++ if (0 != acx100_is_mac_address_broadcast(ap)) { ++ /* "any" == "auto" == FF:FF:FF:FF:FF:FF */ ++ MAC_BCAST(priv->ap); ++ acxlog(L_IOCTL, "Forcing reassociation\n"); ++ acx100_scan_chan(priv); ++ result = -EINPROGRESS; ++ } else if (!memcmp(off, ap, ETH_ALEN)) { ++ /* "off" == 00:00:00:00:00:00 */ ++ MAC_BCAST(priv->ap); ++ acxlog(L_IOCTL, "Not reassociating\n"); ++ } else { ++ /* AB:CD:EF:01:23:45 */ ++ for (i = 0; i < priv->bss_table_count; i++) { ++ struct bss_info *bss = &priv->bss_table[i]; ++ if (!memcmp(bss->bssid, ap, ETH_ALEN)) { ++ if ((!!priv->wep_enabled) != !!(bss->caps & IEEE802_11_MGMT_CAP_WEP)) { ++ result = -EINVAL; ++ goto end; ++ } else { ++ MAC_COPY(priv->ap, ap); ++ acxlog(L_IOCTL, "Forcing reassociation\n"); ++ acx100_scan_chan(priv); ++ result = -EINPROGRESS; ++ goto end; ++ } ++ } ++ } ++ } ++ ++end: ++ FN_EXIT(1, result); ++ return result; ++} ++ ++static inline int acx100_ioctl_get_ap(struct net_device *dev, struct iw_request_info *info, struct sockaddr *awrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ ++ acxlog(L_IOCTL, "Get BSSID\n"); ++ if (ISTATUS_4_ASSOCIATED == priv->status) { ++ /* as seen in Aironet driver, airo.c */ ++ MAC_COPY(awrq->sa_data, priv->bssid); ++ } else { ++ MAC_FILL(awrq->sa_data, 0x0); ++ } ++ awrq->sa_family = ARPHRD_ETHER; ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_get_aplist ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: deprecated in favour of iwscan. ++* We simply return the list of currently available stations in range, ++* don't do a new scan. ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_get_aplist(struct net_device *dev, struct iw_request_info *info, struct iw_point *dwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ struct sockaddr *address = (struct sockaddr *) extra; ++ struct iw_quality qual[IW_MAX_AP]; ++ UINT16 i; ++ int result = 0; ++ ++ FN_ENTER; ++ ++ /* in Master mode of course we don't have an AP list... */ ++ if (ACX_MODE_3_MANAGED_AP == priv->macmode_joined) ++ { ++ result = -EOPNOTSUPP; ++ goto end; ++ } ++ ++ for (i = 0; i < priv->bss_table_count; i++) { ++ MAC_COPY(address[i].sa_data, priv->bss_table[i].bssid); ++ address[i].sa_family = ARPHRD_ETHER; ++ qual[i].level = priv->bss_table[i].sir; ++ qual[i].noise = priv->bss_table[i].snr; ++ qual[i].qual = (qual[i].noise <= 100) ? ++ 100 - qual[i].noise : 0;; ++ qual[i].updated = 0; /* no scan: level/noise/qual not updated */ ++ } ++ if (0 != i) ++ { ++ dwrq->flags = 1; ++ memcpy(extra + sizeof(struct sockaddr)*i, &qual, ++ sizeof(struct iw_quality)*i); ++ } ++ ++ dwrq->length = priv->bss_table_count; ++ ++end: ++ FN_EXIT(1, result); ++ return result; ++} ++ ++static inline int acx100_ioctl_set_scan(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ int result = -EINVAL; ++ ++ FN_ENTER; ++ ++ /* don't start scan if device is not up yet */ ++ if (0 == (priv->dev_state_mask & ACX_STATE_IFACE_UP)) { ++ result = -EAGAIN; ++ goto end; ++ } ++ ++ acx100_scan_chan(priv); ++ priv->scan_start = jiffies; ++ priv->scan_running = 1; ++ result = 0; ++ ++end: ++ FN_EXIT(1, result); ++ return result; ++} ++ ++#if WIRELESS_EXT > 13 ++static char *acx100_ioctl_scan_add_station(wlandevice_t *priv, char *ptr, char *end_buf, struct bss_info *bss) ++{ ++ struct iw_event iwe; ++ int i; ++ char *ptr_rate; ++ ++ FN_ENTER; ++ ++ /* MAC address has to be added first */ ++ iwe.cmd = SIOCGIWAP; ++ iwe.u.ap_addr.sa_family = ARPHRD_ETHER; ++ MAC_COPY(iwe.u.ap_addr.sa_data, bss->bssid); ++ acxlog(L_IOCTL, "scan, station address:\n"); ++ acx100_log_mac_address(L_IOCTL, bss->bssid); ++ ptr = iwe_stream_add_event(ptr, end_buf, &iwe, IW_EV_ADDR_LEN); ++ ++ /* Add ESSID */ ++ iwe.cmd = SIOCGIWESSID; ++ iwe.u.data.length = bss->essid_len; ++ iwe.u.data.flags = 1; ++ acxlog(L_IOCTL, "scan, essid: %s\n", bss->essid); ++ ptr = iwe_stream_add_point(ptr, end_buf, &iwe, bss->essid); ++ ++ /* Add mode */ ++ iwe.cmd = SIOCGIWMODE; ++ if (0 != (bss->caps & (IEEE802_11_MGMT_CAP_ESS | IEEE802_11_MGMT_CAP_IBSS))) { ++ if (0 != (bss->caps & IEEE802_11_MGMT_CAP_ESS)) ++ iwe.u.mode = IW_MODE_MASTER; ++ else ++ iwe.u.mode = IW_MODE_ADHOC; ++ acxlog(L_IOCTL, "scan, mode: %d\n", iwe.u.mode); ++ ptr = iwe_stream_add_event(ptr, end_buf, &iwe, IW_EV_UINT_LEN); ++ } ++ ++ /* Add frequency */ ++ iwe.cmd = SIOCGIWFREQ; ++ iwe.u.freq.m = acx100_channel_freq[bss->channel] * 100000; ++ iwe.u.freq.e = 1; ++ acxlog(L_IOCTL, "scan, frequency: %d\n", iwe.u.freq.m); ++ ptr = iwe_stream_add_event(ptr, end_buf, &iwe, IW_EV_FREQ_LEN); ++ ++ /* Add link quality */ ++ iwe.cmd = IWEVQUAL; ++ /* FIXME: these values should be expressed in dBm, but we don't know ++ * how to calibrate it yet */ ++ iwe.u.qual.level = bss->sir; ++ iwe.u.qual.noise = bss->snr; ++ iwe.u.qual.qual = (iwe.u.qual.noise <= 100) ? ++ 100 - iwe.u.qual.noise : 0; ++ iwe.u.qual.updated = 7; ++ acxlog(L_IOCTL, "scan, link quality: %d/%d/%d\n", iwe.u.qual.level, iwe.u.qual.noise, iwe.u.qual.qual); ++ ptr = iwe_stream_add_event(ptr, end_buf, &iwe, IW_EV_QUAL_LEN); ++ ++ /* Add encryption */ ++ iwe.cmd = SIOCGIWENCODE; ++ if (0 != (bss->caps & IEEE802_11_MGMT_CAP_WEP)) ++ iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY; ++ else ++ iwe.u.data.flags = IW_ENCODE_DISABLED; ++ iwe.u.data.length = 0; ++ acxlog(L_IOCTL, "scan, encryption flags: %x\n", iwe.u.data.flags); ++ ptr = iwe_stream_add_point(ptr, end_buf, &iwe, bss->essid); ++ ++ /* add rates */ ++ iwe.cmd = SIOCGIWRATE; ++ iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0; ++ ptr_rate = ptr + IW_EV_LCP_LEN; ++ for (i = 0; 0 != bss->supp_rates[i]; i++) ++ { ++ iwe.u.bitrate.value = (bss->supp_rates[i] & ~0x80) * 500000; /* units of 500kb/s */ ++ acxlog(L_IOCTL, "scan, rate: %d [%02x]\n", iwe.u.bitrate.value, bss->supp_rates[i]); ++ ptr = iwe_stream_add_value(ptr, ptr_rate, end_buf, &iwe, IW_EV_PARAM_LEN); ++ } ++ if ((ptr_rate - ptr) > (ptrdiff_t)IW_EV_LCP_LEN) ++ ptr = ptr_rate; ++ ++ /* drop remaining station data items for now */ ++ ++ FN_EXIT(1, (int)ptr); ++ return ptr; ++} ++ ++static inline int acx100_ioctl_get_scan(struct net_device *dev, struct iw_request_info *info, struct iw_point *dwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ char *ptr = extra; ++ int i; ++ int result = 0; ++ ++ FN_ENTER; ++ ++ /* no scan available if device is not up yet */ ++ if (0 == (priv->dev_state_mask & ACX_STATE_IFACE_UP)) ++ { ++ result = -EAGAIN; ++ goto end; ++ } ++ ++ if (priv->scan_start && time_before(jiffies, priv->scan_start + 3*HZ)) ++ { ++ /* scan still in progress, so no results yet, sorry */ ++ result = -EAGAIN; ++ goto end; ++ } ++ priv->scan_start = 0; ++ ++ if (priv->bss_table_count == 0) ++ { ++ /* no stations found */ ++ result = -ENODATA; ++ goto end; ++ } ++ ++ for (i = 0; i < priv->bss_table_count; i++) ++ { ++ struct bss_info *bss = &priv->bss_table[i]; ++ ++ ptr = acx100_ioctl_scan_add_station(priv, ptr, extra + IW_SCAN_MAX_DATA, bss); ++ } ++ dwrq->length = ptr - extra; ++ dwrq->flags = 0; ++ ++end: ++ FN_EXIT(1, result); ++ return result; ++} ++#endif /* WIRELESS_EXT > 13 */ ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_set_essid ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_set_essid(struct net_device *dev, struct iw_request_info *info, struct iw_point *dwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ int len = dwrq->length; ++ unsigned long flags; ++ int err; ++ int result = -EINVAL; ++ ++ FN_ENTER; ++ acxlog(L_IOCTL, "Set ESSID <== %s, length %d, flags 0x%04x\n", dwrq->pointer, len, dwrq->flags); ++ ++ if (len < 0) { ++ result = -EINVAL; ++ goto end; ++ } ++ ++ if (0 != (err = acx100_lock(priv, &flags))) { ++ result = err; ++ goto end; ++ } ++ ++ /* ESSID disabled? */ ++ if (0 == dwrq->flags) ++ { ++ priv->essid_active = (UINT8)0; ++ } ++ else ++ { ++ if (dwrq->length > IW_ESSID_MAX_SIZE+1) ++ { ++ result = -E2BIG; ++ goto end_unlock; ++ } ++ ++ priv->essid_len = (UINT8)(len - 1); ++ memcpy(priv->essid, extra, priv->essid_len); ++ priv->essid[priv->essid_len] = '\0'; ++ priv->essid_active = (UINT8)1; ++ } ++ ++ priv->set_mask |= GETSET_ESSID; ++ ++end_unlock: ++ acx100_unlock(priv, &flags); ++ result = -EINPROGRESS; ++end: ++ FN_EXIT(1, result); ++ return result; ++} ++ ++static inline int acx100_ioctl_get_essid(struct net_device *dev, struct iw_request_info *info, struct iw_point *dwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ ++ acxlog(L_IOCTL, "Get ESSID ==> %s\n", priv->essid); ++ ++ dwrq->flags = priv->essid_active; ++ if ((UINT8)0 != priv->essid_active) ++ { ++ memcpy(extra, priv->essid, priv->essid_len); ++ extra[priv->essid_len] = '\0'; ++ dwrq->length = priv->essid_len + 1; ++ dwrq->flags = 1; ++ } ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_set_rate ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_set_rate(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ unsigned long flags; ++ int err; ++ UINT8 txrate_cfg, txrate_auto_idx_max; ++ int result = -EINVAL; ++ ++ FN_ENTER; ++ acxlog(L_IOCTL, ++ "rate = %d, fixed = 0x%x, disabled = 0x%x, flags = 0x%x\n", ++ vwrq->value, vwrq->fixed, vwrq->disabled, vwrq->flags); ++ ++#define BITRATE_AUTO 1 ++#if BITRATE_AUTO ++ if ((0 == vwrq->fixed) || (1 == vwrq->fixed)) { ++#else ++ if (1 == vwrq->fixed) { ++#endif ++ ++ switch (vwrq->value) { ++ ++ case 1000000: /* 1Mbps */ ++ txrate_cfg = ACX_TXRATE_1; ++ txrate_auto_idx_max = 0; ++ break; ++ ++ case 2000000: /* 2Mbps */ ++ txrate_cfg = ACX_TXRATE_2; ++ txrate_auto_idx_max = 1; ++ break; ++ ++ case 5500000: /* 5.5Mbps */ ++ txrate_cfg = ACX_TXRATE_5_5; ++ txrate_auto_idx_max = 2; ++ break; ++ ++ case 11000000: /* 11Mbps */ ++ txrate_cfg = ACX_TXRATE_11; ++ txrate_auto_idx_max = 3; ++ break; ++ ++ case 22000000: /* 22Mbps */ ++ txrate_cfg = ACX_TXRATE_22PBCC; ++ txrate_auto_idx_max = 4; ++ break; ++ ++#if BITRATE_AUTO ++ case -1: /* highest available */ ++ /* -1 is used to set highest available rate in ++ * case of iwconfig calls without rate given ++ * (iwconfig wlan0 rate auto etc.) */ ++ txrate_cfg = ACX_TXRATE_22PBCC; /* 22Mbps is not supported by many APs, thus fallback needs to work properly to be able to safely go back to 11! */ ++ txrate_auto_idx_max = 4; ++ break; ++#endif ++ default: ++ result = -EINVAL; ++ goto end; ++ } ++ ++ } else if (2 == vwrq->fixed) { ++ ++ switch (vwrq->value) { ++ ++ case 0: ++ txrate_cfg = ACX_TXRATE_1; ++ txrate_auto_idx_max = 0; ++ break; ++ ++ case 1: ++ txrate_cfg = ACX_TXRATE_2; ++ txrate_auto_idx_max = 1; ++ break; ++ ++ case 2: ++ txrate_cfg = ACX_TXRATE_5_5; ++ txrate_auto_idx_max = 2; ++ break; ++ ++ case 3: ++ txrate_cfg = ACX_TXRATE_5_5PBCC; ++ txrate_auto_idx_max = 2; ++ break; ++ ++ case 4: ++ txrate_cfg = ACX_TXRATE_11; ++ txrate_auto_idx_max = 3; ++ break; ++ ++ case 5: ++ txrate_cfg = ACX_TXRATE_11PBCC; ++ txrate_auto_idx_max = 3; ++ break; ++ ++ case 6: ++ txrate_cfg = ACX_TXRATE_22PBCC; ++ txrate_auto_idx_max = 4; ++ break; ++ ++ default: ++ result = -EINVAL; ++ goto end; ++ } ++ ++ } else { ++ result = -EOPNOTSUPP; ++ goto end; ++ } ++ ++ if (0 != (err = acx100_lock(priv, &flags))) { ++ result = err; ++ goto end; ++ } ++ ++ priv->txrate_cfg = txrate_cfg; ++#if BITRATE_AUTO ++ priv->txrate_auto = (UINT8)(vwrq->fixed == (__u8)0); ++ if (1 == priv->txrate_auto) ++ { ++ if (ACX_TXRATE_1 == txrate_cfg) { /* auto rate with 1Mbps max. useless */ ++ priv->txrate_auto = (UINT8)0; ++ priv->txrate_curr = priv->txrate_cfg; ++ } else { ++ priv->txrate_auto_idx_max = txrate_auto_idx_max; ++ priv->txrate_auto_idx = 1; /* 2Mbps */ ++ priv->txrate_curr = ACX_TXRATE_2; /* 2Mbps, play it safe at the beginning */ ++ priv->txrate_fallback_count = 0; ++ priv->txrate_stepup_count = 0; ++ } ++ } ++ else ++#endif ++ priv->txrate_curr = priv->txrate_cfg; ++ ++ acx100_unlock(priv, &flags); ++ ++#if BITRATE_AUTO ++ acxlog(L_IOCTL, "Tx rate = %d, auto rate %d, current rate %d\n", priv->txrate_cfg, priv->txrate_auto, priv->txrate_curr); ++ priv->set_mask |= SET_RATE_FALLBACK; ++ result = -EINPROGRESS; ++#else ++ acxlog(L_IOCTL, "Tx rate = %d\n", priv->txrate_cfg); ++ result = 0; ++#endif ++ ++end: ++ FN_EXIT(1, result); ++ return result; ++} ++/*---------------------------------------------------------------- ++* acx100_ioctl_get_rate ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_get_rate(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ ++ vwrq->value = priv->txrate_curr * 100000; ++#if BITRATE_AUTO ++ vwrq->fixed = (__u8)(priv->txrate_auto == (UINT8)0); ++#else ++ vwrq->fixed = 1; ++#endif ++ vwrq->disabled = (__u8)0; ++ return 0; ++} ++ ++static inline int acx100_ioctl_set_rts(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ int val = vwrq->value; ++ ++ if ((__u8)0 != vwrq->disabled) ++ val = 2312; ++ if ((val < 0) || (val > 2312)) ++ return -EINVAL; ++ ++ priv->rts_threshold = val; ++ return 0; ++ ++} ++ ++static inline int acx100_ioctl_get_rts(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ ++ vwrq->value = priv->rts_threshold; ++ vwrq->disabled = (__u8)(vwrq->value >= 2312); ++ vwrq->fixed = (__u8)1; ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_set_encode ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_set_encode(struct net_device *dev, struct iw_request_info *info, struct iw_point *dwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ int index; ++ unsigned long flags; ++ int err; ++ int result = -EINVAL; ++ ++ FN_ENTER; ++ acxlog(L_IOCTL, ++ "Set Encoding flags = 0x%04x, size = %i, key: %s\n", ++ dwrq->flags, dwrq->length, extra ? "set" : "No key"); ++ ++ if (0 != (err = acx100_lock(priv, &flags))) { ++ result = err; ++ goto end; ++ } ++ ++ index = dwrq->flags & IW_ENCODE_INDEX; ++ ++ if (dwrq->length > 0) { ++ ++ /* if index is 0 or invalid, use default key */ ++ if ((index == 0) || (index > 4)) ++ index = (int)priv->wep_current_index; ++ else ++ index--; ++ ++ if (0 == (dwrq->flags & IW_ENCODE_NOKEY)) { ++ if (dwrq->length > 29) ++ dwrq->length = 29; /* restrict it */ ++ ++ if (dwrq->length > 13) ++ priv->wep_keys[index].size = 29; /* 29*8 == 232, WEP256 */ ++ else ++ if (dwrq->length > 5) ++ priv->wep_keys[index].size = 13; /* 13*8 == 104bit, WEP128 */ ++ else ++ if (dwrq->length > 0) ++ priv->wep_keys[index].size = 5; /* 5*8 == 40bit, WEP64 */ ++ else ++ /* disable key */ ++ priv->wep_keys[index].size = 0; ++ ++ memset(priv->wep_keys[index].key, 0, sizeof(priv->wep_keys[index].key)); ++ memcpy(priv->wep_keys[index].key, extra, dwrq->length); ++ } ++ ++ } else { ++ /* set transmit key */ ++ if ((index >= 1) && (index <= 4)) ++ priv->wep_current_index = (UINT8)(index - 1); ++ else ++ if (0 == (dwrq->flags & IW_ENCODE_MODE)) ++ { ++ /* complain if we were not just setting ++ * the key mode */ ++ result = -EINVAL; ++ goto end_unlock; ++ } ++ } ++ ++ priv->wep_enabled = (UINT8)(0 == (dwrq->flags & IW_ENCODE_DISABLED)); ++ ++ if (0 != (dwrq->flags & IW_ENCODE_OPEN)) { ++ priv->auth_alg = WLAN_AUTH_ALG_OPENSYSTEM; ++ priv->wep_restricted = (UINT8)0; ++ } else if (0 != (dwrq->flags & IW_ENCODE_RESTRICTED)) { ++ priv->auth_alg = WLAN_AUTH_ALG_SHAREDKEY; ++ priv->wep_restricted = (UINT8)1; ++ } ++ ++ /* set flag to make sure the card WEP settings get updated */ ++ priv->set_mask |= GETSET_WEP; ++ ++ acxlog(L_IOCTL, "len = %d, key at 0x%p, flags = 0x%x\n", ++ dwrq->length, extra, ++ dwrq->flags); ++ ++ for (index = 0; index <= 3; index++) { ++ if (0 != priv->wep_keys[index].size) { ++ acxlog(L_IOCTL, ++ "index = %d, size = %d, key at 0x%p\n", ++ priv->wep_keys[index].index, ++ priv->wep_keys[index].size, ++ priv->wep_keys[index].key); ++ } ++ } ++ result = -EINPROGRESS; ++ ++end_unlock: ++ acx100_unlock(priv, &flags); ++end: ++ FN_EXIT(1, result); ++ return result; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_get_encode ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_get_encode(struct net_device *dev, struct iw_request_info *info, struct iw_point *dwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ ++ if (ACX_MODE_0_IBSS_ADHOC == priv->macmode_wanted) { ++ /* ok, let's assume it's supported, but print a ++ * warning message ++ * FIXME: should be removed once it's definitely working. */ ++ acxlog(L_STD, "Warning: WEP support might not be supported in Ad-Hoc mode yet!\n"); ++ /* return -EOPNOTSUPP; */ ++ } ++ ++ if (priv->wep_enabled == (UINT8)0) ++ { ++ dwrq->flags = IW_ENCODE_DISABLED; ++ } ++ else ++ { ++ dwrq->flags = ++ (priv->wep_restricted == (UINT8)1) ? IW_ENCODE_RESTRICTED : IW_ENCODE_OPEN; ++ ++ dwrq->length = ++ priv->wep_keys[priv->wep_current_index].size; ++ ++ memcpy(extra, ++ priv->wep_keys[priv->wep_current_index].key, ++ priv->wep_keys[priv->wep_current_index].size); ++ } ++ ++ /* set the current index */ ++ dwrq->flags |= ++ priv->wep_keys[priv->wep_current_index].index + 1; ++ ++ acxlog(L_IOCTL, "len = %d, key = %p, flags = 0x%x\n", ++ dwrq->length, dwrq->pointer, ++ dwrq->flags); ++ ++ return 0; ++} ++ ++static inline int acx100_ioctl_set_power(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ ++ acxlog(L_IOCTL, "Set 802.11 Power Save flags = 0x%04x\n", vwrq->flags); ++ if ((__u8)0 != vwrq->disabled) { ++ priv->ps_wakeup_cfg &= ~PS_CFG_ENABLE; ++ priv->set_mask |= GETSET_POWER_80211; ++ return -EINPROGRESS; ++ } ++ if ((vwrq->flags & IW_POWER_TYPE) == IW_POWER_TIMEOUT) { ++ UINT16 ps_timeout = (vwrq->value * 1024) / 1000; ++ ++ if (ps_timeout > 255) ++ ps_timeout = 255; ++ acxlog(L_IOCTL, "setting PS timeout value to %d time units due to %dus\n", ps_timeout, vwrq->value); ++ priv->ps_hangover_period = ps_timeout; ++ } else if ((vwrq->flags & IW_POWER_TYPE) == IW_POWER_PERIOD) { ++ UINT16 ps_periods = vwrq->value / 1000000; ++ ++ if (ps_periods > 255) ++ ps_periods = 255; ++ acxlog(L_IOCTL, "setting PS period value to %d periods due to %dus\n", ps_periods, vwrq->value); ++ priv->ps_listen_interval = ps_periods; ++ priv->ps_wakeup_cfg &= ~PS_CFG_WAKEUP_MODE_MASK; ++ priv->ps_wakeup_cfg |= PS_CFG_WAKEUP_EACH_ITVL; ++ } ++ switch (vwrq->flags & IW_POWER_MODE) { ++ /* FIXME: are we doing the right thing here? */ ++ case IW_POWER_UNICAST_R: ++ priv->ps_options &= ~PS_OPT_STILL_RCV_BCASTS; ++ break; ++ case IW_POWER_MULTICAST_R: ++ priv->ps_options |= PS_OPT_STILL_RCV_BCASTS; ++ break; ++ case IW_POWER_ALL_R: ++ priv->ps_options |= PS_OPT_STILL_RCV_BCASTS; ++ break; ++ case IW_POWER_ON: ++ break; ++ default: ++ acxlog(L_IOCTL, "unknown PS mode\n"); ++ return -EINVAL; ++ } ++ priv->ps_wakeup_cfg |= PS_CFG_ENABLE; ++ priv->set_mask |= GETSET_POWER_80211; ++ return -EINPROGRESS; ++ ++} ++ ++static inline int acx100_ioctl_get_power(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ ++ acxlog(L_IOCTL, "Get 802.11 Power Save flags = 0x%04x\n", vwrq->flags); ++ vwrq->disabled = ((priv->ps_wakeup_cfg & PS_CFG_ENABLE) == (UINT8)0); ++ if (0 != vwrq->disabled) ++ return 0; ++ if ((vwrq->flags & IW_POWER_TYPE) == IW_POWER_TIMEOUT) { ++ vwrq->value = priv->ps_hangover_period * 1000 / 1024; ++ vwrq->flags = IW_POWER_TIMEOUT; ++ } else { ++ vwrq->value = priv->ps_listen_interval * 1000000; ++ vwrq->flags = IW_POWER_PERIOD|IW_POWER_RELATIVE; ++ } ++ if (0 != (priv->ps_options & PS_OPT_STILL_RCV_BCASTS)) ++ vwrq->flags |= IW_POWER_ALL_R; ++ else ++ vwrq->flags |= IW_POWER_UNICAST_R; ++ ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_get_txpow ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_get_txpow(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ ++ vwrq->flags = IW_TXPOW_DBM; ++ vwrq->disabled = (__u8)0; ++ vwrq->fixed = (__u8)0; ++ vwrq->value = priv->tx_level_dbm; ++ ++ acxlog(L_IOCTL, "Get Tx power ==> %d dBm\n", priv->tx_level_dbm); ++ ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_set_txpow ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_set_txpow(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ unsigned long flags; ++ int err; ++ int result = -EINVAL; ++ ++ FN_ENTER; ++ acxlog(L_IOCTL, "Set Tx power <== %d, disabled %d, flags 0x%04x\n", vwrq->value, vwrq->disabled, vwrq->flags); ++ if (0 != (err = acx100_lock(priv, &flags))) { ++ result = err; ++ goto end; ++ } ++ if (vwrq->disabled != priv->tx_disabled) { ++ priv->set_mask |= GETSET_TX; /* Tx status needs update later */ ++ } ++ ++ priv->tx_disabled = vwrq->disabled; ++ if (vwrq->value == -1) { ++ if (0 != vwrq->disabled) { ++ priv->tx_level_dbm = (UINT8)0; ++ acxlog(L_IOCTL, "Disable radio Tx\n"); ++ } else { ++ priv->tx_level_auto = (UINT8)1; ++ acxlog(L_IOCTL, "Set Tx power auto (NIY)\n"); ++ } ++ } else { ++ priv->tx_level_dbm = vwrq->value <= 20 ? vwrq->value : 20; ++ priv->tx_level_auto = (UINT8)0; ++ acxlog(L_IOCTL, "Set Tx power = %d dBm\n", priv->tx_level_dbm); ++ } ++ priv->set_mask |= GETSET_TXPOWER; ++ acx100_unlock(priv, &flags); ++ result = -EINPROGRESS; ++end: ++ FN_EXIT(1, result); ++ return result; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_get_range ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_get_range(struct net_device *dev, struct iw_request_info *info, struct iw_point *dwrq, char *extra) ++{ ++ if (dwrq->pointer != NULL) { ++ struct iw_range *range = (struct iw_range *)extra; ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ UINT16 i; ++ ++ dwrq->length = sizeof(struct iw_range); ++ memset(range, 0, sizeof(struct iw_range)); ++ range->num_channels = 0; ++ for (i = 0; i < 14; i++) ++ if (0 != (priv->reg_dom_chanmask & (1 << i))) ++ { ++ range->freq[range->num_channels].i = i + 1; ++ range->freq[range->num_channels].m = acx100_channel_freq[i] * 100000; ++ range->freq[range->num_channels++].e = 1; /* MHz values */ ++ } ++ range->num_frequency = (__u8)range->num_channels; ++ ++ range->min_rts = 0; ++ range->max_rts = 2312; ++ /* range->min_frag = 256; ++ * range->max_frag = 2312; ++ */ ++ ++ range->encoding_size[0] = 5; ++ range->encoding_size[1] = 13; ++ range->encoding_size[2] = 29; ++ range->num_encoding_sizes = (__u8)3; ++ range->max_encoding_tokens = (__u8)4; ++ ++ range->min_pmp = 0; ++ range->max_pmp = 5000000; ++ range->min_pmt = 0; ++ range->max_pmt = 65535 * 1000; ++ range->pmp_flags = IW_POWER_PERIOD; ++ range->pmt_flags = IW_POWER_TIMEOUT; ++ range->pm_capa = IW_POWER_PERIOD | IW_POWER_TIMEOUT | IW_POWER_ALL_R; ++ ++ for (i = 0; i <= IW_MAX_TXPOWER - 1; i++) ++ range->txpower[i] = 20 * i / (IW_MAX_TXPOWER - 1); ++ range->num_txpower = (__u8)IW_MAX_TXPOWER; ++ range->txpower_capa = IW_TXPOW_DBM; ++ ++ range->we_version_compiled = (__u8)WIRELESS_EXT; ++ range->we_version_source = (__u8)0x9; ++ ++ range->retry_capa = IW_RETRY_LIMIT; ++ range->retry_flags = IW_RETRY_LIMIT; ++ range->min_retry = 1; ++ range->max_retry = 255; ++ ++ range->r_time_flags = IW_RETRY_LIFETIME; ++ range->min_r_time = 0; ++ range->max_r_time = 65535; /* FIXME: lifetime ranges and orders of magnitude are strange?? */ ++ ++ range->sensitivity = 0xff; ++ ++ for (i=0; i < (UINT16)priv->rate_spt_len; i++) { ++ range->bitrate[i] = (priv->rate_support1[i] & ~0x80) * 500000; ++ if (range->bitrate[i] == 0) ++ break; ++ } ++ range->num_bitrates = (__u8)i; ++ ++ range->max_qual.qual = (__u8)100; ++ range->max_qual.level = (__u8)100; ++ range->max_qual.noise = (__u8)100; ++ /* FIXME: better values */ ++ range->avg_qual.qual = (__u8)90; ++ range->avg_qual.level = (__u8)80; ++ range->avg_qual.noise = (__u8)2; ++ } ++ ++ return 0; ++} ++ ++ ++/*================================================================*/ ++/* Private functions */ ++/*================================================================*/ ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_get_iw_priv ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: I added the monitor mode and changed the stuff below to look more like the orinoco driver ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_get_iw_priv(struct iwreq *iwr) ++{ ++ int result = -EINVAL; ++ ++ if (iwr->u.data.pointer != 0) { ++ result = ++ verify_area(VERIFY_WRITE, iwr->u.data.pointer, ++ sizeof(acx100_ioctl_private_args)); ++ if (result != 0) ++ return result; ++ ++ iwr->u.data.length = sizeof(acx100_ioctl_private_args) / sizeof(acx100_ioctl_private_args[0]); ++ if (copy_to_user(iwr->u.data.pointer, acx100_ioctl_private_args, sizeof(acx100_ioctl_private_args)) != ++ 0) ++ result = -EFAULT; ++ } ++ return result; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_get_nick ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_get_nick(struct net_device *dev, struct iw_request_info *info, struct iw_point *dwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ ++ /* FIXME : consider spinlock here */ ++ strcpy(extra, priv->nick); ++ /* FIXME : consider spinlock here */ ++ ++ dwrq->length = strlen(extra)+1; ++ ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_set_nick ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: copied from orinoco.c ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_set_nick(struct net_device *dev, struct iw_request_info *info, struct iw_point *dwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ unsigned long flags; ++ int err; ++ int result = -EINVAL; ++ ++ FN_ENTER; ++ ++ if (0 != (err = acx100_lock(priv, &flags))) { ++ result = err; ++ goto end; ++ } ++ ++ if(dwrq->length > IW_ESSID_MAX_SIZE + 1) { ++ result = -E2BIG; ++ goto end_unlock; ++ } ++ ++ /* extra includes trailing \0, so it's ok */ ++ strcpy(priv->nick, extra); ++ result = 0; ++ ++end_unlock: ++ acx100_unlock(priv, &flags); ++end: ++ FN_EXIT(1, result); ++ return result; ++} ++ ++/*------------------------------------------------------------------------------ ++ * acx100_ioctl_get_retry ++ * ++ * Arguments: ++ * ++ * Returns: ++ * ++ * Side effects: ++ * ++ * Call context: ++ * ++ * STATUS: NEW ++ * ++ * Comment: ++ * ++ *----------------------------------------------------------------------------*/ ++static inline int acx100_ioctl_get_retry(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *)dev->priv; ++ __u16 type = vwrq->flags & IW_RETRY_TYPE; ++ __u16 modifier = vwrq->flags & IW_RETRY_MODIFIER; ++ unsigned long flags; ++ int err; ++ int result = -EINVAL; ++ ++ if (0 != (err = acx100_lock(priv, &flags))) { ++ result = err; ++ goto end; ++ } ++ /* return the short retry number by default */ ++ if (type == IW_RETRY_LIFETIME) { ++ vwrq->flags = IW_RETRY_LIFETIME; ++ vwrq->value = priv->msdu_lifetime; ++ } else if (modifier == IW_RETRY_MAX) { ++ vwrq->flags = IW_RETRY_LIMIT | IW_RETRY_MAX; ++ vwrq->value = priv->long_retry; ++ } else { ++ vwrq->flags = IW_RETRY_LIMIT; ++ if (priv->long_retry != priv->short_retry) ++ vwrq->flags |= IW_RETRY_MIN; ++ vwrq->value = priv->short_retry; ++ } ++ acx100_unlock(priv, &flags); ++ /* can't be disabled */ ++ vwrq->disabled = (__u8)0; ++ result = 0; ++ ++end: ++ return result; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_set_retry ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_set_retry(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *)dev->priv; ++ unsigned long flags; ++ int err; ++ int result = -EINVAL; ++ ++ FN_ENTER; ++ if (!vwrq) { ++ result = -EFAULT; ++ goto end; ++ } ++ if ((__u8)0 != vwrq->disabled) { ++ result = -EINVAL; ++ goto end; ++ } ++ if (0 != (err = acx100_lock(priv, &flags))) { ++ result = err; ++ goto end; ++ } ++ if (IW_RETRY_LIMIT == (vwrq->flags & IW_RETRY_TYPE)) { ++ (void)printk("current retry limits: short %ld long %ld\n", priv->short_retry, priv->long_retry); ++ if (0 != (vwrq->flags & IW_RETRY_MAX)) { ++ priv->long_retry = vwrq->value; ++ } else if (0 != (vwrq->flags & IW_RETRY_MIN)) { ++ priv->short_retry = vwrq->value; ++ } else { ++ /* no modifier: set both */ ++ priv->long_retry = vwrq->value; ++ priv->short_retry = vwrq->value; ++ } ++ (void)printk("new retry limits: short %ld long %ld\n", priv->short_retry, priv->long_retry); ++ priv->set_mask |= GETSET_RETRY; ++ result = -EINPROGRESS; ++ } ++ else ++ if (0 != (vwrq->flags & IW_RETRY_LIFETIME)) { ++ priv->msdu_lifetime = vwrq->value; ++ (void)printk("new MSDU lifetime: %d\n", priv->msdu_lifetime); ++ priv->set_mask |= SET_MSDU_LIFETIME; ++ result = -EINPROGRESS; ++ } ++ acx100_unlock(priv, &flags); ++end: ++ FN_EXIT(1, result); ++ return result; ++} ++ ++ ++/******************************* private ioctls ******************************/ ++ ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_set_debug ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++#ifdef ACX_DEBUG ++static inline int acx100_ioctl_set_debug(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, char *extra) ++{ ++ int debug_new = *((int *)extra); ++ int result = -EINVAL; ++ ++ acxlog(L_STD, "%s: setting debug from 0x%04X to 0x%04X\n", __func__, ++ debug, debug_new); ++ debug = debug_new; ++ ++ result = 0; ++ return result; ++ ++} ++#endif ++ ++static unsigned char reg_domain_ids[] = {0x10, 0x20, 0x30, 0x31, 0x32, 0x40, 0x41, 0x51}; ++ ++static char *reg_domain_strings[] = ++{ "FCC (USA) (1-11)", ++ "DOC/IC (Canada) (1-11)", ++ /* BTW: WLAN use in ETSI is regulated by ++ * ETSI standard EN 300 328-2 V1.1.2 */ ++ "ETSI (Europe) (1-13)", ++ "Spain (10-11)", ++ "France (10-13)", ++ "MKK (Japan) (14)", ++ "MKK1 (1-14)", ++ "Israel? (new!) (4?-8?) (not all firmware versions)", ++ NULL /* needs to remain as last entry */ ++}; ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_list_reg_domain ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_list_reg_domain(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra) ++{ ++ int i; ++ char **entry; ++ ++ (void)printk("Domain/Country Channels Setting\n"); ++ for (i = 0, entry = reg_domain_strings; *entry; i++, entry++) ++ (void)printk("%s %d\n", *entry, i+1); ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_set_reg_domain ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_set_reg_domain(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ unsigned long flags; ++ int err; ++ int result = -EINVAL; ++ ++ FN_ENTER; ++ if (0 != (err = acx100_lock(priv, &flags))) { ++ result = err; ++ goto end; ++ } ++ ++ if ((*extra < 1) || ((size_t)*extra > sizeof(reg_domain_ids))) { ++ result = -EINVAL; ++ goto end_unlock; ++ } ++ priv->reg_dom_id = reg_domain_ids[*extra - 1]; ++ priv->set_mask |= GETSET_REG_DOMAIN; ++ result = -EINPROGRESS; ++ ++end_unlock: ++ acx100_unlock(priv, &flags); ++end: ++ FN_EXIT(1, result); ++ return result; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_get_reg_domain ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_get_reg_domain(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ int i; ++ ++ for (i=1; i <= 7; i++) ++ if (reg_domain_ids[i-1] == priv->reg_dom_id) ++ { ++ acxlog(L_STD, "regulatory domain is currently set to %d (0x%x): %s\n", i, priv->reg_dom_id, reg_domain_strings[i-1]); ++ *extra = i; ++ break; ++ } ++ ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_set_short_preamble ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_set_short_preamble(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *)dev->priv; ++ char *descr = NULL; ++ ++ if ((*extra < (char)0) || (*extra > (char)2)) ++ return -EINVAL; ++ ++ priv->preamble_mode = (UINT8)*extra; ++ switch (*extra) { ++ case 0: ++ descr = "off"; ++ priv->preamble_flag = (UINT8)0; ++ break; ++ case 1: ++ descr = "on"; ++ priv->preamble_flag = (UINT8)1; ++ break; ++ case 2: ++ descr = "auto (peer capability dependent)"; ++ ++ /* associated to a station? */ ++ if ((UINT8)0x0 != priv->station_assoc.bssid[0]) ++ priv->preamble_flag = (UINT8)((priv->station_assoc.caps & IEEE802_11_MGMT_CAP_SHORT_PRE) == IEEE802_11_MGMT_CAP_SHORT_PRE); ++ break; ++ default: ++ descr = "unknown mode, error"; ++ break; ++ } ++ (void)printk("new Short Preamble setting: %s\n", descr); ++ ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_get_short_preamble ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_get_short_preamble(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *)dev->priv; ++ char *descr = NULL; ++ ++ switch(priv->preamble_mode) { ++ case 0: ++ descr = "off"; ++ break; ++ case 1: ++ descr = "on"; ++ break; ++ case 2: ++ descr = "auto (peer capability dependent)"; ++ break; ++ default: ++ descr = "unknown mode, error"; ++ break; ++ } ++ (void)printk("current Short Preamble setting: %s\n", descr); ++ ++ *extra = (char)priv->preamble_mode; ++ ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_set_antenna ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: TX and RX antenna can be set separately but this function good ++* for testing 0-4 bits ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_set_antenna(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ ++ (void)printk("current antenna value: 0x%02X\n", priv->antenna); ++ (void)printk("Rx antenna selection seems to be bit 6 (0x40)\n"); ++ (void)printk("Tx antenna selection seems to be bit 5 (0x20)\n"); ++ priv->antenna = (UINT8)*extra; ++ (void)printk("new antenna value: 0x%02X\n", priv->antenna); ++ priv->set_mask |= GETSET_ANTENNA; ++ ++ return -EINPROGRESS; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_get_antenna ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_get_antenna(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ ++ (void)printk("current antenna value: 0x%02X\n", priv->antenna); ++ (void)printk("Rx antenna selection seems to be bit 6 (0x40)\n"); ++ (void)printk("Tx antenna selection seems to be bit 5 (0x20)\n"); ++ ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_set_rx_antenna ++* ++* ++* Arguments: 0 = antenna1; 1 = antenna2; ++* / 2 and 3 = diversity? - need test / ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: Could anybody test which antenna is the external one ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_set_rx_antenna(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ unsigned long flags; ++ int err; ++ int result = -EINVAL; ++ ++ FN_ENTER; ++ (void)printk("current antenna value: 0x%02X\n", priv->antenna); ++ /* better keep the separate operations atomic */ ++ if (0 != (err = acx100_lock(priv, &flags))) { ++ result = err; ++ goto end; ++ } ++ priv->antenna &= 0x3f; ++ priv->antenna |= (*extra << 6); ++ priv->set_mask |= GETSET_ANTENNA; ++ acx100_unlock(priv, &flags); ++ (void)printk("new antenna value: 0x%02X\n", priv->antenna); ++ result = -EINPROGRESS; ++ ++end: ++ FN_EXIT(1, result); ++ return result; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_set_tx_antenna ++* ++* ++* Arguments: 0 = antenna1; 1 = antenna2; ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: Could anybody test which antenna is the external one ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_set_tx_antenna(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ unsigned long flags; ++ int err; ++ int result = -EINVAL; ++ ++ FN_ENTER; ++ (void)printk("current antenna value: 0x%02X\n", priv->antenna); ++ /* better keep the separate operations atomic */ ++ if (0 != (err = acx100_lock(priv, &flags))) { ++ result = err; ++ goto end; ++ } ++ priv->antenna &= 0xdf; ++ priv->antenna |= ((*extra &= 0x01) << 5); ++ priv->set_mask |= GETSET_ANTENNA; ++ acx100_unlock(priv, &flags); ++ (void)printk("new antenna value: 0x%02X\n", priv->antenna); ++ result = -EINPROGRESS; ++ ++end: ++ FN_EXIT(1, result); ++ return result; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_wlansniff ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_wlansniff(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ int *parms = (int*)extra; ++ int enable = (int)(parms[0] > 0); ++ unsigned long flags; ++ int err; ++ int result = -EINVAL; ++ ++ FN_ENTER; ++ ++ if (0 != (err = acx100_lock(priv, &flags))) { ++ result = err; ++ goto end; ++ } ++ ++ priv->monitor = parms[0]; ++ /* not using printk() here, since it distorts kismet display ++ * when printk messages activated */ ++ acxlog(L_IOCTL, "setting monitor to: 0x%02X\n", priv->monitor); ++ ++ switch (parms[0]) ++ { ++ case 0: ++ priv->netdev->type = ARPHRD_ETHER; ++ break; ++ case 1: ++ priv->netdev->type = ARPHRD_IEEE80211_PRISM; ++ break; ++ case 2: ++ priv->netdev->type = ARPHRD_IEEE80211; ++ break; ++ } ++ ++ if (0 != priv->monitor) ++ priv->monitor_setting = 0x02; /* don't decrypt default key only, override decryption mechanism */ ++ else ++ priv->monitor_setting = 0x00; /* don't decrypt default key only, don't override decryption */ ++ ++ priv->set_mask |= SET_RXCONFIG | SET_WEP_OPTIONS; ++ ++ if (0 != enable) ++ { ++ priv->channel = parms[1]; ++ priv->set_mask |= GETSET_RX; ++ } ++ acx100_unlock(priv, &flags); ++ result = -EINPROGRESS; ++ ++end: ++ FN_EXIT(1, result); ++ return result; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_unknown11 ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_unknown11(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ unsigned long flags; ++ client_t client; ++ int err; ++ int result = -EINVAL; ++ ++ if (0 != (err = acx100_lock(priv, &flags))) { ++ result = err; ++ goto end; ++ } ++ acx100_transmit_disassoc(&client, priv); ++ acx100_unlock(priv, &flags); ++ result = 0; ++ ++end: ++ return result; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_set_ed_threshold ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_set_ed_threshold(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *)dev->priv; ++ ++ (void)printk("current ED threshold value: %d\n", priv->ed_threshold); ++ priv->ed_threshold = (unsigned char)*extra; ++ (void)printk("new ED threshold value: %d\n", (unsigned char)*extra); ++ priv->set_mask |= GETSET_ED_THRESH; ++ ++ return -EINPROGRESS; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_ioctl_set_cca ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++static inline int acx100_ioctl_set_cca(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *)dev->priv; ++ unsigned long flags; ++ int err; ++ int result = -EINVAL; ++ ++ if (0 != (err = acx100_lock(priv, &flags))) { ++ result = err; ++ goto end; ++ } ++ ++ (void)printk("current CCA value: 0x%02X\n", priv->cca); ++ priv->cca = (unsigned char)*extra; ++ (void)printk("new CCA value: 0x%02X\n", (unsigned char)*extra); ++ priv->set_mask |= GETSET_CCA; ++ acx100_unlock(priv, &flags); ++ result = -EINPROGRESS; ++ ++end: ++ return result; ++} ++ ++static inline int acx100_ioctl_set_led_power(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra) ++{ ++ wlandevice_t *priv = (wlandevice_t *)dev->priv; ++ unsigned long flags; ++ int err; ++ int result = -EINVAL; ++ ++ if (0 != (err = acx100_lock(priv, &flags))) { ++ result = err; ++ goto end; ++ } ++ (void)printk("current power LED status: %d\n", priv->led_power); ++ priv->led_power = (unsigned char)*extra; ++ (void)printk("new power LED status: %d\n", (unsigned char)*extra); ++ priv->set_mask |= GETSET_LED_POWER; ++ ++ acx100_unlock(priv, &flags); ++ result = -EINPROGRESS; ++ ++end: ++ return result; ++} ++ ++#if WIRELESS_EXT >= 13 ++#warning "(NOT a warning!) Compile info: choosing to use code infrastructure for NEWER wireless extension interface version (>= 13)" ++static const iw_handler acx100_ioctl_handler[] = ++{ ++ (iw_handler) acx100_ioctl_commit, /* SIOCSIWCOMMIT */ ++ (iw_handler) acx100_ioctl_get_name, /* SIOCGIWNAME */ ++ (iw_handler) NULL, /* SIOCSIWNWID */ ++ (iw_handler) NULL, /* SIOCGIWNWID */ ++ (iw_handler) acx100_ioctl_set_freq, /* SIOCSIWFREQ */ ++ (iw_handler) acx100_ioctl_get_freq, /* SIOCGIWFREQ */ ++ (iw_handler) acx100_ioctl_set_mode, /* SIOCSIWMODE */ ++ (iw_handler) acx100_ioctl_get_mode, /* SIOCGIWMODE */ ++ (iw_handler) acx100_ioctl_set_sens, /* SIOCSIWSENS */ ++ (iw_handler) acx100_ioctl_get_sens, /* SIOCGIWSENS */ ++ (iw_handler) NULL, /* SIOCSIWRANGE */ ++ (iw_handler) acx100_ioctl_get_range, /* SIOCGIWRANGE */ ++ (iw_handler) NULL, /* SIOCSIWPRIV */ ++ (iw_handler) NULL, /* SIOCGIWPRIV */ ++ (iw_handler) NULL, /* SIOCSIWSTATS */ ++ (iw_handler) NULL, /* SIOCGIWSTATS */ ++#if IW_HANDLER_VERSION > 4 ++ iw_handler_set_spy, /* SIOCSIWSPY */ ++ iw_handler_get_spy, /* SIOCGIWSPY */ ++ iw_handler_set_thrspy, /* SIOCSIWTHRSPY */ ++ iw_handler_get_thrspy, /* SIOCGIWTHRSPY */ ++#else /* IW_HANDLER_VERSION > 4 */ ++#ifdef WIRELESS_SPY ++ (iw_handler) NULL /* acx100_ioctl_set_spy */, /* SIOCSIWSPY */ ++ (iw_handler) NULL /* acx100_ioctl_get_spy */, /* SIOCGIWSPY */ ++#else /* WSPY */ ++ (iw_handler) NULL, /* SIOCSIWSPY */ ++ (iw_handler) NULL, /* SIOCGIWSPY */ ++#endif /* WSPY */ ++ (iw_handler) NULL, /* [nothing] */ ++ (iw_handler) NULL, /* [nothing] */ ++#endif /* IW_HANDLER_VERSION > 4 */ ++ (iw_handler) acx100_ioctl_set_ap, /* SIOCSIWAP */ ++ (iw_handler) acx100_ioctl_get_ap, /* SIOCGIWAP */ ++ (iw_handler) NULL, /* [nothing] */ ++ (iw_handler) acx100_ioctl_get_aplist, /* SIOCGIWAPLIST */ ++#if WIRELESS_EXT > 13 ++ (iw_handler) acx100_ioctl_set_scan, /* SIOCSIWSCAN */ ++ (iw_handler) acx100_ioctl_get_scan, /* SIOCGIWSCAN */ ++#else /* WE > 13 */ ++ (iw_handler) NULL, /* SIOCSIWSCAN */ ++ (iw_handler) NULL, /* SIOCGIWSCAN */ ++#endif /* WE > 13 */ ++ (iw_handler) acx100_ioctl_set_essid, /* SIOCSIWESSID */ ++ (iw_handler) acx100_ioctl_get_essid, /* SIOCGIWESSID */ ++ (iw_handler) acx100_ioctl_set_nick, /* SIOCSIWNICKN */ ++ (iw_handler) acx100_ioctl_get_nick, /* SIOCGIWNICKN */ ++ (iw_handler) NULL, /* [nothing] */ ++ (iw_handler) NULL, /* [nothing] */ ++ (iw_handler) acx100_ioctl_set_rate, /* SIOCSIWRATE */ ++ (iw_handler) acx100_ioctl_get_rate, /* SIOCGIWRATE */ ++ (iw_handler) acx100_ioctl_set_rts, /* SIOCSIWRTS */ ++ (iw_handler) acx100_ioctl_get_rts, /* SIOCGIWRTS */ ++ (iw_handler) NULL /* acx100_ioctl_set_frag FIXME */, /* SIOCSIWFRAG */ ++ (iw_handler) NULL /* acx100_ioctl_get_frag FIXME */, /* SIOCGIWFRAG */ ++ (iw_handler) acx100_ioctl_set_txpow, /* SIOCSIWTXPOW */ ++ (iw_handler) acx100_ioctl_get_txpow, /* SIOCGIWTXPOW */ ++ (iw_handler) acx100_ioctl_set_retry, /* SIOCSIWRETRY */ ++ (iw_handler) acx100_ioctl_get_retry, /* SIOCGIWRETRY */ ++ (iw_handler) acx100_ioctl_set_encode, /* SIOCSIWENCODE */ ++ (iw_handler) acx100_ioctl_get_encode, /* SIOCGIWENCODE */ ++ (iw_handler) acx100_ioctl_set_power, /* SIOCSIWPOWER */ ++ (iw_handler) acx100_ioctl_get_power, /* SIOCGIWPOWER */ ++}; ++ ++static const iw_handler acx100_ioctl_private_handler[] = ++{ ++#ifdef ACX_DEBUG ++ (iw_handler) acx100_ioctl_set_debug, /* SIOCIWFIRSTPRIV */ ++#else ++ (iw_handler) NULL, ++#endif ++ (iw_handler) acx100_ioctl_list_reg_domain, ++ (iw_handler) acx100_ioctl_set_reg_domain, ++ (iw_handler) acx100_ioctl_get_reg_domain, ++ (iw_handler) acx100_ioctl_set_short_preamble, ++ (iw_handler) acx100_ioctl_get_short_preamble, ++ (iw_handler) acx100_ioctl_set_antenna, ++ (iw_handler) acx100_ioctl_get_antenna, ++ (iw_handler) acx100_ioctl_set_rx_antenna, ++ (iw_handler) acx100_ioctl_set_tx_antenna, ++ (iw_handler) acx100_ioctl_set_ed_threshold, ++ (iw_handler) acx100_ioctl_set_cca, ++ (iw_handler) acx100_ioctl_set_led_power, ++ (iw_handler) acx100_ioctl_wlansniff, ++ (iw_handler) acx100_ioctl_unknown11 ++}; ++ ++const struct iw_handler_def acx100_ioctl_handler_def = ++{ ++ .num_standard = sizeof(acx100_ioctl_handler)/sizeof(iw_handler), ++ .num_private = sizeof(acx100_ioctl_private_handler)/sizeof(iw_handler), ++ .num_private_args = sizeof(acx100_ioctl_private_args)/sizeof(struct iw_priv_args), ++ .standard = (iw_handler *) acx100_ioctl_handler, ++ .private = (iw_handler *) acx100_ioctl_private_handler, ++ .private_args = (struct iw_priv_args *) acx100_ioctl_private_args, ++#if WIRELESS_EXT > 15 ++ .spy_offset = 0 /* FIXME */, ++#endif /* WE > 15 */ ++}; ++ ++#endif /* WE > 12 */ ++ ++ ++ ++#if WIRELESS_EXT < 13 ++/*================================================================*/ ++/* Main function */ ++/*================================================================*/ ++/*---------------------------------------------------------------- ++* acx_ioctl_old ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* This is the *OLD* ioctl handler. ++* Make sure to not only place your additions here, but instead mainly ++* in the new one (acx100_ioctl_handler[])! ++* ++*----------------------------------------------------------------*/ ++int acx_ioctl_old(netdevice_t *dev, struct ifreq *ifr, int cmd) ++{ ++ wlandevice_t *priv = (wlandevice_t *)dev->priv; ++ int result = 0; ++#if WIRELESS_EXT < 13 ++ struct iwreq *iwr = (struct iwreq *)ifr; ++#endif ++ ++ acxlog(L_IOCTL, "%s cmd = 0x%04X\n", __func__, cmd); ++ ++ /* This is the way it is done in the orinoco driver. ++ * Check to see if device is present. ++ */ ++ if (0 == netif_device_present(dev)) ++ { ++ return -ENODEV; ++ } ++ ++ switch (cmd) { ++/* WE 13 and higher will use acx100_ioctl_handler_def */ ++#if WIRELESS_EXT < 13 ++#warning "(NOT a warning!) Compile info: choosing to use code infrastructure for OLDER wireless extension interface version (< 13)" ++#warning "This support is not perfectly tested, please report any problems! Upgrading to relatively current Linux kernel package recommended (will also fix some security issues which older ones have)" ++ case SIOCGIWNAME: ++ /* get name == wireless protocol */ ++ result = acx100_ioctl_get_name(dev, NULL, ++ (char *)&(iwr->u.name), NULL); ++ break; ++ ++ case SIOCSIWNWID: /* pre-802.11, */ ++ case SIOCGIWNWID: /* not supported. */ ++ result = -EOPNOTSUPP; ++ break; ++ ++ case SIOCSIWFREQ: ++ /* set channel/frequency (Hz) ++ data can be frequency or channel : ++ 0-1000 = channel ++ > 1000 = frequency in Hz */ ++ result = acx100_ioctl_set_freq(dev, NULL, &(iwr->u.freq), NULL); ++ break; ++ ++ case SIOCGIWFREQ: ++ /* get channel/frequency (Hz) */ ++ result = acx100_ioctl_get_freq(dev, NULL, &(iwr->u.freq), NULL); ++ break; ++ ++ case SIOCSIWMODE: ++ /* set operation mode */ ++ result = acx100_ioctl_set_mode(dev, NULL, &(iwr->u.mode), NULL); ++ break; ++ ++ case SIOCGIWMODE: ++ /* get operation mode */ ++ result = acx100_ioctl_get_mode(dev, NULL, &(iwr->u.mode), NULL); ++ break; ++ ++ case SIOCSIWSENS: ++ /* Set sensitivity */ ++ result = acx100_ioctl_set_sens(dev, NULL, &(iwr->u.sens), NULL); ++ break; ++ ++ case SIOCGIWSENS: ++ /* Get sensitivity */ ++ result = acx100_ioctl_get_sens(dev, NULL, &(iwr->u.sens), NULL); ++ break; ++ ++#if WIRELESS_EXT > 10 ++ case SIOCGIWRANGE: ++ /* Get range of parameters */ ++ { ++ struct iw_range range; ++ result = acx100_ioctl_get_range(dev, NULL, ++ &(iwr->u.data), (char *)&range); ++ if (copy_to_user(iwr->u.data.pointer, &range, ++ sizeof(struct iw_range))) ++ result = -EFAULT; ++ } ++ break; ++#endif ++ ++ case SIOCGIWPRIV: ++ result = acx100_ioctl_get_iw_priv(iwr); ++ break; ++ ++ /* case SIOCSIWSPY: FIXME */ ++ /* case SIOCGIWSPY: FIXME */ ++ /* case SIOCSIWTHRSPY: FIXME */ ++ /* case SIOCGIWTHRSPY: FIXME */ ++ ++ case SIOCSIWAP: ++ /* set access point by MAC address */ ++ result = acx100_ioctl_set_ap(dev, NULL, &(iwr->u.ap_addr), ++ NULL); ++ break; ++ ++ case SIOCGIWAP: ++ /* get access point MAC address */ ++ result = acx100_ioctl_get_ap(dev, NULL, &(iwr->u.ap_addr), ++ NULL); ++ break; ++ ++ case SIOCGIWAPLIST: ++ /* get list of access points in range */ ++ result = acx100_ioctl_get_aplist(dev, NULL, &(iwr->u.data), ++ NULL); ++ break; ++ ++#if NOT_FINISHED_YET ++ case SIOCSIWSCAN: ++ /* start a station scan */ ++ result = acx100_ioctl_set_scan(iwr, priv); ++ break; ++ ++ case SIOCGIWSCAN: ++ /* get list of stations found during scan */ ++ result = acx100_ioctl_get_scan(iwr, priv); ++ break; ++#endif ++ ++ case SIOCSIWESSID: ++ /* set ESSID (network name) */ ++ { ++ char essid[IW_ESSID_MAX_SIZE+1]; ++ ++ if (iwr->u.essid.length > IW_ESSID_MAX_SIZE) ++ { ++ result = -E2BIG; ++ break; ++ } ++ if (copy_from_user(essid, iwr->u.essid.pointer, ++ iwr->u.essid.length)) ++ { ++ result = -EFAULT; ++ break; ++ } ++ result = acx100_ioctl_set_essid(dev, NULL, ++ &(iwr->u.essid), essid); ++ } ++ break; ++ ++ case SIOCGIWESSID: ++ /* get ESSID */ ++ { ++ char essid[IW_ESSID_MAX_SIZE+1]; ++ if (iwr->u.essid.pointer) ++ result = acx100_ioctl_get_essid(dev, NULL, ++ &(iwr->u.essid), essid); ++ if (copy_to_user(iwr->u.essid.pointer, essid, ++ iwr->u.essid.length)) ++ result = -EFAULT; ++ } ++ break; ++ ++ case SIOCSIWNICKN: ++ /* set nick */ ++ { ++ char nick[IW_ESSID_MAX_SIZE+1]; ++ ++ if (iwr->u.data.length > IW_ESSID_MAX_SIZE) ++ { ++ result = -E2BIG; ++ break; ++ } ++ if (copy_from_user(nick, iwr->u.data.pointer, ++ iwr->u.data.length)) ++ { ++ result = -EFAULT; ++ break; ++ } ++ result = acx100_ioctl_set_nick(dev, NULL, ++ &(iwr->u.data), nick); ++ } ++ break; ++ ++ case SIOCGIWNICKN: ++ /* get nick */ ++ { ++ char nick[IW_ESSID_MAX_SIZE+1]; ++ if (iwr->u.data.pointer) ++ result = acx100_ioctl_get_nick(dev, NULL, ++ &(iwr->u.data), nick); ++ if (copy_to_user(iwr->u.data.pointer, nick, ++ iwr->u.data.length)) ++ result = -EFAULT; ++ } ++ break; ++ ++ case SIOCSIWRATE: ++ /* set default bit rate (bps) */ ++ result = acx100_ioctl_set_rate(dev, NULL, &(iwr->u.bitrate), ++ NULL); ++ break; ++ ++ case SIOCGIWRATE: ++ /* get default bit rate (bps) */ ++ result = acx100_ioctl_get_rate(dev, NULL, &(iwr->u.bitrate), ++ NULL); ++ break; ++ ++ case SIOCSIWRTS: ++ /* set RTS threshold value */ ++ result = acx100_ioctl_set_rts(dev, NULL, &(iwr->u.rts), NULL); ++ break; ++ case SIOCGIWRTS: ++ /* get RTS threshold value */ ++ result = acx100_ioctl_get_rts(dev, NULL, &(iwr->u.rts), NULL); ++ break; ++ ++ /* case SIOCSIWFRAG: FIXME */ ++ /* case SIOCGIWFRAG: FIXME */ ++ ++#if WIRELESS_EXT > 9 ++ case SIOCGIWTXPOW: ++ /* get tx power */ ++ result = acx100_ioctl_get_txpow(dev, NULL, &(iwr->u.txpower), ++ NULL); ++ break; ++ ++ case SIOCSIWTXPOW: ++ /* set tx power */ ++ result = acx100_ioctl_set_txpow(dev, NULL, &(iwr->u.txpower), ++ NULL); ++ break; ++#endif ++ ++ case SIOCSIWRETRY: ++ result = acx100_ioctl_set_retry(dev, NULL, &(iwr->u.retry), NULL); ++ break; ++ ++ case SIOCGIWRETRY: ++ result = acx100_ioctl_get_retry(dev, NULL, &(iwr->u.retry), NULL); ++ break; ++ ++ case SIOCSIWENCODE: ++ { ++ /* set encoding token & mode */ ++ UINT8 key[29]; ++ if (iwr->u.encoding.pointer) { ++ if (iwr->u.encoding.length > 29) { ++ result = -E2BIG; ++ break; ++ } ++ if (copy_from_user(key, iwr->u.encoding.pointer, iwr->u.encoding.length)) { ++ result = -EFAULT; ++ break; ++ } ++ } ++ else ++ if (0 != iwr->u.encoding.length) { ++ result = -EINVAL; ++ break; ++ } ++ result = acx100_ioctl_set_encode(dev, NULL, ++ &(iwr->u.encoding), key); ++ } ++ break; ++ ++ case SIOCGIWENCODE: ++ { ++ /* get encoding token & mode */ ++ UINT8 key[29]; ++ ++ result = acx100_ioctl_get_encode(dev, NULL, ++ &(iwr->u.encoding), key); ++ if (iwr->u.encoding.pointer) { ++ if (copy_to_user(iwr->u.encoding.pointer, ++ key, iwr->u.encoding.length)) ++ result = -EFAULT; ++ } ++ } ++ break; ++ ++ /******************** iwpriv ioctls below ********************/ ++#ifdef ACX_DEBUG ++ case ACX100_IOCTL_DEBUG: ++ acx100_ioctl_set_debug(dev, NULL, NULL, iwr->u.name); ++ break; ++#endif ++ ++ case ACX100_IOCTL_LIST_DOM: ++ acx100_ioctl_list_reg_domain(dev, NULL, NULL, NULL); ++ break; ++ ++ case ACX100_IOCTL_SET_DOM: ++ acx100_ioctl_set_reg_domain(dev, NULL, NULL, iwr->u.name); ++ break; ++ ++ case ACX100_IOCTL_GET_DOM: ++ acx100_ioctl_get_reg_domain(dev, NULL, NULL, iwr->u.name); ++ break; ++ ++ case ACX100_IOCTL_SET_PREAMB: ++ acx100_ioctl_set_short_preamble(dev, NULL, NULL, iwr->u.name); ++ break; ++ ++ case ACX100_IOCTL_GET_PREAMB: ++ acx100_ioctl_get_short_preamble(dev, NULL, NULL, iwr->u.name); ++ break; ++ ++ case ACX100_IOCTL_SET_ANT: ++ acx100_ioctl_set_antenna(dev, NULL, NULL, iwr->u.name); ++ break; ++ ++ case ACX100_IOCTL_GET_ANT: ++ acx100_ioctl_get_antenna(dev, NULL, NULL, NULL); ++ break; ++ ++ case ACX100_IOCTL_SET_ED: ++ acx100_ioctl_set_ed_threshold(dev, NULL, NULL, iwr->u.name); ++ break; ++ ++ case ACX100_IOCTL_SET_CCA: ++ acx100_ioctl_set_cca(dev, NULL, NULL, iwr->u.name); ++ break; ++ ++ case ACX100_IOCTL_SET_PLED: ++ acx100_ioctl_set_led_power(dev, NULL, NULL, iwr->u.name); ++ break; ++ ++ case ACX100_IOCTL_MONITOR: /* set sniff (monitor) mode */ ++ acxlog(L_IOCTL, "%s: IWPRIV monitor\n", dev->name); ++ ++ /* can only be done by admin */ ++ if (!capable(CAP_NET_ADMIN)) { ++ result = -EPERM; ++ break; ++ } ++ result = acx100_ioctl_wlansniff(dev, NULL, NULL, iwr->u.name); ++ break; ++ ++ case ACX100_IOCTL_RX_ANT: ++ acx100_ioctl_set_rx_antenna(dev, NULL, NULL, iwr->u.name); ++ break; ++ ++ case ACX100_IOCTL_TX_ANT: ++ acx100_ioctl_set_tx_antenna(dev, NULL, NULL, iwr->u.name); ++ break; ++ ++ case ACX100_IOCTL_TEST: ++ acx100_ioctl_unknown11(dev, NULL, NULL, NULL); ++ break; ++#endif ++ ++ default: ++ acxlog(L_IOCTL, "wireless ioctl 0x%04X queried but not implemented yet!\n", cmd); ++ result = -EOPNOTSUPP; ++ break; ++ } ++ ++ if ((0 != (priv->dev_state_mask & ACX_STATE_IFACE_UP)) ++ && (0 != priv->set_mask)) ++ acx100_update_card_settings(priv, 0, 0, 0); ++ ++#if WIRELESS_EXT < 13 ++ /* older WEs don't have a commit handler, ++ * so we need to fix return code in this case */ ++ if (-EINPROGRESS == result) ++ result = 0; ++#endif ++ ++ return result; ++} ++#endif +diff -urN x/drivers/net/wireless/acx/acx100_usb.c y/drivers/net/wireless/acx/acx100_usb.c +--- x/drivers/net/wireless/acx/acx100_usb.c 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/acx/acx100_usb.c 2004-04-14 04:02:51.000000000 +1000 +@@ -0,0 +1,1831 @@ ++/* - USB main module functions ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Copyright (C) 2003 ACX100 Open Source Project ++ * ++ * The contents of this file are subject to the Mozilla Public ++ * License Version 1.1 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS ++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or ++ * implied. See the License for the specific language governing ++ * rights and limitations under the License. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU Public License version 2 (the "GPL"), in which ++ * case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use ++ * your version of this file under the MPL, indicate your decision ++ * by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL. If you do not delete ++ * the provisions above, a recipient may use your version of this ++ * file under either the MPL or the GPL. ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Inquiries regarding the ACX100 Open Source Project can be ++ * made directly to: ++ * ++ * acx100-users@lists.sf.net ++ * http://acx100.sf.net ++ * ++ * -------------------------------------------------------------------- ++ * USB support for TI ACX100 based devices. Many parts are taken from ++ * the PCI driver. ++ * ++ * Authors: ++ * Martin Wawro ++ * Andreas Mohr ++ * ++ * Issues: ++ * - Note that this driver relies on a native little-endian byteformat ++ * at some points ++ * ++ * ++*/ ++ ++/* ------------------------------------------------------------------------- ++** Linux Kernel Header Files ++** ---------------------------------------------------------------------- */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/* ------------------------------------------------------------------------- ++** Project Header Files ++** ---------------------------------------------------------------------- */ ++ ++/* FIXME: integrate nicely into src/Makefile at the time it is clear which ++ * other source files from the PCI / CardBus driver have to be linked with this ++ * one and therefore _also_ need this define - until then this hack is ok */ ++#undef WLAN_HOSTIF ++#define WLAN_HOSTIF WLAN_USB ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/* try to make it compile for both 2.4.x and 2.6.x kernels */ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 0) ++ ++/* number of endpoints of an interface */ ++#define NUM_EP(intf) (intf)->altsetting[0].desc.bNumEndpoints ++#define EP(intf,nr) (intf)->altsetting[0].endpoint[(nr)].desc ++#define GET_DEV(udev) usb_get_dev((udev)) ++#define PUT_DEV(udev) usb_put_dev((udev)) ++#define SET_NETDEV_OWNER(ndev,owner) /* not needed anymore ??? */ ++ ++#define ASYNC_UNLINK URB_ASYNC_UNLINK ++ ++/* For GFP_KERNEL vs. GFP_ATOMIC, see ++ * http://groups.google.de/groups?th=6cd2e5f77e799a23&seekm=linux.scsi.OF9C38FD78.07E54601-ON87256C24.0056B509%40boulder.ibm.com ++ * Basically GFP_KERNEL waits until an alloc succeeds, while ++ * GFP_ATOMIC should be used in situations where we need to know ++ * the result immediately, since we cannot wait (in case we're within lock ++ * or so) */ ++static inline int submit_urb(struct urb *urb, int mem_flags) { ++ return usb_submit_urb(urb, mem_flags); ++} ++static inline struct urb *alloc_urb(int iso_pk, int mem_flags) { ++ return usb_alloc_urb(iso_pk, mem_flags); ++} ++ ++#else ++ ++/* 2.4.x kernels */ ++#define USB_24 1 ++ ++#define NUM_EP(intf) (intf)->altsetting[0].bNumEndpoints ++#define EP(intf,nr) (intf)->altsetting[0].endpoint[(nr)] ++ ++#define GET_DEV(udev) usb_inc_dev_use((udev)) ++#define PUT_DEV(udev) usb_dec_dev_use((udev)) ++ ++#define SET_NETDEV_DEV(x,y) ++#define SET_NETDEV_OWNER(ndev,owner) ndev->owner = owner ++ ++#define ASYNC_UNLINK USB_ASYNC_UNLINK ++ ++static inline int submit_urb(struct urb *urb, int mem_flags) { ++ return usb_submit_urb(urb); ++} ++static inline struct urb *alloc_urb(int iso_pk, int mem_flags) { ++ return usb_alloc_urb(iso_pk); ++} ++ ++static inline void usb_set_intfdata(struct usb_interface *intf, void *data) {} ++ ++#endif //#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 0) ++ ++/* ------------------------------------------------------------------------- ++** Module Stuff ++** ---------------------------------------------------------------------- */ ++ ++#ifdef MODULE_LICENSE ++MODULE_LICENSE("Dual MPL/GPL"); ++#endif ++MODULE_AUTHOR("Martin Wawro "); ++MODULE_DESCRIPTION("TI ACX100 WLAN USB Driver"); ++ ++#ifdef ACX_DEBUG ++MODULE_PARM(debug, "i"); ++MODULE_PARM_DESC(debug, "Debug level mask: 0x0000 - 0x3fff"); ++#endif ++ ++MODULE_PARM(firmware_dir, "s"); ++MODULE_PARM_DESC(firmware_dir, "Directory where to load acx100 firmware file from"); ++ ++ ++/* ------------------------------------------------------------------------- ++** Module Definitions (preprocessor based) ++** ---------------------------------------------------------------------- */ ++ ++ ++#define SHORTNAME "acx_usb" ++ ++#define ACX100_VENDOR_ID 0x2001 ++#define ACX100_PRODUCT_ID_UNBOOTED 0x3B01 ++#define ACX100_PRODUCT_ID_BOOTED 0x3B00 ++ ++#define ACX100_USB_RX_TIMEOUT (4*HZ) ++#define ACX100_USB_TX_TIMEOUT (4*HZ) ++ ++ ++/* ------------------------------------------------------------------------- ++** Module Data Structures ++** ---------------------------------------------------------------------- */ ++ ++ ++ ++ ++/* ------------------------------------------------------------------------- ++** Module Prototypes ++** ---------------------------------------------------------------------- */ ++ ++#if USB_24 ++static void * acx100usb_probe(struct usb_device *, unsigned int, const struct usb_device_id *); ++static void acx100usb_disconnect(struct usb_device *,void *); ++static void acx100usb_complete_tx(struct urb *); ++static void acx100usb_complete_rx(struct urb *); ++#else ++static int acx100usb_probe(struct usb_interface *, const struct usb_device_id *); ++static void acx100usb_disconnect(struct usb_interface *); ++static void acx100usb_complete_tx(struct urb *, struct pt_regs *); ++static void acx100usb_complete_rx(struct urb *, struct pt_regs *); ++#endif ++static int acx100usb_open(struct net_device *); ++static int acx100usb_stop(struct net_device *); ++static int acx100usb_start_xmit(struct sk_buff *,struct net_device *); ++static void acx100usb_set_rx_mode(struct net_device *); ++static void init_network_device(struct net_device *); ++static void acx100usb_send_tx_frags(wlandevice_t *); ++static void * acx100usb_read_firmware(const char *,unsigned int *); ++static int acx100usb_boot(struct usb_device *); ++void acx100usb_tx_data(wlandevice_t *,struct txdescriptor *); ++static void acx100usb_prepare_tx(wlandevice_t *,struct txdescriptor *); ++static void acx100usb_flush_tx(wlandevice_t *); ++static void acx100usb_trigger_next_tx(wlandevice_t *); ++ ++static struct net_device_stats * acx100_get_stats(struct net_device *); ++static struct iw_statistics *acx100_get_wireless_stats(struct net_device *); ++ ++ ++static void acx100usb_poll_rx(wlandevice_t *); ++void acx100_rx(struct rxhostdescriptor *,wlandevice_t *); ++ ++int init_module(void); ++void cleanup_module(void); ++ ++#ifdef HAVE_TX_TIMEOUT ++static void acx100usb_tx_timeout(struct net_device *); ++#endif ++ ++#ifdef ACX_DEBUG ++//int debug = L_DEBUG|L_ASSOC|L_INIT|L_STD; ++//int debug = L_ALL; ++int debug = L_STD; ++int acx100_debug_func_indent=0; ++static char * acx100usb_pstatus(int); ++void acx100usb_dump_bytes(void *,int) __attribute__((__unused__)); ++static void dump_interface_descriptor(struct usb_interface_descriptor *); ++static void dump_device(struct usb_device *); ++static void dump_device_descriptor(struct usb_device_descriptor *); ++static void dump_endpoint_descriptor(struct usb_endpoint_descriptor *); ++static void dump_config_descriptor(struct usb_config_descriptor *); ++/* static void acx100usb_printsetup(devrequest *); */ ++/* static void acx100usb_printcmdreq(struct acx100_usb_cmdreq *) __attribute__((__unused__)); */ ++#endif ++ ++/* ------------------------------------------------------------------------- ++** Module Data ++** ---------------------------------------------------------------------- */ ++ ++char *firmware_dir; ++ ++extern const struct iw_handler_def acx100_ioctl_handler_def; ++ ++static struct usb_device_id acx100usb_ids[] = { ++ { USB_DEVICE(ACX100_VENDOR_ID, ACX100_PRODUCT_ID_BOOTED) }, ++ { USB_DEVICE(ACX100_VENDOR_ID, ACX100_PRODUCT_ID_UNBOOTED) }, ++ { } ++}; ++ ++ ++/* USB driver data structure as required by the kernel's USB core */ ++ ++static struct usb_driver acx100usb_driver = { ++ .name = "acx_usb", /* name of the driver */ ++ .probe = acx100usb_probe, /* pointer to probe() procedure */ ++ .disconnect = acx100usb_disconnect, /* pointer to disconnect() procedure */ ++ .id_table = acx100usb_ids ++}; ++ ++ ++ ++/* --------------------------------------------------------------------------- ++** acx100usb_probe(): ++** Inputs: ++** dev -> Pointer to usb_device structure that may or may not be claimed ++** ifNum -> Interface number ++** devID -> Device ID (vendor and product specific stuff) ++** --------------------------------------------------------------------------- ++** Returns: ++** (void *) Pointer to (custom) driver context or NULL if we are not interested ++** or unable to handle the offered device. ++** ++** Description: ++** This function is invoked by the kernel's USB core whenever a new device is ++** attached to the system or the module is loaded. It is presented a usb_device ++** structure from which information regarding the device is obtained and evaluated. ++** In case this driver is able to handle one of the offered devices, it returns ++** a non-null pointer to a driver context and thereby claims the device. ++** ------------------------------------------------------------------------ */ ++ ++#if USB_24 ++#define OUTOFMEM NULL ++static void * acx100usb_probe(struct usb_device *usbdev,unsigned int ifNum,const struct usb_device_id *devID) ++{ ++#else ++#define OUTOFMEM -ENOMEM ++static int acx100usb_probe(struct usb_interface *intf, const struct usb_device_id *devID) ++{ ++ struct usb_device *usbdev = interface_to_usbdev(intf); ++#endif ++ wlandevice_t *priv; ++ struct net_device *dev=NULL; ++ int numconfigs,numfaces,result; ++ struct usb_config_descriptor *config; ++ struct usb_endpoint_descriptor *epdesc; ++ FN_ENTER; ++ dump_device(usbdev); ++ /* --------------------------------------------- ++ ** first check if this is the "unbooted" hardware ++ ** --------------------------------------------- */ ++ if ((usbdev->descriptor.idVendor==ACX100_VENDOR_ID)&&(usbdev->descriptor.idProduct==ACX100_PRODUCT_ID_UNBOOTED)) { ++ /* --------------------------------------------- ++ ** Boot the device (i.e. upload the firmware) ++ ** --------------------------------------------- */ ++ acx100usb_boot(usbdev); ++ /* --------------------------------------------- ++ ** OK, we are done with booting. Normally, the ++ ** ID for the unbooted device should disappear ++ ** and it will not need a driver anyway...so ++ ** return a NULL ++ ** --------------------------------------------- */ ++#if USB_24 ++ return NULL; ++#else ++ return 0; /* is that ok?? */ ++#endif ++ } ++ if ((usbdev->descriptor.idVendor==ACX100_VENDOR_ID)&&(usbdev->descriptor.idProduct==ACX100_PRODUCT_ID_BOOTED)) { ++ /* --------------------------------------------- ++ ** allocate memory for the device driver context ++ ** --------------------------------------------- */ ++ priv = (struct wlandevice *)kmalloc(sizeof(struct wlandevice),GFP_KERNEL); ++ if (!priv) { ++ printk(KERN_WARNING SHORTNAME ": could not allocate %d bytes memory for device driver context, giving up.\n",sizeof(struct wlandevice)); ++ return OUTOFMEM; ++ } ++ memset(priv,0,sizeof(wlandevice_t)); ++ priv->chip_type = CHIPTYPE_ACX100; ++ priv->usbdev=usbdev; ++ /* --------------------------------------------- ++ ** Initialize the device context and also check ++ ** if this is really the hardware we know about. ++ ** If not sure, atleast notify the user that he ++ ** may be in trouble... ++ ** --------------------------------------------- */ ++ numconfigs=(int)(usbdev->descriptor.bNumConfigurations); ++ if (numconfigs!=1) printk(KERN_WARNING SHORTNAME ": number of configurations is %d, this version of the driver only knows how to handle 1, be prepared for surprises\n",numconfigs); ++#if USB_24 ++ config = usbdev->actconfig; ++#else ++ config = &usbdev->config->desc; ++#endif ++ numfaces=config->bNumInterfaces; ++ if (numfaces!=1) printk(KERN_WARNING SHORTNAME ": number of interfaces is %d, this version of the driver only knows how to handle 1, be prepared for surprises\n",numfaces); ++ /* --------------------------------------------- ++ ** initialize custom spinlocks... ++ ** --------------------------------------------- */ ++ spin_lock_init(&(priv->usb_ctrl_lock)); ++ spin_lock_init(&(priv->usb_tx_lock)); ++ priv->usb_tx_mutex=0; ++ priv->currentdesc=0; ++ /* --------------------------------------------- ++ ** Allocate memory for a network device ++ ** --------------------------------------------- */ ++ if ((dev = (struct net_device *)kmalloc(sizeof(struct net_device),GFP_ATOMIC))==NULL) { ++ printk(KERN_WARNING SHORTNAME ": failed to alloc netdev\n"); ++ kfree(priv); ++ return OUTOFMEM; ++ } ++ /* --------------------------------------------- ++ ** Setup network device ++ ** --------------------------------------------- */ ++ memset(dev, 0, sizeof(struct net_device)); ++ dev->init=(void *)&init_network_device; ++ dev->priv=priv; ++ priv->netdev=dev; ++ /* --------------------------------------------- ++ ** Setup URB for control messages ++ ** --------------------------------------------- */ ++ priv->ctrl_urb=alloc_urb(0, GFP_KERNEL); ++ if (!priv->ctrl_urb) { ++ printk(KERN_WARNING SHORTNAME ": failed to allocate URB\n"); ++ kfree(dev); ++ kfree(priv); ++ return OUTOFMEM; ++ } ++ /* --------------------------------------------- ++ ** Setup URB for bulk-in messages ++ ** --------------------------------------------- */ ++ priv->bulkrx_urb=alloc_urb(0, GFP_KERNEL); ++ if (!priv->bulkrx_urb) { ++ printk(KERN_WARNING SHORTNAME ": failed to allocate input URB\n"); ++ usb_free_urb(priv->ctrl_urb); ++ kfree(dev); ++ kfree(priv); ++ return OUTOFMEM; ++ } ++ priv->bulkrx_urb->status=0; ++ /* --------------------------------------------- ++ ** Setup URB for bulk-out messages ++ ** --------------------------------------------- */ ++ priv->bulktx_urb=alloc_urb(0, GFP_KERNEL); ++ if (!priv->bulktx_urb) { ++ printk(KERN_WARNING SHORTNAME ": failed to allocate output URB\n"); ++ usb_free_urb(priv->ctrl_urb); ++ usb_free_urb(priv->bulkrx_urb); ++ kfree(dev); ++ kfree(priv); ++ return OUTOFMEM; ++ } ++ priv->bulktx_urb->status=0; ++ /* -------------------------------------- ++ ** Allocate a network device name ++ ** -------------------------------------- */ ++ acxlog(L_DEBUG,"allocating device name\n"); ++ result=dev_alloc_name(dev,"wlan%d"); ++ if (result<0) { ++ printk(KERN_ERR SHORTNAME ": failed to allocate wlan device name (errcode=%d), giving up.\n",result); ++ kfree(dev); ++ usb_free_urb(priv->ctrl_urb); ++ usb_free_urb(priv->bulkrx_urb); ++ usb_free_urb(priv->bulktx_urb); ++ kfree(priv); ++ return OUTOFMEM; ++ } ++#if USB_24 == 0 ++ usb_set_intfdata(intf, priv); ++ SET_NETDEV_DEV(dev, &intf->dev); ++#endif ++ /* -------------------------------------- ++ ** Register the network device ++ ** -------------------------------------- */ ++ acxlog(L_DEBUG,"registering network device\n"); ++ result=register_netdev(dev); ++ if (result!=0) { ++ printk(KERN_ERR SHORTNAME ": failed to register network device for USB WLAN (errcode=%d), giving up.\n",result); ++ kfree(dev); ++ usb_free_urb(priv->ctrl_urb); ++ usb_free_urb(priv->bulkrx_urb); ++ usb_free_urb(priv->bulktx_urb); ++ kfree(priv); ++ return OUTOFMEM; ++ } ++ /* -------------------------------------- ++ ** Check the max. tx size of the endpoint ++ ** -------------------------------------- */ ++ epdesc = usb_epnum_to_ep_desc(usbdev,1); /* get the descriptor of the bulk endpoint */ ++ if (epdesc) { ++ priv->usb_max_bulkout=epdesc->wMaxPacketSize; ++ } else { ++ priv->usb_max_bulkout=64; /* guess a default value */ ++ } ++ /* -------------------------------------- ++ ** Everything went OK, we are happy now ++ ** -------------------------------------- */ ++#if USB_24 ++ return priv; ++#else ++ return 0; ++#endif ++ } ++ /* -------------------------------------- ++ ** no device we could handle, return NULL ++ ** -------------------------------------- */ ++#if USB_24 ++ return NULL; ++#else ++ return -EIO; ++#endif ++} ++ ++ ++ ++ ++/* --------------------------------------------------------------------------- ++** acx100usb_disconnect(): ++** Inputs: ++** dev -> Pointer to usb_device structure handled by this module ++** devContext -> Pointer to own device context (acx100usb_context) ++** --------------------------------------------------------------------------- ++** Returns: ++** ++** ++** Description: ++** This function is invoked whenever the user pulls the plug from the USB ++** device or the module is removed from the kernel. In these cases, the ++** network devices have to be taken down and all allocated memory has ++** to be freed. ++** ------------------------------------------------------------------------ */ ++ ++#if USB_24 ++static void acx100usb_disconnect(struct usb_device *usbdev, void *devContext) ++{ ++ wlandevice_t *priv = (wlandevice_t *)devContext; ++#else ++static void acx100usb_disconnect(struct usb_interface *intf) ++{ ++ wlandevice_t *priv = usb_get_intfdata(intf); ++#endif ++ int result; ++ ++ /* -------------------------------------- ++ ** No WLAN device...no sense ++ ** ----------------------------------- */ ++ if (NULL == priv) ++ return; ++ /* -------------------------------------- ++ ** bring the device offline... ++ ** ----------------------------------- */ ++ if (priv->netdev) { ++ rtnl_lock(); ++ acx100usb_stop(priv->netdev); ++ rtnl_unlock(); ++ } ++ /* -------------------------------------- ++ * now abort pending URBs and free them ++ * ------------------------------------ */ ++ if (priv->ctrl_urb) { ++ if (priv->ctrl_urb->status==-EINPROGRESS) usb_unlink_urb(priv->ctrl_urb); ++ usb_free_urb(priv->ctrl_urb); ++ } ++ if (priv->bulkrx_urb) { ++ if (priv->bulkrx_urb->status==-EINPROGRESS) usb_unlink_urb(priv->bulkrx_urb); ++ usb_free_urb(priv->bulkrx_urb); ++ } ++ if (priv->bulktx_urb) { ++ if (priv->bulktx_urb->status==-EINPROGRESS) usb_unlink_urb(priv->bulktx_urb); ++ usb_free_urb(priv->bulktx_urb); ++ } ++ /* -------------------------------------- ++ ** Unregister the network devices ++ ** -------------------------------------- */ ++ if (priv->netdev) { ++ rtnl_lock(); ++ result=unregister_netdevice(priv->netdev); ++ rtnl_unlock(); ++ kfree(priv->netdev); ++ } ++ /* -------------------------------------- ++ ** finally free the WLAN device... ++ ** -------------------------------------- */ ++ if (priv) kfree(priv); ++} ++ ++ ++ ++ ++/* --------------------------------------------------------------------------- ++** acx100usb_boot(): ++** Inputs: ++** usbdev -> Pointer to kernel's usb_device structure ++** --------------------------------------------------------------------------- ++** Returns: ++** (int) Errorcode or 0 on success ++** ++** Description: ++** This function triggers the loading of the firmware image from harddisk ++** and then uploads the firmware to the USB device. After uploading the ++** firmware and transmitting the checksum, the device resets and appears ++** as a new device on the USB bus (the device we can finally deal with) ++** ----------------------------------------------------------------------- */ ++ ++static int acx100usb_boot(struct usb_device *usbdev) ++{ ++ unsigned int offset=8,size,len,inpipe,outpipe; ++ int result; ++ UINT16 *csptr; ++ char filename[128],*firmware,*usbbuf; ++ FN_ENTER; ++ usbbuf = (char *)kmalloc(ACX100_USB_RWMEM_MAXLEN,GFP_KERNEL); ++ if (!usbbuf) { ++ printk(KERN_ERR SHORTNAME ": not enough memory for allocating USB transfer buffer (req=%d bytes)\n",ACX100_USB_RWMEM_MAXLEN); ++ return(-ENOMEM); ++ } ++ if ((firmware_dir)&&(strlen(firmware_dir)>114)) { ++ printk(KERN_ERR "path in firmware_dir is too long (max. 114 chars)\n"); ++ kfree(usbbuf); ++ return(-EINVAL); ++ } ++ if (firmware_dir) sprintf(filename,"%s/ACX100.bin",firmware_dir); ++ else sprintf(filename,"/etc/acx100/ACX100.bin"); ++ acxlog(L_STD,"loading firmware %s\n",filename); ++ firmware=acx100usb_read_firmware(filename,&size); ++ if (!firmware) { ++ kfree(usbbuf); ++ return(-EIO); ++ } ++ acxlog(L_DEBUG,"firmware size: %d bytes\n",size); ++ /* -------------------------------------- ++ ** Obtain the I/O pipes ++ ** -------------------------------------- */ ++ outpipe=usb_sndctrlpipe(usbdev,0); /* default endpoint for ctrl-transfers: 0 */ ++ inpipe =usb_rcvctrlpipe(usbdev,0); /* default endpoint for ctrl-transfers: 0 */ ++ /* -------------------------------------- ++ ** now upload the firmware, slice the data ++ ** into blocks ++ ** -------------------------------------- */ ++ while (offset=(ACX100_USB_RWMEM_MAXLEN)) len=ACX100_USB_RWMEM_MAXLEN; ++ else len=size-offset; ++ acxlog(L_DEBUG,"uploading firmware (%d bytes, offset=%d size=%d)\n",len,offset,size); ++ result=0; ++ memcpy(usbbuf,firmware+offset,len); ++ result=usb_control_msg(usbdev,outpipe,ACX100_USB_UPLOAD_FW,USB_TYPE_VENDOR|USB_DIR_OUT,(UINT16)(size-8),0,usbbuf,len,3000); ++ offset+=len; ++ if (result<0) { ++#ifdef ACX_DEBUG ++ printk(KERN_ERR "error %d (%s) during upload of firmware, aborting\n",result,acx100usb_pstatus(result)); ++#else ++ printk(KERN_ERR "error %d during upload of firmware, aborting\n", result); ++#endif ++ kfree(usbbuf); ++ vfree(firmware); ++ return(result); ++ } ++ } ++ /* -------------------------------------- ++ ** finally, send the checksum and reboot ++ ** the device... ++ ** -------------------------------------- */ ++ csptr=(UINT16 *)firmware; ++ result=usb_control_msg(usbdev,outpipe,ACX100_USB_UPLOAD_FW,USB_TYPE_VENDOR|USB_DIR_OUT,csptr[0],csptr[1],NULL,0,3000); /* this triggers the reboot ? */ ++ if (result<0) { ++ printk(KERN_ERR "error %d during tx of checksum, aborting\n",result); ++ kfree(usbbuf); ++ vfree(firmware); ++ return(result); ++ } ++ result=usb_control_msg(usbdev,inpipe,ACX100_USB_ACK_CS,USB_TYPE_VENDOR|USB_DIR_IN,csptr[0],csptr[1],usbbuf,8,3000); ++ if (result<0) { ++ printk(KERN_ERR "error %d during ACK of checksum, aborting\n",result); ++ kfree(usbbuf); ++ vfree(firmware); ++ return(result); ++ } ++ vfree(firmware); ++ if (((UINT16 *)usbbuf)[0]!=0x10) { ++ kfree(usbbuf); ++ printk(KERN_ERR "invalid checksum?\n"); ++ return(-EINVAL); ++ } ++ kfree(usbbuf); ++ return(0); ++} ++ ++ ++ ++ ++/* --------------------------------------------------------------------------- ++** acx100usb_read_firmware(): ++** Inputs: ++** filename -> Filename of the firmware file ++** size -> Pointer to an integer to take the size of the file ++** --------------------------------------------------------------------------- ++** Returns: ++** (void *) Pointer to memory with firmware or NULL on failure ++** ++** Description: ++** This function opens the specified file and reads the data into memory. ++** ------------------------------------------------------------------------ */ ++ ++static void * acx100usb_read_firmware(const char *filename,unsigned int *size) ++{ ++ char *res = NULL; ++ mm_segment_t orgfs; ++ unsigned long page; ++ char *buffer; ++ struct file *inf; ++ int retval; ++ unsigned int offset = 0; ++ ++ orgfs=get_fs(); /* store original fs */ ++ set_fs(KERNEL_DS); ++ /* Read in whole file then check the size */ ++ page=__get_free_page(GFP_KERNEL); ++ if (page) { ++ buffer=(char*)page; ++ inf=(struct file *)filp_open(filename,O_RDONLY,0); ++ if (IS_ERR(inf)) { ++ printk(KERN_ERR "ERROR %ld trying to open firmware image file '%s'.\n", -PTR_ERR(inf),filename); ++ } else { ++ if (inf->f_op&&inf->f_op->read) { ++ offset = 0; ++ do { ++ retval=inf->f_op->read(inf,buffer,PAGE_SIZE,&inf->f_pos); ++ if (retval < 0) { ++ printk(KERN_ERR "ERROR %d reading firmware image file '%s'.\n", -retval, filename); ++ if (res) vfree(res); ++ res = NULL; ++ } ++ if (retval > 0) { ++ if (!res) { ++ res = vmalloc(8+*(UINT32*)(4+buffer)); ++ acxlog(L_DEBUG,"Allocated %ld bytes for firmware module loading.\n", 8+(*(UINT32*)(4+buffer))); ++ *size=8+(*(UINT32*)(buffer+4)); ++ } ++ if (!res) { ++ printk(KERN_ERR "Unable to allocate memory for firmware module loading.\n"); ++ retval=0; ++ } ++ if (res) { ++ memcpy((UINT8*)res+offset, buffer,retval); ++ offset += retval; ++ } ++ } ++ } while (retval>0); ++ } else { ++ printk(KERN_ERR "ERROR: %s does not have a read method\n", filename); ++ } ++ retval=filp_close(inf,NULL); ++ if (retval) printk(KERN_ERR "ERROR %d closing %s\n", -retval, filename); ++ if ((res) && ((*size) != offset)) { ++ printk(KERN_INFO "Firmware is reporting a different size 0x%08x to read 0x%08x\n", (int)(*size), offset); ++ /* ++ vfree(res); ++ res = NULL; ++ */ ++ } ++ } ++ free_page(page); ++ } else { ++ printk(KERN_ERR "Unable to allocate memory for firmware loading.\n"); ++ } ++ set_fs(orgfs); ++ return(res); ++} ++ ++ ++ ++ ++/* --------------------------------------------------------------------------- ++** init_network_device(): ++** Inputs: ++** dev -> Pointer to network device ++** --------------------------------------------------------------------------- ++** Returns: ++** ++** ++** Description: ++** Basic setup of a network device for use with the WLAN device. ++** ------------------------------------------------------------------------- */ ++ ++static void init_network_device(struct net_device *dev) { ++ int result=0; ++ /* -------------------------------------- ++ ** Setup the device and stop the queue ++ ** -------------------------------------- */ ++ ether_setup(dev); ++ netif_stop_queue(dev); ++ /* -------------------------------------- ++ ** Register the callbacks for the network ++ ** device functions. ++ ** -------------------------------------- */ ++ dev->open = &acx100usb_open; ++ dev->stop = &acx100usb_stop; ++ dev->hard_start_xmit = (void *)&acx100usb_start_xmit; ++ dev->get_stats = (void *)&acx100_get_stats; ++ dev->get_wireless_stats = (void *)&acx100_get_wireless_stats; ++#if WIRELESS_EXT >= 13 ++ dev->wireless_handlers = (struct iw_handler_def *)&acx100_ioctl_handler_def; ++#else ++ dev->do_ioctl = (void *)&acx_ioctl_old; ++#endif ++ dev->set_multicast_list = (void *)&acx100usb_set_rx_mode; ++#ifdef HAVE_TX_TIMEOUT ++ dev->tx_timeout = &acx100usb_tx_timeout; ++ dev->watchdog_timeo = 4 * HZ; /* 400 */ ++#endif ++ result=acx100_init_mac(dev); ++ if (!result) { ++ SET_MODULE_OWNER(dev); ++ } ++} ++ ++ ++ ++ ++ ++/* -------------------------------------------------------------------------- ++** acx100usb_open(): ++** Inputs: ++** dev -> Pointer to network device ++** -------------------------------------------------------------------------- ++** Returns: ++** ++** ++** Description: ++** This function is called when the user sets up the network interface. ++** It initializes a management timer, sets up the USB card and starts ++** the network tx queue and USB receive. ++** ---------------------------------------------------------------------- */ ++ ++static int acx100usb_open(struct net_device *dev) ++{ ++ wlandevice_t *priv = (wlandevice_t *)dev->priv; ++ unsigned long flags; ++ ++ FN_ENTER; ++ ++ init_timer(&(priv->mgmt_timer)); ++ priv->mgmt_timer.function=acx100_timer; ++ priv->mgmt_timer.data=(unsigned long)priv; ++ ++ /* set ifup to 1, since acx100_start needs it (FIXME: ugly) */ ++ ++ priv->dev_state_mask |= ACX_STATE_IFACE_UP; ++ acx100_unlock(priv,&flags); ++ acx100_start(priv); ++ netif_start_queue(dev); ++ acx100usb_poll_rx(priv); ++ /* --- */ ++ WLAN_MOD_INC_USE_COUNT; ++ return 0; ++} ++ ++ ++ ++ ++/* --------------------------------------------------------------------------- ++** acx100_rx(): ++** Inputs: ++** dev -> Pointer to network device ++** --------------------------------------------------------------------------- ++** Returns: ++** ++** ++** Description: ++** This function is invoked when a packet has been received by the USB ++** part of the code. It converts the rxdescriptor to an ethernet frame and ++** then commits the data to the network stack. ++** ------------------------------------------------------------------------ */ ++ ++void acx100_rx(struct rxhostdescriptor *rxdesc, wlandevice_t *priv) ++{ ++ netdevice_t *dev = priv->netdev; ++ struct sk_buff *skb; ++ FN_ENTER; ++ if (priv->dev_state_mask & ACX_STATE_IFACE_UP) { ++ if ((skb = acx100_rxdesc_to_ether(priv, rxdesc))) { ++ skb->dev = dev; ++ skb->protocol = eth_type_trans(skb, dev); ++ dev->last_rx = jiffies; ++ ++ netif_rx(skb); ++ ++ priv->stats.rx_packets++; ++ priv->stats.rx_bytes += skb->len; ++ } ++ } ++ FN_EXIT(0, 0); ++} ++ ++ ++ ++/* --------------------------------------------------------------------------- ++** acx100usb_poll_rx(): ++** Inputs: ++** priv -> Pointer to wlandevice structure ++** --------------------------------------------------------------------------- ++** Returns: ++** ++** ++** Description: ++** This function initiates a bulk-in USB transfer (in case the interface ++** is up). ++** ------------------------------------------------------------------------- */ ++ ++static void acx100usb_poll_rx(wlandevice_t *priv) { ++ acx100_usbin_t *inbuf; ++ struct usb_device *usbdev; ++ unsigned int inpipe; ++ ++ FN_ENTER; ++ if (priv->dev_state_mask & ACX_STATE_IFACE_UP) { ++ inbuf=&(priv->bulkin); ++ usbdev=priv->usbdev; ++ ++ inpipe=usb_rcvbulkpipe(usbdev,1); /* default endpoint for bulk-transfers: 1 */ ++ ++ if (priv->bulkrx_urb->status==-EINPROGRESS) { ++ printk(KERN_ERR SHORTNAME ": ERROR, RX TRIGGERED WHILE RX-URB IN PROGRESS\n"); ++ /* FIXME: this is nasty, receive is being cancelled by this code ++ * on the other hand, this should not happen anyway... ++ */ ++ usb_unlink_urb(priv->bulkrx_urb); ++ } ++ priv->bulkrx_urb->actual_length=0; ++ usb_fill_bulk_urb(priv->bulkrx_urb, usbdev, inpipe, inbuf, sizeof(acx100_usbin_t), acx100usb_complete_rx, priv); ++ priv->bulkrx_urb->transfer_flags=ASYNC_UNLINK; ++ priv->bulkrx_urb->timeout=ACX100_USB_RX_TIMEOUT; ++ submit_urb(priv->bulkrx_urb, GFP_KERNEL); ++ } ++ FN_EXIT(0,0); ++} ++ ++ ++ ++ ++/* --------------------------------------------------------------------------- ++** acx100usb_complete_rx(): ++** Inputs: ++** urb -> Pointer to USB request block ++** regs -> Pointer to register-buffer for syscalls (see asm/ptrace.h) ++** --------------------------------------------------------------------------- ++** Returns: ++** ++** ++** Description: ++** This function is invoked whenever a bulk receive request returns. The ++** received data is then committed to the network stack and the next ++** USB receive is triggered. ++** ------------------------------------------------------------------------- */ ++ ++#if USB_24 ++static void acx100usb_complete_rx(struct urb *urb) ++#else ++static void acx100usb_complete_rx(struct urb *urb, struct pt_regs *regs) ++#endif ++{ ++ wlandevice_t *priv; ++ int offset,size,packetsize; ++ rxbuffer_t *ptr; ++ struct rxhostdescriptor *rxdesc; ++ TIWLAN_DC *ticontext; ++ ++ FN_ENTER; ++ priv=(wlandevice_t *)urb->context; ++ /* ---------------------------- ++ ** grab the TI device context ++ ** -------------------------- */ ++ ticontext=&(priv->dc); ++ size=urb->actual_length; ++ /* --------------------------------------------- ++ ** check if the transfer was aborted... ++ ** ------------------------------------------ */ ++ if (urb->status!=0) { ++ priv->stats.rx_errors++; ++ if (priv->dev_state_mask & ACX_STATE_IFACE_UP) acx100usb_poll_rx(priv); ++ return; ++ } ++ /* --------------------------------------------- ++ ** check if the receive buffer is the right one ++ ** --------------------------------------------- */ ++ if (size==0) acxlog(L_STD,"acx_usb: warning, encountered zerolength rx packet\n"); ++ acxlog(L_DEBUG,"bulk rx completed (urb->actual_length=%d)\n",size); ++ if ((size>0)&&(urb->transfer_buffer==&(priv->bulkin))) { ++ /* ------------------------------------------------------------------ ++ ** now fill the data into the rxhostdescriptor for further processing ++ ** ---------------------------------------------------------------- */ ++ if (!(ticontext->pRxHostDescQPool)) { ++ acxlog(L_STD,"acx100usb: ERROR rxhostdescriptor pool is NULL\n"); ++ return; /* bail out before something bad happens */ ++ } ++ ptr=(rxbuffer_t *)&(priv->bulkin); ++ offset=0; ++ while (offsetpRxHostDescQPool[ticontext->rx_tail]); ++ rxdesc->Ctl|=ACX100_CTL_OWN; ++ rxdesc->Status=0xF0000000; /* set the MSB */ ++ packetsize=(ptr->mac_cnt_rcvd & 0xfff)+ACX100_RXBUF_HDRSIZE; /* packetsize is limited to 12 bits */ ++ acxlog(L_DEBUG,"packetsize: %d\n",packetsize); ++ if (packetsize>sizeof(struct rxbuffer)) { ++ acxlog(L_STD,"acx100usb: ERROR, # of received bytes (%d) higher than capacity of buffer (%d bytes)\n",size,sizeof(struct rxbuffer)); ++ /* ------------------------- ++ ** prevent buffer overflow ++ ** -----------------------*/ ++ packetsize=sizeof(struct rxbuffer); ++ } ++ memcpy(rxdesc->data,ptr,packetsize); ++#ifdef ACX_DEBUG ++ if (debug&L_DEBUG) { ++ if ((packetsize>0)&&(packetsize<1024)) { ++ acxlog(L_DEBUG,"received data:\n"); ++ acx100usb_dump_bytes(ptr,packetsize); ++ } ++ } ++#endif ++ /* --------------------------------------------- ++ ** now handle the received data.... ++ ** ------------------------------------------ */ ++ acx100_process_rx_desc(priv); ++ ptr=(rxbuffer_t *)(((char *)ptr)+packetsize); ++ offset+=packetsize; ++ } ++ } ++ /* ------------------------------- ++ ** look for the next rx ... ++ ** ---------------------------- */ ++ if (priv->dev_state_mask & ACX_STATE_IFACE_UP) acx100usb_poll_rx(priv); /* receive of frame completed, now look for the next one */ ++ FN_EXIT(0,0); ++} ++ ++ ++ ++ ++/* --------------------------------------------------------------------------- ++** acx100usb_tx_data(): ++** Inputs: ++** priv -> Pointer to wlandevice structure ++** desc -> Pointer to TX descriptor ++** --------------------------------------------------------------------------- ++** Returns: ++** ++** ++** Description: ++** This function is called by acx100_dma_tx_data() and is responsible for ++** sending out the data within the given txdescriptor to the USB device. ++** In order to avoid inconsistency on SMP systems, a Mutex is checked ++** that forbids other packets to disturb the USB queue when there is ++** more than 1 packet within the Tx queue at a time. In case there is ++** a transfer in progress, this function immediately returns. It is ++** within the responsibility of the acx100usb_complete_tx() function to ++** ensure that these transfers are completed after the current transfer ++** was finished. In case there are no transfers in progress, the Mutex ++** is set and the transfer is triggered. ++** ------------------------------------------------------------------------- */ ++ ++void acx100usb_tx_data(wlandevice_t *priv,struct txdescriptor *desc) ++{ ++ int flags; ++ FN_ENTER; ++ /* ------------------------------------ ++ ** some sanity checks... ++ ** --------------------------------- */ ++ if ((!priv)||(!desc)) return; ++ /*----------------------------------------------- ++ ** check if we are still not done sending the ++ ** last frames... ++ ** ------------------------------------------- */ ++ spin_lock_irqsave(&(priv->usb_tx_lock),flags); ++ if (priv->usb_tx_mutex) { ++ spin_unlock_irqrestore(&(priv->usb_tx_lock),flags); ++ return; ++ } ++ /*----------------------------------------------- ++ ** indicate a tx frame in progress... ++ ** ------------------------------------------- */ ++ priv->usb_tx_mutex=1; ++ spin_unlock_irqrestore(&(priv->usb_tx_lock),flags); ++ acx100usb_prepare_tx(priv,desc); ++ FN_EXIT(0,0); ++} ++ ++ ++ ++/* --------------------------------------------------------------------------- ++** acx100usb_prepare_tx(): ++** Inputs: ++** priv -> Pointer to wlandevice structure ++** desc -> Pointer to TX descriptor ++** --------------------------------------------------------------------------- ++** Returns: ++** ++** ++** Description: ++** This function inserts the given txdescriptor into the USB output buffer ++** and initiates the USB data transfer of the packet. ++** ------------------------------------------------------------------------- */ ++ ++static void acx100usb_prepare_tx(wlandevice_t *priv,struct txdescriptor *desc) { ++ int txsize,ucode,size; ++ acx100_usb_txfrm_t *buf; ++ UINT8 *addr; ++ struct usb_device *usbdev; ++ unsigned int outpipe; ++ struct txhostdescriptor *header,*payload; ++ TIWLAN_DC *ticontext; ++ FN_ENTER; ++ priv->currentdesc = desc; ++ ticontext=&(priv->dc); ++ /* ------------------------------------------ ++ ** extract header and payload from descriptor ++ ** --------------------------------------- */ ++ header = desc->host_desc; ++ payload = desc->host_desc+1; ++ /* ---------------------------------------------- ++ ** concatenate header and payload into USB buffer ++ ** ------------------------------------------- */ ++ acxlog(L_XFER,"tx_data: headerlen=%d payloadlen=%d\n",header->length,payload->length); ++ buf=&(priv->bulkout.txfrm); ++ size=header->length+payload->length; ++ if (size>WLAN_DATA_MAXLEN) { ++ acxlog(L_STD,"acx100usb: ERROR, USB buffer smaller than total data to send (%d vs. %d)\n",size,WLAN_DATA_MAXLEN); ++ return; ++ } ++ memcpy(&(buf->data),header->data,header->length); ++ memcpy(((char *)&(buf->data))+header->length,payload->data,payload->length); ++ /* ---------------------------------------------- ++ ** fill the USB transfer header ++ ** ------------------------------------------- */ ++ buf->hdr.desc=ACX100_USB_TX_DESC; ++ buf->hdr.MPDUlen=size; ++ buf->hdr.ctrl1=0; ++ buf->hdr.ctrl2=0; ++ buf->hdr.hostData=size|(desc->rate)<<24; ++ if (1 == priv->preamble_flag) ++ buf->hdr.ctrl1|=DESC_CTL_SHORT_PREAMBLE; ++ buf->hdr.ctrl1|=DESC_CTL_FIRST_MPDU; ++ buf->hdr.txRate=desc->rate; ++ buf->hdr.index=1; ++ buf->hdr.dataLength=size|((buf->hdr.txRate)<<24); ++ if (WLAN_GET_FC_FTYPE(((p80211_hdr_t *)header->data)->a3.fc)==WLAN_FTYPE_DATA) { ++ buf->hdr.hostData|=(ACX100_USB_TXHI_ISDATA<<16); ++ } ++ addr=(((p80211_hdr_t *)(header->data))->a3.a3); ++ if (acx100_is_mac_address_directed((mac_t *)addr)) buf->hdr.hostData|=(ACX100_USB_TXHI_DIRECTED<<16); ++ if (acx100_is_mac_address_broadcast(addr)) buf->hdr.hostData|=(ACX100_USB_TXHI_BROADCAST<<16); ++ acxlog(L_DATA,"Dump of bulk out urb:\n"); ++ if (debug&L_DATA) acx100usb_dump_bytes(buf,size+sizeof(acx100_usb_txhdr_t)); ++ /* --------------------------------------------- ++ ** check whether we need to send the data in ++ ** fragments (block larger than max bulkout ++ ** size)... ++ ** ------------------------------------------ */ ++ acxlog(L_DEBUG,"USB xfer size: %d\n",size+sizeof(acx100_usb_txhdr_t)); ++ priv->usb_txsize=size+sizeof(acx100_usb_txhdr_t); ++ if (priv->usb_txsizeusb_max_bulkout) { ++ priv->usb_txoffset=priv->usb_txsize; ++ txsize=priv->usb_txsize; ++ } else { ++ priv->usb_txoffset=priv->usb_max_bulkout; ++ txsize=priv->usb_max_bulkout; ++ } ++ /* --------------------------------------------- ++ ** now schedule the USB transfer... ++ ** ------------------------------------------ */ ++ usbdev=priv->usbdev; ++ outpipe=usb_sndbulkpipe(usbdev,1); /* default endpoint for bulk-transfers: 1 */ ++ acxlog(L_DEBUG,"sending initial %d bytes (remain: %d)\n",txsize,priv->usb_txsize-priv->usb_txoffset); ++ usb_fill_bulk_urb(priv->bulktx_urb,usbdev,outpipe,buf,txsize,acx100usb_complete_tx,priv); ++ priv->bulktx_urb->transfer_flags=ASYNC_UNLINK; ++ priv->bulktx_urb->timeout=ACX100_USB_TX_TIMEOUT; ++ ucode=submit_urb(priv->bulktx_urb, GFP_KERNEL); ++ acxlog(L_DEBUG,"dump: outpipe=%X buf=%p txsize=%d\n",outpipe,buf,txsize); ++ if (ucode!=0) { ++ acxlog(L_STD,"submit_urb() return code: %d (%s:%d)\n",ucode,__FILE__,__LINE__); ++ /* ------------------------------------------------- ++ ** on error, just mark the frame as done and update ++ ** the statistics... ++ ** ---------------------------------------------- */ ++ priv->stats.tx_errors++; ++ acx100usb_trigger_next_tx(priv); ++ } ++ FN_EXIT(0,0); ++} ++ ++ ++ ++ ++/* --------------------------------------------------------------------------- ++** acx100usb_send_tx_frags(): ++** Inputs: ++** priv -> Pointer to WLAN device structure ++** --------------------------------------------------------------------------- ++** Returns: ++** ++** ++** Description: ++** This function sends out the remaining bytes of a USB transfer buffer to ++** the endpoint, due to the restrictions on the max. transfer size of bulk ++** USB transfers. ++** ------------------------------------------------------------------------- */ ++ ++static void acx100usb_send_tx_frags(wlandevice_t *priv) { ++ struct usb_device *usbdev; ++ unsigned int outpipe; ++ int ucode,diff,txsize; ++ char *buf; ++ FN_ENTER; ++ ++ buf=((char *)&(priv->bulkout))+priv->usb_txoffset; ++ diff=priv->usb_txsize-priv->usb_txoffset; ++ if (diff<=0) return; ++ if (diffusb_max_bulkout) { ++ priv->usb_txoffset+=diff; ++ txsize=diff; ++ } else { ++ priv->usb_txoffset+=priv->usb_max_bulkout; ++ txsize=priv->usb_max_bulkout; ++ } ++ acxlog(L_DEBUG,"sending %d bytes (remain: %d)\n",txsize,priv->usb_txsize-priv->usb_txoffset); ++ usbdev=priv->usbdev; ++ outpipe=usb_sndbulkpipe(usbdev,1); /* default endpoint for bulk-transfers: 1 */ ++ usb_fill_bulk_urb(priv->bulktx_urb,usbdev,outpipe,buf,txsize,acx100usb_complete_tx,priv); ++ priv->bulktx_urb->transfer_flags=ASYNC_UNLINK; ++ priv->bulktx_urb->timeout=ACX100_USB_TX_TIMEOUT; ++ ucode=submit_urb(priv->bulktx_urb, GFP_KERNEL); ++ if (ucode!=0) { ++ acxlog(L_STD,"submit_urb() return code: %d (%s:%d)\n",ucode,__FILE__,__LINE__); ++ /* ------------------------------------------------- ++ ** on error, just mark the frame as done and update ++ ** the statistics... ++ ** ---------------------------------------------- */ ++ priv->stats.tx_errors++; ++ acx100usb_trigger_next_tx(priv); ++ } ++ FN_EXIT(0,0); ++} ++ ++ ++/* --------------------------------------------------------------------------- ++** acx100usb_flush_tx(): ++** Inputs: ++** priv -> Pointer to WLAN device structure ++** --------------------------------------------------------------------------- ++** Returns: ++** ++** ++** Description: ++** This function sends out a null packet to the USB device. Because the ++** device has an internal data buffer, transfers of packets whose size exactly ++** divides the max. size of bulk transfers are not recognized as finished by ++** the card. ++** ------------------------------------------------------------------------- */ ++ ++static void acx100usb_flush_tx(wlandevice_t *priv) ++{ ++ struct usb_device *usbdev; ++ unsigned int outpipe; ++ int ucode; ++ char *buf; ++ FN_ENTER; ++ buf=((char *)&(priv->bulkout))+priv->usb_txoffset; ++ priv->usb_txoffset++; /* just to make sure that this function is invoked only ONCE */ ++ usbdev=priv->usbdev; ++ outpipe=usb_sndbulkpipe(usbdev,1); /* default endpoint for bulk-transfers: 1 */ ++ usb_fill_bulk_urb(priv->bulktx_urb,usbdev,outpipe,buf,0,&(acx100usb_complete_tx),priv); ++ priv->bulktx_urb->transfer_flags=ASYNC_UNLINK; ++ priv->bulktx_urb->timeout=ACX100_USB_TX_TIMEOUT; ++ ucode=submit_urb(priv->bulktx_urb, GFP_KERNEL); ++ if (ucode!=0) { ++ acxlog(L_STD,"submit_urb() return code: %d (%s:%d)\n",ucode,__FILE__,__LINE__); ++ /* ------------------------------------------------- ++ ** on error, just mark the frame as done and update ++ ** the statistics... ++ ** ---------------------------------------------- */ ++ priv->stats.tx_errors++; ++ acx100usb_trigger_next_tx(priv); ++ } ++ FN_EXIT(0,0); ++} ++ ++ ++ ++ ++/* --------------------------------------------------------------------------- ++** acx100usb_complete_tx(): ++** Inputs: ++** urb -> Pointer to USB request block ++** regs -> Pointer to register-buffer for syscalls (see asm/ptrace.h) ++** --------------------------------------------------------------------------- ++** Returns: ++** ++** ++** Description: ++** This function is invoked upon termination of a USB transfer. As the ++** USB device is only capable of sending a limited amount of bytes per ++** transfer to the bulk-out endpoint, this routine checks if there are ++** more bytes to send and triggers subsequent transfers. In case the ++** transfer size exactly matches the maximum bulk-out size, it triggers ++** a transfer of a null-frame, telling the card that this is it. Upon ++** completion of a frame, it checks whether the Tx ringbuffer contains ++** more data to send and invokes the Tx routines if this is the case. ++** If there are no more occupied Tx descriptors, the Tx Mutex is unlocked ++** and the network queue is switched back to life again. ++** ------------------------------------------------------------------------- */ ++ ++#if USB_24 ++static void acx100usb_complete_tx(struct urb *urb) ++#else ++static void acx100usb_complete_tx(struct urb *urb, struct pt_regs *regs) ++#endif ++{ ++ wlandevice_t *priv; ++ ++ FN_ENTER; ++ ++ priv=(wlandevice_t *)urb->context; ++ if (!priv) acxlog(L_STD,"ERROR, encountered NULL WLAN device in URB\n"); ++ /* ------------------------------ ++ ** handle USB transfer errors... ++ ** --------------------------- */ ++ if (urb->status!=0) { ++ acx100usb_trigger_next_tx(priv); ++ } ++ /* --------------------------------------------- ++ ** check if there is more data to transmit... ++ ** --------------------------------------------- */ ++ acxlog(L_DEBUG,"transfer_buffer: %p priv->bulkout: %p\n",urb->transfer_buffer,&(priv->bulkout)); ++ acxlog(L_DEBUG,"actual length: %d status: %d\n",urb->actual_length,urb->status); ++ acxlog(L_DEBUG,"bulk xmt completed (status=%d, len=%d) TxQueueFree=%ld\n",urb->status,urb->actual_length,priv->TxQueueFree); ++ if (priv->usb_txoffsetusb_txsize) { ++ acx100usb_send_tx_frags(priv); ++ } else { ++ if ((priv->usb_txoffset==priv->usb_txsize)&&((priv->usb_txoffset%priv->usb_max_bulkout)==0)) { ++ /* --------------------------------------------- ++ ** in case the block was exactly the maximum tx ++ ** size of the bulk endpoint, send out a null ++ ** message so that the card sends out the block ++ ** from its internal memory... ++ ** --------------------------------------------- */ ++ acx100usb_flush_tx(priv); ++ } ++ acx100usb_trigger_next_tx(priv); ++ } ++ FN_EXIT(0,0); ++} ++ ++ ++/* --------------------------------------------------------------------------- ++** acx100usb_trigger_next_tx(): ++** Inputs: ++** priv -> Pointer to WLAN device structure ++** --------------------------------------------------------------------------- ++** Returns: ++** ++** ++** Description: ++** This function is invoked when the transfer of the current txdescriptor ++** to send is completed OR if there went something wrong during the transfer ++** of the descriptor. In either case, this function checks if there are more ++** descriptors to send and handles the descriptors over to the ++** acx100usb_prepare_tx() function. If there are no more descriptors to send, ++** the transfer-in-progress Mutex is released and the network tx queue is ++** kicked back to life. ++** ------------------------------------------------------------------------ */ ++ ++static void acx100usb_trigger_next_tx(wlandevice_t *priv) { ++ struct txdescriptor *txdesc; ++ struct txhostdescriptor *header,*payload; ++ int descnum,flags; ++ struct TIWLAN_DC *ticontext; ++ /* ---------------------------- ++ ** grab the TI device context ++ ** -------------------------- */ ++ ticontext=&(priv->dc); ++ /* ---------------------------------------------- ++ ** free the txdescriptor... ++ ** ------------------------------------------- */ ++ txdesc=priv->currentdesc; ++ header = txdesc->host_desc; ++ payload = txdesc->host_desc+1; ++ header->Ctl|=DESC_CTL_DONE; ++ payload->Ctl|=DESC_CTL_DONE; ++ txdesc->Ctl|=DESC_CTL_DONE; ++ acx100_clean_tx_desc(priv); ++ /* ---------------------------------------------- ++ ** check if there are still descriptors that have ++ ** to be sent. acx100_clean_tx_desc() should ++ ** have set the next non-free descriptor position ++ ** in tx_tail... ++ ** ------------------------------------------- */ ++ descnum=ticontext->tx_tail; ++ txdesc=&(ticontext->pTxDescQPool[descnum]); ++ if (!(txdesc->Ctl & ACX100_CTL_OWN)) { ++ acx100usb_prepare_tx(priv,txdesc); ++ } else { ++ /* ---------------------------------------------- ++ ** now release the mutex and wake the output ++ ** queue... ++ ** ------------------------------------------- */ ++ spin_lock_irqsave(&(priv->usb_tx_lock),flags); ++ priv->usb_tx_mutex=0; ++ spin_unlock_irqrestore(&(priv->usb_tx_lock),flags); ++ netif_wake_queue(priv->netdev); ++ } ++} ++ ++ ++/* --------------------------------------------------------------------------- ++** acx100usb_stop(): ++** Inputs: ++** dev -> Pointer to network device structure ++** --------------------------------------------------------------------------- ++** Returns: ++** (int) 0 on success, or error-code ++** ++** Description: ++** This function stops the network functionality of the interface (invoked ++** when the user calls ifconfig down). The tx queue is halted and ++** the device is markes as down. In case there were any pending USB bulk ++** transfers, these are unlinked (asynchronously). The module in-use count ++** is also decreased in this function. ++** ------------------------------------------------------------------------- */ ++ ++static int acx100usb_stop(struct net_device *dev) ++{ ++ wlandevice_t *priv; ++ int already_down; ++ if (!(dev->priv)) { ++ printk(KERN_ERR SHORTNAME ": no pointer to acx100 context in network device, cannot operate.\n"); ++ return -ENODEV; ++ } ++ priv=dev->priv; ++ FN_ENTER; ++ /* -------------------------------- ++ * stop the transmit queue... ++ * ------------------------------ */ ++ if (!netif_queue_stopped(dev)) { ++ netif_stop_queue(dev); ++ } ++ /* -------------------------------- ++ * mark the device as DOWN ++ * ----------------------------- */ ++ if (priv->dev_state_mask&ACX_STATE_IFACE_UP) already_down=0; else already_down=1; ++ priv->dev_state_mask&=~ACX_STATE_IFACE_UP; ++ /* -------------------------------------- ++ * interrupt pending bulk transfers .... ++ * ----------------------------------- */ ++ if (priv->bulkrx_urb->status==-EINPROGRESS) usb_unlink_urb(priv->bulkrx_urb); ++ if (priv->bulktx_urb->status==-EINPROGRESS) usb_unlink_urb(priv->bulktx_urb); ++ if (!already_down) WLAN_MOD_DEC_USE_COUNT; ++ FN_EXIT(1,0); ++ return 0; ++} ++ ++ ++ ++/* --------------------------------------------------------------------------- ++** acx100usb_start_xmit(): ++** Inputs: ++** skb -> Pointer to sk_buffer that contains the data to send ++** dev -> Pointer to the network device this transfer is directed to ++** --------------------------------------------------------------------------- ++** Returns: ++** (int) 0 on success, or error-code ++** ++** Description: ++** ------------------------------------------------------------------------- */ ++ ++static int acx100usb_start_xmit(struct sk_buff *skb, netdevice_t * dev) { ++ int txresult = 0; ++ unsigned long flags; ++ wlandevice_t *priv = (wlandevice_t *) dev->priv; ++ struct txdescriptor *tx_desc; ++ int templen; ++ ++ FN_ENTER; ++ ++ if (!skb) { ++ return 0; ++ } ++ if (!priv) { ++ return 1; ++ } ++ /* ++ if (!(priv->open)) { ++ return 1; ++ } ++ */ ++ /* -------------------------------------- ++ ** if the device is otherwise locked, ++ ** bail-out... ++ ** ----------------------------------- */ ++ if (acx100_lock(priv, &flags)) ++ return 1; ++ /* -------------------------------------- ++ ** if the queue is halted, there is no point ++ ** in sending out data... ++ ** ----------------------------------- */ ++ if (netif_queue_stopped(dev)) { ++ acxlog(L_BINSTD, "%s: called when queue stopped\n", __func__); ++ txresult = 1; ++ goto end; ++ } ++ /* -------------------------------------- ++ ** there is no one to talk to... ++ ** ----------------------------------- */ ++ if (priv->status != ISTATUS_4_ASSOCIATED) { ++ acxlog(L_XFER, "Trying to xmit, but not associated yet: aborting...\n"); ++ /* silently drop the packet, since we're not connected yet */ ++ dev_kfree_skb(skb); ++ priv->stats.tx_errors++; ++ txresult = 0; ++ goto end; ++ } ++#if 0 ++ /* we're going to transmit now, so stop another packet from entering. ++ * FIXME: most likely we shouldn't do it like that, but instead: ++ * stop the queue during card init, then wake the queue once ++ * we're associated to the network, then stop the queue whenever ++ * we don't have any free Tx buffers left, and wake it again once a ++ * Tx buffer becomes free again. And of course also stop the ++ * queue once we lose association to the network (since it ++ * doesn't make sense to allow more user packets if we can't ++ * forward them to a network). ++ * FIXME: Hmm, seems this is all wrong. We SHOULD leave the ++ * queue open from the beginning (as long as we're not full, ++ * and also even before we're even associated), ++ * otherwise we'll get NETDEV WATCHDOG transmit timeouts... */ ++ acxlog(L_XFER, "stop queue during Tx.\n"); ++ netif_stop_queue(dev); ++#endif ++#if UNUSED ++ if (acx100_lock(priv,&flags)) ... ++ ++ memset(pb, 0, sizeof(wlan_pb_t) /*0x14*4 */ ); ++ ++ pb->ethhostbuf = skb; ++ pb->ethbuf = skb->data; ++#endif ++ templen = skb->len; ++ /* ------------------------------------ ++ ** get the next free tx descriptor... ++ ** -------------------------------- */ ++ if ((tx_desc = acx100_get_tx_desc(priv)) == NULL) { ++ acxlog(L_BINSTD,"BUG: txdesc ring full\n"); ++ txresult = 1; ++ goto end; ++ } ++ /* ------------------------------------ ++ ** convert the ethernet frame into our ++ ** own tx descriptor type... ++ ** -------------------------------- */ ++ acx100_ether_to_txdesc(priv,tx_desc,skb); ++ /* ------------------------- ++ ** free the skb ++ ** ---------------------- */ ++ dev_kfree_skb(skb); ++ dev->trans_start = jiffies; ++ /* ----------------------------------- ++ ** until the packages are flushed out, ++ ** stop the queue... ++ ** -------------------------------- */ ++ netif_stop_queue(dev); ++ /* ----------------------------------- ++ ** transmit the data... ++ ** -------------------------------- */ ++ acx100_dma_tx_data(priv, tx_desc); /* this function finally calls acx100usb_tx_data() */ ++ txresult=0; ++ /* ----------------------------------- ++ ** statistical bookkeeping... ++ ** -------------------------------- */ ++ priv->stats.tx_packets++; ++ priv->stats.tx_bytes += templen; ++end: ++ acx100_unlock(priv, &flags); ++ FN_EXIT(1, txresult); ++ return txresult; ++} ++ ++ ++ ++static struct net_device_stats *acx100_get_stats(netdevice_t *dev) { ++ wlandevice_t *priv = (wlandevice_t *)dev->priv; ++ FN_ENTER; ++ FN_EXIT(1, (int)&priv->stats); ++ return &priv->stats; ++} ++ ++ ++ ++static struct iw_statistics *acx100_get_wireless_stats(netdevice_t *dev) { ++ wlandevice_t *priv = (wlandevice_t *)dev->priv; ++ FN_ENTER; ++ FN_EXIT(1, (int)&priv->stats); ++ return &priv->wstats; ++} ++ ++ ++ ++static void acx100usb_set_rx_mode(struct net_device *dev) ++{ ++} ++ ++ ++ ++#ifdef HAVE_TX_TIMEOUT ++static void acx100usb_tx_timeout(struct net_device *dev) { ++ wlandevice_t *priv; ++ FN_ENTER; ++ priv=dev->priv; ++ /* ------------------------------------ ++ ** unlink the URB.... ++ ** --------------------------------- */ ++ usb_unlink_urb(priv->bulktx_urb); ++ /* ------------------------------------ ++ ** TODO: stats update ++ ** --------------------------------- */ ++ FN_EXIT(0,0); ++} ++#endif ++ ++ ++ ++ ++ ++/* --------------------------------------------------------------------------- ++** init_module(): ++** Inputs: ++** ++** --------------------------------------------------------------------------- ++** Returns: ++** (int) Errorcode on failure, 0 on success ++** ++** Description: ++** This function is invoked upon loading of the kernel module. It registers ++** itself at the Kernel's USB subsystem. ++** ------------------------------------------------------------------------ */ ++ ++int init_module() { ++ int err; ++ printk(KERN_INFO "Initializing acx100 WLAN USB kernel module\n"); ++ /* ------------------------------------------------------ ++ ** Register this driver to the USB subsystem ++ ** --------------------------------------------------- */ ++ err=usb_register(&acx100usb_driver); ++ if (!err) { ++ return(err); ++ } ++ return(0); ++} ++ ++ ++ ++/* --------------------------------------------------------------------------- ++** cleanup_module(): ++** Inputs: ++** ++** --------------------------------------------------------------------------- ++** Returns: ++** ++** ++** Description: ++** This function is invoked as last step of the module unloading. It simply ++** deregisters this module at the Kernel's USB subsystem. ++** ------------------------------------------------------------------------- */ ++ ++void cleanup_module() { ++ usb_deregister(&acx100usb_driver); ++ printk(KERN_INFO "Cleaning up acx100 WLAN USB kernel module\n"); ++} ++ ++ ++ ++/* --------------------------------------------------------------------------- ++** DEBUG STUFF ++** --------------------------------------------------------------------------- */ ++ ++#ifdef ACX_DEBUG ++#if USB_24 ++static char *acx100usb_pstatus(int val) ++{ ++#define CASE(status) case status: return ""#status"" ++ switch (val) { ++ CASE(USB_ST_NOERROR); ++ CASE(USB_ST_CRC); ++ CASE(USB_ST_BITSTUFF); ++ CASE(USB_ST_DATAOVERRUN); ++ CASE(USB_ST_BUFFEROVERRUN); ++ CASE(USB_ST_BUFFERUNDERRUN); ++ CASE(USB_ST_SHORT_PACKET); ++ CASE(USB_ST_URB_KILLED); ++ CASE(USB_ST_URB_PENDING); ++ CASE(USB_ST_REMOVED); ++ CASE(USB_ST_TIMEOUT); ++ CASE(USB_ST_NOTSUPPORTED); ++ CASE(USB_ST_BANDWIDTH_ERROR); ++ CASE(USB_ST_URB_INVALID_ERROR); ++ CASE(USB_ST_URB_REQUEST_ERROR); ++ CASE(USB_ST_STALL); ++ default: ++ return "UNKNOWN"; ++ } ++} ++#else ++static char *acx100usb_pstatus(int val) ++{ ++ static char status[80]; ++ ++ if (val < 0) ++ sprintf(status, "errno %d\n", -val); ++ else ++ sprintf(status, "length %d\n", val); ++ ++ return status; ++} ++#endif ++ ++static void dump_usbblock(char *block,int bytes) ++{ ++ int i; ++ for (i=0;idevnum); ++ printk(KERN_INFO " speed: %d\n",usbdev->speed); ++ printk(KERN_INFO " tt: 0x%X\n",(unsigned int)(usbdev->tt)); ++ printk(KERN_INFO " ttport: %d\n",(unsigned int)(usbdev->ttport)); ++ printk(KERN_INFO " toggle[0]: 0x%X toggle[1]: 0x%X\n",(unsigned int)(usbdev->toggle[0]),(unsigned int)(usbdev->toggle[1])); ++ printk(KERN_INFO " halted[0]: 0x%X halted[1]: 0x%X\n",usbdev->halted[0],usbdev->halted[1]); ++ printk(KERN_INFO " epmaxpacketin: "); ++ for (i=0;i<16;i++) printk("%d ",usbdev->epmaxpacketin[i]); ++ printk("\n"); ++ printk(KERN_INFO " epmaxpacketout: "); ++ for (i=0;i<16;i++) printk("%d ",usbdev->epmaxpacketout[i]); ++ printk("\n"); ++ printk(KERN_INFO " parent: 0x%X\n",(unsigned int)(usbdev->parent)); ++ printk(KERN_INFO " bus: 0x%X\n",(unsigned int)(usbdev->bus)); ++#if NO_DATATYPE ++ printk(KERN_INFO " configs: "); ++ for (i=0;idescriptor.bNumConfigurations;i++) printk("0x%X ",usbdev->config[i]); ++ printk("\n"); ++#endif ++ printk(KERN_INFO " actconfig: %p\n",usbdev->actconfig); ++ dump_device_descriptor(&(usbdev->descriptor)); ++#if USB_24 ++ cd = usbdev->actconfig; ++#else ++ cd = &usbdev->config->desc; ++#endif ++ dump_config_descriptor(cd); ++#if USB_24 ++ { ++ struct usb_interface *ifc; ++ ifc=cd->interface; ++ if (ifc) { ++ printk(KERN_INFO "iface: altsetting=%p act_altsetting=%d num_altsetting=%d max_altsetting=%d\n",ifc->altsetting,ifc->act_altsetting,ifc->num_altsetting,ifc->max_altsetting); ++ dump_interface_descriptor(ifc->altsetting); ++ dump_endpoint_descriptor(ifc->altsetting->endpoint); ++ } ++ } ++#endif ++} ++ ++ ++static void dump_config_descriptor(struct usb_config_descriptor *cd) ++{ ++ printk(KERN_INFO "Configuration Descriptor:\n"); ++ if (!cd) { ++ printk(KERN_INFO "NULL\n"); ++ return; ++ } ++ printk(KERN_INFO " bLength: %d (0x%X)\n",cd->bLength,cd->bLength); ++ printk(KERN_INFO " bDescriptorType: %d (0x%X)\n",cd->bDescriptorType,cd->bDescriptorType); ++ printk(KERN_INFO " bNumInterfaces: %d (0x%X)\n",cd->bNumInterfaces,cd->bNumInterfaces); ++ printk(KERN_INFO " bConfigurationValue: %d (0x%X)\n",cd->bConfigurationValue,cd->bConfigurationValue); ++ printk(KERN_INFO " iConfiguration: %d (0x%X)\n",cd->iConfiguration,cd->iConfiguration); ++ printk(KERN_INFO " bmAttributes: %d (0x%X)\n",cd->bmAttributes,cd->bmAttributes); ++ //printk(KERN_INFO " MaxPower: %d (0x%X)\n",cd->bMaxPower,cd->bMaxPower); ++} ++ ++static void dump_device_descriptor(struct usb_device_descriptor *dd) ++{ ++ printk(KERN_INFO "Device Descriptor:\n"); ++ if (!dd) { ++ printk(KERN_INFO "NULL\n"); ++ return; ++ } ++ printk(KERN_INFO " bLength: %d (0x%X)\n",dd->bLength,dd->bLength); ++ printk(KERN_INFO " bDescriptortype: %d (0x%X)\n",dd->bDescriptorType,dd->bDescriptorType); ++ printk(KERN_INFO " bcdUSB: %d (0x%X)\n",dd->bcdUSB,dd->bcdUSB); ++ printk(KERN_INFO " bDeviceClass: %d (0x%X)\n",dd->bDeviceClass,dd->bDeviceClass); ++ printk(KERN_INFO " bDeviceSubClass: %d (0x%X)\n",dd->bDeviceSubClass,dd->bDeviceSubClass); ++ printk(KERN_INFO " bDeviceProtocol: %d (0x%X)\n",dd->bDeviceProtocol,dd->bDeviceProtocol); ++ printk(KERN_INFO " bMaxPacketSize0: %d (0x%X)\n",dd->bMaxPacketSize0,dd->bMaxPacketSize0); ++ printk(KERN_INFO " idVendor: %d (0x%X)\n",dd->idVendor,dd->idVendor); ++ printk(KERN_INFO " idProduct: %d (0x%X)\n",dd->idProduct,dd->idProduct); ++ printk(KERN_INFO " bcdDevice: %d (0x%X)\n",dd->bcdDevice,dd->bcdDevice); ++ printk(KERN_INFO " iManufacturer: %d (0x%X)\n",dd->iManufacturer,dd->iManufacturer); ++ printk(KERN_INFO " iProduct: %d (0x%X)\n",dd->iProduct,dd->iProduct); ++ printk(KERN_INFO " iSerialNumber: %d (0x%X)\n",dd->iSerialNumber,dd->iSerialNumber); ++ printk(KERN_INFO " bNumConfigurations: %d (0x%X)\n",dd->bNumConfigurations,dd->bNumConfigurations); ++} ++ ++static void dump_endpoint_descriptor(struct usb_endpoint_descriptor *ep) ++{ ++ printk(KERN_INFO "Endpoint Descriptor:\n"); ++ if (!ep) { ++ printk(KERN_INFO "NULL\n"); ++ return; ++ } ++ printk(KERN_INFO " bLength: %d (0x%X)\n",ep->bLength,ep->bLength); ++ printk(KERN_INFO " bDescriptorType: %d (0x%X)\n",ep->bDescriptorType,ep->bDescriptorType); ++ printk(KERN_INFO " bEndpointAddress: %d (0x%X)\n",ep->bEndpointAddress,ep->bEndpointAddress); ++ printk(KERN_INFO " bmAttributes: 0x%X\n",ep->bmAttributes); ++ printk(KERN_INFO " wMaxPacketSize: %d (0x%X)\n",ep->wMaxPacketSize,ep->wMaxPacketSize); ++ printk(KERN_INFO " bInterval: %d (0x%X)\n",ep->bInterval,ep->bInterval); ++ printk(KERN_INFO " bRefresh: %d (0x%X)\n",ep->bRefresh,ep->bRefresh); ++ printk(KERN_INFO " bSyncAdrress: %d (0x%X)\n",ep->bSynchAddress,ep->bSynchAddress); ++} ++ ++static void dump_interface_descriptor(struct usb_interface_descriptor *id) ++{ ++ printk(KERN_INFO "Interface Descriptor:\n"); ++ if (!id) { ++ printk(KERN_INFO "NULL\n"); ++ return; ++ } ++ printk(KERN_INFO " bLength: %d (0x%X)\n",id->bLength,id->bLength); ++ printk(KERN_INFO " bDescriptorType: %d (0x%X)\n",id->bDescriptorType,id->bDescriptorType); ++ printk(KERN_INFO " bInterfaceNumber: %d (0x%X)\n",id->bInterfaceNumber,id->bInterfaceNumber); ++ printk(KERN_INFO " bAlternateSetting: %d (0x%X)\n",id->bAlternateSetting,id->bAlternateSetting); ++ printk(KERN_INFO " bNumEndpoints: %d (0x%X)\n",id->bNumEndpoints,id->bNumEndpoints); ++ printk(KERN_INFO " bInterfaceClass: %d (0x%X)\n",id->bInterfaceClass,id->bInterfaceClass); ++ printk(KERN_INFO " bInterfaceSubClass: %d (0x%X)\n",id->bInterfaceSubClass,id->bInterfaceSubClass); ++ printk(KERN_INFO " bInterfaceProtocol: %d (0x%X)\n",id->bInterfaceProtocol,id->bInterfaceProtocol); ++ printk(KERN_INFO " iInterface: %d (0x%X)\n",id->iInterface,id->iInterface); ++#if USB_24 ++ printk(KERN_INFO " endpoint: 0x%X\n",(unsigned int)(id->endpoint)); ++#endif ++} ++ ++void acx100usb_dump_bytes(void *data,int num) ++{ ++ int i,remain=num; ++ unsigned char *ptr=(unsigned char *)data; ++ while (remain>0) { ++ if (remain<16) { ++ printk(KERN_WARNING); ++ for (i=0;i ++#include ++ ++#include ++#include ++#include ++ ++#include ++ ++ ++/*================================================================*/ ++/* Project Includes */ ++ ++#include ++#include ++#include ++ ++/*================================================================*/ ++/* Local Constants */ ++ ++ ++/*================================================================*/ ++/* Local Types */ ++ ++ ++/*================================================================*/ ++/* Local statics */ ++ ++ ++/*================================================================*/ ++/* Local Function Declarations */ ++ ++ ++/*================================================================*/ ++/* Local Function Definitions */ ++ ++ ++/*-------------------------------------------------------------- ++* p80211addr_to_str ++* ++* Formats a 6 byte IEEE 802 address as a string of the form ++* xx:xx:xx:xx:xx:xx where the bytes are in hex. No library ++* functions are used to enhance portability. ++* ++* Arguments: ++* buf char buffer, destination for string format ++* 48 bit address. Must be at least 18 bytes long. ++* addr UINT8 buffer containing the ieee802 48 bit address ++* we're converting from. ++* ++* Returns: ++* nothing ++* ++* Side effects: ++* the contents of the space pointed to by buf is filled ++* with the textual representation of addr. ++* ++* STATUS: UNVERIFIED. NONV3. ++* ++--------------------------------------------------------------*/ ++void p802addr_to_str(char *buf, UINT8 * addr) ++{ ++ int strindex = 0; ++ int addrindex; ++ ++ acxlog(L_STATE, "%s: UNVERIFIED. NONV3.\n", __func__); ++ for (addrindex = 0; addrindex < 6; addrindex++) { ++ buf[strindex] = ((addr[addrindex] & 0xf0) >> 4) > 9 ? ++ 'a' + (((addr[addrindex] & 0xf0) >> 4) - 10) : ++ '0' + ((addr[addrindex] & 0xf0) >> 4); ++ buf[strindex + 1] = (addr[addrindex] & 0x0f) > 9 ? ++ 'a' + ((addr[addrindex] & 0x0f) - 10) : ++ '0' + (addr[addrindex] & 0x0f); ++ buf[strindex + 2] = ':'; ++ ++ strindex += 3; ++ } ++ buf[strindex] = '\0'; ++ return; ++} ++ ++/*-------------------------------------------------------------- ++* acx_mgmt_encode_beacon ++* ++* Receives an fr_mgmt struct with its len and buf set. Fills ++* in the rest of the members as far as possible. On entry len ++* is the length of the buffer, on return len is the actual length ++* of the frame with all the currently encoded fields. For ++* frames where the caller adds variable/optional IEs, the caller ++* will have to update the len field. ++* On entry Assumptions: ++* 1) f->len and f->buf are already set ++* 2) f->len is the length of the MAC header + data, the CRC ++* is NOT included ++* 3) all members except len, buf, and priv are zero ++* ++* Arguments: ++* f frame structure ++* ++* Returns: ++* nothing ++* ++* Side effects: ++* frame structure members are pointing at their ++* respective portions of the frame buffer. ++* ++* STATUS: UNVERIFIED. NONV3. ++* ++--------------------------------------------------------------*/ ++void acx_mgmt_encode_beacon(wlan_fr_beacon_t * f) ++{ ++ acxlog(L_STATE, "%s: UNVERIFIED. NONV3.\n", __func__); ++ f->type = WLAN_FSTYPE_BEACON; ++ f->hdr = (p80211_hdr_t *) f->buf; ++ ++ WLAN_ASSERT(f->len >= WLAN_BEACON_FR_MAXLEN); ++ ++ /*-- Fixed Fields ----*/ ++ f->ts = (UINT64 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_BEACON_OFF_TS); ++ f->bcn_int = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_BEACON_OFF_BCN_INT); ++ f->cap_info = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_BEACON_OFF_CAPINFO); ++ ++ f->len = ++ WLAN_HDR_A3_LEN + WLAN_BEACON_OFF_CAPINFO + ++ sizeof(*(f->cap_info)); ++ ++ return; ++} ++ ++/*-------------------------------------------------------------- ++* acx_mgmt_decode_beacon ++* ++* Given a complete frame in f->buf, sets the pointers in f to ++* the areas that correspond to the parts of the frame. ++* ++* Assumptions: ++* 1) f->len and f->buf are already set ++* 2) f->len is the length of the MAC header + data, the CRC ++* is NOT included ++* 3) all members except len and buf are zero ++* Arguments: ++* f frame structure ++* ++* Returns: ++* nothing ++* ++* Side effects: ++* frame structure members are pointing at their ++* respective portions of the frame buffer. ++* ++* STATUS: UNVERIFIED. ++* ++--------------------------------------------------------------*/ ++void acx_mgmt_decode_beacon(wlan_fr_beacon_t * f) ++{ ++ wlan_ie_t *ie_ptr; ++ ++ acxlog(L_STATE, "%s: UNVERIFIED.\n", __func__); ++ f->type = WLAN_FSTYPE_BEACON; ++ f->hdr = (p80211_hdr_t *) f->buf; ++ ++/* WLAN_ASSERT(WLAN_FTYPE_MGMT == ++ WLAN_GET_FC_FTYPE(ieee2host16(f->hdr->a3.fc))); ++ WLAN_ASSERT(WLAN_FSTYPE_BEACON == ++ WLAN_GET_FC_FSTYPE(ieee2host16(f->hdr->a3.fc))); */ ++ ++ /*-- Fixed Fields ----*/ ++ f->ts = (UINT64 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_BEACON_OFF_TS); ++ f->bcn_int = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_BEACON_OFF_BCN_INT); ++ f->cap_info = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_BEACON_OFF_CAPINFO); ++ ++ /*-- Information elements */ ++ ie_ptr = (wlan_ie_t *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_BEACON_OFF_SSID); ++ while (((UINT8 *) ie_ptr) < (f->buf + f->len)) { ++ switch (ie_ptr->eid) { ++ case WLAN_EID_SSID: ++ f->ssid = (wlan_ie_ssid_t *) ie_ptr; ++ break; ++ case WLAN_EID_SUPP_RATES: ++ f->supp_rates = (wlan_ie_supp_rates_t *) ie_ptr; ++ break; ++ case WLAN_EID_FH_PARMS: ++ f->fh_parms = (wlan_ie_fh_parms_t *) ie_ptr; ++ break; ++ case WLAN_EID_DS_PARMS: ++ f->ds_parms = (wlan_ie_ds_parms_t *) ie_ptr; ++ break; ++ case WLAN_EID_CF_PARMS: ++ f->cf_parms = (wlan_ie_cf_parms_t *) ie_ptr; ++ break; ++ case WLAN_EID_IBSS_PARMS: ++ f->ibss_parms = (wlan_ie_ibss_parms_t *) ie_ptr; ++ break; ++ case WLAN_EID_TIM: ++ f->tim = (wlan_ie_tim_t *) ie_ptr; ++ break; ++ default: ++/* WLAN_LOG_WARNING1( ++ ++ "Unrecognized EID=%dd in beacon decode.\n",ie_ptr->eid); ++ WLAN_HEX_DUMP(3, "frm w/ bad eid:", f->buf, f->len ); ++ */ ++ break; ++ } ++ ie_ptr = ++ (wlan_ie_t *) (((UINT8 *) ie_ptr) + 2 + ie_ptr->len); ++ } ++ ++ return; ++} ++ ++ ++/*-------------------------------------------------------------- ++* acx_mgmt_encode_ibssatim ++* ++* Receives an fr_mgmt struct with its len and buf set. Fills ++* in the rest of the members as far as possible. On entry len ++* is the length of the buffer, on return len is the actual length ++* of the frame with all the currently encoded fields. For ++* frames where the caller adds variable/optional IEs, the caller ++* will have to update the len field. ++* On entry Assumptions: ++* 1) f->len and f->buf are already set ++* 2) f->len is the length of the MAC header + data, the CRC ++* is NOT included ++* 3) all members except len, buf, and priv are zero ++* ++* Arguments: ++* f frame structure ++* ++* Returns: ++* nothing ++* ++* Side effects: ++* frame structure members are pointing at their ++* respective portions of the frame buffer. ++* ++* STATUS: UNVERIFIED. NONV3. ++* ++--------------------------------------------------------------*/ ++void acx_mgmt_encode_ibssatim(wlan_fr_ibssatim_t * f) ++{ ++ acxlog(L_STATE, "%s: UNVERIFIED. NONV3.\n", __func__); ++ f->type = WLAN_FSTYPE_ATIM; ++ f->hdr = (p80211_hdr_t *) f->buf; ++ ++ WLAN_ASSERT(f->len >= WLAN_ATIM_FR_MAXLEN); ++ ++ /*-- Fixed Fields ----*/ ++ /*-- Information elements */ ++ ++ f->len = WLAN_HDR_A3_LEN; ++ ++ return; ++} ++ ++ ++/*-------------------------------------------------------------- ++* acx_mgmt_decode_ibssatim ++* ++* Given a complete frame in f->buf, sets the pointers in f to ++* the areas that correspond to the parts of the frame. ++* ++* Assumptions: ++* 1) f->len and f->buf are already set ++* 2) f->len is the length of the MAC header + data, the CRC ++* is NOT included ++* 3) all members except len and buf are zero ++* ++* Arguments: ++* f frame structure ++* ++* Returns: ++* nothing ++* ++* Side effects: ++* frame structure members are pointing at their ++* respective portions of the frame buffer. ++* ++* STATUS: UNVERIFIED. NONV3. ++* ++--------------------------------------------------------------*/ ++void acx_mgmt_decode_ibssatim(wlan_fr_ibssatim_t * f) ++{ ++ f->type = WLAN_FSTYPE_ATIM; ++ f->hdr = (p80211_hdr_t *) f->buf; ++ ++ WLAN_ASSERT(WLAN_FTYPE_MGMT == ++ WLAN_GET_FC_FTYPE(ieee2host16(f->hdr->a3.fc))); ++ WLAN_ASSERT(WLAN_FSTYPE_ATIM == ++ WLAN_GET_FC_FSTYPE(ieee2host16(f->hdr->a3.fc))); ++ ++ /*-- Fixed Fields ----*/ ++ /*-- Information elements */ ++ ++ return; ++} ++ ++ ++/*-------------------------------------------------------------- ++* acx_mgmt_encode_disassoc ++* ++* Receives an fr_mgmt struct with its len and buf set. Fills ++* in the rest of the members as far as possible. On entry len ++* is the length of the buffer, on return len is the actual length ++* of the frame with all the currently encoded fields. For ++* frames where the caller adds variable/optional IEs, the caller ++* will have to update the len field. ++* On entry Assumptions: ++* 1) f->len and f->buf are already set ++* 2) f->len is the length of the MAC header + data, the CRC ++* is NOT included ++* 3) all members except len, buf, and priv are zero ++* ++* Arguments: ++* f frame structure ++* ++* Returns: ++* nothing ++* ++* Side effects: ++* frame structure members are pointing at their ++* respective portions of the frame buffer. ++* ++* STATUS: UNVERIFIED. NONV3. ++* ++--------------------------------------------------------------*/ ++void acx_mgmt_encode_disassoc(wlan_fr_disassoc_t * f) ++{ ++ acxlog(L_STATE, "%s: UNVERIFIED. NONV3.\n", __func__); ++ f->type = WLAN_FSTYPE_DISASSOC; ++ f->hdr = (p80211_hdr_t *) f->buf; ++ ++ WLAN_ASSERT(f->len >= WLAN_DISASSOC_FR_MAXLEN); ++ ++ /*-- Fixed Fields ----*/ ++ f->reason = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_DISASSOC_OFF_REASON); ++ ++ f->len = ++ WLAN_HDR_A3_LEN + WLAN_DISASSOC_OFF_REASON + ++ sizeof(*(f->reason)); ++ ++ return; ++} ++ ++ ++/*-------------------------------------------------------------- ++* acx_mgmt_decode_disassoc ++* ++* Given a complete frame in f->buf, sets the pointers in f to ++* the areas that correspond to the parts of the frame. ++* ++* Assumptions: ++* 1) f->len and f->buf are already set ++* 2) f->len is the length of the MAC header + data, the CRC ++* is NOT included ++* 3) all members except len and buf are zero ++* ++* Arguments: ++* f frame structure ++* ++* Returns: ++* nothing ++* ++* Side effects: ++* frame structure members are pointing at their ++* respective portions of the frame buffer. ++--------------------------------------------------------------*/ ++void acx_mgmt_decode_disassoc(wlan_fr_disassoc_t * f) ++{ ++ acxlog(L_STATE, "%s: UNVERIFIED. NONV3.\n", __func__); ++ f->type = WLAN_FSTYPE_DISASSOC; ++ f->hdr = (p80211_hdr_t *) f->buf; ++ ++ WLAN_ASSERT(WLAN_FTYPE_MGMT == ++ WLAN_GET_FC_FTYPE(ieee2host16(f->hdr->a3.fc))); ++ WLAN_ASSERT(WLAN_FSTYPE_DISASSOC == ++ WLAN_GET_FC_FSTYPE(ieee2host16(f->hdr->a3.fc))); ++ ++ /*-- Fixed Fields ----*/ ++ f->reason = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_DISASSOC_OFF_REASON); ++ ++ /*-- Information elements */ ++ ++ return; ++} ++ ++ ++/*-------------------------------------------------------------- ++* acx_mgmt_encode_assocreq ++* ++* Receives an fr_mgmt struct with its len and buf set. Fills ++* in the rest of the members as far as possible. On entry len ++* is the length of the buffer, on return len is the actual length ++* of the frame with all the currently encoded fields. For ++* frames where the caller adds variable/optional IEs, the caller ++* will have to update the len field. ++* On entry Assumptions: ++* 1) f->len and f->buf are already set ++* 2) f->len is the length of the MAC header + data, the CRC ++* is NOT included ++* 3) all members except len, buf, and priv are zero ++* ++* Arguments: ++* f frame structure ++* ++* Returns: ++* nothing ++* ++* Side effects: ++* frame structure members are pointing at their ++* respective portions of the frame buffer. ++* ++* STATUS: UNVERIFIED. NONV3. ++* ++--------------------------------------------------------------*/ ++void acx_mgmt_encode_assocreq(wlan_fr_assocreq_t * f) ++{ ++ acxlog(L_STATE, "%s: UNVERIFIED. NONV3.\n", __func__); ++ f->type = WLAN_FSTYPE_ASSOCREQ; ++ f->hdr = (p80211_hdr_t *) f->buf; ++ ++ WLAN_ASSERT(f->len >= WLAN_ASSOCREQ_FR_MAXLEN); ++ ++ /*-- Fixed Fields ----*/ ++ f->cap_info = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_ASSOCREQ_OFF_CAP_INFO); ++ f->listen_int = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_ASSOCREQ_OFF_LISTEN_INT); ++ ++ f->len = WLAN_HDR_A3_LEN + ++ WLAN_ASSOCREQ_OFF_LISTEN_INT + sizeof(*(f->listen_int)); ++ ++ return; ++} ++ ++ ++/*-------------------------------------------------------------- ++* acx_mgmt_decode_assocreq ++* ++* Given a complete frame in f->buf, sets the pointers in f to ++* the areas that correspond to the parts of the frame. ++* ++* Assumptions: ++* 1) f->len and f->buf are already set ++* 2) f->len is the length of the MAC header + data, the CRC ++* is NOT included ++* 3) all members except len and buf are zero ++* ++* Arguments: ++* f frame structure ++* ++* Returns: ++* nothing ++* ++* Side effects: ++* frame structure members are pointing at their ++* respective portions of the frame buffer. ++* ++* STATUS: UNVERIFIED. NONV3. ++* ++--------------------------------------------------------------*/ ++void acx_mgmt_decode_assocreq(wlan_fr_assocreq_t * f) ++{ ++ wlan_ie_t *ie_ptr; ++ ++ acxlog(L_STATE, "%s: UNVERIFIED. NONV3.\n", __func__); ++ f->type = WLAN_FSTYPE_ASSOCREQ; ++ f->hdr = (p80211_hdr_t *) f->buf; ++ ++ WLAN_ASSERT(WLAN_FTYPE_MGMT == ++ WLAN_GET_FC_FTYPE(ieee2host16(f->hdr->a3.fc))); ++ WLAN_ASSERT(WLAN_FSTYPE_ASSOCREQ == ++ WLAN_GET_FC_FSTYPE(ieee2host16(f->hdr->a3.fc))); ++ ++ /*-- Fixed Fields ----*/ ++ f->cap_info = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_ASSOCREQ_OFF_CAP_INFO); ++ f->listen_int = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_ASSOCREQ_OFF_LISTEN_INT); ++ ++ /*-- Information elements */ ++ ie_ptr = (wlan_ie_t *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_ASSOCREQ_OFF_SSID); ++ while (((UINT8 *) ie_ptr) < (f->buf + f->len)) { ++ switch (ie_ptr->eid) { ++ case WLAN_EID_SSID: ++ f->ssid = (wlan_ie_ssid_t *) ie_ptr; ++ break; ++ case WLAN_EID_SUPP_RATES: ++ f->supp_rates = (wlan_ie_supp_rates_t *) ie_ptr; ++ break; ++ default: ++ /* ++ acx_log(L_DEBUG, ++ "Unrecognized EID=%dd in assocreq decode.\n", ++ ie_ptr->eid); ++ WLAN_HEX_DUMP(3, "frm w/ bad eid:", f->buf, f->len ); ++ */ ++ break; ++ } ++ ie_ptr = ++ (wlan_ie_t *) (((UINT8 *) ie_ptr) + 2 + ie_ptr->len); ++ } ++ return; ++} ++ ++ ++/*-------------------------------------------------------------- ++* acx_mgmt_encode_assocresp ++* ++* Receives an fr_mgmt struct with its len and buf set. Fills ++* in the rest of the members as far as possible. On entry len ++* is the length of the buffer, on return len is the actual length ++* of the frame with all the currently encoded fields. For ++* frames where the caller adds variable/optional IEs, the caller ++* will have to update the len field. ++* On entry Assumptions: ++* 1) f->len and f->buf are already set ++* 2) f->len is the length of the MAC header + data, the CRC ++* is NOT included ++* 3) all members except len, buf, and priv are zero ++* ++* Arguments: ++* f frame structure ++* ++* Returns: ++* nothing ++* ++* Side effects: ++* frame structure members are pointing at their ++* respective portions of the frame buffer. ++* ++* STATUS: UNVERIFIED. NONV3. ++* ++--------------------------------------------------------------*/ ++void acx_mgmt_encode_assocresp(wlan_fr_assocresp_t * f) ++{ ++ acxlog(L_STATE, "%s: UNVERIFIED. NONV3.\n", __func__); ++ f->type = WLAN_FSTYPE_ASSOCRESP; ++ f->hdr = (p80211_hdr_t *) f->buf; ++ ++ WLAN_ASSERT(f->len >= WLAN_ASSOCRESP_FR_MAXLEN); ++ ++ /*-- Fixed Fields ----*/ ++ f->cap_info = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_ASSOCRESP_OFF_CAP_INFO); ++ f->status = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_ASSOCRESP_OFF_STATUS); ++ f->aid = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_ASSOCRESP_OFF_AID); ++ ++ f->len = ++ WLAN_HDR_A3_LEN + WLAN_ASSOCRESP_OFF_AID + sizeof(*(f->aid)); ++ ++ return; ++} ++ ++ ++/*-------------------------------------------------------------- ++* acx_mgmt_decode_assocresp ++* ++* Given a complete frame in f->buf, sets the pointers in f to ++* the areas that correspond to the parts of the frame. ++* ++* Assumptions: ++* 1) f->len and f->buf are already set ++* 2) f->len is the length of the MAC header + data, the CRC ++* is NOT included ++* 3) all members except len and buf are zero ++* ++* Arguments: ++* f frame structure ++* ++* Returns: ++* nothing ++* ++* Side effects: ++* frame structure members are pointing at their ++* respective portions of the frame buffer. ++* ++* STATUS: UNVERIFIED. NONV3. ++* ++--------------------------------------------------------------*/ ++void acx_mgmt_decode_assocresp(wlan_fr_assocresp_t * f) ++{ ++ f->type = WLAN_FSTYPE_ASSOCRESP; ++ f->hdr = (p80211_hdr_t *) f->buf; ++ ++ WLAN_ASSERT(WLAN_FTYPE_MGMT == ++ WLAN_GET_FC_FTYPE(ieee2host16(f->hdr->a3.fc))); ++ WLAN_ASSERT(WLAN_FSTYPE_ASSOCRESP == ++ WLAN_GET_FC_FSTYPE(ieee2host16(f->hdr->a3.fc))); ++ ++ /*-- Fixed Fields ----*/ ++ f->cap_info = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_ASSOCRESP_OFF_CAP_INFO); ++ f->status = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_ASSOCRESP_OFF_STATUS); ++ f->aid = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_ASSOCRESP_OFF_AID); ++ ++ /*-- Information elements */ ++ f->supp_rates = (wlan_ie_supp_rates_t *) ++ (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_ASSOCRESP_OFF_SUPP_RATES); ++ ++ return; ++} ++ ++ ++/*-------------------------------------------------------------- ++* acx_mgmt_encode_reassocreq ++* ++* Receives an fr_mgmt struct with its len and buf set. Fills ++* in the rest of the members as far as possible. On entry len ++* is the length of the buffer, on return len is the actual length ++* of the frame with all the currently encoded fields. For ++* frames where the caller adds variable/optional IEs, the caller ++* will have to update the len field. ++* On entry Assumptions: ++* 1) f->len and f->buf are already set ++* 2) f->len is the length of the MAC header + data, the CRC ++* is NOT included ++* 3) all members except len, buf, and priv are zero ++* ++* Arguments: ++* f frame structure ++* ++* Returns: ++* nothing ++* ++* Side effects: ++* frame structure members are pointing at their ++* respective portions of the frame buffer. ++* ++* STATUS: UNVERIFIED. NONV3. ++* ++--------------------------------------------------------------*/ ++void acx_mgmt_encode_reassocreq(wlan_fr_reassocreq_t * f) ++{ ++ acxlog(L_STATE, "%s: UNVERIFIED. NONV3.\n", __func__); ++ f->type = WLAN_FSTYPE_REASSOCREQ; ++ f->hdr = (p80211_hdr_t *) f->buf; ++ ++ WLAN_ASSERT(f->len >= WLAN_REASSOCREQ_FR_MAXLEN); ++ ++ /*-- Fixed Fields ----*/ ++ f->cap_info = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_REASSOCREQ_OFF_CAP_INFO); ++ f->listen_int = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_REASSOCREQ_OFF_LISTEN_INT); ++ f->curr_ap = (UINT8 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_REASSOCREQ_OFF_CURR_AP); ++ ++ f->len = ++ WLAN_HDR_A3_LEN + WLAN_REASSOCREQ_OFF_CURR_AP + ++ sizeof(*(f->curr_ap)); ++ ++ return; ++} ++ ++ ++/*-------------------------------------------------------------- ++* acx_mgmt_decode_reassocreq ++* ++* Given a complete frame in f->buf, sets the pointers in f to ++* the areas that correspond to the parts of the frame. ++* ++* Assumptions: ++* 1) f->len and f->buf are already set ++* 2) f->len is the length of the MAC header + data, the CRC ++* is NOT included ++* 3) all members except len and buf are zero ++* ++* Arguments: ++* f frame structure ++* ++* Returns: ++* nothing ++* ++* Side effects: ++* frame structure members are pointing at their ++* respective portions of the frame buffer. ++* ++* STATUS: UNVERIFIED. NONV3. ++* ++--------------------------------------------------------------*/ ++void acx_mgmt_decode_reassocreq(wlan_fr_reassocreq_t * f) ++{ ++ wlan_ie_t *ie_ptr; ++ ++ acxlog(L_STATE, "%s: UNVERIFIED. NONV3.\n", __func__); ++ f->type = WLAN_FSTYPE_REASSOCREQ; ++ f->hdr = (p80211_hdr_t *) f->buf; ++ ++ WLAN_ASSERT(WLAN_FTYPE_MGMT == ++ WLAN_GET_FC_FTYPE(ieee2host16(f->hdr->a3.fc))); ++ WLAN_ASSERT(WLAN_FSTYPE_REASSOCREQ == ++ WLAN_GET_FC_FSTYPE(ieee2host16(f->hdr->a3.fc))); ++ ++ /*-- Fixed Fields ----*/ ++ f->cap_info = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_REASSOCREQ_OFF_CAP_INFO); ++ f->listen_int = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_REASSOCREQ_OFF_LISTEN_INT); ++ f->curr_ap = (UINT8 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_REASSOCREQ_OFF_CURR_AP); ++ ++ /*-- Information elements */ ++ ie_ptr = (wlan_ie_t *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_REASSOCREQ_OFF_SSID); ++ while (((UINT8 *) ie_ptr) < (f->buf + f->len)) { ++ switch (ie_ptr->eid) { ++ case WLAN_EID_SSID: ++ f->ssid = (wlan_ie_ssid_t *) ie_ptr; ++ break; ++ case WLAN_EID_SUPP_RATES: ++ f->supp_rates = (wlan_ie_supp_rates_t *) ie_ptr; ++ break; ++ default: ++ /* ++ WLAN_LOG_WARNING1( ++ "Unrecognized EID=%dd in reassocreq decode.\n", ++ ie_ptr->eid); ++ WLAN_HEX_DUMP(3, "frm w/ bad eid:", f->buf, f->len ); ++ */ ++ break; ++ } ++ ie_ptr = ++ (wlan_ie_t *) (((UINT8 *) ie_ptr) + 2 + ie_ptr->len); ++ } ++ return; ++} ++ ++ ++/*-------------------------------------------------------------- ++* acx_mgmt_encode_reassocresp ++* ++* Receives an fr_mgmt struct with its len and buf set. Fills ++* in the rest of the members as far as possible. On entry len ++* is the length of the buffer, on return len is the actual length ++* of the frame with all the currently encoded fields. For ++* frames where the caller adds variable/optional IEs, the caller ++* will have to update the len field. ++* On entry Assumptions: ++* 1) f->len and f->buf are already set ++* 2) f->len is the length of the MAC header + data, the CRC ++* is NOT included ++* 3) all members except len, buf, and priv are zero ++* ++* Arguments: ++* f frame structure ++* ++* Returns: ++* nothing ++* ++* Side effects: ++* frame structure members are pointing at their ++* respective portions of the frame buffer. ++* ++* STATUS: UNVERIFIED. NONV3. ++* ++--------------------------------------------------------------*/ ++void acx_mgmt_encode_reassocresp(wlan_fr_reassocresp_t * f) ++{ ++ acxlog(L_STATE, "%s: UNVERIFIED. NONV3.\n", __func__); ++ f->type = WLAN_FSTYPE_REASSOCRESP; ++ f->hdr = (p80211_hdr_t *) f->buf; ++ ++ WLAN_ASSERT(f->len >= WLAN_REASSOCRESP_FR_MAXLEN); ++ ++ /*-- Fixed Fields ----*/ ++ f->cap_info = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_REASSOCRESP_OFF_CAP_INFO); ++ f->status = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_REASSOCRESP_OFF_STATUS); ++ f->aid = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_REASSOCRESP_OFF_AID); ++ ++ f->len = ++ WLAN_HDR_A3_LEN + WLAN_REASSOCRESP_OFF_AID + sizeof(*(f->aid)); ++ ++ return; ++} ++ ++ ++/*-------------------------------------------------------------- ++* acx_mgmt_decode_reassocresp ++* ++* Given a complete frame in f->buf, sets the pointers in f to ++* the areas that correspond to the parts of the frame. ++* ++* Assumptions: ++* 1) f->len and f->buf are already set ++* 2) f->len is the length of the MAC header + data, the CRC ++* is NOT included ++* 3) all members except len and buf are zero ++* ++* Arguments: ++* f frame structure ++* ++* Returns: ++* nothing ++* ++* Side effects: ++* frame structure members are pointing at their ++* respective portions of the frame buffer. ++* ++* STATUS: UNVERIFIED. NONV3. ++* ++--------------------------------------------------------------*/ ++void acx_mgmt_decode_reassocresp(wlan_fr_reassocresp_t * f) ++{ ++ f->type = WLAN_FSTYPE_REASSOCRESP; ++ f->hdr = (p80211_hdr_t *) f->buf; ++ ++ WLAN_ASSERT(WLAN_FTYPE_MGMT == ++ WLAN_GET_FC_FTYPE(ieee2host16(f->hdr->a3.fc))); ++ WLAN_ASSERT(WLAN_FSTYPE_REASSOCRESP == ++ WLAN_GET_FC_FSTYPE(ieee2host16(f->hdr->a3.fc))); ++ ++ /*-- Fixed Fields ----*/ ++ f->cap_info = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_REASSOCRESP_OFF_CAP_INFO); ++ f->status = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_REASSOCRESP_OFF_STATUS); ++ f->aid = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_REASSOCRESP_OFF_AID); ++ ++ /*-- Information elements */ ++ f->supp_rates = (wlan_ie_supp_rates_t *) ++ (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) + ++ WLAN_REASSOCRESP_OFF_SUPP_RATES); ++ ++ return; ++} ++ ++ ++/*-------------------------------------------------------------- ++* acx_mgmt_encode_probereq ++* ++* Receives an fr_mgmt struct with its len and buf set. Fills ++* in the rest of the members as far as possible. On entry len ++* is the length of the buffer, on return len is the actual length ++* of the frame with all the currently encoded fields. For ++* frames where the caller adds variable/optional IEs, the caller ++* will have to update the len field. ++* On entry Assumptions: ++* 1) f->len and f->buf are already set ++* 2) f->len is the length of the MAC header + data, the CRC ++* is NOT included ++* 3) all members except len, buf, and priv are zero ++* ++* Arguments: ++* f frame structure ++* ++* Returns: ++* nothing ++* ++* Side effects: ++* frame structure members are pointing at their ++* respective portions of the frame buffer. ++* ++* STATUS: UNVERIFIED. NONV3. ++* ++--------------------------------------------------------------*/ ++void acx_mgmt_encode_probereq(wlan_fr_probereq_t * f) ++{ ++ acxlog(L_STATE, "%s: UNVERIFIED. NONV3.\n", __func__); ++ f->type = WLAN_FSTYPE_PROBEREQ; ++ f->hdr = (p80211_hdr_t *) f->buf; ++ ++ WLAN_ASSERT(f->len >= WLAN_PROBEREQ_FR_MAXLEN); ++ ++ f->len = WLAN_HDR_A3_LEN; ++ ++ return; ++} ++ ++ ++/*-------------------------------------------------------------- ++* acx_mgmt_decode_probereq ++* ++* Given a complete frame in f->buf, sets the pointers in f to ++* the areas that correspond to the parts of the frame. ++* ++* Assumptions: ++* 1) f->len and f->buf are already set ++* 2) f->len is the length of the MAC header + data, the CRC ++* is NOT included ++* 3) all members except len and buf are zero ++* ++* Arguments: ++* f frame structure ++* ++* Returns: ++* nothing ++* ++* Side effects: ++* frame structure members are pointing at their ++* respective portions of the frame buffer. ++* ++* STATUS: UNVERIFIED. NONV3. ++* ++--------------------------------------------------------------*/ ++void acx_mgmt_decode_probereq(wlan_fr_probereq_t * f) ++{ ++ wlan_ie_t *ie_ptr; ++ ++ acxlog(L_STATE, "%s: UNVERIFIED. NONV3.\n", __func__); ++ f->type = WLAN_FSTYPE_PROBEREQ; ++ f->hdr = (p80211_hdr_t *) f->buf; ++ ++ WLAN_ASSERT(WLAN_FTYPE_MGMT == ++ WLAN_GET_FC_FTYPE(ieee2host16(f->hdr->a3.fc))); ++ WLAN_ASSERT(WLAN_FSTYPE_PROBEREQ == ++ WLAN_GET_FC_FSTYPE(ieee2host16(f->hdr->a3.fc))); ++ ++ /*-- Fixed Fields ----*/ ++ ++ /*-- Information elements */ ++ ie_ptr = (wlan_ie_t *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_PROBEREQ_OFF_SSID); ++ while (((UINT8 *) ie_ptr) < (f->buf + f->len)) { ++ switch (ie_ptr->eid) { ++ case WLAN_EID_SSID: ++ f->ssid = (wlan_ie_ssid_t *) ie_ptr; ++ break; ++ case WLAN_EID_SUPP_RATES: ++ f->supp_rates = (wlan_ie_supp_rates_t *) ie_ptr; ++ break; ++ default: ++/* ++ WLAN_LOG_WARNING1( ++ "Unrecognized EID=%dd in probereq decode.\n", ++ ie_ptr->eid); ++ WLAN_HEX_DUMP(3, "frm w/ bad eid:", f->buf, f->len ); ++*/ ++ break; ++ } ++ ie_ptr = ++ (wlan_ie_t *) (((UINT8 *) ie_ptr) + 2 + ie_ptr->len); ++ } ++ return; ++} ++ ++ ++/*-------------------------------------------------------------- ++* acx_mgmt_encode_proberesp ++* ++* Receives an fr_mgmt struct with its len and buf set. Fills ++* in the rest of the members as far as possible. On entry len ++* is the length of the buffer, on return len is the actual length ++* of the frame with all the currently encoded fields. For ++* frames where the caller adds variable/optional IEs, the caller ++* will have to update the len field. ++* On entry Assumptions: ++* 1) f->len and f->buf are already set ++* 2) f->len is the length of the MAC header + data, the CRC ++* is NOT included ++* 3) all members except len, buf, and priv are zero ++* ++* Arguments: ++* f frame structure ++* ++* Returns: ++* nothing ++* ++* Side effects: ++* frame structure members are pointing at their ++* respective portions of the frame buffer. ++* ++* STATUS: UNVERIFIED. NONV3. ++* ++--------------------------------------------------------------*/ ++void acx_mgmt_encode_proberesp(wlan_fr_proberesp_t * f) ++{ ++ f->type = WLAN_FSTYPE_PROBERESP; ++ f->hdr = (p80211_hdr_t *) f->buf; ++ ++ WLAN_ASSERT(f->len >= WLAN_PROBERESP_FR_MAXLEN); ++ ++ /*-- Fixed Fields ----*/ ++ f->ts = (UINT64 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_PROBERESP_OFF_TS); ++ f->bcn_int = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_PROBERESP_OFF_BCN_INT); ++ f->cap_info = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_PROBERESP_OFF_CAP_INFO); ++ ++ f->len = WLAN_HDR_A3_LEN + WLAN_PROBERESP_OFF_CAP_INFO + ++ sizeof(*(f->cap_info)); ++ ++ return; ++} ++ ++ ++/*-------------------------------------------------------------- ++* acx_mgmt_decode_proberesp ++* ++* Given a complete frame in f->buf, sets the pointers in f to ++* the areas that correspond to the parts of the frame. ++* ++* Assumptions: ++* 1) f->len and f->buf are already set ++* 2) f->len is the length of the MAC header + data, the CRC ++* is NOT included ++* 3) all members except len and buf are zero ++* ++* Arguments: ++* f frame structure ++* ++* Returns: ++* nothing ++* ++* Side effects: ++* frame structure members are pointing at their ++* respective portions of the frame buffer. ++* ++* STATUS: UNVERIFIED. NONV3. ++* ++--------------------------------------------------------------*/ ++void acx_mgmt_decode_proberesp(wlan_fr_proberesp_t * f) ++{ ++ wlan_ie_t *ie_ptr; ++ ++ acxlog(L_STATE, "%s: UNVERIFIED. NONV3.\n", __func__); ++ f->type = WLAN_FSTYPE_PROBERESP; ++ f->hdr = (p80211_hdr_t *) f->buf; ++ ++ WLAN_ASSERT(WLAN_FTYPE_MGMT == ++ WLAN_GET_FC_FTYPE(ieee2host16(f->hdr->a3.fc))); ++ WLAN_ASSERT(WLAN_FSTYPE_PROBERESP == ++ WLAN_GET_FC_FSTYPE(ieee2host16(f->hdr->a3.fc))); ++ ++ /*-- Fixed Fields ----*/ ++ f->ts = (UINT64 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_PROBERESP_OFF_TS); ++ f->bcn_int = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_PROBERESP_OFF_BCN_INT); ++ f->cap_info = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_PROBERESP_OFF_CAP_INFO); ++ ++ /*-- Information elements */ ++ ie_ptr = (wlan_ie_t *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_PROBERESP_OFF_SSID); ++ while (((UINT8 *) ie_ptr) < (f->buf + f->len)) { ++ switch (ie_ptr->eid) { ++ case WLAN_EID_SSID: ++ f->ssid = (wlan_ie_ssid_t *) ie_ptr; ++ break; ++ case WLAN_EID_SUPP_RATES: ++ f->supp_rates = (wlan_ie_supp_rates_t *) ie_ptr; ++ break; ++ case WLAN_EID_FH_PARMS: ++ f->fh_parms = (wlan_ie_fh_parms_t *) ie_ptr; ++ break; ++ case WLAN_EID_DS_PARMS: ++ f->ds_parms = (wlan_ie_ds_parms_t *) ie_ptr; ++ break; ++ case WLAN_EID_CF_PARMS: ++ f->cf_parms = (wlan_ie_cf_parms_t *) ie_ptr; ++ break; ++ case WLAN_EID_IBSS_PARMS: ++ f->ibss_parms = (wlan_ie_ibss_parms_t *) ie_ptr; ++ break; ++ default: ++ acxlog(L_DEBUG,"Bad EID=%dd in proberesp, off=%d .\n", ++ ie_ptr->eid, f->buf - (UINT8 *) ie_ptr); ++/* WLAN_HEX_DUMP(3, "frm w/ bad eid:", f->buf, ++ f->len); ++*/ ++ break; ++ } ++ ++ ie_ptr = ++ (wlan_ie_t *) (((UINT8 *) ie_ptr) + 2 + ie_ptr->len); ++ } ++ return; ++} ++ ++ ++/*-------------------------------------------------------------- ++* acx_mgmt_encode_authen ++* ++* Receives an fr_mgmt struct with its len and buf set. Fills ++* in the rest of the members as far as possible. On entry len ++* is the length of the buffer, on return len is the actual length ++* of the frame with all the currently encoded fields. For ++* frames where the caller adds variable/optional IEs, the caller ++* will have to update the len field. ++* On entry Assumptions: ++* 1) f->len and f->buf are already set ++* 2) f->len is the length of the MAC header + data, the CRC ++* is NOT included ++* 3) all members except len, buf, and priv are zero ++* ++* Arguments: ++* f frame structure ++* ++* Returns: ++* nothing ++* ++* Side effects: ++* frame structure members are pointing at their ++* respective portions of the frame buffer. ++* ++* STATUS: UNVERIFIED. NONV3. ++* ++--------------------------------------------------------------*/ ++void acx_mgmt_encode_authen(wlan_fr_authen_t * f) ++{ ++ acxlog(L_STATE, "%s: UNVERIFIED. NONV3.\n", __func__); ++ f->type = WLAN_FSTYPE_AUTHEN; ++ f->hdr = (p80211_hdr_t *) f->buf; ++ ++ WLAN_ASSERT(f->len >= WLAN_AUTHEN_FR_MAXLEN); ++ ++ /*-- Fixed Fields ----*/ ++ f->auth_alg = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_AUTHEN_OFF_AUTH_ALG); ++ f->auth_seq = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_AUTHEN_OFF_AUTH_SEQ); ++ f->status = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_AUTHEN_OFF_STATUS); ++ ++ f->len = ++ WLAN_HDR_A3_LEN + WLAN_AUTHEN_OFF_STATUS + ++ sizeof(*(f->status)); ++ ++ return; ++} ++ ++ ++/*-------------------------------------------------------------- ++* acx_mgmt_decode_authen ++* ++* Given a complete frame in f->buf, sets the pointers in f to ++* the areas that correspond to the parts of the frame. ++* ++* Assumptions: ++* 1) f->len and f->buf are already set ++* 2) f->len is the length of the MAC header + data, the CRC ++* is NOT included ++* 3) all members except len and buf are zero ++* ++* Arguments: ++* f frame structure ++* ++* Returns: ++* nothing ++* ++* Side effects: ++* frame structure members are pointing at their ++* respective portions of the frame buffer. ++* ++* STATUS: UNVERIFIED. NONV3. ++* ++--------------------------------------------------------------*/ ++void acx_mgmt_decode_authen(wlan_fr_authen_t * f) ++{ ++ wlan_ie_t *ie_ptr; ++ ++ acxlog(L_STATE, "%s: UNVERIFIED. NONV3.\n", __func__); ++ f->type = WLAN_FSTYPE_AUTHEN; ++ f->hdr = (p80211_hdr_t *) f->buf; ++ ++ WLAN_ASSERT(WLAN_FTYPE_MGMT == ++ WLAN_GET_FC_FTYPE(ieee2host16(f->hdr->a3.fc))); ++ WLAN_ASSERT(WLAN_FSTYPE_AUTHEN == ++ WLAN_GET_FC_FSTYPE(ieee2host16(f->hdr->a3.fc))); ++ ++ /*-- Fixed Fields ----*/ ++ f->auth_alg = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_AUTHEN_OFF_AUTH_ALG); ++ f->auth_seq = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_AUTHEN_OFF_AUTH_SEQ); ++ f->status = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_AUTHEN_OFF_STATUS); ++ ++ /*-- Information elements */ ++ ie_ptr = (wlan_ie_t *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_AUTHEN_OFF_CHALLENGE); ++ if ((((UINT8 *) ie_ptr) < (f->buf + f->len)) && ++ (ie_ptr->eid == WLAN_EID_CHALLENGE)) { ++ f->challenge = (wlan_ie_challenge_t *) ie_ptr; ++ } ++ return; ++} ++ ++ ++/*-------------------------------------------------------------- ++* acx_mgmt_encode_deauthen ++* ++* Receives an fr_mgmt struct with its len and buf set. Fills ++* in the rest of the members as far as possible. On entry len ++* is the length of the buffer, on return len is the actual length ++* of the frame with all the currently encoded fields. For ++* frames where the caller adds variable/optional IEs, the caller ++* will have to update the len field. ++* On entry Assumptions: ++* 1) f->len and f->buf are already set ++* 2) f->len is the length of the MAC header + data, the CRC ++* is NOT included ++* 3) all members except len, buf, and priv are zero ++* ++* Arguments: ++* f frame structure ++* ++* Returns: ++* nothing ++* ++* Side effects: ++* frame structure members are pointing at their ++* respective portions of the frame buffer. ++* STATUS: should be ok.. NONV3. ++* ++* STATUS: UNVERIFIED. NONV3. ++* ++--------------------------------------------------------------*/ ++void acx_mgmt_encode_deauthen(wlan_fr_deauthen_t * f) ++{ ++ acxlog(L_STATE, "%s: NONV3.\n", __func__); ++ f->type = WLAN_FSTYPE_DEAUTHEN; ++ f->hdr = (p80211_hdr_t *) f->buf; ++ ++ WLAN_ASSERT(f->len >= WLAN_DEAUTHEN_FR_MAXLEN); ++ ++ /*-- Fixed Fields ----*/ ++ f->reason = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_DEAUTHEN_OFF_REASON); ++ ++ f->len = ++ WLAN_HDR_A3_LEN + WLAN_DEAUTHEN_OFF_REASON + ++ sizeof(*(f->reason)); ++ ++ return; ++} ++ ++ ++/*-------------------------------------------------------------- ++* acx_mgmt_decode_deauthen ++* ++* Given a complete frame in f->buf, sets the pointers in f to ++* the areas that correspond to the parts of the frame. ++* ++* Assumptions: ++* 1) f->len and f->buf are already set ++* 2) f->len is the length of the MAC header + data, the CRC ++* is NOT included ++* 3) all members except len and buf are zero ++* ++* Arguments: ++* f frame structure ++* ++* Returns: ++* nothing ++* ++* Side effects: ++* frame structure members are pointing at their ++* respective portions of the frame buffer. ++* ++* STATUS: UNVERIFIED. NONV3. ++* ++--------------------------------------------------------------*/ ++void acx_mgmt_decode_deauthen(wlan_fr_deauthen_t * f) ++{ ++ f->type = WLAN_FSTYPE_DEAUTHEN; ++ f->hdr = (p80211_hdr_t *) f->buf; ++ ++ WLAN_ASSERT(WLAN_FTYPE_MGMT == ++ WLAN_GET_FC_FTYPE(ieee2host16(f->hdr->a3.fc))); ++ WLAN_ASSERT(WLAN_FSTYPE_DEAUTHEN == ++ WLAN_GET_FC_FSTYPE(ieee2host16(f->hdr->a3.fc))); ++ ++ /*-- Fixed Fields ----*/ ++ f->reason = (UINT16 *) (WLAN_HDR_A3_DATAP(&(f->hdr->a3)) ++ + WLAN_DEAUTHEN_OFF_REASON); ++ ++ /*-- Information elements */ ++ ++ return; ++} +diff -urN x/drivers/net/wireless/acx/acx80211frm.h y/drivers/net/wireless/acx/acx80211frm.h +--- x/drivers/net/wireless/acx/acx80211frm.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/acx/acx80211frm.h 2004-01-28 05:35:30.000000000 +1100 +@@ -0,0 +1,60 @@ ++/* include/acx80211frm.h ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Copyright (C) 2003 ACX100 Open Source Project ++ * ++ * The contents of this file are subject to the Mozilla Public ++ * License Version 1.1 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS ++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or ++ * implied. See the License for the specific language governing ++ * rights and limitations under the License. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU Public License version 2 (the "GPL"), in which ++ * case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use ++ * your version of this file under the MPL, indicate your decision ++ * by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL. If you do not delete ++ * the provisions above, a recipient may use your version of this ++ * file under either the MPL or the GPL. ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Inquiries regarding the ACX100 Open Source Project can be ++ * made directly to: ++ * ++ * acx100-users@lists.sf.net ++ * http://acx100.sf.net ++ * ++ * -------------------------------------------------------------------- ++ */ ++ ++void acx_mgmt_decode_ibssatim(wlan_fr_ibssatim_t *f); ++void acx_mgmt_encode_ibssatim(wlan_fr_ibssatim_t *f); ++void acx_mgmt_decode_assocreq(wlan_fr_assocreq_t *f); ++void acx_mgmt_decode_assocresp(wlan_fr_assocresp_t *f); ++void acx_mgmt_decode_authen(wlan_fr_authen_t *f); ++void acx_mgmt_decode_beacon(wlan_fr_beacon_t *f); ++void acx_mgmt_decode_deauthen(wlan_fr_deauthen_t *f); ++void acx_mgmt_decode_disassoc(wlan_fr_disassoc_t *f); ++void acx_mgmt_decode_probereq(wlan_fr_probereq_t *f); ++void acx_mgmt_decode_proberesp(wlan_fr_proberesp_t *f); ++void acx_mgmt_decode_reassocreq(wlan_fr_reassocreq_t *f); ++void acx_mgmt_decode_reassocresp(wlan_fr_reassocresp_t *f); ++void acx_mgmt_encode_assocreq(wlan_fr_assocreq_t *f); ++void acx_mgmt_encode_assocresp(wlan_fr_assocresp_t *f); ++void acx_mgmt_encode_authen(wlan_fr_authen_t *f); ++void acx_mgmt_encode_beacon(wlan_fr_beacon_t *f); ++void acx_mgmt_encode_deauthen(wlan_fr_deauthen_t *f); ++void acx_mgmt_encode_disassoc(wlan_fr_disassoc_t *f); ++void acx_mgmt_encode_probereq(wlan_fr_probereq_t *f); ++void acx_mgmt_encode_proberesp(wlan_fr_proberesp_t *f); ++void acx_mgmt_encode_reassocreq(wlan_fr_reassocreq_t *f); ++void acx_mgmt_encode_reassocresp(wlan_fr_reassocresp_t *f); +diff -urN x/drivers/net/wireless/acx/idma.c y/drivers/net/wireless/acx/idma.c +--- x/drivers/net/wireless/acx/idma.c 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/acx/idma.c 2004-04-14 02:10:03.000000000 +1000 +@@ -0,0 +1,1994 @@ ++/* src/idma.c - low level rx and tx management ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Copyright (C) 2003 ACX100 Open Source Project ++ * ++ * The contents of this file are subject to the Mozilla Public ++ * License Version 1.1 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS ++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or ++ * implied. See the License for the specific language governing ++ * rights and limitations under the License. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU Public License version 2 (the "GPL"), in which ++ * case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use ++ * your version of this file under the MPL, indicate your decision ++ * by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL. If you do not delete ++ * the provisions above, a recipient may use your version of this ++ * file under either the MPL or the GPL. ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Inquiries regarding the ACX100 Open Source Project can be ++ * made directly to: ++ * ++ * acx100-users@lists.sf.net ++ * http://acx100.sf.net ++ * ++ * -------------------------------------------------------------------- ++ */ ++ ++#include ++#include ++ ++#include ++#include ++#include ++#if WIRELESS_EXT > 12 ++#include ++#endif /* WE > 12 */ ++ ++#include ++ ++#include ++ ++ ++ ++/*================================================================*/ ++/* Project Includes */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/* these used to be increased to 32 each, ++ * but several people had memory allocation issues, ++ * so back to 16 again... */ ++#if (WLAN_HOSTIF==WLAN_USB) ++#define TXBUFFERNO 10 ++#define RXBUFFERNO 10 ++#else ++#define RXBUFFERNO 16 ++#define TXBUFFERNO 16 ++#endif ++ ++#define MINFREE_TX 3 ++spinlock_t tx_lock; ++spinlock_t rx_lock; ++ ++#ifdef ACX_DEBUG ++#if (WLAN_HOSTIF==WLAN_USB) ++extern void acx100usb_dump_bytes(void *,int); ++#endif ++#endif ++#if (WLAN_HOSTIF==WLAN_USB) ++extern void acx100usb_tx_data(wlandevice_t *,void *); ++#endif ++ ++ ++/*---------------------------------------------------------------- ++* acx100_create_dma_regions ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++int acx100_create_dma_regions(wlandevice_t *priv) ++{ ++ QueueConfig_t qcfg; ++ ++ acx100_memmap_t MemMap; ++ struct TIWLAN_DC *pDc; ++ ++ FN_ENTER; ++ ++ spin_lock_init(&rx_lock); ++ spin_lock_init(&tx_lock); ++ ++ pDc = &priv->dc; ++ pDc->priv = priv; ++ ++ /* read out the acx100 physical start address for the queues */ ++ if (!acx100_interrogate(priv, &MemMap, ACX100_RID_MEMORY_MAP)) { ++ acxlog(L_BINSTD, "ctlMemoryMapRead returns error\n"); ++ FN_EXIT(1, 2); ++ return 2; ++ } ++ ++ /* # of items in Rx and Tx queues */ ++ priv->TxQueueNo = TXBUFFERNO; ++ priv->RxQueueNo = RXBUFFERNO; ++ ++ /* calculate size of queues */ ++ qcfg.AreaSize = cpu_to_le32( ++ (sizeof(struct txdescriptor) * TXBUFFERNO + ++ sizeof(struct rxdescriptor) * RXBUFFERNO + 8) ++ ); ++ qcfg.NumTxQueues = 1; /* number of tx queues */ ++ ++ /* sets the beginning of the tx descriptor queue */ ++ pDc->ui32ACXTxQueueStart = le32_to_cpu(MemMap.QueueStart); ++ qcfg.TxQueueStart = cpu_to_le32(pDc->ui32ACXTxQueueStart); ++ qcfg.TxQueuePri = 0; ++ ++#if (WLAN_HOSTIF==WLAN_USB) ++ qcfg.NumTxDesc = TXBUFFERNO; ++ qcfg.NumRxDesc = RXBUFFERNO; ++#endif ++ ++ /* sets the beginning of the rx descriptor queue */ ++ pDc->ui32ACXRxQueueStart = priv->TxQueueNo * sizeof(struct txdescriptor) + le32_to_cpu(MemMap.QueueStart); ++ qcfg.RxQueueStart = cpu_to_le32(pDc->ui32ACXRxQueueStart); ++ qcfg.QueueOptions = 1; /* auto reset descriptor */ ++ ++ /* sets the end of the rx descriptor queue */ ++ qcfg.QueueEnd = cpu_to_le32(priv->RxQueueNo * sizeof(struct rxdescriptor) + pDc->ui32ACXRxQueueStart); ++ ++ /* sets the beginning of the next queue */ ++ qcfg.HostQueueEnd = cpu_to_le32(le32_to_cpu(qcfg.QueueEnd) + 8); ++ ++ acxlog(L_BINDEBUG, "<== Initialize the Queue Indicator\n"); ++ ++ if (!acx100_configure_length(priv, &qcfg, ACX100_RID_QUEUE_CONFIG, sizeof(QueueConfig_t)-4)){ //0x14 + (qcfg.vale * 8))) { ++ acxlog(L_BINSTD, "ctlQueueConfigurationWrite returns error\n"); ++ goto error; ++ } ++ ++ if (acx100_create_tx_host_desc_queue(pDc)) { ++ acxlog(L_BINSTD, "acx100_create_tx_host_desc_queue returns error\n"); ++ goto error; ++ } ++ if (acx100_create_rx_host_desc_queue(pDc)) { ++ acxlog(L_BINSTD, "acx100_create_rx_host_desc_queue returns error\n"); ++ goto error; ++ } ++ acx100_create_tx_desc_queue(pDc); ++ acx100_create_rx_desc_queue(pDc); ++ if (!acx100_interrogate(priv, &MemMap, ACX100_RID_MEMORY_MAP)) { ++ acxlog(L_BINSTD, "Failed to read memory map\n"); ++ goto error; ++ } ++ ++#if (WLAN_HOSTIF==WLAN_USB) ++ if (!acx100_configure(priv, &MemMap, ACX100_RID_MEMORY_MAP)) { ++ acxlog(L_BINSTD,"Failed to write memory map\n"); ++ goto error; ++ } ++#endif ++ ++ MemMap.PoolStart = cpu_to_le32((le32_to_cpu(MemMap.QueueEnd) + 0x1F + 4) & 0xffffffe0); ++ ++ if (!acx100_configure(priv, &MemMap, ACX100_RID_MEMORY_MAP)) { ++ acxlog(L_BINSTD, "ctlMemoryMapWrite returns error\n"); ++ goto error; ++ } ++ ++ if (!acx100_init_memory_pools(priv, (acx100_memmap_t *) &MemMap)) { ++ acxlog(L_BINSTD, "acx100_init_memory_pools returns error\n"); ++ goto error; ++ } ++ ++#if THIS_IS_BOGUS_ISNT_IT ++ acx100_set_defaults(priv); ++#endif ++ ++ FN_EXIT(1, 0); ++ return 0; ++ ++error: ++ acx100_free_desc_queues(pDc); ++ ++ FN_EXIT(1, 1); ++ return 1; ++} ++ ++ ++ ++ ++int acx111_create_dma_regions(wlandevice_t *priv) ++{ ++ ++ ++ struct ACX111_RX_CONFIG_BLOCK; ++ ++ /* TODO make a cool struct and place it in the wlandev struct ? */ ++ /* This struct is specific to the ACX111 !!! */ ++ struct ACX111MemoryConfiguration { ++ ++ UINT16 id; ++ UINT16 length; ++ UINT16 no_of_stations; ++ UINT16 memory_block_size; ++ UINT8 tx_rx_memory_block_allocation; ++ UINT8 count_rx_queues; ++ UINT8 count_tx_queues; ++ UINT8 options; ++ UINT8 fragmentation; ++ UINT16 reserved1; ++ UINT8 reserved2; ++ ++ /* start of rx1 block */ ++ UINT8 rx_queue1_count_descs; ++ UINT8 rx_queue1_reserved1; ++ UINT8 rx_queue1_reserved2; /* must be set to 7 */ ++ UINT8 rx_queue1_reserved3; /* must be set to 0 */ ++ UINT32 rx_queue1_host_rx_start; ++ /* end of rx1 block */ ++ ++ /* start of tx1 block */ ++ UINT8 tx_queue1_count_descs; ++ UINT8 tx_queue1_reserved1; ++ UINT8 tx_queue1_reserved2; ++ UINT8 tx_queue1_attributes; ++ /* end of tx1 block */ ++ ++#ifdef COMMENT ++ /* start init struct */ ++ pt->m.gp.bytes[0x00] = 0x3; /* id */ ++ pt->m.gp.bytes[0x01] = 0x0; /* id */ ++ pt->m.gp.bytes[0x02] = 16; /* length */ ++ pt->m.gp.bytes[0x03] = 0; /* length */ ++ pt->m.gp.bytes[0x04] = 0; /* number of sta's */ ++ pt->m.gp.bytes[0x05] = 0; /* number of sta's */ ++ pt->m.gp.bytes[0x06] = 0x00; /* memory block size */ ++ pt->m.gp.bytes[0x07] = 0x01; /* memory block size */ ++ pt->m.gp.bytes[0x08] = 10; /* tx/rx memory block allocation */ ++ pt->m.gp.bytes[0x09] = 0; /* number of Rx Descriptor Queues */ ++ pt->m.gp.bytes[0x0a] = 0; /* number of Tx Descriptor Queues */ ++ pt->m.gp.bytes[0x0b] = 0; /* options */ ++ pt->m.gp.bytes[0x0c] = 0x0c; /* Tx memory/fragment memory pool allocation */ ++ pt->m.gp.bytes[0x0d] = 0; /* reserved */ ++ pt->m.gp.bytes[0x0e] = 0; /* reserved */ ++ pt->m.gp.bytes[0x0f] = 0; /* reserved */ ++ /* end init struct */ ++#endif ++ ++ } __WLAN_ATTRIB_PACK__ memconf; ++ ++ /* FIXME: way too big to reside on the stack */ ++ struct { ++ UINT16 val0x0[14]; ++ UINT queue_start; ++ UINT val0x20; ++ UINT val0x24; ++ UINT val0x28; ++ UINT val0x2c; ++ } MemMap; ++ struct TIWLAN_DC *pDc; ++ QueueConfig_t qcfg; ++ ++ FN_ENTER; ++ ++ pDc = &priv->dc; ++ pDc->priv = priv; ++ ++ spin_lock_init(&rx_lock); ++ spin_lock_init(&tx_lock); ++ ++ /* FIXME: which memmap is read here, acx100_init_memory_pools did not get called yet ? */ ++ /* read out the acx100 physical start address for the queues */ ++ if (!acx100_interrogate(priv, &MemMap, ACX100_RID_MEMORY_MAP)) { ++ acxlog(L_BINSTD, "ctlMemoryMapRead returns error\n"); ++ FN_EXIT(1, 2); ++ return 2; ++ } ++ ++ /* ### Calculate memory positions and queue sizes #### */ ++ ++ /* calculate size of queues */ ++ qcfg.AreaSize = (sizeof(struct txdescriptor) * TXBUFFERNO + ++ sizeof(struct rxdescriptor) * RXBUFFERNO + 8); ++ qcfg.NumTxQueues = 1; /* number of tx queues */ ++ ++ qcfg.NumRxDesc = RXBUFFERNO; ++ qcfg.NumTxDesc = TXBUFFERNO; ++ ++ /* sets the beginning of the tx descriptor queue */ ++ pDc->ui32ACXTxQueueStart = le32_to_cpu(MemMap.queue_start); ++ qcfg.TxQueueStart = pDc->ui32ACXTxQueueStart; ++ qcfg.TxQueuePri = 0; /* highest prioriity ( lowest = 0x7f ) */ ++ ++ /* sets the beginning of the rx descriptor queue */ ++ pDc->ui32ACXRxQueueStart = priv->TxQueueNo * sizeof(struct txdescriptor) + MemMap.queue_start; ++ qcfg.RxQueueStart = pDc->ui32ACXRxQueueStart; ++ qcfg.QueueOptions = 1; ++ ++ /* sets the end of the rx descriptor queue */ ++ qcfg.QueueEnd = priv->RxQueueNo * sizeof(struct rxdescriptor) + pDc->ui32ACXRxQueueStart; ++ ++ /* sets the beginning of the next queue */ ++ qcfg.HostQueueEnd = qcfg.QueueEnd + 8; ++ ++ acxlog(L_BINDEBUG, "<== Initialize the Queue Indicator\n"); ++ ++ ++ /* ### Set up the card #### */ ++ ++ memset(&memconf, 0, sizeof(memconf)); ++ ++ /* set command (ACXMemoryConfiguration) */ ++ memconf.id = cpu_to_le16(0x03); ++ memconf.length = cpu_to_le16(sizeof(memconf)); ++ ++ /* hm, I hope this is correct */ ++ memconf.no_of_stations = cpu_to_le16(1); ++ ++ /* specify the memory block size. Default is 256 */ ++ memconf.memory_block_size = cpu_to_le16(priv->memblocksize); ++ ++ /* let's use 50%/50% for tx/rx */ ++ memconf.tx_rx_memory_block_allocation = 10; ++ ++ ++ /* set the count of our queues */ ++ memconf.count_rx_queues = 1; /* TODO place this in constants */ ++ memconf.count_tx_queues = 1; ++ ++ if(memconf.count_rx_queues != 1 || memconf.count_tx_queues != 1) { ++ acxlog(L_STD, ++ "%s: Requested more buffers than supported. Please adapt the structure! rxbuffers:%d txbuffers:%d\n", ++ __func__, memconf.count_rx_queues, memconf.count_tx_queues); ++ goto error; ++ } ++ priv->TxQueueNo = TXBUFFERNO; ++ priv->RxQueueNo = RXBUFFERNO; ++ ++ /* uhoh, hope this is correct-> BusMaster Indirect Memory Organization */ ++ memconf.options = 1; ++ ++ /* let's use 25% for fragmentations and 75% for frame transfers */ ++ memconf.fragmentation = 0x0f; ++ ++ /* RX queue config */ ++ memconf.rx_queue1_count_descs = RXBUFFERNO; ++ memconf.rx_queue1_reserved2 = 7; /* must be set to 7 */ ++ memconf.rx_queue1_host_rx_start = cpu_to_le32(qcfg.RxQueueStart); ++ ++ /* TX queue config */ ++ memconf.tx_queue1_count_descs = TXBUFFERNO; ++ /* memconf.tx_queue1_host_tx_start = qcfg.TxQueueStart; */ ++ ++ ++ if (acx100_create_tx_host_desc_queue(pDc)) { ++ acxlog(L_BINSTD, "acx100_create_tx_host_desc_queue returns error\n"); ++ goto error; ++ } ++ if (acx100_create_rx_host_desc_queue(pDc)) { ++ acxlog(L_BINSTD, "acx100_create_rx_host_desc_queue returns error\n"); ++ goto error; ++ } ++ acx100_create_tx_desc_queue(pDc); ++ acx100_create_rx_desc_queue(pDc); ++ ++ acxlog(L_STD, "%s: set up acx111 queue memory configuration (queue configs + descriptors)\n", __func__); ++ if (acx100_configure(priv, &memconf, 0x03) == 0) { ++ acxlog(L_STD, "setting up the memory configuration failed!\n"); ++ goto error; ++ } ++ ++ ++#if THIS_IS_BOGUS_ISNT_IT ++ acx100_set_defaults(priv); ++#endif ++ ++ FN_EXIT(1, 0); ++ return 0; ++ ++error: ++ acx100_free_desc_queues(pDc); ++ ++ FN_EXIT(1, 1); ++ return 1; ++} ++ ++ ++ ++ ++ ++/*---------------------------------------------------------------- ++* acx100_delete_dma_region ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++int acx100_delete_dma_region(wlandevice_t *priv) ++{ ++ FN_ENTER; ++#if (WLAN_HOSTIF!=WLAN_USB) ++ acx100_write_reg16(priv, priv->io[IO_ACX_ENABLE], 0); ++ ++ /* used to be a for loop 1000, do scheduled delay instead */ ++ acx100_schedule(HZ / 10); ++#endif ++ acx100_free_desc_queues(&priv->dc); ++ ++ FN_EXIT(0, 0); ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_dma_tx_data ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++void acx100_dma_tx_data(wlandevice_t *priv, struct txdescriptor *tx_desc) ++{ ++ struct txhostdescriptor *header; ++ struct txhostdescriptor *payload; ++ unsigned long flags; ++ int i; ++ ++ FN_ENTER; ++ /* header and payload are located in adjacent descriptors */ ++ header = tx_desc->host_desc; ++ payload = tx_desc->host_desc + 1; ++ ++ if (1 == priv->preamble_flag) ++ tx_desc->Ctl |= ACX100_CTL_PREAMBLE; /* set Preamble */ ++ /* It seems as if the Preamble setting was actually REVERSED: ++ * bit 0 should most likely actually be ACTIVATED ++ * for Short Preamble, not the other way around as before! ++ * This caused many Tx error 0x20 errors with APs ++ * that don't support Long Preamble, since we were ++ * thinking we are setting Long Preamble, when in fact ++ * it was Short Preamble. ++ * The flag reversal theory has been sort of confirmed ++ * by throughput measurements: ++ * ~ 680K/s with flag disabled ++ * ~ 760K/s with flag enabled ++ */ ++ ++ /* set autodma and reclaim and 1st mpdu */ ++ tx_desc->Ctl |= ACX100_CTL_AUTODMA | ACX100_CTL_RECLAIM | ACX100_CTL_FIRSTFRAG; ++ ++ /* let chip do RTS/CTS handshaking before sending ++ * in case packet size exceeds threshold */ ++ if (tx_desc->total_length > priv->rts_threshold) ++ tx_desc->Ctl2 |= DESC_CTL2_RTS; ++ ++ /* set rate */ ++ if (WLAN_GET_FC_FTYPE(((p80211_hdr_t*)header->data)->a3.fc) == WLAN_FTYPE_MGMT) { ++ tx_desc->rate = 20; /* 2Mbps for MGMT pkt compatibility */ ++ } else { ++ tx_desc->rate = priv->txrate_curr; ++ } ++ ++#if (WLAN_HOSTIF!=WLAN_USB) ++ spin_lock_irqsave(&tx_lock, flags); ++ ++ /* sets Ctl ACX100_CTL_OWN to zero telling that the descriptors are now owned by the acx100 */ ++ header->Ctl &= (UINT16) ~ACX100_CTL_OWN; ++ payload->Ctl &= (UINT16) ~ACX100_CTL_OWN; ++ tx_desc->Ctl &= (UINT16) ~ACX100_CTL_OWN; ++ ++ tx_desc->tx_time = jiffies; ++ acx100_write_reg16(priv, priv->io[IO_ACX_INT_TRIG], 0x4); ++ ++ spin_unlock_irqrestore(&tx_lock, flags); ++#else ++ tx_desc->tx_time = jiffies; ++ acx100usb_tx_data(priv, tx_desc); ++#endif ++ /* log the packet content AFTER sending it, ++ * in order to not delay sending any further than absolutely needed */ ++ acxlog(L_XFER | L_DATA, ++ "Tx pkt (%s): len %i, hdr_len %i, pyld_len %i, mode %d, status %d\n", ++ acx100_get_packet_type_string(((p80211_hdr_t*)header->data)->a3.fc), ++ tx_desc->total_length, ++ header->length, ++ payload->length, ++ priv->macmode_joined, ++ priv->status); ++ ++ if (debug & L_DATA) ++ { ++ acxlog(L_DATA, "802.11 header[%d]: ", header->length); ++#if (WLAN_HOSTIF==WLAN_USB) ++ acx100usb_dump_bytes(header->data, header->length); ++#else ++ for (i = 0; i < header->length; i++) ++ acxlog(L_DATA, "%02x ", ((UINT8 *) header->data)[i]); ++ acxlog(L_DATA, "\n"); ++#endif ++ acxlog(L_DATA, "802.11 payload[%d]: ", payload->length); ++#if (WLAN_HOSTIF==WLAN_USB) ++ acx100usb_dump_bytes(payload->data, payload->length); ++#else ++ for (i = 0; i < payload->length; i++) ++ acxlog(L_DATA, "%02x ", ((UINT8 *) payload->data)[i]); ++ acxlog(L_DATA, "\n"); ++#endif ++ } ++ FN_EXIT(0, 0); ++} ++ ++void acx_handle_tx_error(wlandevice_t *priv, txdesc_t *pTxDesc) ++{ ++ char *err = "unknown error"; ++ ++ /* hmm, should we handle this as a mask ++ * of *several* bits? ++ * For now I think only caring about ++ * individual bits is ok... */ ++ switch(pTxDesc->error) { ++ case 0x01: ++ err = "no Tx due to error in other fragment"; ++ priv->wstats.discard.fragment++; ++ break; ++ case 0x02: ++ err = "Tx aborted"; ++ priv->stats.tx_aborted_errors++; ++ break; ++ case 0x04: ++ err = "Tx desc wrong parameters"; ++ priv->wstats.discard.misc++; ++ break; ++ case 0x08: ++ priv->wstats.discard.misc++; ++ break; ++ case 0x10: ++ err = "MSDU lifetime timeout? - change 'iwconfig retry lifetime XXX'"; ++ priv->wstats.discard.misc++; ++ break; ++ case 0x20: ++ err = "maybe distance too high? - change 'iwconfig txpower XXX' or sensitivity"; ++ priv->wstats.discard.retries++; ++ break; ++ case 0x40: ++ err = "Tx buffer overflow"; ++ priv->stats.tx_fifo_errors++; ++ break; ++ case 0x80: ++ err = "DMA error"; ++ priv->wstats.discard.misc++; ++ break; ++ } ++ acxlog(L_STD, "Tx error occurred (error 0x%02X)!! (%s)\n", pTxDesc->error, err); ++ priv->stats.tx_errors++; ++ ++#if WIRELESS_EXT > 12 /* wireless_send_event() */ ++ if (0x30 & pTxDesc->error) { ++ /* only send IWEVTXDROP in case of retry or lifetime exceeded; ++ * all other errors mean we screwed up locally */ ++ union iwreq_data wrqu; ++ p80211_hdr_t *hdr = (p80211_hdr_t *)pTxDesc->host_desc->data; ++ ++ MAC_COPY(wrqu.addr.sa_data, hdr->a3.a1); ++ wireless_send_event(priv->netdev, IWEVTXDROP, &wrqu, NULL); ++ } ++#endif ++} ++ ++static UINT8 txrate_auto_table[] = { (UINT8)ACX_TXRATE_1, (UINT8)ACX_TXRATE_2, ++ (UINT8)ACX_TXRATE_5_5, (UINT8)ACX_TXRATE_11, (UINT8)ACX_TXRATE_22PBCC }; ++ ++static inline void acx_handle_txrate_auto(wlandevice_t *priv, txdesc_t *pTxDesc) ++{ ++ acxlog(L_DEBUG, "rate %d/%d, fallback %d/%d, stepup %d/%d\n", pTxDesc->rate, priv->txrate_curr, priv->txrate_fallback_count, priv->txrate_fallback_threshold, priv->txrate_stepup_count, priv->txrate_stepup_threshold); ++ if ((pTxDesc->rate < priv->txrate_curr) || (0x0 != (pTxDesc->error & 0x30))) { ++ if (++priv->txrate_fallback_count ++ > priv->txrate_fallback_threshold) { ++ if (priv->txrate_auto_idx > 0) { ++ priv->txrate_auto_idx--; ++ priv->txrate_curr = txrate_auto_table[priv->txrate_auto_idx]; ++ acxlog(L_XFER, "falling back to Tx rate %d.\n", priv->txrate_curr); ++ } ++ priv->txrate_fallback_count = 0; ++ } ++ } ++ else ++ if (pTxDesc->rate == priv->txrate_curr) { ++ if (++priv->txrate_stepup_count ++ > priv->txrate_stepup_threshold) { ++ if (priv->txrate_auto_idx < priv->txrate_auto_idx_max) { ++ priv->txrate_auto_idx++; ++ priv->txrate_curr = txrate_auto_table[priv->txrate_auto_idx]; ++ acxlog(L_XFER, "stepping up to Tx rate %d.\n", priv->txrate_curr); ++ } ++ priv->txrate_stepup_count = 0; ++ } ++ } ++} ++ ++/*---------------------------------------------------------------- ++* acx100_log_txbuffer ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++inline void acx100_log_txbuffer(TIWLAN_DC *pDc) ++{ ++ unsigned int i; ++ txdesc_t *pTxDesc; ++ ++ FN_ENTER; ++ if (debug & L_BUF) ++ { ++ for (i = 0; i < pDc->tx_pool_count; i++) ++ { ++ pTxDesc = &pDc->pTxDescQPool[i]; ++ ++ if ((pTxDesc->Ctl & DESC_CTL_DONE) == DESC_CTL_DONE) ++ acxlog(L_BUF, "txbuf %d done\n", i); ++ } ++ } ++ FN_EXIT(0, 0); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_clean_tx_desc ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* This function probably resets the txdescs' status when the ACX100 ++* signals the TX done IRQ (txdescs have been processed), starting with ++* the pool index of the descriptor which we would use next, ++* in order to make sure that we can be as fast as possible ++* in filling new txdescs. ++* Oops, now we have our own index, so everytime we get called we know ++* where the next packet to be cleaned is. ++* Hmm, still need to loop through the whole ring buffer now, ++* since we lost sync for some reason when ping flooding or so... ++* (somehow we don't get the IRQ for acx100_clean_tx_desc any more when ++* too many packets are being sent!) ++* FIXME: currently we only process one packet, but this gets out of ++* sync for some reason when ping flooding, so we need to loop, ++* but the previous smart loop implementation causes the ping latency ++* to rise dramatically (~3000 ms), at least on CardBus PheeNet WL-0022. ++* Dunno what to do :-\ ++* ++*----------------------------------------------------------------*/ ++ ++inline void acx100_clean_tx_desc(wlandevice_t *priv) ++{ ++ TIWLAN_DC *pDc = &priv->dc; ++ txdesc_t *pTxDesc; ++ UINT finger, watch; ++ unsigned long flags; ++ ++ FN_ENTER; ++ ++ acx100_log_txbuffer(pDc); ++ acxlog(L_BUF, "cleaning up Tx bufs from %ld\n", pDc->tx_tail); ++ ++ spin_lock_irqsave(&tx_lock, flags); ++ ++ finger = pDc->tx_tail; ++ watch = finger; ++ ++ do { ++ pTxDesc = &pDc->pTxDescQPool[finger]; ++ ++ /* check if txdesc is marked as "Tx finished" and "owned" */ ++ if ((pTxDesc->Ctl & DESC_CTL_DONE) == DESC_CTL_DONE) { ++ ++ acxlog(L_BUF, "cleaning %d\n", finger); ++ ++ if (0 != pTxDesc->error) ++ acx_handle_tx_error(priv, pTxDesc); ++ ++ if (1 == priv->txrate_auto) ++ acx_handle_txrate_auto(priv, pTxDesc); ++ ++ /* free it */ ++ pTxDesc->Ctl = ACX100_CTL_OWN; ++ ++ priv->TxQueueFree++; ++ ++ if ((priv->TxQueueFree >= MINFREE_TX + 3) ++ && (priv->status == ISTATUS_4_ASSOCIATED) ++ && (netif_queue_stopped(priv->netdev))) ++ { ++ /* FIXME: if construct is ugly: ++ * should have functions acx100_stop_queue ++ * etc. which set flag priv->tx_stopped ++ * to be checked here. */ ++ acxlog(L_XFER, "wake queue (avail. Tx desc %ld).\n", priv->TxQueueFree); ++ netif_wake_queue(priv->netdev); ++ } ++ } ++ else ++ break; ++ ++ /* update pointer for descr to be cleaned next */ ++ finger = (finger + 1) % pDc->tx_pool_count; ++ } while (watch != finger); ++ ++ /* remember last position */ ++ pDc->tx_tail = finger; ++ ++ spin_unlock_irqrestore(&tx_lock, flags); ++ ++ FN_EXIT(0, 0); ++ return; ++} ++/*---------------------------------------------------------------- ++* acx100_rxmonitor ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++void acx100_rxmonitor(wlandevice_t *priv, struct rxbuffer *buf) ++{ ++ unsigned long *data = (unsigned long *)buf; ++ unsigned int packet_len = data[0] & 0xFFF; ++ int sig_strength = (data[1] >> 16) & 0xFF; ++ int sig_quality = (data[1] >> 24) & 0xFF; ++ p80211msg_lnxind_wlansniffrm_t *msg; ++ ++ int payload_offset = 0; ++ unsigned int skb_len; ++ struct sk_buff *skb; ++ void *datap; ++ ++ FN_ENTER; ++ ++ if (!(priv->rx_config_1 & RX_CFG1_PLUS_ADDIT_HDR)) ++ { ++ printk("rx_config_1 misses RX_CFG1_PLUS_ADDIT_HDR\n"); ++ FN_EXIT(0, 0); ++ return; ++ } ++ ++ if (priv->rx_config_1 & RX_CFG1_PLUS_ADDIT_HDR) ++ { ++ payload_offset += 3*4; /* status words */ ++ packet_len += 3*4; /* length is w/o status */ ++ } ++ ++ if (priv->rx_config_1 & RX_CFG1_INCLUDE_ADDIT_HDR) ++ payload_offset += 4; /* phy header */ ++ ++ /* we are in big luck: the acx100 doesn't modify any of the fields */ ++ /* in the 802.11-frame. just pass this packet into the PF_PACKET- */ ++ /* subsystem. yeah. */ ++ ++ skb_len = packet_len - payload_offset; ++ ++ if (priv->netdev->type == ARPHRD_IEEE80211_PRISM) ++ skb_len += sizeof(p80211msg_lnxind_wlansniffrm_t); ++ ++ /* sanity check */ ++ if (skb_len > (WLAN_HDR_A4_LEN + WLAN_DATA_MAXLEN + WLAN_CRC_LEN)) ++ { ++ printk("monitor mode panic: oversized frame!\n"); ++ FN_EXIT(0, 0); ++ return; ++ } ++ ++ /* allocate skb */ ++ if ( (skb = dev_alloc_skb(skb_len)) == NULL) ++ { ++ printk("alloc_skb failed trying to allocate %d bytes\n", skb_len); ++ FN_EXIT(0, 0); ++ return; ++ } ++ ++ skb_put(skb, skb_len); ++ ++ /* when in raw 802.11 mode, just copy frame as-is */ ++ if (priv->netdev->type == ARPHRD_IEEE80211) ++ datap = skb->data; ++ else /* otherwise, emulate prism header */ ++ { ++ msg = (p80211msg_lnxind_wlansniffrm_t*)skb->data; ++ datap = msg + 1; ++ ++ msg->msgcode = DIDmsg_lnxind_wlansniffrm; ++ msg->msglen = sizeof(p80211msg_lnxind_wlansniffrm_t); ++ strcpy(msg->devname, priv->netdev->name); ++ ++ msg->hosttime.did = DIDmsg_lnxind_wlansniffrm_hosttime; ++ msg->hosttime.status = 0; ++ msg->hosttime.len = 4; ++ msg->hosttime.data = jiffies; ++ ++ msg->mactime.did = DIDmsg_lnxind_wlansniffrm_mactime; ++ msg->mactime.status = 0; ++ msg->mactime.len = 4; ++ msg->mactime.data = data[2]; ++ ++ msg->channel.did = DIDmsg_lnxind_wlansniffrm_channel; ++ msg->channel.status = P80211ENUM_msgitem_status_no_value; ++ msg->channel.len = 4; ++ msg->channel.data = 0; ++ ++ msg->rssi.did = DIDmsg_lnxind_wlansniffrm_rssi; ++ msg->rssi.status = P80211ENUM_msgitem_status_no_value; ++ msg->rssi.len = 4; ++ msg->rssi.data = 0; ++ ++ msg->sq.did = DIDmsg_lnxind_wlansniffrm_sq; ++ msg->sq.status = P80211ENUM_msgitem_status_no_value; ++ msg->sq.len = 4; ++ msg->sq.data = 0; ++ ++ msg->signal.did = DIDmsg_lnxind_wlansniffrm_signal; ++ msg->signal.status = 0; ++ msg->signal.len = 4; ++ msg->signal.data = sig_quality; ++ ++ msg->noise.did = DIDmsg_lnxind_wlansniffrm_noise; ++ msg->noise.status = 0; ++ msg->noise.len = 4; ++ msg->noise.data = sig_strength; ++ ++ msg->rate.did = DIDmsg_lnxind_wlansniffrm_rate; ++ msg->rate.status = P80211ENUM_msgitem_status_no_value; ++ msg->rate.len = 4; ++ msg->rate.data = 0; ++ ++ msg->istx.did = DIDmsg_lnxind_wlansniffrm_istx; ++ msg->istx.status = 0; ++ msg->istx.len = 4; ++ msg->istx.data = P80211ENUM_truth_false; ++ ++ skb_len -= sizeof(p80211msg_lnxind_wlansniffrm_t); ++ ++ msg->frmlen.did = DIDmsg_lnxind_wlansniffrm_signal; ++ msg->frmlen.status = 0; ++ msg->frmlen.len = 4; ++ msg->frmlen.data = skb_len; ++ } ++ ++ memcpy(datap, ((unsigned char*)buf)+payload_offset, skb_len); ++ ++ skb->dev = priv->netdev; ++ skb->dev->last_rx = jiffies; ++ ++ skb->mac.raw = skb->data; ++ skb->ip_summed = CHECKSUM_NONE; ++ skb->pkt_type = PACKET_OTHERHOST; ++ skb->protocol = htons(ETH_P_80211_RAW); ++ ++ priv->stats.rx_packets++; ++ priv->stats.rx_bytes += skb->len; ++ ++ netif_rx(skb); ++ FN_EXIT(0, 0); ++} ++ ++/* ++ * Calculate level like the feb 2003 windows driver seems to do ++ */ ++inline UINT8 acx_signal_to_winlevel(UINT8 rawlevel) ++{ ++ UINT8 winlevel = (UINT8) (0.5 + 0.625 * rawlevel); ++ ++ if(winlevel>100) ++ winlevel=100; ++ ++ return winlevel; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_log_rxbuffer ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++inline void acx100_log_rxbuffer(TIWLAN_DC *pDc) ++{ ++ unsigned int i; ++ struct rxhostdescriptor *pDesc; ++ ++ FN_ENTER; ++ if (debug & L_BUF) ++ { ++ for (i = 0; i < pDc->rx_pool_count; i++) ++ { ++ pDesc = &pDc->pRxHostDescQPool[i]; ++#if (WLAN_HOSTIF==WLAN_USB) ++ acxlog(L_DEBUG,"rxbuf %d Ctl=%X val0x14=%lX\n",i,pDesc->Ctl,pDesc->Status); ++#endif ++ if ((pDesc->Ctl & ACX100_CTL_OWN) && (pDesc->Status & BIT31)) ++ acxlog(L_BUF, "rxbuf %d full\n", i); ++ } ++ } ++ FN_EXIT(0, 0); ++} ++ ++/*------------------------------------------------------------------------------ ++ * acx100_process_rx_desc ++ * ++ * RX path top level entry point called directly and only from the IRQ handler ++ * ++ * Arguments: ++ * ++ * Returns: ++ * ++ * Side effects: ++ * ++ * Call context: Hard IRQ ++ * ++ * STATUS: ++ * ++ * Comment: ++ * ++ *----------------------------------------------------------------------------*/ ++inline void acx100_process_rx_desc(wlandevice_t *priv) ++{ ++ struct rxhostdescriptor *RxPool; ++ TIWLAN_DC *pDc; ++ struct rxhostdescriptor *pDesc; ++ UINT16 buf_len; ++ unsigned long flags; ++ int curr_idx; ++ unsigned int count = 0; ++ p80211_hdr_t *buf; ++ ++ FN_ENTER; ++ ++ pDc = &priv->dc; ++ acx100_log_rxbuffer(pDc); ++ ++ /* there used to be entry count code here, but because this function is called ++ * by the interrupt handler, we are sure that this will only be entered once ++ * because the kernel locks the interrupt handler */ ++ ++ RxPool = pDc->pRxHostDescQPool; ++ ++ /* First, have a loop to determine the first descriptor that's ++ * full, just in case there's a mismatch between our current ++ * rx_tail and the full descriptor we're supposed to handle. */ ++ spin_lock_irqsave(&rx_lock, flags); ++ do { ++ count++; ++ if (count > pDc->rx_pool_count) ++ { /* hmm, no luck: all descriptors empty, bail out */ ++ spin_unlock_irqrestore(&rx_lock, flags); ++ FN_EXIT(0, 0); ++ return; ++ } ++ curr_idx = pDc->rx_tail; ++ pDesc = &RxPool[pDc->rx_tail]; ++ pDc->rx_tail = (pDc->rx_tail + 1) % pDc->rx_pool_count; ++ } while (!((pDesc->Ctl & ACX100_CTL_OWN) && (pDesc->Status & BIT31))); ++ /* "pDesc->val0x14 < 0" is there to check whether MSB is set or not */ ++ /* check whether descriptor full, advance to next one if not */ ++ spin_unlock_irqrestore(&rx_lock, flags); ++ ++ while (1) ++ { ++ acxlog(L_BUF, "%s: using curr_idx %d, rx_tail is now %ld\n", __func__, curr_idx, pDc->rx_tail); ++ ++ if (priv->rx_config_1 & RX_CFG1_INCLUDE_ADDIT_HDR) { ++ /* take into account additional header in front of packet */ ++ buf = (p80211_hdr_t*)((UINT8*)&pDesc->data->buf + 4); ++ } ++ else ++ { ++ buf = (p80211_hdr_t *)&pDesc->data->buf; ++ } ++ ++ buf_len = pDesc->data->mac_cnt_rcvd & 0xfff; /* somelength */ ++ if ((WLAN_GET_FC_FSTYPE(buf->a3.fc) != WLAN_FSTYPE_BEACON) ++ || (debug & L_XFER_BEACON)) ++ acxlog(L_XFER|L_DATA, "Rx pkt %02d (%s): time %lu, len %i, signal %d, SNR %d, macstat %02x, phystat %02x, phyrate %u, mode %d, status %d\n", ++ curr_idx, ++ acx100_get_packet_type_string(buf->a3.fc), ++ pDesc->data->time, ++ buf_len, ++ acx_signal_to_winlevel(pDesc->data->phy_level), ++ acx_signal_to_winlevel(pDesc->data->phy_snr), ++ pDesc->data->mac_status, ++ pDesc->data->phy_stat_baseband, ++ pDesc->data->phy_plcp_signal, ++ priv->macmode_joined, ++ priv->status); ++ ++ /* FIXME: should check for Rx errors (pDesc->data->mac_status? ++ * discard broken packets - but NOT for monitor!) ++ * and update Rx packet statistics here */ ++ ++ if (priv->monitor) { ++ acx100_rxmonitor(priv, pDesc->data); ++ } else if (buf_len >= 14) { ++ acx100_rx_ieee802_11_frame(priv, pDesc); ++ } else { ++ acxlog(L_DEBUG | L_XFER | L_DATA, ++ "NOT receiving packet (%s): size too small (%d)\n", ++ acx100_get_packet_type_string(buf->a3.fc), buf_len); ++ } ++ ++ /* Now check Rx quality level, AFTER processing packet. ++ * I tried to figure out how to map these levels to dBm ++ * values, but for the life of me I really didn't ++ * manage to get it. Either these values are not meant to ++ * be expressed in dBm, or it's some pretty complicated ++ * calculation. */ ++ ++#if FROM_SCAN_SOURCE_ONLY ++ /* only consider packets originating from the MAC ++ * address of the device that's managing our BSSID. ++ * Disable it for now, since it removes information (levels ++ * from different peers) and slows the Rx path. */ ++ if (0 == memcmp(buf->a3.a2, priv->station_assoc.mac_addr, ETH_ALEN)) { ++#endif ++ priv->wstats.qual.level = acx_signal_to_winlevel(pDesc->data->phy_level); ++ priv->wstats.qual.noise = acx_signal_to_winlevel(pDesc->data->phy_snr); ++ priv->wstats.qual.qual = ++ (priv->wstats.qual.noise <= 100) ? ++ 100 - priv->wstats.qual.noise : 0; ++ priv->wstats.qual.updated = 7; /* all 3 indicators updated */ ++#if FROM_SCAN_SOURCE_ONLY ++ } ++#endif ++ ++ pDesc->Ctl &= ~ACX100_CTL_OWN; /* Host no longer owns this */ ++ pDesc->Status = 0; ++ ++ /* ok, descriptor is handled, now check the next descriptor */ ++ spin_lock_irqsave(&rx_lock, flags); ++ curr_idx = pDc->rx_tail; ++ pDesc = &RxPool[pDc->rx_tail]; ++ ++ /* if next descriptor is empty, then bail out */ ++ if (!((pDesc->Ctl & ACX100_CTL_OWN) && (pDesc->Status & BIT31))) ++ { ++ spin_unlock_irqrestore(&rx_lock, flags); ++ break; ++ } ++ else ++ { ++ pDc->rx_tail = (pDc->rx_tail + 1) % pDc->rx_pool_count; ++ spin_unlock_irqrestore(&rx_lock, flags); ++ } ++ } ++ FN_EXIT(0, 0); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_create_tx_host_desc_queue ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++int acx100_create_tx_host_desc_queue(TIWLAN_DC * pDc) ++{ ++ wlandevice_t *priv; ++ ++ UINT i; ++ UINT align_offs; ++ UINT alignment; ++ ++ struct framehdr *frame_hdr; ++ struct framehdr *frame_hdr_phy; ++ ++ UINT8 *frame_payload; ++ UINT8 *frame_payload_phy; ++ ++ struct txhostdescriptor *host_desc; ++ struct txhostdescriptor *host_desc_phy; ++ ++ FN_ENTER; ++ ++ priv = pDc->priv; ++ ++ /* allocate TX header pool */ ++ pDc->FrameHdrQPoolSize = (priv->TxQueueNo * sizeof(struct framehdr)); ++#if (WLAN_HOSTIF!=WLAN_USB) ++ if (!(pDc->pFrameHdrQPool = ++ pci_alloc_consistent(0, pDc->FrameHdrQPoolSize, &pDc->FrameHdrQPoolPhyAddr))) { ++ acxlog(L_BINSTD, "pDc->pFrameHdrQPool memory allocation error\n"); ++ FN_EXIT(1, 2); ++ return 2; ++ } ++ acxlog(L_BINDEBUG, "pDc->pFrameHdrQPool = 0x%8x\n", (UINT) pDc->pFrameHdrQPool); ++ acxlog(L_BINDEBUG, "pDc->pFrameHdrQPoolPhyAddr = 0x%8x\n", (UINT) pDc->FrameHdrQPoolPhyAddr); ++#else ++ if ((pDc->pFrameHdrQPool=kmalloc(pDc->FrameHdrQPoolSize,GFP_KERNEL))==NULL) { ++ acxlog(L_STD,"pDc->pFrameHdrQPool memory allocation error\n"); ++ FN_EXIT(1,2); ++ return(2); ++ } ++ memset(pDc->pFrameHdrQPool,0,pDc->FrameHdrQPoolSize); ++#endif ++ ++ /* allocate TX payload pool */ ++ pDc->TxBufferPoolSize = priv->TxQueueNo*2 * (WLAN_MAX_ETHFRM_LEN - WLAN_ETHHDR_LEN); ++#if (WLAN_HOSTIF!=WLAN_USB) ++ if (!(pDc->pTxBufferPool = ++ pci_alloc_consistent(0, pDc->TxBufferPoolSize, &pDc->TxBufferPoolPhyAddr))) { ++ acxlog(L_BINSTD, "pDc->pTxBufferPool memory allocation error\n"); ++ pci_free_consistent(0, pDc->FrameHdrQPoolSize, ++ pDc->pFrameHdrQPool, ++ pDc->FrameHdrQPoolPhyAddr); ++ FN_EXIT(1, 2); ++ return 2; ++ } ++ acxlog(L_BINDEBUG, "pDc->TxBufferPool = 0x%8x\n", (UINT) pDc->pTxBufferPool); ++ acxlog(L_BINDEBUG, "pDc->TxBufferPoolPhyAddr = 0x%8x\n", (UINT) pDc->TxBufferPoolPhyAddr); ++#else ++ if ((pDc->pTxBufferPool=kmalloc(pDc->TxBufferPoolSize,GFP_KERNEL))==NULL) { ++ acxlog(L_STD,"pDc->pTxBufferPool memory allocation error\n"); ++ kfree(pDc->pFrameHdrQPool); ++ FN_EXIT(1,2); ++ return(2); ++ } ++ memset(pDc->pTxBufferPool,0,pDc->TxBufferPoolSize); ++#endif ++ ++ /* allocate the TX host descriptor queue pool */ ++ pDc->TxHostDescQPoolSize = priv->TxQueueNo*2 * sizeof(struct txhostdescriptor) + 3; ++#if (WLAN_HOSTIF!=WLAN_USB) ++ if (!(pDc->pTxHostDescQPool = ++ pci_alloc_consistent(0, pDc->TxHostDescQPoolSize, ++ (dma_addr_t *) &pDc->TxHostDescQPoolPhyAddr))) { ++ acxlog(L_BINSTD, "Failed to allocate shared memory for TxHostDesc queue\n"); ++ pci_free_consistent(0, pDc->FrameHdrQPoolSize, ++ pDc->pFrameHdrQPool, ++ pDc->FrameHdrQPoolPhyAddr); ++ pci_free_consistent(0, pDc->TxBufferPoolSize, ++ pDc->pTxBufferPool, ++ pDc->TxBufferPoolPhyAddr); ++ FN_EXIT(1, 2); ++ return 2; ++ } ++ acxlog(L_BINDEBUG, "pDc->pTxHostDescQPool = 0x%08x\n", (UINT) pDc->pTxHostDescQPool); ++ acxlog(L_BINDEBUG, "pDc->TxHostDescQPoolPhyAddr = 0x%08lx\n", pDc->TxHostDescQPoolPhyAddr); ++#else ++ if ((pDc->pTxHostDescQPool=kmalloc(pDc->TxHostDescQPoolSize,GFP_KERNEL))==NULL) { ++ acxlog(L_STD,"Failed to allocate memory for TxHostDesc queue\n"); ++ kfree(pDc->pFrameHdrQPool); ++ kfree(pDc->pTxBufferPool); ++ FN_EXIT(1,2); ++ return(2); ++ } ++ memset(pDc->pTxHostDescQPool,0,pDc->TxHostDescQPoolSize); ++#endif ++ ++#if (WLAN_HOSTIF!=WLAN_USB) ++ /* check for proper alignment of TX host descriptor pool */ ++ alignment = (UINT) pDc->pTxHostDescQPool & 3; ++ if (alignment) { ++ acxlog(L_BINSTD, "%s: TxHostDescQPool not aligned properly\n", __func__); ++ align_offs = 4 - alignment; ++ } else { ++ align_offs = 0; ++ } ++ ++ host_desc = (struct txhostdescriptor *) ((UINT8 *) pDc->pTxHostDescQPool + align_offs); ++ host_desc_phy = (struct txhostdescriptor *) ((UINT8 *) pDc->TxHostDescQPoolPhyAddr + align_offs); ++ frame_hdr_phy = (struct framehdr *) pDc->FrameHdrQPoolPhyAddr; ++ frame_payload_phy = (UINT8 *) pDc->TxBufferPoolPhyAddr; ++#else ++ host_desc = (struct txhostdescriptor *)pDc->pTxHostDescQPool; ++#endif ++ frame_hdr = (struct framehdr *) pDc->pFrameHdrQPool; ++ frame_payload = (UINT8 *) pDc->pTxBufferPool; ++ ++ for (i = 0; i < priv->TxQueueNo*2 - 1; i++) ++ { ++ if (!(i & 1)) { ++#if (WLAN_HOSTIF!=WLAN_USB) ++ host_desc->data_phy = (UINT8 *) frame_hdr_phy; ++ frame_hdr_phy++; ++ host_desc->pNext = (struct txhostdescriptor *)((UINT8 *) host_desc_phy + sizeof(struct txhostdescriptor)); ++#endif ++ host_desc->data = (UINT8 *) frame_hdr; ++ frame_hdr++; ++ } else { ++#if (WLAN_HOSTIF!=WLAN_USB) ++ host_desc->data_phy = (UINT8 *) frame_payload_phy; ++ frame_payload_phy += WLAN_MAX_ETHFRM_LEN - WLAN_ETHHDR_LEN; ++#endif ++ host_desc->data = (UINT8 *) frame_payload; ++ frame_payload += WLAN_MAX_ETHFRM_LEN - WLAN_ETHHDR_LEN; ++ host_desc->pNext = NULL; ++ } ++ ++ host_desc->Ctl |= ACX100_CTL_OWN; ++#if (WLAN_HOSTIF!=WLAN_USB) ++ host_desc->desc_phy = host_desc_phy; ++ host_desc->desc_phy_next = (struct txhostdescriptor *)((UINT8 *) host_desc_phy + sizeof(struct txhostdescriptor)); ++ host_desc_phy++; ++#endif ++ host_desc++; ++ } ++ host_desc->data = (UINT8 *) frame_payload; ++ host_desc->pNext = 0; ++ host_desc->Ctl |= ACX100_CTL_OWN; ++ ++#if (WLAN_HOSTIF!=WLAN_USB) ++ host_desc->data_phy = (UINT8 *) frame_payload_phy; ++ host_desc->desc_phy = host_desc_phy; ++ host_desc->desc_phy_next = (struct txhostdescriptor *)((UINT8 *) pDc->TxHostDescQPoolPhyAddr + align_offs); ++#endif ++ ++ FN_EXIT(0, 0); ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_create_rx_host_desc_queue ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++int acx100_create_rx_host_desc_queue(TIWLAN_DC * pDc) ++{ ++ wlandevice_t *priv; ++ ++ UINT i; ++ UINT align_offs; ++ UINT alignment; ++ ++ struct rxbuffer *data; ++ struct rxbuffer *data_phy; ++ struct rxhostdescriptor *host_desc; ++ struct rxhostdescriptor *host_desc_phy; ++ ++ int result = 0; ++ ++ FN_ENTER; ++ ++ priv = pDc->priv; ++ ++ /* allocate the RX host descriptor queue pool */ ++ pDc->RxHostDescQPoolSize = (priv->RxQueueNo * sizeof(struct rxhostdescriptor)) + 0x3; ++ ++#if (WLAN_HOSTIF!=WLAN_USB) ++ if (NULL == (pDc->pRxHostDescQPool = ++ pci_alloc_consistent(0, pDc->RxHostDescQPoolSize, ++ (dma_addr_t *) &pDc->RxHostDescQPoolPhyAddr))) { ++ acxlog(L_BINSTD, ++ "Failed to allocate shared memory for RxHostDesc queue\n"); ++ result = 2; ++ goto fail; ++ } ++#else ++ if (NULL == (pDc->pRxHostDescQPool = kmalloc(pDc->RxHostDescQPoolSize, GFP_KERNEL))) { ++ acxlog(L_STD,"Failed to allocate memory for RxHostDesc queue\n"); ++ result = 2; ++ goto fail; ++ } ++ memset(pDc->pRxHostDescQPool,0,pDc->RxHostDescQPoolSize); ++#endif ++ ++ /* allocate RX buffer pool */ ++ pDc->RxBufferPoolSize = (priv->RxQueueNo * sizeof(struct rxbuffer)); ++#if (WLAN_HOSTIF!=WLAN_USB) ++ if (NULL == (pDc->pRxBufferPool = ++ pci_alloc_consistent(0, pDc->RxBufferPoolSize, ++ (dma_addr_t *) &pDc->RxBufferPoolPhyAddr))) { ++ acxlog(L_BINSTD, "Failed to allocate shared memory for Rx buffer\n"); ++ pci_free_consistent(0, pDc->RxHostDescQPoolSize, ++ pDc->pRxHostDescQPool, ++ pDc->RxHostDescQPoolPhyAddr); ++ result = 2; ++ goto fail; ++ } ++#else ++ if (NULL == (pDc->pRxBufferPool = kmalloc(pDc->RxBufferPoolSize,GFP_KERNEL))) { ++ acxlog(L_STD,"Failed to allocate memory for Rx buffer\n"); ++ result=2; ++ goto fail; ++ } ++ memset(pDc->pRxBufferPool,0,pDc->RxBufferPoolSize); ++#endif ++ ++ acxlog(L_BINDEBUG, "pDc->pRxHostDescQPool = 0x%8x\n", (UINT) pDc->pRxHostDescQPool); ++#if (WLAN_HOSTIF!=WLAN_USB) ++ acxlog(L_BINDEBUG, "pDc->RxHostDescQPoolPhyAddr = 0x%8x\n", (UINT) pDc->RxHostDescQPoolPhyAddr); ++#endif ++ acxlog(L_BINDEBUG, "pDc->pRxBufferPool = 0x%8x\n", (UINT) pDc->pRxBufferPool); ++#if (WLAN_HOSTIF!=WLAN_USB) ++ acxlog(L_BINDEBUG, "pDc->RxBufferPoolPhyAddr = 0x%8x\n", (UINT) pDc->RxBufferPoolPhyAddr); ++#endif ++#if (WLAN_HOSTIF!=WLAN_USB) ++ /* check for proper alignment of RX host descriptor pool */ ++ if ((alignment = ((UINT) pDc->pRxHostDescQPool) & 3)) { ++ acxlog(L_BINSTD, "acx100_create_rx_host_desc_queue: RxHostDescQPool not aligned properly\n"); ++ align_offs = 4 - alignment; ++ } else { ++ align_offs = 0; ++ } ++ ++ host_desc = (struct rxhostdescriptor *) ((UINT8 *) pDc->pRxHostDescQPool + align_offs); ++ host_desc_phy = (struct rxhostdescriptor *) ((UINT8 *) pDc->RxHostDescQPoolPhyAddr + align_offs); ++ ++ priv->RxHostDescPoolStart = host_desc_phy; ++#else ++ host_desc = (struct rxhostdescriptor *)pDc->pRxHostDescQPool; ++#endif ++ data = (struct rxbuffer *) pDc->pRxBufferPool; ++#if (WLAN_HOSTIF!=WLAN_USB) ++ data_phy = (struct rxbuffer *) pDc->RxBufferPoolPhyAddr; ++#endif ++ ++ for (i = 0; i < priv->RxQueueNo - 1; i++) { ++ host_desc->data = data; ++#if (WLAN_HOSTIF!=WLAN_USB) ++ host_desc->data_phy = data_phy; ++ data_phy++; ++#endif ++ host_desc->length = sizeof(struct rxbuffer); ++ data++; ++ ++ /* FIXME: what do these mean ? */ ++ host_desc->val0x28 = 2; ++ host_desc->Ctl &= ~0x80; ++#if (WLAN_HOSTIF!=WLAN_USB) ++ host_desc->desc_phy = host_desc_phy; ++ host_desc->desc_phy_next = (struct rxhostdescriptor *)((UINT8 *) host_desc_phy + sizeof(struct rxhostdescriptor)); ++ host_desc_phy++; ++#endif ++ host_desc++; ++ } ++ host_desc->data = data; ++#if (WLAN_HOSTIF!=WLAN_USB) ++ host_desc->data_phy = data_phy; ++#endif ++ host_desc->length = sizeof(struct rxbuffer); ++ ++ host_desc->val0x28 = 2; ++ host_desc->Ctl &= 0xff7f; ++#if (WLAN_HOSTIF!=WLAN_USB) ++ host_desc->desc_phy = host_desc_phy; ++ host_desc->desc_phy_next = (struct rxhostdescriptor *)((UINT8 *) pDc->RxHostDescQPoolPhyAddr + align_offs); ++#endif ++ result = 0; ++fail: ++ FN_EXIT(1, result); ++ return result; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_create_tx_desc_queue ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++void acx100_create_tx_desc_queue(TIWLAN_DC *pDc) ++{ ++ wlandevice_t *priv; ++ ++ UINT32 mem_offs; ++ UINT32 i; ++ ++ struct txdescriptor *tx_desc; ++ struct txhostdescriptor *tx_hostdesc; ++ ++ UINT hostmemptr; ++ ++ FN_ENTER; ++ ++ priv = pDc->priv; ++ pDc->tx_pool_count = priv->TxQueueNo; ++#if (WLAN_HOSTIF==WLAN_USB) ++ /* allocate memory for TxDescriptors */ ++ pDc->pTxDescQPool=(struct txdescriptor *)kmalloc(pDc->tx_pool_count*sizeof(struct txdescriptor),GFP_KERNEL); ++ if (!pDc->pTxDescQPool) { ++ acxlog(L_STD,"Not enough memory to allocate txdescriptor queue\n"); ++ return; ++ } ++#endif ++#if (WLAN_HOSTIF!=WLAN_USB) ++ pDc->pTxDescQPool = (struct txdescriptor *) (priv->iobase2 + ++ pDc->ui32ACXTxQueueStart); ++ ++ acxlog(L_BINDEBUG, "priv->iobase2 = 0x%08lx\n", priv->iobase2); ++ acxlog(L_BINDEBUG, "pDc->ui32ACXTxQueueStart = 0x%08lx\n", ++ pDc->ui32ACXTxQueueStart); ++ acxlog(L_BINDEBUG, "pDc->pTxDescQPool = 0x%08x\n", ++ (UINT) pDc->pTxDescQPool); ++#endif ++ priv->TxQueueFree = priv->TxQueueNo; ++ pDc->tx_head = 0; ++ pDc->tx_tail = 0; ++ tx_desc = pDc->pTxDescQPool; ++#if (WLAN_HOSTIF!=WLAN_USB) ++ mem_offs = pDc->ui32ACXTxQueueStart; ++ hostmemptr = pDc->TxHostDescQPoolPhyAddr; ++#else ++ mem_offs = (UINT32)pDc->pTxDescQPool; ++#endif ++ tx_hostdesc = (struct txhostdescriptor *) pDc->pTxHostDescQPool; ++ ++ /* loop over complete send pool */ ++ for (i = 0; i < pDc->tx_pool_count; i++) { ++ memset(tx_desc, 0, sizeof(struct txdescriptor)); ++ /* pointer to hostdesc memory */ ++#if (WLAN_HOSTIF!=WLAN_USB) ++ tx_desc->HostMemPtr = hostmemptr; ++#else ++ tx_desc->HostMemPtr = 0; ++#endif ++ /* initialise ctl */ ++ tx_desc->Ctl = DESC_CTL_INIT; ++ tx_desc->Ctl2 = 0; ++ /* point to next txdesc */ ++ tx_desc->pNextDesc = mem_offs + sizeof(struct txdescriptor); ++ /* pointer to first txhostdesc */ ++ tx_desc->host_desc = tx_hostdesc; ++ ++ /* reserve two (hdr desc and payload desc) */ ++ tx_hostdesc += 2; ++#if (WLAN_HOSTIF!=WLAN_USB) ++ hostmemptr += 2 * sizeof(struct txhostdescriptor); ++#endif ++ /* go to the next */ ++ mem_offs += sizeof(struct txdescriptor); ++ tx_desc++; ++ } ++ /* go to the last one */ ++ tx_desc--; ++ /* and point to the first making it a ring buffer */ ++#if (WLAN_HOSTIF!=WLAN_USB) ++ tx_desc->pNextDesc = pDc->ui32ACXTxQueueStart; ++#else ++ tx_desc->pNextDesc = (UINT32)pDc->pTxDescQPool; ++#endif ++ FN_EXIT(0, 0); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_create_rx_desc_queue ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++void acx100_create_rx_desc_queue(TIWLAN_DC *pDc) ++{ ++ wlandevice_t *priv; ++ UINT32 mem_offs; ++ UINT32 i; ++ struct rxdescriptor *rx_desc; ++ ++ FN_ENTER; ++ ++ priv = pDc->priv; ++ ++#if (WLAN_HOSTIF!=WLAN_USB) ++ /* Why is "TxQueueNo" used here? ++ * Because pRxDescQPool is right AFTER pTxDescQPool */ ++ pDc->pRxDescQPool = (struct rxdescriptor *) ((UINT8 *) pDc->pTxDescQPool + (priv->TxQueueNo * sizeof(struct txdescriptor))); ++#endif ++ pDc->rx_pool_count = priv->RxQueueNo; ++ pDc->rx_tail = 0; ++#if (WLAN_HOSTIF!=WLAN_USB) ++ mem_offs = pDc->ui32ACXRxQueueStart; ++ rx_desc = (struct rxdescriptor *) pDc->pRxDescQPool; ++ ++ /* loop over complete receive pool */ ++ for (i = 0; i < pDc->rx_pool_count; i++) { ++ memset(rx_desc, 0, sizeof(struct rxdescriptor)); ++ rx_desc->Ctl = 0xc; ++ ++ /* point to next rxdesc */ ++ rx_desc->pNextDesc = mem_offs + sizeof(struct rxdescriptor); // next rxdesc pNextDesc ++ ++ /* go to the next */ ++ mem_offs += sizeof(struct rxdescriptor); ++ rx_desc++; ++ } ++ /* go to the last one */ ++ rx_desc--; ++ ++ /* and point to the first making it a ring buffer */ ++ rx_desc->pNextDesc = pDc->ui32ACXRxQueueStart; ++#endif ++ FN_EXIT(0, 0); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_free_desc_queues ++* ++* Releases the queues that have been allocated, the ++* others have been initialised to NULL in acx100.c so this ++* function can be used if only part of the queues where ++* allocated. ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++void acx100_free_desc_queues(TIWLAN_DC * pDc) ++{ ++ FN_ENTER; ++ if (pDc->pRxHostDescQPool) { ++ pci_free_consistent(0, ++ pDc->TxHostDescQPoolSize, ++ pDc->pTxHostDescQPool, ++ pDc->TxHostDescQPoolPhyAddr); ++ pDc->pTxHostDescQPool = NULL; ++ pDc->TxHostDescQPoolSize = 0; ++ } ++ if (pDc->pFrameHdrQPool) { ++ pci_free_consistent(0, pDc->FrameHdrQPoolSize, ++ pDc->pFrameHdrQPool, ++ pDc->FrameHdrQPoolPhyAddr); ++ pDc->pFrameHdrQPool = NULL; ++ pDc->FrameHdrQPoolSize = 0; ++ } ++ if (pDc->pTxBufferPool) { ++ pci_free_consistent(0, pDc->TxBufferPoolSize, ++ pDc->pTxBufferPool, ++ pDc->TxBufferPoolPhyAddr); ++ pDc->pTxBufferPool = NULL; ++ pDc->TxBufferPoolSize = 0; ++ } ++ ++ pDc->pTxDescQPool = NULL; ++ pDc->tx_pool_count = 0; ++ ++ if (pDc->pRxHostDescQPool) { ++ pci_free_consistent(0, pDc->RxHostDescQPoolSize, ++ pDc->pRxHostDescQPool, ++ pDc->RxHostDescQPoolPhyAddr); ++ pDc->pRxHostDescQPool = NULL; ++ pDc->RxHostDescQPoolSize = 0; ++ } ++ if (pDc->pRxBufferPool) { ++ pci_free_consistent(0, pDc->RxBufferPoolSize, ++ pDc->pRxBufferPool, ++ pDc->RxBufferPoolPhyAddr); ++ pDc->pRxBufferPool = NULL; ++ pDc->RxBufferPoolSize = 0; ++ } ++ ++ pDc->pRxDescQPool = NULL; ++ pDc->rx_pool_count = 0; ++ FN_EXIT(0, 0); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_init_memory_pools ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* FIXME: This function still needs a cleanup ++*----------------------------------------------------------------*/ ++ ++int acx100_init_memory_pools(wlandevice_t *priv, acx100_memmap_t *mmt) ++{ ++ UINT32 TotalMemoryBlocks; // var_40 ++ memblocksize_t MemoryBlockSize; ++ ++ acx100_memconfigoption_t MemoryConfigOption; // var_2c ++ ++ FN_ENTER; ++ ++ ++ /* Let's see if we can follow this: ++ first we select our memory block size (which I think is ++ completely arbitrary) */ ++ MemoryBlockSize.size = cpu_to_le16(priv->memblocksize); ++ ++ /* Then we alert the card to our decision of block size */ ++ if (!acx100_configure(priv, &MemoryBlockSize, ACX100_RID_BLOCK_SIZE)) { ++ acxlog(L_BINSTD, "Ctl: MemoryBlockSizeWrite failed\n"); ++ FN_EXIT(1, 0); ++ return 0; ++ } ++ ++ /* We figure out how many total blocks we can create, using ++ the block size we chose, and the beginning and ending ++ memory pointers. IE. end-start/size */ ++ TotalMemoryBlocks = (le32_to_cpu(mmt->PoolEnd) - le32_to_cpu(mmt->PoolStart)) / priv->memblocksize; ++ ++ acxlog(L_DEBUG,"TotalMemoryBlocks=%ld (%ld bytes)\n",TotalMemoryBlocks,TotalMemoryBlocks*priv->memblocksize); ++ ++ /* This one I have no idea on */ ++ /* block-transfer=0x20000 ++ * indirect descriptors=0x10000 ++ */ ++#if (WLAN_HOSTIF==WLAN_USB) ++ MemoryConfigOption.DMA_config = cpu_to_le32(0x20000); ++#else ++ MemoryConfigOption.DMA_config = cpu_to_le32(0x30000); ++#endif ++ ++ ++ /* Declare start of the Rx host pool */ ++ MemoryConfigOption.RxHostDesc = (struct rxhostdescriptor *)cpu_to_le32(priv->RxHostDescPoolStart); ++ ++ /* 50% of the allotment of memory blocks go to tx descriptors */ ++ MemoryConfigOption.TxBlockNum = cpu_to_le16(TotalMemoryBlocks / 2); ++ ++ /* and 50% go to the rx descriptors */ ++ MemoryConfigOption.RxBlockNum = cpu_to_le16(TotalMemoryBlocks - le16_to_cpu(MemoryConfigOption.TxBlockNum)); ++ ++ /* in this block, we save the information we gleaned from the ++ card into our wlandevice structure; # of tx desc blocks */ ++ priv->TxBlockNum = le16_to_cpu(MemoryConfigOption.TxBlockNum); ++ ++ /* # of rx desc blocks */ ++ priv->TxBlockNum = le16_to_cpu(MemoryConfigOption.RxBlockNum); ++ ++ /* size of the tx and rx descriptor queues */ ++ priv->TotalTxBlockSize = le16_to_cpu(MemoryConfigOption.TxBlockNum) * priv->memblocksize; ++ priv->TotalRxBlockSize = le16_to_cpu(MemoryConfigOption.RxBlockNum) * priv->memblocksize; ++ ++ ++ /* align the tx descriptor queue to an alignment of 0x20 (32 bytes) */ ++ MemoryConfigOption.rx_mem = ++ cpu_to_le32((le32_to_cpu(mmt->PoolStart) + 0x1f) & 0xffffffe0); ++ ++ /* align the rx descriptor queue to units of 0x20 and offset it ++ by the tx descriptor queue */ ++ MemoryConfigOption.tx_mem = ++ cpu_to_le32((0x1f + le32_to_cpu(mmt->PoolStart) + priv->TotalRxBlockSize) & 0xffffffe0); ++ ++ /* alert the device to our decision */ ++ if (!acx100_configure(priv, &MemoryConfigOption, ACX100_RID_MEMORY_CONFIG_OPTIONS)) { ++ acxlog(L_DEBUG,"%s: configure memory config options failed!\n", __func__); ++ FN_EXIT(1, 0); ++ return 0; ++ } ++ ++ /* and tell the device to kick it into gear */ ++ if (!acx100_issue_cmd(priv, ACX100_CMD_INIT_MEMORY, NULL, 0, 5000)) { ++ acxlog(L_DEBUG,"%s: init memory failed!\n", __func__); ++ FN_EXIT(1, 0); ++ return 0; ++ } ++ FN_EXIT(1, 1); ++ return 1; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_get_tx_desc ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++struct txdescriptor *acx100_get_tx_desc(wlandevice_t *priv) ++{ ++ struct TIWLAN_DC * pDc = &priv->dc; ++ struct txdescriptor *tx_desc; ++ unsigned long flags; ++ ++ FN_ENTER; ++ ++ spin_lock_irqsave(&tx_lock, flags); ++ ++ tx_desc = &pDc->pTxDescQPool[pDc->tx_head]; ++ ++ if (0 == (tx_desc->Ctl & ACX100_CTL_OWN)) { ++ /* whoops, descr at current index is not free, so probably ++ * ring buffer already full */ ++ tx_desc = NULL; ++ goto error; ++ } ++ ++ priv->TxQueueFree--; ++ acxlog(L_BUF, "got Tx desc %ld, %ld remain.\n", pDc->tx_head, priv->TxQueueFree); ++ ++/* ++ * This comment is probably not entirely correct, needs further discussion ++ * (restored commented-out code below to fix Tx ring buffer overflow, ++ * since it's much better to have a slightly less efficiently used ring ++ * buffer rather than one which easily overflows): ++ * ++ * This doesn't do anything other than limit our maximum number of ++ * buffers used at a single time (we might as well just declare ++ * MINFREE_TX less descriptors when we open up.) We should just let it ++ * slide here, and back off MINFREE_TX in acx100_clean_tx_desc, when given the ++ * opportunity to let the queue start back up. ++ */ ++ if (priv->TxQueueFree < MINFREE_TX) ++ { ++ acxlog(L_XFER, "stop queue (avail. Tx desc %ld).\n", priv->TxQueueFree); ++ netif_stop_queue(priv->netdev); ++ } ++ ++ /* returning current descriptor, so advance to next free one */ ++ pDc->tx_head = (pDc->tx_head + 1) % pDc->tx_pool_count; ++error: ++ spin_unlock_irqrestore(&tx_lock, flags); ++ ++ FN_EXIT(0, (int)tx_desc); ++ return tx_desc; ++} ++ ++static char type_string[32]; /* I *really* don't care that this is static, ++ so don't complain, else... ;-) */ ++ ++/*---------------------------------------------------------------- ++* acx100_get_packet_type_string ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++char *acx100_get_packet_type_string(UINT16 fc) ++{ ++ char *ftype = "UNKNOWN", *fstype = "UNKNOWN"; ++ ++ FN_ENTER; ++ switch (WLAN_GET_FC_FTYPE(fc)) { ++ case WLAN_FTYPE_MGMT: ++ ftype = "MGMT"; ++ switch (WLAN_GET_FC_FSTYPE(fc)) { ++ case WLAN_FSTYPE_ASSOCREQ: ++ fstype = "AssocReq"; ++ break; ++ case WLAN_FSTYPE_ASSOCRESP: ++ fstype = "AssocResp"; ++ break; ++ case WLAN_FSTYPE_REASSOCREQ: ++ fstype = "ReassocReq"; ++ break; ++ case WLAN_FSTYPE_REASSOCRESP: ++ fstype = "ReassocResp"; ++ break; ++ case WLAN_FSTYPE_PROBEREQ: ++ fstype = "ProbeReq"; ++ break; ++ case WLAN_FSTYPE_PROBERESP: ++ fstype = "ProbeResp"; ++ break; ++ case WLAN_FSTYPE_BEACON: ++ fstype = "Beacon"; ++ break; ++ case WLAN_FSTYPE_ATIM: ++ fstype = "ATIM"; ++ break; ++ case WLAN_FSTYPE_DISASSOC: ++ fstype = "Disassoc"; ++ break; ++ case WLAN_FSTYPE_AUTHEN: ++ fstype = "Authen"; ++ break; ++ case WLAN_FSTYPE_DEAUTHEN: ++ fstype = "Deauthen"; ++ break; ++ } ++ break; ++ case WLAN_FTYPE_CTL: ++ ftype = "CTL"; ++ switch (WLAN_GET_FC_FSTYPE(fc)) { ++ case WLAN_FSTYPE_PSPOLL: ++ fstype = "PSPoll"; ++ break; ++ case WLAN_FSTYPE_RTS: ++ fstype = "RTS"; ++ break; ++ case WLAN_FSTYPE_CTS: ++ fstype = "CTS"; ++ break; ++ case WLAN_FSTYPE_ACK: ++ fstype = "Ack"; ++ break; ++ case WLAN_FSTYPE_CFEND: ++ fstype = "CFEnd"; ++ break; ++ case WLAN_FSTYPE_CFENDCFACK: ++ fstype = "CFEndCFAck"; ++ break; ++ } ++ break; ++ case WLAN_FTYPE_DATA: ++ ftype = "DATA"; ++ switch (WLAN_GET_FC_FSTYPE(fc)) { ++ case WLAN_FSTYPE_DATAONLY: ++ fstype = "DataOnly"; ++ break; ++ case WLAN_FSTYPE_DATA_CFACK: ++ fstype = "Data CFAck"; ++ break; ++ case WLAN_FSTYPE_DATA_CFPOLL: ++ fstype = "Data CFPoll"; ++ break; ++ case WLAN_FSTYPE_DATA_CFACK_CFPOLL: ++ fstype = "Data CFAck/CFPoll"; ++ break; ++ case WLAN_FSTYPE_NULL: ++ fstype = "Null"; ++ break; ++ case WLAN_FSTYPE_CFACK: ++ fstype = "CFAck"; ++ break; ++ case WLAN_FSTYPE_CFPOLL: ++ fstype = "CFPoll"; ++ break; ++ case WLAN_FSTYPE_CFACK_CFPOLL: ++ fstype = "CFAck/CFPoll"; ++ break; ++ } ++ break; ++ } ++ sprintf(type_string, "%s/%s", ftype, fstype); ++ FN_EXIT(1, (int)type_string); ++ return type_string; ++} +diff -urN x/drivers/net/wireless/acx/idma.h y/drivers/net/wireless/acx/idma.h +--- x/drivers/net/wireless/acx/idma.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/acx/idma.h 2004-04-14 02:03:21.000000000 +1000 +@@ -0,0 +1,200 @@ ++/* include/idma.h ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Copyright (C) 2003 ACX100 Open Source Project ++ * ++ * The contents of this file are subject to the Mozilla Public ++ * License Version 1.1 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS ++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or ++ * implied. See the License for the specific language governing ++ * rights and limitations under the License. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU Public License version 2 (the "GPL"), in which ++ * case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use ++ * your version of this file under the MPL, indicate your decision ++ * by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL. If you do not delete ++ * the provisions above, a recipient may use your version of this ++ * file under either the MPL or the GPL. ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Inquiries regarding the ACX100 Open Source Project can be ++ * made directly to: ++ * ++ * acx100-users@lists.sf.net ++ * http://acx100.sf.net ++ * ++ * -------------------------------------------------------------------- ++ */ ++ ++#include "acx100_conv.h" ++ ++int acx100_create_dma_regions(wlandevice_t *priv); ++int acx111_create_dma_regions(wlandevice_t *priv); ++int acx100_delete_dma_region(wlandevice_t *wlandev); ++void acx100_dma_tx_data(wlandevice_t *wlandev, struct txdescriptor *txdesc); ++void acx100_clean_tx_desc(wlandevice_t *priv); ++inline UINT8 acx_signal_to_winlevel(UINT8 rawlevel); ++void acx100_process_rx_desc(wlandevice_t *priv); ++int acx100_create_tx_host_desc_queue(TIWLAN_DC *pDc); ++int acx100_create_rx_host_desc_queue(TIWLAN_DC *pDc); ++void acx100_create_tx_desc_queue(TIWLAN_DC *pDc); ++void acx100_create_rx_desc_queue(TIWLAN_DC *pDc); ++void acx100_free_desc_queues(TIWLAN_DC *pDc); ++int acx100_init_memory_pools(wlandevice_t *priv, acx100_memmap_t *vala); ++struct txdescriptor *acx100_get_tx_desc(wlandevice_t *priv); ++ ++char *acx100_get_packet_type_string(UINT16 fc); ++ ++/* seems to be a bit similar to hfa384x_rx_frame. ++ * These fields are still not quite obvious, though. ++ * Some seem to have different meanings... */ ++ ++#define ACX100_RXBUF_HDRSIZE 12 ++ ++typedef struct rxbuffer { ++ /* UINT32 status; */ /* 0x0 MAC stat */ ++ UINT16 mac_cnt_rcvd; /* 0x0, only 12 bits are len! (0xfff) */ ++ UINT8 mac_cnt_mblks; /* 0x2 */ ++ UINT8 mac_status; /* 0x3 */ ++ /* UINT16 stat; */ /* 0x4 PHY stat */ ++ UINT8 phy_stat_baseband; /* 0x4 bit 0x80: used LNA (Low-Noise Amplifier) */ ++ UINT8 phy_plcp_signal; /* 0x5 */ ++ UINT8 phy_level; /* 0x6 PHY stat */ ++ UINT8 phy_snr; /* 0x7 PHY stat */ ++ UINT32 time; /* 0x8 timestamp upon MAC rcv first byte */ ++ acx100_addr3_t buf; /* 0x0c 0x18 */ ++ UINT8 val0x24[0x922]; ++ ++} rxb_t; /* 0x956 */ ++ ++typedef struct txbuffer { ++ UINT8 data[WLAN_MAX_ETHFRM_LEN-WLAN_ETHHDR_LEN]; ++} txb_t; ++ ++/* This stuct must contain the header of a packet. A header can maximally ++ * contain a type 4 802.11 header + a LLC + a SNAP, amounting to 38 bytes */ ++typedef struct framehdr { ++ char data[0x26]; ++} frmhdr_t; ++ ++/* flags: ++ * 0x01 - short preamble ++ * 0x02 - first packet in a row?? fragmentation??? (sorry) ++ * 0x40 - usable ?? (0 means: not used for tx) ++ * 0x80 - free ? (0 : used, 1 : free) ++ * init value is 0x8e, "idle" value is 0x82 (in idle tx descs) ++ */ ++ ++#define DESC_CTL_SHORT_PREAMBLE 0x01 ++#define DESC_CTL_FIRST_MPDU 0x02 ++#define DESC_CTL_AUTODMA 0x04 ++#define DESC_CTL_RECLAIM 0x08 ++#define DESC_CTL_USED_FOR_TX 0x40 /* owned */ ++#define DESC_CTL_FREE 0x80 /* tx finished */ ++ ++#define DESC_CTL_INIT (ACX100_CTL_OWN | ACX100_CTL_RECLAIM | \ ++ ACX100_CTL_AUTODMA | ACX100_CTL_FIRSTFRAG) ++ ++#define DESC_CTL_DONE (ACX100_CTL_ACXDONE | ACX100_CTL_OWN) ++ ++#define DESC_CTL2_RTS 0x20 ++ ++typedef struct txdescriptor { ++ UINT32 pNextDesc; /* pointer to the next txdescriptor */ ++ UINT32 HostMemPtr; ++ UINT32 AcxMemPtr; ++ UINT32 tx_time; ++ UINT16 total_length; ++ UINT16 Reserved; ++ UINT32 val0x14; /* the following 16 bytes do not change when acx100 owns the descriptor */ ++ UINT32 val0x18; /* 0x18 */ ++ struct txhostdescriptor *host_desc; /* 0x1c */ ++ UINT32 val0x20; /* 0x20 */ ++ UINT8 Ctl; /* 0x24 */ ++ UINT8 Ctl2; /* 0x25 */ ++ UINT8 error; /* 0x26 */ ++ UINT8 ack_failures; /* 0x27 */ ++ UINT8 rts_failures; /* 0x28 */ ++ UINT8 rts_ok; /* 0x29 */ ++ UINT8 rate; /* 0x2a */ ++ UINT8 queue_ctrl; /* 0x2b */ ++ UINT32 queue_info; /* 0x2c */ ++} txdesc_t; /* size : 48 = 0x30 */ ++ ++typedef struct txhostdescriptor { ++ UINT8 *data_phy; ++ UINT16 data_offset; ++ UINT16 val0x6; ++ UINT16 Ctl; ++ UINT16 length; ++ struct txhostdescriptor *desc_phy_next; ++/* You can use this area as you want */ ++ struct txhostdescriptor *pNext; /* 0x10 */ ++ UINT32 Flags; /* 0x14 */ ++ struct txhostdescriptor *desc_phy; /* 0x18 */ ++ struct txdescriptor *val0x1c; /* 0x1c */ ++ UINT32 val0x20; /* 0x20 */ ++ UINT8 *data; ++ UINT16 val0x28; ++ UINT8 rate; ++ UINT8 val0x2b; ++} txhostdesc_t; /* size: 0x2c */ ++ ++typedef struct rxdescriptor { ++ UINT32 pNextDesc; /* 0x00 */ ++ UINT32 HostMemPtr; /* 0x04 */ ++ UINT32 ACXMemPtr; /* 0x08 */ ++ UINT32 rx_time; /* 0x0c */ ++ UINT16 total_length; /* 0x10 */ ++ UINT16 WEP_length; /* 0x12 */ ++ UINT32 WEP_ofs; /* 0x14 */ ++ UINT32 val0x18; /* 0x18 */ ++ UINT32 val0x1c; /* 0x1c */ ++ UINT32 val0x20; /* 0x20 */ ++ struct rxbuffer *val0x24; /* 0x24 */ ++ UINT8 Ctl; ++ UINT8 rate; ++ UINT8 error; ++ UINT8 SNR; ++ UINT8 RxLevel; ++ UINT8 queue_ctrl; ++ UINT16 unknown; ++ UINT32 val0x30; ++} rxdesc_t; /* size 52 = 0x34 */ ++ ++typedef struct rxhostdescriptor { ++ struct rxbuffer *data_phy; ++ UINT32 HostMemPtr; ++ UINT16 Ctl; ++ UINT16 length; ++ struct rxhostdescriptor *desc_phy_next; ++ struct rxhostdescriptor *pNext; ++ UINT32 Status; ++/* You can use this area as you want */ ++ struct rxhostdescriptor *desc_phy; ++ UINT32 val0x1c; ++ UINT32 val0x20; ++ struct rxbuffer *data; ++ UINT8 val0x28; ++ UINT8 val0x29; ++ UINT8 rate; ++ UINT8 val0x2b; ++} rxhostdesc_t; /* size 44 = 0x2c */ ++ ++typedef struct MemoryBlockSizeStruct { ++ UINT16 rid; ++ UINT16 len; ++ UINT16 size; ++} memblocksize_t; ++ ++#define ETH_P_80211_RAW (ETH_P_ECONET + 1) +diff -urN x/drivers/net/wireless/acx/ihw.c y/drivers/net/wireless/acx/ihw.c +--- x/drivers/net/wireless/acx/ihw.c 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/acx/ihw.c 2004-04-14 02:08:18.000000000 +1000 +@@ -0,0 +1,937 @@ ++/* src/ihw.c - low level control functions ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Copyright (C) 2003 ACX100 Open Source Project ++ * ++ * The contents of this file are subject to the Mozilla Public ++ * License Version 1.1 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS ++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or ++ * implied. See the License for the specific language governing ++ * rights and limitations under the License. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU Public License version 2 (the "GPL"), in which ++ * case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use ++ * your version of this file under the MPL, indicate your decision ++ * by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL. If you do not delete ++ * the provisions above, a recipient may use your version of this ++ * file under either the MPL or the GPL. ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Inquiries regarding the ACX100 Open Source Project can be ++ * made directly to: ++ * ++ * acx100-users@lists.sf.net ++ * http://acx100.sf.net ++ * ++ * -------------------------------------------------------------------- ++ */ ++ ++#include ++#include ++ ++#include ++#include ++ ++#include ++#include ++ ++#include ++ ++#include ++ ++#include ++ ++ ++/*================================================================*/ ++/* Project Includes */ ++ ++#include ++#include ++#include ++#include ++ ++void acx100_dump_bytes(void *,int); ++ ++ ++/***************************************************************************** ++ * ++ * The Really Low Level Stuff (TM) ++ * ++ ****************************************************************************/ ++ ++/*---------------------------------------------------------------- ++* acx100_read_reg32 ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++inline UINT32 acx100_read_reg32(wlandevice_t *priv, UINT offset) ++{ ++ return readl(priv->iobase + offset); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_read_reg16 ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++inline UINT16 acx100_read_reg16(wlandevice_t *priv, UINT offset) ++{ ++ return readw(priv->iobase + offset); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_read_reg8 ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++inline UINT8 acx100_read_reg8(wlandevice_t *priv, UINT offset) ++{ ++ return readb(priv->iobase + offset); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_write_reg32 ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++inline void acx100_write_reg32(wlandevice_t *priv, UINT offset, UINT valb) ++{ ++ writel(valb, priv->iobase + offset); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_write_reg16 ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++inline void acx100_write_reg16(wlandevice_t *priv, UINT offset, UINT16 valb) ++{ ++ writew(valb, priv->iobase + offset); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_write_reg8 ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++inline void acx100_write_reg8(wlandevice_t *priv, UINT offset, UINT valb) ++{ ++ writeb(valb, priv->iobase + offset); ++} ++ ++/***************************************************************************** ++ * ++ * Intermediate Level ++ * ++ ****************************************************************************/ ++ ++void acx100_get_info_state(wlandevice_t *priv) ++{ ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_END_CTL], 0x0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_END_CTL] + 0x2, 0x0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_CTL], 0x0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_CTL] + 0x2, 0x1); ++ ++#if ACX_32BIT_IO ++ acx100_write_reg32(priv, priv->io[IO_ACX_SLV_MEM_ADDR], ++ acx100_read_reg32(priv, priv->io[IO_ACX_INFO_MAILBOX_OFFS])); ++#else ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_ADDR], ++ acx100_read_reg16(priv, priv->io[IO_ACX_INFO_MAILBOX_OFFS])); ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_ADDR] + 0x2, ++ acx100_read_reg16(priv, priv->io[IO_ACX_INFO_MAILBOX_OFFS] + 0x2)); ++#endif ++ ++ priv->info_type = acx100_read_reg16(priv, priv->io[IO_ACX_SLV_MEM_DATA]); ++ priv->info_status = acx100_read_reg16(priv, priv->io[IO_ACX_SLV_MEM_DATA] + 0x2); ++ acxlog(L_CTL, "info_type 0x%04x, info_status 0x%04x\n", priv->info_type, priv->info_status); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_get_cmd_state ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++void acx100_get_cmd_state(wlandevice_t *priv) ++{ ++ UINT32 value; ++ ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_END_CTL], 0x0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_END_CTL] + 0x2, 0x0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_CTL], 0x0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_CTL] + 0x2, 0x1); /* why auto increment ?? */ ++ ++#if ACX_32BIT_IO ++ acx100_write_reg32(priv, priv->io[IO_ACX_SLV_MEM_ADDR], ++ acx100_read_reg32(priv, priv->io[IO_ACX_CMD_MAILBOX_OFFS])); ++ ++ value = acx100_read_reg32(priv, priv->io[IO_ACX_SLV_MEM_DATA]); ++ priv->cmd_type = (UINT16)value; ++ priv->cmd_status = (UINT16)(value >> 16); ++#else ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_ADDR], ++ acx100_read_reg16(priv, priv->io[IO_ACX_CMD_MAILBOX_OFFS])); ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_ADDR] + 0x2, ++ acx100_read_reg16(priv, priv->io[IO_ACX_CMD_MAILBOX_OFFS] + 0x2)); ++ ++ priv->cmd_type = acx100_read_reg16(priv, priv->io[IO_ACX_SLV_MEM_DATA]); ++ priv->cmd_status = acx100_read_reg16(priv, priv->io[IO_ACX_SLV_MEM_DATA] + 0x2); ++ acxlog(L_CTL, "cmd_type 0x%04x, cmd_status 0x%04x\n", priv->cmd_type, priv->cmd_status); ++#endif ++ ++} ++ ++/*---------------------------------------------------------------- ++* acx100_write_cmd_type ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++void acx100_write_cmd_type(wlandevice_t *priv, UINT16 vala) ++{ ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_END_CTL], 0x0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_END_CTL] + 0x2, 0x0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_CTL], 0x0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_CTL] + 0x2, 0x1); ++ ++#if ACX_32BIT_IO ++ acx100_write_reg32(priv, priv->io[IO_ACX_SLV_MEM_ADDR], ++ acx100_read_reg32(priv, priv->io[IO_ACX_CMD_MAILBOX_OFFS])); ++#else ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_ADDR], ++ acx100_read_reg16(priv, priv->io[IO_ACX_CMD_MAILBOX_OFFS])); ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_ADDR] + 0x2, ++ acx100_read_reg16(priv, priv->io[IO_ACX_CMD_MAILBOX_OFFS] + 0x2)); ++#endif ++ ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_DATA], vala); ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_DATA] + 0x2, 0x0); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_write_cmd_status ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++void acx100_write_cmd_status(wlandevice_t *priv, UINT vala) ++{ ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_END_CTL], 0x0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_END_CTL] + 0x2, 0x0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_CTL], 0x0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_CTL] + 0x2, 0x1); ++ ++#if ACX_32BIT_IO ++ acx100_write_reg32(priv, priv->io[IO_ACX_SLV_MEM_ADDR], ++ acx100_read_reg32(priv, priv->io[IO_ACX_CMD_MAILBOX_OFFS])); ++#else ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_ADDR], ++ acx100_read_reg16(priv, priv->io[IO_ACX_CMD_MAILBOX_OFFS])); ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_ADDR] + 0x2, ++ acx100_read_reg16(priv, priv->io[IO_ACX_CMD_MAILBOX_OFFS] + 0x2)); ++#endif ++ ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_DATA], 0x0); ++ acx100_write_reg16(priv, priv->io[IO_ACX_SLV_MEM_DATA] + 0x2, vala); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_write_cmd_param ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++static inline void acx100_write_cmd_param(wlandevice_t *priv, memmap_t *cmd, int len) ++{ ++ memcpy((UINT32 *) priv->CommandParameters, cmd, len); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_read_cmd_param ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++static inline void acx100_read_cmd_param(wlandevice_t *priv, memmap_t *cmd, int len) ++{ ++ memcpy(cmd, (UINT *) priv->CommandParameters, len); ++} ++ ++static const char * const cmd_error_strings[] = { ++ "Idle[TIMEOUT]", ++ "[SUCCESS]", ++ "Unknown Command", ++ "Invalid Information Element", ++ "unknown_FIXME", ++ "channel invalid in current regulatory domain", ++ "unknown_FIXME2", ++ "Command rejected (read-only information element)", ++ "Command rejected", ++ "Already asleep", ++ "Tx in progress", ++ "Already awake", ++ "Write only", ++ "Rx in progress", ++ "Invalid parameter", ++ "Scan in progress" ++}; ++ ++/*---------------------------------------------------------------- ++* acx100_issue_cmd ++* Excecutes a command in the command mailbox ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++int acx100_issue_cmd(wlandevice_t *priv, UINT cmd, ++ /*@null@*/ void *pcmdparam, int paramlen, UINT32 timeout) ++{ ++ int counter; ++ int result = 0; ++ UINT16 irqtype = 0; ++ UINT16 cmd_status; ++ ++ FN_ENTER; ++ acxlog(L_CTL, "%s cmd 0x%X timeout %ld.\n", __func__, cmd, timeout); ++ ++ if (!(priv->dev_state_mask & ACX_STATE_FW_LOADED)) ++ { ++ acxlog(L_CTL, "firmware not loaded yet, cannot execute command!!\n"); ++ goto done; ++ } ++ ++ if (cmd != ACX100_CMD_INTERROGATE) { ++ acxlog(L_DEBUG,"input pdr (len=%d):\n",paramlen); ++ acx100_dump_bytes(pcmdparam, paramlen); ++ } ++ ++ /*** make sure we have at least *some* timeout value ***/ ++ if (timeout == 0) { ++ timeout = 1; ++ } ++ ++ /*** wait for ACX100 to become idle for our command submission ***/ ++ for (counter = 2000; counter > 0; counter--) { ++ /* Auwtsh, busy-waiting! ++ * Hmm, yeah, but this function is probably supposed to be ++ * finished ASAP, so it's probably not such a terribly good ++ * idea to schedule away instead of busy-wait. ++ * Maybe let's just keep it as is. */ ++ acx100_get_cmd_state(priv); ++ /* Test for IDLE state */ ++ if (!priv->cmd_status) ++ break; ++ } ++ ++ /*** The card doesn't get IDLE, we're in trouble ***/ ++ if (counter == 0) { ++ /* uh oh, cmd status still set, now we're in trouble */ ++ acxlog((L_BINDEBUG | L_CTL), ++ "Trying to issue a command to the ACX100 but the Command Register is not IDLE (%xh)\n", priv->cmd_status); ++ goto done; ++ } ++ ++ /*** now write the parameters of the command if needed ***/ ++ if (pcmdparam != NULL && paramlen != 0) { ++ /* if it's an INTERROGATE command, just pass the length ++ * of parameters to read, as data */ ++ acx100_write_cmd_param(priv, pcmdparam, ++ (cmd == ACX100_CMD_INTERROGATE) ? 0x4 : paramlen); ++ } ++ ++ /*** now write the actual command type ***/ ++ priv->cmd_type = cmd; ++ acx100_write_cmd_type(priv, cmd); ++ ++ /*** execute command ***/ ++ acx100_write_reg16(priv, priv->io[IO_ACX_INT_TRIG], ++ acx100_read_reg16(priv, priv->io[IO_ACX_INT_TRIG]) | 0x01); ++ ++ /*** wait for IRQ to occur, then ACK it? ***/ ++ if (timeout > 120000) { ++ timeout = 120000; ++ } ++ timeout *= 20; ++ if (timeout) { ++ for (counter = timeout; counter > 0; counter--) { ++ /* it's a busy wait loop, but we're supposed to be ++ * fast here, so better don't schedule away here? ++ * In theory, yes, but the timeout can be HUGE, ++ * so better schedule away sometimes */ ++ if ((irqtype = ++ acx100_read_reg16(priv, priv->io[IO_ACX_IRQ_STATUS_NON_DES])) & 0x200) { ++ ++ acx100_write_reg16(priv, priv->io[IO_ACX_IRQ_ACK], 0x200); ++ break; ++ } ++ ++ if (counter % 30000 == 0) ++ { ++ acx100_schedule(HZ / 50); ++ } ++ } ++ } ++ ++ /*** Save state for debugging ***/ ++ acx100_get_cmd_state(priv); ++ cmd_status = priv->cmd_status; ++ ++ /*** Put the card in IDLE state ***/ ++ priv->cmd_status = 0; ++ acx100_write_cmd_status(priv, 0); ++ ++ if ((irqtype | 0xfdff) == 0xfdff) { ++ acxlog(L_CTL, ++ "Polling for an IRQ failed with %X, cmd_status %d. Bailing.\n", ++ irqtype, cmd_status); ++ goto done; ++ } ++ ++ if (1 != cmd_status) { ++ acxlog(L_STD | L_CTL, "%s failed: %s [%ld uSec] Cmd: %Xh, Result: %Xh\n", ++ __func__, ++ cmd_status <= 0x0f ? ++ cmd_error_strings[cmd_status] : "UNKNOWN REASON", ++ (timeout - counter) * 50, ++ cmd, ++ cmd_status); ++ } else { ++ /*** read in result parameters if needed ***/ ++ if (pcmdparam != NULL && paramlen != 0) { ++ if (cmd == ACX100_CMD_INTERROGATE) { ++ acx100_read_cmd_param(priv, pcmdparam, paramlen); ++ acxlog(L_DEBUG,"output pdr (len=%d):\n",paramlen); ++ acx100_dump_bytes(pcmdparam, paramlen); ++ } ++ } ++ result = 1; ++ } ++ ++done: ++ FN_EXIT(1, result); ++ return result; ++} ++ ++ ++/***************************************************************************** ++ * ++ * The Upper Layer ++ * ++ ****************************************************************************/ ++ ++static short CtlLength[0x14] = { ++ 0, ++ ACX100_RID_ACX_TIMER_LEN, ++ ACX100_RID_POWER_MGMT_LEN, ++ ACX100_RID_QUEUE_CONFIG_LEN, ++ ACX100_RID_BLOCK_SIZE_LEN, ++ ACX100_RID_MEMORY_CONFIG_OPTIONS_LEN, ++ ACX100_RID_RATE_FALLBACK_LEN, ++ ACX100_RID_WEP_OPTIONS_LEN, ++ ACX100_RID_MEMORY_MAP_LEN, // ACX100_RID_SSID_LEN, ++ 0, ++ ACX100_RID_ASSOC_ID_LEN, ++ 0, ++ 0, ++ ACX100_RID_FWREV_LEN, ++ ACX100_RID_FCS_ERROR_COUNT_LEN, ++ ACX100_RID_MEDIUM_USAGE_LEN, ++ ACX100_RID_RXCONFIG_LEN, ++ 0, ++ 0, ++ ACX100_RID_FIRMWARE_STATISTICS_LEN ++ }; ++ ++static short CtlLengthDot11[0x14] = { ++ 0, ++ ACX100_RID_DOT11_STATION_ID_LEN, ++ 0, ++ ACX100_RID_DOT11_BEACON_PERIOD_LEN, ++ ACX100_RID_DOT11_DTIM_PERIOD_LEN, ++ ACX100_RID_DOT11_SHORT_RETRY_LIMIT_LEN, ++ ACX100_RID_DOT11_LONG_RETRY_LIMIT_LEN, ++ ACX100_RID_DOT11_WEP_DEFAULT_KEY_LEN, //ACX100_RID_DOT11_WEP_KEY_LEN, ++ ACX100_RID_DOT11_MAX_XMIT_MSDU_LIFETIME_LEN, ++ 0, ++ ACX100_RID_DOT11_CURRENT_REG_DOMAIN_LEN, ++ ACX100_RID_DOT11_CURRENT_ANTENNA_LEN, ++ 0, ++ ACX100_RID_DOT11_TX_POWER_LEVEL_LEN, ++ ACX100_RID_DOT11_CURRENT_CCA_MODE_LEN, ++ ACX100_RID_DOT11_ED_THRESHOLD_LEN, ++ ACX100_RID_DOT11_WEP_DEFAULT_KEY_SET_LEN, ++ 0, ++ 0, ++ 0 ++}; ++ ++/*---------------------------------------------------------------- ++* acx100_configure ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++int acx100_configure(wlandevice_t *priv, void *pdr, short type) ++{ ++ ((memmap_t *)pdr)->type = cpu_to_le16(type); ++ if (type < 0x1000) { ++ ((memmap_t *)pdr)->length = cpu_to_le16(CtlLength[type]); ++ return acx100_issue_cmd(priv, ACX100_CMD_CONFIGURE, pdr, ++ CtlLength[type] + 4, 5000); ++ } else { ++ ((memmap_t *)pdr)->length = cpu_to_le16(CtlLengthDot11[type-0x1000]); ++ return acx100_issue_cmd(priv, ACX100_CMD_CONFIGURE, pdr, ++ CtlLengthDot11[type-0x1000] + 4, 5000); ++ } ++} ++ ++/*---------------------------------------------------------------- ++* acx100_configure_length ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++inline int acx100_configure_length(wlandevice_t *priv, void *pdr, short type, short length) ++{ ++ ((memmap_t *)pdr)->type = cpu_to_le16(type); ++ ((memmap_t *)pdr)->length = cpu_to_le16(length); ++ return acx100_issue_cmd(priv, ACX100_CMD_CONFIGURE, pdr, ++ length + 4, 5000); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_interrogate ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++int acx100_interrogate(wlandevice_t *priv, void *pdr, short type) ++{ ++ ((memmap_t *)pdr)->type = cpu_to_le16(type); ++ if (type < 0x1000) { ++ ((memmap_t *)pdr)->length = cpu_to_le16(CtlLength[type]); ++ return acx100_issue_cmd(priv, ACX100_CMD_INTERROGATE, pdr, ++ CtlLength[type] + 4, 5000); ++ } else { ++ ((memmap_t *)pdr)->length = cpu_to_le16(CtlLengthDot11[type-0x1000]); ++ return acx100_issue_cmd(priv, ACX100_CMD_INTERROGATE, pdr, ++ CtlLengthDot11[type-0x1000] + 4, 5000); ++ } ++} ++ ++ ++/***************************************************************************** ++ * ++ * MAC Address Stuff ++ * ++ ****************************************************************************/ ++ ++/*---------------------------------------------------------------- ++* acx100_is_mac_address_zero ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++inline int acx100_is_mac_address_zero(mac_t * mac) ++{ ++ if ((mac->vala == 0) && (mac->valb == 0)) { ++ return 1; ++ } ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_is_mac_address_equal ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++inline int acx100_is_mac_address_equal(UINT8 * one, UINT8 * two) ++{ ++ if (memcmp(one, two, ETH_ALEN)) ++ return 0; /* no match */ ++ else ++ return 1; /* matched */ ++} ++ ++/*---------------------------------------------------------------- ++* acx100_is_mac_address_group ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++inline UINT8 acx100_is_mac_address_group(mac_t * mac) ++{ ++ return mac->vala & 1; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_is_mac_address_directed ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++inline UINT8 acx100_is_mac_address_directed(mac_t *mac) ++{ ++ if (mac->vala & 1) { ++ return 0; ++ } ++ return 1; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_is_mac_address_broadcast ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++inline int acx100_is_mac_address_broadcast(const UINT8 * const address) ++{ ++ unsigned char bcast_addr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; ++ ++ if (memcmp(address, bcast_addr, ETH_ALEN) == 0) ++ return 1; ++ ++ /* IPv6 broadcast address */ ++ if ((address[0] == 0x33) && (address[1] == 0x33)) ++ return 1; ++ ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_is_mac_address_multicast ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++inline int acx100_is_mac_address_multicast(mac_t * mac) ++{ ++ if (mac->vala & 1) { ++ if ((mac->vala == 0xffffffff) && (mac->valb == 0xffff)) ++ return 0; ++ else ++ return 1; ++ } ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_log_mac_address ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++void acx100_log_mac_address(int level, UINT8 * mac) ++{ ++ acxlog(level, "%02X.%02X.%02X.%02X.%02X.%02X", ++ mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_power_led ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++void acx100_power_led(wlandevice_t *priv, UINT8 enable) ++{ ++ if (enable) ++ acx100_write_reg16(priv, priv->io[IO_ACX_GPIO_OE], ++ acx100_read_reg16(priv, priv->io[IO_ACX_GPIO_OE]) & ~0x0800); ++ else ++ acx100_write_reg16(priv, priv->io[IO_ACX_GPIO_OE], ++ acx100_read_reg16(priv, priv->io[IO_ACX_GPIO_OE]) | 0x0800); ++} ++ ++ ++void acx100_dump_bytes(void *data,int num) { ++ int i,remain=num; ++ unsigned char *ptr=(unsigned char *)data; ++ ++ if (!(debug & L_DEBUG)) ++ return; ++ ++ while (remain>0) { ++ if (remain<16) { ++ printk(KERN_WARNING); ++ for (i=0;i ++#define WLAN_DBVAR prism2_debug ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include ++ ++ ++/*================================================================*/ ++/* Project Includes */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++ ++/* try to make it compile for both 2.4.x and 2.6.x kernels */ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 0) ++ ++static inline int submit_urb(struct urb *urb, int mem_flags) { ++ return usb_submit_urb(urb, mem_flags); ++} ++ ++#else ++ ++/* 2.4.x kernels */ ++#define USB_24 1 ++ ++static inline int submit_urb(struct urb *urb, int mem_flags) { ++ return usb_submit_urb(urb); ++} ++ ++#endif ++ ++#define FILL_SETUP_PACKET(_pack,_rtype,_req,_val,_ind,_len) \ ++ (_pack)[0]=_rtype; \ ++ (_pack)[1]=_req; \ ++ ((unsigned short *)(_pack))[1]=_val; \ ++ ((unsigned short *)(_pack))[2]=_ind; \ ++ ((unsigned short *)(_pack))[3]=_len; ++ ++#if USB_24 ++static void acx100usb_control_complete(struct urb *); ++#else ++static void acx100usb_control_complete(struct urb *, struct pt_regs *); ++#endif ++ ++int acx100_issue_cmd(wlandevice_t *hw,UINT cmd,void *pdr,int paramlen,UINT32 timeout) { ++ UINT16 len,*buf; ++ int i,result,skipridheader,blocklen,inpipe,outpipe,flags,acklen=sizeof(hw->usbin); ++ int ucode; ++ struct usb_device *usbdev; ++ FN_ENTER; ++ skipridheader=0; ++ /* ---------------------------------------------------- ++ ** get context from wlandevice ++ ** ------------------------------------------------- */ ++ usbdev=hw->usbdev; ++ /* ---------------------------------------------------- ++ ** check which kind of command was issued... ++ ** ------------------------------------------------- */ ++ if (cmd==ACX100_CMD_INTERROGATE) { ++ hw->usbout.rridreq.cmd=cmd; ++ hw->usbout.rridreq.status=0; ++ hw->usbout.rridreq.rid=((memmap_t *)pdr)->type; ++ hw->usbout.rridreq.frmlen=paramlen; ++ blocklen=8; ++ switch (hw->usbout.rridreq.rid) { ++ case ACX100_RID_SCAN_STATUS:skipridheader=1;break; ++ } ++ if (skipridheader) acklen=paramlen+4; ++ else acklen=paramlen+8; ++ acxlog(L_XFER,"sending interrogate: cmd=%d status=%d rid=%d frmlen=%d\n",hw->usbout.rridreq.cmd,hw->usbout.rridreq.status,hw->usbout.rridreq.rid,hw->usbout.rridreq.frmlen); ++ } else if (cmd==ACX100_CMD_CONFIGURE) { ++ hw->usbout.wridreq.cmd=cmd; ++ hw->usbout.wridreq.status=0; ++ hw->usbout.wridreq.rid=((memmap_t *)pdr)->type; ++ hw->usbout.wridreq.frmlen=paramlen; ++ memcpy(hw->usbout.wridreq.data,&(((memmap_t *)pdr)->m),paramlen); ++ blocklen=8+paramlen; ++ } else if ((cmd==ACX100_CMD_ENABLE_RX)||(cmd==ACX100_CMD_ENABLE_TX)) { ++ hw->usbout.rxtx.cmd=cmd; ++ hw->usbout.rxtx.status=0; ++ hw->usbout.rxtx.data=1; /* just for testing */ ++ blocklen=5; ++ } else { ++ /* ---------------------------------------------------- ++ ** All other commands (not thoroughly tested) ++ ** ------------------------------------------------- */ ++ hw->usbout.wmemreq.cmd=cmd; ++ hw->usbout.wmemreq.status=0; ++ if ((pdr)&&(paramlen>0)) memcpy(hw->usbout.wmemreq.data,pdr,paramlen); ++ blocklen=4+paramlen; ++ } ++ /* ---------------------------------------------------- ++ ** Obtain the I/O pipes ++ ** ------------------------------------------------- */ ++ outpipe=usb_sndctrlpipe(usbdev,0); /* default endpoint for ctrl-transfers: 0 */ ++ inpipe =usb_rcvctrlpipe(usbdev,0); /* default endpoint for ctrl-transfers: 0 */ ++#ifdef ACX_DEBUG ++ acxlog(L_XFER,"sending USB control msg (out) (blocklen=%d)\n",blocklen); ++ if (debug&L_DATA) acx100usb_dump_bytes(&(hw->usbout),blocklen); ++#endif ++ /* -------------------------------------- ++ ** fill setup packet and control urb ++ ** ----------------------------------- */ ++ FILL_SETUP_PACKET(hw->usb_setup,USB_TYPE_VENDOR|USB_DIR_OUT,ACX100_USB_UNKNOWN_REQ1,0,0,blocklen) ++ usb_fill_control_urb(hw->ctrl_urb,usbdev,outpipe,hw->usb_setup,&(hw->usbout),blocklen,acx100usb_control_complete,hw); ++ hw->ctrl_urb->timeout=timeout; ++ ucode=submit_urb(hw->ctrl_urb, GFP_KERNEL); ++ if (ucode!=0) { ++ acxlog(L_STD,"ctrl message failed with errcode %d\n",ucode); ++ return(0); ++ } ++ /* --------------------------------- ++ ** wait for request to complete... ++ ** ------------------------------ */ ++ while (hw->ctrl_urb->status==-EINPROGRESS) { ++ udelay(500); ++ } ++ /* --------------------------------- ++ ** check the result ++ ** ------------------------------ */ ++ result=hw->ctrl_urb->actual_length; ++ acxlog(L_XFER,"wrote=%d bytes (status=%d)\n",result,hw->ctrl_urb->status); ++ if (result<0) { ++ return(0); ++ } ++ /* -------------------------------------- ++ ** Check for device acknowledge ... ++ ** -------------------------------------- */ ++ acxlog(L_XFER,"sending USB control msg (in) (acklen=%d)\n",acklen); ++ hw->usbin.rridresp.status=0; /* delete old status flag -> set to fail */ ++ FILL_SETUP_PACKET(hw->usb_setup,USB_TYPE_VENDOR|USB_DIR_IN,ACX100_USB_UNKNOWN_REQ1,0,0,acklen) ++ usb_fill_control_urb(hw->ctrl_urb,usbdev,inpipe,hw->usb_setup,&(hw->usbin),acklen,acx100usb_control_complete,hw); ++ hw->ctrl_urb->timeout=timeout; ++ ucode=submit_urb(hw->ctrl_urb, GFP_KERNEL); ++ if (ucode!=0) { ++ acxlog(L_STD,"ctrl message failed with errcode %d\n",ucode); ++ return(0); ++ } ++ /* --------------------------------- ++ ** wait for request to complete... ++ ** ------------------------------ */ ++ while (hw->ctrl_urb->status==-EINPROGRESS) { ++ udelay(500); ++ } ++ /* --------------------------------- ++ ** check the result ++ ** ------------------------------ */ ++ result=hw->ctrl_urb->actual_length; ++ acxlog(L_XFER,"read=%d bytes\n",result); ++ if (result<0) { ++ FN_EXIT(0,result); ++ return(0); ++ } ++ acxlog(L_XFER,"status=%d\n",hw->usbin.rridresp.status); ++ if (cmd==ACX100_CMD_INTERROGATE) { ++ if ((pdr)&&(paramlen>0)) { ++ if (skipridheader) { ++ memcpy(pdr,&(hw->usbin.rmemresp.data),paramlen); ++ acxlog(L_XFER,"response frame: cmd=%d status=%d\n",hw->usbin.rmemresp.cmd,hw->usbin.rmemresp.status); ++ acxlog(L_DATA,"incoming bytes (%d):\n",paramlen); ++ if (debug&L_DATA) acx100usb_dump_bytes(pdr,paramlen); ++ } ++ else { ++ memcpy(pdr,&(hw->usbin.rridresp.rid),paramlen+4); ++ acxlog(L_XFER,"response frame: cmd=%d status=%d rid=%d frmlen=%d\n",hw->usbin.rridresp.cmd,hw->usbin.rridresp.status,hw->usbin.rridresp.rid,hw->usbin.rridresp.frmlen); ++ acxlog(L_DATA,"incoming bytes (%d):\n",paramlen+4); ++ if (debug&L_DATA) acx100usb_dump_bytes(pdr,paramlen+4); ++ } ++ } ++ } ++ FN_EXIT(0,1); ++ return(1); ++} ++ ++#if USB_24 ++static void acx100usb_control_complete(struct urb *urb) ++#else ++static void acx100usb_control_complete(struct urb *urb, struct pt_regs *regs) ++#endif ++{ ++ wlandevice_t *priv=urb->context; ++ FN_ENTER; ++ FN_EXIT(0,0); ++} ++ ++/***************************************************************************** ++ * ++ * The Upper Layer ++ * ++ ****************************************************************************/ ++ ++static short CtlLength[0x14] = { ++ 0, ++ ACX100_RID_ACX_TIMER_LEN, ++ ACX100_RID_POWER_MGMT_LEN, ++ ACX100_RID_QUEUE_CONFIG_LEN, ++ ACX100_RID_BLOCK_SIZE_LEN, ++ ACX100_RID_MEMORY_CONFIG_OPTIONS_LEN, ++ ACX100_RID_RATE_FALLBACK_LEN, ++ ACX100_RID_WEP_OPTIONS_LEN, ++ ACX100_RID_MEMORY_MAP_LEN, // ACX100_RID_SSID_LEN, ++ ACX100_RID_SCAN_STATUS_LEN, ++ ACX100_RID_ASSOC_ID_LEN, ++ 0, ++ 0, ++ ACX100_RID_FWREV_LEN, ++ ACX100_RID_FCS_ERROR_COUNT_LEN, ++ ACX100_RID_MEDIUM_USAGE_LEN, ++ ACX100_RID_RXCONFIG_LEN, ++ 0, ++ 0, ++ ACX100_RID_FIRMWARE_STATISTICS_LEN ++}; ++ ++ ++static short CtlLengthDot11[0x14] = { ++ 0, ++ ACX100_RID_DOT11_STATION_ID_LEN, ++ 0, ++ ACX100_RID_DOT11_BEACON_PERIOD_LEN, ++ ACX100_RID_DOT11_DTIM_PERIOD_LEN, ++ ACX100_RID_DOT11_SHORT_RETRY_LIMIT_LEN, ++ ACX100_RID_DOT11_LONG_RETRY_LIMIT_LEN, ++ ACX100_RID_DOT11_WEP_DEFAULT_KEY_LEN, //ACX100_RID_DOT11_WEP_KEY_LEN, ++ ACX100_RID_DOT11_MAX_XMIT_MSDU_LIFETIME_LEN, ++ 0, ++ ACX100_RID_DOT11_CURRENT_REG_DOMAIN_LEN, ++ ACX100_RID_DOT11_CURRENT_ANTENNA_LEN, ++ 0, ++ ACX100_RID_DOT11_TX_POWER_LEVEL_LEN, ++ ACX100_RID_DOT11_CURRENT_CCA_MODE_LEN, ++ ACX100_RID_DOT11_ED_THRESHOLD_LEN, ++ ACX100_RID_DOT11_WEP_DEFAULT_KEY_SET_LEN, ++ 0, ++ 0, ++ 0 ++}; ++ ++ ++ ++ ++/*---------------------------------------------------------------- ++** acx100_configure(): ++** ++** Inputs: ++** priv -> Pointer to wlandevice structure ++** pdr -> Field for parameter data ++** type -> Type of request (Request-ID) ++** --------------------------------------------------------------- ++** Returns: ++** (int) Success indicator (1 on success, 0 on failure) ++** ++** Description: ++*----------------------------------------------------------------*/ ++ ++int acx100_configure(wlandevice_t *priv, void *pdr, short type) ++{ ++ UINT16 len; ++ /* ---------------------------------------------------- ++ ** check if ACX100 control command or if 802.11 command ++ ** ------------------------------------------------- */ ++ if (type<0x1000) len=CtlLength[type]; ++ else len=CtlLengthDot11[type-0x1000]; ++ if (len==0) { ++ acxlog(L_STD,"WARNING: ENCOUNTERED ZEROLENGTH RID (%x)\n",type); ++ } ++ acxlog(L_XFER,"configuring: type(rid)=0x%X len=%d\n",type,len); ++ ((memmap_t *)pdr)->type = cpu_to_le16(type); ++ return(acx100_issue_cmd(priv,ACX100_CMD_CONFIGURE,pdr,len,5000)); ++} ++ ++ ++ ++/*---------------------------------------------------------------- ++** acx100_configure_length(): ++** ++** Inputs: ++** priv -> Pointer to wlandevice structure ++** pdr -> Field for parameter data ++** type -> Type of request (Request-ID) ++** --------------------------------------------------------------- ++** Returns: ++** (int) Success indicator (0 on failure, 1 on success) ++** ++** Description: ++** ----------------------------------------------------------------*/ ++ ++int acx100_configure_length(wlandevice_t *priv, void *pdr,short type,short len) { ++ acxlog(L_XFER,"configuring: type(rid)=0x%X len=%d\n",type,len); ++ ((memmap_t *)pdr)->type = cpu_to_le16(type); ++ return(acx100_issue_cmd(priv,ACX100_CMD_CONFIGURE,pdr,len,5000)); ++} ++ ++ ++ ++/*---------------------------------------------------------------- ++** acx100_interrogate(): ++** Inputs: ++** priv -> Pointer to wlandevice structure ++** pdr -> Field for parameter data ++** type -> Type of request (Request-ID) ++** --------------------------------------------------------------- ++** Returns: ++** (int) Errorcode (0 if OK) ++** ++** Description: ++**--------------------------------------------------------------*/ ++ ++int acx100_interrogate(wlandevice_t *priv, void *pdr, short type) ++{ ++ UINT16 len; ++ /* ---------------------------------------------------- ++ ** check if ACX100 control command or if 802.11 command ++ ** ------------------------------------------------- */ ++ if (type<0x1000) len=CtlLength[type]; ++ else len=CtlLengthDot11[type-0x1000]; ++ if (len==0) { ++ acxlog(L_STD,"WARNING: ENCOUNTERED ZEROLENGTH RID (%x)\n",type); ++ } ++ acxlog(L_XFER,"interrogating: type(rid)=0x%X len=%d pdr=%p\n",type,len,pdr); ++ ((memmap_t *)pdr)->type = cpu_to_le16(type); ++ return(acx100_issue_cmd(priv,ACX100_CMD_INTERROGATE,pdr,len,5000)); ++} ++ ++ ++ ++/***************************************************************************** ++ * ++ * MAC Address Stuff ++ * ++ ****************************************************************************/ ++ ++/*---------------------------------------------------------------- ++* acx100_is_mac_address_zero ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++inline int acx100_is_mac_address_zero(mac_t *mac) ++{ ++ if ((mac->vala == 0) && (mac->valb == 0)) { ++ return(1); ++ } ++ return 0; ++} ++ ++ ++/*---------------------------------------------------------------- ++* acx100_is_mac_address_equal ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++inline int acx100_is_mac_address_equal(UINT8 *one, UINT8 *two) ++{ ++ if (memcmp(one, two, WLAN_ADDR_LEN)) ++ return 0; /* no match */ ++ else ++ return 1; /* matched */ ++} ++ ++ ++/*---------------------------------------------------------------- ++* acx100_is_mac_address_group ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++inline UINT8 acx100_is_mac_address_group(mac_t *mac) ++{ ++ return mac->vala & 1; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_is_mac_address_directed ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++UINT8 acx100_is_mac_address_directed(mac_t *mac) ++{ ++ if (mac->vala & 1) { ++ return 0; ++ } ++ return 1; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_is_mac_address_broadcast ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++static const unsigned char bcast[ETH_ALEN] ={ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; ++inline int acx100_is_mac_address_broadcast(const UINT8 * const address) ++{ ++ return !memcmp(address, bcast, ETH_ALEN); ++} ++ ++/*---------------------------------------------------------------- ++* acx100_is_mac_address_multicast ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: FINISHED ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++inline int acx100_is_mac_address_multicast(mac_t *mac) ++{ ++ if (mac->vala & 1) { ++ if ((mac->vala == 0xffffffff) && (mac->valb == 0xffff)) ++ return 0; ++ else ++ return 1; ++ } ++ return 0; ++} ++ ++/*---------------------------------------------------------------- ++* acx100_log_mac_address ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++ ++void acx100_log_mac_address(int level, UINT8 * mac) { ++ acxlog(level, "%02X.%02X.%02X.%02X.%02X.%02X", ++ mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); ++} ++ ++ ++/*---------------------------------------------------------------- ++* acx100_power_led ++* ++* ++* Arguments: ++* ++* Returns: ++* ++* Side effects: ++* ++* Call context: ++* ++* STATUS: NEW ++* ++* Comment: ++* ++*----------------------------------------------------------------*/ ++void acx100_power_led(wlandevice_t *priv, UINT8 enable) { ++ /* ++ if (enable) ++ acx100_write_reg16(priv, 0x290, acx100_read_reg16(priv, 0x290) & ~0x0800); ++ else ++ acx100_write_reg16(priv, 0x290, acx100_read_reg16(priv, 0x290) | 0x0800); ++ */ ++} ++ ++#endif +diff -urN x/drivers/net/wireless/acx/ioregister.c y/drivers/net/wireless/acx/ioregister.c +--- x/drivers/net/wireless/acx/ioregister.c 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/acx/ioregister.c 2004-04-14 02:14:24.000000000 +1000 +@@ -0,0 +1,173 @@ ++/* src/ioregisters.c ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Copyright (C) 2003 ACX100 Open Source Project ++ * ++ * The contents of this file are subject to the Mozilla Public ++ * License Version 1.1 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS ++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or ++ * implied. See the License for the specific language governing ++ * rights and limitations under the License. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU Public License version 2 (the "GPL"), in which ++ * case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use ++ * your version of this file under the MPL, indicate your decision ++ * by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL. If you do not delete ++ * the provisions above, a recipient may use your version of this ++ * file under either the MPL or the GPL. ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Inquiries regarding the ACX100 Open Source Project can be ++ * made directly to: ++ * ++ * acx100-users@lists.sf.net ++ * http://acx100.sf.net ++ * ++ * -------------------------------------------------------------------- ++ */ ++ ++ ++/*================================================================*/ ++/* System Includes */ ++#include ++#include ++ ++#include ++#include ++ ++/*================================================================*/ ++/* Project Includes */ ++ ++#include ++#include ++#include ++ ++/* static vars */ ++static UINT16 *pIO_ACX100 = NULL; ++static UINT16 *pIO_ACX111 = NULL; ++ ++UINT16* acx100_get_io_register_array() ++{ ++ if(pIO_ACX100 != NULL) return pIO_ACX100; ++ ++ pIO_ACX100 = kmalloc(IO_INDICES_SIZE, GFP_KERNEL); ++ if(pIO_ACX100 == NULL) { ++ /* alloc failure */ ++ return NULL; ++ } ++ ++ memset(pIO_ACX100, 0xff, IO_INDICES_SIZE); ++ ++ pIO_ACX100[IO_ACX_SOFT_RESET] = (0x0000); ++ ++ pIO_ACX100[IO_ACX_SLV_MEM_ADDR] = (0x0014); ++ pIO_ACX100[IO_ACX_SLV_MEM_DATA] = (0x0018); ++ pIO_ACX100[IO_ACX_SLV_MEM_CTL] = (0x001c); ++ pIO_ACX100[IO_ACX_SLV_END_CTL] = (0x0020); ++ ++ pIO_ACX100[IO_ACX_FEMR] = (0x0034); ++ ++ pIO_ACX100[IO_ACX_INT_TRIG] = (0x007c); ++ pIO_ACX100[IO_ACX_IRQ_MASK] = (0x0098); ++ pIO_ACX100[IO_ACX_IRQ_STATUS_NON_DES] = (0x00a4); ++ pIO_ACX100[IO_ACX_IRQ_STATUS_CLEAR] = (0x00a8); ++ pIO_ACX100[IO_ACX_IRQ_ACK] = (0x00ac); ++ pIO_ACX100[IO_ACX_HINT_TRIG] = (0x00b0); ++ ++ pIO_ACX100[IO_ACX_ENABLE] = (0x0104); ++ ++ pIO_ACX100[IO_ACX_EEPROM_CTL] = (0x0250); ++ pIO_ACX100[IO_ACX_EEPROM_ADDR] = (0x0254); ++ pIO_ACX100[IO_ACX_EEPROM_DATA] = (0x0258); ++ pIO_ACX100[IO_ACX_EEPROM_CFG] = (0x025c); ++ ++ pIO_ACX100[IO_ACX_PHY_ADDR] = (0x0268); ++ pIO_ACX100[IO_ACX_PHY_DATA] = (0x026c); ++ pIO_ACX100[IO_ACX_PHY_CTL] = (0x0270); ++ ++ pIO_ACX100[IO_ACX_GPIO_OE] = (0x0290); ++ ++ pIO_ACX100[IO_ACX_CMD_MAILBOX_OFFS] = (0x02a4); ++ pIO_ACX100[IO_ACX_INFO_MAILBOX_OFFS] = (0x02a8); ++ pIO_ACX100[IO_ACX_EEPROM_INFORMATION] = (0x02ac); ++ ++ pIO_ACX100[IO_ACX_EE_START] = (0x02d0); ++ pIO_ACX100[IO_ACX_SOR_CFG] = (0x02d4); ++ pIO_ACX100[IO_ACX_ECPU_CTRL] = (0x02d8); ++ ++ return pIO_ACX100; ++} ++ ++UINT16* acx111_get_io_register_array() ++{ ++ if(pIO_ACX111 != NULL) return pIO_ACX111; ++ ++ pIO_ACX111 = kmalloc(IO_INDICES_SIZE, GFP_KERNEL); ++ if(pIO_ACX111 == NULL) { ++ /* alloc failure */ ++ return NULL; ++ } ++ ++ memset(pIO_ACX111, 0xff, IO_INDICES_SIZE); ++ ++ pIO_ACX111[IO_ACX_SOFT_RESET] = (0x0000); ++ ++ pIO_ACX111[IO_ACX_SLV_MEM_ADDR] = (0x0014); ++ pIO_ACX111[IO_ACX_SLV_MEM_DATA] = (0x0018); ++ pIO_ACX111[IO_ACX_SLV_MEM_CTL] = (0x001c); ++ pIO_ACX111[IO_ACX_SLV_END_CTL] = (0x0020); ++ ++ pIO_ACX111[IO_ACX_FEMR] = (0x0034); ++ ++ pIO_ACX111[IO_ACX_INT_TRIG] = (0x00b4); ++ pIO_ACX111[IO_ACX_IRQ_MASK] = (0x00d4); ++ pIO_ACX111[IO_ACX_IRQ_STATUS_NON_DES] = (0x00e0); ++ pIO_ACX111[IO_ACX_IRQ_ACK] = (0x00e8); ++ pIO_ACX111[IO_ACX_HINT_TRIG] = (0x00ec); ++ pIO_ACX111[IO_ACX_IRQ_STATUS_CLEAR] = (0x00f4); ++ ++ pIO_ACX111[IO_ACX_EE_START] = (0x0100); ++ pIO_ACX111[IO_ACX_SOR_CFG] = (0x0104); ++ pIO_ACX111[IO_ACX_ECPU_CTRL] = (0x0108); ++ ++ pIO_ACX111[IO_ACX_ENABLE] = (0x01d0); ++ ++ pIO_ACX111[IO_ACX_EEPROM_CTL] = (0x0338); ++ pIO_ACX111[IO_ACX_EEPROM_ADDR] = (0x033c); ++ pIO_ACX111[IO_ACX_EEPROM_DATA] = (0x0340); ++ pIO_ACX111[IO_ACX_EEPROM_CFG] = (0x0344); ++ ++ pIO_ACX111[IO_ACX_PHY_ADDR] = (0x0350); ++ pIO_ACX111[IO_ACX_PHY_DATA] = (0x0354); ++ pIO_ACX111[IO_ACX_PHY_CTL] = (0x0358); ++ ++ pIO_ACX111[IO_ACX_GPIO_OE] = (0x0374); ++ ++ pIO_ACX111[IO_ACX_CMD_MAILBOX_OFFS] = (0x0388); ++ pIO_ACX111[IO_ACX_INFO_MAILBOX_OFFS] = (0x038c); ++ pIO_ACX111[IO_ACX_EEPROM_INFORMATION] = (0x0390); ++ ++ return pIO_ACX111; ++} ++ ++void acx_free_io_register_arrays(void) ++{ ++ if (pIO_ACX100) { ++ kfree(pIO_ACX100); ++ pIO_ACX100 = NULL; ++ } ++ if (pIO_ACX111) { ++ kfree(pIO_ACX111); ++ pIO_ACX111 = NULL; ++ } ++} +diff -urN x/drivers/net/wireless/acx/ioregister.h y/drivers/net/wireless/acx/ioregister.h +--- x/drivers/net/wireless/acx/ioregister.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/acx/ioregister.h 2004-04-14 02:14:16.000000000 +1000 +@@ -0,0 +1,54 @@ ++/* include/ioregisters.h ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Copyright (C) 2003 ACX100 Open Source Project ++ * ++ * The contents of this file are subject to the Mozilla Public ++ * License Version 1.1 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS ++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or ++ * implied. See the License for the specific language governing ++ * rights and limitations under the License. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU Public License version 2 (the "GPL"), in which ++ * case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use ++ * your version of this file under the MPL, indicate your decision ++ * by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL. If you do not delete ++ * the provisions above, a recipient may use your version of this ++ * file under either the MPL or the GPL. ++ * ++ * -------------------------------------------------------------------- ++ * ++ * This code is based on elements which are ++ * Copyright (C) 1999 AbsoluteValue Systems, Inc. All Rights Reserved. ++ * info@linux-wlan.com ++ * http://www.linux-wlan.com ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Inquiries regarding the ACX100 Open Source Project can be ++ * made directly to: ++ * ++ * acx100-users@lists.sf.net ++ * http://acx100.sf.net ++ * ++ * -------------------------------------------------------------------- ++ */ ++ ++#ifndef _IOREGISTERS_H ++#define _IOREGISTERS_H ++ ++/* functions */ ++UINT16* acx100_get_io_register_array(void); ++UINT16* acx111_get_io_register_array(void); ++void acx_free_io_register_arrays(void); ++ ++#endif /* _IOREGISTERS_H */ +diff -urN x/drivers/net/wireless/acx/monitor.h y/drivers/net/wireless/acx/monitor.h +--- x/drivers/net/wireless/acx/monitor.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/acx/monitor.h 2004-01-28 05:35:31.000000000 +1100 +@@ -0,0 +1,68 @@ ++#ifndef __MONITOR_H ++#define __MONITOR_H ++ ++/* required structs for prism header emulation (monitor mode) */ ++#define WLAN_DEVNAMELEN_MAX 16 ++ ++#define DIDmsg_lnxind_wlansniffrm 0x0041 ++#define DIDmsg_lnxind_wlansniffrm_hosttime 0x1041 ++#define DIDmsg_lnxind_wlansniffrm_mactime 0x2041 ++#define DIDmsg_lnxind_wlansniffrm_channel 0x3041 ++#define DIDmsg_lnxind_wlansniffrm_rssi 0x4041 ++#define DIDmsg_lnxind_wlansniffrm_sq 0x5041 ++#define DIDmsg_lnxind_wlansniffrm_signal 0x6041 ++#define DIDmsg_lnxind_wlansniffrm_noise 0x7041 ++#define DIDmsg_lnxind_wlansniffrm_rate 0x8041 ++#define DIDmsg_lnxind_wlansniffrm_istx 0x9041 ++#define DIDmsg_lnxind_wlansniffrm_frmlen 0xA041 ++ ++typedef struct p80211msg_lnxind_wlansniffrm { ++ uint32_t msgcode; ++ uint32_t msglen; ++ uint8_t devname[WLAN_DEVNAMELEN_MAX]; ++ p80211item_uint32_t hosttime; ++ p80211item_uint32_t mactime; ++ p80211item_uint32_t channel; ++ p80211item_uint32_t rssi; ++ p80211item_uint32_t sq; ++ p80211item_uint32_t signal; ++ p80211item_uint32_t noise; ++ p80211item_uint32_t rate; ++ p80211item_uint32_t istx; ++ p80211item_uint32_t frmlen; ++} __attribute__ ((packed)) p80211msg_lnxind_wlansniffrm_t; ++ ++#define P80211ENUM_truth_false 0 ++#define P80211ENUM_truth_true 1 ++ ++#define P80211ENUM_resultcode_success 1 ++#define P80211ENUM_resultcode_invalid_parameters 2 ++#define P80211ENUM_resultcode_not_supported 3 ++#define P80211ENUM_resultcode_timeout 4 ++#define P80211ENUM_resultcode_too_many_req 5 ++#define P80211ENUM_resultcode_refused 6 ++#define P80211ENUM_resultcode_bss_already 7 ++#define P80211ENUM_resultcode_invalid_access 8 ++#define P80211ENUM_resultcode_invalid_mibattribute 9 ++#define P80211ENUM_resultcode_cant_set_readonly_mib 10 ++#define P80211ENUM_resultcode_implementation_failure 11 ++#define P80211ENUM_resultcode_cant_get_writeonly_mib 12 ++ ++#define P80211ENUM_msgitem_status_data_ok 0 ++#define P80211ENUM_msgitem_status_no_value 1 ++#define P80211ENUM_msgitem_status_invalid_itemname 2 ++#define P80211ENUM_msgitem_status_invalid_itemdata 3 ++#define P80211ENUM_msgitem_status_missing_itemdata 4 ++#define P80211ENUM_msgitem_status_incomplete_itemdata 5 ++#define P80211ENUM_msgitem_status_invalid_msg_did 6 ++#define P80211ENUM_msgitem_status_invalid_mib_did 7 ++#define P80211ENUM_msgitem_status_missing_conv_func 8 ++#define P80211ENUM_msgitem_status_string_too_long 9 ++#define P80211ENUM_msgitem_status_data_out_of_range 10 ++#define P80211ENUM_msgitem_status_string_too_short 11 ++#define P80211ENUM_msgitem_status_missing_valid_func 12 ++#define P80211ENUM_msgitem_status_unknown 13 ++#define P80211ENUM_msgitem_status_invalid_did 14 ++#define P80211ENUM_msgitem_status_missing_print_func 15 ++ ++#endif /* __MONITOR_H */ +diff -urN x/drivers/net/wireless/acx/p80211hdr.h y/drivers/net/wireless/acx/p80211hdr.h +--- x/drivers/net/wireless/acx/p80211hdr.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/acx/p80211hdr.h 2003-07-03 06:55:54.000000000 +1000 +@@ -0,0 +1,239 @@ ++/* include/p80211hdr.h ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Copyright (C) 2003 ACX100 Open Source Project ++ * ++ * The contents of this file are subject to the Mozilla Public ++ * License Version 1.1 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS ++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or ++ * implied. See the License for the specific language governing ++ * rights and limitations under the License. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU Public License version 2 (the "GPL"), in which ++ * case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use ++ * your version of this file under the MPL, indicate your decision ++ * by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL. If you do not delete ++ * the provisions above, a recipient may use your version of this ++ * file under either the MPL or the GPL. ++ * ++ * -------------------------------------------------------------------- ++ * ++ * This code is based on elements which are ++ * Copyright (C) 1999 AbsoluteValue Systems, Inc. All Rights Reserved. ++ * info@linux-wlan.com ++ * http://www.linux-wlan.com ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Inquiries regarding the ACX100 Open Source Project can be ++ * made directly to: ++ * ++ * acx100-users@lists.sf.net ++ * http://acx100.sf.net ++ * ++ * -------------------------------------------------------------------- ++ */ ++ ++#ifndef _P80211HDR_H ++#define _P80211HDR_H ++ ++/*================================================================*/ ++/* System Includes */ ++ ++/*================================================================*/ ++/* Project Includes */ ++ ++#ifndef _WLAN_COMPAT_H ++#include ++#endif ++ ++ ++/*================================================================*/ ++/* Constants */ ++ ++/*--- Sizes -----------------------------------------------*/ ++#define WLAN_ADDR_LEN 6 ++#define WLAN_CRC_LEN 4 ++#define WLAN_BSSID_LEN 6 ++#define WLAN_BSS_TS_LEN 8 ++#define WLAN_HDR_A3_LEN 24 ++#define WLAN_HDR_A4_LEN 30 ++#define WLAN_SSID_MAXLEN 32 ++#define WLAN_DATA_MAXLEN 2312 ++#define WLAN_A3FR_MAXLEN (WLAN_HDR_A3_LEN + WLAN_DATA_MAXLEN + WLAN_CRC_LEN) ++#define WLAN_A4FR_MAXLEN (WLAN_HDR_A4_LEN + WLAN_DATA_MAXLEN + WLAN_CRC_LEN) ++#define WLAN_BEACON_FR_MAXLEN (WLAN_HDR_A3_LEN + 334) ++#define WLAN_ATIM_FR_MAXLEN (WLAN_HDR_A3_LEN + 0) ++#define WLAN_DISASSOC_FR_MAXLEN (WLAN_HDR_A3_LEN + 2) ++#define WLAN_ASSOCREQ_FR_MAXLEN (WLAN_HDR_A3_LEN + 48) ++#define WLAN_ASSOCRESP_FR_MAXLEN (WLAN_HDR_A3_LEN + 16) ++#define WLAN_REASSOCREQ_FR_MAXLEN (WLAN_HDR_A3_LEN + 54) ++#define WLAN_REASSOCRESP_FR_MAXLEN (WLAN_HDR_A3_LEN + 16) ++#define WLAN_PROBEREQ_FR_MAXLEN (WLAN_HDR_A3_LEN + 44) ++#define WLAN_PROBERESP_FR_MAXLEN (WLAN_HDR_A3_LEN + 78) ++#define WLAN_AUTHEN_FR_MAXLEN (WLAN_HDR_A3_LEN + 261) ++#define WLAN_DEAUTHEN_FR_MAXLEN (WLAN_HDR_A3_LEN + 2) ++#define WLAN_WEP_NKEYS 4 ++#define WLAN_WEP_MAXKEYLEN 13 ++#define WLAN_CHALLENGE_IE_LEN 130 ++#define WLAN_CHALLENGE_LEN 128 ++#define WLAN_WEP_IV_LEN 4 ++#define WLAN_WEP_ICV_LEN 4 ++ ++/*--- Frame Control Field -------------------------------------*/ ++/* Frame Types */ ++#define WLAN_FTYPE_MGMT 0x00 ++#define WLAN_FTYPE_CTL 0x01 ++#define WLAN_FTYPE_DATA 0x02 ++ ++/* Frame subtypes */ ++/* Management */ ++#define WLAN_FSTYPE_ASSOCREQ 0x00 ++#define WLAN_FSTYPE_ASSOCRESP 0x01 ++#define WLAN_FSTYPE_REASSOCREQ 0x02 ++#define WLAN_FSTYPE_REASSOCRESP 0x03 ++#define WLAN_FSTYPE_PROBEREQ 0x04 ++#define WLAN_FSTYPE_PROBERESP 0x05 ++#define WLAN_FSTYPE_BEACON 0x08 ++#define WLAN_FSTYPE_ATIM 0x09 ++#define WLAN_FSTYPE_DISASSOC 0x0a ++#define WLAN_FSTYPE_AUTHEN 0x0b ++#define WLAN_FSTYPE_DEAUTHEN 0x0c ++ ++/* Control */ ++#define WLAN_FSTYPE_PSPOLL 0x0a ++#define WLAN_FSTYPE_RTS 0x0b ++#define WLAN_FSTYPE_CTS 0x0c ++#define WLAN_FSTYPE_ACK 0x0d ++#define WLAN_FSTYPE_CFEND 0x0e ++#define WLAN_FSTYPE_CFENDCFACK 0x0f ++ ++/* Data */ ++#define WLAN_FSTYPE_DATAONLY 0x00 ++#define WLAN_FSTYPE_DATA_CFACK 0x01 ++#define WLAN_FSTYPE_DATA_CFPOLL 0x02 ++#define WLAN_FSTYPE_DATA_CFACK_CFPOLL 0x03 ++#define WLAN_FSTYPE_NULL 0x04 ++#define WLAN_FSTYPE_CFACK 0x05 ++#define WLAN_FSTYPE_CFPOLL 0x06 ++#define WLAN_FSTYPE_CFACK_CFPOLL 0x07 ++ ++ ++/*================================================================*/ ++/* Macros */ ++ ++/*--- FC Macros ----------------------------------------------*/ ++/* Macros to get/set the bitfields of the Frame Control Field */ ++/* GET_FC_??? - takes the host byte-order value of an FC */ ++/* and retrieves the value of one of the */ ++/* bitfields and moves that value so its lsb is */ ++/* in bit 0. */ ++/* SET_FC_??? - takes a host order value for one of the FC */ ++/* bitfields and moves it to the proper bit */ ++/* location for ORing into a host order FC. */ ++/* To send the FC produced from SET_FC_???, */ ++/* one must put the bytes in IEEE order. */ ++/* e.g. */ ++/* printf("the frame subtype is %x", */ ++/* GET_FC_FTYPE( ieee2host( rx.fc ))) */ ++/* */ ++/* tx.fc = host2ieee( SET_FC_FTYPE(WLAN_FTYP_CTL) | */ ++/* SET_FC_FSTYPE(WLAN_FSTYPE_RTS) ); */ ++/*------------------------------------------------------------*/ ++ ++#define WLAN_GET_FC_PVER(n) (((UINT16)(n)) & (BIT0 | BIT1)) ++#define WLAN_GET_FC_FTYPE(n) ((((UINT16)(n)) & (BIT2 | BIT3)) >> 2) ++#define WLAN_GET_FC_FSTYPE(n) ((((UINT16)(n)) & (BIT4|BIT5|BIT6|BIT7)) >> 4) ++#define WLAN_GET_FC_TODS(n) ((((UINT16)(n)) & (BIT8)) >> 8) ++#define WLAN_GET_FC_FROMDS(n) ((((UINT16)(n)) & (BIT9)) >> 9) ++#define WLAN_GET_FC_MOREFRAG(n) ((((UINT16)(n)) & (BIT10)) >> 10) ++#define WLAN_GET_FC_RETRY(n) ((((UINT16)(n)) & (BIT11)) >> 11) ++#define WLAN_GET_FC_PWRMGT(n) ((((UINT16)(n)) & (BIT12)) >> 12) ++#define WLAN_GET_FC_MOREDATA(n) ((((UINT16)(n)) & (BIT13)) >> 13) ++#define WLAN_GET_FC_ISWEP(n) ((((UINT16)(n)) & (BIT14)) >> 14) ++#define WLAN_GET_FC_ORDER(n) ((((UINT16)(n)) & (BIT15)) >> 15) ++ ++#define WLAN_SET_FC_PVER(n) ((UINT16)(n)) ++#define WLAN_SET_FC_FTYPE(n) (((UINT16)(n)) << 2) ++#define WLAN_SET_FC_FSTYPE(n) (((UINT16)(n)) << 4) ++#define WLAN_SET_FC_TODS(n) (((UINT16)(n)) << 8) ++#define WLAN_SET_FC_FROMDS(n) (((UINT16)(n)) << 9) ++#define WLAN_SET_FC_MOREFRAG(n) (((UINT16)(n)) << 10) ++#define WLAN_SET_FC_RETRY(n) (((UINT16)(n)) << 11) ++#define WLAN_SET_FC_PWRMGT(n) (((UINT16)(n)) << 12) ++#define WLAN_SET_FC_MOREDATA(n) (((UINT16)(n)) << 13) ++#define WLAN_SET_FC_ISWEP(n) (((UINT16)(n)) << 14) ++#define WLAN_SET_FC_ORDER(n) (((UINT16)(n)) << 15) ++ ++/*--- Duration Macros ----------------------------------------*/ ++/* Macros to get/set the bitfields of the Duration Field */ ++/* - the duration value is only valid when bit15 is zero */ ++/* - the firmware handles these values, so I'm not going */ ++/* these macros right now. */ ++/*------------------------------------------------------------*/ ++ ++/*--- Sequence Control Macros -------------------------------*/ ++/* Macros to get/set the bitfields of the Sequence Control */ ++/* Field. */ ++/*------------------------------------------------------------*/ ++#define WLAN_GET_SEQ_FRGNUM(n) (((UINT16)(n)) & (BIT0|BIT1|BIT2|BIT3)) ++#define WLAN_GET_SEQ_SEQNUM(n) ((((UINT16)(n)) & (~(BIT0|BIT1|BIT2|BIT3))) >> 4) ++ ++/*--- Data ptr macro -----------------------------------------*/ ++/* Creates a UINT8* to the data portion of a frame */ ++/* Assumes you're passing in a ptr to the beginning of the hdr*/ ++/*------------------------------------------------------------*/ ++#define WLAN_HDR_A3_DATAP(p) (((UINT8*)(p)) + WLAN_HDR_A3_LEN) ++#define WLAN_HDR_A4_DATAP(p) (((UINT8*)(p)) + WLAN_HDR_A4_LEN) ++ ++#define DOT11_RATE5_ISBASIC_GET(r) (((UINT8)(r)) & BIT7) ++ ++/*================================================================*/ ++/* Types */ ++ ++/* BSS Timestamp */ ++typedef UINT8 wlan_bss_ts_t[WLAN_BSS_TS_LEN]; ++ ++/* Generic 802.11 Header types */ ++__WLAN_PRAGMA_PACK1__ typedef struct p80211_hdr_a3 { ++ UINT16 fc __WLAN_ATTRIB_PACK__; ++ UINT16 dur __WLAN_ATTRIB_PACK__; ++ UINT8 a1[WLAN_ADDR_LEN] __WLAN_ATTRIB_PACK__; ++ UINT8 a2[WLAN_ADDR_LEN] __WLAN_ATTRIB_PACK__; ++ UINT8 a3[WLAN_ADDR_LEN] __WLAN_ATTRIB_PACK__; ++ UINT16 seq __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ p80211_hdr_a3_t; ++__WLAN_PRAGMA_PACKDFLT__ __WLAN_PRAGMA_PACK1__ typedef struct p80211_hdr_a4 { ++ UINT16 fc __WLAN_ATTRIB_PACK__; ++ UINT16 dur __WLAN_ATTRIB_PACK__; ++ UINT8 a1[WLAN_ADDR_LEN] __WLAN_ATTRIB_PACK__; ++ UINT8 a2[WLAN_ADDR_LEN] __WLAN_ATTRIB_PACK__; ++ UINT8 a3[WLAN_ADDR_LEN] __WLAN_ATTRIB_PACK__; ++ UINT16 seq __WLAN_ATTRIB_PACK__; ++ UINT8 a4[WLAN_ADDR_LEN] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ p80211_hdr_a4_t; ++__WLAN_PRAGMA_PACKDFLT__ typedef union p80211_hdr { ++ p80211_hdr_a3_t a3 __WLAN_ATTRIB_PACK__; ++ p80211_hdr_a4_t a4 __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ p80211_hdr_t; ++ ++ ++/*================================================================*/ ++/* Extern Declarations */ ++ ++ ++/*================================================================*/ ++/* Function Declarations */ ++ ++void p802addr_to_str(char *buf, UINT8 * addr); ++ ++#endif /* _P80211HDR_H */ +diff -urN x/drivers/net/wireless/acx/p80211mgmt.h y/drivers/net/wireless/acx/p80211mgmt.h +--- x/drivers/net/wireless/acx/p80211mgmt.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/acx/p80211mgmt.h 2003-09-14 08:41:24.000000000 +1000 +@@ -0,0 +1,473 @@ ++/* include/p80211mgmt.h ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Copyright (C) 2003 ACX100 Open Source Project ++ * ++ * The contents of this file are subject to the Mozilla Public ++ * License Version 1.1 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS ++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or ++ * implied. See the License for the specific language governing ++ * rights and limitations under the License. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU Public License version 2 (the "GPL"), in which ++ * case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use ++ * your version of this file under the MPL, indicate your decision ++ * by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL. If you do not delete ++ * the provisions above, a recipient may use your version of this ++ * file under either the MPL or the GPL. ++ * ++ * -------------------------------------------------------------------- ++ * ++ * This code is based on elements which are ++ * Copyright (C) 1999 AbsoluteValue Systems, Inc. All Rights Reserved. ++ * info@linux-wlan.com ++ * http://www.linux-wlan.com ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Inquiries regarding the ACX100 Open Source Project can be ++ * made directly to: ++ * ++ * acx100-users@lists.sf.net ++ * http://acx100.sf.net ++ * ++ * -------------------------------------------------------------------- ++ */ ++ ++#ifndef _P80211MGMT_H ++#define _P80211MGMT_H ++ ++/*================================================================*/ ++/* System Includes */ ++ ++/*================================================================*/ ++/* Project Includes */ ++ ++#ifndef _WLAN_COMPAT_H ++#include ++#endif ++ ++#ifndef _P80211HDR_H ++#include ++#endif ++ ++ ++/*================================================================*/ ++/* Constants */ ++ ++/*-- Information Element IDs --------------------*/ ++#define WLAN_EID_SSID 0 ++#define WLAN_EID_SUPP_RATES 1 ++#define WLAN_EID_FH_PARMS 2 ++#define WLAN_EID_DS_PARMS 3 ++#define WLAN_EID_CF_PARMS 4 ++#define WLAN_EID_TIM 5 ++#define WLAN_EID_IBSS_PARMS 6 ++/*-- values 7-15 reserved --*/ ++#define WLAN_EID_CHALLENGE 16 ++/*-- values 17-31 reserved for challenge text extension --*/ ++/*-- values 32-255 reserved --*/ ++ ++/*-- Reason Codes -------------------------------*/ ++#define WLAN_MGMT_REASON_RSVD 0 ++#define WLAN_MGMT_REASON_UNSPEC 1 ++#define WLAN_MGMT_REASON_PRIOR_AUTH_INVALID 2 ++#define WLAN_MGMT_REASON_DEAUTH_LEAVING 3 ++#define WLAN_MGMT_REASON_DISASSOC_INACTIVE 4 ++#define WLAN_MGMT_REASON_DISASSOC_AP_BUSY 5 ++#define WLAN_MGMT_REASON_CLASS2_NONAUTH 6 ++#define WLAN_MGMT_REASON_CLASS3_NONASSOC 7 ++#define WLAN_MGMT_REASON_DISASSOC_STA_HASLEFT 8 ++#define WLAN_MGMT_REASON_CANT_ASSOC_NONAUTH 9 ++ ++/*-- Status Codes -------------------------------*/ ++#define WLAN_MGMT_STATUS_SUCCESS 0 ++#define WLAN_MGMT_STATUS_UNSPEC_FAILURE 1 ++#define WLAN_MGMT_STATUS_CAPS_UNSUPPORTED 10 ++#define WLAN_MGMT_STATUS_REASSOC_NO_ASSOC 11 ++#define WLAN_MGMT_STATUS_ASSOC_DENIED_UNSPEC 12 ++#define WLAN_MGMT_STATUS_UNSUPPORTED_AUTHALG 13 ++#define WLAN_MGMT_STATUS_RX_AUTH_NOSEQ 14 ++#define WLAN_MGMT_STATUS_CHALLENGE_FAIL 15 ++#define WLAN_MGMT_STATUS_AUTH_TIMEOUT 16 ++#define WLAN_MGMT_STATUS_ASSOC_DENIED_BUSY 17 ++#define WLAN_MGMT_STATUS_ASSOC_DENIED_RATES 18 ++ /* p80211b additions */ ++#define WLAN_MGMT_STATUS_ASSOC_DENIED_NOSHORT 19 ++#define WLAN_MGMT_STATUS_ASSOC_DENIED_NOPBCC 20 ++#define WLAN_MGMT_STATUS_ASSOC_DENIED_NOAGILITY 21 ++ ++ ++ ++/*-- Auth Algorithm Field ---------------------------*/ ++#define WLAN_AUTH_ALG_OPENSYSTEM 0 ++#define WLAN_AUTH_ALG_SHAREDKEY 1 ++ ++/*-- Management Frame Field Offsets -------------*/ ++/* Note: Not all fields are listed because of variable lengths, */ ++/* see the code in p80211.c to see how we search for fields */ ++/* Note: These offsets are from the start of the frame data */ ++ ++#define WLAN_BEACON_OFF_TS 0 ++#define WLAN_BEACON_OFF_BCN_INT 8 ++#define WLAN_BEACON_OFF_CAPINFO 10 ++#define WLAN_BEACON_OFF_SSID 12 ++ ++#define WLAN_DISASSOC_OFF_REASON 0 ++ ++#define WLAN_ASSOCREQ_OFF_CAP_INFO 0 ++#define WLAN_ASSOCREQ_OFF_LISTEN_INT 2 ++#define WLAN_ASSOCREQ_OFF_SSID 4 ++ ++#define WLAN_ASSOCRESP_OFF_CAP_INFO 0 ++#define WLAN_ASSOCRESP_OFF_STATUS 2 ++#define WLAN_ASSOCRESP_OFF_AID 4 ++#define WLAN_ASSOCRESP_OFF_SUPP_RATES 6 ++ ++#define WLAN_REASSOCREQ_OFF_CAP_INFO 0 ++#define WLAN_REASSOCREQ_OFF_LISTEN_INT 2 ++#define WLAN_REASSOCREQ_OFF_CURR_AP 4 ++#define WLAN_REASSOCREQ_OFF_SSID 10 ++ ++#define WLAN_REASSOCRESP_OFF_CAP_INFO 0 ++#define WLAN_REASSOCRESP_OFF_STATUS 2 ++#define WLAN_REASSOCRESP_OFF_AID 4 ++#define WLAN_REASSOCRESP_OFF_SUPP_RATES 6 ++ ++#define WLAN_PROBEREQ_OFF_SSID 0 ++ ++#define WLAN_PROBERESP_OFF_TS 0 ++#define WLAN_PROBERESP_OFF_BCN_INT 8 ++#define WLAN_PROBERESP_OFF_CAP_INFO 10 ++#define WLAN_PROBERESP_OFF_SSID 12 ++ ++#define WLAN_AUTHEN_OFF_AUTH_ALG 0 ++#define WLAN_AUTHEN_OFF_AUTH_SEQ 2 ++#define WLAN_AUTHEN_OFF_STATUS 4 ++#define WLAN_AUTHEN_OFF_CHALLENGE 6 ++ ++#define WLAN_DEAUTHEN_OFF_REASON 0 ++ ++ ++/*================================================================*/ ++/* Macros */ ++ ++/*-- Capability Field ---------------------------*/ ++#define WLAN_GET_MGMT_CAP_INFO_ESS(n) ((n) & BIT0) ++#define WLAN_GET_MGMT_CAP_INFO_IBSS(n) (((n) & BIT1) >> 1) ++#define WLAN_GET_MGMT_CAP_INFO_CFPOLLABLE(n) (((n) & BIT2) >> 2) ++#define WLAN_GET_MGMT_CAP_INFO_CFPOLLREQ(n) (((n) & BIT3) >> 3) ++#define WLAN_GET_MGMT_CAP_INFO_PRIVACY(n) (((n) & BIT4) >> 4) ++ /* p80211b additions */ ++#define WLAN_GET_MGMT_CAP_INFO_SHORT(n) (((n) & BIT5) >> 5) ++#define WLAN_GET_MGMT_CAP_INFO_PBCC(n) (((n) & BIT6) >> 6) ++#define WLAN_GET_MGMT_CAP_INFO_AGILITY(n) (((n) & BIT7) >> 7) ++ ++#define WLAN_SET_MGMT_CAP_INFO_ESS(n) (n) ++#define WLAN_SET_MGMT_CAP_INFO_IBSS(n) ((n) << 1) ++#define WLAN_SET_MGMT_CAP_INFO_CFPOLLABLE(n) ((n) << 2) ++#define WLAN_SET_MGMT_CAP_INFO_CFPOLLREQ(n) ((n) << 3) ++#define WLAN_SET_MGMT_CAP_INFO_PRIVACY(n) ((n) << 4) ++ /* p80211b additions */ ++#define WLAN_SET_MGMT_CAP_INFO_SHORT(n) ((n) << 5) ++#define WLAN_SET_MGMT_CAP_INFO_PBCC(n) ((n) << 6) ++#define WLAN_SET_MGMT_CAP_INFO_AGILITY(n) ((n) << 7) ++ ++ ++/*================================================================*/ ++/* Types */ ++ ++/*-- Information Element Types --------------------*/ ++/* prototype structure, all IEs start with these members */ ++__WLAN_PRAGMA_PACK1__ typedef struct wlan_ie { ++ UINT8 eid __WLAN_ATTRIB_PACK__; ++ UINT8 len __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ wlan_ie_t; ++__WLAN_PRAGMA_PACKDFLT__ ++/*-- Service Set Identity (SSID) -----------------*/ ++ __WLAN_PRAGMA_PACK1__ typedef struct wlan_ie_ssid { ++ UINT8 eid __WLAN_ATTRIB_PACK__; ++ UINT8 len __WLAN_ATTRIB_PACK__; ++ UINT8 ssid[1] __WLAN_ATTRIB_PACK__; /* may be zero, ptrs may overlap */ ++} __WLAN_ATTRIB_PACK__ wlan_ie_ssid_t; ++__WLAN_PRAGMA_PACKDFLT__ ++/*-- Supported Rates -----------------------------*/ ++ __WLAN_PRAGMA_PACK1__ typedef struct wlan_ie_supp_rates { ++ UINT8 eid __WLAN_ATTRIB_PACK__; ++ UINT8 len __WLAN_ATTRIB_PACK__; ++ UINT8 rates[1] __WLAN_ATTRIB_PACK__; /* had better be at LEAST one! */ ++} __WLAN_ATTRIB_PACK__ wlan_ie_supp_rates_t; ++__WLAN_PRAGMA_PACKDFLT__ ++/*-- FH Parameter Set ----------------------------*/ ++ __WLAN_PRAGMA_PACK1__ typedef struct wlan_ie_fh_parms { ++ UINT8 eid __WLAN_ATTRIB_PACK__; ++ UINT8 len __WLAN_ATTRIB_PACK__; ++ UINT16 dwell __WLAN_ATTRIB_PACK__; ++ UINT8 hopset __WLAN_ATTRIB_PACK__; ++ UINT8 hoppattern __WLAN_ATTRIB_PACK__; ++ UINT8 hopindex __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ wlan_ie_fh_parms_t; ++__WLAN_PRAGMA_PACKDFLT__ ++/*-- DS Parameter Set ----------------------------*/ ++ __WLAN_PRAGMA_PACK1__ typedef struct wlan_ie_ds_parms { ++ UINT8 eid __WLAN_ATTRIB_PACK__; ++ UINT8 len __WLAN_ATTRIB_PACK__; ++ UINT8 curr_ch __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ wlan_ie_ds_parms_t; ++__WLAN_PRAGMA_PACKDFLT__ ++/*-- CF Parameter Set ----------------------------*/ ++ __WLAN_PRAGMA_PACK1__ typedef struct wlan_ie_cf_parms { ++ UINT8 eid __WLAN_ATTRIB_PACK__; ++ UINT8 len __WLAN_ATTRIB_PACK__; ++ UINT8 cfp_cnt __WLAN_ATTRIB_PACK__; ++ UINT8 cfp_period __WLAN_ATTRIB_PACK__; ++ UINT16 cfp_maxdur __WLAN_ATTRIB_PACK__; ++ UINT16 cfp_durremaining __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ wlan_ie_cf_parms_t; ++__WLAN_PRAGMA_PACKDFLT__ ++/*-- TIM ------------------------------------------*/ ++ __WLAN_PRAGMA_PACK1__ typedef struct wlan_ie_tim { ++ UINT8 eid __WLAN_ATTRIB_PACK__; ++ UINT8 len __WLAN_ATTRIB_PACK__; ++ UINT8 dtim_cnt __WLAN_ATTRIB_PACK__; ++ UINT8 dtim_period __WLAN_ATTRIB_PACK__; ++ UINT8 bitmap_ctl __WLAN_ATTRIB_PACK__; ++ UINT8 virt_bm[1] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ wlan_ie_tim_t; ++__WLAN_PRAGMA_PACKDFLT__ ++/*-- IBSS Parameter Set ---------------------------*/ ++ __WLAN_PRAGMA_PACK1__ typedef struct wlan_ie_ibss_parms { ++ UINT8 eid __WLAN_ATTRIB_PACK__; ++ UINT8 len __WLAN_ATTRIB_PACK__; ++ UINT16 atim_win __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ wlan_ie_ibss_parms_t; ++__WLAN_PRAGMA_PACKDFLT__ ++/*-- Challenge Text ------------------------------*/ ++ __WLAN_PRAGMA_PACK1__ typedef struct wlan_ie_challenge { ++ UINT8 eid __WLAN_ATTRIB_PACK__; ++ UINT8 len __WLAN_ATTRIB_PACK__; ++ UINT8 challenge[1] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ wlan_ie_challenge_t; ++__WLAN_PRAGMA_PACKDFLT__ ++/*-------------------------------------------------*/ ++/* Frame Types */ ++/* prototype structure, all mgmt frame types will start with these members */ ++ typedef struct wlan_fr_mgmt { ++ UINT16 type; ++ UINT16 len; /* DOES NOT include CRC !!!! */ ++ UINT8 *buf; ++ p80211_hdr_t *hdr; ++ /* used for target specific data, skb in Linux */ ++ void *priv; ++ /*-- fixed fields -----------*/ ++ /*-- info elements ----------*/ ++} wlan_fr_mgmt_t; ++ ++/*-- Beacon ---------------------------------------*/ ++typedef struct wlan_fr_beacon { ++ UINT16 type; //0x0 ++ UINT16 len; //0x2 ++ UINT8 *buf; //0x4 ++ p80211_hdr_t *hdr; //0x5 ++ /* used for target specific data, skb in Linux */ ++ void *priv; ++ /*-- fixed fields -----------*/ ++ UINT64 *ts; ++ UINT16 *bcn_int; ++ UINT16 *cap_info; ++ /*-- info elements ----------*/ ++ wlan_ie_ssid_t *ssid; ++ wlan_ie_supp_rates_t *supp_rates; ++ wlan_ie_fh_parms_t *fh_parms; ++ wlan_ie_ds_parms_t *ds_parms; ++ wlan_ie_cf_parms_t *cf_parms; ++ wlan_ie_ibss_parms_t *ibss_parms; ++ wlan_ie_tim_t *tim; ++ ++} wlan_fr_beacon_t; ++ ++ ++/*-- IBSS ATIM ------------------------------------*/ ++typedef struct wlan_fr_ibssatim { ++ UINT16 type; ++ UINT16 len; ++ UINT8 *buf; ++ p80211_hdr_t *hdr; ++ /* used for target specific data, skb in Linux */ ++ void *priv; ++ ++ /*-- fixed fields -----------*/ ++ /*-- info elements ----------*/ ++ ++ /* this frame type has a null body */ ++ ++} wlan_fr_ibssatim_t; ++ ++/*-- Disassociation -------------------------------*/ ++typedef struct wlan_fr_disassoc { ++ UINT16 type; ++ UINT16 len; ++ UINT8 *buf; ++ p80211_hdr_t *hdr; ++ /* used for target specific data, skb in Linux */ ++ void *priv; ++ /*-- fixed fields -----------*/ ++ UINT16 *reason; ++ ++ /*-- info elements ----------*/ ++ ++} wlan_fr_disassoc_t; ++ ++/*-- Association Request --------------------------*/ ++typedef struct wlan_fr_assocreq { ++ UINT16 type; ++ UINT16 len; ++ UINT8 *buf; ++ p80211_hdr_t *hdr; ++ /* used for target specific data, skb in Linux */ ++ void *priv; ++ /*-- fixed fields -----------*/ ++ UINT16 *cap_info; ++ UINT16 *listen_int; ++ /*-- info elements ----------*/ ++ wlan_ie_ssid_t *ssid; ++ wlan_ie_supp_rates_t *supp_rates; ++ ++} wlan_fr_assocreq_t; ++ ++/*-- Association Response -------------------------*/ ++typedef struct wlan_fr_assocresp { ++ UINT16 type; ++ UINT16 len; ++ UINT8 *buf; ++ p80211_hdr_t *hdr; ++ /* used for target specific data, skb in Linux */ ++ void *priv; ++ /*-- fixed fields -----------*/ ++ UINT16 *cap_info; ++ UINT16 *status; ++ UINT16 *aid; ++ /*-- info elements ----------*/ ++ wlan_ie_supp_rates_t *supp_rates; ++ ++} wlan_fr_assocresp_t; ++ ++/*-- Reassociation Request ------------------------*/ ++typedef struct wlan_fr_reassocreq { ++ UINT16 type; ++ UINT16 len; ++ UINT8 *buf; ++ p80211_hdr_t *hdr; ++ /* used for target specific data, skb in Linux */ ++ void *priv; ++ /*-- fixed fields -----------*/ ++ UINT16 *cap_info; ++ UINT16 *listen_int; ++ UINT8 *curr_ap; ++ /*-- info elements ----------*/ ++ wlan_ie_ssid_t *ssid; ++ wlan_ie_supp_rates_t *supp_rates; ++ ++} wlan_fr_reassocreq_t; ++ ++/*-- Reassociation Response -----------------------*/ ++typedef struct wlan_fr_reassocresp { ++ UINT16 type; ++ UINT16 len; ++ UINT8 *buf; ++ p80211_hdr_t *hdr; ++ /* used for target specific data, skb in Linux */ ++ void *priv; ++ /*-- fixed fields -----------*/ ++ UINT16 *cap_info; ++ UINT16 *status; ++ UINT16 *aid; ++ /*-- info elements ----------*/ ++ wlan_ie_supp_rates_t *supp_rates; ++ ++} wlan_fr_reassocresp_t; ++ ++/*-- Probe Request --------------------------------*/ ++typedef struct wlan_fr_probereq { ++ UINT16 type; ++ UINT16 len; ++ UINT8 *buf; ++ p80211_hdr_t *hdr; ++ /* used for target specific data, skb in Linux */ ++ void *priv; ++ /*-- fixed fields -----------*/ ++ /*-- info elements ----------*/ ++ wlan_ie_ssid_t *ssid; ++ wlan_ie_supp_rates_t *supp_rates; ++ ++} wlan_fr_probereq_t; ++ ++/*-- Probe Response -------------------------------*/ ++typedef struct wlan_fr_proberesp { ++ UINT16 type; ++ UINT16 len; ++ UINT8 *buf; ++ p80211_hdr_t *hdr; ++ /* used for target specific data, skb in Linux */ ++ void *priv; ++ /*-- fixed fields -----------*/ ++ UINT64 *ts; ++ UINT16 *bcn_int; ++ UINT16 *cap_info; ++ /*-- info elements ----------*/ ++ wlan_ie_ssid_t *ssid; ++ wlan_ie_supp_rates_t *supp_rates; ++ wlan_ie_fh_parms_t *fh_parms; ++ wlan_ie_ds_parms_t *ds_parms; ++ wlan_ie_cf_parms_t *cf_parms; ++ wlan_ie_ibss_parms_t *ibss_parms; ++} wlan_fr_proberesp_t; ++ ++/*-- Authentication -------------------------------*/ ++typedef struct wlan_fr_authen { ++ UINT16 type; ++ UINT16 len; ++ UINT8 *buf; ++ p80211_hdr_t *hdr; ++ /* used for target specific data, skb in Linux */ ++ void *priv; ++ /*-- fixed fields -----------*/ ++ UINT16 *auth_alg; ++ UINT16 *auth_seq; ++ UINT16 *status; ++ /*-- info elements ----------*/ ++ wlan_ie_challenge_t *challenge; ++ ++} wlan_fr_authen_t; ++ ++/*-- Deauthenication -----------------------------*/ ++typedef struct wlan_fr_deauthen { ++ UINT16 type; /* 00 */ ++ UINT16 len; /* 02 */ ++ UINT8 *buf; /* 04 */ ++ p80211_hdr_t *hdr; /* 08 */ ++ /* used for target specific data, skb in Linux */ ++ void *priv; /* 0c */ ++ /*-- fixed fields -----------*/ ++ UINT16 *reason; /* 10 */ ++ ++ /*-- info elements ----------*/ ++ ++} wlan_fr_deauthen_t; ++ ++ ++/*================================================================*/ ++/* Extern Declarations */ ++ ++ ++ ++#endif /* _P80211MGMT_H */ +diff -urN x/drivers/net/wireless/acx/p80211msg.h y/drivers/net/wireless/acx/p80211msg.h +--- x/drivers/net/wireless/acx/p80211msg.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/acx/p80211msg.h 2003-07-03 06:55:55.000000000 +1000 +@@ -0,0 +1,93 @@ ++/* include/p80211msg.h ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Copyright (C) 2003 ACX100 Open Source Project ++ * ++ * The contents of this file are subject to the Mozilla Public ++ * License Version 1.1 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS ++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or ++ * implied. See the License for the specific language governing ++ * rights and limitations under the License. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU Public License version 2 (the "GPL"), in which ++ * case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use ++ * your version of this file under the MPL, indicate your decision ++ * by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL. If you do not delete ++ * the provisions above, a recipient may use your version of this ++ * file under either the MPL or the GPL. ++ * ++ * -------------------------------------------------------------------- ++ * ++ * This code is based on elements which are ++ * Copyright (C) 1999 AbsoluteValue Systems, Inc. All Rights Reserved. ++ * info@linux-wlan.com ++ * http://www.linux-wlan.com ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Inquiries regarding the ACX100 Open Source Project can be ++ * made directly to: ++ * ++ * acx100-users@lists.sf.net ++ * http://acx100.sf.net ++ * ++ * -------------------------------------------------------------------- ++ */ ++ ++#ifndef _P80211MSG_H ++#define _P80211MSG_H ++ ++/*================================================================*/ ++/* System Includes */ ++ ++/*================================================================*/ ++/* Project Includes */ ++ ++#ifndef _WLAN_COMPAT_H ++#include ++#endif ++ ++/*================================================================*/ ++/* Constants */ ++ ++#define MSG_BUFF_LEN 4000 ++#define WLAN_DEVNAMELEN_MAX 16 ++ ++/*================================================================*/ ++/* Macros */ ++ ++/*================================================================*/ ++/* Types */ ++ ++/*--------------------------------------------------------------------*/ ++/*----- Message Structure Types --------------------------------------*/ ++ ++/*--------------------------------------------------------------------*/ ++/* Prototype msg type */ ++ ++__WLAN_PRAGMA_PACK1__ typedef struct p80211msg { ++ UINT32 msgcode __WLAN_ATTRIB_PACK__; ++ UINT32 msglen __WLAN_ATTRIB_PACK__; ++ UINT8 devname[WLAN_DEVNAMELEN_MAX] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ p80211msg_t; ++__WLAN_PRAGMA_PACKDFLT__ __WLAN_PRAGMA_PACK1__ typedef struct p80211msgd { ++ UINT32 msgcode __WLAN_ATTRIB_PACK__; ++ UINT32 msglen __WLAN_ATTRIB_PACK__; ++ UINT8 devname[WLAN_DEVNAMELEN_MAX] __WLAN_ATTRIB_PACK__; ++ UINT8 args[0] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ p80211msgd_t; ++__WLAN_PRAGMA_PACKDFLT__ ++/*================================================================*/ ++/* Extern Declarations */ ++/*================================================================*/ ++/* Function Declarations */ ++#endif /* _P80211MSG_H */ +diff -urN x/drivers/net/wireless/acx/p80211types.h y/drivers/net/wireless/acx/p80211types.h +--- x/drivers/net/wireless/acx/p80211types.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/acx/p80211types.h 2003-07-03 06:55:57.000000000 +1000 +@@ -0,0 +1,681 @@ ++/* include/p80211types.h ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Copyright (C) 2003 ACX100 Open Source Project ++ * ++ * The contents of this file are subject to the Mozilla Public ++ * License Version 1.1 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS ++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or ++ * implied. See the License for the specific language governing ++ * rights and limitations under the License. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU Public License version 2 (the "GPL"), in which ++ * case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use ++ * your version of this file under the MPL, indicate your decision ++ * by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL. If you do not delete ++ * the provisions above, a recipient may use your version of this ++ * file under either the MPL or the GPL. ++ * ++ * -------------------------------------------------------------------- ++ * ++ * This code is based on elements which are ++ * Copyright (C) 1999 AbsoluteValue Systems, Inc. All Rights Reserved. ++ * info@linux-wlan.com ++ * http://www.linux-wlan.com ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Inquiries regarding the ACX100 Open Source Project can be ++ * made directly to: ++ * ++ * acx100-users@lists.sf.net ++ * http://acx100.sf.net ++ * ++ * -------------------------------------------------------------------- ++ */ ++ ++#ifndef _P80211TYPES_H ++#define _P80211TYPES_H ++ ++/*================================================================*/ ++/* System Includes */ ++/*================================================================*/ ++ ++/*================================================================*/ ++/* Project Includes */ ++/*================================================================*/ ++ ++#ifndef _WLAN_COMPAT_H ++#include ++#endif ++ ++/*================================================================*/ ++/* Constants */ ++/*================================================================*/ ++ ++/*----------------------------------------------------------------*/ ++/* p80211 data type codes used for MIB items and message */ ++/* arguments. The various metadata structures provide additional */ ++/* information about these types. */ ++ ++#define P80211_TYPE_OCTETSTR 1 /* pascal array of bytes */ ++#define P80211_TYPE_DISPLAYSTR 2 /* pascal array of bytes containing ascii */ ++#define P80211_TYPE_BOUNDEDINT 3 /* UINT32 w/ min and max values */ ++#define P80211_TYPE_INT 4 /* UINT32 min and max limited by 32 bits */ ++#define P80211_TYPE_ENUMINT 5 /* UINT32 holding a numeric ++ code that can be mapped ++ to a textual name */ ++#define P80211_TYPE_UNKDATA 6 /* Data item containing an ++ unknown data type */ ++#define P80211_TYPE_INTARRAY 7 /* Array of 32-bit integers. */ ++#define P80211_TYPE_BITARRAY 8 /* Array of bits. */ ++#define P80211_TYPE_MACARRAY 9 /* Array of MAC addresses. */ ++ ++/*----------------------------------------------------------------*/ ++/* The following constants are indexes into the Mib Category List */ ++/* and the Message Category List */ ++ ++/* Mib Category List */ ++#define P80211_MIB_CAT_DOT11SMT 1 ++#define P80211_MIB_CAT_DOT11MAC 2 ++#define P80211_MIB_CAT_DOT11PHY 3 ++ ++#define P80211SEC_DOT11SMT P80211_MIB_CAT_DOT11SMT ++#define P80211SEC_DOT11MAC P80211_MIB_CAT_DOT11MAC ++#define P80211SEC_DOT11PHY P80211_MIB_CAT_DOT11PHY ++ ++/* Message Category List */ ++#define P80211_MSG_CAT_DOT11REQ 1 ++#define P80211_MSG_CAT_DOT11IND 2 ++/* #define P80211_MSG_CAT_DOT11CFM 3 (doesn't exist at this time) */ ++ ++#define P80211SEC_DOT11REQ P80211_MSG_CAT_DOT11REQ ++#define P80211SEC_DOT11IND P80211_MSG_CAT_DOT11IND ++/* #define P80211SEC_DOT11CFM P80211_MSG_CAT_DOT11CFM (doesn't exist at this time */ ++ ++ ++ ++/*----------------------------------------------------------------*/ ++/* p80211 DID field codes that represent access type and */ ++/* is_table status. */ ++ ++#define P80211DID_ACCESS_READ 0x10000000 ++#define P80211DID_ACCESS_WRITE 0x08000000 ++#define P80211DID_WRITEONLY 0x00000001 ++#define P80211DID_READONLY 0x00000002 ++#define P80211DID_READWRITE 0x00000003 ++#define P80211DID_ISTABLE_FALSE 0 ++#define P80211DID_ISTABLE_TRUE 1 ++ ++/*----------------------------------------------------------------*/ ++/* p80211 enumeration constants. The value to text mappings for */ ++/* these is in p80211types.c. These defines were generated */ ++/* from the mappings. */ ++ ++/* error codes for lookups */ ++#define P80211ENUM_BAD 0xffffffffUL ++#define P80211ENUM_BADSTR "P80211ENUM_BAD" ++ ++#define P80211ENUM_truth_false 0 ++#define P80211ENUM_truth_true 1 ++#define P80211ENUM_ifstate_disable 0 ++#define P80211ENUM_ifstate_fwload 1 ++#define P80211ENUM_ifstate_enable 2 ++#define P80211ENUM_powermgmt_active 1 ++#define P80211ENUM_powermgmt_powersave 2 ++#define P80211ENUM_bsstype_infrastructure 1 ++#define P80211ENUM_bsstype_independent 2 ++#define P80211ENUM_bsstype_any 3 ++#define P80211ENUM_authalg_opensystem 1 ++#define P80211ENUM_authalg_sharedkey 2 ++#define P80211ENUM_phytype_fhss 1 ++#define P80211ENUM_phytype_dsss 2 ++#define P80211ENUM_phytype_irbaseband 3 ++#define P80211ENUM_temptype_commercial 1 ++#define P80211ENUM_temptype_industrial 2 ++#define P80211ENUM_regdomain_fcc 16 ++#define P80211ENUM_regdomain_doc 32 ++#define P80211ENUM_regdomain_etsi 48 ++#define P80211ENUM_regdomain_spain 49 ++#define P80211ENUM_regdomain_france 50 ++#define P80211ENUM_regdomain_mkk 64 ++#define P80211ENUM_ccamode_edonly 1 ++#define P80211ENUM_ccamode_csonly 2 ++#define P80211ENUM_ccamode_edandcs 4 ++#define P80211ENUM_ccamode_cswithtimer 8 ++#define P80211ENUM_ccamode_hrcsanded 16 ++#define P80211ENUM_diversity_fixedlist 1 ++#define P80211ENUM_diversity_notsupported 2 ++#define P80211ENUM_diversity_dynamic 3 ++#define P80211ENUM_scantype_active 1 ++#define P80211ENUM_scantype_passive 2 ++#define P80211ENUM_scantype_both 3 ++#define P80211ENUM_resultcode_success 1 ++#define P80211ENUM_resultcode_invalid_parameters 2 ++#define P80211ENUM_resultcode_not_supported 3 ++#define P80211ENUM_resultcode_timeout 4 ++#define P80211ENUM_resultcode_too_many_req 5 ++#define P80211ENUM_resultcode_refused 6 ++#define P80211ENUM_resultcode_bss_already 7 ++#define P80211ENUM_resultcode_invalid_access 8 ++#define P80211ENUM_resultcode_invalid_mibattribute 9 ++#define P80211ENUM_resultcode_cant_set_readonly_mib 10 ++#define P80211ENUM_resultcode_implementation_failure 11 ++#define P80211ENUM_resultcode_cant_get_writeonly_mib 12 ++#define P80211ENUM_reason_unspec_reason 1 ++#define P80211ENUM_reason_auth_not_valid 2 ++#define P80211ENUM_reason_deauth_lv_ss 3 ++#define P80211ENUM_reason_inactivity 4 ++#define P80211ENUM_reason_ap_overload 5 ++#define P80211ENUM_reason_class23_err 6 ++#define P80211ENUM_reason_class3_err 7 ++#define P80211ENUM_reason_disas_lv_ss 8 ++#define P80211ENUM_reason_asoc_not_auth 9 ++#define P80211ENUM_status_successful 0 ++#define P80211ENUM_status_unspec_failure 1 ++#define P80211ENUM_status_unsup_cap 10 ++#define P80211ENUM_status_reasoc_no_asoc 11 ++#define P80211ENUM_status_fail_other 12 ++#define P80211ENUM_status_unspt_alg 13 ++#define P80211ENUM_status_auth_seq_fail 14 ++#define P80211ENUM_status_chlng_fail 15 ++#define P80211ENUM_status_auth_timeout 16 ++#define P80211ENUM_status_ap_full 17 ++#define P80211ENUM_status_unsup_rate 18 ++#define P80211ENUM_status_unsup_shortpreamble 19 ++#define P80211ENUM_status_unsup_pbcc 20 ++#define P80211ENUM_status_unsup_agility 21 ++#define P80211ENUM_msgitem_status_data_ok 0 ++#define P80211ENUM_msgitem_status_no_value 1 ++#define P80211ENUM_msgitem_status_invalid_itemname 2 ++#define P80211ENUM_msgitem_status_invalid_itemdata 3 ++#define P80211ENUM_msgitem_status_missing_itemdata 4 ++#define P80211ENUM_msgitem_status_incomplete_itemdata 5 ++#define P80211ENUM_msgitem_status_invalid_msg_did 6 ++#define P80211ENUM_msgitem_status_invalid_mib_did 7 ++#define P80211ENUM_msgitem_status_missing_conv_func 8 ++#define P80211ENUM_msgitem_status_string_too_long 9 ++#define P80211ENUM_msgitem_status_data_out_of_range 10 ++#define P80211ENUM_msgitem_status_string_too_short 11 ++#define P80211ENUM_msgitem_status_missing_valid_func 12 ++#define P80211ENUM_msgitem_status_unknown 13 ++#define P80211ENUM_msgitem_status_invalid_did 14 ++#define P80211ENUM_msgitem_status_missing_print_func 15 ++ ++#define P80211ENUM_p2preamble_long 0 ++#define P80211ENUM_p2preamble_short 2 ++#define P80211ENUM_p2preamble_mixed 3 ++ ++/*----------------------------------------------------------------*/ ++/* p80211 max length constants for the different pascal strings. */ ++ ++#define MAXLEN_PSTR6 (6) /* pascal array of 6 bytes */ ++#define MAXLEN_PSTR14 (14) /* pascal array of 14 bytes */ ++#define MAXLEN_PSTR32 (32) /* pascal array of 32 bytes */ ++#define MAXLEN_PSTR255 (255) /* pascal array of 255 bytes */ ++#define MAXLEN_MIBATTRIBUTE (392) /* maximum mibattribute */ ++ /* where the size of the DATA itself */ ++ /* is a DID-LEN-DATA triple */ ++ /* with a max size of 4+4+384 */ ++ ++#define P80211_SET_INT(item, value) do { \ ++ (item).data = (value); \ ++ (item).status = P80211ENUM_msgitem_status_data_ok; \ ++ } while(0) ++/*----------------------------------------------------------------*/ ++/* string constants */ ++ ++#define NOT_SET "NOT_SET" ++#define NOT_SUPPORTED "NOT_SUPPORTED" ++#define UNKNOWN_DATA "UNKNOWN_DATA" ++ ++ ++/*--------------------------------------------------------------------*/ ++/* Metadata flags */ ++ ++/* MSM: Do these belong in p80211meta.h? I'm not sure. */ ++ ++#define ISREQUIRED (0x80000000UL) ++#define ISREQUEST (0x40000000UL) ++#define ISCONFIRM (0x20000000UL) ++ ++ ++/*================================================================*/ ++/* Macros */ ++ ++/*--------------------------------------------------------------------*/ ++/* The following macros are used to manipulate the 'flags' field in */ ++/* the metadata. These are only used when the metadata is for */ ++/* command arguments to determine if the data item is required, and */ ++/* whether the metadata item is for a request command, confirm */ ++/* command or both. */ ++/*--------------------------------------------------------------------*/ ++/* MSM: Do these belong in p80211meta.h? I'm not sure */ ++ ++#define P80211ITEM_SETFLAGS(q, r, c) ( q | r | c ) ++ ++#define P80211ITEM_ISREQUIRED(flags) (((UINT32)(flags & ISREQUIRED)) >> 31 ) ++#define P80211ITEM_ISREQUEST(flags) (((UINT32)(flags & ISREQUEST)) >> 30 ) ++#define P80211ITEM_ISCONFIRM(flags) (((UINT32)(flags & ISCONFIRM)) >> 29 ) ++ ++/*----------------------------------------------------------------*/ ++/* The following macro creates a name for an enum */ ++ ++#define MKENUMNAME(name) p80211enum_ ## name ++ ++/*---------------------------------------------------------------- ++* The following constants and macros are used to construct and ++* deconstruct the Data ID codes. The coding is as follows: ++* ++* ...rwtnnnnnnnniiiiiiggggggssssss s - Section ++* g - Group ++* i - Item ++* n - Index ++* t - Table flag ++* w - Write flag ++* r - Read flag ++* . - Unused ++*/ ++ ++#define P80211DID_INVALID 0xffffffffUL ++#define P80211DID_VALID 0x00000000UL ++ ++#define P80211DID_LSB_SECTION (0) ++#define P80211DID_LSB_GROUP (6) ++#define P80211DID_LSB_ITEM (12) ++#define P80211DID_LSB_INDEX (18) ++#define P80211DID_LSB_ISTABLE (26) ++#define P80211DID_LSB_ACCESS (27) ++ ++#define P80211DID_MASK_SECTION (0x0000003fUL) ++#define P80211DID_MASK_GROUP (0x0000003fUL) ++#define P80211DID_MASK_ITEM (0x0000003fUL) ++#define P80211DID_MASK_INDEX (0x000000ffUL) ++#define P80211DID_MASK_ISTABLE (0x00000001UL) ++#define P80211DID_MASK_ACCESS (0x00000003UL) ++ ++ ++#define P80211DID_MK(a,m,l) ((((UINT32)(a)) & (m)) << (l)) ++ ++#define P80211DID_MKSECTION(a) P80211DID_MK(a, \ ++ P80211DID_MASK_SECTION, \ ++ P80211DID_LSB_SECTION ) ++#define P80211DID_MKGROUP(a) P80211DID_MK(a, \ ++ P80211DID_MASK_GROUP, \ ++ P80211DID_LSB_GROUP ) ++#define P80211DID_MKITEM(a) P80211DID_MK(a, \ ++ P80211DID_MASK_ITEM, \ ++ P80211DID_LSB_ITEM ) ++#define P80211DID_MKINDEX(a) P80211DID_MK(a, \ ++ P80211DID_MASK_INDEX, \ ++ P80211DID_LSB_INDEX ) ++#define P80211DID_MKISTABLE(a) P80211DID_MK(a, \ ++ P80211DID_MASK_ISTABLE, \ ++ P80211DID_LSB_ISTABLE ) ++ ++ ++#define P80211DID_MKID(s,g,i,n,t,a) (P80211DID_MKSECTION(s) | \ ++ P80211DID_MKGROUP(g) | \ ++ P80211DID_MKITEM(i) | \ ++ P80211DID_MKINDEX(n) | \ ++ P80211DID_MKISTABLE(t) | \ ++ (a) ) ++ ++ ++#define P80211DID_GET(a,m,l) ((((UINT32)(a)) >> (l)) & (m)) ++ ++#define P80211DID_SECTION(a) P80211DID_GET(a, \ ++ P80211DID_MASK_SECTION, \ ++ P80211DID_LSB_SECTION) ++#define P80211DID_GROUP(a) P80211DID_GET(a, \ ++ P80211DID_MASK_GROUP, \ ++ P80211DID_LSB_GROUP) ++#define P80211DID_ITEM(a) P80211DID_GET(a, \ ++ P80211DID_MASK_ITEM, \ ++ P80211DID_LSB_ITEM) ++#define P80211DID_INDEX(a) P80211DID_GET(a, \ ++ P80211DID_MASK_INDEX, \ ++ P80211DID_LSB_INDEX) ++#define P80211DID_ISTABLE(a) P80211DID_GET(a, \ ++ P80211DID_MASK_ISTABLE, \ ++ P80211DID_LSB_ISTABLE) ++#define P80211DID_ACCESS(a) P80211DID_GET(a, \ ++ P80211DID_MASK_ACCESS, \ ++ P80211DID_LSB_ACCESS) ++ ++/*================================================================*/ ++/* Types */ ++ ++/*----------------------------------------------------------------*/ ++/* The following structure types are used for the represenation */ ++/* of ENUMINT type metadata. */ ++ ++typedef struct p80211enumpair { ++ UINT32 val; ++ char *name; ++} p80211enumpair_t; ++ ++typedef struct p80211enum { ++ INT nitems; ++ p80211enumpair_t *list; ++} p80211enum_t; ++ ++/*----------------------------------------------------------------*/ ++/* The following structure types are used to store data items in */ ++/* messages. */ ++ ++/* Template pascal string */ ++__WLAN_PRAGMA_PACK1__ typedef struct p80211pstr { ++ UINT8 len __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ p80211pstr_t; ++__WLAN_PRAGMA_PACKDFLT__ __WLAN_PRAGMA_PACK1__ typedef struct p80211pstrd { ++ UINT8 len __WLAN_ATTRIB_PACK__; ++ UINT8 data[0] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ p80211pstrd_t; ++__WLAN_PRAGMA_PACKDFLT__ ++/* Maximum pascal string */ ++ __WLAN_PRAGMA_PACK1__ typedef struct p80211pstr255 { ++ UINT8 len __WLAN_ATTRIB_PACK__; ++ UINT8 data[MAXLEN_PSTR255] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ p80211pstr255_t; ++__WLAN_PRAGMA_PACKDFLT__ ++/* pascal string for macaddress and bssid */ ++ __WLAN_PRAGMA_PACK1__ typedef struct p80211pstr6 { ++ UINT8 len __WLAN_ATTRIB_PACK__; ++ UINT8 data[MAXLEN_PSTR6] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ p80211pstr6_t; ++__WLAN_PRAGMA_PACKDFLT__ ++/* pascal string for channel list */ ++ __WLAN_PRAGMA_PACK1__ typedef struct p80211pstr14 { ++ UINT8 len __WLAN_ATTRIB_PACK__; ++ UINT8 data[MAXLEN_PSTR14] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ p80211pstr14_t; ++__WLAN_PRAGMA_PACKDFLT__ ++/* pascal string for ssid */ ++ __WLAN_PRAGMA_PACK1__ typedef struct p80211pstr32 { ++ UINT8 len __WLAN_ATTRIB_PACK__; ++ UINT8 data[MAXLEN_PSTR32] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ p80211pstr32_t; ++__WLAN_PRAGMA_PACKDFLT__ ++/* MAC address array */ ++ __WLAN_PRAGMA_PACK1__ typedef struct p80211macarray { ++ UINT32 cnt __WLAN_ATTRIB_PACK__; ++ UINT8 data[1][MAXLEN_PSTR6] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ p80211macarray_t; ++__WLAN_PRAGMA_PACKDFLT__ ++/* prototype template */ ++ __WLAN_PRAGMA_PACK1__ typedef struct p80211item { ++ UINT32 did __WLAN_ATTRIB_PACK__; ++ UINT16 status __WLAN_ATTRIB_PACK__; ++ UINT16 len __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ p80211item_t; ++__WLAN_PRAGMA_PACKDFLT__ ++/* prototype template w/ data item */ ++ __WLAN_PRAGMA_PACK1__ typedef struct p80211itemd { ++ UINT32 did __WLAN_ATTRIB_PACK__; ++ UINT16 status __WLAN_ATTRIB_PACK__; ++ UINT16 len __WLAN_ATTRIB_PACK__; ++ UINT8 data[0] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ p80211itemd_t; ++__WLAN_PRAGMA_PACKDFLT__ ++/* message data item for INT, BOUNDEDINT, ENUMINT */ ++ __WLAN_PRAGMA_PACK1__ typedef struct p80211item_uint32 { ++ UINT32 did __WLAN_ATTRIB_PACK__; ++ UINT16 status __WLAN_ATTRIB_PACK__; ++ UINT16 len __WLAN_ATTRIB_PACK__; ++ UINT32 data __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ p80211item_uint32_t; ++__WLAN_PRAGMA_PACKDFLT__ ++/* message data item for OCTETSTR, DISPLAYSTR */ ++ __WLAN_PRAGMA_PACK1__ typedef struct p80211item_pstr6 { ++ UINT32 did __WLAN_ATTRIB_PACK__; ++ UINT16 status __WLAN_ATTRIB_PACK__; ++ UINT16 len __WLAN_ATTRIB_PACK__; ++ p80211pstr6_t data __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ p80211item_pstr6_t; ++__WLAN_PRAGMA_PACKDFLT__ ++/* message data item for OCTETSTR, DISPLAYSTR */ ++ __WLAN_PRAGMA_PACK1__ typedef struct p80211item_pstr14 { ++ UINT32 did __WLAN_ATTRIB_PACK__; ++ UINT16 status __WLAN_ATTRIB_PACK__; ++ UINT16 len __WLAN_ATTRIB_PACK__; ++ p80211pstr14_t data __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ p80211item_pstr14_t; ++__WLAN_PRAGMA_PACKDFLT__ ++/* message data item for OCTETSTR, DISPLAYSTR */ ++ __WLAN_PRAGMA_PACK1__ typedef struct p80211item_pstr32 { ++ UINT32 did __WLAN_ATTRIB_PACK__; ++ UINT16 status __WLAN_ATTRIB_PACK__; ++ UINT16 len __WLAN_ATTRIB_PACK__; ++ p80211pstr32_t data __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ p80211item_pstr32_t; ++__WLAN_PRAGMA_PACKDFLT__ ++/* message data item for OCTETSTR, DISPLAYSTR */ ++ __WLAN_PRAGMA_PACK1__ typedef struct p80211item_pstr255 { ++ UINT32 did __WLAN_ATTRIB_PACK__; ++ UINT16 status __WLAN_ATTRIB_PACK__; ++ UINT16 len __WLAN_ATTRIB_PACK__; ++ p80211pstr255_t data __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ p80211item_pstr255_t; ++__WLAN_PRAGMA_PACKDFLT__ ++/* message data item for UNK 392, namely mib items */ ++ typedef struct p80211item_unk392 { ++ UINT32 did __WLAN_ATTRIB_PACK__; ++ UINT16 status __WLAN_ATTRIB_PACK__; ++ UINT16 len __WLAN_ATTRIB_PACK__; ++ UINT8 data[MAXLEN_MIBATTRIBUTE] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ p80211item_unk392_t; ++__WLAN_PRAGMA_PACK1__ ++/* message data item for UNK 1025, namely p2 pdas */ ++ typedef struct p80211item_unk1024 { ++ UINT32 did __WLAN_ATTRIB_PACK__; ++ UINT16 status __WLAN_ATTRIB_PACK__; ++ UINT16 len __WLAN_ATTRIB_PACK__; ++ UINT8 data[1024] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ p80211item_unk1024_t; ++__WLAN_PRAGMA_PACK1__ ++/* message data item for UNK 4096, namely p2 download chunks */ ++ typedef struct p80211item_unk4096 { ++ UINT32 did __WLAN_ATTRIB_PACK__; ++ UINT16 status __WLAN_ATTRIB_PACK__; ++ UINT16 len __WLAN_ATTRIB_PACK__; ++ UINT8 data[4096] __WLAN_ATTRIB_PACK__; ++} __WLAN_ATTRIB_PACK__ p80211item_unk4096_t; ++__WLAN_PRAGMA_PACK1__ struct catlistitem; ++ ++/*----------------------------------------------------------------*/ ++/* The following structure type is used to represent all of the */ ++/* metadata items. Some components may choose to use more, */ ++/* less or different metadata items. */ ++ ++typedef void (*p80211_totext_t) (struct catlistitem *, UINT32 did, ++ UINT8 * itembuf, char *textbuf); ++typedef void (*p80211_fromtext_t) (struct catlistitem *, UINT32 did, ++ UINT8 * itembuf, char *textbuf); ++typedef UINT32(*p80211_valid_t) (struct catlistitem *, UINT32 did, ++ UINT8 * itembuf); ++ ++ ++/*================================================================*/ ++/* Extern Declarations */ ++ ++/*----------------------------------------------------------------*/ ++/* Enumeration Lists */ ++/* The following are the external declarations */ ++/* for all enumerations */ ++ ++extern p80211enum_t MKENUMNAME(truth); ++extern p80211enum_t MKENUMNAME(ifstate); ++extern p80211enum_t MKENUMNAME(powermgmt); ++extern p80211enum_t MKENUMNAME(bsstype); ++extern p80211enum_t MKENUMNAME(authalg); ++extern p80211enum_t MKENUMNAME(phytype); ++extern p80211enum_t MKENUMNAME(temptype); ++extern p80211enum_t MKENUMNAME(regdomain); ++extern p80211enum_t MKENUMNAME(ccamode); ++extern p80211enum_t MKENUMNAME(diversity); ++extern p80211enum_t MKENUMNAME(scantype); ++extern p80211enum_t MKENUMNAME(resultcode); ++extern p80211enum_t MKENUMNAME(reason); ++extern p80211enum_t MKENUMNAME(status); ++extern p80211enum_t MKENUMNAME(msgcode); ++extern p80211enum_t MKENUMNAME(msgitem_status); ++extern p80211enum_t MKENUMNAME(p2preamble); ++ ++/*================================================================*/ ++/* Function Declarations */ ++ ++/*----------------------------------------------------------------*/ ++/* The following declare some utility functions for use with the */ ++/* p80211enum_t type. */ ++ ++UINT32 p80211enum_text2int(p80211enum_t * ep, char *text); ++UINT32 p80211enum_int2text(p80211enum_t * ep, UINT32 val, char *text); ++void p80211_error2text(int err_code, char *err_str); ++ ++/*----------------------------------------------------------------*/ ++/* The following declare some utility functions for use with the */ ++/* p80211item_t and p80211meta_t types. */ ++ ++/*----------------------------------------------------------------*/ ++/* The following declare functions that perform validation and */ ++/* text to binary conversions based on the metadata for interface */ ++/* and MIB data items. */ ++/*----------------------------------------------------------------*/ ++ ++/*-- DISPLAYSTR ------------------------------------------------------*/ ++/* pstr ==> cstr */ ++void p80211_totext_displaystr(struct catlistitem *metalist, UINT32 did, ++ UINT8 * itembuf, char *textbuf); ++ ++/* cstr ==> pstr */ ++void p80211_fromtext_displaystr(struct catlistitem *metalist, UINT32 did, ++ UINT8 * itembuf, char *textbuf); ++ ++/* function that checks validity of a displaystr binary value */ ++UINT32 p80211_isvalid_displaystr(struct catlistitem *metalist, UINT32 did, ++ UINT8 * itembuf); ++ ++/*-- OCTETSTR --------------------------------------------------------*/ ++/* pstr ==> "xx:xx:...." */ ++void p80211_totext_octetstr(struct catlistitem *metalist, UINT32 did, ++ UINT8 * itembuf, char *textbuf); ++ ++/* "xx:xx:...." ==> pstr */ ++void p80211_fromtext_octetstr(struct catlistitem *metalist, UINT32 did, ++ UINT8 * itembuf, char *textbuf); ++ ++/* function that checks validity of an octetstr binary value */ ++UINT32 p80211_isvalid_octetstr(struct catlistitem *metalist, UINT32 did, ++ UINT8 * itembuf); ++ ++/*-- BOUNDEDINT ------------------------------------------------------*/ ++/* UINT32 ==> %d */ ++void p80211_totext_boundedint(struct catlistitem *metalist, UINT32 did, ++ UINT8 * itembuf, char *textbuf); ++ ++/* %d ==> UINT32 */ ++void p80211_fromtext_boundedint(struct catlistitem *metalist, UINT32 did, ++ UINT8 * itembuf, char *textbuf); ++ ++/* function that checks validity of a boundedint's binary value */ ++UINT32 p80211_isvalid_boundedint(struct catlistitem *metalist, UINT32 did, ++ UINT8 * itembuf); ++ ++/*-- INT -------------------------------------------------------------*/ ++/* UINT32 ==> %d */ ++void p80211_totext_int(struct catlistitem *metalist, UINT32 did, ++ UINT8 * itembuf, char *textbuf); ++ ++/* %d ==> UINT32 */ ++void p80211_fromtext_int(struct catlistitem *metalist, UINT32 did, ++ UINT8 * itembuf, char *textbuf); ++ ++/* function that checks validity of an int's binary value (always successful) */ ++UINT32 p80211_isvalid_int(struct catlistitem *metalist, UINT32 did, ++ UINT8 * itembuf); ++ ++/*-- ENUMINT ---------------------------------------------------------*/ ++/* UINT32 ==> */ ++void p80211_totext_enumint(struct catlistitem *metalist, UINT32 did, ++ UINT8 * itembuf, char *textbuf); ++ ++/* ==> UINT32 */ ++void p80211_fromtext_enumint(struct catlistitem *metalist, UINT32 did, ++ UINT8 * itembuf, char *textbuf); ++ ++/* function that checks validity of an enum's binary value */ ++UINT32 p80211_isvalid_enumint(struct catlistitem *metalist, UINT32 did, ++ UINT8 * itembuf); ++ ++/*-- INTARRAY --------------------------------------------------------*/ ++/* UINT32[] => %d,%d,%d,... */ ++void p80211_totext_intarray(struct catlistitem *metalist, UINT32 did, ++ UINT8 * itembuf, char *textbuf); ++ ++/* %d,%d,%d,... ==> UINT32[] */ ++void p80211_fromtext_intarray(struct catlistitem *metalist, UINT32 did, ++ UINT8 * itembuf, char *textbuf); ++ ++/* function that checks validity of an integer array's value */ ++UINT32 p80211_isvalid_intarray(struct catlistitem *metalist, UINT32 did, ++ UINT8 * itembuf); ++ ++/*-- BITARRAY --------------------------------------------------------*/ ++/* UINT32 ==> %d,%d,%d,... */ ++void p80211_totext_bitarray(struct catlistitem *metalist, UINT32 did, ++ UINT8 * itembuf, char *textbuf); ++ ++/* %d,%d,%d,... ==> UINT32 */ ++void p80211_fromtext_bitarray(struct catlistitem *metalist, UINT32 did, ++ UINT8 * itembuf, char *textbuf); ++ ++/* function that checks validity of a bit array's value */ ++UINT32 p80211_isvalid_bitarray(struct catlistitem *metalist, UINT32 did, ++ UINT8 * itembuf); ++ ++/*-- MACARRAY --------------------------------------------------------*/ ++void p80211_totext_macarray(struct catlistitem *metalist, UINT32 did, ++ UINT8 * itembuf, char *textbuf); ++ ++void p80211_fromtext_macarray(struct catlistitem *metalist, UINT32 did, ++ UINT8 * itembuf, char *textbuf); ++ ++/* function that checks validity of a MAC address array's value */ ++UINT32 p80211_isvalid_macarray(struct catlistitem *metalist, UINT32 did, ++ UINT8 * itembuf); ++ ++/*-- MIBATTRIUBTE ------------------------------------------------------*/ ++/* ==> */ ++void p80211_totext_getmibattribute(struct catlistitem *metalist, ++ UINT32 did, UINT8 * itembuf, ++ char *textbuf); ++void p80211_totext_setmibattribute(struct catlistitem *metalist, ++ UINT32 did, UINT8 * itembuf, ++ char *textbuf); ++ ++ ++/* ==> */ ++void p80211_fromtext_getmibattribute(struct catlistitem *metalist, ++ UINT32 did, UINT8 * itembuf, ++ char *textbuf); ++void p80211_fromtext_setmibattribute(struct catlistitem *metalist, ++ UINT32 did, UINT8 * itembuf, ++ char *textbuf); ++ ++/* function that checks validity of a mibitem's binary value */ ++UINT32 p80211_isvalid_getmibattribute(struct catlistitem *metalist, ++ UINT32 did, UINT8 * itembuf); ++UINT32 p80211_isvalid_setmibattribute(struct catlistitem *metalist, ++ UINT32 did, UINT8 * itembuf); ++ ++#endif /* _P80211TYPES_H */ +diff -urN x/drivers/net/wireless/acx/version.h y/drivers/net/wireless/acx/version.h +--- x/drivers/net/wireless/acx/version.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/acx/version.h 2004-04-14 04:05:25.000000000 +1000 +@@ -0,0 +1,48 @@ ++/* include/version.h ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Copyright (C) 2003 ACX100 Open Source Project ++ * ++ * The contents of this file are subject to the Mozilla Public ++ * License Version 1.1 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS ++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or ++ * implied. See the License for the specific language governing ++ * rights and limitations under the License. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU Public License version 2 (the "GPL"), in which ++ * case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use ++ * your version of this file under the MPL, indicate your decision ++ * by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL. If you do not delete ++ * the provisions above, a recipient may use your version of this ++ * file under either the MPL or the GPL. ++ * ++ * -------------------------------------------------------------------- ++ * ++ * This code is based on elements which are ++ * Copyright (C) 1999 AbsoluteValue Systems, Inc. All Rights Reserved. ++ * info@linux-wlan.com ++ * http://www.linux-wlan.com ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Inquiries regarding the ACX100 Open Source Project can be ++ * made directly to: ++ * ++ * acx100-users@lists.sf.net ++ * http://acx100.sf.net ++ * ++ * -------------------------------------------------------------------- ++ */ ++ ++#define WLAN_RELEASE "Ver 0.2.0pre8" ++#define WLAN_RELEASE_SUB "v0.2.0pre8" ++#define WLAN_RELEASE_CODE 0x000111 +diff -urN x/drivers/net/wireless/acx/wlan_compat.h y/drivers/net/wireless/acx/wlan_compat.h +--- x/drivers/net/wireless/acx/wlan_compat.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/acx/wlan_compat.h 2004-01-28 07:01:41.000000000 +1100 +@@ -0,0 +1,621 @@ ++/* include/wlan_compat.h ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Copyright (C) 2003 ACX100 Open Source Project ++ * ++ * The contents of this file are subject to the Mozilla Public ++ * License Version 1.1 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.mozilla.org/MPL/ ++ * ++ * Software distributed under the License is distributed on an "AS ++ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or ++ * implied. See the License for the specific language governing ++ * rights and limitations under the License. ++ * ++ * Alternatively, the contents of this file may be used under the ++ * terms of the GNU Public License version 2 (the "GPL"), in which ++ * case the provisions of the GPL are applicable instead of the ++ * above. If you wish to allow the use of your version of this file ++ * only under the terms of the GPL and not to allow others to use ++ * your version of this file under the MPL, indicate your decision ++ * by deleting the provisions above and replace them with the notice ++ * and other provisions required by the GPL. If you do not delete ++ * the provisions above, a recipient may use your version of this ++ * file under either the MPL or the GPL. ++ * ++ * -------------------------------------------------------------------- ++ * ++ * This code is based on elements which are ++ * Copyright (C) 1999 AbsoluteValue Systems, Inc. All Rights Reserved. ++ * info@linux-wlan.com ++ * http://www.linux-wlan.com ++ * ++ * -------------------------------------------------------------------- ++ * ++ * Inquiries regarding the ACX100 Open Source Project can be ++ * made directly to: ++ * ++ * acx100-users@lists.sf.net ++ * http://acx100.sf.net ++ * ++ * -------------------------------------------------------------------- ++ */ ++ ++#ifndef _WLAN_COMPAT_H ++#define _WLAN_COMPAT_H ++ ++/*=============================================================*/ ++/*------ Establish Platform Identity --------------------------*/ ++/*=============================================================*/ ++/* Key macros: */ ++/* WLAN_CPU_FAMILY */ ++#define WLAN_Ix86 1 ++#define WLAN_PPC 2 ++#define WLAN_Ix96 3 ++#define WLAN_ARM 4 ++#define WLAN_ALPHA 5 ++#define WLAN_MIPS 6 ++#define WLAN_HPPA 7 ++/* WLAN_CPU_CORE */ ++#define WLAN_I386CORE 1 ++#define WLAN_PPCCORE 2 ++#define WLAN_I296 3 ++#define WLAN_ARMCORE 4 ++#define WLAN_ALPHACORE 5 ++#define WLAN_MIPSCORE 6 ++#define WLAN_HPPACORE 7 ++/* WLAN_CPU_PART */ ++#define WLAN_I386PART 1 ++#define WLAN_MPC860 2 ++#define WLAN_MPC823 3 ++#define WLAN_I296SA 4 ++#define WLAN_PPCPART 5 ++#define WLAN_ARMPART 6 ++#define WLAN_ALPHAPART 7 ++#define WLAN_MIPSPART 8 ++#define WLAN_HPPAPART 9 ++/* WLAN_SYSARCH */ ++#define WLAN_PCAT 1 ++#define WLAN_MBX 2 ++#define WLAN_RPX 3 ++#define WLAN_LWARCH 4 ++#define WLAN_PMAC 5 ++#define WLAN_SKIFF 6 ++#define WLAN_BITSY 7 ++#define WLAN_ALPHAARCH 7 ++#define WLAN_MIPSARCH 9 ++#define WLAN_HPPAARCH 10 ++/* WLAN_OS */ ++#define WLAN_LINUX_KERNEL 1 ++#define WLAN_LINUX_USER 2 ++/* WLAN_HOSTIF (generally set on the command line, not detected) */ ++#define WLAN_PCMCIA 1 ++#define WLAN_ISA 2 ++#define WLAN_PCI 3 ++#define WLAN_USB 4 ++#define WLAN_PLX 5 ++ ++/* Note: the PLX HOSTIF above refers to some vendors implementations for */ ++/* PCI. It's a PLX chip that is a PCI to PCMCIA adapter, but it */ ++/* isn't a real PCMCIA host interface adapter providing all the */ ++/* card&socket services. */ ++ ++/* Lets try to figure out what we've got. Kernel mode or User mode? */ ++#if defined(__KERNEL__) ++#define WLAN_OS WLAN_LINUX_KERNEL ++#else ++#define WLAN_OS WLAN_LINUX_USER ++#endif ++ ++#ifdef __powerpc__ ++#ifndef __ppc__ ++#define __ppc__ ++#endif ++#endif ++ ++#if (defined(CONFIG_PPC) || defined(CONFIG_8xx)) ++#ifndef __ppc__ ++#define __ppc__ ++#endif ++#endif ++ ++#if defined(__KERNEL__) ++#if defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__) ++#define WLAN_CPU_FAMILY WLAN_Ix86 ++#define WLAN_CPU_CORE WLAN_I386CORE ++#define WLAN_CPU_PART WLAN_I386PART ++#define WLAN_SYSARCH WLAN_PCAT ++#elif defined(__ppc__) ++#define WLAN_CPU_FAMILY WLAN_PPC ++#define WLAN_CPU_CORE WLAN_PPCCORE ++#if defined(CONFIG_MBX) ++#define WLAN_CPU_PART WLAN_MPC860 ++#define WLAN_SYSARCH WLAN_MBX ++#elif defined(CONFIG_RPXLITE) ++#define WLAN_CPU_PART WLAN_MPC823 ++#define WLAN_SYSARCH WLAN_RPX ++#elif defined(CONFIG_RPXCLASSIC) ++#define WLAN_CPU_PART WLAN_MPC860 ++#define WLAN_SYSARCH WLAN_RPX ++#else ++#define WLAN_CPU_PART WLAN_PPCPART ++#define WLAN_SYSARCH WLAN_PMAC ++#endif ++#elif defined(__arm__) ++#define WLAN_CPU_FAMILY WLAN_ARM ++#define WLAN_CPU_CORE WLAN_ARMCORE ++#define WLAN_CPU_PART WLAN_ARM_PART ++#define WLAN_SYSARCH WLAN_SKIFF ++#elif defined(__alpha__) ++#define WLAN_CPU_FAMILY WLAN_ALPHA ++#define WLAN_CPU_CORE WLAN_ALPHACORE ++#define WLAN_CPU_PART WLAN_ALPHAPART ++#define WLAN_SYSARCH WLAN_ALPHAARCH ++#elif defined(__mips__) ++#define WLAN_CPU_FAMILY WLAN_MIPS ++#define WLAN_CPU_CORE WLAN_MIPSCORE ++#define WLAN_CPU_PART WLAN_MIPSPART ++#define WLAN_SYSARCH WLAN_MIPSARCH ++#elif defined(__hppa__) ++#define WLAN_CPU_FAMILY WLAN_HPPA ++#define WLAN_CPU_CORE WLAN_HPPACORE ++#define WLAN_CPU_PART WLAN_HPPAPART ++#define WLAN_SYSARCH WLAN_HPPAARCH ++#else ++#error "No CPU identified!" ++#endif ++#endif /* __KERNEL__ */ ++ ++/* ++ Some big endian machines implicitly do all I/O in little endian mode. ++ ++ In particular: ++ Linux/PPC on PowerMacs (PCI) ++ Arm/Intel Xscale (PCI) ++ ++ This may also affect PLX boards and other BE &| PPC platforms; ++ as new ones are discovered, add them below. ++*/ ++ ++#if (WLAN_HOSTIF == WLAN_PCI) ++#if ((WLAN_SYSARCH == WLAN_SKIFF) || (WLAN_SYSARCH == WLAN_PMAC)) ++#define REVERSE_ENDIAN ++#endif ++#endif ++ ++/*=============================================================*/ ++/*------ Bit settings -----------------------------------------*/ ++/*=============================================================*/ ++ ++#define BIT0 0x00000001 ++#define BIT1 0x00000002 ++#define BIT2 0x00000004 ++#define BIT3 0x00000008 ++#define BIT4 0x00000010 ++#define BIT5 0x00000020 ++#define BIT6 0x00000040 ++#define BIT7 0x00000080 ++#define BIT8 0x00000100 ++#define BIT9 0x00000200 ++#define BIT10 0x00000400 ++#define BIT11 0x00000800 ++#define BIT12 0x00001000 ++#define BIT13 0x00002000 ++#define BIT14 0x00004000 ++#define BIT15 0x00008000 ++#define BIT16 0x00010000 ++#define BIT17 0x00020000 ++#define BIT18 0x00040000 ++#define BIT19 0x00080000 ++#define BIT20 0x00100000 ++#define BIT21 0x00200000 ++#define BIT22 0x00400000 ++#define BIT23 0x00800000 ++#define BIT24 0x01000000 ++#define BIT25 0x02000000 ++#define BIT26 0x04000000 ++#define BIT27 0x08000000 ++#define BIT28 0x10000000 ++#define BIT29 0x20000000 ++#define BIT30 0x40000000 ++#define BIT31 0x80000000 ++ ++typedef unsigned char UINT8; ++typedef unsigned short UINT16; ++typedef unsigned long UINT32; ++ ++typedef signed char INT8; ++typedef signed short INT16; ++typedef signed long INT32; ++ ++typedef unsigned int UINT; ++typedef signed int INT; ++ ++typedef unsigned long long UINT64; ++typedef signed long long INT64; ++ ++#define UINT8_MAX (0xffUL) ++#define UINT16_MAX (0xffffUL) ++#define UINT32_MAX (0xffffffffUL) ++ ++#define INT8_MAX (0x7fL) ++#define INT16_MAX (0x7fffL) ++#define INT32_MAX (0x7fffffffL) ++ ++/*=============================================================*/ ++/*------ Compiler Portability Macros --------------------------*/ ++/*=============================================================*/ ++#define __WLAN_ATTRIB_PACK__ __attribute__ ((packed)) ++#define __WLAN_PRAGMA_PACK1__ ++#define __WLAN_PRAGMA_PACKDFLT__ ++#define __WLAN_INLINE__ inline ++#define WLAN_MIN_ARRAY 0 ++ ++/*=============================================================*/ ++/*------ OS Portability Macros --------------------------------*/ ++/*=============================================================*/ ++ ++#ifndef WLAN_DBVAR ++#define WLAN_DBVAR wlan_debug ++#endif ++ ++#if (WLAN_OS == WLAN_LINUX_KERNEL) ++#define WLAN_LOG_ERROR0(x) printk(KERN_ERR "%s: " x , __FUNCTION__ ); ++#define WLAN_LOG_ERROR1(x,n) printk(KERN_ERR "%s: " x , __FUNCTION__ , (n)); ++#define WLAN_LOG_ERROR2(x,n1,n2) printk(KERN_ERR "%s: " x , __FUNCTION__ , (n1), (n2)); ++#define WLAN_LOG_ERROR3(x,n1,n2,n3) printk(KERN_ERR "%s: " x , __FUNCTION__, (n1), (n2), (n3)); ++#define WLAN_LOG_ERROR4(x,n1,n2,n3,n4) printk(KERN_ERR "%s: " x , __FUNCTION__, (n1), (n2), (n3), (n4)); ++ ++#define WLAN_LOG_WARNING0(x) printk(KERN_WARNING "%s: " x , __FUNCTION__); ++#define WLAN_LOG_WARNING1(x,n) printk(KERN_WARNING "%s: " x , __FUNCTION__, (n)); ++#define WLAN_LOG_WARNING2(x,n1,n2) printk(KERN_WARNING "%s: " x , __FUNCTION__, (n1), (n2)); ++#define WLAN_LOG_WARNING3(x,n1,n2,n3) printk(KERN_WARNING "%s: " x , __FUNCTION__, (n1), (n2), (n3)); ++#define WLAN_LOG_WARNING4(x,n1,n2,n3,n4) printk(KERN_WARNING "%s: " x , __FUNCTION__ , (n1), (n2), (n3), (n4)); ++ ++#define WLAN_LOG_NOTICE0(x) printk(KERN_NOTICE "%s: " x , __FUNCTION__); ++#define WLAN_LOG_NOTICE1(x,n) printk(KERN_NOTICE "%s: " x , __FUNCTION__, (n)); ++#define WLAN_LOG_NOTICE2(x,n1,n2) printk(KERN_NOTICE "%s: " x , __FUNCTION__, (n1), (n2)); ++#define WLAN_LOG_NOTICE3(x,n1,n2,n3) printk(KERN_NOTICE "%s: " x , __FUNCTION__, (n1), (n2), (n3)); ++#define WLAN_LOG_NOTICE4(x,n1,n2,n3,n4) printk(KERN_NOTICE "%s: " x , __FUNCTION__, (n1), (n2), (n3), (n4)); ++ ++#define WLAN_LOG_INFO0(x) printk(KERN_INFO x); ++#define WLAN_LOG_INFO1(x,n) printk(KERN_INFO x, (n)); ++#define WLAN_LOG_INFO2(x,n1,n2) printk(KERN_INFO x, (n1), (n2)); ++#define WLAN_LOG_INFO3(x,n1,n2,n3) printk(KERN_INFO x, (n1), (n2), (n3)); ++#define WLAN_LOG_INFO4(x,n1,n2,n3,n4) printk(KERN_INFO x, (n1), (n2), (n3), (n4)); ++#define WLAN_LOG_INFO5(x,n1,n2,n3,n4,n5) printk(KERN_INFO x, (n1), (n2), (n3), (n4), (n5)); ++ ++#if defined(WLAN_INCLUDE_DEBUG) ++#define WLAN_ASSERT(c) if ((!(c)) && WLAN_DBVAR >= 1) { \ ++ WLAN_LOG_DEBUG0(1, "Assertion failure!\n"); } ++#define WLAN_HEX_DUMP( l, x, p, n) if( WLAN_DBVAR >= (l) ){ \ ++ int __i__; \ ++ printk(KERN_DEBUG x ":"); \ ++ for( __i__=0; __i__ < (n); __i__++) \ ++ printk( " %02x", ((UINT8*)(p))[__i__]); \ ++ printk("\n"); } ++ ++#define DBFENTER { if ( WLAN_DBVAR >= 4 ){ WLAN_LOG_DEBUG0(3,"Enter\n"); } } ++#define DBFEXIT { if ( WLAN_DBVAR >= 4 ){ WLAN_LOG_DEBUG0(3,"Exit\n"); } } ++ ++#define WLAN_LOG_DEBUG0(l,x) if ( WLAN_DBVAR >= (l)) printk(KERN_DEBUG "%s: " x , __FUNCTION__ ); ++#define WLAN_LOG_DEBUG1(l,x,n) if ( WLAN_DBVAR >= (l)) printk(KERN_DEBUG "%s: " x , __FUNCTION__ , (n)); ++#define WLAN_LOG_DEBUG2(l,x,n1,n2) if ( WLAN_DBVAR >= (l)) printk(KERN_DEBUG "%s: " x , __FUNCTION__ , (n1), (n2)); ++#define WLAN_LOG_DEBUG3(l,x,n1,n2,n3) if ( WLAN_DBVAR >= (l)) printk(KERN_DEBUG "%s: " x , __FUNCTION__ , (n1), (n2), (n3)); ++#define WLAN_LOG_DEBUG4(l,x,n1,n2,n3,n4) if ( WLAN_DBVAR >= (l)) printk(KERN_DEBUG "%s: " x , __FUNCTION__ , (n1), (n2), (n3), (n4)); ++#define WLAN_LOG_DEBUG5(l,x,n1,n2,n3,n4,n5) if ( WLAN_DBVAR >= (l)) printk(KERN_DEBUG "%s: " x , __FUNCTION__ , (n1), (n2), (n3), (n4), (n5)); ++#define WLAN_LOG_DEBUG6(l,x,n1,n2,n3,n4,n5,n6) if ( WLAN_DBVAR >= (l)) printk(KERN_DEBUG "%s: " x , __FUNCTION__ , (n1), (n2), (n3), (n4), (n5), (n6)); ++#else ++#define WLAN_ASSERT(c) ++#define WLAN_HEX_DUMP( l, s, p, n) ++ ++#define DBFENTER ++#define DBFEXIT ++ ++#define WLAN_LOG_DEBUG0(l, s) ++#define WLAN_LOG_DEBUG1(l, s,n) ++#define WLAN_LOG_DEBUG2(l, s,n1,n2) ++#define WLAN_LOG_DEBUG3(l, s,n1,n2,n3) ++#define WLAN_LOG_DEBUG4(l, s,n1,n2,n3,n4) ++#define WLAN_LOG_DEBUG5(l, s,n1,n2,n3,n4,n5) ++#endif ++#else ++#define WLAN_LOG_ERROR0(s) ++#define WLAN_LOG_ERROR1(s,n) ++#define WLAN_LOG_ERROR2(s,n1,n2) ++#define WLAN_LOG_ERROR3(s,n1,n2,n3) ++#define WLAN_LOG_ERROR4(s,n1,n2,n3,n4) ++ ++#define WLAN_LOG_WARNING0(s) ++#define WLAN_LOG_WARNING1(s,n) ++#define WLAN_LOG_WARNING2(s,n1,n2) ++#define WLAN_LOG_WARNING3(s,n1,n2,n3) ++#define WLAN_LOG_WARNING4(s,n1,n2,n3,n4) ++ ++#define WLAN_LOG_NOTICE0(s) ++#define WLAN_LOG_NOTICE1(s,n) ++#define WLAN_LOG_NOTICE2(s,n1,n2) ++#define WLAN_LOG_NOTICE3(s,n1,n2,n3) ++#define WLAN_LOG_NOTICE4(s,n1,n2,n3,n4) ++ ++#define WLAN_ASSERT(c) ++#define WLAN_HEX_DUMP( l, s, p, n) ++ ++#define DBFENTER ++#define DBFEXIT ++ ++#define WLAN_LOG_INFO0(s) ++#define WLAN_LOG_INFO1(s,n) ++#define WLAN_LOG_INFO2(s,n1,n2) ++#define WLAN_LOG_INFO3(s,n1,n2,n3) ++#define WLAN_LOG_INFO4(s,n1,n2,n3,n4) ++#define WLAN_LOG_INFO5(s,n1,n2,n3,n4,n5) ++ ++#define WLAN_LOG_DEBUG0(l, s) ++#define WLAN_LOG_DEBUG1(l, s,n) ++#define WLAN_LOG_DEBUG2(l, s,n1,n2) ++#define WLAN_LOG_DEBUG3(l, s,n1,n2,n3) ++#define WLAN_LOG_DEBUG4(l, s,n1,n2,n3,n4) ++#define WLAN_LOG_DEBUG5(l, s,n1,n2,n3,n4,n5) ++#endif ++ ++#define wlan_ms_per_tick (1000UL / (wlan_ticks_per_sec)) ++#define wlan_ms_to_ticks(n) ( (n) / (wlan_ms_per_tick)) ++#define wlan_tu2ticks(n) ( (n) / (wlan_ms_per_tick)) ++#define WLAN_INT_DISABLE(n) { save_flags((n)); cli(); } ++#define WLAN_INT_ENABLE(n) { sti(); restore_flags((n)); } ++ ++#ifdef CONFIG_SMP ++#define __SMP__ 1 ++#endif ++ ++#ifndef KERNEL_VERSION ++#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) ++#endif ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,17)) ++#define CONFIG_NETLINK 1 ++#endif ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)) ++#define kfree_s(a, b) kfree((a)) ++//#define p80211pb_kfree_s(a,b) kfree((a)) ++#endif ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,2,18)) ++#ifndef init_waitqueue_head ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,0,16)) ++#define init_waitqueue_head(p) (*(p) = NULL) ++#else ++#define init_waitqueue_head(p) init_waitqueue(p) ++#endif ++typedef struct wait_queue *wait_queue_head_t; ++typedef struct wait_queue wait_queue_t; ++#define set_current_state(b) { current->state = (b); mb(); } ++#define init_waitqueue_entry(a, b) { (a)->task = current; } ++#endif ++#endif ++ ++#ifndef wait_event_interruptible_timeout ++// retval == 0; signal met; we're good. ++// retval < 0; interrupted by signal. ++// retval > 0; timed out. ++#define __wait_event_interruptible_timeout(wq, condition, timeout, ret) \ ++do { \ ++ int __ret = 0; \ ++ if (!(condition)) { \ ++ wait_queue_t __wait; \ ++ unsigned long expire; \ ++ init_waitqueue_entry(&__wait, current); \ ++ \ ++ expire = timeout + jiffies; \ ++ add_wait_queue(&wq, &__wait); \ ++ for (;;) { \ ++ set_current_state(TASK_INTERRUPTIBLE); \ ++ if (condition) \ ++ break; \ ++ if (jiffies > expire) { \ ++ ret = jiffies - expire; \ ++ break; \ ++ } \ ++ if (!signal_pending(current)) { \ ++ schedule_timeout(timeout); \ ++ continue; \ ++ } \ ++ ret = -ERESTARTSYS; \ ++ break; \ ++ } \ ++ set_current_state(TASK_RUNNING); \ ++ remove_wait_queue(&wq, &__wait); \ ++ } \ ++} while (0) ++ ++#define wait_event_interruptible_timeout(wq, condition, timeout) \ ++({ \ ++ int __ret = 0; \ ++ if (!(condition)) \ ++ __wait_event_interruptible_timeout(wq, condition, \ ++ timeout, __ret); \ ++ __ret; \ ++}) ++ ++#endif ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,1,90)) ++#define spin_lock(l) do { } while (0) ++#define spin_unlock(l) do { } while (0) ++#define spin_lock_irqsave(l,f) do { save_flags(f); cli(); } while (0) ++#define spin_unlock_irqrestore(l,f) do { restore_flags(f); } while (0) ++#define spin_lock_init(s) do { } while (0) ++#define spin_trylock(l) (1) ++typedef int spinlock_t; ++#endif ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)) ++#ifdef CONFIG_SMP ++#define spin_is_locked(x) (*(volatile char *)(&(x)->lock) <= 0) ++#else ++#define spin_is_locked(l) (0) ++#endif ++#endif ++ ++#ifdef _LINUX_PROC_FS_H ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,25)) ++ ++extern inline struct proc_dir_entry *create_proc_read_entry(const char ++ *name, ++ mode_t mode, ++ struct ++ proc_dir_entry ++ *base, ++ read_proc_t * ++ read_proc, ++ void *data) ++{ ++ struct proc_dir_entry *res = create_proc_entry(name, mode, base); ++ if (res) { ++ res->read_proc = read_proc; ++ res->data = data; ++ } ++ return res; ++} ++#endif ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,29)) ++#ifndef proc_mkdir ++#define proc_mkdir(name, root) create_proc_entry(name, S_IFDIR, root) ++#endif ++#endif ++#endif /* _LINUX_PROC_FS_H */ ++ ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,38)) ++typedef struct device netdevice_t; ++#elif (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,4)) ++typedef struct net_device netdevice_t; ++#else ++#undef netdevice_t ++typedef struct net_device netdevice_t; ++#endif ++ ++#ifdef WIRELESS_EXT ++#if (WIRELESS_EXT < 13) ++struct iw_request_info { ++ __u16 cmd; /* Wireless Extension command */ ++ __u16 flags; /* More to come ;-) */ ++}; ++#endif ++#endif ++ ++/* Workqueue / task queue backwards compatibility stuff */ ++#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,41) ++#include ++#else ++#include ++#define work_struct tq_struct ++#define INIT_WORK INIT_TQUEUE ++#define schedule_work schedule_task ++#endif ++ ++/* Interrupt handler backwards compatibility stuff */ ++#ifndef IRQ_NONE ++#define IRQ_NONE ++#define IRQ_HANDLED ++typedef void irqreturn_t; ++#endif ++ ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,1,18)) ++#define MODULE_PARM(a,b) extern int __bogus_decl ++#define MODULE_AUTHOR(a) extern int __bogus_decl ++#define MODULE_DESCRIPTION(a) extern int __bogus_decl ++#define MODULE_SUPPORTED_DEVICE(a) extern int __bogus_decl ++#undef GET_USE_COUNT ++#define GET_USE_COUNT(m) mod_use_count_ ++#endif ++ ++#ifndef MODULE_LICENSE ++#define MODULE_LICENSE(m) extern int __bogus_decl ++#endif ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,41) // more or less ++#define WLAN_MOD_INC_USE_COUNT MOD_INC_USE_COUNT ++#define WLAN_MOD_DEC_USE_COUNT MOD_DEC_USE_COUNT ++#else ++#define WLAN_MOD_INC_USE_COUNT ++#define WLAN_MOD_DEC_USE_COUNT ++#endif ++ ++/* TODO: Do we care about this? */ ++#ifndef MODULE_DEVICE_TABLE ++#define MODULE_DEVICE_TABLE(foo,bar) ++#endif ++ ++#define wlan_minutes2ticks(a) ((a)*(wlan_ticks_per_sec * 60)) ++#define wlan_seconds2ticks(a) ((a)*(wlan_ticks_per_sec)) ++ ++/*=============================================================*/ ++/*------ Hardware Portability Macros --------------------------*/ ++/*=============================================================*/ ++ ++#define ieee2host16(n) __le16_to_cpu(n) ++#define ieee2host32(n) __le32_to_cpu(n) ++#define host2ieee16(n) __cpu_to_le16(n) ++#define host2ieee32(n) __cpu_to_le32(n) ++ ++#if (WLAN_CPU_FAMILY == WLAN_PPC) ++#define wlan_inw(a) in_be16((unsigned short *)((a)+_IO_BASE)) ++#define wlan_inw_le16_to_cpu(a) inw((a)) ++#define wlan_outw(v,a) out_be16((unsigned short *)((a)+_IO_BASE), (v)) ++#define wlan_outw_cpu_to_le16(v,a) outw((v),(a)) ++#else ++#define wlan_inw(a) inw((a)) ++#define wlan_inw_le16_to_cpu(a) __cpu_to_le16(inw((a))) ++#define wlan_outw(v,a) outw((v),(a)) ++#define wlan_outw_cpu_to_le16(v,a) outw(__cpu_to_le16((v)),(a)) ++#endif ++ ++/*=============================================================*/ ++/*--- General Macros ------------------------------------------*/ ++/*=============================================================*/ ++ ++#define wlan_max(a, b) (((a) > (b)) ? (a) : (b)) ++#define wlan_min(a, b) (((a) < (b)) ? (a) : (b)) ++ ++#define wlan_isprint(c) (((c) > (0x19)) && ((c) < (0x7f))) ++ ++#define wlan_hexchar(x) (((x) < 0x0a) ? ('0' + (x)) : ('a' + ((x) - 0x0a))) ++ ++/* Create a string of printable chars from something that might not be */ ++/* It's recommended that the str be 4*len + 1 bytes long */ ++#define wlan_mkprintstr(buf, buflen, str, strlen) \ ++{ \ ++ int i = 0; \ ++ int j = 0; \ ++ memset(str, 0, (strlen)); \ ++ for (i = 0; i < (buflen); i++) { \ ++ if ( wlan_isprint((buf)[i]) ) { \ ++ (str)[j] = (buf)[i]; \ ++ j++; \ ++ } else { \ ++ (str)[j] = '\\'; \ ++ (str)[j+1] = 'x'; \ ++ (str)[j+2] = wlan_hexchar(((buf)[i] & 0xf0) >> 4); \ ++ (str)[j+3] = wlan_hexchar(((buf)[i] & 0x0f)); \ ++ j += 4; \ ++ } \ ++ } \ ++} ++ ++/*=============================================================*/ ++/*--- Variables -----------------------------------------------*/ ++/*=============================================================*/ ++ ++extern int wlan_debug; ++extern int wlan_ethconv; /* What's the default ethconv? */ ++ ++/*=============================================================*/ ++/*--- Functions -----------------------------------------------*/ ++/*=============================================================*/ ++#endif /* _WLAN_COMPAT_H */ --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/adm8211.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/adm8211.dpatch @@ -0,0 +1,7111 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: ADMtek ADM8211 support +## DP: Patch author: Michael Wu +## DP: Upstream status: unknown + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN x/drivers/net/wireless/Kconfig y/drivers/net/wireless/Kconfig +--- x/drivers/net/wireless/Kconfig 2004-09-18 13:42:43.000000000 +1000 ++++ y/drivers/net/wireless/Kconfig 2004-09-21 18:10:19.000000000 +1000 +@@ -315,6 +315,34 @@ + ---help--- + This is the driver for PCI cards with the TI ACX100 chipset. + ++config ADM8211 ++ tristate "ADMtek ADM8211 support" ++ depends on NET_RADIO && PCI && EXPERIMENTAL ++ ---help--- ++ This driver is for ADM8211A, ADM8211B, and ADM8211C based cards. ++ These are PCI/mini-PCI/Cardbus 802.11b chips found in cards like: ++ ++ Xterasys Cardbus XN-2411b ++ Blitz NetWave Point PC ++ TrendNet 221pc ++ Belkin F5D6001 ++ SMC 2635W ++ Linksys WPC11 v1 ++ Fiberline FL-WL-200X ++ 3com Office Connect (3CRSHPW796) ++ Corega WLPCIB-11 ++ SMC 2602W V2 EU ++ D-Link DWL-520 Revision C ++ ++ However, some of these cards have been replaced with other chips ++ like the RTL8180L (Xterasys Cardbus XN-2411b, Belkin F5D6001) or ++ the Ralink RT2400 (SMC2635W) without a model number change. ++ ++ Thanks to Infineon-ADMtek for their support of this driver. ++ ++ The latest version of this driver can be found at: ++ ++ + config AIRO + tristate "Cisco/Aironet 34X/35X/4500/4800 ISA and PCI cards" + depends on NET_RADIO && ISA && (PCI || BROKEN) +diff -urN x/drivers/net/wireless/Makefile y/drivers/net/wireless/Makefile +--- x/drivers/net/wireless/Makefile 2004-09-18 13:42:43.000000000 +1000 ++++ y/drivers/net/wireless/Makefile 2004-09-21 18:10:44.000000000 +1000 +@@ -7,6 +7,7 @@ + obj-$(CONFIG_WLAN_NG) += wlan-ng/ + obj-$(CONFIG_PRISM2) += prism2/ + obj-$(CONFIG_ACX100) += acx/ ++obj-$(CONFIG_ADM8211) += adm8211/ + + obj-$(CONFIG_STRIP) += strip.o + obj-$(CONFIG_ARLAN) += arlan.o +diff -urN x/drivers/net/wireless/adm8211/Changelog y/drivers/net/wireless/adm8211/Changelog +--- x/drivers/net/wireless/adm8211/Changelog 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/adm8211/Changelog 2004-09-16 15:16:07.000000000 +1000 +@@ -0,0 +1,161 @@ ++20040916 ++- Use RF3000 BBP register defines from adm8211.h ++- Another attempt at hidden SSID support ++20040912 ++- Whitespace changes ++- Dead code removed from link change code ++- MAC addr setting code simplified ++- Cleanup tx rate setting IOCTL ++- Remove unneeded code in wep setting IOCTL ++- Use dev->name in private IOCTLs in printk ++20040911 ++- Cleanup channel setting code ++- Try to support cloaked ssids ++- Init BBP for adm8211b twice ++20040901 ++- Updated Fedora Core 2 HOWTO from author ++- Some modifications of FC2 HOWTO with suggestions from Per Bjornsson ++- Report current TX power ++- Cleanup error bit ignoring for ADM8211B/C + Ad-hoc ++20040831 ++- Use DMA_32BIT_MASK macro. yay. ++- Use pci_dma_sync_single_for_device and pci_dma_sync_single_for_cpu ++- Add more messages for ad-hoc mode ++- Uncomment some beacon configuration code ++20040825 ++- Replace "select BSSID" message with better message ++- Fix compile on 2.4 by adding compat.h to adm8211_ioctl ++20040821 ++- Fix kernel.patch ++- Improve/simplify authentication/association TX/RX printks ++- Suspend/resume tested & fixed ++20040820 ++- Changed dev->priv to netdev_priv(dev) ++- Use skb_queue_purge ++- Remove module options for enabling/disabling hardware WEP - no one has reported usage of this. ++- Updated kernel.patch to source Kconfig from this dir ++- TX power IOCTLs added, not yet used ++20040817 ++- Change Makefile so it works inside the kernel source tree ++- Added kernel.patch, against 2.6.8.1 ++- Updated INSTALL file with info on putting driver into kernel tree ++- Disable BBP warning on adm8211b again ++20040816 ++- Remove alternate SYN writing code for rfmd2958 ++- Return 1 in ieee80211_data_tx when we're waiting for the card to associate ++- Check MAC for validity, generate a valid one if necessary ++- Add eeprom struct for better code self-documentation ++20040815 ++- Fix compile error ++20040814 ++- Adjust adm8211_set_rx_mode ++- Separate ieee80211 and adm8211_hw code better ++- Add alternate SYN writing code for rfmd2958 ++- Changed BSSID generation in adhoc mode slightly ++- Initial suspend/resume support ++20040812 ++- Start RX/TX early ++- Fix memleak and other things in fragment reassembly ++- Make adm8211b and up use error bits if not in adhoc mode ++- Made direct syn writing function for rfmd2948.. not used yet ++20040811 ++- Adhoc fixed ++- Remove unnecessary check in ieee80211_encaps ++- Retry limit ioctl finished ++20040810 ++- Makefile-2.4 now checks KDIR ++- 2.4 build fixes ++- Move things around in adm8211_probe ++- Added NOTES.FC2, contributed by Kyrre Ness Sjobak . ++20040809 ++- Move compatibility stuff to compat.h ++- Added watchdog timer for ADM8211B to restart the card if it gets stuck ++- Remove some unnecessary code in ring setup ++- Fix value written to WCSR ++- Disable hardware link off detection for now ++20040804 ++- Adjust MWI enabling ++- Really fix monitor mode ++- Cleanup adm8211_interrupt ++- Fix value written to BPLI ++20040731 ++- Cleanup in adm8211_rx_skb ++- Bunch of fixes to minimize usage count problem ++20040730 ++- Added module parameters to disable hardware wep for RX (soft_rxwep) and TX (soft_txwep). Set to non-zero value to use. ++- Fixed ieee80211_stop deadlock ++20040726 ++- Fixed crash after authentication attempt times out 5 times for a single AP ++- register_netdev only when everything is ready ++- Display pci_name when error occurs during probe ++- Disable postwrite warning on adm8211b ++20040724 ++- Monitor mode fixed ++- Move the setting of dev->last_rx ++20040719 ++- MWI enabled ++- Fix promiscuous mode for WEP. Some WEP disabling code for monitor mode removed, not needed. ++- Cleaned up TX rate selection code ++- Removed some unnecessary code ++- Removed Philips SA2400A - not used anymore ++20040715 ++- Hardware WEP fixed ++- RFMD2958 and MAX2420 transceiver support for ADM8211C added. No hardware to test though.. ++20040714 ++- Clean up ring on device removal ++- Do not receive data packets before association ++- Tiny syn writing cleanup ++- Ensure packet is unicast before doing frag or rts ++- 2.4 compile fix (no SET_NETDEV_DEV) ++20040711 ++- Big cleanups to adm8211_tx and all the code that calls it ++20040707 ++- More misc cleanups ++- Mode change bug fix ++20040705 ++- Fix select_bssid function ++- Bunch of fixes for adhoc so things don't crash ++20040704 ++- Improve authentication failure ++- Don't start queue until associated (makes dhcpcd faster..) ++- Started retry count IOCTLs ++20040702 ++- Save/use NAR register state in adm8211_priv ++- Possible workaround for SMC 2635W bug ++- Use AVS Capture Frame Format v2 for monitor mode ++20040630 ++- Reassemble 802.11 fragments properly ++- Fix WEP cleanup ++- Removed some magic numbers ++- Finished hardware beacon support for adhoc (or at least the hard part) ++- Other misc stuff ++20040626 ++- Association request changed to match admtek's code.. need to check if that is correct ++- Do not authenticate with adhoc station when in managed mode, and vice versa ++- Clean up some wep code ++- Eep. Fix bad rfmd2958 writing code (used in rev 0x20). Strange, the AL2210 isn't affected by the same bug.. ++- Another silly mistake. MMIRD1 wasn't actually written to for rev 0x20... ++20040624 ++- RTS threshold used now. Needs testing ++- Added a simple 2.4 makefile from SuD ++- Improved writing to SRAM ++- PCI ID for 3Com 3CRSHPW796 added. Needs testing ++- Some work on adhoc ++20040623 ++- Software WEP fixed ++20040622 ++- Added RTS ioctls. Not actually used by the driver yet. ++- Removed some unnecessary/dead code ++- Improved error reporting on association failure ++- Interface doesn't have to be down to switch wireless modes anymore ++20040617 ++- Even more (little) changes to try to get adm8211b working ++20040616 ++- More adm8211b stuff ++- Makefile changed to support both 2.6 and 2.4 (inspired by a makefile created by SCR ) ++- Make link light turn on after association, not anytime before ++20040615 ++- Changelog created ++- Locking bug triggered by more than 6 failed association attempts fixed. ++- Other changes that I can't remember ++ +diff -urN x/drivers/net/wireless/adm8211/INSTALL y/drivers/net/wireless/adm8211/INSTALL +--- x/drivers/net/wireless/adm8211/INSTALL 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/adm8211/INSTALL 2004-08-25 05:46:47.000000000 +1000 +@@ -0,0 +1,22 @@ ++Installing this driver should be fairly easy if you meet the prerequisites. ++ ++For 2.6: ++1. Latest module-init-tools. Ok, you probably don't need the very latest, but I don't want to guess what the minimum version should be, so just make sure you have the latest. ++2. Latest gcc 3.x or 2.95.x. Chances are, many many other versions also work - I'm just not supporting them. ++3. A fairly recent 2.6.x kernel, but the latest is always the recommended. Anything released within the last three months should be fine. As usual, older versions will likely work, but I don't want to deal with any potential problems. The included makefile will fail with kernels older than 2.6.6. 2.6.6 itself will produce a (relatively harmless) warning. You must have your kernel tree installed and configured for kbuild to build your module. ++4. Wireless tools. Latest is prefered, but having slightly older versions are very unlikely to cause problems, at least compared to potential problems with the driver itself. ++5. Latest hotplug scripts. This is somewhat optional, but it makes things easier. ++ ++To install, just run make install. You can also do make, then make modules_install, which uses the kernel build system to install the modules. However, if you do it the second way, you'll need to run depmod -a manually. ++ ++To put the driver inside the kernel source tree (2.6 only): ++1. Apply kernel.patch ++2. Copy the entire adm8211 directory into $(KERNEL_SOURCE)/drivers/net/wireless ++ ++Then you can configure/compile/install the driver like any other driver included with the kernel. Note that the driver is installed to a different place than usual when compiled & installed inside the kernel tree, so be careful when upgrading. ++ ++For 2.4: ++Compiling with make, make install or make, make modules_install should work. 2.4 support is still experimental. There is also an alternate makefile (Makefile-2.4) that you can use, but it's not recommended. The default Makefile uses the kernel's kbuild to build the module so the proper compiler flags and such are used. (however, it does not always work) The alternate makefile will only work in x86, doesn't necessarily use the same compiler flags as your kernel used, and doesn't have as many targets as the default makefile. However, it's likely to work in most cases, and is how most out of tree modules in 2.4 are compiled. ++ ++For both: ++To load the driver if it isn't automatically loaded, just run modprobe adm8211. +diff -urN x/drivers/net/wireless/adm8211/Kconfig y/drivers/net/wireless/adm8211/Kconfig +--- x/drivers/net/wireless/adm8211/Kconfig 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/adm8211/Kconfig 2004-08-28 12:42:41.000000000 +1000 +@@ -0,0 +1,27 @@ ++config ADM8211 ++ tristate "ADMtek ADM8211 support" ++ depends on NET_RADIO && PCI && EXPERIMENTAL ++ ---help--- ++ This driver is for ADM8211A, ADM8211B, and ADM8211C based cards. ++ These are PCI/mini-PCI/Cardbus 802.11b chips found in cards like: ++ ++ Xterasys Cardbus XN-2411b ++ Blitz NetWave Point PC ++ TrendNet 221pc ++ Belkin F5D6001 ++ SMC 2635W ++ Linksys WPC11 v1 ++ Fiberline FL-WL-200X ++ 3com Office Connect (3CRSHPW796) ++ Corega WLPCIB-11 ++ SMC 2602W V2 EU ++ D-Link DWL-520 Revision C ++ ++ However, some of these cards have been replaced with other chips ++ like the RTL8180L (Xterasys Cardbus XN-2411b, Belkin F5D6001) or ++ the Ralink RT2400 (SMC2635W) without a model number change. ++ ++ Thanks to Infineon-ADMtek for their support of this driver. ++ ++ The latest version of this driver can be found at: ++ +diff -urN x/drivers/net/wireless/adm8211/Makefile y/drivers/net/wireless/adm8211/Makefile +--- x/drivers/net/wireless/adm8211/Makefile 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/adm8211/Makefile 2004-09-21 18:08:12.000000000 +1000 +@@ -0,0 +1,2 @@ ++adm8211-objs := adm8211_hw.o adm8211_ioctl.o ieee80211.o wep.o ++obj-$(CONFIG_ADM8211) += adm8211.o +diff -urN x/drivers/net/wireless/adm8211/NOTES y/drivers/net/wireless/adm8211/NOTES +--- x/drivers/net/wireless/adm8211/NOTES 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/adm8211/NOTES 2004-09-11 14:33:50.000000000 +1000 +@@ -0,0 +1,47 @@ ++Software WEP decryption no longer requires arc4 or crypto api. It currently uses the software WEP implementation (a stripped down version) from the hostap driver. ++ ++This card has been tested and known to work on: ++ Xterasys Cardbus XN-2411b ++ Blitz - NetWave Point PC ++ TrendNet 221pc ++ Belkin F5D6001 ++ SMC 2635W ++ Linksys WPC11 v1 ++ Fiberline FL-WL-200X ++ 3com office connect card (3CRSHPW796) ++ Corega WLPCIB-11 ++ SMC 2602W V2 EU ++ D-Link DWL-520 Revision C ++ Blitz BWP612 ++ ++Cards made by Runtop (mac addr starts with 00:03:6D) do not seem to work correctly with this driver. ++ ++Note that some cards that use ADM8211 are being replaced with RTL8180L without a change to the model number/name. For example, the Xterasys XN-2411b and Belkin F5D6001. Also, a SMC 2635W has been found with a RaLink RT2400 chip. If the driver is installed correctly yet doesn't work, make sure you really have an ADM8211 based card. ++ ++PCI Revisions: ++ 0x11 (ADM8211A): Should work. ++ 0x15 (ADM8211A?): Unknown. If anyone has one of these, let me know. I assume it should work.. ++ 0x20 (ADM8211B): Commonly found on SMC 2635W cards. Support is being debugged. I don't have one of these to actually test, however. AP mode possible. (but not yet implemented) ++ 0x30 (ADM8211C): Support is completed. ADMtek sent me two samples of this card with an airoha transceiver. AP mode possible. ++ ++Please email me with your card name/info, the kernel messages (dmesg) from the driver about the card (revision, bbp, etc.), and whether or not it worked if it isn't on the list. Note that if the card can't get a dynamic address via dhcp, it's unlikely to work with a staticly assigned address either so there is no need to staticly assign an IP address to your interface unless that's what you already do. ++ ++ADM8211B mostly works. If you have trouble, please contact me. ++ ++Managed mode is supported and well tested. ++ ++Monitor mode is supported and tested. (kismet added support on July 23 in it's development version) ++ ++Adhoc mode is supported, but has problems (link can break w/ more than one system). ++ ++Suspending/resuming works. ++ ++This driver is aiming for integration into the mm series, and then the wireless-2.6 series for advanced features (like hostap mode and wpa). Check the TODO file for the current progress. ++ ++This driver is tested on the latest stable 2.6 kernel (with various patches like mm/ck/suspend2 sometimes) with gcc 3.4.1. ++ ++There are two mailing lists for this driver: ++http://sourmilk.net/mailman/listinfo/adm8211-announce_sourmilk.net ++http://sourmilk.net/mailman/listinfo/adm8211-user_sourmilk.net ++ ++Michael Wu (current maintainer of this driver. please do not bug Jouni, since he does not work on this driver right now) +diff -urN x/drivers/net/wireless/adm8211/NOTES-FC2 y/drivers/net/wireless/adm8211/NOTES-FC2 +--- x/drivers/net/wireless/adm8211/NOTES-FC2 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/adm8211/NOTES-FC2 2004-09-02 11:55:23.000000000 +1000 +@@ -0,0 +1,86 @@ ++(the following is a howto contributed by Kyree Ness Sjøbæk) ++ ++The SMC 2635 W HOWTO (ADM8211 chipset) for Fedora Core 2 ++ ++This howto describes how to install the SMC 2635 W PCMCIA wireless ++adapter on Fedora Core 2. It could probably be adapted to other ++compatible adapters and distributions as well, but this is the equipment ++i have used. ++ ++What you need: ++- A wlan pcmcia card with the adm 8211 chipset, such as the SMC 2635 ++- A 2.6.6 kernel or better (i used the Redhat binary/source rpm version ++"2.6.7-1.494.2.2", which you can download manually, or with a tool such ++as yum or apt. You need the kernel-source, the kernel (can be generated ++from the source, but that is outside the scope of this document). While ++your at it, grab the documentation as well. ++- GCC and friends. Can be installed from the CD, or using ++"system-config-packages" and installing "development tools" from there. ++- kudzu - the redhat hardware detection and installation tool. ++(installed by default) ++- neat alias system-config-network - the redhat network set-up gui ++(installed by default?) ++- The drivers, which you can download from: ++ ++http://aluminum.sourmilk.net/adm8211/index.php?sort=date ++ ++There is also a forum (or at least a thread) dedicated to the drivers, ++just take a look at: ++ ++http://www.linuxquestions.org/questions/showthread.php?s=&threadid=132161&perpage=15&pagenumber=1 ++ ++And two (low traffic) mailing-lists - which are found at: ++http://sourmilk.net/mailman/listinfo/adm8211-announce_sourmilk.net - ++announcments of new driver versions etc ++http://sourmilk.net/mailman/listinfo/adm8211-user_sourmilk.net - General ++discussion, support etc. ++ ++Okay, so this is what we are doing: ++ ++1. Install the new kernel if needed. Install the development-tools. ++Reboot into the new kernel, and make sure everything else works as ++intended. When it does, remove the extra entry for the old kernel in ++/etc/grub.conf so you dont boot it - it will make your card inpossible ++to connect. ++ ++2. Get the latest drivers from this site: ++ ++http://aluminum.sourmilk.net/adm8211/index.php?sort=date ++ ++Make sure you read the "INSTALL" file included - the procedure may have ++changed. ++ ++Unzip the driver, and fire up your terminal. Then do: ++ ++- Login as root, including its paths: ++ $ su - ++ ++- cd into the path where you unzipped the drivers ++ # cd /path/to/drivers/ ++- Compile and install the drivers (this may take a minute) ++ # make install ++- If everything went well - load the newly installed driver ++ # modprobe adm8211 ++- Then run kudzu in order to set up and configure the new network ++device. Make shure the card is connected and the "PWR/ACT" light is on. ++ # kudzu ++- Log out of the terminal. Press control-D until you are logged out. ++ ++The card has now been installed, and you may configure it through the ++"system-config-network" alias "neat" GUI. To open it, run "neat" from ++the run-dialogue, or simply click RedHat-menu -> system-settings -> ++network ++ ++You will see your new device there. Select it and push "edit" in order ++to bring up the configuration dialogue. ++ ++Tips: If you are using gnome, you can activate the wifi applet on the ++taskbar. In order to do it, right-click the taskbar, click Add to panel ++-> Internet -> Wireless Link Monitor. ++ ++Known bugs in the driver (as for 20040831): ++- None AFIC ++ ++This howto was written by Kyrre Ness Sjøbæk. For suggestions etc, ++contact me on: ++kyrre [a-with-a-circle] solution-forge [period] net +diff -urN x/drivers/net/wireless/adm8211/TODO y/drivers/net/wireless/adm8211/TODO +--- x/drivers/net/wireless/adm8211/TODO 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/adm8211/TODO 2004-09-12 09:12:47.000000000 +1000 +@@ -0,0 +1,34 @@ ++ ++Things that need to be tested ++ - Multicast ++ - RTS ++ - Fragment reassembly ++ - TX fragment ++ - allow connecting to APs w/ hidden SSIDs ++ - adm8211b ++ - make work on first try ++ ++Things to be completed before being sent to the mm series ++ - Adhoc mode (needs to be fixed) ++ - clean up duplicate frame handling ++ - fix ping problem ++ - fix the stupid LinkOn/LinkOff crap ++ - tx power ioctls (in progress) ++ - private IOCTLs ++ - clean up ++ - add ioctls to adjust bbp values ++ - antenna ++ - antenna power ++ - LPF cutoff ++ - LNAGS threshold ++ ++Things scheduled for work after above is completed ++ - NAPI support ++ ++Things scheduled for work in the wireless-2.6 branch (after above is finished) ++ - AP mode ++ - 802.11i support ++ - PCF support ++ - Power Management (beyond software suspend/resume) ++ - WOL ++ - Ethtool support +diff -urN x/drivers/net/wireless/adm8211/adm8211.h y/drivers/net/wireless/adm8211/adm8211.h +--- x/drivers/net/wireless/adm8211/adm8211.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/adm8211/adm8211.h 2004-09-15 12:46:45.000000000 +1000 +@@ -0,0 +1,482 @@ ++#ifndef ADM8211_H ++#define ADM8211_H ++ ++#include "ieee80211.h" ++ ++/* ADM8211 Registers */ ++ ++/* CR (PCI Configuration Registers); these can be accessed with ++ * pci_{read,write}_config_{byte,dword} functions */ ++#define ADM8211_CR_LID 0x00 /* CR0 */ ++#define ADM8211_CR_CSC 0x04 /* CR1 */ ++#define ADM8211_CR_CC 0x08 /* CR2 */ ++#define ADM8211_CR_LT 0x0C /* CR3 */ ++#define ADM8211_CR_IOBA 0x10 /* CR4 */ ++#define ADM8211_CR_MBA 0x14 /* CR5 */ ++#define ADM8211_CR_CIS 0x28 /* CR10 */ ++#define ADM8211_CR_SID 0x2C /* CR11 */ ++#define ADM8211_CR_CP 0x34 /* CR13 */ ++#define ADM8211_CR_CI 0x3C /* CR15 */ ++#define ADM8211_CR_DS 0x40 /* CR16 */ ++#define ADM8211_CR_SIG 0x80 /* CR32 */ ++#define ADM8211_CR_PMR0 0xC0 /* CR48 */ ++#define ADM8211_CR_PMR1 0xC4 /* CR49 */ ++ ++/* CR1 - CSC */ ++#define ADM8211_CSC_SPE (1 << 31) ++#define ADM8211_CSC_SES (1 << 30) ++#define ADM8211_CSC_SMA (1 << 29) ++#define ADM8211_CSC_STA (1 << 28) ++#define ADM8211_CSC_SDST ((1 << 26) | (1 << 25)) ++#define ADM8211_CSC_SDPR (1 << 24) ++#define ADM8211_CSC_SFBB (1 << 23) ++#define ADM8211_CSC_NC (1 << 20) ++#define ADM8211_CSC_CSE (1 << 8) ++#define ADM8211_CSC_CPE (1 << 6) ++#define ADM8211_CSC_CMO (1 << 2) ++#define ADM8211_CSC_CMSA (1 << 1) ++#define ADM8211_CSC_CIOSA (1 << 0) ++ ++/* CR32 (SIG) signature */ ++#define ADM8211_SIG1 0x82011317 /* ADM8211A */ ++#define ADM8211_SIG2 0x82111317 /* ADM8211B/ADM8211C */ ++ ++ ++/* CSR (Host Control and Status Registers) */ ++#define ADM8211_CSR_PAR 0x00 /* CSR0 */ ++#define ADM8211_CSR_FRCTL 0x04 /* CSR0A */ ++#define ADM8211_CSR_TDR 0x08 /* CSR1 */ ++#define ADM8211_CSR_WTDP 0x0C /* CSR1A */ ++#define ADM8211_CSR_RDR 0x10 /* CSR2 */ ++#define ADM8211_CSR_WRDP 0x14 /* CSR2A */ ++#define ADM8211_CSR_RDB 0x18 /* CSR3 */ ++#define ADM8211_CSR_TDBD 0x20 /* CSR4 */ ++#define ADM8211_CSR_TDBP 0x24 /* CSR4A */ ++#define ADM8211_CSR_STSR 0x28 /* CSR5 */ ++#define ADM8211_CSR_NAR 0x30 /* CSR6 */ ++#define ADM8211_CSR_IER 0x38 /* CSR7 */ ++#define ADM8211_CSR_LPC 0x40 /* CSR8 */ ++#define ADM8211_CSR_CSR_TEST1 0x44 /* CSR8A */ ++#define ADM8211_CSR_SPR 0x48 /* CSR9 */ ++#define ADM8211_CSR_CSR_TEST0 0x4C /* CSR9A */ ++#define ADM8211_CSR_WCSR 0x50 /* CSR10 */ ++#define ADM8211_CSR_WPDR 0x54 /* CSR10A */ ++#define ADM8211_CSR_GPTMR 0x58 /* CSR11 */ ++#define ADM8211_CSR_GPIO 0x5C /* CSR11A */ ++#define ADM8211_CSR_BBPCTL 0x60 /* CSR12 */ ++#define ADM8211_CSR_SYNCTL 0x64 /* CSR12A */ ++#define ADM8211_CSR_PLCPHD 0x68 /* CSR13 */ ++#define ADM8211_CSR_MMIWA 0x6C /* CSR13A */ ++#define ADM8211_CSR_MMIRD0 0x70 /* CSR14 */ ++#define ADM8211_CSR_MMIRD1 0x74 /* CSR14A */ ++#define ADM8211_CSR_TXBR 0x78 /* CSR15 */ ++#define ADM8211_CSR_SYNDATA 0x7C /* CSR15A */ ++#define ADM8211_CSR_TOFS2 0x84 /* CSR17 */ ++#define ADM8211_CSR_CMDR 0x88 /* CSR18 */ ++#define ADM8211_CSR_PCIC 0x8C /* CSR19 */ ++#define ADM8211_CSR_PMCSR 0x90 /* CSR20 */ ++#define ADM8211_CSR_PAR0 0x94 /* CSR21 */ ++#define ADM8211_CSR_PAR1 0x98 /* CSR22 */ ++#define ADM8211_CSR_MAR0 0x9C /* CSR23 */ ++#define ADM8211_CSR_MAR1 0xA0 /* CSR24 */ ++#define ADM8211_CSR_ATIMDA0 0xA4 /* CSR25 */ ++#define ADM8211_CSR_ABDA1 0xA8 /* CSR26 */ ++#define ADM8211_CSR_BSSID0 0xAC /* CSR27 */ ++#define ADM8211_CSR_TXLMT 0xB0 /* CSR28 */ ++#define ADM8211_CSR_MIBCNT 0xB4 /* CSR29 */ ++#define ADM8211_CSR_BCNT 0xB8 /* CSR30 */ ++#define ADM8211_CSR_TSFTH 0xBC /* CSR31 */ ++#define ADM8211_CSR_TSC 0xC0 /* CSR32 */ ++#define ADM8211_CSR_SYNRF 0xC4 /* CSR33 */ ++#define ADM8211_CSR_BPLI 0xC8 /* CSR34 */ ++#define ADM8211_CSR_CAP0 0xCC /* CSR35 */ ++#define ADM8211_CSR_CAP1 0xD0 /* CSR36 */ ++#define ADM8211_CSR_RMD 0xD4 /* CSR37 */ ++#define ADM8211_CSR_CFPP 0xD8 /* CSR38 */ ++#define ADM8211_CSR_TOFS0 0xDC /* CSR39 */ ++#define ADM8211_CSR_TOFS1 0xE0 /* CSR40 */ ++#define ADM8211_CSR_IFST 0xE4 /* CSR41 */ ++#define ADM8211_CSR_RSPT 0xE8 /* CSR42 */ ++#define ADM8211_CSR_TSFTL 0xEC /* CSR43 */ ++#define ADM8211_CSR_WEPCTL 0xF0 /* CSR44 */ ++#define ADM8211_CSR_WESK 0xF4 /* CSR45 */ ++#define ADM8211_CSR_WEPCNT 0xF8 /* CSR46 */ ++#define ADM8211_CSR_MACTEST 0xFC /* CSR47 */ ++#define ADM8211_CSR_FER 0x100 ++#define ADM8211_CSR_FEMR 0x104 ++#define ADM8211_CSR_FPSR 0x108 ++#define ADM8211_CSR_FFER 0x10C ++ ++/* CSR0 - PAR (PCI Address Register) */ ++#define ADM8211_PAR_MWIE (1 << 24) ++#define ADM8211_PAR_MRLE (1 << 23) ++#define ADM8211_PAR_MRME (1 << 21) ++#define ADM8211_PAR_RAP ((1 << 18) | (1 << 17)) ++#define ADM8211_PAR_CAL ((1 << 15) | (1 << 14)) ++#define ADM8211_PAR_PBL 0x00003f00 ++#define ADM8211_PAR_BLE (1 << 7) ++#define ADM8211_PAR_DSL 0x0000007c ++#define ADM8211_PAR_BAR (1 << 1) ++#define ADM8211_PAR_SWR (1 << 0) ++ ++/* CSR1 - FRCTL (Frame Control Register) */ ++#define ADM8211_FRCTL_PWRMGT (1 << 31) ++#define ADM8211_FRCTL_MAXPSP (1 << 27) ++#define ADM8211_FRCTL_AID 0x0000ffff ++#define ADM8211_FRCTL_AID_ON 0x0000c000 ++ ++/* CSR5 - STSR (Status Register) */ ++#define ADM8211_STSR_PCF (1 << 31) ++#define ADM8211_STSR_BCNTC (1 << 30) ++#define ADM8211_STSR_GPINT (1 << 29) ++#define ADM8211_STSR_LinkOff (1 << 28) ++#define ADM8211_STSR_ATIMTC (1 << 27) ++#define ADM8211_STSR_TSFTF (1 << 26) ++#define ADM8211_STSR_TSCZ (1 << 25) ++#define ADM8211_STSR_LinkOn (1 << 24) ++#define ADM8211_STSR_SQL (1 << 23) ++#define ADM8211_STSR_WEPTD (1 << 22) ++#define ADM8211_STSR_ATIME (1 << 21) ++#define ADM8211_STSR_TBTT (1 << 20) ++#define ADM8211_STSR_NISS (1 << 16) ++#define ADM8211_STSR_AISS (1 << 15) ++#define ADM8211_STSR_TEIS (1 << 14) ++#define ADM8211_STSR_FBE (1 << 13) ++#define ADM8211_STSR_REIS (1 << 12) ++#define ADM8211_STSR_GPTT (1 << 11) ++#define ADM8211_STSR_RPS (1 << 8) ++#define ADM8211_STSR_RDU (1 << 7) ++#define ADM8211_STSR_RCI (1 << 6) ++#define ADM8211_STSR_TUF (1 << 5) ++#define ADM8211_STSR_TRT (1 << 4) ++#define ADM8211_STSR_TLT (1 << 3) ++#define ADM8211_STSR_TDU (1 << 2) ++#define ADM8211_STSR_TPS (1 << 1) ++#define ADM8211_STSR_TCI (1 << 0) ++ ++/* CSR6 - NAR (Network Access Register) */ ++#define ADM8211_NAR_TXCF (1 << 31) ++#define ADM8211_NAR_HF (1 << 30) ++#define ADM8211_NAR_UTR (1 << 29) ++#define ADM8211_NAR_SQ (1 << 28) ++#define ADM8211_NAR_CFP (1 << 27) ++#define ADM8211_NAR_SF (1 << 21) ++#define ADM8211_NAR_TR ((1 << 15) | (1 << 14)) ++#define ADM8211_NAR_ST (1 << 13) ++#define ADM8211_NAR_OM ((1 << 11) | (1 << 10)) ++#define ADM8211_NAR_MM (1 << 7) ++#define ADM8211_NAR_PR (1 << 6) ++#define ADM8211_NAR_EA (1 << 5) ++#define ADM8211_NAR_PB (1 << 3) ++#define ADM8211_NAR_STPDMA (1 << 2) ++#define ADM8211_NAR_SR (1 << 1) ++#define ADM8211_NAR_CTX (1 << 0) ++ ++/* CSR7 - IER (Interrupt Enable Register) */ ++#define ADM8211_IER_PCFIE (1 << 31) ++#define ADM8211_IER_BCNTCIE (1 << 30) ++#define ADM8211_IER_GPIE (1 << 29) ++#define ADM8211_IER_LinkOffIE (1 << 28) ++#define ADM8211_IER_ATIMTCIE (1 << 27) ++#define ADM8211_IER_TSFTFIE (1 << 26) ++#define ADM8211_IER_TSCZE (1 << 25) ++#define ADM8211_IER_LinkOnIE (1 << 24) ++#define ADM8211_IER_SQLIE (1 << 23) ++#define ADM8211_IER_WEPIE (1 << 22) ++#define ADM8211_IER_ATIMEIE (1 << 21) ++#define ADM8211_IER_TBTTIE (1 << 20) ++#define ADM8211_IER_NIE (1 << 16) ++#define ADM8211_IER_AIE (1 << 15) ++#define ADM8211_IER_TEIE (1 << 14) ++#define ADM8211_IER_FBEIE (1 << 13) ++#define ADM8211_IER_REIE (1 << 12) ++#define ADM8211_IER_GPTIE (1 << 11) ++#define ADM8211_IER_RSIE (1 << 8) ++#define ADM8211_IER_RUIE (1 << 7) ++#define ADM8211_IER_RCIE (1 << 6) ++#define ADM8211_IER_TUIE (1 << 5) ++#define ADM8211_IER_TRTIE (1 << 4) ++#define ADM8211_IER_TLTTIE (1 << 3) ++#define ADM8211_IER_TDUIE (1 << 2) ++#define ADM8211_IER_TPSIE (1 << 1) ++#define ADM8211_IER_TCIE (1 << 0) ++ ++ ++/* CSR9 - SPR (Serial Port Register) */ ++#define ADM8211_SPR_SRS (1 << 11) ++#define ADM8211_SPR_SDO (1 << 3) ++#define ADM8211_SPR_SDI (1 << 2) ++#define ADM8211_SPR_SCLK (1 << 1) ++#define ADM8211_SPR_SCS (1 << 0) ++ ++/* CSR9A - CSR_TEST0 */ ++#define ADM8211_CSR_TEST0_EPNE (1 << 18) ++#define ADM8211_CSR_TEST0_EPSNM (1 << 17) ++#define ADM8211_CSR_TEST0_EPTYP (1 << 16) ++#define ADM8211_CSR_TEST0_EPRLD (1 << 15) ++ ++/* CSR11A - GPIO */ ++#define ADM8211_CSR_GPIO_EN5 (1 << 17) ++#define ADM8211_CSR_GPIO_EN4 (1 << 16) ++#define ADM8211_CSR_GPIO_EN3 (1 << 15) ++#define ADM8211_CSR_GPIO_EN2 (1 << 14) ++#define ADM8211_CSR_GPIO_EN1 (1 << 13) ++#define ADM8211_CSR_GPIO_EN0 (1 << 12) ++#define ADM8211_CSR_GPIO_O5 (1 << 11) ++#define ADM8211_CSR_GPIO_O4 (1 << 10) ++#define ADM8211_CSR_GPIO_O3 (1 << 9) ++#define ADM8211_CSR_GPIO_O2 (1 << 8) ++#define ADM8211_CSR_GPIO_O1 (1 << 7) ++#define ADM8211_CSR_GPIO_O0 (1 << 6) ++#define ADM8211_CSR_GPIO_IN 0x0000003f ++ ++/* CSR12 - BBPCTL (BBP Control port) */ ++#define ADM8211_BBPCTL_MMISEL (1 << 31) ++#define ADM8211_BBPCTL_SPICADD (0x7F << 24) ++#define ADM8211_BBPCTL_RF3000 (0x20 << 24) ++#define ADM8211_BBPCTL_TXCE (1 << 23) ++#define ADM8211_BBPCTL_RXCE (1 << 22) ++#define ADM8211_BBPCTL_CCAP (1 << 21) ++#define ADM8211_BBPCTL_TYPE 0x001c0000 ++#define ADM8211_BBPCTL_WR (1 << 17) ++#define ADM8211_BBPCTL_RD (1 << 16) ++#define ADM8211_BBPCTL_ADDR 0x0000ff00 ++#define ADM8211_BBPCTL_DATA 0x000000ff ++ ++/* CSR12A - SYNCTL (Synthesizer Control port) */ ++#define ADM8211_SYNCTL_WR (1 << 31) ++#define ADM8211_SYNCTL_RD (1 << 30) ++#define ADM8211_SYNCTL_CS0 (1 << 29) ++#define ADM8211_SYNCTL_CS1 (1 << 28) ++#define ADM8211_SYNCTL_CAL (1 << 27) ++#define ADM8211_SYNCTL_SELCAL (1 << 26) ++#define ADM8211_SYNCTL_RFtype ((1 << 24) || (1 << 23) || (1 << 22)) ++#define ADM8211_SYNCTL_RFMD (1 << 22) ++#define ADM8211_SYNCTL_GENERAL (0x7 << 22) ++/* SYNCTL 21:0 Data (Si4126: 18-bit data, 4-bit address) */ ++ ++/* CSR18 - CMDR (Command Register) */ ++#define ADM8211_CMDR_PM (1 << 19) ++#define ADM8211_CMDR_APM (1 << 18) ++#define ADM8211_CMDR_RTE (1 << 4) ++#define ADM8211_CMDR_DRT ((1 << 3) | (1 << 2)) ++#define ADM8211_CMDR_DRT_8DW (0x0 << 2) ++#define ADM8211_CMDR_DRT_16DW (0x1 << 2) ++#define ADM8211_CMDR_DRT_SF (0x2 << 2) ++ ++/* CSR33 - SYNRF (SYNRF direct control) */ ++#define ADM8211_SYNRF_SELSYN (1 << 31) ++#define ADM8211_SYNRF_SELRF (1 << 30) ++#define ADM8211_SYNRF_LERF (1 << 29) ++#define ADM8211_SYNRF_LEIF (1 << 28) ++#define ADM8211_SYNRF_SYNCLK (1 << 27) ++#define ADM8211_SYNRF_SYNDATA (1 << 26) ++#define ADM8211_SYNRF_PE1 (1 << 25) ++#define ADM8211_SYNRF_PE2 (1 << 24) ++#define ADM8211_SYNRF_PA_PE (1 << 23) ++#define ADM8211_SYNRF_TR_SW (1 << 22) ++#define ADM8211_SYNRF_TR_SWN (1 << 21) ++#define ADM8211_SYNRF_RADIO (1 << 20) ++#define ADM8211_SYNRF_CAL_EN (1 << 19) ++#define ADM8211_SYNRF_PHYRST (1 << 18) ++ ++#define ADM8211_SYNRF_IF_SELECT_0 (1 << 31) ++#define ADM8211_SYNRF_IF_SELECT_1 ((1 << 31) | (1 << 28)) ++#define ADM8211_SYNRF_WRITE_SYNDATA_0 (1 << 31) ++#define ADM8211_SYNRF_WRITE_SYNDATA_1 ((1 << 31) | (1 << 26)) ++#define ADM8211_SYNRF_WRITE_CLOCK_0 (1 << 31) ++#define ADM8211_SYNRF_WRITE_CLOCK_1 ((1 << 31) | (1 << 27)) ++ ++ ++/* CSR44 - WEPCTL (WEP Control) */ ++#define ADM8211_WEPCTL_WEPENABLE (1 << 31) ++#define ADM8211_WEPCTL_WPAENABLE (1 << 30) ++#define ADM8211_WEPCTL_CURRENT_TABLE (1 << 29) ++#define ADM8211_WEPCTL_TABLE_WR (1 << 28) ++#define ADM8211_WEPCTL_TABLE_RD (1 << 27) ++#define ADM8211_WEPCTL_WEPRXBYP (1 << 25) ++#define ADM8211_WEPCTL_SEL_WEPTABLE (1 << 23) ++#define ADM8211_WEPCTL_ADDR (0x000001ff) ++ ++/* CSR45 - WESK (Data Entry for Share/Individual Key) */ ++#define ADM8211_WESK_DATA (0x0000ffff) ++ ++/* FER (Function Event Register) */ ++#define ADM8211_FER_INTR_EV_ENT (1 << 15) ++ ++ ++#define ADM8211_CSR_READ(r) \ ++readl(priv->mem + ADM8211_CSR_ ## r) ++#define ADM8211_CSR_WRITE(r, val) \ ++writel((val), priv->mem + ADM8211_CSR_ ## r) ++ ++ ++/* Si4126 RF Synthesizer - Control Registers */ ++#define SI4126_MAIN_CONF 0 ++#define SI4126_PHASE_DET_GAIN 1 ++#define SI4126_POWERDOWN 2 ++#define SI4126_RF1_N_DIV 3 /* only Si4136 */ ++#define SI4126_RF2_N_DIV 4 ++#define SI4126_IF_N_DIV 5 ++#define SI4126_RF1_R_DIV 6 /* only Si4136 */ ++#define SI4126_RF2_R_DIV 7 ++#define SI4126_IF_R_DIV 8 ++ ++/* Main Configuration */ ++#define SI4126_MAIN_XINDIV2 (1 << 6) ++#define SI4126_MAIN_IFDIV ((1 << 11) | (1 << 10)) ++/* Powerdown */ ++#define SI4126_POWERDOWN_PDIB (1 << 1) ++#define SI4126_POWERDOWN_PDRB (1 << 0) ++ ++ ++/* RF3000 BBP - Control Port Registers */ ++/* 0x00 - reserved */ ++#define RF3000_MODEM_CTRL__RX_STATUS 0x01 ++#define RF3000_CCA_CTRL 0x02 ++#define RF3000_DIVERSITY__RSSI 0x03 ++#define RF3000_RX_SIGNAL_FIELD 0x04 ++#define RF3000_RX_LEN_MSB 0x05 ++#define RF3000_RX_LEN_LSB 0x06 ++#define RF3000_RX_SERVICE_FIELD 0x07 ++#define RF3000_TX_VAR_GAIN__TX_LEN_EXT 0x11 ++#define RF3000_TX_LEN_MSB 0x12 ++#define RF3000_TX_LEN_LSB 0x13 ++#define RF3000_LOW_GAIN_CALIB 0x14 ++#define RF3000_HIGH_GAIN_CALIB 0x15 ++ ++/* ADM8211 revisions */ ++#define ADM8211_REV_AB 0x11 ++#define ADM8211_REV_AF 0x15 ++#define ADM8211_REV_BA 0x20 ++#define ADM8211_REV_CA 0x30 ++ ++#define TX_RING_SIZE 16 ++#define RX_RING_SIZE 16 ++ ++struct adm8211_ring_info { ++ struct sk_buff *skb; ++ dma_addr_t mapping; ++}; ++ ++struct adm8211_eeprom { ++ u16 signature; ++ u8 major_version; ++ u8 minor_version; ++ u8 reserved_1[4]; ++ u8 hwaddr[6]; ++ u8 reserved_2[8]; ++ u16 cr49; ++ u8 cr03; ++ u8 cr28; ++ u8 cr29; ++ u8 country_code; ++ u8 specific_bbptype; ++ u8 specific_rftype; ++ u8 reserved_3[2]; ++ u16 device_id; ++ u16 vendor_id; ++ u16 subsystem_id; ++ u16 subsystem_vendor_id; ++ u8 maxlat; ++ u8 mingnt; ++ u16 cis_pointer_low; ++ u16 cis_pointer_high; ++ u16 csr18; ++ u8 reserved_4[16]; ++ u8 d1_pwrdara; /* wha? */ ++ u8 d0_pwrdara; ++ u8 d3_pwrdara; ++ u8 d2_pwrdara; ++ u8 antenna_power[14]; ++ u16 cis_wordcnt; ++ u8 tx_power[14]; ++ u8 lpf_cutoff[14]; ++ u8 lnags_threshold[14]; ++ u16 checksum; ++ u8 cis_data[0]; /* 384 bytes */ ++} __attribute__ ((packed)); ++ ++struct adm8211_priv { ++ struct pci_dev *pdev; ++ spinlock_t lock; ++ int io_base; /* PCI Region 0: I/O ports */ ++ void *mem; /* PCI Region 1: Memory */ ++ struct adm8211_desc *rx_ring; ++ struct adm8211_desc *tx_ring; ++ dma_addr_t rx_ring_dma; ++ dma_addr_t tx_ring_dma; ++ struct adm8211_ring_info rx_buffers[RX_RING_SIZE]; ++ struct adm8211_ring_info tx_buffers[TX_RING_SIZE]; ++ unsigned cur_tx, dirty_tx, cur_rx; ++ struct sk_buff_head rx_queue; ++ struct tasklet_struct rx_tasklet; ++#ifdef ADM8211_PROC ++ struct proc_dir_entry *proc; ++#endif ++ int iw_mode; /* operating mode (IW_MODE_*) */ ++ ++ struct net_device_stats stats; ++ struct iw_statistics wstats; ++ struct ieee80211_data ieee80211; ++ unsigned long scan_timestamp; ++ ++ u32 *pci_state; ++ ++ int (*eth_header_parse)(struct sk_buff *skb, unsigned char *haddr); ++ ++ u8 soft_rx_crc; ++ u8 plcp_signal; ++ u8 retry_limit; ++ u8 tx_power; ++ u8 lpf_cutoff; ++ u8 lnags_threshold; ++ u16 rts_thresh; ++ u16 frag_thresh; ++ ++ struct adm8211_eeprom *eeprom; ++ size_t eeprom_len; ++ ++ u8 revid; ++ ++ u32 nar; ++ ++#define ADM8211_TYPE_INTERSIL 0x00 ++#define ADM8211_TYPE_RFMD 0x01 ++#define ADM8211_TYPE_MARVEL 0x02 ++#define ADM8211_TYPE_ADMTEK 0x05 ++ unsigned int rf_type:3; ++ unsigned int bbp_type:3; ++ ++/* specific bbp types */ ++#define ADM8211_BBP_RFMD3000 0x00 ++#define ADM8211_BBP_RFMD3002 0x01 ++#define ADM8211_BBP_ADM8011 0x04 ++ ++ enum { ++ ADM8211_RFMD2948, ++ ADM8211_RFMD2958, ++ ADM8211_RFMD2958_RF3000_CONTROL_POWER, ++ ADM8211_MAX2820, ++ ADM8211_AL2210L, /* Airoha */ ++ } transceiver_type; ++}; ++ ++static const struct ieee80211_chan_range cranges[] = { ++ {1, 11}, /* FCC */ ++ {1, 11}, /* IC */ ++ {1, 13}, /* ETSI */ ++ {10, 11}, /* SPAIN */ ++ {10, 13}, /* FRANCE */ ++ {14, 14}, /* MMK */ ++ {1, 14}, /* MMK2 */ ++}; ++ ++int adm8211_rf_set_channel(struct net_device *dev, int channel); ++int adm8211_80211_header_parse(struct sk_buff *skb, unsigned char *haddr); ++void adm8211_write_wepkey(struct net_device *dev, int index); ++void adm8211_update_wep(struct net_device *dev); ++void adm8211_update_mode(struct net_device *dev); ++void adm8211_set_beacon(struct net_device *dev); ++ ++#endif /* ADM8211_H */ +diff -urN x/drivers/net/wireless/adm8211/adm8211_hw.c y/drivers/net/wireless/adm8211/adm8211_hw.c +--- x/drivers/net/wireless/adm8211/adm8211_hw.c 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/adm8211/adm8211_hw.c 2004-09-15 13:12:55.000000000 +1000 +@@ -0,0 +1,2839 @@ ++ ++/* ++ * Linux device driver for ADMtek ADM8211 (IEEE 802.11b MAC/BBP) ++ * ++ * Copyright (c) 2003, Jouni Malinen ++ * Copyright (c) 2004, Michael Wu ++ * Some parts copyright (c) 2003 by David Young ++ * and used with permission. ++ * ++ * Much thanks to Infineon-ADMtek for their support of this driver. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. See README and COPYING for ++ * more details. ++ */ ++ ++/* ++ * Note! ++ * - this is a pre-release of the driver; it is not yet finished and needs ++ * more testing. ++ * ++ * FIX: ++ * - protect access of CSR_NAR (with a spinlock?) ++ * - properly idle chip in parts that need it (goes w/ above) ++ * - improve signal quality + RSSI stuff ++ * - figure out why ping -s 5913 and up lose packets.. ++ * (can be reduced with a mtu of 920..) ++ * - check FCS for rev 0x20 and up? ++ * - put code in to properly reset the card while up if it gets messed up.. ++ */ ++ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#if WIRELESS_EXT > 12 ++#include ++#endif /* WIRELESS_EXT > 12 */ ++#include ++#include ++#include ++#include ++ ++#undef ADM8211_PROC ++#include "compat.h" ++#include "adm8211.h" ++#include "adm8211_ioctl.h" ++#include "ieee80211.h" ++#include "avs_caphdr.h" ++ ++#include "rdate.h" ++ ++MODULE_AUTHOR("Jouni Malinen , Michael Wu "); ++MODULE_DESCRIPTION("Driver for IEEE 802.11b wireless LAN cards based on ADMtek" ++ " ADM8211"); ++MODULE_SUPPORTED_DEVICE("ADM8211"); ++MODULE_LICENSE("GPL"); ++ ++ ++static const char *version = KERN_INFO "adm8211: Copyright 2003, " ++"Jouni Malinen ; " ++"Copyright 2004, Michael Wu \n"; ++ ++ ++static struct pci_device_id adm8211_pci_id_table[] __devinitdata = { ++ /* ADMtek ADM8211 */ ++ { 0x10B7, 0x6000, PCI_ANY_ID, PCI_ANY_ID }, /* 3Com 3CRSHPW796 */ ++ { 0x1200, 0x8201, PCI_ANY_ID, PCI_ANY_ID }, /* ? */ ++ { 0x1317, 0x8201, PCI_ANY_ID, PCI_ANY_ID }, /* ADM8211A */ ++ { 0x1317, 0x8211, PCI_ANY_ID, PCI_ANY_ID }, /* ADM8211B/C */ ++ { 0 } ++}; ++ ++#ifdef ADM8211_PROC ++static struct proc_dir_entry *adm8211_proc; ++#endif ++ ++ ++#define ADM8211_INTMASK \ ++(ADM8211_IER_NIE | ADM8211_IER_AIE | ADM8211_IER_RCIE | ADM8211_IER_TCIE | \ ++ADM8211_IER_TDUIE | ADM8211_IER_GPTIE) ++ ++ ++ ++struct adm8211_desc { ++ u32 status; ++ u32 length; ++ u32 buffer1; ++ u32 buffer2; ++}; ++ ++#define RDES0_STATUS_OWN (1 << 31) ++#define RDES0_STATUS_ES (1 << 30) ++#define RDES0_STATUS_SQL (1 << 29) ++#define RDES0_STATUS_DE (1 << 28) ++#define RDES0_STATUS_FS (1 << 27) ++#define RDES0_STATUS_LS (1 << 26) ++#define RDES0_STATUS_PCF (1 << 25) ++#define RDES0_STATUS_SFDE (1 << 24) ++#define RDES0_STATUS_SIGE (1 << 23) ++#define RDES0_STATUS_CRC16E (1 << 22) ++#define RDES0_STATUS_RXTOE (1 << 21) ++#define RDES0_STATUS_CRC32E (1 << 20) ++#define RDES0_STATUS_ICVE (1 << 19) ++#define RDES0_STATUS_DA1 (1 << 17) ++#define RDES0_STATUS_DA0 (1 << 16) ++#define RDES0_STATUS_RXDR ((1 << 15) | (1 << 14) | (1 << 13) | (1 << 12)) ++#define RDES0_STATUS_FL (0x00000fff) ++ ++#define RDES1_CONTROL_RER (1 << 25) ++#define RDES1_CONTROL_RCH (1 << 24) ++#define RDES1_CONTROL_RBS2 (0x00fff000) ++#define RDES1_CONTROL_RBS1 (0x00000fff) ++ ++#define RDES1_STATUS_RSSI (0x0000007f) ++ ++ ++#define TDES0_CONTROL_OWN (1 << 31) ++#define TDES0_CONTROL_DONE (1 << 30) ++#define TDES0_CONTROL_TXDR (0x0ff00000) ++ ++#define TDES0_STATUS_OWN (1 << 31) ++#define TDES0_STATUS_DONE (1 << 30) ++#define TDES0_STATUS_ES (1 << 29) ++#define TDES0_STATUS_TLT (1 << 28) ++#define TDES0_STATUS_TRT (1 << 27) ++#define TDES0_STATUS_TUF (1 << 26) ++#define TDES0_STATUS_TRO (1 << 25) ++#define TDES0_STATUS_SOFBR (1 << 24) ++#define TDES0_STATUS_ACR (0x00000fff) ++ ++#define TDES1_CONTROL_IC (1 << 31) ++#define TDES1_CONTROL_LS (1 << 30) ++#define TDES1_CONTROL_FS (1 << 29) ++#define TDES1_CONTROL_TER (1 << 25) ++#define TDES1_CONTROL_TCH (1 << 24) ++#define TDES1_CONTROL_RBS2 (0x00fff000) ++#define TDES1_CONTROL_RBS1 (0x00000fff) ++ ++ ++#define PLCP_SIGNAL_1M 0x0a ++#define PLCP_SIGNAL_2M 0x14 ++#define PLCP_SIGNAL_5M5 0x37 ++#define PLCP_SIGNAL_11M 0x6e ++ ++ ++/* RX status - stored in skb->cb so this structure must be 48 bytes or less */ ++struct adm8211_rx_status { ++ u8 rssi; ++ u8 rate; ++}; ++ ++ ++struct adm8211_tx_hdr { ++ u8 da[6]; ++ u8 signal; /* PLCP signal / TX rate in 100 Kbps */ ++ u8 service; ++ u16 frame_body_size; ++ u16 frame_control; ++ u16 plcp_frag_tail_len; ++ u16 plcp_frag_head_len; ++ u16 dur_frag_tail; ++ u16 dur_frag_head; ++ u8 address4[6]; ++ ++#define ADM8211_TXHDRCTL_SHORT_PREAMBLE (1 << 0) ++#define ADM8211_TXHDRCTL_MORE_FRAG (1 << 1) ++#define ADM8211_TXHDRCTL_MORE_DATA (1 << 2) ++#define ADM8211_TXHDRCTL_FRAG_NO (1 << 3) /* ? */ ++#define ADM8211_TXHDRCTL_ENABLE_RTS (1 << 4) ++#define ADM8211_TXHDRCTL_ENABLE_WEP_ENGINE (1 << 5) ++#define ADM8211_TXHDRCTL_ENABLE_EXTEND_HEADER (1 << 15) /* ? */ ++ u16 header_control; ++#ifdef BIG_ENDIAN ++ u32 retry_limit:8; ++ u32 frag_number:4; ++ u32 reserved_0:8; ++ u32 frag_threshold:12; ++#else ++ u32 frag_threshold:12; ++ u32 reserved_0:8; ++ u32 frag_number:4; ++ u32 retry_limit:8; ++#endif ++ ++ u32 wep2key0; ++ u32 wep2key1; ++ u32 wep2key2; ++ u32 wep2key3; ++ ++ u8 keyid; ++ u8 reserved_1[3]; ++ u32 reserved_2; ++} __attribute__ ((packed)); ++ ++ ++ ++#define RX_COPY_BREAK 256 ++ ++#define RX_PKT_SIZE 2400 ++ ++/* SRAM offsets */ ++#define ADM8211_SRAM(x) (priv->revid < ADM8211_REV_BA ? \ ++ ADM8211_SRAM_A_ ## x : ADM8211_SRAM_B_ ## x) ++ ++#define ADM8211_SRAM_INDIV_KEY 0x0000 ++#define ADM8211_SRAM_A_SHARE_KEY 0x0160 ++#define ADM8211_SRAM_B_SHARE_KEY 0x00c0 ++#define ADM8211_SRAM_SHARE_KEY ADM8211_SRAM(SHARE_KEY) ++ ++#define ADM8211_SRAM_A_SSID 0x0180 ++#define ADM8211_SRAM_B_SSID 0x00d4 ++#define ADM8211_SRAM_SSID ADM8211_SRAM(SSID) ++ ++#define ADM8211_SRAM_A_SUPP_RATE 0x0191 ++#define ADM8211_SRAM_B_SUPP_RATE 0x00dd ++#define ADM8211_SRAM_SUPP_RATE ADM8211_SRAM(SUPP_RATE) ++ ++#define ADM8211_SRAM_A_SIZE 0x0200 ++#define ADM8211_SRAM_B_SIZE 0x01c0 ++#define ADM8211_SRAM_SIZE ADM8211_SRAM(SIZE) ++ ++static void adm8211_write_sram(struct net_device *dev, int addr, u32 data); ++static void adm8211_write_sram_bytes(struct net_device *dev, int addr, u8 *buf, int len); ++static int adm8211_write_bbp(struct net_device *dev, u8 addr, u8 data); ++static int adm8211_tx(struct net_device *dev, struct sk_buff *skb, u16 fc, u16 capab, u8 *dst); ++static void adm8211_beacon_sync(struct net_device *dev); ++ ++ ++/* Serial EEPROM reading for 93C66/93C46 */ ++#define EE_ENB (0x4000 | ADM8211_SPR_SRS | ADM8211_SPR_SCS) ++#define EE_READ_CMD (6) ++#define eeprom_delay() ADM8211_CSR_READ(SPR); ++ ++ ++static u16 adm8211_eeprom_read_word(struct net_device *dev, int addr, ++ int addr_len) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ int i; ++ u16 retval = 0; ++ int read_cmd = addr | (EE_READ_CMD << addr_len); ++ ++ ADM8211_CSR_WRITE(SPR, EE_ENB & ~ADM8211_SPR_SCS); ++ ADM8211_CSR_WRITE(SPR, EE_ENB); ++ ++ /* Shift the read command bits out. */ ++ for (i = 4 + addr_len; i >= 0; i--) { ++ short dataval = (read_cmd & (1 << i)) ? ADM8211_SPR_SDI : 0; ++ ADM8211_CSR_WRITE(SPR, EE_ENB | dataval); ++ eeprom_delay(); ++ ADM8211_CSR_WRITE(SPR, EE_ENB | dataval | ADM8211_SPR_SCLK); ++ eeprom_delay(); ++ } ++ ++ ADM8211_CSR_WRITE(SPR, EE_ENB); ++ eeprom_delay(); ++ ++ for (i = 16; i > 0; i--) { ++ ADM8211_CSR_WRITE(SPR, EE_ENB | ADM8211_SPR_SCLK); ++ eeprom_delay(); ++ retval <<= 1; ++ retval |= ((ADM8211_CSR_READ(SPR) & ADM8211_SPR_SDO) ? 1 : 0); ++ ADM8211_CSR_WRITE(SPR, EE_ENB); ++ eeprom_delay(); ++ } ++ ++ /* Terminate the EEPROM access. */ ++ ADM8211_CSR_WRITE(SPR, EE_ENB & ~ADM8211_SPR_SCS); ++ ++ return retval; ++} ++ ++ ++static int adm8211_read_eeprom(struct net_device *dev) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ u32 reg; ++ int addr_len, words, i; ++ ++ reg = ADM8211_CSR_READ(CSR_TEST0); ++ ++ if (reg & ADM8211_CSR_TEST0_EPTYP) { ++ printk(KERN_DEBUG "%s (adm8211): EEPROM type: 93C66\n", pci_name(priv->pdev)); ++ /* 256 * 16-bit = 512 bytes */ ++ addr_len = 8; ++ words = 256; ++ } else { ++ printk(KERN_DEBUG "%s (adm8211): EEPROM type 93C46\n", pci_name(priv->pdev)); ++ /* 64 * 16-bit = 128 bytes */ ++ addr_len = 6; ++ words = 64; ++ } ++ ++ priv->eeprom_len = words * 2; ++ priv->eeprom = kmalloc(priv->eeprom_len, GFP_KERNEL); ++ if (priv->eeprom == NULL) ++ return -ENOMEM; ++ ++ for (i = 0; i < words; i++) ++ *((u16 *) &((u8 *)priv->eeprom)[i * 2]) = ++ adm8211_eeprom_read_word(dev, i, addr_len); ++ ++ priv->rf_type = (le16_to_cpu(priv->eeprom->cr49) & (0x7 << 3)) >> 3; ++ priv->bbp_type = le16_to_cpu(priv->eeprom->cr49) & 0x7; ++ ++ printk(KERN_DEBUG "%s (adm8211): RFtype=%d BBPtype=%d Specific BBP=%d Transceiver=%d\n", ++ pci_name(priv->pdev), priv->rf_type, priv->bbp_type, ++ priv->eeprom->specific_bbptype, priv->eeprom->specific_rftype); ++ ++ /* read country code from eeprom and make sure it's valid */ ++ i=(priv->eeprom->country_code); ++ if (i >= ARRAY_SIZE(cranges)) { ++ printk(KERN_WARNING "%s (adm8211): Invalid country code in EEPROM, assuming ETSI\n", ++ pci_name(priv->pdev)); ++ priv->ieee80211.chan_range = cranges[2]; ++ } else ++ priv->ieee80211.chan_range = cranges[i]; ++ ++ printk(KERN_DEBUG "%s (adm8211): Channel range: %d-%d\n", ++ pci_name(priv->pdev), (int)priv->ieee80211.chan_range.min, (int)priv->ieee80211.chan_range.max); ++ ++ switch (priv->eeprom->specific_rftype) { ++ case 0x1: ++ priv->transceiver_type=ADM8211_RFMD2958; ++ break; ++ case 0x2: ++ priv->transceiver_type=ADM8211_RFMD2958_RF3000_CONTROL_POWER; ++ break; ++ case 0x8: ++ priv->transceiver_type=ADM8211_MAX2820; ++ break; ++ case 0xC: ++ priv->transceiver_type=ADM8211_AL2210L; ++ break; ++ default: ++ priv->transceiver_type=ADM8211_RFMD2948; ++ break; ++ } ++ ++ return 0; ++} ++ ++static inline void adm8211_write_sram(struct net_device *dev, int addr, u32 data) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ ++ ADM8211_CSR_WRITE(WEPCTL, cpu_to_le32(addr | ADM8211_WEPCTL_TABLE_WR | ++ (priv->revid < ADM8211_REV_BA ? ++ 0 : ADM8211_WEPCTL_SEL_WEPTABLE )) ); ++ ADM8211_CSR_READ(WEPCTL); ++ mdelay(1); ++ ADM8211_CSR_WRITE(WESK, data); ++ ADM8211_CSR_READ(WESK); ++ mdelay(1); ++} ++ ++static void adm8211_write_sram_bytes(struct net_device *dev, int addr, u8 *buf, int len) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ u32 reg = ADM8211_CSR_READ(WEPCTL); ++ int i; ++ ++ if (priv->revid < ADM8211_REV_BA) { ++ for (i = 0; i < len; i += 2) { ++ u16 val = buf[i] | buf[i + 1] << 8; ++ adm8211_write_sram(dev, addr + i / 2, cpu_to_le32(val)); ++ } ++ } else { ++ for (i = 0; i < len; i += 4) { ++ u32 val = (buf[i + 0] << 0 ) | (buf[i + 1] << 8 ) | ++ (buf[i + 2] << 16) | (buf[i + 3] << 24); ++ adm8211_write_sram(dev, addr + i / 4, val); ++ } ++ } ++ ++ ADM8211_CSR_WRITE(WEPCTL, reg); ++} ++ ++static void adm8211_clear_sram(struct net_device *dev) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ u32 reg = ADM8211_CSR_READ(WEPCTL); ++ int addr; ++ ++ for (addr = 0; addr < ADM8211_SRAM_SIZE; addr++) ++ adm8211_write_sram(dev, addr, 0); ++ ++ ADM8211_CSR_WRITE(WEPCTL, reg); ++} ++ ++static void adm8211_link_change(struct net_device *dev, int link) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ u32 reg; ++ ++ /* Set aid for beacon TIM element decoding */ ++ reg = ADM8211_CSR_READ(FRCTL); ++ reg &= ~ADM8211_FRCTL_AID; ++ if (link) { ++ reg |= ADM8211_FRCTL_AID_ON; ++ reg |= priv->ieee80211.aid; ++ } ++ ADM8211_CSR_WRITE(FRCTL, reg); ++} ++ ++static struct net_device_stats *adm8211_get_stats(struct net_device *dev) ++{ ++ return &((struct adm8211_priv *)netdev_priv(dev))->stats; ++} ++ ++static struct iw_statistics *adm8211_get_wireless_stats(struct net_device *dev) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ struct iw_statistics *wstats = &priv->wstats; ++ return wstats; ++} ++ ++static void adm8211_set_rx_mode(struct net_device *dev) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ int i, bit_nr; ++ u32 mc_filter[2]; ++ struct dev_mc_list *mclist; ++ ++ if (dev->flags & IFF_PROMISC) { ++ priv->nar |= ADM8211_NAR_PR; ++ priv->nar &= ~ADM8211_NAR_MM; ++ mc_filter[1] = mc_filter[0] = 0xffffffff; ++ } else if ((dev->flags & IFF_ALLMULTI) || (dev->mc_count > 32)) { ++ priv->nar &= ~ADM8211_NAR_PR; ++ priv->nar |= ADM8211_NAR_MM; ++ mc_filter[1] = mc_filter[0] = 0xffffffff; ++ } else { ++ priv->nar &= ~(ADM8211_NAR_MM | ADM8211_NAR_PR); ++ mc_filter[1] = mc_filter[0] = 0; ++ mclist = dev->mc_list; ++ for (i = 0; i < dev->mc_count; i+=1) { ++ if (!mclist) ++ break; ++ bit_nr = ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26; ++ ++ bit_nr &= 0x3F; ++ mc_filter[bit_nr >> 5] |= cpu_to_le32(1 << (bit_nr & 31)); ++ mclist = mclist->next; ++ } ++ } ++ ++ /* make sure receive is stopped */ ++ if (priv->nar & ADM8211_NAR_SR) { ++ ADM8211_CSR_WRITE(NAR, priv->nar & ~ADM8211_NAR_SR); ++ ADM8211_CSR_READ(NAR); ++ mdelay(20); ++ } ++ ++ ADM8211_CSR_WRITE(MAR0, mc_filter[0]); ++ ADM8211_CSR_WRITE(MAR1, mc_filter[1]); ++ ADM8211_CSR_READ(NAR); ++ ADM8211_CSR_WRITE(NAR, priv->nar); ++} ++ ++static int adm8211_set_mac_address(struct net_device *dev, void *p) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ struct sockaddr *addr = p; ++ u32 reg; ++ ++ memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); ++ ++ /* sure, we can change the MAC addr while running */ ++ if (dev->flags & IFF_UP) { ++ reg = ADM8211_CSR_READ(NAR); ++ ++ /* make sure receive is stopped */ ++ if (priv->nar & ADM8211_NAR_SR) { ++ ADM8211_CSR_WRITE(NAR, priv->nar & ~ADM8211_NAR_SR); ++ mdelay(20); ++ } ++ ++ ADM8211_CSR_WRITE(PAR0, *((u32 *)dev->dev_addr)); ++ ADM8211_CSR_WRITE(PAR1, *(u16 *)(dev->dev_addr + 4)); ++ ADM8211_CSR_WRITE(NAR, priv->nar); ++ } ++ ++ return 0; ++} ++ ++static void adm8211_rx_skb(struct net_device *dev, struct sk_buff *skb) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ struct ieee80211_data *data = &priv->ieee80211; ++ struct ieee80211_hdr *hdr; ++ struct adm8211_rx_status *stat; ++ struct iw_statistics *wstats = &priv->wstats; ++ struct ieee80211_rx_status rx_status; ++ static const u8 rate[] = {10, 20, 55, 110, 220}; ++ u16 fc; ++ ++ if (skb->len < 14) ++ goto drop; ++ ++ /* TODO: Add crc checking here for cards/modes that need it */ ++ ++ stat = (struct adm8211_rx_status *) skb->cb; ++ memset(&rx_status, 0, sizeof(rx_status)); ++ rx_status.rssi = stat->rssi; ++ if (stat->rate <= 4) ++ rx_status.rate = rate[stat->rate]; ++ ++ hdr = (struct ieee80211_hdr *) skb->data; ++ fc = le16_to_cpu(hdr->frame_control); ++ ++ if (priv->iw_mode == IW_MODE_MONITOR) { ++ struct avs_caphdr *chdr; ++ if (skb_headroom(skb) < sizeof(struct avs_caphdr)) { ++ if (pskb_expand_head(skb, sizeof(struct avs_caphdr), 0, ++ GFP_ATOMIC)) { ++ printk(KERN_DEBUG "%s: failed to allocate room for prism2 " ++ "header\n", dev->name); ++ goto drop; ++ } ++ } ++ memset(skb->cb, 0, sizeof(skb->cb)); ++ chdr = (struct avs_caphdr *) skb_push(skb, sizeof(struct avs_caphdr)); ++ chdr->version = cpu_to_be32(0x80211001); ++ chdr->length = cpu_to_be32(sizeof(struct avs_caphdr)); ++ chdr->mactime = 0; ++ chdr->hosttime = cpu_to_be64(jiffies); ++ chdr->phytype = cpu_to_be32(4); /* phytype_dsss_dot11_b */ ++ chdr->channel = cpu_to_be32(data->channel); ++ chdr->datarate = cpu_to_be32(rx_status.rate); ++ chdr->antenna = 0; /* TODO: once antenna setting is possible.. */ ++ chdr->priority = 0; /* hmm, dunno if this is possible.. */ ++ chdr->ssi_type = cpu_to_be32(3); /* Raw RSSI */ ++ chdr->ssi_signal = cpu_to_be32(rx_status.rssi); ++ chdr->ssi_noise = cpu_to_be32(0xFFFFFFFF); ++ if (skb->len >= 14 + sizeof(struct avs_caphdr)) ++ chdr->preamble = cpu_to_be32( ++ le16_to_cpu(hdr->frame_control) & WLAN_CAPABILITY_SHORT_PREAMBLE ++ ? 2 : 1); ++ else ++ chdr->preamble = 0; ++ chdr->encoding = cpu_to_be32(1); /* CCK */ ++ priv->stats.rx_bytes+=skb->len; ++ priv->stats.rx_packets+=1; ++ skb->pkt_type = PACKET_OTHERHOST; ++ skb->mac.raw = skb->data; ++ netif_rx(skb); ++ dev->last_rx = jiffies; ++ return; ++ } ++ ++ if (ieee80211_filter_duplicates(&priv->ieee80211, skb, fc)) ++ goto drop; ++ ++ /* remove FCS */ ++ if (dev->flags & IFF_PROMISC) ++ skb_trim(skb, skb->len - FCS_LEN); ++ ++ /* Promiscuous mode disables hardware WEP RX decryption */ ++ if (priv->revid < ADM8211_REV_BA || dev->flags & IFF_PROMISC) { ++ skb = ieee80211_wep_decode(&priv->ieee80211, skb); ++ if (!skb) { ++ priv->wstats.discard.code+=1; ++ priv->stats.rx_errors+=1; ++ return; ++ } ++ } ++ ++ skb = ieee80211_reassemble_frag(&priv->ieee80211, skb); ++ if (!skb) ++ return; ++ ++ /* FIX: this is a hack */ ++ wstats->qual.qual=stat->rssi; ++ wstats->qual.updated=1; ++ switch (WLAN_FC_GET_TYPE(fc)) { ++ case WLAN_FC_TYPE_MGMT: ++ ieee80211_rx_mgmt(&priv->ieee80211, skb, &rx_status); ++ break; ++ case WLAN_FC_TYPE_DATA: ++ skb = ieee80211_data_decaps(&priv->ieee80211, skb); ++ if (skb) { ++ skb->protocol = eth_type_trans(skb, dev); ++ memset(skb->cb, 0, sizeof(skb->cb)); ++ priv->stats.rx_bytes+=skb->len; ++ priv->stats.rx_packets+=1; ++ netif_rx(skb); ++ dev->last_rx = jiffies; ++ } ++ break; ++ case WLAN_FC_TYPE_CTRL: ++ goto drop; ++ } ++ ++ return; ++ ++ drop: ++ dev_kfree_skb(skb); ++} ++ ++ ++static void adm8211_rx_tasklet(unsigned long data) ++{ ++ struct net_device *dev = (struct net_device *) data; ++ struct adm8211_priv *priv = netdev_priv(dev); ++ struct sk_buff *skb; ++ ++ while ((skb = skb_dequeue(&priv->rx_queue)) != NULL) ++ adm8211_rx_skb(dev, skb); ++} ++ ++ ++static void adm8211_interrupt_tci(struct net_device *dev) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ unsigned dirty_tx; ++ ++#if 0 ++ printk(KERN_DEBUG "TCI (dirty_tx=%d cur_tx=%d)\n", ++ priv->dirty_tx, priv->cur_tx); ++#endif ++ ++ spin_lock(&priv->lock); ++ ++ for (dirty_tx = priv->dirty_tx; ++ priv->cur_tx - dirty_tx > 0; dirty_tx++) { ++ unsigned entry = dirty_tx % TX_RING_SIZE; ++ u32 status = le32_to_cpu(priv->tx_ring[entry].status); ++ if (status & TDES0_CONTROL_OWN || ++ !(status & TDES0_CONTROL_DONE)) ++ break; ++ ++ if (status & TDES0_STATUS_ES) { ++ priv->stats.tx_errors+=1; ++ ++ if (status & (TDES0_STATUS_TUF | TDES0_STATUS_TRO)) ++ priv->stats.tx_fifo_errors+=1; ++ if (status & (TDES0_STATUS_TLT | TDES0_STATUS_SOFBR)) ++ priv->wstats.discard.misc+=1; ++ if (status & TDES0_STATUS_TRT) ++ priv->wstats.discard.retries+=1; ++ } else { ++ priv->stats.tx_bytes+=priv->tx_buffers[entry].skb->len; ++ priv->stats.tx_packets+=1; ++ } ++ ++ pci_unmap_single(priv->pdev, priv->tx_buffers[entry].mapping, ++ priv->tx_buffers[entry].skb->len, ++ PCI_DMA_TODEVICE); ++ dev_kfree_skb_irq(priv->tx_buffers[entry].skb); ++ priv->tx_buffers[entry].skb = NULL; ++ } ++ ++ if (priv->cur_tx - dirty_tx < TX_RING_SIZE - 2) ++ netif_wake_queue(dev); ++ ++ priv->dirty_tx = dirty_tx; ++ spin_unlock(&priv->lock); ++} ++ ++ ++static void adm8211_interrupt_rci(struct net_device *dev) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ int entry = priv->cur_rx % RX_RING_SIZE; ++ u32 status; ++ unsigned pktlen; ++ struct sk_buff *skb, *newskb; ++ int limit = RX_RING_SIZE; ++ u8 rssi, rate; ++ ++#if 0 ++ printk(KERN_DEBUG "RCI\n"); ++#endif ++ ++ while (!(priv->rx_ring[entry].status & ++ __constant_cpu_to_le32(RDES0_STATUS_OWN))) { ++ if (--limit < 0) ++ break; ++ ++ status = le32_to_cpu(priv->rx_ring[entry].status); ++ rate = (status & RDES0_STATUS_RXDR) >> 12; ++ rssi = le32_to_cpu(priv->rx_ring[entry].length) & ++ RDES1_STATUS_RSSI; ++ ++#if 0 ++ printk(KERN_DEBUG "%s: RX %02x RXDR=%d FL=%d RSSI=%d " ++ "%s%s%s%s\n", ++ dev->name, status, rate, ++ status & RDES0_STATUS_FL, ++ rssi, ++ status & RDES0_STATUS_ES ? "[ES]" : "", ++ status & RDES0_STATUS_FS ? "[FS]" : "", ++ status & RDES0_STATUS_LS ? "[LS]" : "", ++ status & RDES0_STATUS_CRC16E ? "[CRC16E]" : ""); ++#endif ++ ++ pktlen = status & RDES0_STATUS_FL; ++ if (pktlen > RX_PKT_SIZE) { ++ printk(KERN_DEBUG "%s: too long frame (pktlen=%d)\n", ++ dev->name, pktlen); ++ pktlen = RX_PKT_SIZE; ++ } ++ ++ if (!priv->soft_rx_crc && status & RDES0_STATUS_ES) { ++#if 0 ++ printk(KERN_DEBUG "%s: dropped RX frame with error " ++ "(status=0x%x)\n", dev->name, status); ++#endif ++ skb = NULL; /* old buffer will be reused */ ++ priv->stats.rx_errors+=1; ++ if (status & (RDES0_STATUS_SFDE | ++ RDES0_STATUS_SIGE | RDES0_STATUS_RXTOE)) ++ priv->wstats.discard.misc+=1; ++ if (status & RDES0_STATUS_ICVE) ++ priv->wstats.discard.code+=1; ++ if (status & (RDES0_STATUS_CRC16E | RDES0_STATUS_CRC32E)) ++ priv->stats.rx_crc_errors+=1; ++ ++ } else if (pktlen < RX_COPY_BREAK) { ++ skb = dev_alloc_skb(pktlen); ++ if (skb) { ++ skb->dev = dev; ++ pci_dma_sync_single_for_cpu( ++ priv->pdev, ++ priv->rx_buffers[entry].mapping, ++ pktlen, PCI_DMA_FROMDEVICE); ++ memcpy(skb_put(skb, pktlen), ++ priv->rx_buffers[entry].skb->tail, ++ pktlen); ++ pci_dma_sync_single_for_device( ++ priv->pdev, ++ priv->rx_buffers[entry].mapping, ++ RX_PKT_SIZE, PCI_DMA_FROMDEVICE); ++ } ++ } else { ++ newskb = dev_alloc_skb(RX_PKT_SIZE); ++ if (newskb) { ++ newskb->dev = dev; ++ skb = priv->rx_buffers[entry].skb; ++ skb_put(skb, pktlen); ++ pci_unmap_single( ++ priv->pdev, ++ priv->rx_buffers[entry].mapping, ++ RX_PKT_SIZE, PCI_DMA_FROMDEVICE); ++ priv->rx_buffers[entry].skb = newskb; ++ priv->rx_buffers[entry].mapping = ++ pci_map_single(priv->pdev, ++ newskb->tail, ++ RX_PKT_SIZE, ++ PCI_DMA_FROMDEVICE); ++ } else { ++ skb = NULL; ++ priv->stats.rx_dropped+=1; ++ } ++ ++ priv->rx_ring[entry].buffer1 = ++ cpu_to_le32(priv->rx_buffers[entry].mapping); ++ } ++ ++ priv->rx_ring[entry].status = cpu_to_le32( RDES0_STATUS_OWN | RDES0_STATUS_SQL ); ++ priv->rx_ring[entry].length = ++ cpu_to_le32(RX_PKT_SIZE | ++ (entry == RX_RING_SIZE - 1 ? ++ RDES1_CONTROL_RER : 0)); ++ ++ if (skb) { ++ struct adm8211_rx_status *stat = ++ (struct adm8211_rx_status *) skb->cb; ++#if 0 ++ { ++ int i; ++ printk(KERN_DEBUG "RX[%d/%d]", ++ pktlen, skb->len); ++ for (i = 0; i < skb->len; i++) ++ printk(" %02x", skb->data[i]); ++ printk("\n"); ++ } ++#endif ++ stat->rssi = rssi; ++ stat->rate = rate; ++ skb->mac.raw = skb->data; ++ skb->protocol = __constant_htons(ETH_P_802_2); ++ skb_queue_tail(&priv->rx_queue, skb); ++ tasklet_schedule(&priv->rx_tasklet); ++ } ++ ++ entry = (++priv->cur_rx) % RX_RING_SIZE; ++ } ++ ++ priv->stats.rx_missed_errors += ADM8211_CSR_READ(LPC) & 0xFFFF; ++} ++ ++ ++static irqreturn_t adm8211_interrupt(int irq, void *dev_id, ++ struct pt_regs *regs) ++{ ++#define ADM8211_INT(x) if (stsr & ADM8211_STSR_ ## x) printk(KERN_DEBUG "%s: " #x "\n", dev->name) ++ ++ struct net_device *dev = dev_id; ++ struct adm8211_priv *priv = netdev_priv(dev); ++ u32 stsr; ++ int count = 0; ++ ++ do { ++ stsr = ADM8211_CSR_READ(STSR); ++ ADM8211_CSR_WRITE(STSR, stsr); ++ if (stsr == 0xffffffff) ++ return IRQ_HANDLED; ++ ++ if (!(stsr & (ADM8211_STSR_NISS | ADM8211_STSR_AISS))) ++ break; ++ ++ ADM8211_INT(LinkOn); ++ if (stsr & ADM8211_STSR_LinkOff) { ++ printk(KERN_DEBUG "%s: LinkOff\n", dev->name); ++ /* HACK */ ++ if (dev->flags & IFF_UP) ++ ieee80211_start(&priv->ieee80211); ++ } ++ /*if (stsr & ADM8211_STSR_TBTT) { ++ adm8211_beacon_sync(dev); ++ }*/ ++ ++ if (stsr & ADM8211_STSR_RCI) ++ adm8211_interrupt_rci(dev); ++ if (stsr & ADM8211_STSR_TCI) ++ adm8211_interrupt_tci(dev); ++ ++ ADM8211_INT(PCF); ++ /*ADM8211_INT(BCNTC);*/ ++ ADM8211_INT(GPINT); ++ ADM8211_INT(ATIMTC); ++ /*ADM8211_INT(TSFTF);*/ ++ ADM8211_INT(TSCZ); ++ ADM8211_INT(SQL); ++ ADM8211_INT(WEPTD); ++ ADM8211_INT(ATIME); ++ /*ADM8211_INT(TBTT);*/ ++ ADM8211_INT(TEIS); ++ ADM8211_INT(FBE); ++ ADM8211_INT(REIS); ++ ADM8211_INT(GPTT); ++ ADM8211_INT(RPS); ++ ADM8211_INT(RDU); ++ ADM8211_INT(TUF); ++ /*ADM8211_INT(TRT);*/ ++ /*ADM8211_INT(TLT);*/ ++ /*ADM8211_INT(TDU);*/ ++ ADM8211_INT(TPS); ++ ++ ++ } while (count++ < 20); ++ ++ return IRQ_RETVAL(count); ++ ++#undef ADM8211_INT ++} ++ ++static int adm8211_rf_write_syn_max2820 (struct net_device *dev, u8 addr, u16 value) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ int i; ++ u32 reg; ++ ++ value &= 0xFFF; ++ addr &= 0xF; ++ value = value | (addr << 12); ++ ++ ADM8211_CSR_WRITE(SYNRF, ADM8211_SYNRF_IF_SELECT_1); ++ ADM8211_CSR_READ(SYNRF); ++ ADM8211_CSR_WRITE(SYNRF, ADM8211_SYNRF_IF_SELECT_0); ++ ADM8211_CSR_READ(SYNRF); ++ ++ ADM8211_CSR_WRITE(SYNRF, ADM8211_SYNRF_WRITE_SYNDATA_0); ++ ADM8211_CSR_READ(SYNRF); ++ ++ for (i = 0; i <= 15; i+=1) { ++ if ( value & (1 << (15 - i)) ) ++ reg = ADM8211_SYNRF_WRITE_SYNDATA_1; ++ else ++ reg = ADM8211_SYNRF_WRITE_SYNDATA_0; ++ ++ ADM8211_CSR_WRITE(SYNRF, reg); ++ ADM8211_CSR_READ(SYNRF); ++ ++ ADM8211_CSR_WRITE(SYNRF, reg | ADM8211_SYNRF_WRITE_CLOCK_1); ++ ADM8211_CSR_READ(SYNRF); ++ ADM8211_CSR_WRITE(SYNRF, reg | ADM8211_SYNRF_WRITE_CLOCK_0); ++ ADM8211_CSR_READ(SYNRF); ++ } ++ ++ ADM8211_CSR_WRITE(SYNRF, reg | ADM8211_SYNRF_IF_SELECT_0); ++ ADM8211_CSR_READ(SYNRF); ++ ++ ADM8211_CSR_WRITE(SYNRF, 0); ++ ADM8211_CSR_READ(SYNRF); ++ ++ return 0; ++} ++ ++static int adm8211_rf_write_syn_al2210l (struct net_device *dev, u8 addr, u32 value) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ int i; ++ u32 reg; ++ ++ value &= 0xFFFFF; ++ addr &= 0xF; ++ value = (value << 4) | addr; ++ ++ ADM8211_CSR_WRITE(SYNRF, ADM8211_SYNRF_IF_SELECT_1); ++ ADM8211_CSR_READ(SYNRF); ++ ADM8211_CSR_WRITE(SYNRF, ADM8211_SYNRF_IF_SELECT_0); ++ ADM8211_CSR_READ(SYNRF); ++ ++ ADM8211_CSR_WRITE(SYNRF, ADM8211_SYNRF_WRITE_SYNDATA_0); ++ ADM8211_CSR_READ(SYNRF); ++ ++ for (i = 0; i <= 23; i+=1) { ++ if ( value & (1 << (23 - i)) ) ++ reg = ADM8211_SYNRF_WRITE_SYNDATA_1; ++ else ++ reg = ADM8211_SYNRF_WRITE_SYNDATA_0; ++ ++ ADM8211_CSR_WRITE(SYNRF, reg); ++ ADM8211_CSR_READ(SYNRF); ++ ++ ADM8211_CSR_WRITE(SYNRF, reg | ADM8211_SYNRF_WRITE_CLOCK_1); ++ ADM8211_CSR_READ(SYNRF); ++ ADM8211_CSR_WRITE(SYNRF, reg | ADM8211_SYNRF_WRITE_CLOCK_0); ++ ADM8211_CSR_READ(SYNRF); ++ } ++ ++ ADM8211_CSR_WRITE(SYNRF, reg | ADM8211_SYNRF_IF_SELECT_0); ++ ADM8211_CSR_READ(SYNRF); ++ ++ ADM8211_CSR_WRITE(SYNRF, 0); ++ ADM8211_CSR_READ(SYNRF); ++ ++ return 0; ++} ++ ++static int adm8211_rf_write_syn_rfmd2958 (struct net_device *dev, u16 addr, u32 value) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ int i; ++ u32 reg; ++ ++ value &= 0x3FFFF; ++ addr &= 0x1F; ++ value = value | (addr << 18); ++ ++ ADM8211_CSR_WRITE(SYNRF, ADM8211_SYNRF_IF_SELECT_1); ++ ADM8211_CSR_READ(SYNRF); ++ ADM8211_CSR_WRITE(SYNRF, ADM8211_SYNRF_IF_SELECT_0); ++ ADM8211_CSR_READ(SYNRF); ++ ++ for (i = 0; i <= 23; i+=1) { ++ if ( value & (1 << (23 - i)) ) ++ reg = ADM8211_SYNRF_WRITE_SYNDATA_1; ++ else ++ reg = ADM8211_SYNRF_WRITE_SYNDATA_0; ++ ++ ADM8211_CSR_WRITE(SYNRF, reg); ++ ADM8211_CSR_READ(SYNRF); ++ ++ ADM8211_CSR_WRITE(SYNRF, reg | ADM8211_SYNRF_WRITE_CLOCK_1); ++ ADM8211_CSR_READ(SYNRF); ++ ADM8211_CSR_WRITE(SYNRF, reg | ADM8211_SYNRF_WRITE_CLOCK_0); ++ ADM8211_CSR_READ(SYNRF); ++ } ++ ++ ADM8211_CSR_WRITE(SYNRF, reg | ADM8211_SYNRF_IF_SELECT_0); ++ ADM8211_CSR_READ(SYNRF); ++ ++ ADM8211_CSR_WRITE(SYNRF, 0); ++ ADM8211_CSR_READ(SYNRF); ++ ++ return 0; ++} ++ ++#if 0 ++static int adm8211_rf_write_syn_rfmd2948 (struct net_device *dev, u8 addr, u16 value) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ int i; ++ u32 reg, bits; ++ ++ value &= 0xFFFF; ++ addr &= 0xF; ++ bits = (value << 4) | addr; ++ ++ ADM8211_CSR_WRITE(SYNRF, ADM8211_SYNRF_IF_SELECT_1); ++ ADM8211_CSR_READ(SYNRF); ++ ADM8211_CSR_WRITE(SYNRF, ADM8211_SYNRF_IF_SELECT_0); ++ ADM8211_CSR_READ(SYNRF); ++ ++ for (i = 0; i <= 21; i+=1) { ++ if ( bits & (1 << (21 - i)) ) ++ reg = ADM8211_SYNRF_WRITE_SYNDATA_1; ++ else ++ reg = ADM8211_SYNRF_WRITE_SYNDATA_0; ++ ++ ADM8211_CSR_WRITE(SYNRF, reg); ++ ADM8211_CSR_READ(SYNRF); ++ ++ ADM8211_CSR_WRITE(SYNRF, reg | ADM8211_SYNRF_WRITE_CLOCK_1); ++ ADM8211_CSR_READ(SYNRF); ++ ADM8211_CSR_WRITE(SYNRF, reg | ADM8211_SYNRF_WRITE_CLOCK_0); ++ ADM8211_CSR_READ(SYNRF); ++ } ++ ++ ADM8211_CSR_WRITE(SYNRF, reg | ADM8211_SYNRF_IF_SELECT_1); ++ ADM8211_CSR_READ(SYNRF); ++ ++ ADM8211_CSR_WRITE(SYNRF, 0); ++ ADM8211_CSR_READ(SYNRF); ++ ++ return 0; ++} ++#else ++static int adm8211_rf_write_syn_rfmd2948 (struct net_device *dev, u8 addr, u32 data) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ int timeout; ++ ++ timeout=20; ++ while (timeout > 0) { ++ if (!(ADM8211_CSR_READ(SYNCTL) & (ADM8211_SYNCTL_WR | ADM8211_SYNCTL_RD))) ++ break; ++ timeout--; ++ mdelay(1); ++ } ++ if (timeout == 0) { ++ printk(KERN_DEBUG "%s: SYNCTL prewrite timeout(addr=0x%x, data=0x%x)\n", ++ dev->name, addr, data); ++ return -1; ++ } ++ ++ ADM8211_CSR_WRITE(SYNCTL, ADM8211_SYNCTL_WR | ADM8211_SYNCTL_CS0 | ++ ADM8211_SYNCTL_RFMD | data << 4 | addr); ++ ++ timeout=20; ++ while (timeout > 0) { ++ if (!(ADM8211_CSR_READ(SYNCTL) & ADM8211_SYNCTL_WR)) ++ break; ++ timeout--; ++ mdelay(1); ++ } ++ ++ ADM8211_CSR_WRITE(SYNCTL, ADM8211_CSR_READ(SYNCTL) & (~ADM8211_SYNCTL_WR)); ++ if (timeout == 0) { ++ printk(KERN_DEBUG "%s: SYNCTL postwrite timeout(addr=0x%x, data=0x%x)\n", ++ dev->name, addr, data); ++ return -1; ++ } ++ ++ return 0; ++} ++#endif ++ ++int adm8211_rf_set_channel(struct net_device *dev, int channel) ++{ ++ static const u32 adm8211_rfmd2958_reg5[] = ++ {0x22BD, 0x22D2, 0x22E8, 0x22FE, 0x2314, 0x232A, 0x2340, ++ 0x2355, 0x236B, 0x2381, 0x2397, 0x23AD, 0x23C2, 0x23F7}; ++ static const u32 adm8211_rfmd2958_reg6[] = ++ {0x05D17, 0x3A2E8, 0x2E8BA, 0x22E8B, 0x1745D, 0x0BA2E, 0x00000, ++ 0x345D1, 0x28BA2, 0x1D174, 0x11745, 0x05D17, 0x3A2E8, 0x11745}; ++ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ u32 reg; ++ ++ if (channel < 1 || channel > 14) ++ return -1; ++ ++ ADM8211_CSR_WRITE(SYNRF, ADM8211_SYNRF_SELRF | ADM8211_SYNRF_PE1 | ++ ADM8211_SYNRF_PHYRST); ++ ADM8211_CSR_READ(SYNRF); ++ mdelay(30); ++ ++ /* Stop transmit */ ++ ADM8211_CSR_WRITE(NAR, priv->nar & ~(ADM8211_NAR_ST | ADM8211_NAR_SR)); ++ ADM8211_CSR_READ(NAR); ++ mdelay(20); ++ ++ /* Program synthesizer to new channel */ ++ switch (priv->transceiver_type) { ++ case ADM8211_RFMD2958: ++ case ADM8211_RFMD2958_RF3000_CONTROL_POWER: ++ adm8211_rf_write_syn_rfmd2958(dev, 0x00, 0x04007); ++ adm8211_rf_write_syn_rfmd2958(dev, 0x02, 0x00033); ++ ++ adm8211_rf_write_syn_rfmd2958(dev, 0x05, ++ adm8211_rfmd2958_reg5[channel-1]); ++ adm8211_rf_write_syn_rfmd2958(dev, 0x06, ++ adm8211_rfmd2958_reg6[channel-1]); ++ break; ++ ++ case ADM8211_RFMD2948: ++ adm8211_rf_write_syn_rfmd2948(dev, SI4126_MAIN_CONF, SI4126_MAIN_XINDIV2); ++ adm8211_rf_write_syn_rfmd2948(dev, SI4126_POWERDOWN, ++ SI4126_POWERDOWN_PDIB | SI4126_POWERDOWN_PDRB); ++ adm8211_rf_write_syn_rfmd2948(dev, SI4126_PHASE_DET_GAIN, 0); ++ adm8211_rf_write_syn_rfmd2948(dev, SI4126_RF2_N_DIV, ++ (channel == 14 ? 2110 : 2033 + (channel * 5))); ++ adm8211_rf_write_syn_rfmd2948(dev, SI4126_IF_N_DIV, 1496); ++ adm8211_rf_write_syn_rfmd2948(dev, SI4126_RF2_R_DIV, 44); ++ adm8211_rf_write_syn_rfmd2948(dev, SI4126_IF_R_DIV, 44); ++ break; ++ ++ case ADM8211_MAX2820: ++ adm8211_rf_write_syn_max2820(dev, 0x3, ++ (channel == 14 ? 0x054 : 0x7 + (channel * 5))); ++ break; ++ ++ case ADM8211_AL2210L: ++ adm8211_rf_write_syn_al2210l(dev, 0x0, ++ (channel == 14 ? 0x229B4 : 0x22967 + (channel * 5))); ++ break; ++ ++ default: ++ printk(KERN_DEBUG "%s: unsupported transceiver type %d\n", ++ dev->name, priv->transceiver_type); ++ break; ++ } ++ ++ /* write BBP regs */ ++ if (priv->bbp_type == ADM8211_TYPE_RFMD) { ++ ++ /* SMC 2635W specific? adm8211b doesn't use the 2948 though.. */ ++ if (priv->transceiver_type == ADM8211_RFMD2948) { ++ reg = ADM8211_CSR_READ(GPIO); ++ reg &= 0xfffc0000; ++ reg |= ADM8211_CSR_GPIO_EN0; ++ if (channel != 14) ++ reg |= ADM8211_CSR_GPIO_O0; ++ ADM8211_CSR_WRITE(GPIO, reg); ++ } ++ ++ if (priv->transceiver_type == ADM8211_RFMD2958) { ++ /* set PCNT2 */ ++ adm8211_rf_write_syn_rfmd2958(dev, 0x0B, 0x07100); ++ /* set PCNT1 P_DESIRED/MID_BIAS */ ++ reg = le16_to_cpu(priv->eeprom->cr49); ++ reg >>= 13; ++ reg <<= 15; ++ reg |= priv->eeprom->antenna_power[channel-1]<<9; ++ adm8211_rf_write_syn_rfmd2958(dev, 0x0A, reg); ++ /* set TXRX TX_GAIN */ ++ adm8211_rf_write_syn_rfmd2958(dev, 0x09, 0x00050 | ++ (priv->revid < ADM8211_REV_CA ? ++ priv->eeprom->tx_power[channel-1] : 0)); ++ } else { ++ reg = ADM8211_CSR_READ(PLCPHD); ++ reg &= 0xff00ffff; ++ reg |= priv->eeprom->tx_power[channel-1]<<18; ++ ADM8211_CSR_WRITE(PLCPHD, reg); ++ } ++ ++ /* RF3000 BBP */ ++ if (priv->transceiver_type != ADM8211_RFMD2958) ++ adm8211_write_bbp(dev, RF3000_TX_VAR_GAIN__TX_LEN_EXT, ++ priv->eeprom->tx_power[channel-1]<<2); ++ adm8211_write_bbp(dev, RF3000_LOW_GAIN_CALIB, ++ priv->eeprom->lpf_cutoff[channel-1]); ++ adm8211_write_bbp(dev, RF3000_HIGH_GAIN_CALIB, ++ priv->eeprom->lnags_threshold[channel-1]); ++ adm8211_write_bbp(dev, 0x1c, priv->revid == ADM8211_REV_BA /* RF3002 BBP specific? */ ++ ? priv->eeprom->cr28 : 0); ++ adm8211_write_bbp(dev, 0x1d, priv->eeprom->cr29); ++ ++ } else if (priv->bbp_type != ADM8211_TYPE_ADMTEK) { /* Nothing to do for ADMtek BBP */ ++ printk(KERN_DEBUG "%s: unsupported BBP type %d\n", ++ dev->name, priv->bbp_type); ++ } ++ ++ ADM8211_CSR_WRITE(NAR, priv->nar); ++ ++ ADM8211_CSR_WRITE(SYNRF, 0); ++ ++ reg = ADM8211_CSR_READ(CAP0); ++ reg &= ~0xF; ++ reg |= channel; ++ ADM8211_CSR_WRITE(CAP0, reg); ++ ++ return 0; ++} ++ ++void adm8211_write_wepkey(struct net_device *dev, int index) ++{ ++#define ADM8211_WEP_ENABLE (1 << 7) ++#define ADM8211_WEP_A_104 (1 << 6) ++#define ADM8211_WEP_B_104 (1 << 4) ++ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ struct ieee80211_data *data = &priv->ieee80211; ++ int addr; ++ char buf[32]; ++ memset(buf, 0, sizeof(buf)); ++ ++ if (priv->revid < ADM8211_REV_BA) { ++ addr = (index*7) + ADM8211_SRAM_A_SHARE_KEY; ++ ++ /* control entry */ ++ if (data->wep_data[index].len > 5) ++ buf[1] = (ADM8211_WEP_ENABLE | ADM8211_WEP_A_104); ++ else if (data->wep_data[index].len > 0) ++ buf[1] = ADM8211_WEP_ENABLE; ++ ++ buf[0]=data->wep_data[index].key[0]; ++ ++ if (data->wep_data[index].len > 0) ++ memcpy(buf+2, &(data->wep_data[index].key[1]), data->wep_data[index].len-1); ++ ++ adm8211_write_sram_bytes(dev, addr, buf, 14); ++ } else { ++ addr = (index*5) + ADM8211_SRAM_B_SHARE_KEY; ++ ++ /* control entry */ ++ if (data->wep_data[index].len > 5) ++ *((u32 *)(&buf[0])) = cpu_to_le32(ADM8211_WEP_ENABLE | ADM8211_WEP_B_104); ++ else if (data->wep_data[index].len > 0) ++ *((u32 *)(&buf[0])) = cpu_to_le32(ADM8211_WEP_ENABLE); ++ ++ if (data->wep_data[index].len > 0) ++ memcpy(buf+4, data->wep_data[index].key, data->wep_data[index].len); ++ ++ adm8211_write_sram_bytes(dev, addr, buf, 17); ++ } ++} ++ ++void adm8211_update_wep(struct net_device *dev) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ struct ieee80211_data *data = &priv->ieee80211; ++ u32 reg; ++ ++ reg = ADM8211_CSR_READ(MACTEST); ++ if (data->wep_enabled) { ++ reg &= ~(3<<20); ++ reg |= (1<<22); ++ reg |= (data->default_key << 20); ++ } else ++ reg &= ~(7<<20); ++ ADM8211_CSR_WRITE(MACTEST, reg); ++ ++ reg = ADM8211_CSR_READ(WEPCTL); ++ if (data->wep_enabled) ++ reg |= ADM8211_WEPCTL_WEPENABLE; ++ else ++ reg &= ~ADM8211_WEPCTL_WEPENABLE; ++ ++ /* no hardware WEP RX decryption on the ADM8211A */ ++ if (priv->revid < ADM8211_REV_BA) ++ reg |= ADM8211_WEPCTL_WEPRXBYP; ++ ++ ADM8211_CSR_WRITE(WEPCTL, reg); ++} ++ ++void adm8211_update_mode(struct net_device *dev) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ struct ieee80211_data *data = &priv->ieee80211; ++ ++ /* make sure receive is stopped */ ++ if (priv->nar & ADM8211_NAR_SR) { ++ ADM8211_CSR_WRITE(NAR, priv->nar & ~ADM8211_NAR_SR); ++ ADM8211_CSR_READ(NAR); ++ mdelay(20); ++ } ++ ++ priv->soft_rx_crc = 0; ++ switch (priv->iw_mode) { ++ case IW_MODE_INFRA: ++ priv->nar &= ~(ADM8211_NAR_PR | ADM8211_NAR_EA); ++ priv->nar |= ADM8211_NAR_ST; ++ ADM8211_CSR_WRITE(CAP1, data->capab<<16); ++ break; ++ case IW_MODE_ADHOC: ++ priv->nar &= ~ADM8211_NAR_PR; ++ priv->nar |= ADM8211_NAR_EA | ADM8211_NAR_ST; ++ ++ ADM8211_CSR_WRITE(CAP1, data->capab<<16); ++ ++ /* don't trust the error bits on rev 0x20 and up in adhoc */ ++ if (priv->revid >= ADM8211_REV_BA) ++ priv->soft_rx_crc = 1; ++ break; ++ case IW_MODE_MONITOR: ++ priv->nar &= ~(ADM8211_NAR_EA | ADM8211_NAR_ST); ++ priv->nar |= ADM8211_NAR_PR; ++ ADM8211_CSR_WRITE(CAP1, 0); ++ break; ++ } ++ ++ ADM8211_CSR_WRITE(NAR, priv->nar); ++} ++ ++static int adm8211_write_bbp(struct net_device *dev, u8 addr, u8 data) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ int timeout; ++ u32 reg; ++ ++ timeout = 10; ++ while (timeout > 0) { ++ reg = ADM8211_CSR_READ(BBPCTL); ++ if (!(reg & (ADM8211_BBPCTL_WR | ADM8211_BBPCTL_RD))) ++ break; ++ timeout--; ++ mdelay(2); ++ } ++ if (timeout == 0) { ++ printk(KERN_DEBUG "%s: adm8211_write_bbp(%d,%d) failed prewrite " ++ "(reg=0x%08x)\n", ++ dev->name, addr, data, reg); ++ return -ETIMEDOUT; ++ } ++ ++ switch (priv->bbp_type) { ++ case ADM8211_TYPE_INTERSIL: ++ reg = ADM8211_BBPCTL_MMISEL; /* three wire interface */ ++ break; ++ case ADM8211_TYPE_RFMD: ++ reg = (0x20<<24) | ADM8211_BBPCTL_TXCE | ADM8211_BBPCTL_CCAP | ++ (0x01<<18); ++ break; ++ case ADM8211_TYPE_ADMTEK: ++ reg = (0x20<<24) | ADM8211_BBPCTL_TXCE | ADM8211_BBPCTL_CCAP | ++ (0x05<<18); ++ break; ++ } ++ reg |= ADM8211_BBPCTL_WR | (addr << 8) | data; ++ ++ ADM8211_CSR_WRITE(BBPCTL, reg); ++ ++ timeout=10; ++ while (timeout > 0) { ++ reg = ADM8211_CSR_READ(BBPCTL); ++ if (!(reg & ADM8211_BBPCTL_WR)) ++ break; ++ timeout--; ++ mdelay(2); ++ } ++ ++ if (timeout == 0) { ++ ADM8211_CSR_WRITE(BBPCTL, ADM8211_CSR_READ(BBPCTL) & ++ (~ADM8211_BBPCTL_WR)); ++ /* FIX: WR bit is supposed to be cleared, but for some reason ++ * this does not seem to happen.. Could just comment out this ++ * warning(?) */ ++ if (priv->revid != ADM8211_REV_BA) ++ printk(KERN_DEBUG "%s: adm8211_write_bbp(%d,%d) failed postwrite " ++ "(reg=0x%08x)\n", ++ dev->name, addr, data, reg); ++ return -ETIMEDOUT; ++ } ++ ++ return 0; ++} ++ ++static void adm8211_hw_init_syn(struct net_device *dev) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ ++ switch (priv->transceiver_type) { ++ case ADM8211_RFMD2958: ++ case ADM8211_RFMD2958_RF3000_CONTROL_POWER: ++ adm8211_rf_write_syn_rfmd2958(dev, 0x1F, 0x00000); ++ adm8211_rf_write_syn_rfmd2958(dev, 0x0C, 0x3001F); ++ adm8211_rf_write_syn_rfmd2958(dev, 0x01, 0x29C03); ++ adm8211_rf_write_syn_rfmd2958(dev, 0x03, 0x1FF6F); ++ adm8211_rf_write_syn_rfmd2958(dev, 0x04, 0x29403); ++ adm8211_rf_write_syn_rfmd2958(dev, 0x07, 0x1456F); ++ adm8211_rf_write_syn_rfmd2958(dev, 0x09, ++ (priv->transceiver_type == ADM8211_RFMD2958 ++ ? 0x10050 : 0x00050) ); ++ adm8211_rf_write_syn_rfmd2958(dev, 0x08, 0x3FFF8); ++ break; ++ case ADM8211_MAX2820: ++ adm8211_rf_write_syn_max2820(dev, 0x1, 0x01E); ++ adm8211_rf_write_syn_max2820(dev, 0x2, 0x001); ++ adm8211_rf_write_syn_max2820(dev, 0x3, 0x054); ++ adm8211_rf_write_syn_max2820(dev, 0x4, 0x310); ++ adm8211_rf_write_syn_max2820(dev, 0x5, 0x000); ++ break; ++ case ADM8211_AL2210L: ++ adm8211_rf_write_syn_al2210l(dev, 0x0, 0x0196C); ++ adm8211_rf_write_syn_al2210l(dev, 0x1, 0x007CB); ++ adm8211_rf_write_syn_al2210l(dev, 0x2, 0x3582F); ++ adm8211_rf_write_syn_al2210l(dev, 0x3, 0x010A9); ++ adm8211_rf_write_syn_al2210l(dev, 0x4, 0x77280); ++ adm8211_rf_write_syn_al2210l(dev, 0x5, 0x45641); ++ adm8211_rf_write_syn_al2210l(dev, 0x6, 0xEA130); ++ adm8211_rf_write_syn_al2210l(dev, 0x7, 0x80000); ++ adm8211_rf_write_syn_al2210l(dev, 0x8, 0x7850F); ++ adm8211_rf_write_syn_al2210l(dev, 0x9, 0xF900C); ++ adm8211_rf_write_syn_al2210l(dev, 0xA, 0x00000); ++ adm8211_rf_write_syn_al2210l(dev, 0xB, 0x00000); ++ break; ++ case ADM8211_RFMD2948: ++ default: ++ break; ++ } ++} ++ ++static int adm8211_hw_init_bbp(struct net_device *dev) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ u32 reg; ++ ++ /* write addresses */ ++ if (priv->bbp_type == ADM8211_TYPE_INTERSIL) { ++ ADM8211_CSR_WRITE(MMIWA, 0x100E0C0A); ++ ADM8211_CSR_WRITE(MMIRD0, 0x00007c7e); ++ ADM8211_CSR_WRITE(MMIRD1, 0x00100000); ++ } else if (priv->bbp_type == ADM8211_TYPE_RFMD || ++ priv->bbp_type == ADM8211_TYPE_ADMTEK) { ++ ++ /* check specific BBP type */ ++ switch (priv->eeprom->specific_bbptype) { ++ case ADM8211_BBP_RFMD3000: ++ case ADM8211_BBP_RFMD3002: ++ ADM8211_CSR_WRITE(MMIWA, 0x00009101); ++ ADM8211_CSR_WRITE(MMIRD0, 0x00000301); ++ break; ++ case ADM8211_BBP_ADM8011: ++ ADM8211_CSR_WRITE(MMIWA, 0x00008903); ++ ADM8211_CSR_WRITE(MMIRD0, 0x00001716); ++ ++ reg = ADM8211_CSR_READ(BBPCTL); ++ reg &= ~ADM8211_BBPCTL_TYPE; ++ reg |= 0x5 << 18; ++ ADM8211_CSR_WRITE(BBPCTL, reg); ++ break; ++ } ++ ++ switch (priv->revid) { ++ case ADM8211_REV_CA: ++ if (priv->transceiver_type == ADM8211_RFMD2958 || ++ priv->transceiver_type == ADM8211_RFMD2958_RF3000_CONTROL_POWER || ++ priv->transceiver_type == ADM8211_RFMD2948) ++ ADM8211_CSR_WRITE(SYNCTL, (0x1 << 22)); ++ else if (priv->transceiver_type == ADM8211_MAX2820 || ++ priv->transceiver_type == ADM8211_AL2210L) ++ ADM8211_CSR_WRITE(SYNCTL, (0x3 << 22)); ++ break; ++ ++ case ADM8211_REV_BA: ++ reg = ADM8211_CSR_READ(MMIRD1); ++ reg &= 0x0000FFFF; ++ reg |= 0x7e100000; ++ ADM8211_CSR_WRITE(MMIRD1, reg); ++ break; ++ ++ case ADM8211_REV_AB: ++ case ADM8211_REV_AF: ++ default: ++ ADM8211_CSR_WRITE(MMIRD1, 0x7e100000); ++ break; ++ } ++ ++ /* For RFMD */ ++ ADM8211_CSR_WRITE(MACTEST, 0x800); ++ } ++ ++ adm8211_hw_init_syn(dev); ++ ++ /* Set RF Power control IF pin to PE1+PHYRST# */ ++ ADM8211_CSR_WRITE(SYNRF, ADM8211_SYNRF_SELRF | ADM8211_SYNRF_PE1 | ++ ADM8211_SYNRF_PHYRST); ++ ADM8211_CSR_READ(SYNRF); ++ mdelay(20); ++ ++ /* write BBP regs */ ++ if (priv->bbp_type == ADM8211_TYPE_RFMD) { ++ /* RF3000 BBP */ ++ /* another set: ++ * 11: c8 ++ * 14: 14 ++ * 15: 50 (chan 1..13; chan 14: d0) ++ * 1c: 00 ++ * 1d: 84 ++ */ ++ adm8211_write_bbp(dev, RF3000_CCA_CTRL, 0x80); ++ adm8211_write_bbp(dev, RF3000_DIVERSITY__RSSI, 0x80); /* antenna selection: diversity */ ++ adm8211_write_bbp(dev, RF3000_TX_VAR_GAIN__TX_LEN_EXT, 0x74); ++ adm8211_write_bbp(dev, RF3000_LOW_GAIN_CALIB, 0x38); ++ adm8211_write_bbp(dev, RF3000_HIGH_GAIN_CALIB, 0x40); ++ ++ if (priv->eeprom->major_version < 2) { ++ adm8211_write_bbp(dev, 0x1c, 0x00); ++ adm8211_write_bbp(dev, 0x1d, 0x80); ++ } else { ++ if (priv->revid == ADM8211_REV_BA) ++ adm8211_write_bbp(dev, 0x1c, priv->eeprom->cr28); ++ else ++ adm8211_write_bbp(dev, 0x1c, 0x00); ++ ++ adm8211_write_bbp(dev, 0x1d, priv->eeprom->cr29); ++ } ++ } else if (priv->bbp_type == ADM8211_TYPE_ADMTEK) { ++ adm8211_write_bbp(dev, 0x00, 0xFF); /* reset baseband */ ++ adm8211_write_bbp(dev, 0x07, 0x0A); /* antenna selection: diversity */ ++ /* TODO: find documentation for this */ ++ switch (priv->transceiver_type) { ++ case ADM8211_RFMD2958: ++ case ADM8211_RFMD2958_RF3000_CONTROL_POWER: ++ adm8211_write_bbp(dev, 0x00, 0x00); ++ adm8211_write_bbp(dev, 0x01, 0x00); ++ adm8211_write_bbp(dev, 0x02, 0x00); ++ adm8211_write_bbp(dev, 0x03, 0x00); ++ adm8211_write_bbp(dev, 0x06, 0x0f); ++ adm8211_write_bbp(dev, 0x09, 0x00); ++ adm8211_write_bbp(dev, 0x0a, 0x00); ++ adm8211_write_bbp(dev, 0x0b, 0x00); ++ adm8211_write_bbp(dev, 0x0c, 0x00); ++ adm8211_write_bbp(dev, 0x0f, 0xAA); ++ adm8211_write_bbp(dev, 0x10, 0x8c); ++ adm8211_write_bbp(dev, 0x11, 0x43); ++ adm8211_write_bbp(dev, 0x18, 0x40); ++ adm8211_write_bbp(dev, 0x20, 0x23); ++ adm8211_write_bbp(dev, 0x21, 0x02); ++ adm8211_write_bbp(dev, 0x22, 0x28); ++ adm8211_write_bbp(dev, 0x23, 0x30); ++ adm8211_write_bbp(dev, 0x24, 0x2d); ++ adm8211_write_bbp(dev, 0x28, 0x35); ++ adm8211_write_bbp(dev, 0x2a, 0x8c); ++ adm8211_write_bbp(dev, 0x2b, 0x81); ++ adm8211_write_bbp(dev, 0x2c, 0x44); ++ adm8211_write_bbp(dev, 0x2d, 0x0A); ++ adm8211_write_bbp(dev, 0x29, 0x40); ++ adm8211_write_bbp(dev, 0x60, 0x08); ++ adm8211_write_bbp(dev, 0x64, 0x01); ++ break; ++ ++ case ADM8211_MAX2820: ++ adm8211_write_bbp(dev, 0x00, 0x00); ++ adm8211_write_bbp(dev, 0x01, 0x00); ++ adm8211_write_bbp(dev, 0x02, 0x00); ++ adm8211_write_bbp(dev, 0x03, 0x00); ++ adm8211_write_bbp(dev, 0x06, 0x0f); ++ adm8211_write_bbp(dev, 0x09, 0x05); ++ adm8211_write_bbp(dev, 0x0a, 0x02); ++ adm8211_write_bbp(dev, 0x0b, 0x00); ++ adm8211_write_bbp(dev, 0x0c, 0x0f); ++ adm8211_write_bbp(dev, 0x0f, 0x55); ++ adm8211_write_bbp(dev, 0x10, 0x8d); ++ adm8211_write_bbp(dev, 0x11, 0x43); ++ adm8211_write_bbp(dev, 0x18, 0x4a); ++ adm8211_write_bbp(dev, 0x20, 0x20); ++ adm8211_write_bbp(dev, 0x21, 0x02); ++ adm8211_write_bbp(dev, 0x22, 0x23); ++ adm8211_write_bbp(dev, 0x23, 0x30); ++ adm8211_write_bbp(dev, 0x24, 0x2d); ++ adm8211_write_bbp(dev, 0x2a, 0x8c); ++ adm8211_write_bbp(dev, 0x2b, 0x81); ++ adm8211_write_bbp(dev, 0x2c, 0x44); ++ adm8211_write_bbp(dev, 0x29, 0x4a); ++ adm8211_write_bbp(dev, 0x60, 0x2b); ++ adm8211_write_bbp(dev, 0x64, 0x01); ++ break; ++ ++ case ADM8211_AL2210L: ++ adm8211_write_bbp(dev, 0x00, 0x00); ++ adm8211_write_bbp(dev, 0x01, 0x00); ++ adm8211_write_bbp(dev, 0x02, 0x00); ++ adm8211_write_bbp(dev, 0x03, 0x00); ++ adm8211_write_bbp(dev, 0x06, 0x0f); ++ adm8211_write_bbp(dev, 0x07, 0x05); ++ adm8211_write_bbp(dev, 0x08, 0x03); ++ adm8211_write_bbp(dev, 0x09, 0x00); ++ adm8211_write_bbp(dev, 0x0a, 0x00); ++ adm8211_write_bbp(dev, 0x0b, 0x00); ++ adm8211_write_bbp(dev, 0x0c, 0x10); ++ adm8211_write_bbp(dev, 0x0f, 0x55); ++ adm8211_write_bbp(dev, 0x10, 0x8d); ++ adm8211_write_bbp(dev, 0x11, 0x43); ++ adm8211_write_bbp(dev, 0x18, 0x4a); ++ adm8211_write_bbp(dev, 0x20, 0x20); ++ adm8211_write_bbp(dev, 0x21, 0x02); ++ adm8211_write_bbp(dev, 0x22, 0x23); ++ adm8211_write_bbp(dev, 0x23, 0x30); ++ adm8211_write_bbp(dev, 0x24, 0x2d); ++ adm8211_write_bbp(dev, 0x2a, 0xaa); ++ adm8211_write_bbp(dev, 0x2b, 0x81); ++ adm8211_write_bbp(dev, 0x2c, 0x44); ++ adm8211_write_bbp(dev, 0x29, 0xfa); ++ adm8211_write_bbp(dev, 0x60, 0x2d); ++ adm8211_write_bbp(dev, 0x64, 0x01); ++ break; ++ ++ case ADM8211_RFMD2948: ++ break; ++ ++ default: ++ printk(KERN_DEBUG "%s: unsupported transceiver type %d\n", ++ dev->name, priv->transceiver_type); ++ break; ++ } ++ } else { ++ printk(KERN_DEBUG "%s: unsupported BBP type %d\n", ++ dev->name, priv->bbp_type); ++ } ++ ++ /* start transmit/receive */ ++ priv->nar |= ADM8211_NAR_ST | ADM8211_NAR_SR; ++ ADM8211_CSR_WRITE(NAR, priv->nar); ++ ++ ADM8211_CSR_WRITE(SYNRF, 0); ++ ++ /* Set RF CAL control source to MAC control */ ++ reg = ADM8211_CSR_READ(SYNCTL); ++ reg |= ADM8211_SYNCTL_SELCAL; ++ ADM8211_CSR_WRITE(SYNCTL, reg); ++ ++ return 0; ++} ++ ++static int adm8211_set_rate(struct net_device *dev) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ struct ieee80211_data *data = &priv->ieee80211; ++ u32 reg; ++ int i = 0; ++ u8 rate_buf[12] = {0}; ++ ++ /* write supported rates */ ++ if (priv->revid != ADM8211_REV_BA) { ++ rate_buf[0] = data->num_supp_rates; ++ for (i = 0; i < data->num_supp_rates; i+=1) ++ rate_buf[i+1] = data->supp_rates[i] | ++ (data->supp_rates[i] <= data->rate ? 0x80 : 0); ++ } else { ++ /* workaround for rev BA specific bug */ ++ rate_buf[0]=4; ++ rate_buf[1]=0x82; ++ rate_buf[2]=0x04; ++ rate_buf[3]=0x0b; ++ rate_buf[4]=0x16; ++ } ++ adm8211_write_sram_bytes(dev, ADM8211_SRAM_SUPP_RATE, rate_buf, data->num_supp_rates+1); ++ ++ priv->plcp_signal = priv->ieee80211.rate*5; ++ ++ /* keep bits 0-23 */ ++ reg = ADM8211_CSR_READ(PLCPHD) & 0x00FFFFFF; ++ ++ /* short preamble */ ++ reg |= (1 << 15); ++ ++ reg |= priv->plcp_signal << 24; ++ ADM8211_CSR_WRITE(PLCPHD, reg); ++ ++ /* MTMLT = 512 TU (max TX MSDU lifetime) ++ * BCNTSIG = plcp_signal (beacon, probe resp, and atim TX rate) ++ * SRTYLIM = 224 (short retry limit, value in TX header used by default) */ ++ ADM8211_CSR_WRITE(TXLMT, (512<<16) | (priv->plcp_signal<<8) | (224<<0)); ++ ++ if (priv->revid >= ADM8211_REV_BA) ++ adm8211_set_beacon(dev); ++ ++ return 0; ++} ++ ++static void adm8211_hw_init(struct net_device *dev) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ u32 reg; ++ u8 cacheline; ++ ++ /* FIX: ? */ ++ /*ADM8211_CSR_WRITE(WCSR, 0xe00021);*/ ++ reg = ADM8211_CSR_READ(CSR_TEST1); ++ reg &= ~(0xF<<28); ++ reg |= ((1 << 28) | (1 << 31)); ++ ADM8211_CSR_WRITE(CSR_TEST1, reg); ++ ++ reg = (0x07 << 21) | (1 << 20) | (1 << 8); ++ ADM8211_CSR_WRITE(WCSR, reg); ++ ++ /* Disable APM, enable receive FIFO threshold, and set drain receive ++ * threshold to store-and-forward */ ++ reg = ADM8211_CSR_READ(CMDR); ++ reg &= ~(ADM8211_CMDR_APM | ADM8211_CMDR_DRT); ++ reg |= ADM8211_CMDR_RTE | ADM8211_CMDR_DRT_SF; ++ ADM8211_CSR_WRITE(CMDR, reg); ++ ++ adm8211_set_rate(dev); ++ ++ /* 4-bit values: ++ * PWR1UP = 8 * 2 ms ++ * PWR0PAPE = 8 us or 5 us ++ * PWR1PAPE = 1 us or 3 us ++ * PWR0TRSW = 5 us ++ * PWR1TRSW = 12 us ++ * PWR0PE2 = 13 us ++ * PWR1PE2 = 1 us ++ * PWR0TXPE = 8 or 6 */ ++ if (priv->revid < ADM8211_REV_CA) ++ ADM8211_CSR_WRITE(TOFS2, 0x8815cd18); ++ else ++ ADM8211_CSR_WRITE(TOFS2, 0x8535cd16); ++ ++ /* Enable store and forward for transmit */ ++ priv->nar = ADM8211_NAR_SF | ADM8211_NAR_PB; ++ ADM8211_CSR_WRITE(NAR, priv->nar); ++ ++ /* Set bit 20 (reset RF) in SYNRF */ ++ ADM8211_CSR_WRITE(SYNRF, ADM8211_SYNRF_RADIO); ++ ADM8211_CSR_READ(SYNRF); ++ mdelay(10); ++ ADM8211_CSR_WRITE(SYNRF, 0); ++ ADM8211_CSR_READ(SYNRF); ++ mdelay(5); ++ ++ /* Set CFP Max Duration to 0x10 TU */ ++ reg = ADM8211_CSR_READ(CFPP); ++ reg &= 0xff0000ff; ++ reg |= 0x00001000; ++ ADM8211_CSR_WRITE(CFPP, reg); ++ ++ /* USCNT = 0x16 (number of system clocks, 22 MHz, in 1us ++ * TUCNT = 0x3ff - Tu counter 1024 us */ ++ ADM8211_CSR_WRITE(TOFS0, (0x16 << 24) | 0x3ff); ++ ++ /* SLOT=20 us, SIFS=110 cycles of 22 MHz (5 us), ++ * DIFS=50 us, EIFS=100 us */ ++ if (priv->revid < ADM8211_REV_CA) ++ ADM8211_CSR_WRITE(IFST, (20 << 23) | (110 << 15) | ++ (50 << 9) | 100); ++ else ++ ADM8211_CSR_WRITE(IFST, (20 << 23) | (24 << 15) | ++ (50 << 9) | 100); ++ ++ /* PCNT = 1 (MAC idle time awake/sleep, unit S) ++ * RMRD = 18769 us (max RX duration) */ ++ /*ADM8211_CSR_WRITE(RMD, (1 << 16) | 18769);*/ ++ ADM8211_CSR_WRITE(RMD, (1 << 16) | 0xFFFF); ++ ++ /* MART=65535 us, MIRT=256 us, TSFTOFST=0 us */ ++ ADM8211_CSR_WRITE(RSPT, 0xffffff00); ++ ++ /* Initialize BBP (and SYN) */ ++ adm8211_hw_init_bbp(dev); ++ /* do it again for adm8211b */ ++ if (priv->revid == ADM8211_REV_BA) ++ adm8211_hw_init_bbp(dev); ++ ++ /* ACK interrupts */ ++ ADM8211_CSR_WRITE(STSR, ADM8211_CSR_READ(STSR)); ++ ++ reg = ADM8211_CSR_READ(PAR); ++ reg |= (0x1<<23) | (0x1<<21); ++ reg &= ~((0x1<<1) | (0x3<<14)); ++ ++ pci_read_config_byte(priv->pdev, PCI_CACHE_LINE_SIZE, &cacheline); ++ switch (cacheline) { ++ case 0x8: reg |= (0x1<<14); ++ break; ++ case 0x16: reg |= (0x2<<14); ++ break; ++ case 0x32: reg |= (0x3<<14); ++ break; ++ default: reg |= (0x0<<14); ++ cacheline = 0; ++ break; ++ } ++ ++ if (cacheline && !pci_set_mwi(priv->pdev)) ++ reg |= (0x1<<24); ++ ++ ADM8211_CSR_WRITE(PAR, reg); ++} ++ ++ ++static int adm8211_hw_reset(struct net_device *dev) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ u32 reg; ++ int timeout = 100; ++ ++ /* Power-on issue */ ++ ADM8211_CSR_WRITE(FRCTL, 0); ++ ++ /* Reset the chip */ ++ reg = ADM8211_CSR_READ(PAR); ++ ADM8211_CSR_WRITE(PAR, ADM8211_PAR_SWR); ++ ++ while ((ADM8211_CSR_READ(PAR) & ADM8211_PAR_SWR) && timeout) { ++ mdelay(50); ++ timeout-=1; ++ } ++ if (timeout <= 0) ++ return -ETIMEDOUT; ++ ++ ADM8211_CSR_WRITE(PAR, reg); ++ ++ if (priv->revid == ADM8211_REV_BA && ++ ( priv->transceiver_type == ADM8211_RFMD2958_RF3000_CONTROL_POWER ++ || priv->transceiver_type == ADM8211_RFMD2958)) { ++ reg = ADM8211_CSR_READ(CSR_TEST1); ++ reg |= (1 << 4) | (1 << 5); ++ ADM8211_CSR_WRITE(CSR_TEST1, reg); ++ } else if (priv->revid == ADM8211_REV_CA) { ++ reg = ADM8211_CSR_READ(CSR_TEST1); ++ reg &= ~((1 << 4) | (1 << 5)); ++ ADM8211_CSR_WRITE(CSR_TEST1, reg); ++ } ++ ++ ADM8211_CSR_WRITE(FRCTL, 0); ++ ++ reg = ADM8211_CSR_READ(CSR_TEST0); ++ reg |= ADM8211_CSR_TEST0_EPRLD; ++ ADM8211_CSR_WRITE(CSR_TEST0, reg); ++ ++ adm8211_clear_sram(dev); ++ ++ return 0; ++} ++ ++/* First beacon was sent at time 0 microseconds, current time is ++ * __tsft microseconds, and beacon interval is __tbtt ++ * microseconds. Return the expected time in microseconds for the ++ * beacon after next. ++ */ ++static inline uint64_t adm8211_predict_beacon(uint64_t __tsft, uint32_t __tbtt) ++{ ++ uint64_t tmp = __tsft; ++ return __tsft + (__tbtt - do_div(tmp, __tbtt)); ++} ++ ++static void adm8211_beacon_sync(struct net_device *dev) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ struct ieee80211_data *data = &priv->ieee80211; ++ struct ieee80211_bss *bss; ++ uint32_t tsftl, interval; ++ uint64_t tsft, tbtt; ++ ++ spin_lock_bh(&data->lock); ++ bss = ieee80211_get_bss(data, data->bssid); ++ if (data->mode == IEEE80211_ADHOC) { ++ /* If we read TSFTL right before rollover, we read a TSF timer ++ * that is too high rather than too low. This prevents a spurious ++ * synchronization down the line, however, our IBSS could suffer ++ * from a creeping TSF.... ++ */ ++ tsftl = ADM8211_CSR_READ(TSFTL); ++ tsft = ((uint64_t)ADM8211_CSR_READ(TSFTH) << 32 | tsftl); ++ ++ /* we are faster, let the other guy catch up */ ++ if (bss && bss->timestamp < tsft) { ++ spin_unlock_bh(&data->lock); ++ return; ++ } ++ ++ interval = data->beacon_interval; ++ tbtt = adm8211_predict_beacon(tsft, interval << 10); ++ } else { ++ if (!bss) { ++ spin_unlock_bh(&data->lock); ++ return; ++ } ++ ++ interval = bss->interval; ++ tbtt = adm8211_predict_beacon(bss->timestamp, bss->interval << 10); ++ } ++ spin_unlock_bh(&data->lock); ++ ++ /* convert to TUs */ ++ tbtt >>= 10; ++ /*tbtt += (ADM8211_CSR_READ(TSFTL) >> 10) & 0xFFFF;*/ ++ ++ /*tbtt += interval*2;*/ ++ ++ /* wake up a little early */ ++ tbtt -= 20; ++ ++ tbtt = tbtt & 0xFFFF; ++/* ++ printk(KERN_DEBUG "%s: TSF:%x%x\n", dev->name, ADM8211_CSR_READ(TSFTH), ADM8211_CSR_READ(TSFTL)); ++ printk(KERN_DEBUG "%s: prediction time: %x\n", dev->name, (u32)tbtt); ++*/ ++ /* TSFTOFSR (RX TSFT Offset) = 1 us ++ * TBTTPRE (prediction time) = tbtt TU ++ * TBTTOFS (Wake up time offset before TBTT) = 20 TU */ ++ ADM8211_CSR_WRITE(TOFS1, (1 << 24) | (tbtt << 8) | 20); ++ ADM8211_CSR_READ(TOFS1); ++} ++ ++static void adm8211_set_interval(struct net_device *dev) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ struct ieee80211_data *data = &priv->ieee80211; ++ u32 reg; ++ ++ if (data->mode == IEEE80211_ADHOC) { ++ /* BP (beacon interval) = data->beacon_interval ++ * LI (listen interval) = data->listen_interval (in beacon intervals) */ ++ reg = (data->beacon_interval << 16) | data->listen_interval; ++ ADM8211_CSR_WRITE(BPLI, reg); ++ } ++ ++ /* lose link after 7 lost beacons */ ++ reg = ADM8211_CSR_READ(WCSR) & ~(0xFF<<21); ++ ADM8211_CSR_WRITE(WCSR, reg | (0x07<<21)); ++ ADM8211_CSR_READ(WCSR); ++} ++ ++static int adm8211_set_bssid(struct net_device *dev, u8 *bssid) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ u32 reg; ++ ++ reg = bssid[0] | (bssid[1] << 8) | (bssid[2] << 16) | (bssid[3] << 24); ++ ADM8211_CSR_WRITE(BSSID0, reg); ++ reg = ADM8211_CSR_READ(ABDA1); ++ reg &= 0x0000ffff; ++ reg |= (bssid[4] << 16) | (bssid[5] << 24); ++ ADM8211_CSR_WRITE(ABDA1, reg); ++ ++ return 0; ++} ++ ++static int adm8211_set_ssid(struct net_device *dev, u8 *ssid, size_t ssid_len) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ u8 buf[36]; ++ ++ if (ssid_len > 32) ++ return -1; ++ memset(buf, 0, sizeof(buf)); ++ buf[0] = ssid_len; ++ memcpy(buf + 1, ssid, ssid_len); ++ adm8211_write_sram_bytes(dev, ADM8211_SRAM_SSID, buf, 33); ++ adm8211_set_beacon(dev); ++ ++ return 0; ++} ++ ++void adm8211_set_beacon (struct net_device *dev) { ++ struct adm8211_priv *priv = netdev_priv(dev); ++ struct ieee80211_data *data = &priv->ieee80211; ++ unsigned int blen, len, rem; ++ u32 reg; ++ ++ if (priv->iw_mode == IW_MODE_ADHOC) ++ blen = 24 + ++ 8 + 2 + 2 + 2 + data->ssid_len + 2 + data->num_supp_rates + ++ 3 + 4 + WLAN_FCS_LEN; ++ else ++ blen = 0; ++ ++ if (priv->revid < ADM8211_REV_BA) { ++ /* 11M PLCP length */ ++ blen *= 8; ++ rem = blen % 11; ++ len = blen / 11; ++ if (rem) { ++ len += 1; ++ if (rem <= 3) ++ len |= 1<<7; ++ } ++ reg = len << 16; ++ ++ /* 5.5M PLCP length */ ++ rem = (blen*2) % 11; ++ len = (blen*2) / 11; ++ if (rem) ++ len +=1; ++ reg |= len << 8; ++ ++ reg |= blen; ++ ++ ADM8211_CSR_WRITE(BCNT, reg); ++ } else { ++ len = blen; ++ rem = (len*80) % priv->plcp_signal; ++ len = (len*80) / priv->plcp_signal; ++ if (rem) { ++ len+=1; ++ if (data->rate == 0x16 && ((blen*8) % 11) <= 3) ++ len |= 1<<15; ++ } ++ ++ reg = ADM8211_CSR_READ(MMIRD1); ++ reg &= 0xFFFF0000; ++ reg |= len; ++ ADM8211_CSR_WRITE(MMIRD1, reg); ++ } ++} ++ ++static void adm8211_init_rings(struct net_device *dev) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ int i; ++ struct adm8211_desc *desc; ++ struct adm8211_ring_info *info; ++ ++ for (i = 0; i < RX_RING_SIZE; i++) { ++ desc = &priv->rx_ring[i]; ++ desc->status = 0; ++ desc->length = cpu_to_le32(RX_PKT_SIZE); ++ priv->rx_buffers[i].skb = NULL; ++ } ++ /* Mark the end of RX ring; hw returns to base address after this ++ * descriptor */ ++ desc->length |= cpu_to_le32(RDES1_CONTROL_RER); ++ ++ ++ for (i = 0; i < RX_RING_SIZE; i++) { ++ desc = &priv->rx_ring[i]; ++ info = &priv->rx_buffers[i]; ++ ++ info->skb = dev_alloc_skb(RX_PKT_SIZE); ++ if (info->skb == NULL) ++ break; ++ info->mapping = pci_map_single(priv->pdev, info->skb->tail, ++ RX_PKT_SIZE, ++ PCI_DMA_FROMDEVICE); ++ info->skb->dev = dev; ++ desc->buffer1 = cpu_to_le32(info->mapping); ++ desc->status = cpu_to_le32( RDES0_STATUS_OWN | RDES0_STATUS_SQL ); ++ } ++ ++ /* Setup TX ring. TX buffers descriptors will be filled in as needed */ ++ for (i = 0; i < TX_RING_SIZE; i++) { ++ desc = &priv->tx_ring[i]; ++ info = &priv->tx_buffers[i]; ++ ++ info->skb = NULL; ++ info->mapping = 0; ++ desc->status = 0; ++ } ++ desc->length = cpu_to_le32(TDES1_CONTROL_TER); ++} ++ ++static void adm8211_free_rings(struct net_device *dev) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ int i; ++ ++ for (i = 0; i < RX_RING_SIZE; i++) { ++ if (!priv->rx_buffers[i].skb) ++ continue; ++ ++ pci_unmap_single( ++ priv->pdev, ++ priv->rx_buffers[i].mapping, ++ RX_PKT_SIZE, PCI_DMA_FROMDEVICE); ++ ++ dev_kfree_skb(priv->rx_buffers[i].skb); ++ } ++ ++ for (i = 0; i < TX_RING_SIZE; i++) { ++ if (!priv->tx_buffers[i].skb) ++ continue; ++ ++ pci_unmap_single( ++ priv->pdev, ++ priv->tx_buffers[i].mapping, ++ priv->tx_buffers[i].skb->len, PCI_DMA_TODEVICE); ++ ++ dev_kfree_skb(priv->tx_buffers[i].skb); ++ } ++} ++ ++static int adm8211_open(struct net_device *dev) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ int retval; ++ ++ /* Power up MAC and RF chips */ ++ adm8211_hw_reset(dev); ++ ++ /* init ring */ ++ adm8211_init_rings(dev); ++ ADM8211_CSR_WRITE(RDB, priv->rx_ring_dma); ++ ADM8211_CSR_WRITE(TDBD, priv->tx_ring_dma); ++ priv->cur_rx = priv->cur_tx = priv->dirty_tx = 0; ++ ++ /* Init hardware */ ++ adm8211_hw_init(dev); ++ ++ adm8211_rf_set_channel(dev, max(priv->ieee80211.pref_channel, 1)); ++ adm8211_set_rx_mode(dev); ++ adm8211_write_wepkey(dev, 0); ++ adm8211_write_wepkey(dev, 1); ++ adm8211_write_wepkey(dev, 2); ++ adm8211_write_wepkey(dev, 3); ++ adm8211_update_wep(dev); ++ ++ /* set mac address */ ++ ADM8211_CSR_WRITE(PAR0, *((u32 *)dev->dev_addr)); ++ ADM8211_CSR_WRITE(PAR1, *(u16 *)(dev->dev_addr + 4)); ++ ++ retval = request_irq(dev->irq, &adm8211_interrupt, SA_SHIRQ, dev->name, dev); ++ if (retval) { ++ printk(KERN_ERR "%s: failed to register IRQ handler\n", ++ dev->name); ++ return retval; ++ } ++ ++ ADM8211_CSR_WRITE(IER, ADM8211_INTMASK); ++ ++ adm8211_update_mode(dev); ++ ++ if (priv->iw_mode != IW_MODE_MONITOR) ++ ieee80211_start(&priv->ieee80211); ++ ++ netif_start_queue(dev); ++ return 0; ++} ++ ++ ++static int adm8211_stop(struct net_device *dev) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ ++ ieee80211_stop(&priv->ieee80211); ++ ++ netif_stop_queue(dev); ++ ++ ADM8211_CSR_WRITE(IER, 0); ++ priv->nar &= ~(ADM8211_NAR_ST | ADM8211_NAR_PR | ADM8211_NAR_PB | ++ ADM8211_NAR_SR | ADM8211_NAR_MM ); ++ ADM8211_CSR_WRITE(NAR, priv->nar); ++ ADM8211_CSR_READ(NAR); ++ ++ free_irq(dev->irq, dev); ++ ++ adm8211_free_rings(dev); ++ ++ skb_queue_purge(&priv->rx_queue); ++ ++ adm8211_hw_reset(dev); ++ return 0; ++} ++ ++static void adm8211_tx_timeout(struct net_device *dev) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ u32 reg; ++ u16 rra, rwa; ++ ++ reg = ADM8211_CSR_READ(CSR_TEST1); ++ rra = (reg >> 12) & 0x1FF; ++ rwa = (reg >> 2 ) & 0x1FF; ++ ++ if ( (rra != rwa) && !(reg & (1<<1)) ) { ++ printk(KERN_DEBUG "%s: card stuck. resetting.\n", dev->name); ++ adm8211_stop(dev); ++ adm8211_open(dev); ++ } else if (priv->ieee80211.state == IEEE80211_ASSOCIATED) ++ netif_wake_queue(dev); ++ ++} ++ ++static void adm8211_calc_durations(int *dur, int *plcp, size_t payload_len, int len, ++ int plcp_signal, int short_preamble) ++{ ++ /* Alternative calculation from NetBSD: */ ++ ++/* IEEE 802.11b durations for DSSS PHY in microseconds */ ++#define IEEE80211_DUR_DS_LONG_PREAMBLE 144 ++#define IEEE80211_DUR_DS_SHORT_PREAMBLE 72 ++#define IEEE80211_DUR_DS_FAST_PLCPHDR 24 ++#define IEEE80211_DUR_DS_SLOW_PLCPHDR 48 ++#define IEEE80211_DUR_DS_SLOW_ACK 112 ++#define IEEE80211_DUR_DS_FAST_ACK 56 ++#define IEEE80211_DUR_DS_SLOW_CTS 112 ++#define IEEE80211_DUR_DS_FAST_CTS 56 ++#define IEEE80211_DUR_DS_SLOT 20 ++#define IEEE80211_DUR_DS_SIFS 10 ++ ++ int remainder; ++ ++ *dur = (80 * (WLAN_ADDR3_HDR_LEN + payload_len) + plcp_signal - 1) ++ / plcp_signal; ++ ++ if (plcp_signal <= PLCP_SIGNAL_2M) { ++ /* 1-2Mbps WLAN: send ACK/CTS at 1Mbps */ ++ *dur += 3 * (IEEE80211_DUR_DS_SIFS + ++ IEEE80211_DUR_DS_SHORT_PREAMBLE + ++ IEEE80211_DUR_DS_FAST_PLCPHDR) + ++ IEEE80211_DUR_DS_SLOW_CTS + IEEE80211_DUR_DS_SLOW_ACK; ++ } else { ++ /* 5-11Mbps WLAN: send ACK/CTS at 2Mbps */ ++ *dur += 3 * (IEEE80211_DUR_DS_SIFS + ++ IEEE80211_DUR_DS_SHORT_PREAMBLE + ++ IEEE80211_DUR_DS_FAST_PLCPHDR) + ++ IEEE80211_DUR_DS_FAST_CTS + IEEE80211_DUR_DS_FAST_ACK; ++ } ++ ++ /* lengthen duration if long preamble */ ++ if (!short_preamble) { ++ *dur += ++ 3 * (IEEE80211_DUR_DS_LONG_PREAMBLE - ++ IEEE80211_DUR_DS_SHORT_PREAMBLE) + ++ 3 * (IEEE80211_DUR_DS_SLOW_PLCPHDR - ++ IEEE80211_DUR_DS_FAST_PLCPHDR); ++ } ++ ++ ++ *plcp = (80 * len) / plcp_signal; ++ remainder = (80 * len) % plcp_signal; ++ if (plcp_signal == PLCP_SIGNAL_11M && ++ remainder <= 30 && remainder > 0) { ++ *plcp = (*plcp | 0x8000) + 1; ++ } else if (remainder) ++ (*plcp)++; ++} ++ ++/* TODO: add addr4 to this */ ++/* Transmit skb (802.11 header created by hardware) */ ++static int adm8211_tx(struct net_device *dev, struct sk_buff *skb, ++ u16 fc, u16 capab, u8 *dst) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ struct ieee80211_data *data = &priv->ieee80211; ++ struct adm8211_tx_hdr *txhdr; ++ int entry; ++ dma_addr_t mapping; ++ u32 flag; ++ unsigned long flags; ++ u16 fc_; ++ size_t payload_len; ++ int plcp, dur, len; ++ ++ int plcp_signal; ++ ++ fc_ = le16_to_cpu(fc); ++ if (WLAN_FC_GET_TYPE(fc_) != WLAN_FC_TYPE_DATA) { ++ if (fc_ & WLAN_FC_ISWEP && ++ wep_encrypt(skb, 0, data->default_key, &data->wep_data[data->default_key])) { ++ dev_kfree_skb(skb); ++ return -1; ++ } ++ fc_ &= ~WLAN_FC_ISWEP; ++ } ++ ++ payload_len = skb->len; ++ ++ if (skb_headroom(skb) < sizeof(struct adm8211_tx_hdr)) { ++ if (pskb_expand_head(skb, sizeof(struct adm8211_tx_hdr), 0, ++ GFP_ATOMIC)) { ++ printk(KERN_DEBUG "%s: failed to allocate room for TX " ++ "header\n", dev->name); ++ dev_kfree_skb(skb); ++ return 0; ++ } ++ } ++ ++ plcp_signal = ieee80211_get_rate(&priv->ieee80211, dst)*5; ++ ++ txhdr = (struct adm8211_tx_hdr *) skb_push(skb, sizeof(*txhdr)); ++ memset(txhdr, 0, sizeof(*txhdr)); ++ memcpy(txhdr->da, dst, ETH_ALEN); ++ txhdr->signal = plcp_signal; ++ txhdr->frame_body_size = cpu_to_le16(payload_len); ++ txhdr->frame_control = fc; ++ ++ len = WLAN_ADDR3_HDR_LEN + payload_len + (fc_ & WLAN_FC_ISWEP ? 8 : 0) + WLAN_FCS_LEN; ++ ++ if (len > priv->frag_thresh && is_valid_ether_addr(dst)) { ++ txhdr->frag_threshold = cpu_to_le16(priv->frag_thresh); ++ ++ len = WLAN_ADDR3_HDR_LEN + priv->frag_thresh + (fc_ & WLAN_FC_ISWEP ? 8 : 0) + WLAN_FCS_LEN; ++ adm8211_calc_durations(&dur, &plcp, priv->frag_thresh, len, plcp_signal, capab & WLAN_CAPABILITY_SHORT_PREAMBLE); ++ txhdr->plcp_frag_head_len = cpu_to_le16(plcp); ++ txhdr->dur_frag_head = cpu_to_le16(dur); ++ ++ if (payload_len % priv->frag_thresh) { ++ len = WLAN_ADDR3_HDR_LEN + ++ (payload_len % priv->frag_thresh) + ++ (fc_ & WLAN_FC_ISWEP ? 8 : 0) + WLAN_FCS_LEN; ++ ++ adm8211_calc_durations(&dur, &plcp, payload_len % priv->frag_thresh, ++ len, plcp_signal, capab & WLAN_CAPABILITY_SHORT_PREAMBLE); ++ ++ txhdr->plcp_frag_tail_len = cpu_to_le16(plcp); ++ txhdr->dur_frag_tail = cpu_to_le16(dur); ++ } else { ++ txhdr->plcp_frag_tail_len = txhdr->plcp_frag_head_len; ++ txhdr->dur_frag_tail = txhdr->dur_frag_head; ++ } ++ ++ } else { ++ txhdr->frag_threshold = cpu_to_le16(0x0FFF); ++ adm8211_calc_durations(&dur, &plcp, payload_len, ++ len, plcp_signal, capab & WLAN_CAPABILITY_SHORT_PREAMBLE); ++ txhdr->plcp_frag_head_len = cpu_to_le16(plcp); ++ txhdr->plcp_frag_tail_len = cpu_to_le16(plcp); ++ txhdr->dur_frag_head = cpu_to_le16(dur); ++ txhdr->dur_frag_tail = cpu_to_le16(dur); ++ } ++ ++ txhdr->header_control = cpu_to_le16(ADM8211_TXHDRCTL_ENABLE_EXTEND_HEADER); ++ ++ if (capab & WLAN_CAPABILITY_SHORT_PREAMBLE) ++ txhdr->header_control |= cpu_to_le16(ADM8211_TXHDRCTL_SHORT_PREAMBLE); ++ ++ if ((payload_len + (fc_ & WLAN_FC_ISWEP ? 8 : 0)) > priv->rts_thresh ++ && is_valid_ether_addr(dst)) ++ txhdr->header_control |= cpu_to_le16(ADM8211_TXHDRCTL_ENABLE_RTS); ++ ++ if (fc_ & WLAN_FC_ISWEP) ++ txhdr->header_control |= cpu_to_le16(ADM8211_TXHDRCTL_ENABLE_WEP_ENGINE); ++ ++ txhdr->retry_limit = priv->retry_limit; ++ mapping = pci_map_single(priv->pdev, skb->data, skb->len, ++ PCI_DMA_TODEVICE); ++ ++ spin_lock_irqsave(&priv->lock, flags); ++ ++ entry = priv->cur_tx % TX_RING_SIZE; ++ ++ priv->tx_buffers[entry].skb = skb; ++ priv->tx_buffers[entry].mapping = mapping; ++ priv->tx_ring[entry].buffer1 = cpu_to_le32(mapping); ++ ++ if (priv->cur_tx - priv->dirty_tx < TX_RING_SIZE / 2) ++ flag = TDES1_CONTROL_LS | TDES1_CONTROL_FS; ++ else if (priv->cur_tx - priv->dirty_tx == TX_RING_SIZE / 2) ++ flag = TDES1_CONTROL_IC | TDES1_CONTROL_LS | TDES1_CONTROL_FS; ++ else if (priv->cur_tx - priv->dirty_tx < TX_RING_SIZE - 2) ++ flag = TDES1_CONTROL_LS | TDES1_CONTROL_FS; ++ else { ++ flag = TDES1_CONTROL_IC | TDES1_CONTROL_LS | TDES1_CONTROL_FS; ++ netif_stop_queue(dev); ++ } ++ if (entry == TX_RING_SIZE - 1) ++ flag |= TDES1_CONTROL_TER; ++ priv->tx_ring[entry].length = cpu_to_le32(flag | skb->len); ++ ++ /* Set TX rate (SIGNAL field in PLCP PPDU format) */ ++ flag = TDES0_CONTROL_OWN | (plcp_signal << 20) | ++ 8 /* ? */; ++ priv->tx_ring[entry].status = cpu_to_le32(flag); ++ ++ priv->cur_tx++; ++ ++ spin_unlock_irqrestore(&priv->lock, flags); ++ ++ /* Trigger transmit poll */ ++ ADM8211_CSR_WRITE(TDR, 0); ++ ++ dev->trans_start = jiffies; ++ ++ return 0; ++} ++ ++ ++static int adm8211_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ ++ return ieee80211_data_tx(&priv->ieee80211, skb); ++} ++ ++ ++int adm8211_80211_header_parse(struct sk_buff *skb, unsigned char *haddr) ++{ ++ memcpy(haddr, skb->mac.raw + 10 + sizeof(struct avs_caphdr), ETH_ALEN); /* addr2 */ ++ return ETH_ALEN; ++} ++ ++#ifdef ADM8211_PROC ++static int adm8211_proc_cr_read(char *page, char **start, off_t off, ++ int count, int *eof, void *data) ++{ ++ char *p = page; ++ struct net_device *dev = data; ++ struct adm8211_priv *priv = netdev_priv(dev); ++ u32 val; ++ ++ if (off != 0) { ++ *eof = 1; ++ return 0; ++ } ++ ++#define REG(r) \ ++pci_read_config_dword(priv->pdev, ADM8211_CR_ ## r, &val); \ ++p += sprintf(p, #r "=%08x\n", val); ++ REG(CSC); ++ REG(PMR0); ++ REG(PMR1); ++ REG(LT); ++#undef REG ++ ++ return (p - page); ++} ++ ++ ++static int adm8211_proc_csr_read(char *page, char **start, off_t off, ++ int count, int *eof, void *data) ++{ ++ char *p = page; ++ struct net_device *dev = data; ++ struct adm8211_priv *priv = netdev_priv(dev); ++ ++ if (off != 0) { ++ *eof = 1; ++ return 0; ++ } ++ ++#define REG(r) p += sprintf(p, #r "=%08x\n", ADM8211_CSR_READ(r)); ++ REG(PAR); ++ REG(FRCTL); ++ REG(WTDP); ++ REG(WRDP); ++ REG(RDB); ++ REG(TDBD); ++ REG(TDBP); ++ REG(STSR); ++ REG(NAR); ++ REG(IER); ++ REG(LPC); ++ REG(WCSR); ++ REG(CMDR); ++ REG(PMCSR); ++ REG(ABDA1); ++ REG(BSSID0); ++ REG(TOFS0); ++ REG(TOFS1); ++ REG(GPIO); ++ REG(MIBCNT); ++#undef REG ++ ++ return (p - page); ++} ++ ++ ++static int adm8211_proc_tx_read(char *page, char **start, off_t off, ++ int count, int *eof, void *data) ++{ ++ char *p = page; ++ struct net_device *dev = data; ++ struct adm8211_priv *priv = netdev_priv(dev); ++ int i; ++ struct adm8211_desc *desc; ++ struct adm8211_ring_info *info; ++ u32 status; ++ ++ if (off != 0) { ++ *eof = 1; ++ return 0; ++ } ++ ++ for (i = 0; i < TX_RING_SIZE; i++) { ++ desc = &priv->tx_ring[i]; ++ info = &priv->tx_buffers[i]; ++ status = le32_to_cpu(desc->status); ++ p += sprintf(p, "%2d: %08x %08x %08x %08x skb=%p " ++ "mapping=%x%s%s\n", i, status, ++ le32_to_cpu(desc->length), ++ le32_to_cpu(desc->buffer1), ++ le32_to_cpu(desc->buffer2), ++ info->skb, info->mapping, ++ status & TDES0_CONTROL_OWN ? " [OWN]" : "", ++ status & TDES0_CONTROL_DONE ? " [DONE]" : ""); ++ } ++ ++ return (p - page); ++} ++ ++ ++static int adm8211_proc_rx_read(char *page, char **start, off_t off, ++ int count, int *eof, void *data) ++{ ++ char *p = page; ++ struct net_device *dev = data; ++ struct adm8211_priv *priv = netdev_priv(dev); ++ int i; ++ struct adm8211_desc *desc; ++ struct adm8211_ring_info *info; ++ u32 status; ++ ++ if (off != 0) { ++ *eof = 1; ++ return 0; ++ } ++ ++ for (i = 0; i < RX_RING_SIZE; i++) { ++ desc = &priv->rx_ring[i]; ++ info = &priv->rx_buffers[i]; ++ status = le32_to_cpu(desc->status); ++ p += sprintf(p, "%2d: %08x %08x %08x %08x skb=%p " ++ "mapping=%x%s\n", i, status, ++ le32_to_cpu(desc->length), ++ le32_to_cpu(desc->buffer1), ++ le32_to_cpu(desc->buffer2), ++ info->skb, info->mapping, ++ status & RDES0_STATUS_OWN ? " [OWN]" : ""); ++ } ++ ++ return (p - page); ++} ++#endif ++ ++static int __devinit adm8211_probe(struct pci_dev *pdev, ++ const struct pci_device_id *id) ++{ ++ int err; ++ struct net_device *dev; ++ struct adm8211_priv *priv; ++ unsigned long mem_addr, mem_len; ++ int io_addr, io_len; ++ u32 reg; ++ int ring_size; ++ ++#ifndef MODULE ++ static int cardidx; ++ if (!cardidx++) ++ printk(version); ++#endif ++ ++ err = pci_enable_device(pdev); ++ if (err) { ++ printk(KERN_ERR "%s (adm8211): Cannot enable new PCI device\n", pci_name(pdev)); ++ return err; ++ } ++ ++ io_addr = pci_resource_start(pdev, 0); ++ io_len = pci_resource_len(pdev, 0); ++ mem_addr = pci_resource_start(pdev, 1); ++ mem_len = pci_resource_len(pdev, 1); ++ if (io_len < 256 || mem_len < 1024) { ++ printk(KERN_ERR "%s (adm8211): Too short PCI resources\n", pci_name(pdev)); ++ goto err_disable_pdev; ++ } ++ ++ ++ /* check signature */ ++ pci_read_config_dword(pdev, ADM8211_CR_SIG, ®); ++ if (reg != ADM8211_SIG1 && reg != ADM8211_SIG2) { ++ printk(KERN_ERR "%s (adm8211): Invalid signature (0x%x)\n", pci_name(pdev), reg); ++ goto err_disable_pdev; ++ } ++ ++ err = pci_request_regions(pdev, "adm8211"); ++ if (err) { ++ printk(KERN_ERR "%s (adm8211): Cannot obtain PCI resources\n", pci_name(pdev)); ++ goto err_disable_pdev; ++ } ++ ++ if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) { ++ printk(KERN_ERR "%s (adm8211): No suitable DMA available\n", pci_name(pdev)); ++ goto err_free_reg; ++ } ++ pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK); ++ ++ pci_set_master(pdev); ++ ++ dev = alloc_etherdev(sizeof(struct adm8211_priv)); ++ if (!dev) { ++ printk(KERN_ERR "%s (adm8211): Etherdev alloc failed\n", pci_name(pdev)); ++ err = -ENOMEM; ++ goto err_free_reg; ++ } ++ priv = netdev_priv(dev); ++ priv->pdev = pdev; ++ ++ spin_lock_init(&priv->lock); ++ ++ SET_MODULE_OWNER(dev); ++ SET_NETDEV_DEV(dev, &pdev->dev); ++ ++ pci_set_drvdata(pdev, dev); ++ ++ priv->mem = ioremap(mem_addr, mem_len); ++ if (!priv->mem) { ++ printk(KERN_ERR "%s (adm8211): Cannot map device memory\n", pci_name(pdev)); ++ goto err_free_dev; ++ } ++ ++ priv->io_base = io_addr; ++ ++ dev->irq = pdev->irq; ++ ++ /* Allocate TX/RX descriptors */ ++ ring_size = sizeof(struct adm8211_desc) * RX_RING_SIZE + ++ sizeof(struct adm8211_desc) * TX_RING_SIZE; ++ priv->rx_ring = pci_alloc_consistent(pdev, ring_size, ++ &priv->rx_ring_dma); ++ if (!priv->rx_ring) { ++ printk(KERN_ERR "%s (adm8211): Cannot allocate TX/RX ring\n", pci_name(pdev)); ++ goto err_iounmap; ++ } ++ priv->tx_ring = (struct adm8211_desc *) (priv->rx_ring + RX_RING_SIZE); ++ priv->tx_ring_dma = priv->rx_ring_dma + ++ sizeof(struct adm8211_desc) * RX_RING_SIZE; ++ ++ skb_queue_head_init(&priv->rx_queue); ++ priv->rx_tasklet.func = adm8211_rx_tasklet; ++ priv->rx_tasklet.data = (unsigned long) dev; ++ ++ pci_read_config_byte(pdev, ADM8211_CR_CC, &priv->revid); ++ ++ /* Power-on issue */ ++ ADM8211_CSR_WRITE(FRCTL, 0); ++ ADM8211_CSR_READ(FRCTL); ++ ADM8211_CSR_WRITE(FRCTL, 1); ++ ADM8211_CSR_READ(FRCTL); ++ mdelay(100); ++ ++ /* Clear the missed-packet counter. */ ++ ADM8211_CSR_READ(LPC); ++ ++ put_unaligned(ADM8211_CSR_READ(PAR0), (u32 *) dev->dev_addr); ++ put_unaligned(ADM8211_CSR_READ(PAR1) & 0xffff, ++ (u16 *) &dev->dev_addr[4]); ++ ++ if (!is_valid_ether_addr(dev->dev_addr)) { ++ printk(KERN_WARNING "%s (adm8211): Invalid hwaddr! Generating a valid hwaddr..\n", pci_name(pdev)); ++ random_ether_addr(dev->dev_addr); ++ } ++ ++ dev->open = adm8211_open; ++ dev->stop = adm8211_stop; ++ dev->get_stats = adm8211_get_stats; ++ dev->set_multicast_list = adm8211_set_rx_mode; ++ dev->set_mac_address = adm8211_set_mac_address; ++ dev->hard_start_xmit = adm8211_hard_start_xmit; ++ ++ dev->get_wireless_stats = adm8211_get_wireless_stats; ++ dev->wireless_handlers = ++ (struct iw_handler_def *) &adm8211_iw_handler_def; ++ ++ if (priv->revid == ADM8211_REV_BA) { ++ dev->tx_timeout = adm8211_tx_timeout; ++ dev->watchdog_timeo = 2*HZ; ++ } ++ ++ priv->iw_mode = IW_MODE_INFRA; ++ ++ priv->ieee80211.dev = dev; ++ priv->ieee80211.set_channel = adm8211_rf_set_channel; ++ priv->ieee80211.set_bssid = adm8211_set_bssid; ++ priv->ieee80211.set_ssid = adm8211_set_ssid; ++ priv->ieee80211.tx = adm8211_tx; ++ priv->ieee80211.set_interval = adm8211_set_interval; ++ priv->ieee80211.beacon_sync = adm8211_beacon_sync; ++ priv->ieee80211.link_change = adm8211_link_change; ++ priv->ieee80211.set_rate = adm8211_set_rate; ++ priv->ieee80211.supp_rates = (u8 *)IEEE80211_B_RATES; ++ priv->ieee80211.capab = WLAN_CAPABILITY_SHORT_PREAMBLE; ++ ieee80211_init(&priv->ieee80211); ++ ++ priv->rts_thresh = 2347; ++ priv->frag_thresh = 2346; ++ priv->plcp_signal = priv->ieee80211.rate*5; ++ priv->retry_limit = 3; ++ priv->tx_power = 0x40; ++ ++ err = adm8211_read_eeprom(dev); ++ if (err) { ++ printk(KERN_ERR "%s (adm8211): Cannot allocate eeprom buffer\n", pci_name(pdev)); ++ goto err_free_desc; ++ } ++ ++ err = register_netdev(dev); ++ if (err) { ++ printk(KERN_ERR "%s (adm8211): Cannot register netdevice\n", pci_name(pdev)); ++ goto err_free_desc; ++ } ++ ++ printk("%s: hwaddr %02x:%02x:%02x:%02x:%02x:%02x, IRQ %d, Rev 0x%02x, " ++ "PCI ID: 0x%x, mem @0x%lx (len=0x%lx)\n", ++ dev->name, dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2], ++ dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5], ++ dev->irq, priv->revid, reg, mem_addr, mem_len); ++#ifdef ADM8211_PROC ++ if (adm8211_proc) ++ priv->proc = proc_mkdir(dev->name, adm8211_proc); ++ ++ if (priv->proc) { ++ create_proc_read_entry("cr", 0, priv->proc, ++ adm8211_proc_cr_read, dev); ++ create_proc_read_entry("csr", 0, priv->proc, ++ adm8211_proc_csr_read, dev); ++ create_proc_read_entry("tx", 0, priv->proc, ++ adm8211_proc_tx_read, dev); ++ create_proc_read_entry("rx", 0, priv->proc, ++ adm8211_proc_rx_read, dev); ++ } ++#endif ++ return 0; ++ ++ err_free_desc: ++ pci_free_consistent(pdev, ring_size, priv->rx_ring, priv->rx_ring_dma); ++ ++ err_iounmap: ++ iounmap(priv->mem); ++ ++ err_free_dev: ++ pci_set_drvdata(pdev, NULL); ++ free_netdev(dev); ++ ++ err_free_reg: ++ pci_release_regions(pdev); ++ ++ err_disable_pdev: ++ pci_disable_device(pdev); ++ return err; ++} ++ ++ ++static void __devexit adm8211_remove(struct pci_dev *pdev) ++{ ++ struct net_device *dev = pci_get_drvdata(pdev); ++ struct adm8211_priv *priv; ++ ++ if (!dev) ++ return; ++ ++ unregister_netdev(dev); ++ ++ priv = netdev_priv(dev); ++ ieee80211_deinit(&priv->ieee80211); ++#ifdef ADM8211_PROC ++ if (priv->proc) { ++ remove_proc_entry("rx", priv->proc); ++ remove_proc_entry("tx", priv->proc); ++ remove_proc_entry("csr", priv->proc); ++ remove_proc_entry("cr", priv->proc); ++ remove_proc_entry(dev->name, adm8211_proc); ++ } ++#endif ++ pci_free_consistent(pdev, ++ sizeof(struct adm8211_desc) * RX_RING_SIZE + ++ sizeof(struct adm8211_desc) * TX_RING_SIZE, ++ priv->rx_ring, priv->rx_ring_dma); ++ if (priv->eeprom) ++ kfree(priv->eeprom); ++ iounmap(priv->mem); ++ pci_release_regions(pdev); ++ pci_disable_device(pdev); ++ free_netdev(dev); ++} ++ ++ ++#ifdef CONFIG_PM ++static int adm8211_suspend(struct pci_dev *pdev, u32 state) ++{ ++ struct net_device *dev = pci_get_drvdata(pdev); ++ struct adm8211_priv *priv = netdev_priv(dev); ++ netif_device_detach(dev); ++ ++ if (dev->flags & IFF_UP) ++ dev->stop(dev); ++ ++ priv->pci_state = kmalloc(64, GFP_KERNEL); ++ if (priv->pci_state) ++ pci_save_state(pdev, priv->pci_state); ++ pci_set_power_state(pdev, 3); ++ return 0; ++} ++ ++static int adm8211_resume(struct pci_dev *pdev) ++{ ++ struct net_device *dev = pci_get_drvdata(pdev); ++ struct adm8211_priv *priv = netdev_priv(dev); ++ pci_set_power_state(pdev, 0); ++ if (priv->pci_state) { ++ pci_restore_state(pdev, priv->pci_state); ++ kfree(priv->pci_state); ++ priv->pci_state = NULL; ++ } ++ ++ if (dev->flags & IFF_UP) ++ dev->open(dev); ++ ++ netif_device_attach(dev); ++ return 0; ++} ++#endif /* CONFIG_PM */ ++ ++ ++MODULE_DEVICE_TABLE(pci, adm8211_pci_id_table); ++ ++/* TODO: enable_wake */ ++static struct pci_driver adm8211_driver = { ++ .name = "adm8211", ++ .id_table = adm8211_pci_id_table, ++ .probe = adm8211_probe, ++ .remove = __devexit_p(adm8211_remove), ++#ifdef CONFIG_PM ++ .suspend = adm8211_suspend, ++ .resume = adm8211_resume, ++#endif /* CONFIG_PM */ ++}; ++ ++ ++ ++static int __init adm8211_init(void) ++{ ++#ifdef MODULE ++ printk(version); ++ printk(KERN_INFO "adm8211: release " RELEASE_DATE "\n"); ++#endif ++#ifdef ADM8211_PROC ++ if (proc_root_driver) ++ adm8211_proc = proc_mkdir("adm8211", proc_root_driver); ++#endif ++ return pci_module_init(&adm8211_driver); ++} ++ ++ ++static void __exit adm8211_exit(void) ++{ ++ pci_unregister_driver(&adm8211_driver); ++#ifdef ADM8211_PROC ++ if (adm8211_proc) ++ remove_proc_entry("adm8211", proc_root_driver); ++#endif ++ printk(KERN_INFO "adm8211: Driver unloaded\n"); ++} ++ ++ ++module_init(adm8211_init); ++module_exit(adm8211_exit); +diff -urN x/drivers/net/wireless/adm8211/adm8211_ioctl.c y/drivers/net/wireless/adm8211/adm8211_ioctl.c +--- x/drivers/net/wireless/adm8211/adm8211_ioctl.c 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/adm8211/adm8211_ioctl.c 2004-09-12 12:08:19.000000000 +1000 +@@ -0,0 +1,880 @@ ++/* ++ * Linux driver for ADMtek adm8211 (IEEE 802.11b wireless LAN card) ++ * ++ * Copyright (c) 2003, Jouni Malinen ++ * Copyright (c) 2004, Michael Wu ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. See README and COPYING for ++ * more details. ++ */ ++ ++#include ++#include ++#if WIRELESS_EXT > 12 ++#include ++#endif /* WIRELESS_EXT > 12 */ ++#include ++#include ++#include ++#include ++ ++#include "compat.h" ++#include "adm8211.h" ++#include "adm8211_ioctl.h" ++ ++static int adm8211_ioctl_giwname(struct net_device *dev, ++ struct iw_request_info *info, ++ char *name, char *extra) ++{ ++ strcpy(name, "IEEE 802.11b"); ++ return 0; ++} ++ ++ ++static const long freq_list[] = { 2412, 2417, 2422, 2427, 2432, 2437, 2442, ++ 2447, 2452, 2457, 2462, 2467, 2472, 2484 }; ++#define FREQ_COUNT ARRAY_SIZE(freq_list) ++ ++#if 1 ++#define SET_IWFREQ(freq, chan) \ ++ freq->m = chan; \ ++ freq->e = 0; ++#else ++#define SET_IWFREQ(freq, chan) \ ++ freq->m = freq_list[chan - 1] * 100000; \ ++ freq->e = 1; ++#endif ++ ++static int adm8211_ioctl_siwfreq(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_freq *freq, char *extra) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ ++ /* freq => chan. */ ++ if (freq->e == 1 && ++ freq->m / 100000 >= freq_list[0] && ++ freq->m / 100000 <= freq_list[FREQ_COUNT - 1]) { ++ int ch; ++ int fr = freq->m / 100000; ++ for (ch = 0; ch < FREQ_COUNT; ch++) { ++ if (fr == freq_list[ch]) { ++ freq->e = 0; ++ freq->m = ch + 1; ++ break; ++ } ++ } ++ } ++ ++ if (freq->e != 0 || freq->m < priv->ieee80211.chan_range.min || freq->m > priv->ieee80211.chan_range.max) ++ return -EINVAL; ++ ++ if (dev->flags & IFF_UP) { ++ if (priv->iw_mode == IW_MODE_MONITOR) ++ adm8211_rf_set_channel(dev, freq->m); ++ else ++ ieee80211_start(&priv->ieee80211); ++ } ++ ++ priv->ieee80211.channel = priv->ieee80211.pref_channel = freq->m; ++ ++ return 0; ++} ++ ++ ++static int adm8211_ioctl_giwfreq(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_freq *freq, char *extra) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ int chan = priv->ieee80211.channel; ++ ++ if (chan < 1 || chan > FREQ_COUNT) ++ return -EINVAL; ++ ++ SET_IWFREQ(freq, chan); ++ ++ return 0; ++} ++ ++ ++static int adm8211_ioctl_siwmode(struct net_device *dev, ++ struct iw_request_info *info, ++ __u32 *mode, char *extra) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ struct ieee80211_data *data = &priv->ieee80211; ++ ++ if (*mode != IW_MODE_INFRA && *mode != IW_MODE_ADHOC && ++ *mode != IW_MODE_MONITOR) ++ return -EOPNOTSUPP; ++ ++ if (*mode == priv->iw_mode) ++ return 0; ++ ++ ieee80211_stop(data); ++ priv->iw_mode = *mode; ++ ++ switch (*mode) { ++ case IW_MODE_INFRA: ++ priv->ieee80211.mode = IEEE80211_MANAGED; ++ priv->ieee80211.capab &= ~WLAN_CAPABILITY_IBSS; ++ dev->type = ARPHRD_ETHER; ++ dev->hard_header_parse = priv->eth_header_parse; ++ break; ++ case IW_MODE_ADHOC: ++ priv->ieee80211.mode = IEEE80211_ADHOC; ++ priv->ieee80211.capab |= WLAN_CAPABILITY_IBSS; ++ dev->type = ARPHRD_ETHER; ++ dev->hard_header_parse = priv->eth_header_parse; ++ break; ++ case IW_MODE_MONITOR: ++ dev->type = ARPHRD_IEEE80211_PRISM; ++ dev->hard_header_parse = adm8211_80211_header_parse; ++ break; ++ } ++ ++ if (dev->flags & IFF_UP) { ++ adm8211_update_mode(dev); ++ if (*mode != IW_MODE_MONITOR) ++ ieee80211_start(data); ++ } ++ ++ return 0; ++} ++ ++ ++static int adm8211_ioctl_giwmode(struct net_device *dev, ++ struct iw_request_info *info, ++ __u32 *mode, char *extra) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ *mode = priv->iw_mode; ++ return 0; ++} ++ ++static int adm8211_ioctl_giwrange(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *dwrq, ++ char *extra) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ struct ieee80211_data *data = &priv->ieee80211; ++ struct iw_range *range = (struct iw_range *) extra; ++ int i, j; ++ ++ dwrq->length = sizeof(struct iw_range); ++ memset(range, 0, sizeof(range)); ++ ++ range->min_nwid = range->max_nwid = 0; ++ ++ range->max_qual.qual = 255; ++ range->max_qual.level = 1; ++ range->max_qual.noise = 1; ++ ++ range->num_bitrates = data->num_supp_rates; ++ i = 0; ++ while (i++ < min(data->num_supp_rates, IW_MAX_BITRATES)) ++ range->bitrate[i-1] = (data->supp_rates[i-1]*1000000)/2; ++ ++ range->min_rts = 0; ++ range->max_rts = 2346; ++ range->min_frag = 256; ++ range->max_frag = 2346; ++ ++ /* are the values really in dBm? */ ++ range->txpower_capa = IW_TXPOW_RANGE | IW_TXPOW_DBM; ++ ++ range->we_version_compiled = WIRELESS_EXT; ++ range->we_version_source = WIRELESS_EXT; ++ range->num_channels = data->chan_range.max - data->chan_range.min + 1; ++ range->num_frequency = range->num_channels; ++ ++ range->max_encoding_tokens = 4; ++ range->encoding_size[0] = 5; ++ range->encoding_size[1] = 13; ++ range->num_encoding_sizes = 2; ++ ++ j=0; ++ for (i = data->chan_range.min; i <= data->chan_range.max; i+=1) { ++ range->freq[j].m=freq_list[i-1] * 100000; ++ range->freq[j].e=1; ++ range->freq[j].i=i; ++ j+=1; ++ } ++ return 0; ++} ++ ++/* ++static int adm8211_ioctl_giwsens(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, char *extra) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ struct ieee80211_data *data = &priv->ieee80211; ++ struct ieee80211_bss *bss = ieee80211_get_bss(data, data->bssid); ++ return 0; ++} ++*/ ++static int adm8211_ioctl_siwscan(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *data, char *extra) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ ++ if (!(dev->flags & IFF_UP) || priv->iw_mode == IW_MODE_MONITOR) ++ return -1; ++ ++ /* TODO: could add a flag in ieee80211 code to indicate when scanning ++ * is completed */ ++ ++ ieee80211_start_scan(&priv->ieee80211); ++ return 0; ++} ++ ++ ++static int adm8211_ioctl_giwscan(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *data, char *extra) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ struct iw_event iwe; ++ char *current_ev = extra; ++ char *end_buf = extra + IW_SCAN_MAX_DATA; ++ char *current_val; ++ struct ieee80211_bss *bss; ++ int i; ++ ++ if (priv->scan_timestamp && ++ time_before(jiffies, priv->scan_timestamp + 2 * HZ)) ++ return -EAGAIN; ++ priv->scan_timestamp = 0; ++ ++ spin_lock_bh(&priv->ieee80211.lock); ++ bss = priv->ieee80211.bss; ++ while (bss) { ++ /* First entry must be AP MAC address; other entries will be ++ * shown in the order they are added. */ ++ memset(&iwe, 0, sizeof(iwe)); ++ iwe.cmd = SIOCGIWAP; ++ iwe.u.ap_addr.sa_family = ARPHRD_ETHER; ++ memcpy(iwe.u.ap_addr.sa_data, bss->bssid, ETH_ALEN); ++ iwe.len = IW_EV_ADDR_LEN; ++ current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, ++ IW_EV_ADDR_LEN); ++ ++ memset(&iwe, 0, sizeof(iwe)); ++ iwe.cmd = SIOCGIWESSID; ++ iwe.u.data.length = bss->ssid_len; ++ if (iwe.u.data.length > IW_ESSID_MAX_SIZE) ++ iwe.u.data.length = IW_ESSID_MAX_SIZE; ++ iwe.u.data.flags = 1; ++ iwe.len = IW_EV_POINT_LEN + iwe.u.data.length; ++ current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, ++ bss->ssid); ++ ++ memset(&iwe, 0, sizeof(iwe)); ++ iwe.cmd = SIOCGIWMODE; ++ if (bss->capability & (WLAN_CAPABILITY_ESS | ++ WLAN_CAPABILITY_IBSS)) { ++ if (bss->capability & WLAN_CAPABILITY_ESS) ++ iwe.u.mode = IW_MODE_MASTER; ++ else ++ iwe.u.mode = IW_MODE_ADHOC; ++ iwe.len = IW_EV_UINT_LEN; ++ current_ev = iwe_stream_add_event(current_ev, end_buf, ++ &iwe, ++ IW_EV_UINT_LEN); ++ } ++ ++ if (bss->channel >= 1 && bss->channel <= FREQ_COUNT) { ++ memset(&iwe, 0, sizeof(iwe)); ++ iwe.cmd = SIOCGIWFREQ; ++ SET_IWFREQ((&iwe.u.freq), bss->channel); ++ iwe.len = IW_EV_FREQ_LEN; ++ current_ev = iwe_stream_add_event(current_ev, end_buf, ++ &iwe, ++ IW_EV_FREQ_LEN); ++ } ++ ++ memset(&iwe, 0, sizeof(iwe)); ++ iwe.cmd = IWEVQUAL; ++ iwe.u.qual.qual = bss->last_rssi; ++ iwe.u.qual.level = 0; ++ iwe.u.qual.noise = 0; ++ iwe.len = IW_EV_QUAL_LEN; ++ current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe, ++ IW_EV_QUAL_LEN); ++ ++ memset(&iwe, 0, sizeof(iwe)); ++ iwe.cmd = SIOCGIWENCODE; ++ if (bss->capability & WLAN_CAPABILITY_PRIVACY) ++ iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY; ++ else ++ iwe.u.data.flags = IW_ENCODE_DISABLED; ++ iwe.u.data.length = 0; ++ iwe.len = IW_EV_POINT_LEN + iwe.u.data.length; ++ /* bss->ssid is a dummy pointer for 0-byte memcpy */ ++ current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, ++ bss->ssid); ++ ++ memset(&iwe, 0, sizeof(iwe)); ++ iwe.cmd = SIOCGIWRATE; ++ current_val = current_ev + IW_EV_LCP_LEN; ++ for (i = 0; i < sizeof(bss->supp_rates); i++) { ++ if (bss->supp_rates[i] == 0) ++ break; ++ /* Bit rate given in 500 kb/s units (+ 0x80) */ ++ iwe.u.bitrate.value = ++ ((bss->supp_rates[i] & 0x7f) * 500000); ++ current_val = iwe_stream_add_value( ++ current_ev, current_val, end_buf, &iwe, ++ IW_EV_PARAM_LEN); ++ } ++ if ((current_val - current_ev) > IW_EV_LCP_LEN) ++ current_ev = current_val; ++ ++ bss = bss->next; ++ } ++ spin_unlock_bh(&priv->ieee80211.lock); ++ ++ data->length = current_ev - extra; ++ return 0; ++} ++ ++ ++static int adm8211_ioctl_giwessid(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *data, char *essid) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ ++ data->flags = 1; /* active */ ++ data->length = priv->ieee80211.ssid_len; ++ if (data->length > IW_ESSID_MAX_SIZE) ++ data->length = IW_ESSID_MAX_SIZE; ++ memset(essid, 0, IW_ESSID_MAX_SIZE); ++ memcpy(essid, priv->ieee80211.ssid, data->length); ++ return 0; ++} ++ ++ ++static int adm8211_ioctl_siwessid(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *data, char *essid) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ int len; ++ ++ if (data->flags == 0 || data->length < 1) ++ len = 0; ++ else ++ len = data->length - 1; ++ if (len > IEEE80211_MAX_SSID_LEN) ++ len = IEEE80211_MAX_SSID_LEN; ++ ++ memcpy(priv->ieee80211.ssid, essid, len); ++ priv->ieee80211.ssid_len = len; ++ priv->ieee80211.any_ssid = len ? 0 : 1; ++ ++ if (dev->flags & IFF_UP && priv->iw_mode != IW_MODE_MONITOR) ++ ieee80211_start(&priv->ieee80211); ++ ++ return 0; ++} ++ ++static int adm8211_ioctl_giwnickn(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *data, char *nickn) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ ++ memset(nickn, 0, IW_ESSID_MAX_SIZE); ++ strncpy(nickn, priv->ieee80211.nick, IW_ESSID_MAX_SIZE); ++ return 0; ++} ++ ++static int adm8211_ioctl_siwnickn(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *data, char *nickn) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ int len = data->length; ++ ++ if (len > IW_ESSID_MAX_SIZE) ++ len = IW_ESSID_MAX_SIZE; ++ ++ memset(priv->ieee80211.nick, 0, IW_ESSID_MAX_SIZE); ++ strncpy(priv->ieee80211.nick, nickn, len); ++ ++ return 0; ++} ++ ++static int adm8211_ioctl_giwap(struct net_device *dev, ++ struct iw_request_info *info, ++ struct sockaddr *ap_addr, char *extra) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ ap_addr->sa_family = ARPHRD_ETHER; ++ memcpy(ap_addr->sa_data, priv->ieee80211.bssid, ETH_ALEN); ++ return 0; ++} ++ ++ ++static int adm8211_ioctl_siwap(struct net_device *dev, ++ struct iw_request_info *info, ++ struct sockaddr *ap_addr, char *extra) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ u8 *addr = ap_addr->sa_data; ++ memcpy(priv->ieee80211.pref_bssid, addr, ETH_ALEN); ++ priv->ieee80211.pref_bssid_set = addr[0] || addr[1] || addr[2] || ++ addr[3] || addr[4] || addr[5]; ++ ++ if (dev->flags & IFF_UP && priv->iw_mode != IW_MODE_MONITOR) ++ ieee80211_start(&priv->ieee80211); ++ ++ return 0; ++} ++ ++static int adm8211_ioctl_siwrate(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, ++ char *extra) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ struct ieee80211_data *data = &priv->ieee80211; ++ int i, j; ++ ++ if (vwrq->value <= 0) ++ return -EINVAL; ++ ++ if (!vwrq->fixed) { ++ data->auto_rate = 1; ++ /* assumes last rate is the highest rate */ ++ data->rate = data->supp_rates[data->num_supp_rates-1]; ++ } else if (vwrq->value <= data->num_supp_rates) { ++ data->rate = data->supp_rates[vwrq->value-1]; ++ } else { ++ i = 0; ++ j = (vwrq->value*2)/1000000; ++ ++ /* make sure the rate given matches a supported rate */ ++ while (i < data->num_supp_rates && data->supp_rates[i] != j) ++ i+=1; ++ ++ /* give up if it doesn't */ ++ if (i >= data->num_supp_rates) ++ return -EINVAL; ++ ++ data->rate = j; ++ } ++ ++ if (dev->flags & IFF_UP) ++ data->set_rate(dev); ++ ++ return 0; ++} ++ ++static int adm8211_ioctl_giwrate(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, ++ char *extra) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ struct ieee80211_data *data = &priv->ieee80211; ++ ++ vwrq->fixed = !data->auto_rate; ++ vwrq->value = (data->rate*1000000)/2; ++ return 0; ++} ++ ++static int adm8211_ioctl_siwrts(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, ++ char *extra) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ ++ if (vwrq->disabled) ++ priv->rts_thresh = 2347; ++ else if ((vwrq->value >= 0) && (vwrq->value <= 2346)) ++ priv->rts_thresh = vwrq->value; ++ else ++ return -EINVAL; ++ ++ return 0; ++} ++ ++static int adm8211_ioctl_giwrts(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, ++ char *extra) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ ++ vwrq->value = priv->rts_thresh; ++ vwrq->disabled = (vwrq->value > 2346); ++ vwrq->fixed = 1; ++ ++ return 0; ++} ++ ++static int adm8211_ioctl_siwfrag(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, ++ char *extra) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ ++ if (vwrq->disabled) ++ priv->frag_thresh = 2346; ++ else if ((vwrq->value >= 256) && (vwrq->value <= 2346)) ++ priv->frag_thresh = vwrq->value; ++ else ++ return -EINVAL; ++ ++ return 0; ++} ++ ++static int adm8211_ioctl_giwfrag(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, ++ char *extra) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ ++ vwrq->value = priv->frag_thresh; ++ vwrq->disabled = (vwrq->value >= 2346); ++ vwrq->fixed = 1; ++ ++ return 0; ++} ++ ++static int adm8211_ioctl_giwtxpow(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, ++ char *extra) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ ++ vwrq->flags = IW_TXPOW_DBM; ++ if (priv->tx_power > 0x3F) { ++ vwrq->fixed = 0; ++ vwrq->value = priv->eeprom->tx_power[priv->ieee80211.channel-1]; ++ } else { ++ vwrq->fixed = 1; ++ vwrq->value = priv->tx_power; ++ } ++ ++ if (!vwrq->value) ++ vwrq->disabled = 1; ++ else ++ vwrq->disabled = 0; ++ ++ return 0; ++} ++ ++static int adm8211_ioctl_siwtxpow(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, ++ char *extra) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ ++ if (vwrq->disabled || !vwrq->fixed) { ++ priv->tx_power = 0x40; ++ } else if (vwrq->value >= 0 && vwrq->value <= 0x3F) { ++ priv->tx_power = vwrq->value; ++ } else ++ return -EINVAL; ++ ++ return 0; ++} ++ ++static int adm8211_ioctl_siwretry(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, ++ char *extra) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ ++ if (!vwrq->disabled && (vwrq->flags & IW_RETRY_LIMIT)) ++ priv->retry_limit = vwrq->value; ++ else ++ return -EINVAL; ++ ++ return 0; ++} ++ ++static int adm8211_ioctl_giwretry(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_param *vwrq, ++ char *extra) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ ++ vwrq->disabled = 0; ++ vwrq->value = priv->retry_limit; ++ vwrq->flags = IW_RETRY_LIMIT; ++ ++ return 0; ++} ++ ++/* WEP ioctls adapted from atmel driver */ ++static int adm8211_ioctl_siwencode(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *dwrq, ++ char *extra) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ struct ieee80211_data *data = &priv->ieee80211; ++ int index = (dwrq->flags & IW_ENCODE_INDEX) - 1; ++ ++ ++ if (dwrq->length > 0) { ++ if (dwrq->length > 13) ++ return -EINVAL; ++ ++ /* Check the index (none -> use current) */ ++ if (index < 0 || index >= 4) ++ index = data->default_key; ++ else ++ data->default_key = index; ++ ++ if (dwrq->length > 5) ++ data->wep_data[index].len = 13; ++ else ++ data->wep_data[index].len = 5; ++ ++ /* Check if the key is not marked as invalid */ ++ if (!(dwrq->flags & IW_ENCODE_NOKEY)) { ++ /* Cleanup */ ++ memset(data->wep_data[index].key, 0, 13); ++ /* Copy the key in the driver */ ++ memcpy(data->wep_data[index].key, extra, dwrq->length); ++ } else { ++ memset(data->wep_data[index].key, 0, 13); ++ data->wep_data[index].len = 0; ++ } ++ ++ if (dev->flags & IFF_UP) ++ adm8211_write_wepkey(dev, index); ++ } else { ++ /* Do we want to just set the transmit key index ? */ ++ if ( index >= 0 && index < 4 ) ++ data->default_key = index; ++ else if (!dwrq->flags & IW_ENCODE_MODE) ++ return -EINVAL; ++ } ++ ++ if (dwrq->flags & IW_ENCODE_DISABLED) { ++ data->wep_enabled = 0; ++ data->auth_algorithm = 0; ++ priv->ieee80211.capab &= ~WLAN_CAPABILITY_PRIVACY; ++ } else { ++ data->wep_enabled = (dwrq->flags & IW_ENCODE_RESTRICTED ? 2:1); ++ data->auth_algorithm = 1; ++ priv->ieee80211.capab |= WLAN_CAPABILITY_PRIVACY; ++ } ++ ++ if (dev->flags & IFF_UP) ++ adm8211_update_wep(dev); ++ ++ return 0; ++} ++ ++static int adm8211_ioctl_giwencode(struct net_device *dev, ++ struct iw_request_info *info, ++ struct iw_point *dwrq, ++ char *extra) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ struct ieee80211_data *data = &priv->ieee80211; ++ int index = (dwrq->flags & IW_ENCODE_INDEX) - 1; ++ ++ switch (data->wep_enabled) { ++ case 1: dwrq->flags = IW_ENCODE_OPEN; ++ break; ++ case 2: dwrq->flags = IW_ENCODE_RESTRICTED; ++ break; ++ case 0: ++ default: ++ dwrq->flags = IW_ENCODE_DISABLED; ++ break; ++ } ++ ++ if (index < 0 || index >= 4) ++ index = data->default_key; ++ ++ dwrq->flags |= index + 1; ++ dwrq->length = data->wep_data[index].len; ++ memset(extra, 0, 16); ++ memcpy(extra, data->wep_data[index].key, dwrq->length); ++ ++ return 0; ++} ++ ++static const iw_handler adm8211_handler[] = ++{ ++ (iw_handler) NULL, /* SIOCSIWCOMMIT */ ++ (iw_handler) adm8211_ioctl_giwname, /* SIOCGIWNAME */ ++ (iw_handler) NULL, /* SIOCSIWNWID */ ++ (iw_handler) NULL, /* SIOCGIWNWID */ ++ (iw_handler) adm8211_ioctl_siwfreq, /* SIOCSIWFREQ */ ++ (iw_handler) adm8211_ioctl_giwfreq, /* SIOCGIWFREQ */ ++ (iw_handler) adm8211_ioctl_siwmode, /* SIOCSIWMODE */ ++ (iw_handler) adm8211_ioctl_giwmode, /* SIOCGIWMODE */ ++ (iw_handler) NULL, /* SIOCSIWSENS */ ++ (iw_handler) NULL, /* SIOCGIWSENS */ ++ (iw_handler) NULL /* not used */, /* SIOCSIWRANGE */ ++ (iw_handler) adm8211_ioctl_giwrange, /* SIOCGIWRANGE */ ++ (iw_handler) NULL /* not used */, /* SIOCSIWPRIV */ ++ (iw_handler) NULL /* kernel code */, /* SIOCGIWPRIV */ ++ (iw_handler) NULL /* not used */, /* SIOCSIWSTATS */ ++ (iw_handler) NULL /* kernel code */, /* SIOCGIWSTATS */ ++ (iw_handler) NULL, /* SIOCSIWSPY */ ++ (iw_handler) NULL, /* SIOCGIWSPY */ ++ (iw_handler) NULL, /* -- hole -- */ ++ (iw_handler) NULL, /* -- hole -- */ ++ (iw_handler) adm8211_ioctl_siwap, /* SIOCSIWAP */ ++ (iw_handler) adm8211_ioctl_giwap, /* SIOCGIWAP */ ++ (iw_handler) NULL, /* -- hole -- */ ++ (iw_handler) NULL, /* SIOCGIWAPLIST */ ++ (iw_handler) adm8211_ioctl_siwscan, /* SIOCSIWSCAN */ ++ (iw_handler) adm8211_ioctl_giwscan, /* SIOCGIWSCAN */ ++ (iw_handler) adm8211_ioctl_siwessid, /* SIOCSIWESSID */ ++ (iw_handler) adm8211_ioctl_giwessid, /* SIOCGIWESSID */ ++ (iw_handler) adm8211_ioctl_siwnickn, /* SIOCSIWNICKN */ ++ (iw_handler) adm8211_ioctl_giwnickn, /* SIOCGIWNICKN */ ++ (iw_handler) NULL, /* -- hole -- */ ++ (iw_handler) NULL, /* -- hole -- */ ++ (iw_handler) adm8211_ioctl_siwrate, /* SIOCSIWRATE */ ++ (iw_handler) adm8211_ioctl_giwrate, /* SIOCGIWRATE */ ++ (iw_handler) adm8211_ioctl_siwrts, /* SIOCSIWRTS */ ++ (iw_handler) adm8211_ioctl_giwrts, /* SIOCGIWRTS */ ++ (iw_handler) adm8211_ioctl_siwfrag, /* SIOCSIWFRAG */ ++ (iw_handler) adm8211_ioctl_giwfrag, /* SIOCGIWFRAG */ ++ (iw_handler) adm8211_ioctl_siwtxpow, /* SIOCSIWTXPOW */ ++ (iw_handler) adm8211_ioctl_giwtxpow, /* SIOCGIWTXPOW */ ++ (iw_handler) adm8211_ioctl_siwretry, /* SIOCSIWRETRY */ ++ (iw_handler) adm8211_ioctl_giwretry, /* SIOCGIWRETRY */ ++ (iw_handler) adm8211_ioctl_siwencode, /* SIOCSIWENCODE */ ++ (iw_handler) adm8211_ioctl_giwencode, /* SIOCGIWENCODE */ ++ (iw_handler) NULL, /* SIOCSIWPOWER */ ++ (iw_handler) NULL, /* SIOCGIWPOWER */ ++}; ++ ++static int adm8211_ioctl_sreg (struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, ++ char *extra) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ int *i = (int *) extra; ++ u32 addr = i[0]; ++ u32 reg = i[1]; ++ ++ if (addr >= 0 && addr <= 0x10C) { ++ printk(KERN_NOTICE "%s: writing 0x%x to 0x%x\n", ++ dev->name, reg, addr); ++ writel(reg, priv->mem + addr); ++ } else { ++ printk(KERN_NOTICE "%s: setreg: register value out of range\n", dev->name); ++ } ++ return 0; ++} ++ ++static int adm8211_ioctl_greg (struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, ++ char *extra) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ u32 addr = wrqu->param.value; ++ ++ if (addr >= 0 && addr <= 0x10C) { ++ printk(KERN_NOTICE "%s: value of register 0x%x is 0x%x\n", ++ dev->name, addr, readl(priv->mem + addr)); ++ } else { ++ printk(KERN_NOTICE "%s: getreg: register value out of range\n", dev->name); ++ } ++ return 0; ++} ++ ++static int adm8211_ioctl_print_eeprom (struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, ++ char *extra) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ int i, bl; ++ ++ if (priv->eeprom) { ++ printk(KERN_NOTICE "%s: eeprom dump:\n", dev->name); ++ ++ for (bl = 0; bl < priv->eeprom_len; bl += 16) { ++ printk(KERN_NOTICE "%s:", dev->name); ++ for (i = 0; i<16; i+=1) ++ printk(" %02x", ((u8 *)priv->eeprom)[bl+i]); ++ printk("\n"); ++ } ++ ++ } else ++ printk(KERN_NOTICE "%s: no eeprom data\n", dev->name); ++ ++ return 0; ++} ++ ++static int adm8211_ioctl_set_country (struct net_device *dev, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, ++ char *extra) ++{ ++ struct adm8211_priv *priv = netdev_priv(dev); ++ int code = wrqu->param.value; ++ ++ if (code >= ARRAY_SIZE(cranges) || code < 0) ++ return -EINVAL; ++ ++ /* potential, but unlikely race, I think. need to check */ ++ priv->ieee80211.chan_range = cranges[code]; ++ printk(KERN_DEBUG "%s: Channel range: %d-%d\n", ++ dev->name, (int)priv->ieee80211.chan_range.min, (int)priv->ieee80211.chan_range.max); ++ ++ return 0; ++} ++ ++static const iw_handler adm8211_private_handler[] = ++{ /* SIOCIWFIRSTPRIV + */ ++ (iw_handler) adm8211_ioctl_sreg, ++ (iw_handler) NULL, ++ (iw_handler) adm8211_ioctl_greg, ++ (iw_handler) NULL, ++ (iw_handler) adm8211_ioctl_print_eeprom, ++ (iw_handler) NULL, ++ (iw_handler) adm8211_ioctl_set_country, ++}; ++ ++static const struct iw_priv_args adm8211_priv[] = { ++ {SIOCIWFIRSTPRIV, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "setreg" }, ++ {0}, ++ {SIOCIWFIRSTPRIV+2, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "getreg" }, ++ {0}, ++ {SIOCIWFIRSTPRIV+4, IW_PRIV_TYPE_NONE, 0, "print_eeprom" }, ++ {0}, ++ {SIOCIWFIRSTPRIV+6, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_country" }, ++}; ++ ++const struct iw_handler_def adm8211_iw_handler_def = ++{ ++ .num_standard = ARRAY_SIZE(adm8211_handler), ++ .num_private = ARRAY_SIZE(adm8211_private_handler), ++ .num_private_args = ARRAY_SIZE(adm8211_priv), ++ .standard = (iw_handler *) adm8211_handler, ++ .private = (iw_handler *) adm8211_private_handler, ++ .private_args = (struct iw_priv_args *) adm8211_priv, ++}; ++ +diff -urN x/drivers/net/wireless/adm8211/adm8211_ioctl.h y/drivers/net/wireless/adm8211/adm8211_ioctl.h +--- x/drivers/net/wireless/adm8211/adm8211_ioctl.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/adm8211/adm8211_ioctl.h 2003-08-04 16:19:59.000000000 +1000 +@@ -0,0 +1,6 @@ ++#ifndef ADM8211_IOCTL_H ++#define ADM8211_IOCTL_H ++ ++extern const struct iw_handler_def adm8211_iw_handler_def; ++ ++#endif /* ADM8211_IOCTL_H */ +diff -urN x/drivers/net/wireless/adm8211/avs_caphdr.h y/drivers/net/wireless/adm8211/avs_caphdr.h +--- x/drivers/net/wireless/adm8211/avs_caphdr.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/adm8211/avs_caphdr.h 2004-07-03 11:04:13.000000000 +1000 +@@ -0,0 +1,21 @@ ++#ifndef AVS_CAPHDR_H ++#define AVS_CAPHDR_H ++ ++struct avs_caphdr { ++ u32 version; ++ u32 length; ++ u64 mactime; ++ u64 hosttime; ++ u32 phytype; ++ u32 channel; ++ u32 datarate; ++ u32 antenna; ++ u32 priority; ++ u32 ssi_type; ++ s32 ssi_signal; ++ s32 ssi_noise; ++ u32 preamble; ++ u32 encoding; ++} __attribute__ ((packed)); ++ ++#endif /* AVS_CAPHDR_H */ +diff -urN x/drivers/net/wireless/adm8211/compat.h y/drivers/net/wireless/adm8211/compat.h +--- x/drivers/net/wireless/adm8211/compat.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/adm8211/compat.h 2004-08-27 12:43:37.000000000 +1000 +@@ -0,0 +1,56 @@ ++#ifndef COMPAT_H ++#define COMPAT_H ++ ++#ifndef LINUX_VERSION_CODE ++#include ++#endif ++ ++/* Backwards compatibility tricks (thanks to Alex ) */ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23) ++typedef void irqreturn_t; ++#define IRQ_NONE ++#define IRQ_HANDLED ++#define IRQ_RETVAL(x) ++#define free_netdev(x) kfree(x) ++#define pci_name(x) x->slot_name ++#endif ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++#define pci_set_consistent_dma_mask(x,y) ++#define pci_dma_sync_single_for_cpu pci_dma_sync_single ++#define pci_dma_sync_single_for_device(a,b,c,d) ++#define module_param(x,y,z) MODULE_PARM(x, "i") ++#define del_singleshot_timer_sync(x) del_timer_sync(x) ++ ++#ifndef SET_NETDEV_DEV ++#define SET_NETDEV_DEV(net, pdev) ++#endif ++ ++#ifndef HAVE_NETDEV_PRIV ++#define netdev_priv(x) x->priv ++#endif ++ ++#include ++ ++/** ++ * random_ether_addr - Generate software assigned random Ethernet address ++ * @addr: Pointer to a six-byte array containing the Ethernet address ++ * ++ * Generate a random Ethernet address (MAC) that is not multicast ++ * and has the local assigned bit set. ++ */ ++static inline void random_ether_addr(u8 *addr) ++{ ++ get_random_bytes (addr, ETH_ALEN); ++ addr [0] &= 0xfe; /* clear multicast bit */ ++ addr [0] |= 0x02; /* set local assignment bit (IEEE802) */ ++} ++ ++#endif ++ ++#ifndef DMA_32BIT_MASK ++#define DMA_64BIT_MASK 0xffffffffffffffffULL ++#define DMA_32BIT_MASK 0x00000000ffffffffULL ++#endif ++ ++#endif /* COMPAT_H */ +diff -urN x/drivers/net/wireless/adm8211/ieee80211.c y/drivers/net/wireless/adm8211/ieee80211.c +--- x/drivers/net/wireless/adm8211/ieee80211.c 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/adm8211/ieee80211.c 2004-09-16 15:15:13.000000000 +1000 +@@ -0,0 +1,1649 @@ ++/* ++ * IEEE 802.11 station / management functionality ++ * ++ * Copyright (c) 2003, Jouni Malinen ++ * Copyright (c) 2004, Michael Wu ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. See README and COPYING for ++ * more details. ++ */ ++ ++/* TODO: ++ * - remove a bunch of unnecessary code ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "compat.h" ++#include "ieee80211.h" ++ ++#define IEEE80211_SCAN_INTERVAL (5 * HZ) ++#define IEEE80211_SCAN_LISTEN (HZ / 10) ++#define IEEE80211_AUTH_TIMEOUT (1 * HZ) ++#define IEEE80211_AUTH_MAX_TRIES 3 ++#define IEEE80211_ASSOC_TIMEOUT (1 * HZ) ++#define IEEE80211_ASSOC_MAX_TRIES 3 ++#define IEEE80211_MONITORING_INTERVAL (30 * HZ) ++ ++static void ieee80211_timer(unsigned long ptr); ++ ++ParseRes ieee802_11_parse_elems(u8 *start, size_t len, ++ struct ieee802_11_elems *elems) ++{ ++ size_t left = len; ++ u8 *pos = start; ++ int unknown = 0; ++ ++ memset(elems, 0, sizeof(*elems)); ++ ++ while (left >= 2) { ++ u8 id, elen; ++ ++ id = *pos++; ++ elen = *pos++; ++ left -= 2; ++ ++ if (elen > left) { ++#if 0 ++ if (net_ratelimit()) ++ printk(KERN_DEBUG "IEEE 802.11 element parse " ++ "failed (id=%d elen=%d left=%d)\n", ++ id, elen, left); ++#endif ++ return ParseFailed; ++ } ++ ++ switch (id) { ++ case WLAN_EID_SSID: ++ elems->ssid = pos; ++ elems->ssid_len = elen; ++ break; ++ case WLAN_EID_SUPP_RATES: ++ elems->supp_rates = pos; ++ elems->supp_rates_len = elen; ++ break; ++ case WLAN_EID_FH_PARAMS: ++ elems->fh_params = pos; ++ elems->fh_params_len = elen; ++ break; ++ case WLAN_EID_DS_PARAMS: ++ elems->ds_params = pos; ++ elems->ds_params_len = elen; ++ break; ++ case WLAN_EID_CF_PARAMS: ++ elems->cf_params = pos; ++ elems->cf_params_len = elen; ++ break; ++ case WLAN_EID_TIM: ++ elems->tim = pos; ++ elems->tim_len = elen; ++ break; ++ case WLAN_EID_IBSS_PARAMS: ++ elems->ibss_params = pos; ++ elems->ibss_params_len = elen; ++ break; ++ case WLAN_EID_CHALLENGE: ++ elems->challenge = pos; ++ elems->challenge_len = elen; ++ break; ++ default: ++#if 0 ++ printk(KERN_DEBUG "IEEE 802.11 element parse ignored " ++ "unknown element (id=%d elen=%d)\n", ++ id, elen); ++#endif ++ unknown++; ++ break; ++ } ++ ++ left -= elen; ++ pos += elen; ++ } ++ ++ if (left) ++ return ParseFailed; ++ ++ return unknown ? ParseUnknown : ParseOK; ++} ++ ++ ++static void ieee80211_dump_ssid(u8 *ssid, size_t ssid_len) ++{ ++ int i; ++ ++ for (i = 0; i < ssid_len; i++) ++ printk((ssid[i] >= 32 && ssid[i] < 127) ? ++ "%c" : "<%02x>", ssid[i]); ++} ++ ++static char * ieee80211_status_code(int status) ++{ ++ switch (status) { ++ case WLAN_STATUS_SUCCESS: ++ return "Success"; ++ case WLAN_STATUS_UNSPECIFIED_FAILURE: ++ return "Unspecified failure"; ++ case WLAN_STATUS_CAPS_UNSUPPORTED: ++ return "Capabilities unsupported"; ++ case WLAN_STATUS_REASSOC_NO_ASSOC: ++ return "Reassociation failure; no association"; ++ case WLAN_STATUS_ASSOC_DENIED_UNSPEC: ++ return "Association denied"; ++ case WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG: ++ return "Authentication algorithm not supported"; ++ case WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION: ++ return "Unknown authentication transaction"; ++ case WLAN_STATUS_CHALLENGE_FAIL: ++ return "Challenge failed"; ++ case WLAN_STATUS_AUTH_TIMEOUT: ++ return "Authentication timeout"; ++ case WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA: ++ return "AP unable to handle new STA"; ++ case WLAN_STATUS_ASSOC_DENIED_RATES: ++ return "Association denied: Rates not supported"; ++ ++ /* 802.11b */ ++ case WLAN_STATUS_ASSOC_DENIED_NOSHORT: ++ return "Association denied: Short preamble not supported"; ++ case WLAN_STATUS_ASSOC_DENIED_NOPBCC: ++ return "Association denied: PBCC not supported"; ++ case WLAN_STATUS_ASSOC_DENIED_NOAGILITY: ++ return "Association denied: Agility not supported"; ++ default: ++ return "Unknown status code"; ++ } ++} ++ ++ ++static void ieee80211_set_associated(struct ieee80211_data *data, int assoc) ++{ ++ if (data->associated == assoc) ++ return; ++ ++ data->associated = assoc; ++ if (data->link_change) ++ data->link_change(data->dev, assoc); ++} ++ ++ ++struct ieee80211_bss * ieee80211_get_bss(struct ieee80211_data *data, u8 *addr) ++{ ++ struct ieee80211_bss *bss; ++ ++ bss = data->bss; ++ while (bss) { ++ if (memcmp(bss->bssid, addr, ETH_ALEN) == 0) ++ return bss; ++ bss = bss->next; ++ } ++ return NULL; ++} ++ ++ ++static int ieee80211_bss_score(struct ieee80211_data *data, ++ struct ieee80211_bss *bss) ++{ ++ int score; ++ ++ score = bss->last_rssi; ++ score -= 50 * bss->num_auth_fail; ++ score -= 50 * bss->num_assoc_fail; ++ if (data->pref_channel == bss->channel) ++ score += 100; ++ return score; ++} ++ ++ ++static int ieee80211_select_bssid(struct ieee80211_data *data) ++{ ++ struct ieee80211_bss *bss, *prev = NULL, *selected = NULL; ++ int best_score = 0, score; ++ ++ spin_lock_bh(&data->lock); ++ bss = data->bss; ++ ++ /* Select first BSS that matches with current configuration */ ++ while (bss) { ++ score = ieee80211_bss_score(data, bss); ++ if (score < -250) ++ goto skip; ++ ++ if (data->mode == IEEE80211_MANAGED && ++ ((bss->capability & WLAN_CAPABILITY_IBSS) || ++ !(bss->capability & WLAN_CAPABILITY_ESS))) ++ goto skip; ++ else if (data->mode == IEEE80211_ADHOC && ++ ((bss->capability & WLAN_CAPABILITY_ESS) || ++ !(bss->capability & WLAN_CAPABILITY_IBSS))) ++ goto skip; ++ ++ printk(KERN_DEBUG "%s: CHAN=%d BSSID=" MACSTR " SSID=", ++ data->dev->name, bss->channel, MAC2STR(bss->bssid)); ++ ieee80211_dump_ssid(bss->ssid, bss->ssid_len); ++ printk(" RSSI=%d num=%lu/%lu score=%d\n", bss->last_rssi, ++ bss->num_beacon, bss->num_proberesp, score); ++ ++ if (data->pref_bssid_set && ++ memcmp(bss->bssid, data->pref_bssid, ETH_ALEN) == 0) { ++ selected = bss; ++ break; ++ } else if (data->any_ssid || bss->ssid_len == 0 || ++ (bss->ssid_len == data->ssid_len && ++ memcmp(bss->ssid, data->ssid, data->ssid_len) == 0)) ++ { ++ if (!selected || score > best_score) { ++ best_score = score; ++ selected = bss; ++ } ++ } ++ ++ skip: ++ prev = bss; ++ bss = bss->next; ++ } ++ ++ if (selected) { ++ if (memcmp(data->bssid, selected->bssid, ETH_ALEN) != 0) { ++ printk(KERN_DEBUG "%s: new BSSID " MACSTR "\n", ++ data->dev->name, MAC2STR(selected->bssid)); ++ ieee80211_set_associated(data, 0); ++ data->authenticated = 0; ++ } ++ memcpy(data->bssid, selected->bssid, ETH_ALEN); ++ data->ssid_len = selected->ssid_len; ++ if (selected->ssid_len) ++ memcpy(data->ssid, selected->ssid, selected->ssid_len); ++ data->channel = selected->channel; ++ data->beacon_interval = selected->interval; ++ } ++ ++ spin_unlock_bh(&data->lock); ++ ++ return selected ? 0 : -1; ++} ++ ++static void ieee80211_send_auth(struct ieee80211_data *data, u8 *bssid, int status_code) ++{ ++ struct sk_buff *skb; ++ union ieee80211_mgmt_payload *mgmt; ++ struct ieee80211_bss *bss; ++ u8 *pos; ++ u16 fc, capab; ++ ++ if (!data->tx) ++ return; ++ ++ skb = dev_alloc_skb(6 + 2 + WLAN_AUTH_CHALLENGE_LEN + 8); ++ if (skb == NULL) { ++ printk(KERN_DEBUG "%s: failed to allocate buffer for auth " ++ "frame\n", data->dev->name); ++ return; ++ } ++ ++ spin_lock_bh(&data->lock); ++ bss = ieee80211_get_bss(data, bssid); ++ ++ mgmt = (union ieee80211_mgmt_payload *) skb_put(skb, 6); ++ fc = IEEE80211_FC(WLAN_FC_TYPE_MGMT, ++ WLAN_FC_STYPE_AUTH); ++ ++ bss->auth_state+=1; ++ if (status_code == WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG) { ++ mgmt->auth.auth_alg = cpu_to_le16(bss->auth_alg); ++ mgmt->auth.auth_transaction = cpu_to_le16(bss->auth_state); ++ mgmt->auth.status_code = cpu_to_le16(status_code); ++ } else if (bss->auth_alg == WLAN_AUTH_OPEN) { ++ mgmt->auth.auth_alg = cpu_to_le16(WLAN_AUTH_OPEN); ++ mgmt->auth.auth_transaction = cpu_to_le16(bss->auth_state); ++ mgmt->auth.status_code = cpu_to_le16(status_code); ++ ++ if (bss->auth_state == 2) { ++ bss->auth_state = 0; ++ if (status_code == 0) ++ bss->authenticated += 1; ++ } ++ } else if (bss->auth_alg == WLAN_AUTH_SHARED_KEY) { ++ mgmt->auth.auth_alg = cpu_to_le16(WLAN_AUTH_SHARED_KEY); ++ mgmt->auth.auth_transaction = cpu_to_le16(bss->auth_state); ++ mgmt->auth.status_code = cpu_to_le16(status_code); ++ ++ switch (bss->auth_state) { ++ case 1: ++ break; ++ case 2: pos = skb_put(skb, 2 + WLAN_AUTH_CHALLENGE_LEN); ++ bss->challenge = (u8 *) kmalloc(WLAN_AUTH_CHALLENGE_LEN, GFP_ATOMIC); ++ if (!bss->challenge) { ++ printk(KERN_DEBUG "%s: failed to allocate buffer " ++ "for challenge\n", data->dev->name); ++ bss->auth_state = 0; ++ goto fail; ++ } ++ get_random_bytes(bss->challenge, WLAN_AUTH_CHALLENGE_LEN); ++ *pos++ = WLAN_EID_CHALLENGE; ++ *pos++ = WLAN_AUTH_CHALLENGE_LEN; ++ memcpy(pos, bss->challenge, WLAN_AUTH_CHALLENGE_LEN); ++ break; ++ case 3: pos = skb_put(skb, 2 + WLAN_AUTH_CHALLENGE_LEN); ++ *pos++ = WLAN_EID_CHALLENGE; ++ *pos++ = WLAN_AUTH_CHALLENGE_LEN; ++ if (bss->challenge) ++ memcpy(pos, bss->challenge, WLAN_AUTH_CHALLENGE_LEN); ++ else { ++ printk(KERN_DEBUG "%s: No challenge to return\n", data->dev->name); ++ goto fail; ++ } ++ ++ fc |= cpu_to_le16(WLAN_FC_ISWEP); ++ break; ++ case 4: kfree(bss->challenge); ++ bss->challenge = NULL; ++ bss->auth_state = 0; ++ if (status_code == 0) ++ bss->authenticated += 1; ++ break; ++ } ++ } else { ++ printk(KERN_DEBUG "%s: Unknown authentication algorithm. " ++ "Something is wrong. This shouldn't happen.\n", data->dev->name); ++ goto fail; ++ } ++ ++ printk(KERN_DEBUG "%s: TX authentication (alg=%d transaction=%d status=%d %s)\n", ++ data->dev->name, bss->auth_alg, ++ bss->auth_state, status_code, ++ ieee80211_status_code(status_code)); ++ capab = bss->capability; ++ spin_unlock_bh(&data->lock); ++ data->tx(data->dev, skb, fc, capab, bssid); ++ return; ++ ++fail: ++ dev_kfree_skb(skb); ++ spin_unlock_bh(&data->lock); ++ return; ++} ++ ++ ++static void ieee80211_authenticate(struct ieee80211_data *data) ++{ ++ struct ieee80211_bss *bss; ++ ++ data->auth_tries++; ++ if (data->auth_tries > IEEE80211_AUTH_MAX_TRIES) { ++ printk(KERN_DEBUG "%s: authentication with AP " MACSTR ++ " CHAN=%d timed out\n", ++ data->dev->name, MAC2STR(data->bssid), data->channel); ++ spin_lock_bh(&data->lock); ++ bss = ieee80211_get_bss(data, data->bssid); ++ if (bss) { ++ bss->num_auth_fail++; ++ bss->auth_state = 0; ++ } ++ spin_unlock_bh(&data->lock); ++ ieee80211_start_scan(data); ++ return; ++ } ++ ++ data->state = IEEE80211_AUTHENTICATE; ++ spin_lock_bh(&data->lock); ++ bss = ieee80211_get_bss(data, data->bssid); ++ bss->auth_state = 0; ++ spin_unlock_bh(&data->lock); ++ printk(KERN_DEBUG "%s: authenticate with AP " MACSTR " CHAN=%d\n", ++ data->dev->name, MAC2STR(data->bssid), data->channel); ++ ++ if (data->set_channel) ++ data->set_channel(data->dev, data->channel); ++ if (data->set_bssid) ++ data->set_bssid(data->dev, data->bssid); ++ if (data->set_rate) ++ data->set_rate(data->dev); ++ if (data->set_interval) ++ data->set_interval(data->dev); ++ if (data->beacon_sync) ++ data->beacon_sync(data->dev); ++ ++ ieee80211_send_auth(data, data->bssid, 0); ++ ++ mod_timer(&data->timer, jiffies + IEEE80211_AUTH_TIMEOUT); ++} ++ ++static void ieee80211_send_assoc_req(struct ieee80211_data *data) ++{ ++ struct sk_buff *skb; ++ union ieee80211_mgmt_payload *mgmt; ++ struct ieee80211_bss *bss; ++ u8 *pos; ++ u16 fc, capab; ++ int i = 0; ++ int reassoc = 0; ++ ++ if (!data->tx) ++ return; ++ ++ skb = dev_alloc_skb(2 + 2 + 2 + data->ssid_len + 2 + data->num_supp_rates); ++ if (skb == NULL) { ++ printk(KERN_DEBUG "%s: failed to allocate buffer for assoc req " ++ "frame\n", data->dev->name); ++ return; ++ } ++ ++ spin_lock_bh(&data->lock); ++ bss = ieee80211_get_bss(data, data->bssid); ++ ++ /* TODO: check how prev_bssid_set is suppose to work */ ++ if (data->prev_bssid_set) { ++ mgmt = (union ieee80211_mgmt_payload *) skb_put(skb, 10); ++ fc = IEEE80211_FC(WLAN_FC_TYPE_MGMT, ++ WLAN_FC_STYPE_REASSOC_REQ); ++ mgmt->reassoc_req.capab_info = cpu_to_le16(bss->capability); ++ mgmt->reassoc_req.listen_interval = ++ cpu_to_le16(data->listen_interval); ++ memcpy(mgmt->reassoc_req.current_ap, data->prev_bssid, ++ ETH_ALEN); ++ reassoc = 1; ++ } else { ++ mgmt = (union ieee80211_mgmt_payload *) skb_put(skb, 4); ++ fc = IEEE80211_FC(WLAN_FC_TYPE_MGMT, ++ WLAN_FC_STYPE_ASSOC_REQ); ++ mgmt->assoc_req.capab_info = cpu_to_le16(bss->capability); ++ mgmt->assoc_req.listen_interval = ++ cpu_to_le16(data->listen_interval); ++ } ++ capab = bss->capability; ++ spin_unlock_bh(&data->lock); ++ ++ /* SSID */ ++ pos = skb_put(skb, 2 + data->ssid_len); ++ *pos++ = WLAN_EID_SSID; ++ *pos++ = data->ssid_len; ++ memcpy(pos, data->ssid, data->ssid_len); ++ ++ pos = skb_put(skb, 2 + data->num_supp_rates); ++ /* All supported rates */ ++ *pos++ = WLAN_EID_SUPP_RATES; ++ *pos++ = data->num_supp_rates; ++ while (i++ < data->num_supp_rates) ++ *pos++ = data->supp_rates[i-1]; ++ ++ printk(KERN_DEBUG "%s: TX %sssocReq (capab=0x%x)\n", ++ data->dev->name, reassoc ? "Rea" : "A", capab); ++ ++ data->tx(data->dev, skb, fc, capab, data->bssid); ++} ++ ++/* removes all bss */ ++static void ieee80211_free_bss(struct ieee80211_data *data) ++{ ++ struct ieee80211_bss *bss, *prev; ++ unsigned long flags; ++ ++ /* need irqsave as opposed to bh so this can be run during suspend */ ++ spin_lock_irqsave(&data->lock, flags); ++ ++ bss = data->bss; ++ data->bss = NULL; ++ while (bss) { ++ prev = bss; ++ bss = bss->next; ++ kfree(prev); ++ } ++ ++ spin_unlock_irqrestore(&data->lock, flags); ++} ++ ++static void ieee80211_associate(struct ieee80211_data *data) ++{ ++ data->assoc_tries++; ++ if (data->assoc_tries > IEEE80211_ASSOC_MAX_TRIES) { ++ struct ieee80211_bss *bss; ++ printk(KERN_DEBUG "%s: association with AP " MACSTR ++ " CHAN=%d timed out\n", ++ data->dev->name, MAC2STR(data->bssid), data->channel); ++ spin_lock_bh(&data->lock); ++ bss = ieee80211_get_bss(data, data->bssid); ++ if (bss) { ++ bss->num_assoc_fail++; ++ if (bss->num_assoc_fail > 6) { ++ spin_unlock_bh(&data->lock); ++ ieee80211_free_bss(data); ++ /* yuck */ ++ spin_lock_bh(&data->lock); ++ } ++ } ++ spin_unlock_bh(&data->lock); ++ ieee80211_start_scan(data); ++ return; ++ } ++ ++ data->state = IEEE80211_ASSOCIATE; ++ printk(KERN_DEBUG "%s: associate with AP " MACSTR "\n", ++ data->dev->name, MAC2STR(data->bssid)); ++ ++ ieee80211_send_assoc_req(data); ++ ++ mod_timer(&data->timer, jiffies + IEEE80211_ASSOC_TIMEOUT); ++} ++ ++ ++static void ieee80211_associated(struct ieee80211_data *data) ++{ ++ /* TODO: start monitoring current AP signal quality and number of ++ * missed beacons. Scan other channels every now and then and search ++ * for better APs. */ ++ /* TODO: remove expired BSSes */ ++ ++ if (data->state != IEEE80211_ASSOCIATED) { ++ data->state = IEEE80211_ASSOCIATED; ++ netif_wake_queue(data->dev); ++ } ++ ++ mod_timer(&data->timer, jiffies + IEEE80211_MONITORING_INTERVAL); ++} ++ ++static void ieee80211_send_probe_req(struct ieee80211_data *data) ++{ ++ struct sk_buff *skb; ++ union ieee80211_mgmt_payload *mgmt; ++ u8 *pos; ++ u16 fc; ++ u8 dst[ETH_ALEN]; ++ int i = 0; ++ ++ if (!data->tx) ++ return; ++ ++ skb = dev_alloc_skb(2 + 2 + data->num_supp_rates); ++ if (skb == NULL) { ++ printk(KERN_DEBUG "%s: failed to allocate buffer for probe " ++ "request\n", data->dev->name); ++ return; ++ } ++ ++ mgmt = (union ieee80211_mgmt_payload *) skb_put(skb, 2 + 2 + data->num_supp_rates); ++ memset(mgmt, 0, 2 + 2 + data->num_supp_rates); ++ fc = IEEE80211_FC(WLAN_FC_TYPE_MGMT, ++ WLAN_FC_STYPE_PROBE_REQ); ++ memset(dst, ~0, ETH_ALEN); ++ pos = mgmt->probe_req.variable; ++ ++ /* Broadcast SSID */ ++ *pos++ = WLAN_EID_SSID; ++ *pos++ = 0; ++ ++ /* All supported rates */ ++ *pos++ = WLAN_EID_SUPP_RATES; ++ *pos++ = data->num_supp_rates; ++ while (i++ < data->num_supp_rates) ++ *pos++ = data->supp_rates[i-1]; ++ ++ data->tx(data->dev, skb, fc, 0, dst); ++} ++ ++ ++static void ieee80211_scan(struct ieee80211_data *data) ++{ ++ data->state = IEEE80211_SCAN; ++ if (data->channel == 0) { ++ printk(KERN_DEBUG "%s: scanning..\n", data->dev->name); ++ data->channel = data->chan_range.min; ++ } else ++ data->channel++; ++ ++ if (data->channel > data->chan_range.max) { ++ if (data->mode == IEEE80211_MANAGED) { ++ if (ieee80211_select_bssid(data) == 0) { ++ ieee80211_authenticate(data); ++ return; ++ } else { ++ ieee80211_free_bss(data); ++ ++ data->channel = 0; ++ mod_timer(&data->timer, ++ jiffies + IEEE80211_SCAN_INTERVAL); ++ return; ++ } ++ } else if (data->mode == IEEE80211_ADHOC) { ++ if (ieee80211_select_bssid(data)) { ++ random_ether_addr(data->bssid); ++ if (data->pref_channel) ++ data->channel = data->pref_channel; ++ else ++ data->channel = data->chan_range.min; ++ if (!data->ssid) { ++ printk(KERN_WARNING "%s: No SSID set. SSID set to \"default\"\n", data->dev->name); ++ memcpy(data->ssid, "default", 7); ++ data->ssid_len = 7; ++ } ++ printk(KERN_DEBUG "%s: No matching ad-hoc sta found. Creating ad-hoc sta\n", data->dev->name); ++ } else ++ printk(KERN_DEBUG "%s: joining IBSS " MACSTR " CHAN=%d\n", ++ data->dev->name, MAC2STR(data->bssid), data->channel); ++ ++ if (data->set_rate) ++ data->set_rate(data->dev); ++ if (data->set_interval) ++ data->set_interval(data->dev); ++ if (data->set_channel) ++ data->set_channel(data->dev, data->channel); ++ if (data->set_bssid) ++ data->set_bssid(data->dev, data->bssid); ++ if (data->set_ssid) ++ data->set_ssid(data->dev, data->ssid, data->ssid_len); ++ if (data->beacon_sync) ++ data->beacon_sync(data->dev); ++ ++ data->associated = 1; ++ ieee80211_associated(data); ++ return; ++ } ++ } ++ ++ if (data->set_channel) ++ data->set_channel(data->dev, data->channel); ++ ++ ieee80211_send_probe_req(data); ++ ++ mod_timer(&data->timer, jiffies + IEEE80211_SCAN_LISTEN); ++} ++ ++ ++void ieee80211_start_scan(struct ieee80211_data *data) ++{ ++ /* avoid scanning in monitor mode */ ++ if (data->mode != IEEE80211_MANAGED && data->mode != IEEE80211_ADHOC) ++ return; ++ ++ /* Set BSSID to ff:ff:ff:ff:ff:ff for active scanning */ ++ memset(data->bssid, ~0, ETH_ALEN); ++ data->channel = 0; ++ ieee80211_set_associated(data, 0); ++ data->authenticated = 0; ++ data->auth_tries = data->assoc_tries = 0; ++ ++ if (data->set_bssid) ++ data->set_bssid(data->dev, data->bssid); ++ ++/* if (in_interrupt()) {*/ ++ data->state = IEEE80211_SCAN; ++ mod_timer(&data->timer, jiffies + IEEE80211_SCAN_LISTEN); ++/* } else { ++ ieee80211_scan(data); ++ }*/ ++ ++} ++ ++void ieee80211_start(struct ieee80211_data *data) ++{ ++ data->beacon_interval = 100; ++ ++ if (data->mode == IEEE80211_MANAGED || data->mode == IEEE80211_ADHOC) ++ ieee80211_start_scan(data); ++ else ++ ieee80211_associated(data); ++} ++ ++void ieee80211_init(struct ieee80211_data *data) ++{ ++ init_timer(&data->timer); ++ data->timer.data = (unsigned long) data; ++ data->timer.function = ieee80211_timer; ++ ++ spin_lock_init(&data->lock); ++ ++ data->listen_interval = 10; ++ data->mode = IEEE80211_MANAGED; ++ data->any_ssid = 1; ++ data->auto_rate = 1; ++ ++ if (!data->supp_rates) ++ data->supp_rates = (u8 *)IEEE80211_B_RATES; ++ ++ data->num_supp_rates=strlen(data->supp_rates); ++ data->rate = data->supp_rates[data->num_supp_rates-1]; ++ ++ get_random_bytes(&data->wep_data[0].iv, 4); ++ get_random_bytes(&data->wep_data[1].iv, 4); ++ get_random_bytes(&data->wep_data[2].iv, 4); ++ get_random_bytes(&data->wep_data[3].iv, 4); ++} ++ ++void ieee80211_deinit(struct ieee80211_data *data) ++{ ++ /* nothing yet.. */ ++ ++ return; ++} ++ ++void ieee80211_stop(struct ieee80211_data *data) ++{ ++ int i; ++ ++ data->state = IEEE80211_STOP; ++ del_singleshot_timer_sync(&data->timer); ++ ++ ieee80211_free_bss(data); ++ for (i = 0; i < IEEE80211_FRAG_CACHE_SIZE; i+=1) { ++ if (data->frag_cache[i].skb) { ++ dev_kfree_skb(data->frag_cache[i].skb); ++ data->frag_cache[i].skb = NULL; ++ } ++ } ++ ++ memset(data->bssid, 0, ETH_ALEN); ++ if (data->set_ssid) ++ data->set_ssid(data->dev, data->ssid, 0); ++ if (data->set_bssid) ++ data->set_bssid(data->dev, data->bssid); ++} ++ ++/* TODO: merge with the only function that calls this, or reduce the number of arguments */ ++static void ieee80211_add_bss(struct ieee80211_data *data, ++ u8 *bssid, u8 *ssid, size_t ssid_len, ++ int channel, u16 capability, struct ieee80211_mgmt *mgmt, ++ int rssi, int rate, int beacon, int invalid, ++ u8 *supp_rates, size_t supp_rates_len) ++{ ++ struct ieee80211_bss *bss; ++ int i; ++ ++ spin_lock_bh(&data->lock); ++ ++ bss = data->bss; ++ ++ while (bss != NULL && ++ (memcmp(bss->bssid, bssid, ETH_ALEN) != 0 || ++ bss->ssid_len != ssid_len || ++ memcmp(bss->ssid, ssid, ssid_len) != 0)) ++ bss = bss->next; ++ ++ if (bss == NULL) { ++/* printk(KERN_DEBUG "%s: new BSS - CHAN=%d BSSID=" MACSTR ++ " SSID=", ++ data->dev->name, channel, MAC2STR(bssid)); ++ ieee80211_dump_ssid(ssid, ssid_len); ++ printk("\n");*/ ++ ++ bss = (struct ieee80211_bss *) ++ kmalloc(sizeof(*bss), GFP_ATOMIC); ++ if (bss == NULL) { ++ spin_unlock_bh(&data->lock); ++ printk(KERN_DEBUG "%s: failed to allocate BSS info " ++ "structure\n", data->dev->name); ++ return; ++ } ++ memset(bss, 0, sizeof(*bss)); ++ memcpy(bss->bssid, bssid, ETH_ALEN); ++ bss->last_seq = ~0; ++ bss->next = data->bss; ++ data->bss = bss; ++ ++ if (capability & WLAN_CAPABILITY_PRIVACY) ++ bss->auth_alg = WLAN_AUTH_SHARED_KEY; ++ else ++ bss->auth_alg = WLAN_AUTH_OPEN; ++ } ++ ++ if (beacon) ++ bss->num_beacon++; ++ else ++ bss->num_proberesp++; ++ ++ memcpy(bss->ssid, ssid, ssid_len); ++ bss->ssid_len = ssid_len; ++ memset(bss->supp_rates, 0, IEEE80211_MAX_SUPP_RATES); ++ if (supp_rates) { ++ memcpy(bss->supp_rates, supp_rates, ++ supp_rates_len > IEEE80211_MAX_SUPP_RATES ? ++ IEEE80211_MAX_SUPP_RATES : supp_rates_len); ++ for (i = data->num_supp_rates; i > 0; i-=1) { ++ if (strchr(bss->supp_rates, data->supp_rates[i-1])) { ++ bss->rate = data->supp_rates[i-1]; ++ break; ++ } ++ } ++ } ++ if (!bss->rate) ++ bss->rate = data->supp_rates[data->num_supp_rates-1]; ++ bss->channel = channel; ++ bss->interval = le16_to_cpu(mgmt->u.beacon.beacon_int); ++ bss->timestamp = le64_to_cpu(mgmt->u.beacon.timestamp); ++ bss->capability = capability; ++ bss->last_rx = jiffies; ++ if (rssi) ++ bss->last_rssi = rssi; ++ bss->last_rate = rate; ++ bss->invalid_frame = invalid; ++ ++ spin_unlock_bh(&data->lock); ++} ++ ++ ++/* Process beacon and probe response frames in common function since they have ++ * almost identical contents. */ ++static void ieee80211_rx_mgmt_bss_info(struct ieee80211_data *data, ++ struct ieee80211_mgmt *mgmt, ++ size_t len, ++ struct ieee80211_rx_status *rx_status, ++ int beacon) ++{ ++ struct ieee802_11_elems elems; ++ size_t baselen; ++ int channel, invalid = 0; ++ ++#if 0 ++ printk(KERN_DEBUG "%s: %s from " MACSTR " rate=%d rssi=%d\n", ++ data->dev->name, beacon ? "Beacon" : "ProbeResp", ++ MAC2STR(mgmt->sa), rx_status->rate, rx_status->rssi); ++#endif ++ ++ baselen = (u8 *) mgmt->u.beacon.variable - (u8 *) mgmt; ++ if (baselen > len) { ++ printk(KERN_DEBUG "%s: Beacon/ProbeResp underflow %d > %d\n", ++ data->dev->name, baselen, len); ++ return; ++ } ++ ++ if (ieee802_11_parse_elems(mgmt->u.beacon.variable, len - baselen, ++ &elems) == ParseFailed) ++ invalid = 1; ++ ++ if (elems.ssid == NULL) ++ return; ++ ++ if (elems.ds_params && elems.ds_params_len == 1) ++ channel = elems.ds_params[0]; ++ else ++ channel = data->channel; ++ ++ ieee80211_add_bss(data, mgmt->bssid, elems.ssid, elems.ssid_len, channel, ++ le16_to_cpu(mgmt->u.beacon.capab_info), mgmt, ++ rx_status->rssi, rx_status->rate, beacon, invalid, ++ elems.supp_rates, elems.supp_rates_len); ++} ++ ++/* check if this is needed.. */ ++static void ieee80211_rx_mgmt_probe_req(struct ieee80211_data *data, ++ struct ieee80211_mgmt *mgmt, ++ size_t len, ++ struct ieee80211_rx_status *rx_status) ++{ ++ return; ++} ++ ++static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_data *data, ++ struct ieee80211_mgmt *mgmt, ++ size_t len, ++ struct ieee80211_rx_status *rx_status) ++{ ++ ieee80211_rx_mgmt_bss_info(data, mgmt, len, rx_status, 0); ++} ++ ++ ++static void ieee80211_rx_mgmt_beacon(struct ieee80211_data *data, ++ struct ieee80211_mgmt *mgmt, ++ size_t len, ++ struct ieee80211_rx_status *rx_status) ++{ ++ ieee80211_rx_mgmt_bss_info(data, mgmt, len, rx_status, 1); ++ /*if (data->beacon_sync && data->state == IEEE80211_ASSOCIATED) ++ data->beacon_sync(data->dev);*/ ++} ++ ++/* TODO: filter auth_transaction and make sure it makes sense for the mode we're in */ ++static void ieee80211_rx_mgmt_auth(struct ieee80211_data *data, ++ struct ieee80211_mgmt *mgmt, ++ size_t len, ++ struct ieee80211_rx_status *rx_status, struct sk_buff *skb) ++{ ++ u16 auth_alg, auth_transaction, status_code; ++ struct ieee802_11_elems elems; ++ struct ieee80211_bss *bss; ++ size_t baselen; ++ ++ if (len < 24 + 6) { ++ printk(KERN_DEBUG "%s: too short (%d) authentication frame " ++ "received from " MACSTR " - ignored\n", ++ data->dev->name, len, MAC2STR(mgmt->sa)); ++ return; ++ } ++ ++ if (data->state != IEEE80211_AUTHENTICATE) { ++ printk(KERN_DEBUG "%s: authentication frame received from " ++ MACSTR ", but not in authenticate state - ignored\n", ++ data->dev->name, MAC2STR(mgmt->sa)); ++ return; ++ } ++ if (memcmp(data->bssid, mgmt->sa, ETH_ALEN) != 0) { ++ printk(KERN_DEBUG "%s: authentication frame received from " ++ "unknown AP (SA=" MACSTR " BSSID=" MACSTR ") - " ++ "ignored\n", data->dev->name, MAC2STR(mgmt->sa), ++ MAC2STR(mgmt->bssid)); ++ return; ++ } ++ ++ baselen = (u8 *) mgmt->u.auth.variable - (u8 *) mgmt; ++ if (baselen > len) { ++ printk(KERN_DEBUG "%s: Auth underflow %d > %d\n", ++ data->dev->name, baselen, len); ++ return; ++ } ++ ++ if (ieee802_11_parse_elems(mgmt->u.auth.variable, len - baselen, ++ &elems) == ParseFailed) { ++ printk(KERN_DEBUG "%s: Parse failed.\n", data->dev->name); ++ return; ++ } ++ ++ auth_alg = le16_to_cpu(mgmt->u.auth.auth_alg); ++ auth_transaction = le16_to_cpu(mgmt->u.auth.auth_transaction); ++ status_code = le16_to_cpu(mgmt->u.auth.status_code); ++ ++ printk(KERN_DEBUG "%s: RX authentication (alg=%d " ++ "transaction=%d status=%d %s)\n", ++ data->dev->name, auth_alg, ++ auth_transaction, status_code, ++ ieee80211_status_code(status_code)); ++ ++ spin_lock_bh(&data->lock); ++ bss = ieee80211_get_bss(data, mgmt->sa); ++ if (!bss) { ++ spin_unlock_bh(&data->lock); ++ return; ++ } ++ ++ if (auth_transaction != bss->auth_state + 1) { ++ printk(KERN_DEBUG "%s: unexpected authentication " ++ "transaction number. expected %d, got %d\n", ++ data->dev->name, bss->auth_state + 1, auth_transaction); ++ bss->auth_state = 0; ++ spin_unlock_bh(&data->lock); ++ return; ++ } ++ bss->auth_alg = auth_alg; ++ bss->auth_state = auth_transaction; ++ ++ if ((auth_transaction == 0x2 || auth_transaction == 0x4) ++ && status_code != WLAN_STATUS_SUCCESS) { ++ bss->num_auth_fail++; ++ bss->auth_state = 0; ++ if (auth_transaction == 0x2) { ++ bss->auth_alg = WLAN_AUTH_OPEN; ++ printk(KERN_DEBUG "%s: Falling back on open authentication...\n", data->dev->name); ++ } ++ spin_unlock_bh(&data->lock); ++ return; ++ } ++ spin_unlock_bh(&data->lock); ++ ++ if (data->wep_enabled & 0x2 && ++ (auth_alg != data->auth_algorithm || data->auth_algorithm > 1) && ++ auth_transaction == 1) { ++ ieee80211_send_auth(data, mgmt->sa, WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG); ++ return; ++ } ++ ++ if (data->mode == IEEE80211_MANAGED && auth_transaction == 1) { ++ if (status_code == WLAN_STATUS_SUCCESS) ++ printk(KERN_DEBUG "%s: Ignoring attempt to initiate authentication\n", ++ data->dev->name); ++ return; ++ } ++ ++ switch (auth_alg) { ++ case WLAN_AUTH_OPEN: ++ if (auth_transaction == 1) ++ ieee80211_send_auth(data, mgmt->sa, 0); ++ else if (auth_transaction == 2) ++ data->authenticated = 1; ++ else ++ printk(KERN_DEBUG "%s: invalid authentication " ++ "transaction number: %d\n", ++ data->dev->name, auth_transaction); ++ break; ++ case WLAN_AUTH_SHARED_KEY: ++ switch (auth_transaction) { ++ case 1: ++ ieee80211_send_auth(data, mgmt->sa, 0); ++ break; ++ case 2: ++ if (elems.challenge_len != WLAN_AUTH_CHALLENGE_LEN) { ++ printk(KERN_DEBUG "%s: invalid challenge length: %d\n", ++ data->dev->name, elems.challenge_len); ++ return; ++ } ++ spin_lock_bh(&data->lock); ++ bss = ieee80211_get_bss(data, mgmt->sa); ++ if (!bss) { ++ spin_unlock_bh(&data->lock); ++ return; ++ } ++ bss->challenge = elems.challenge; ++ spin_unlock_bh(&data->lock); ++ ieee80211_send_auth(data, mgmt->sa, 0); ++ break; ++ case 3: ++ if (le16_to_cpu(mgmt->frame_control) & WLAN_FC_ISWEP) ++ skb = ieee80211_wep_decode(data, skb); ++ else { ++ ieee80211_send_auth(data, mgmt->sa, WLAN_STATUS_CHALLENGE_FAIL); ++ return; ++ } ++ if (!skb) { ++ ieee80211_send_auth(data, mgmt->sa, WLAN_STATUS_CHALLENGE_FAIL); ++ return; ++ } ++ if (!bss->challenge || memcmp(elems.challenge, ++ bss->challenge, WLAN_AUTH_CHALLENGE_LEN)) { ++ ieee80211_send_auth(data, mgmt->sa, WLAN_STATUS_CHALLENGE_FAIL); ++ return; ++ } else ++ ieee80211_send_auth(data, mgmt->sa, 0); ++ break; ++ case 4: ++ data->authenticated = 1; ++ break; ++ default: ++ printk(KERN_DEBUG "%s: invalid authentication" ++ "transaction number: %d\n", ++ data->dev->name, auth_transaction); ++ break; ++ } ++ break; ++ } ++ ++ if (data->authenticated) { ++ spin_lock_bh(&data->lock); ++ bss = ieee80211_get_bss(data, mgmt->sa); ++ bss->auth_state = 0; ++ spin_unlock_bh(&data->lock); ++ ++ printk(KERN_DEBUG "%s: authenticated\n", data->dev->name); ++ ++ ieee80211_associate(data); ++ } ++ ++} ++ ++static void ieee80211_rx_mgmt_deauth(struct ieee80211_data *data, ++ struct ieee80211_mgmt *mgmt, ++ size_t len, ++ struct ieee80211_rx_status *rx_status) ++{ ++ struct ieee80211_bss *bss; ++ u16 reason_code; ++ ++ if (len < 24 + 2) { ++ printk(KERN_DEBUG "%s: too short (%d) deauthentication frame " ++ "received from " MACSTR " - ignored\n", ++ data->dev->name, len, MAC2STR(mgmt->sa)); ++ return; ++ } ++ ++ if (memcmp(data->bssid, mgmt->sa, ETH_ALEN) != 0) { ++ printk(KERN_DEBUG "%s: deauthentication frame received from " ++ "unknown AP (SA=" MACSTR " BSSID=" MACSTR ") - " ++ "ignored\n", data->dev->name, MAC2STR(mgmt->sa), ++ MAC2STR(mgmt->bssid)); ++ return; ++ } ++ ++ reason_code = le16_to_cpu(mgmt->u.deauth.reason_code); ++ ++ printk(KERN_DEBUG "%s: RX deauthentication from " MACSTR ++ " (reason=%d)\n", ++ data->dev->name, MAC2STR(mgmt->sa), reason_code); ++ ++ spin_lock_bh(&data->lock); ++ bss = ieee80211_get_bss(data, mgmt->sa); ++ if (bss) { ++ bss->num_auth_fail++; ++ bss->authenticated = 0; ++ } ++ spin_unlock_bh(&data->lock); ++ ++ if (data->authenticated) { ++ printk(KERN_DEBUG "%s: deauthenticated\n", data->dev->name); ++ } ++ ieee80211_set_associated(data, 0); ++ data->authenticated = 0; ++ ++ ieee80211_scan(data); ++} ++ ++ ++static void ieee80211_rx_mgmt_disassoc(struct ieee80211_data *data, ++ struct ieee80211_mgmt *mgmt, ++ size_t len, ++ struct ieee80211_rx_status *rx_status) ++{ ++ struct ieee80211_bss *bss; ++ u16 reason_code; ++ ++ if (len < 24 + 2) { ++ printk(KERN_DEBUG "%s: too short (%d) disassociation frame " ++ "received from " MACSTR " - ignored\n", ++ data->dev->name, len, MAC2STR(mgmt->sa)); ++ return; ++ } ++ ++ if (memcmp(data->bssid, mgmt->sa, ETH_ALEN) != 0) { ++ printk(KERN_DEBUG "%s: disassociation frame received from " ++ "unknown AP (SA=" MACSTR " BSSID=" MACSTR ") - " ++ "ignored\n", data->dev->name, MAC2STR(mgmt->sa), ++ MAC2STR(mgmt->bssid)); ++ return; ++ } ++ ++ reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code); ++ ++ printk(KERN_DEBUG "%s: RX disassociation from " MACSTR ++ " (reason=%d)\n", ++ data->dev->name, MAC2STR(mgmt->sa), reason_code); ++ ++ spin_lock_bh(&data->lock); ++ bss = ieee80211_get_bss(data, mgmt->sa); ++ if (bss) ++ bss->num_assoc_fail++; ++ spin_unlock_bh(&data->lock); ++ ++ if (data->associated) ++ printk(KERN_DEBUG "%s: disassociated\n", data->dev->name); ++ ieee80211_set_associated(data, 0); ++ ++ ieee80211_scan(data); ++} ++ ++static void ieee80211_rx_mgmt_assoc_req(struct ieee80211_data *data, ++ struct ieee80211_mgmt *mgmt, ++ size_t len, ++ struct ieee80211_rx_status *rx_status, ++ int reassoc) ++{ ++ if (reassoc && data->mode == IEEE80211_MANAGED) ++ ieee80211_associate(data); ++ ++ return; ++} ++ ++static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_data *data, ++ struct ieee80211_mgmt *mgmt, ++ size_t len, ++ struct ieee80211_rx_status *rx_status, ++ int reassoc) ++{ ++ struct ieee802_11_elems elems; ++ struct ieee80211_bss *bss; ++ size_t baselen; ++ u16 capab_info, status_code, aid; ++ ++ /* AssocResp and ReassocResp have identical structure, so process both ++ * of them in this function. */ ++ ++ if (data->state != IEEE80211_ASSOCIATE) { ++ printk(KERN_DEBUG "%s: association frame received from " ++ MACSTR ", but not in associate state - ignored\n", ++ data->dev->name, MAC2STR(mgmt->sa)); ++ return; ++ } ++ ++ if (len < 24 + 6) { ++ printk(KERN_DEBUG "%s: too short (%d) association frame " ++ "received from " MACSTR " - ignored\n", ++ data->dev->name, len, MAC2STR(mgmt->sa)); ++ return; ++ } ++ ++ if (memcmp(data->bssid, mgmt->sa, ETH_ALEN) != 0) { ++ printk(KERN_DEBUG "%s: association frame received from " ++ "unknown AP (SA=" MACSTR " BSSID=" MACSTR ") - " ++ "ignored\n", data->dev->name, MAC2STR(mgmt->sa), ++ MAC2STR(mgmt->bssid)); ++ return; ++ } ++ ++ capab_info = le16_to_cpu(mgmt->u.assoc_resp.capab_info); ++ status_code = le16_to_cpu(mgmt->u.assoc_resp.status_code); ++ aid = le16_to_cpu(mgmt->u.assoc_resp.aid); ++ if ((aid & (BIT(15) | BIT(14))) != (BIT(15) | BIT(14))) ++ printk(KERN_DEBUG "%s: invalid aid value %d; bits 15:14 not " ++ "set\n", data->dev->name, aid); ++ aid &= ~(BIT(15) | BIT(14)); ++ ++ printk(KERN_DEBUG "%s: RX %sssocResp (capab=0x%x " ++ "aid=%d status=%d %s)\n", ++ data->dev->name, reassoc ? "Rea" : "A", ++ capab_info, aid, status_code, ++ ieee80211_status_code(status_code)); ++ ++ spin_lock_bh(&data->lock); ++ bss = ieee80211_get_bss(data, mgmt->sa); ++ if (status_code != WLAN_STATUS_SUCCESS) { ++ printk(KERN_DEBUG "%s: AP denied association\n", ++ data->dev->name); ++ if (bss) ++ bss->num_assoc_fail++; ++ spin_unlock_bh(&data->lock); ++ return; ++ } ++ if (bss) { ++ bss->num_auth_fail = bss->num_assoc_fail = 0; ++ } ++ ++ baselen = (u8 *) mgmt->u.assoc_resp.variable - (u8 *) mgmt; ++ if (ieee802_11_parse_elems(mgmt->u.assoc_resp.variable, len - baselen, &elems) == ParseOK ++ && elems.supp_rates) { ++ memset(bss->supp_rates, 0, IEEE80211_MAX_SUPP_RATES); ++ memcpy(bss->supp_rates, elems.supp_rates, ++ elems.supp_rates_len > IEEE80211_MAX_SUPP_RATES ? ++ IEEE80211_MAX_SUPP_RATES : elems.supp_rates_len); ++ } ++ ++ spin_unlock_bh(&data->lock); ++ ++ printk(KERN_DEBUG "%s: associated\n", data->dev->name); ++ data->aid = aid; ++ data->ap_capab = capab_info; ++ ieee80211_set_associated(data, 1); ++ ++ if (data->set_ssid) ++ data->set_ssid(data->dev, data->ssid, data->ssid_len); ++ ieee80211_associated(data); ++} ++ ++ ++void ieee80211_rx_mgmt(struct ieee80211_data *data, struct sk_buff *skb, ++ struct ieee80211_rx_status *rx_status) ++{ ++ struct ieee80211_mgmt *mgmt; ++ u16 fc; ++ ++ if (skb->len < 24) ++ goto fail; ++ ++ mgmt = (struct ieee80211_mgmt *) skb->data; ++ fc = le16_to_cpu(mgmt->frame_control); ++ ++ switch (WLAN_FC_GET_STYPE(fc)) { ++ case WLAN_FC_STYPE_PROBE_REQ: ++ ieee80211_rx_mgmt_probe_req(data, mgmt, skb->len, rx_status); ++ break; ++ case WLAN_FC_STYPE_PROBE_RESP: ++ ieee80211_rx_mgmt_probe_resp(data, mgmt, skb->len, rx_status); ++ break; ++ case WLAN_FC_STYPE_BEACON: ++ ieee80211_rx_mgmt_beacon(data, mgmt, skb->len, rx_status); ++ break; ++ case WLAN_FC_STYPE_AUTH: ++ ieee80211_rx_mgmt_auth(data, mgmt, skb->len, rx_status, skb); ++ break; ++ case WLAN_FC_STYPE_ASSOC_REQ: ++ ieee80211_rx_mgmt_assoc_req(data, mgmt, skb->len, rx_status, 0); ++ break; ++ case WLAN_FC_STYPE_ASSOC_RESP: ++ ieee80211_rx_mgmt_assoc_resp(data, mgmt, skb->len, rx_status, 0); ++ break; ++ case WLAN_FC_STYPE_REASSOC_REQ: ++ ieee80211_rx_mgmt_assoc_req(data, mgmt, skb->len, rx_status, 1); ++ break; ++ case WLAN_FC_STYPE_REASSOC_RESP: ++ ieee80211_rx_mgmt_assoc_resp(data, mgmt, skb->len, rx_status, 1); ++ break; ++ case WLAN_FC_STYPE_DEAUTH: ++ ieee80211_rx_mgmt_deauth(data, mgmt, skb->len, rx_status); ++ break; ++ case WLAN_FC_STYPE_DISASSOC: ++ ieee80211_rx_mgmt_disassoc(data, mgmt, skb->len, rx_status); ++ break; ++ default: ++ printk(KERN_DEBUG "%s: received unknown management frame - " ++ "stype=%d\n", data->dev->name, WLAN_FC_GET_STYPE(fc)); ++ break; ++ } ++ ++ fail: ++ if (skb) ++ dev_kfree_skb(skb); ++} ++ ++ ++static void ieee80211_timer(unsigned long ptr) ++{ ++ struct ieee80211_data *data = (struct ieee80211_data *) ptr; ++ ++ switch (data->state) { ++ case IEEE80211_SCAN: ++ ieee80211_scan(data); ++ break; ++ case IEEE80211_AUTHENTICATE: ++ ieee80211_authenticate(data); ++ break; ++ case IEEE80211_ASSOCIATE: ++ ieee80211_associate(data); ++ break; ++ case IEEE80211_ASSOCIATED: ++ ieee80211_associated(data); ++ break; ++ case IEEE80211_STOP: ++ break; ++ default: ++ printk(KERN_DEBUG "ieee80211_timer: Unknown state %d\n", ++ data->state); ++ break; ++ } ++} ++ ++struct sk_buff * ieee80211_wep_decode(struct ieee80211_data *data, ++ struct sk_buff *skb) ++{ ++ struct ieee80211_hdr *hdr; ++ u16 fc; ++ int hlen, index; ++ ++ hdr = (struct ieee80211_hdr *) skb->data; ++ fc = le16_to_cpu(hdr->frame_control); ++ ++ if (!(fc & WLAN_FC_ISWEP)) ++ return skb; ++ ++ if ((fc & (WLAN_FC_TODS | WLAN_FC_FROMDS)) == ++ (WLAN_FC_TODS | WLAN_FC_FROMDS)) ++ hlen = 30; ++ else ++ hlen = 24; ++ ++ index = (*(skb->data + hlen + 3) >> 6) & 0x3; ++ ++ if (wep_decrypt(skb, hlen, index, &data->wep_data[index])) { ++ dev_kfree_skb(skb); ++ return NULL; ++ } else ++ return skb; ++} ++ ++int ieee80211_data_tx(struct ieee80211_data *data, ++ struct sk_buff *skb) ++{ ++ struct ieee80211_bss *bss; ++ u8 dst[ETH_ALEN]; ++ u16 fc = (WLAN_FC_TYPE_DATA << 2) | (WLAN_FC_STYPE_DATA << 4); ++ u16 capab = 0; ++ ++ /* hold the packets till we're authenticated/associated */ ++ if (data->state != IEEE80211_ASSOCIATED) { ++ netif_stop_queue(data->dev); ++ return 1; ++ } ++ ++ if (skb->len < ETH_HLEN) { ++ dev_kfree_skb(skb); ++ return 0; ++ } ++ ++ memcpy(dst, skb->data, ETH_ALEN); ++ ++ if (data->wep_enabled) ++ fc |= WLAN_FC_ISWEP; ++ ++ switch (data->mode) { ++ case IEEE80211_MANAGED: ++ fc |= WLAN_FC_TODS; ++ break; ++ case IEEE80211_ADHOC: ++ break; ++ case IEEE80211_AP: ++ fc |= WLAN_FC_FROMDS; ++ break; ++ case IEEE80211_WDS: ++ fc |= WLAN_FC_FROMDS | WLAN_FC_TODS; ++ break; ++ } ++ ++ skb = ieee80211_data_encaps(data, skb); ++ ++ spin_lock_bh(&data->lock); ++ bss = ieee80211_get_bss(data, dst); ++ ++ if (bss) ++ capab = bss->capability; ++ spin_unlock_bh(&data->lock); ++ ++ return data->tx(data->dev, skb, cpu_to_le16(fc), capab, dst); ++} ++ ++/* See IEEE 802.1H for LLC/SNAP encapsulation/decapsulation */ ++/* Ethernet-II snap header (RFC1042 for most EtherTypes) */ ++static unsigned char rfc1042_header[] = ++{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 }; ++/* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */ ++static unsigned char bridge_tunnel_header[] = ++{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 }; ++/* No encapsulation header if EtherType < 0x600 (=length) */ ++ ++ ++struct sk_buff * ieee80211_data_encaps(struct ieee80211_data *data, ++ struct sk_buff *skb) ++{ ++ u16 ethertype; ++ ++ ethertype = (skb->data[12] << 8) | skb->data[13]; ++ ++ skb_pull(skb, 12); ++ ++ memcpy(skb_push(skb, 6), ++ ethertype == ETH_P_AARP || ethertype == ETH_P_IPX ? ++ bridge_tunnel_header : rfc1042_header, 6); ++ ++ return skb; ++} ++ ++ ++struct sk_buff * ieee80211_data_decaps(struct ieee80211_data *data, ++ struct sk_buff *skb) ++{ ++ u8 dst[ETH_ALEN]; ++ u8 src[ETH_ALEN]; ++ struct ieee80211_hdr *hdr; ++ int hlen; ++ u16 fc; ++ u8 *pos; ++ ++ if (data->state != IEEE80211_ASSOCIATED || ++ skb->len < 24) ++ goto drop; ++ ++ hdr = (struct ieee80211_hdr *) skb->data; ++ fc = le16_to_cpu(hdr->frame_control); ++ ++ hlen = 24; ++ ++ switch (fc & (WLAN_FC_TODS | WLAN_FC_FROMDS)) { ++ case WLAN_FC_TODS | WLAN_FC_FROMDS: ++ /* RA, TA, DA, SA */ ++ if (skb->len < 30) ++ goto drop; ++ memcpy(dst, hdr->addr3, ETH_ALEN); ++ memcpy(src, hdr->addr4, ETH_ALEN); ++ hlen += ETH_ALEN; ++ break; ++ case WLAN_FC_TODS: ++ /* BSSID, SA, DA */ ++ memcpy(dst, hdr->addr3, ETH_ALEN); ++ memcpy(src, hdr->addr2, ETH_ALEN); ++ break; ++ case WLAN_FC_FROMDS: ++ /* DA, BSSID, SA */ ++ memcpy(dst, hdr->addr1, ETH_ALEN); ++ memcpy(src, hdr->addr3, ETH_ALEN); ++ break; ++ case 0: ++ /* DA, SA, BSSID */ ++ memcpy(dst, hdr->addr1, ETH_ALEN); ++ memcpy(src, hdr->addr2, ETH_ALEN); ++ break; ++ } ++ ++ pos = skb_pull(skb, hlen); ++ if (hlen >= 6 && ++ (memcmp(pos, rfc1042_header, 6) == 0 || ++ memcmp(pos, bridge_tunnel_header, 6) == 0)) { ++ skb_pull(skb, 6); ++ } ++ ++ memcpy(skb_push(skb, ETH_ALEN), src, ETH_ALEN); ++ memcpy(skb_push(skb, ETH_ALEN), dst, ETH_ALEN); ++ ++ return skb; ++ ++drop: ++ dev_kfree_skb(skb); ++ return NULL; ++} ++ ++struct sk_buff * ieee80211_reassemble_frag (struct ieee80211_data *data, ++ struct sk_buff *skb) ++{ ++ struct ieee80211_hdr *hdr, *hdr2; ++ struct ieee80211_frag_entry *entry; ++ u16 seq_ctrl, fc; ++ unsigned int seq, frag, hlen; ++ int i, j; ++ ++ hdr = (struct ieee80211_hdr *) skb->data; ++ fc = le16_to_cpu(hdr->frame_control); ++ seq_ctrl = le16_to_cpu(hdr->seq_ctrl); ++ seq = WLAN_GET_SEQ_SEQ(seq_ctrl); ++ frag = WLAN_GET_SEQ_FRAG(seq_ctrl); ++ ++ if (!frag && fc & WLAN_FC_MOREFRAG) { ++ i = 0; ++ /* look for an empty entry */ ++ while (i < IEEE80211_FRAG_CACHE_SIZE ++ && data->frag_cache[i].skb != NULL) ++ i+=1; ++ ++ if (data->frag_cache[i].skb) { /* cache is full */ ++ i = -1; ++ for (j = 0; j < IEEE80211_FRAG_CACHE_SIZE; j += 1) { ++ entry = &data->frag_cache[j]; ++ if (entry->skb != NULL && ++ time_after(jiffies, entry->first_rx_time + 2 * HZ)) { ++ dev_kfree_skb(entry->skb); ++ entry->skb = NULL; ++ i = j; ++ } ++ } ++ } ++ ++ if (i == -1) ++ goto drop; /* could not free a stale entry */ ++ ++ entry = &data->frag_cache[i]; ++ entry->skb = dev_alloc_skb(2346); ++ if (!entry->skb) ++ goto drop; ++ ++ entry->skb->dev = data->dev; ++ entry->first_rx_time = jiffies; ++ memcpy(skb_put(entry->skb, skb->len), skb->data, skb->len); ++ goto drop; ++ } else if (frag) { ++ if ((fc & (WLAN_FC_TODS | WLAN_FC_FROMDS)) == ++ (WLAN_FC_TODS | WLAN_FC_FROMDS)) ++ hlen = 30; ++ else ++ hlen = 24; ++ ++ for (i = 0; i < IEEE80211_FRAG_CACHE_SIZE; i += 1) { ++ entry = &data->frag_cache[i]; ++ if (!entry->skb) ++ continue; ++ hdr2 = (struct ieee80211_hdr *) entry->skb->data; ++ if (WLAN_GET_SEQ_SEQ(le16_to_cpu(hdr2->seq_ctrl)) != seq ++ || memcmp(hdr2->addr1, hdr->addr1, ETH_ALEN) ++ || memcmp(hdr2->addr2, hdr->addr2, ETH_ALEN)) ++ continue; ++ ++ skb_pull(skb, hlen); ++ if (entry->skb->tail + skb->len > entry->skb->end) { ++ dev_kfree_skb(entry->skb); ++ entry->skb = NULL; ++ goto drop; ++ } ++ ++ memcpy(skb_put(entry->skb, skb->len), skb->data, ++ skb->len); ++ ++ if (fc & WLAN_FC_MOREFRAG) ++ goto drop; ++ else { ++ dev_kfree_skb(skb); ++ skb = entry->skb; ++ entry->skb = NULL; ++ return skb; ++ } ++ ++ } ++ ++ goto drop; ++ } ++ ++ return skb; ++ ++drop: ++ dev_kfree_skb(skb); ++ return NULL; ++} ++ ++int ieee80211_filter_duplicates(struct ieee80211_data *data, ++ struct sk_buff *skb, u16 fc) ++{ ++ struct ieee80211_hdr *hdr; ++ struct ieee80211_bss *bss; ++ ++ hdr = (struct ieee80211_hdr *) skb->data; ++ ++ spin_lock_bh(&data->lock); ++ bss = ieee80211_get_bss(data, hdr->addr2); ++ ++ if (bss) { ++ if (fc & WLAN_FC_RETRY && bss->last_seq == hdr->seq_ctrl) { ++ spin_unlock_bh(&data->lock); ++ return 1; ++ } ++ bss->last_seq=hdr->seq_ctrl; ++ } ++ ++ spin_unlock_bh(&data->lock); ++ ++ return 0; ++} ++ ++/* returns a rate appropriate for the destination, if it can be determined */ ++u8 ieee80211_get_rate(struct ieee80211_data *data, u8 *addr) ++{ ++ struct ieee80211_bss *bss; ++ u8 rate; ++ ++ spin_lock_bh(&data->lock); ++ bss = ieee80211_get_bss(data, addr); ++ ++ if (bss) ++ rate = bss->rate; ++ else ++ rate = data->rate; ++ ++ spin_unlock_bh(&data->lock); ++ ++ return rate; ++} +diff -urN x/drivers/net/wireless/adm8211/ieee80211.h y/drivers/net/wireless/adm8211/ieee80211.h +--- x/drivers/net/wireless/adm8211/ieee80211.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/adm8211/ieee80211.h 2004-08-15 04:27:57.000000000 +1000 +@@ -0,0 +1,375 @@ ++#ifndef IEEE80211_H ++#define IEEE80211_H ++ ++#define BIT(x) (1 << (x)) ++ ++/* IEEE 802.11 defines */ ++ ++#define WLAN_FCS_LEN 4 ++#define WLAN_ADDR3_HDR_LEN 24 ++ ++#define WLAN_FC_PVER (BIT(1) | BIT(0)) ++#define WLAN_FC_TODS BIT(8) ++#define WLAN_FC_FROMDS BIT(9) ++#define WLAN_FC_MOREFRAG BIT(10) ++#define WLAN_FC_RETRY BIT(11) ++#define WLAN_FC_PWRMGT BIT(12) ++#define WLAN_FC_MOREDATA BIT(13) ++#define WLAN_FC_ISWEP BIT(14) ++#define WLAN_FC_ORDER BIT(15) ++ ++#define WLAN_FC_GET_TYPE(fc) (((fc) & (BIT(3) | BIT(2))) >> 2) ++#define WLAN_FC_GET_STYPE(fc) \ ++ (((fc) & (BIT(7) | BIT(6) | BIT(5) | BIT(4))) >> 4) ++ ++#define WLAN_GET_SEQ_FRAG(seq) ((seq) & (BIT(3) | BIT(2) | BIT(1) | BIT(0))) ++#define WLAN_GET_SEQ_SEQ(seq) \ ++ (((seq) & (~(BIT(3) | BIT(2) | BIT(1) | BIT(0)))) >> 4) ++ ++#define IEEE80211_FC(type, stype) cpu_to_le16((type << 2) | (stype << 4)) ++ ++#define WLAN_FC_TYPE_MGMT 0 ++#define WLAN_FC_TYPE_CTRL 1 ++#define WLAN_FC_TYPE_DATA 2 ++ ++/* management */ ++#define WLAN_FC_STYPE_ASSOC_REQ 0 ++#define WLAN_FC_STYPE_ASSOC_RESP 1 ++#define WLAN_FC_STYPE_REASSOC_REQ 2 ++#define WLAN_FC_STYPE_REASSOC_RESP 3 ++#define WLAN_FC_STYPE_PROBE_REQ 4 ++#define WLAN_FC_STYPE_PROBE_RESP 5 ++#define WLAN_FC_STYPE_BEACON 8 ++#define WLAN_FC_STYPE_ATIM 9 ++#define WLAN_FC_STYPE_DISASSOC 10 ++#define WLAN_FC_STYPE_AUTH 11 ++#define WLAN_FC_STYPE_DEAUTH 12 ++ ++/* control */ ++#define WLAN_FC_STYPE_PSPOLL 10 ++#define WLAN_FC_STYPE_RTS 11 ++#define WLAN_FC_STYPE_CTS 12 ++#define WLAN_FC_STYPE_ACK 13 ++#define WLAN_FC_STYPE_CFEND 14 ++#define WLAN_FC_STYPE_CFENDACK 15 ++ ++/* data */ ++#define WLAN_FC_STYPE_DATA 0 ++#define WLAN_FC_STYPE_DATA_CFACK 1 ++#define WLAN_FC_STYPE_DATA_CFPOLL 2 ++#define WLAN_FC_STYPE_DATA_CFACKPOLL 3 ++#define WLAN_FC_STYPE_NULLFUNC 4 ++#define WLAN_FC_STYPE_CFACK 5 ++#define WLAN_FC_STYPE_CFPOLL 6 ++#define WLAN_FC_STYPE_CFACKPOLL 7 ++ ++/* Authentication algorithms */ ++#define WLAN_AUTH_OPEN 0 ++#define WLAN_AUTH_SHARED_KEY 1 ++ ++#define WLAN_AUTH_CHALLENGE_LEN 128 ++ ++#define WLAN_CAPABILITY_ESS BIT(0) ++#define WLAN_CAPABILITY_IBSS BIT(1) ++#define WLAN_CAPABILITY_CF_POLLABLE BIT(2) ++#define WLAN_CAPABILITY_CF_POLL_REQUEST BIT(3) ++#define WLAN_CAPABILITY_PRIVACY BIT(4) ++#define WLAN_CAPABILITY_SHORT_PREAMBLE BIT(5) ++ ++/* Status codes */ ++#define WLAN_STATUS_SUCCESS 0 ++#define WLAN_STATUS_UNSPECIFIED_FAILURE 1 ++#define WLAN_STATUS_CAPS_UNSUPPORTED 10 ++#define WLAN_STATUS_REASSOC_NO_ASSOC 11 ++#define WLAN_STATUS_ASSOC_DENIED_UNSPEC 12 ++#define WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG 13 ++#define WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION 14 ++#define WLAN_STATUS_CHALLENGE_FAIL 15 ++#define WLAN_STATUS_AUTH_TIMEOUT 16 ++#define WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA 17 ++#define WLAN_STATUS_ASSOC_DENIED_RATES 18 ++/* 802.11b */ ++#define WLAN_STATUS_ASSOC_DENIED_NOSHORT 19 ++#define WLAN_STATUS_ASSOC_DENIED_NOPBCC 20 ++#define WLAN_STATUS_ASSOC_DENIED_NOAGILITY 21 ++ ++/* Reason codes */ ++#define WLAN_REASON_UNSPECIFIED 1 ++#define WLAN_REASON_PREV_AUTH_NOT_VALID 2 ++#define WLAN_REASON_DEAUTH_LEAVING 3 ++#define WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY 4 ++#define WLAN_REASON_DISASSOC_AP_BUSY 5 ++#define WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA 6 ++#define WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA 7 ++#define WLAN_REASON_DISASSOC_STA_HAS_LEFT 8 ++#define WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH 9 ++ ++ ++/* Information Element IDs */ ++#define WLAN_EID_SSID 0 ++#define WLAN_EID_SUPP_RATES 1 ++#define WLAN_EID_FH_PARAMS 2 ++#define WLAN_EID_DS_PARAMS 3 ++#define WLAN_EID_CF_PARAMS 4 ++#define WLAN_EID_TIM 5 ++#define WLAN_EID_IBSS_PARAMS 6 ++#define WLAN_EID_CHALLENGE 16 ++ ++#define IEEE80211_MAX_SSID_LEN 32 ++ ++#define WEP_KEY_MAX_LEN 13 ++#define WEP_KEY_MAX_KEYS 4 ++ ++#define FCS_LEN 4 ++ ++#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5] ++#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x" ++ ++ ++struct ieee80211_hdr { ++ u16 frame_control; ++ u16 duration_id; ++ u8 addr1[6]; ++ u8 addr2[6]; ++ u8 addr3[6]; ++ u16 seq_ctrl; ++ u8 addr4[6]; ++} __attribute__ ((packed)); ++ ++union ieee80211_mgmt_payload { ++ struct { ++ u16 auth_alg; ++ u16 auth_transaction; ++ u16 status_code; ++ /* possibly followed by Challenge text */ ++ u8 variable[0]; ++ } __attribute__ ((packed)) auth; ++ struct { ++ u16 reason_code; ++ } __attribute__ ((packed)) deauth; ++ struct { ++ u16 capab_info; ++ u16 listen_interval; ++ /* followed by SSID and Supported rates */ ++ u8 variable[0]; ++ } __attribute__ ((packed)) assoc_req; ++ struct { ++ u16 capab_info; ++ u16 status_code; ++ u16 aid; ++ /* followed by Supported rates */ ++ u8 variable[0]; ++ } __attribute__ ((packed)) assoc_resp, reassoc_resp; ++ struct { ++ u16 capab_info; ++ u16 listen_interval; ++ u8 current_ap[ETH_ALEN]; ++ /* followed by SSID and Supported rates */ ++ u8 variable[0]; ++ } __attribute__ ((packed)) reassoc_req; ++ struct { ++ u16 reason_code; ++ } __attribute__ ((packed)) disassoc; ++ struct { ++ u64 timestamp; ++ u16 beacon_int; ++ u16 capab_info; ++ /* followed by some of SSID, Supported rates, ++ * FH Params, DS Params, CF Params, IBSS Params, TIM */ ++ u8 variable[0]; ++ } __attribute__ ((packed)) beacon; ++ struct { ++ /* only variable items: SSID, Supported rates */ ++ u8 variable[0]; ++ } __attribute__ ((packed)) probe_req; ++ struct { ++ u64 timestamp; ++ u16 beacon_int; ++ u16 capab_info; ++ /* followed by some of SSID, Supported rates, ++ * FH Params, DS Params, CF Params, IBSS Params */ ++ u8 variable[0]; ++ } __attribute__ ((packed)) probe_resp; ++}; ++ ++struct ieee80211_mgmt { ++ u16 frame_control; ++ u16 duration; ++ u8 da[6]; ++ u8 sa[6]; ++ u8 bssid[6]; ++ u16 seq_ctrl; ++ union ieee80211_mgmt_payload u; ++} __attribute__ ((packed)); ++ ++/* Parsed Information Elements */ ++struct ieee802_11_elems { ++ u8 *ssid; ++ u8 ssid_len; ++ u8 *supp_rates; ++ u8 supp_rates_len; ++ u8 *fh_params; ++ u8 fh_params_len; ++ u8 *ds_params; ++ u8 ds_params_len; ++ u8 *cf_params; ++ u8 cf_params_len; ++ u8 *tim; ++ u8 tim_len; ++ u8 *ibss_params; ++ u8 ibss_params_len; ++ u8 *challenge; ++ u8 challenge_len; ++}; ++ ++typedef enum { ParseOK = 0, ParseUnknown = 1, ParseFailed = -1 } ParseRes; ++ ++ParseRes ieee802_11_parse_elems(u8 *start, size_t len, ++ struct ieee802_11_elems *elems); ++ ++ ++struct ieee80211_rx_status { ++ int rssi; ++ int rate; /* in 100 kbps */ ++}; ++ ++ ++struct ieee80211_bss { ++ u8 bssid[ETH_ALEN]; ++ u8 ssid[IEEE80211_MAX_SSID_LEN]; ++ size_t ssid_len; ++ ++ int channel; ++ u16 interval; ++ u64 timestamp; ++ u16 capability; ++ int invalid_frame; /* parse error on beacon/proberesp info elements */ ++#define IEEE80211_MAX_SUPP_RATES 8 ++ u8 supp_rates[IEEE80211_MAX_SUPP_RATES + 1]; ++ u8 rate; ++ ++ unsigned long last_rx; ++ int last_rssi; ++ int last_rate; ++ unsigned long num_beacon, num_proberesp; ++ int num_auth_fail, num_assoc_fail; ++ int authenticated, auth_state; ++ u8 *challenge; ++ u16 auth_alg; ++ ++ u16 last_seq; /* last received seq number field (in 802.11 byte ++ * order) from the AP */ ++ ++ struct ieee80211_bss *next; ++}; ++ ++struct ieee80211_chan_range { ++ unsigned char min; ++ unsigned char max; ++}; ++ ++struct ieee80211_wep_data { ++ u32 iv; ++ unsigned char len; ++ u8 key[WEP_KEY_MAX_LEN]; ++}; ++ ++#define IEEE80211_FRAG_CACHE_SIZE 4 ++struct ieee80211_frag_entry { ++ unsigned long first_rx_time; ++ struct sk_buff *skb; ++}; ++ ++struct ieee80211_data { ++ struct net_device *dev; ++ int (*set_channel)(struct net_device *dev, int channel); ++ int (*set_bssid)(struct net_device *dev, u8 *bssid); ++ int (*set_ssid)(struct net_device *dev, u8 *ssid, size_t ssid_len); ++ int (*set_rate)(struct net_device *dev); ++ int (*tx)(struct net_device *dev, struct sk_buff *skb, ++ u16 fc, u16 capab, u8 *dst); ++ void (*link_change)(struct net_device *dev, int link); ++ void (*set_interval)(struct net_device *dev); ++ void (*beacon_sync)(struct net_device *dev); ++ ++ enum { ++ IEEE80211_SCAN, IEEE80211_AUTHENTICATE, IEEE80211_ASSOCIATE, ++ IEEE80211_ASSOCIATED, IEEE80211_STOP ++ } state; ++ struct timer_list timer; ++ ++ enum { ++ IEEE80211_MANAGED, IEEE80211_ADHOC, IEEE80211_AP, IEEE80211_WDS ++ } mode; ++ ++ char nick[IW_ESSID_MAX_SIZE]; ++ ++ int auth_algorithm, wep_enabled, default_key; ++ struct ieee80211_wep_data wep_data[WEP_KEY_MAX_KEYS]; ++ ++ struct ieee80211_frag_entry frag_cache[IEEE80211_FRAG_CACHE_SIZE]; ++ ++ u8 bssid[ETH_ALEN]; ++ u8 rate; ++ int auto_rate; ++ int pref_channel; ++ int channel; ++ struct ieee80211_chan_range chan_range; ++ int num_supp_rates; ++ u8 *supp_rates; ++ ++ u8 ssid[IEEE80211_MAX_SSID_LEN]; ++ size_t ssid_len; ++ int any_ssid; ++ u8 pref_bssid[ETH_ALEN]; ++ int pref_bssid_set; ++ ++ int auth_tries; ++ int authenticated; ++ int assoc_tries; ++ int associated; ++ ++ int aid; ++ int ap_capab; ++ ++ u8 prev_bssid[ETH_ALEN]; ++ int prev_bssid_set; ++ ++ u16 capab, beacon_interval, listen_interval; ++ ++ struct ieee80211_bss *bss; ++ spinlock_t lock; ++}; ++ ++static const u8 IEEE80211_B_RATES[] = { 0x02, 0x04, 0x0b, 0x16, 0x00 }; ++ ++struct ieee80211_bss * ieee80211_get_bss(struct ieee80211_data *data, u8 *addr); ++ ++void ieee80211_init(struct ieee80211_data *data); ++void ieee80211_deinit(struct ieee80211_data *data); ++void ieee80211_rx_mgmt(struct ieee80211_data *data, struct sk_buff *skb, ++ struct ieee80211_rx_status *rx_status); ++void ieee80211_start(struct ieee80211_data *data); ++void ieee80211_start_scan(struct ieee80211_data *data); ++void ieee80211_stop(struct ieee80211_data *data); ++ ++int ieee80211_data_tx(struct ieee80211_data *data, ++ struct sk_buff *skb); ++ ++struct sk_buff * ieee80211_wep_decode(struct ieee80211_data *data, ++ struct sk_buff *skb); ++ ++struct sk_buff * ieee80211_data_encaps(struct ieee80211_data *data, ++ struct sk_buff *skb); ++struct sk_buff * ieee80211_data_decaps(struct ieee80211_data *data, ++ struct sk_buff *skb); ++ ++struct sk_buff * ieee80211_reassemble_frag (struct ieee80211_data *data, ++ struct sk_buff *skb); ++int ieee80211_filter_duplicates(struct ieee80211_data *data, ++ struct sk_buff *skb, u16 fc); ++u8 ieee80211_get_rate(struct ieee80211_data *data, u8 *addr); ++ ++#include "wep.h" ++ ++#endif /* IEEE80211_H */ +diff -urN x/drivers/net/wireless/adm8211/kernel.patch y/drivers/net/wireless/adm8211/kernel.patch +--- x/drivers/net/wireless/adm8211/kernel.patch 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/adm8211/kernel.patch 2004-08-21 08:15:20.000000000 +1000 +@@ -0,0 +1,24 @@ ++diff -Nru linux-2.6.8.1/drivers/net/wireless/Kconfig linux-2.6.8.1-adm8211/drivers/net/wireless/Kconfig ++--- linux-2.6.8.1/drivers/net/wireless/Kconfig 2004-08-14 06:54:52.000000000 -0400 +++++ linux-2.6.8.1-adm8211/drivers/net/wireless/Kconfig 2004-08-19 20:07:50.000000000 -0400 ++@@ -307,6 +307,8 @@ ++ It has basic support for Linux wireless extensions and initial ++ micro support for ethtool. ++ +++source "drivers/net/wireless/adm8211/Kconfig" +++ ++ comment "Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support" ++ depends on NET_RADIO && PCI ++ config PRISM54 ++diff -Nru linux-2.6.8.1/drivers/net/wireless/Makefile linux-2.6.8.1-adm8211/drivers/net/wireless/Makefile ++--- linux-2.6.8.1/drivers/net/wireless/Makefile 2004-08-14 06:56:25.000000000 -0400 +++++ linux-2.6.8.1-adm8211/drivers/net/wireless/Makefile 2004-08-19 20:04:20.000000000 -0400 ++@@ -28,6 +28,8 @@ ++ ++ obj-$(CONFIG_PRISM54) += prism54/ ++ +++obj-$(CONFIG_ADM8211) += adm8211/ +++ ++ # 16-bit wireless PCMCIA client drivers ++ obj-$(CONFIG_PCMCIA_RAYCS) += ray_cs.o ++ obj-$(CONFIG_PCMCIA_WL3501) += wl3501_cs.o +diff -urN x/drivers/net/wireless/adm8211/rdate.h y/drivers/net/wireless/adm8211/rdate.h +--- x/drivers/net/wireless/adm8211/rdate.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/adm8211/rdate.h 2004-09-16 15:21:02.000000000 +1000 +@@ -0,0 +1 @@ ++#define RELEASE_DATE "20040916" +diff -urN x/drivers/net/wireless/adm8211/wep.c y/drivers/net/wireless/adm8211/wep.c +--- x/drivers/net/wireless/adm8211/wep.c 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/adm8211/wep.c 2004-07-14 16:33:38.000000000 +1000 +@@ -0,0 +1,254 @@ ++/* ++ * Host AP crypt: host-based WEP encryption implementation for Host AP driver ++ * (adapted for use within the adm8211 driver) ++ * ++ * Copyright (c) 2002-2004, Jouni Malinen ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. See README and COPYING for ++ * more details. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "ieee80211.h" ++ ++static const __u32 crc32_table[256] = { ++ 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, ++ 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L, ++ 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, ++ 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL, ++ 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L, ++ 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L, ++ 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, ++ 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL, ++ 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, ++ 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL, ++ 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, ++ 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L, ++ 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L, ++ 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL, ++ 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, ++ 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L, ++ 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL, ++ 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L, ++ 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, ++ 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L, ++ 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL, ++ 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L, ++ 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L, ++ 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL, ++ 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L, ++ 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L, ++ 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L, ++ 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L, ++ 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L, ++ 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL, ++ 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, ++ 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L, ++ 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L, ++ 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL, ++ 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL, ++ 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L, ++ 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL, ++ 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L, ++ 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, ++ 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L, ++ 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL, ++ 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L, ++ 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, ++ 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL, ++ 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L, ++ 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L, ++ 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, ++ 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L, ++ 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L, ++ 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L, ++ 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, ++ 0x2d02ef8dL ++}; ++ ++ ++/* Perform WEP encryption on given skb that has at least 4 bytes of headroom ++ * for IV and 4 bytes of tailroom for ICV. Both IV and ICV will be transmitted, ++ * so the payload length increases with 8 bytes. ++ * ++ * WEP frame payload: IV + TX key idx, RC4(data), ICV = RC4(CRC32(data)) ++ */ ++int wep_encrypt(struct sk_buff *skb, int hdr_len, int key_idx, ++ struct ieee80211_wep_data *wep) ++{ ++ u32 i, j, k, crc, klen, len; ++ u8 S[256], key[WEP_KEY_MAX_LEN + 3]; ++ u8 kpos, *pos; ++#define S_SWAP(a,b) do { u8 t = S[a]; S[a] = S[b]; S[b] = t; } while(0) ++ ++ if (skb->len < hdr_len) ++ return -1; ++ ++ if (skb_headroom(skb) < 4 || skb_tailroom(skb) < 4) { ++ if (pskb_expand_head(skb, (skb_headroom(skb) < 4 ? 4 : 0), ++ (skb_tailroom(skb) < 4 ? 4 : 0), GFP_ATOMIC)) ++ return -1; ++ } ++ ++ len = skb->len - hdr_len; ++ pos = skb_push(skb, 4); ++ memmove(pos, pos + 4, hdr_len); ++ pos += hdr_len; ++ ++ klen = 3 + wep->len; ++ ++ wep->iv++; ++ ++ /* Fluhrer, Mantin, and Shamir have reported weaknesses in the key ++ * scheduling algorithm of RC4. At least IVs (KeyByte + 3, 0xff, N) ++ * can be used to speedup attacks, so avoid using them. */ ++ if ((wep->iv & 0xff00) == 0xff00) { ++ u8 B = (wep->iv >> 16) & 0xff; ++ if (B >= 3 && B < klen) ++ wep->iv += 0x0100; ++ } ++ ++ /* Prepend 24-bit IV to RC4 key and TX frame */ ++ *pos++ = key[0] = (wep->iv >> 16) & 0xff; ++ *pos++ = key[1] = (wep->iv >> 8) & 0xff; ++ *pos++ = key[2] = wep->iv & 0xff; ++ *pos++ = key_idx << 6; ++ ++ /* Copy rest of the WEP key (the secret part) */ ++ memcpy(key + 3, wep->key, wep->len); ++ ++ /* Setup RC4 state */ ++ for (i = 0; i < 256; i++) ++ S[i] = i; ++ j = 0; ++ kpos = 0; ++ for (i = 0; i < 256; i++) { ++ j = (j + S[i] + key[kpos]) & 0xff; ++ kpos++; ++ if (kpos >= klen) ++ kpos = 0; ++ S_SWAP(i, j); ++ } ++ ++ /* Compute CRC32 over unencrypted data and apply RC4 to data */ ++ crc = ~0; ++ i = j = 0; ++ for (k = 0; k < len; k++) { ++ crc = crc32_table[(crc ^ *pos) & 0xff] ^ (crc >> 8); ++ i = (i + 1) & 0xff; ++ j = (j + S[i]) & 0xff; ++ S_SWAP(i, j); ++ *pos++ ^= S[(S[i] + S[j]) & 0xff]; ++ } ++ crc = ~crc; ++ ++ /* Append little-endian CRC32 and encrypt it to produce ICV */ ++ pos = skb_put(skb, 4); ++ pos[0] = crc; ++ pos[1] = crc >> 8; ++ pos[2] = crc >> 16; ++ pos[3] = crc >> 24; ++ for (k = 0; k < 4; k++) { ++ i = (i + 1) & 0xff; ++ j = (j + S[i]) & 0xff; ++ S_SWAP(i, j); ++ *pos++ ^= S[(S[i] + S[j]) & 0xff]; ++ } ++ ++ return 0; ++} ++ ++ ++/* Perform WEP decryption on given buffer. Buffer includes whole WEP part of ++ * the frame: IV (4 bytes), encrypted payload (including SNAP header), ++ * ICV (4 bytes). len includes both IV and ICV. ++ * ++ * Returns 0 if frame was decrypted successfully and ICV was correct and -1 on ++ * failure. If frame is OK, IV and ICV will be removed. ++ */ ++int wep_decrypt(struct sk_buff *skb, int hdr_len, int key_idx, ++ struct ieee80211_wep_data *wep) ++{ ++ u32 i, j, k, crc, klen, plen; ++ u8 S[256], key[WEP_KEY_MAX_LEN + 3]; ++ u8 keyidx, kpos, *pos, icv[4]; ++ ++ if (skb->len < hdr_len + 8) ++ return -1; ++ ++ pos = skb->data + hdr_len; ++ key[0] = *pos++; ++ key[1] = *pos++; ++ key[2] = *pos++; ++ keyidx = *pos++ >> 6; ++ if (keyidx != key_idx) ++ return -1; ++ ++ klen = 3 + wep->len; ++ ++ /* Copy rest of the WEP key (the secret part) */ ++ memcpy(key + 3, wep->key, wep->len); ++ ++ /* Setup RC4 state */ ++ for (i = 0; i < 256; i++) ++ S[i] = i; ++ j = 0; ++ kpos = 0; ++ for (i = 0; i < 256; i++) { ++ j = (j + S[i] + key[kpos]) & 0xff; ++ kpos++; ++ if (kpos >= klen) ++ kpos = 0; ++ S_SWAP(i, j); ++ } ++ ++ /* Apply RC4 to data and compute CRC32 over decrypted data */ ++ plen = skb->len - hdr_len - 8; ++ crc = ~0; ++ i = j = 0; ++ for (k = 0; k < plen; k++) { ++ i = (i + 1) & 0xff; ++ j = (j + S[i]) & 0xff; ++ S_SWAP(i, j); ++ *pos ^= S[(S[i] + S[j]) & 0xff]; ++ crc = crc32_table[(crc ^ *pos) & 0xff] ^ (crc >> 8); ++ pos++; ++ } ++ crc = ~crc; ++ ++ /* Encrypt little-endian CRC32 and verify that it matches with the ++ * received ICV */ ++ icv[0] = crc; ++ icv[1] = crc >> 8; ++ icv[2] = crc >> 16; ++ icv[3] = crc >> 24; ++ for (k = 0; k < 4; k++) { ++ i = (i + 1) & 0xff; ++ j = (j + S[i]) & 0xff; ++ S_SWAP(i, j); ++ if ((icv[k] ^ S[(S[i] + S[j]) & 0xff]) != *pos++) { ++ /* ICV mismatch - drop frame */ ++ return -2; ++ } ++ } ++ ++ /* Remove IV and ICV */ ++ memmove(skb->data + 4, skb->data, hdr_len); ++ skb_pull(skb, 4); ++ skb_trim(skb, skb->len - 4); ++ ++ return 0; ++} ++ +diff -urN x/drivers/net/wireless/adm8211/wep.h y/drivers/net/wireless/adm8211/wep.h +--- x/drivers/net/wireless/adm8211/wep.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/net/wireless/adm8211/wep.h 2004-06-03 05:34:46.000000000 +1000 +@@ -0,0 +1,9 @@ ++#ifndef WEP_H ++#define WEP_H ++ ++int wep_encrypt(struct sk_buff *skb, int hdr_len, int key_idx, ++ struct ieee80211_wep_data *wep); ++int wep_decrypt(struct sk_buff *skb, int hdr_len, int key_idx, ++ struct ieee80211_wep_data *wep); ++ ++#endif --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/aic79xx-nodev.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/aic79xx-nodev.dpatch @@ -0,0 +1,50 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Unregister properly if no devices are found in aic79xx. +## DP: Patch author: Herbert Xu +## DP: Upstream status: unknown + +. $(dirname $0)/DPATCH + +@DPATCH@ +===== drivers/scsi/aic7xxx/aic79xx_osm.c 1.56 vs edited ===== +--- 1.56/drivers/scsi/aic7xxx/aic79xx_osm.c 2004-08-25 09:09:04 +10:00 ++++ edited/drivers/scsi/aic7xxx/aic79xx_osm.c 2004-09-24 22:40:57 +10:00 +@@ -901,9 +901,9 @@ + */ + ahd_list_lockinit(); + +-#ifdef CONFIG_PCI +- ahd_linux_pci_init(); +-#endif ++ found = ahd_linux_pci_init(); ++ if (found) ++ goto pci_err; + + /* + * Register with the SCSI layer all +@@ -919,6 +919,13 @@ + spin_lock_irq(&io_request_lock); + #endif + aic79xx_detect_complete++; ++ ++ if (!found) { ++ found = -ENODEV; ++ ahd_linux_pci_exit(); ++ } ++ ++pci_err: + return (found); + } + +@@ -5073,7 +5080,7 @@ + ahd_linux_init(void) + { + #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) +- return (ahd_linux_detect(&aic79xx_driver_template) ? 0 : -ENODEV); ++ return ahd_linux_detect(&aic79xx_driver_template); + #else + scsi_register_module(MODULE_SCSI_HA, &aic79xx_driver_template); + if (aic79xx_driver_template.present == 0) { --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/kernel-sysctl_CVE-2005-2709.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/kernel-sysctl_CVE-2005-2709.dpatch @@ -0,0 +1,299 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urNad /home/fabbione/i386/linux-source-2.6.8.1-2.6.8.1/arch/s390/appldata/appldata_base.c linux-source-2.6.8.1-2.6.8.1/arch/s390/appldata/appldata_base.c +--- /home/fabbione/i386/linux-source-2.6.8.1-2.6.8.1/arch/s390/appldata/appldata_base.c 2005-11-17 10:07:59.000000000 +0000 ++++ linux-source-2.6.8.1-2.6.8.1/arch/s390/appldata/appldata_base.c 2005-11-17 10:11:29.000000000 +0000 +@@ -583,12 +583,15 @@ + */ + void appldata_unregister_ops(struct appldata_ops *ops) + { ++ void *table; + spin_lock_bh(&appldata_ops_lock); +- unregister_sysctl_table(ops->sysctl_header); + list_del(&ops->list); +- kfree(ops->ctl_table); ++ /* at that point any incoming access will fail */ ++ table = ops->ctl_table; + ops->ctl_table = NULL; + spin_unlock_bh(&appldata_ops_lock); ++ unregister_sysctl_table(ops->sysctl_header); ++ kfree(table); + P_INFO("%s-ops unregistered!\n", ops->name); + } + /********************** module-ops management **************************/ +diff -urNad /home/fabbione/i386/linux-source-2.6.8.1-2.6.8.1/include/linux/proc_fs.h linux-source-2.6.8.1-2.6.8.1/include/linux/proc_fs.h +--- /home/fabbione/i386/linux-source-2.6.8.1-2.6.8.1/include/linux/proc_fs.h 2005-11-17 10:07:59.000000000 +0000 ++++ linux-source-2.6.8.1-2.6.8.1/include/linux/proc_fs.h 2005-11-17 10:11:29.000000000 +0000 +@@ -66,6 +66,7 @@ + write_proc_t *write_proc; + atomic_t count; /* use count */ + int deleted; /* delete flag */ ++ void *set; + }; + + struct kcore_list { +diff -urNad /home/fabbione/i386/linux-source-2.6.8.1-2.6.8.1/include/linux/sysctl.h linux-source-2.6.8.1-2.6.8.1/include/linux/sysctl.h +--- /home/fabbione/i386/linux-source-2.6.8.1-2.6.8.1/include/linux/sysctl.h 2005-11-17 10:07:59.000000000 +0000 ++++ linux-source-2.6.8.1-2.6.8.1/include/linux/sysctl.h 2005-11-17 10:11:29.000000000 +0000 +@@ -24,6 +24,7 @@ + #include + + struct file; ++struct completion; + + #define CTL_MAXNAME 10 /* how many path components do we allow in a + call to sysctl? In other words, what is +@@ -854,6 +855,8 @@ + { + ctl_table *ctl_table; + struct list_head ctl_entry; ++ int used; ++ struct completion *unregistering; + }; + + struct ctl_table_header * register_sysctl_table(ctl_table * table, +diff -urNad /home/fabbione/i386/linux-source-2.6.8.1-2.6.8.1/kernel/sysctl.c linux-source-2.6.8.1-2.6.8.1/kernel/sysctl.c +--- /home/fabbione/i386/linux-source-2.6.8.1-2.6.8.1/kernel/sysctl.c 2005-11-17 10:07:59.000000000 +0000 ++++ linux-source-2.6.8.1-2.6.8.1/kernel/sysctl.c 2005-11-17 10:14:16.000000000 +0000 +@@ -159,7 +159,7 @@ + + extern struct proc_dir_entry *proc_sys_root; + +-static void register_proc_table(ctl_table *, struct proc_dir_entry *); ++static void register_proc_table(ctl_table *, struct proc_dir_entry *, void *); + static void unregister_proc_table(ctl_table *, struct proc_dir_entry *); + #endif + +@@ -912,10 +912,51 @@ + + extern void init_irq_proc (void); + ++static spinlock_t sysctl_lock = SPIN_LOCK_UNLOCKED; ++ ++/* called under sysctl_lock */ ++static int use_table(struct ctl_table_header *p) ++{ ++ if (unlikely(p->unregistering)) ++ return 0; ++ p->used++; ++ return 1; ++} ++ ++/* called under sysctl_lock */ ++static void unuse_table(struct ctl_table_header *p) ++{ ++ if (!--p->used) ++ if (unlikely(p->unregistering)) ++ complete(p->unregistering); ++} ++ ++/* called under sysctl_lock, will reacquire if has to wait */ ++static void start_unregistering(struct ctl_table_header *p) ++{ ++ /* ++ * if p->used is 0, nobody will ever touch that entry again; ++ * we'll eliminate all paths to it before dropping sysctl_lock ++ */ ++ if (unlikely(p->used)) { ++ struct completion wait; ++ init_completion(&wait); ++ p->unregistering = &wait; ++ spin_unlock(&sysctl_lock); ++ wait_for_completion(&wait); ++ spin_lock(&sysctl_lock); ++ } ++ /* ++ * do not remove from the list until nobody holds it; walking the ++ * list in do_sysctl() relies on that. ++ */ ++ list_del_init(&p->ctl_entry); ++} ++ + void __init sysctl_init(void) + { + #ifdef CONFIG_PROC_FS +- register_proc_table(root_table, proc_sys_root); ++ register_proc_table(root_table, proc_sys_root, &root_table_header); + init_irq_proc(); + #endif + } +@@ -924,6 +965,7 @@ + void __user *newval, size_t newlen) + { + struct list_head *tmp; ++ int error = -ENOTDIR; + + if (nlen <= 0 || nlen >= CTL_MAXNAME) + return -ENOTDIR; +@@ -932,21 +974,31 @@ + if (!oldlenp || get_user(old_len, oldlenp)) + return -EFAULT; + } ++ spin_lock(&sysctl_lock); + tmp = &root_table_header.ctl_entry; + do { + struct ctl_table_header *head = + list_entry(tmp, struct ctl_table_header, ctl_entry); + void *context = NULL; +- int error = parse_table(name, nlen, oldval, oldlenp, ++ ++ if (!use_table(head)) ++ continue; ++ ++ spin_unlock(&sysctl_lock); ++ ++ error = parse_table(name, nlen, oldval, oldlenp, + newval, newlen, head->ctl_table, + &context); + if (context) + kfree(context); ++ ++ spin_lock(&sysctl_lock); ++ unuse_table(head); + if (error != -ENOTDIR) +- return error; +- tmp = tmp->next; +- } while (tmp != &root_table_header.ctl_entry); +- return -ENOTDIR; ++ break; ++ } while ((tmp = tmp->next) != &root_table_header.ctl_entry); ++ spin_unlock(&sysctl_lock); ++ return error; + } + + asmlinkage long sys_sysctl(struct __sysctl_args __user *args) +@@ -1157,12 +1209,16 @@ + return NULL; + tmp->ctl_table = table; + INIT_LIST_HEAD(&tmp->ctl_entry); ++ tmp->used = 0; ++ tmp->unregistering = NULL; ++ spin_lock(&sysctl_lock); + if (insert_at_head) + list_add(&tmp->ctl_entry, &root_table_header.ctl_entry); + else + list_add_tail(&tmp->ctl_entry, &root_table_header.ctl_entry); ++ spin_unlock(&sysctl_lock); + #ifdef CONFIG_PROC_FS +- register_proc_table(table, proc_sys_root); ++ register_proc_table(table, proc_sys_root, tmp); + #endif + return tmp; + } +@@ -1176,10 +1232,13 @@ + */ + void unregister_sysctl_table(struct ctl_table_header * header) + { +- list_del(&header->ctl_entry); ++ might_sleep(); ++ spin_lock(&sysctl_lock); ++ start_unregistering(header); + #ifdef CONFIG_PROC_FS + unregister_proc_table(header->ctl_table, proc_sys_root); + #endif ++ spin_unlock(&sysctl_lock); + kfree(header); + } + +@@ -1190,7 +1249,7 @@ + #ifdef CONFIG_PROC_FS + + /* Scan the sysctl entries in table and add them all into /proc */ +-static void register_proc_table(ctl_table * table, struct proc_dir_entry *root) ++static void register_proc_table(ctl_table * table, struct proc_dir_entry *root, void *set) + { + struct proc_dir_entry *de; + int len; +@@ -1226,13 +1285,14 @@ + de = create_proc_entry(table->procname, mode, root); + if (!de) + continue; ++ de->set = set; + de->data = (void *) table; + if (table->proc_handler) + de->proc_fops = &proc_sys_file_operations; + } + table->de = de; + if (de->mode & S_IFDIR) +- register_proc_table(table->child, de); ++ register_proc_table(table->child, de, set); + } + } + +@@ -1257,6 +1317,13 @@ + continue; + } + ++ /* ++ * In any case, mark the entry as goner; we'll keep it ++ * around if it's busy, but we'll know to do nothing with ++ * its fields. We are under sysctl_lock here. ++ */ ++ de->data = NULL; ++ + /* Don't unregister proc entries that are still being used.. */ + if (atomic_read(&de->count)) + continue; +@@ -1270,27 +1337,38 @@ + size_t count, loff_t *ppos) + { + int op; +- struct proc_dir_entry *de; ++ struct proc_dir_entry *de = PDE(file->f_dentry->d_inode); + struct ctl_table *table; + size_t res; +- ssize_t error; +- +- de = PDE(file->f_dentry->d_inode); +- if (!de || !de->data) +- return -ENOTDIR; +- table = (struct ctl_table *) de->data; +- if (!table || !table->proc_handler) +- return -ENOTDIR; +- op = (write ? 002 : 004); +- if (ctl_perm(table, op)) +- return -EPERM; ++ ssize_t error = -ENOTDIR; + +- res = count; +- +- error = (*table->proc_handler) (table, write, file, buf, &res, ppos); +- if (error) +- return error; +- return res; ++ spin_lock(&sysctl_lock); ++ if (de && de->data && use_table(de->set)) { ++ /* ++ * at that point we know that sysctl was not unregistered ++ * and won't be until we finish ++ */ ++ spin_unlock(&sysctl_lock); ++ table = (struct ctl_table *) de->data; ++ if (!table || !table->proc_handler) ++ goto out; ++ error = -EPERM; ++ op = (write ? 002 : 004); ++ if (ctl_perm(table, op)) ++ goto out; ++ ++ /* careful: calling conventions are nasty here */ ++ res = count; ++ error = (*table->proc_handler)(table, write, file, ++ buf, &res, ppos); ++ if (!error) ++ error = res; ++ out: ++ spin_lock(&sysctl_lock); ++ unuse_table(de->set); ++ } ++ spin_unlock(&sysctl_lock); ++ return error; + } + + static int proc_opensys(struct inode *inode, struct file *file) --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/alpha-epoch-comment.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/alpha-epoch-comment.dpatch @@ -0,0 +1,22 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: fix comment about epochs in arch/alpha/kernel/time.c +## DP: Patch author: unknown +## DP: Upstream status: submitted + +. $(dirname $0)/DPATCH + +@DPATCH@ +--- kernel-source-2.6.6/arch/alpha/kernel/time.c 2004-04-05 19:49:22.000000000 +1000 ++++ kernel-source-2.6.6-1/arch/alpha/kernel/time.c 2004-04-05 20:54:15.000000000 +1000 +@@ -366,7 +366,7 @@ + BCD_TO_BIN(year); + } + +- /* PC-like is standard; used for year < 20 || year >= 70 */ ++ /* PC-like is standard; used for year >= 70 */ + epoch = 1900; + if (year < 20) + epoch = 2000; --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/alpha-termbits.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/alpha-termbits.dpatch @@ -0,0 +1,22 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: add CIBAUD/CMSPAR in include/asm-alpha/termbits.h +## DP: Patch author: unknown +## DP: Upstream status: not submitted + +. $(dirname $0)/DPATCH + +@DPATCH@ +--- kernel-source-2.6.6/include/asm-alpha/termbits.h 2004-03-11 13:55:35.000000000 +1100 ++++ kernel-source-2.6.6-1/include/asm-alpha/termbits.h 2004-03-12 22:03:04.000000000 +1100 +@@ -134,6 +134,8 @@ + #define B3000000 00034 + #define B3500000 00035 + #define B4000000 00036 ++#define CIBAUD 002003600000 /* input baud rate (not used) */ ++#define CMSPAR 010000000000 /* mark or space (stick) parity */ + + #define CSIZE 00001400 + #define CS5 00000000 --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/bio-mem-leak.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/bio-mem-leak.dpatch @@ -0,0 +1,95 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: fix bio_uncopy_user() mem leak +## DP: Patch author: Kurt Garloff +## DP: Upstream status: backport + +. $(dirname $0)/DPATCH + +@DPATCH@ +# This is a BitKeeper generated diff -Nru style patch. +# +# ChangeSet +# 2004/08/24 11:42:34-07:00 garloff@suse.de +# [PATCH] fix bio_uncopy_user() mem leak +# +# When using bounce buffers for SG_IO commands with unaligned buffers in +# blk_rq_map_user(), we should free the pages from blk_rq_unmap_user() which +# calls bio_uncopy_user() for the non-BIO_USER_MAPPED case. That function +# failed to free the pages for write requests. +# +# So we leaked pages and you machine would go OOM. Rebooting helped ;-) +# +# This bug was triggered by writing audio CDs (but not on data CDs), as the +# audio frames are not aligned well (2352 bytes), so the user pages don't just +# get mapped. +# +# Bug was reported by Mathias Homan and debugged by Chris Mason + me. (Jens +# is away.) +# +# From: Chris Mason +# +# Fix the leak for real +# +# Signed-off-by: Kurt Garloff +# +# Signed-off-by: Andrew Morton +# Signed-off-by: Linus Torvalds +# +# fs/bio.c +# 2004/08/24 02:09:01-07:00 garloff@suse.de +11 -12 +# fix bio_uncopy_user() mem leak +# +diff -Nru a/fs/bio.c b/fs/bio.c +--- a/fs/bio.c 2004-08-26 20:16:59 +10:00 ++++ b/fs/bio.c 2004-08-26 20:16:59 +10:00 +@@ -388,20 +388,17 @@ + struct bio_vec *bvec; + int i, ret = 0; + +- if (bio_data_dir(bio) == READ) { +- char *uaddr = bio->bi_private; ++ char *uaddr = bio->bi_private; + +- __bio_for_each_segment(bvec, bio, i, 0) { +- char *addr = page_address(bvec->bv_page); +- +- if (!ret && copy_to_user(uaddr, addr, bvec->bv_len)) +- ret = -EFAULT; ++ __bio_for_each_segment(bvec, bio, i, 0) { ++ char *addr = page_address(bvec->bv_page); ++ if (bio_data_dir(bio) == READ && !ret && ++ copy_to_user(uaddr, addr, bvec->bv_len)) ++ ret = -EFAULT; + +- __free_page(bvec->bv_page); +- uaddr += bvec->bv_len; +- } ++ __free_page(bvec->bv_page); ++ uaddr += bvec->bv_len; + } +- + bio_put(bio); + return ret; + } +@@ -457,6 +454,7 @@ + */ + if (!ret) { + if (!write_to_vm) { ++ unsigned long p = uaddr; + bio->bi_rw |= (1 << BIO_RW); + /* + * for a write, copy in data to kernel pages +@@ -465,8 +463,9 @@ + bio_for_each_segment(bvec, bio, i) { + char *addr = page_address(bvec->bv_page); + +- if (copy_from_user(addr, (char *) uaddr, bvec->bv_len)) ++ if (copy_from_user(addr, (char *) p, bvec->bv_len)) + goto cleanup; ++ p += bvec->bv_len; + } + } + --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/capi-skb-free.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/capi-skb-free.dpatch @@ -0,0 +1,165 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: ISDN CAPI: low-level drivers skb free fix +## DP: Patch author: Carsten Paeth, Armin Schindler +## DP: Upstream status: backport + +. $(dirname $0)/DPATCH + +@DPATCH@ +# This is a BitKeeper generated diff -Nru style patch. +# +# ChangeSet +# 2004/08/27 14:55:01-07:00 armin@melware.de +# [PATCH] 2.6 ISDN CAPI: low-level drivers skb free fix +# +# CAPI skb freeing fix. On sending, the hardware/low-level +# driver may free a skb on no error only. The application/core +# side must take care otherwise. +# +# Author: Carsten Paeth, Armin Schindler +# +# drivers/isdn/hardware/eicon/capifunc.c +# 2004/08/27 12:57:40-07:00 armin@melware.de +3 -2 +# 2.6 ISDN CAPI: low-level drivers skb free fix +# +# drivers/isdn/hardware/avm/t1isa.c +# 2004/08/27 12:51:03-07:00 armin@melware.de +3 -4 +# 2.6 ISDN CAPI: low-level drivers skb free fix +# +# drivers/isdn/hardware/avm/c4.c +# 2004/08/27 12:51:03-07:00 armin@melware.de +0 -2 +# 2.6 ISDN CAPI: low-level drivers skb free fix +# +# drivers/isdn/hardware/avm/b1dma.c +# 2004/08/27 12:51:03-07:00 armin@melware.de +0 -2 +# 2.6 ISDN CAPI: low-level drivers skb free fix +# +# drivers/isdn/hardware/avm/b1.c +# 2004/08/27 12:51:03-07:00 armin@melware.de +3 -5 +# 2.6 ISDN CAPI: low-level drivers skb free fix +# +# drivers/isdn/capi/capidrv.c +# 2004/08/27 12:27:24-07:00 armin@melware.de +2 -1 +# 2.6 ISDN CAPI: low-level drivers skb free fix +# +diff -Nru a/drivers/isdn/capi/capidrv.c b/drivers/isdn/capi/capidrv.c +--- a/drivers/isdn/capi/capidrv.c 2004-09-04 10:55:29 +10:00 ++++ b/drivers/isdn/capi/capidrv.c 2004-09-04 10:55:29 +10:00 +@@ -512,7 +512,8 @@ + len = CAPIMSG_LEN(cmsg->buf); + skb = alloc_skb(len, GFP_ATOMIC); + memcpy(skb_put(skb, len), cmsg->buf, len); +- capi20_put_message(&global.ap, skb); ++ if (capi20_put_message(&global.ap, skb) != CAPI_NOERROR) ++ kfree_skb(skb); + } + + /* -------- state machine -------------------------------------------- */ +diff -Nru a/drivers/isdn/hardware/avm/b1.c b/drivers/isdn/hardware/avm/b1.c +--- a/drivers/isdn/hardware/avm/b1.c 2004-09-04 10:55:29 +10:00 ++++ b/drivers/isdn/hardware/avm/b1.c 2004-09-04 10:55:29 +10:00 +@@ -389,7 +389,7 @@ + CAPIMSG_NCCI(skb->data), + CAPIMSG_MSGID(skb->data)); + if (retval != CAPI_NOERROR) +- goto out; ++ return retval; + + dlen = CAPIMSG_DATALEN(skb->data); + +@@ -399,16 +399,14 @@ + b1_put_slice(port, skb->data + len, dlen); + spin_unlock_irqrestore(&card->lock, flags); + } else { +- retval = CAPI_NOERROR; +- + spin_lock_irqsave(&card->lock, flags); + b1_put_byte(port, SEND_MESSAGE); + b1_put_slice(port, skb->data, len); + spin_unlock_irqrestore(&card->lock, flags); + } +- out: ++ + dev_kfree_skb_any(skb); +- return retval; ++ return CAPI_NOERROR; + } + + /* ------------------------------------------------------------- */ +diff -Nru a/drivers/isdn/hardware/avm/b1dma.c b/drivers/isdn/hardware/avm/b1dma.c +--- a/drivers/isdn/hardware/avm/b1dma.c 2004-09-04 10:55:29 +10:00 ++++ b/drivers/isdn/hardware/avm/b1dma.c 2004-09-04 10:55:29 +10:00 +@@ -839,8 +839,6 @@ + } + if (retval == CAPI_NOERROR) + b1dma_queue_tx(card, skb); +- else +- dev_kfree_skb_any(skb); + + return retval; + } +diff -Nru a/drivers/isdn/hardware/avm/c4.c b/drivers/isdn/hardware/avm/c4.c +--- a/drivers/isdn/hardware/avm/c4.c 2004-09-04 10:55:29 +10:00 ++++ b/drivers/isdn/hardware/avm/c4.c 2004-09-04 10:55:29 +10:00 +@@ -1029,8 +1029,6 @@ + spin_lock_irqsave(&card->lock, flags); + c4_dispatch_tx(card); + spin_unlock_irqrestore(&card->lock, flags); +- } else { +- dev_kfree_skb_any(skb); + } + return retval; + } +diff -Nru a/drivers/isdn/hardware/avm/t1isa.c b/drivers/isdn/hardware/avm/t1isa.c +--- a/drivers/isdn/hardware/avm/t1isa.c 2004-09-04 10:55:29 +10:00 ++++ b/drivers/isdn/hardware/avm/t1isa.c 2004-09-04 10:55:29 +10:00 +@@ -472,7 +472,7 @@ + CAPIMSG_NCCI(skb->data), + CAPIMSG_MSGID(skb->data)); + if (retval != CAPI_NOERROR) +- goto out; ++ return retval; + + dlen = CAPIMSG_DATALEN(skb->data); + +@@ -482,16 +482,15 @@ + t1_put_slice(port, skb->data + len, dlen); + spin_unlock_irqrestore(&card->lock, flags); + } else { +- retval = CAPI_NOERROR; + + spin_lock_irqsave(&card->lock, flags); + b1_put_byte(port, SEND_MESSAGE); + t1_put_slice(port, skb->data, len); + spin_unlock_irqrestore(&card->lock, flags); + } +- out: ++ + dev_kfree_skb_any(skb); +- return retval; ++ return CAPI_NOERROR; + } + /* ------------------------------------------------------------- */ + +diff -Nru a/drivers/isdn/hardware/eicon/capifunc.c b/drivers/isdn/hardware/eicon/capifunc.c +--- a/drivers/isdn/hardware/eicon/capifunc.c 2004-09-04 10:55:29 +10:00 ++++ b/drivers/isdn/hardware/eicon/capifunc.c 2004-09-04 10:55:29 +10:00 +@@ -1,4 +1,4 @@ +-/* $Id: capifunc.c,v 1.61.4.2 2004/05/05 16:09:25 armin Exp $ ++/* $Id: capifunc.c,v 1.61.4.5 2004/08/27 20:10:12 armin Exp $ + * + * ISDN interface module for Eicon active cards DIVA. + * CAPI Interface common functions +@@ -998,7 +998,8 @@ + + write_end: + diva_os_leave_spin_lock(&api_lock, &old_irql, "send message"); +- diva_os_free_message_buffer(dmb); ++ if (retval == CAPI_NOERROR) ++ diva_os_free_message_buffer(dmb); + return retval; + } + --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/igmp.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/igmp.dpatch @@ -0,0 +1,72 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Fixed IGMP bugs. +## DP: Patch author: Chris Wright +## DP: Upstream status: unknown + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN x/net/ipv4/igmp.c y/net/ipv4/igmp.c +--- x/net/ipv4/igmp.c 2004-08-24 17:19:34.000000000 +1000 ++++ y/net/ipv4/igmp.c 2004-12-14 22:18:37.000000000 +1100 +@@ -1776,12 +1776,12 @@ + goto done; + rv = !0; + for (i=0; isl_count; i++) { +- rv = memcmp(&psl->sl_addr, &mreqs->imr_multiaddr, ++ rv = memcmp(&psl->sl_addr[i], &mreqs->imr_sourceaddr, + sizeof(__u32)); +- if (rv >= 0) ++ if (rv == 0) + break; + } +- if (!rv) /* source not found */ ++ if (rv) /* source not found */ + goto done; + + /* update the interface filter */ +@@ -1823,9 +1823,9 @@ + } + rv = 1; /* > 0 for insert logic below if sl_count is 0 */ + for (i=0; isl_count; i++) { +- rv = memcmp(&psl->sl_addr, &mreqs->imr_multiaddr, ++ rv = memcmp(&psl->sl_addr[i], &mreqs->imr_sourceaddr, + sizeof(__u32)); +- if (rv >= 0) ++ if (rv == 0) + break; + } + if (rv == 0) /* address already there is an error */ +diff -urN x/net/ipv6/mcast.c y/net/ipv6/mcast.c +--- x/net/ipv6/mcast.c 2004-08-24 17:19:05.000000000 +1000 ++++ y/net/ipv6/mcast.c 2004-12-14 22:18:37.000000000 +1100 +@@ -389,12 +389,12 @@ + goto done; + rv = !0; + for (i=0; isl_count; i++) { +- rv = memcmp(&psl->sl_addr, group, ++ rv = memcmp(&psl->sl_addr[i], source, + sizeof(struct in6_addr)); +- if (rv >= 0) ++ if (rv == 0) + break; + } +- if (!rv) /* source not found */ ++ if (rv) /* source not found */ + goto done; + + /* update the interface filter */ +@@ -435,8 +435,8 @@ + } + rv = 1; /* > 0 for insert logic below if sl_count is 0 */ + for (i=0; isl_count; i++) { +- rv = memcmp(&psl->sl_addr, group, sizeof(struct in6_addr)); +- if (rv >= 0) ++ rv = memcmp(&psl->sl_addr[i], source, sizeof(struct in6_addr)); ++ if (rv == 0) + break; + } + if (rv == 0) /* address already there is an error */ --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/cbq-leak.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/cbq-leak.dpatch @@ -0,0 +1,79 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Fix class leak in CBQ scheduler. +## DP: Patch author: Patrick McHardy +## DP: Upstream status: backport + +. $(dirname $0)/DPATCH + +@DPATCH@ +# This is a BitKeeper generated diff -Nru style patch. +# +# ChangeSet +# 2004/08/22 21:32:31-07:00 kaber@trash.net +# [PKT_SCHED]: Fix class leak in CBQ scheduler. +# +# Signed-off-by: Patrick McHardy +# Signed-off-by: David S. Miller +# +# net/sched/sch_cbq.c +# 2004/08/22 21:32:15-07:00 kaber@trash.net +8 -6 +# [PKT_SCHED]: Fix class leak in CBQ scheduler. +# +# Signed-off-by: Patrick McHardy +# Signed-off-by: David S. Miller +# +diff -Nru a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c +--- a/net/sched/sch_cbq.c 2004-08-28 15:21:44 +10:00 ++++ b/net/sched/sch_cbq.c 2004-08-28 15:21:44 +10:00 +@@ -1746,15 +1746,18 @@ + } + } + +-static void cbq_destroy_class(struct cbq_class *cl) ++static void cbq_destroy_class(struct Qdisc *sch, struct cbq_class *cl) + { ++ struct cbq_sched_data *q = qdisc_priv(sch); ++ + cbq_destroy_filters(cl); + qdisc_destroy(cl->q); + qdisc_put_rtab(cl->R_tab); + #ifdef CONFIG_NET_ESTIMATOR + qdisc_kill_estimator(&cl->stats); + #endif +- kfree(cl); ++ if (cl != &q->link) ++ kfree(cl); + } + + static void +@@ -1777,8 +1780,7 @@ + + for (cl = q->classes[h]; cl; cl = next) { + next = cl->next; +- if (cl != &q->link) +- cbq_destroy_class(cl); ++ cbq_destroy_class(sch, cl); + } + } + +@@ -1799,7 +1801,7 @@ + spin_unlock_bh(&sch->dev->queue_lock); + #endif + +- cbq_destroy_class(cl); ++ cbq_destroy_class(sch, cl); + } + } + +@@ -2035,7 +2037,7 @@ + sch_tree_unlock(sch); + + if (--cl->refcnt == 0) +- cbq_destroy_class(cl); ++ cbq_destroy_class(sch, cl); + + return 0; + } --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/cciss-update.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/cciss-update.dpatch @@ -0,0 +1,404 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Update CCISS driver +## DP: Patch author: Mike Miller +## DP: Upstream status: backport + +. $(dirname $0)/DPATCH + +@DPATCH@ +# This is a BitKeeper generated diff -Nru style patch. +# +# ChangeSet +# 2004/08/23 13:09:03-07:00 bunk@fs.tum.de +# [PATCH] cciss /proc dependency fix +# +# cciss uses /proc to hook into the SCSI subsystem. If you do not build +# /proc support into your kernel then you should also disable tape support in +# the driver. +# +# Signed-off-by: Adrian Bunk +# Signed-off-by: Andrew Morton +# Signed-off-by: Linus Torvalds +# +# drivers/block/Kconfig +# 2004/08/23 01:15:29-07:00 bunk@fs.tum.de +1 -1 +# cciss /proc dependency fix +# +# ChangeSet +# 2004/08/23 13:08:51-07:00 mike.miller@hp.com +# [PATCH] cciss update 8 maintainers update for HP +# +# This patch updates the maintainers list for HP drivers. +# +# Signed-off-by: Andrew Morton +# Signed-off-by: Linus Torvalds +# +# MAINTAINERS +# 2004/08/23 01:15:28-07:00 mike.miller@hp.com +5 -5 +# cciss update 8 maintainers update for HP +# +# ChangeSet +# 2004/08/23 13:08:39-07:00 mike.miller@hp.com +# [PATCH] cciss: read_ahead bumped to 1024 +# +# This patch changes our read_ahead to 1024. This has been shown to increase +# performance. +# +# Signed-off-by: Andrew Morton +# Signed-off-by: Linus Torvalds +# +# drivers/block/cciss.c +# 2004/08/23 01:15:28-07:00 mike.miller@hp.com +1 -1 +# cciss: read_ahead bumped to 1024 +# +# ChangeSet +# 2004/08/23 13:08:30-07:00 mike.miller@hp.com +# [PATCH] cciss: pdev->intr fix +# +# This patch fixes our usage of pdev->intr. We were truncating it to an unchar. +# We were also reading it before calling pci_enable_device. This patch fixes +# both of those. Thanks to Bjorn Helgaas for the patch. +# +# Signed-off-by: Andrew Morton +# Signed-off-by: Linus Torvalds +# +# drivers/block/cciss.h +# 2004/08/23 01:15:28-07:00 mike.miller@hp.com +1 -1 +# cciss: pdev->intr fix +# +# drivers/block/cciss.c +# 2004/08/23 01:15:28-07:00 mike.miller@hp.com +2 -3 +# cciss: pdev->intr fix +# +# ChangeSet +# 2004/08/23 13:08:19-07:00 mikem@beardog.cca.cpqcorp.net +# [PATCH] cciss: V100 PCI ID fix again +# +# Somehow I managed to get the wrong PCI ID in pci_ids.h. 3210 is the +# correct PCI ID, 3211 is the subsystem ID. +# +# Signed-off-by: Andrew Morton +# Signed-off-by: Linus Torvalds +# +# include/linux/pci_ids.h +# 2004/08/23 01:15:28-07:00 mikem@beardog.cca.cpqcorp.net +1 -1 +# cciss: V100 PCI ID fix again +# +# ChangeSet +# 2004/08/23 13:08:07-07:00 mike.miller@hp.com +# [PATCH] cciss: id change for V100 controller +# +# This patch fixes the vendor ID for our cciss based SATA controller due out +# later this year and adds the new PCI ID to pci_ids.h. +# +# Also changes DRIVER_NAME to HP CCISS. +# +# Signed-off-by: Andrew Morton +# Signed-off-by: Linus Torvalds +# +# include/linux/pci_ids.h +# 2004/08/23 01:15:28-07:00 mike.miller@hp.com +1 -0 +# cciss: id change for V100 controller +# +# drivers/block/cciss.c +# 2004/08/23 01:15:28-07:00 mike.miller@hp.com +3 -3 +# cciss: id change for V100 controller +# +# ChangeSet +# 2004/08/23 13:07:56-07:00 mike.miller@hp.com +# [PATCH] cciss: cylinder calculation fix +# +# This patch fixes our cylinder calculations. Without his fix the number of +# cylinders maxes out at 65535. +# +# Signed-off-by: Andrew Morton +# Signed-off-by: Linus Torvalds +# +# drivers/block/cciss.c +# 2004/08/23 01:15:27-07:00 mike.miller@hp.com +6 -0 +# cciss: cylinder calculation fix +# +# ChangeSet +# 2004/08/23 13:07:44-07:00 mike.miller@hp.com +# [PATCH] cciss: /proc fixes +# +# This patch fixes our output in /proc to display the logical volume sizes and +# RAID levels correctly. Without this patch RAID level will always be 0 and +# size may be displayed as 0GB. +# +# Signed-off-by: Andrew Morton +# Signed-off-by: Linus Torvalds +# +# drivers/block/cciss.c +# 2004/08/23 01:15:27-07:00 mike.miller@hp.com +8 -18 +# cciss: /proc fixes +# +# ChangeSet +# 2004/08/23 13:07:33-07:00 mike.miller@hp.com +# [PATCH] cciss: zero out buffer in passthru ioctls for HP utilities +# +# This patch addresses a problem with our utilities. We must zero out the +# buffer before copying their data into it to prevent bogus info when switching +# between SCSI & SATA or SAS drives. +# +# Signed-off-by: Andrew Morton +# Signed-off-by: Linus Torvalds +# +# drivers/block/cciss.c +# 2004/08/23 01:15:27-07:00 mike.miller@hp.com +4 -0 +# cciss: zero out buffer in passthru ioctls for HP utilities +# +# ChangeSet +# 2004/08/23 13:07:21-07:00 mike.miller@hp.com +# [PATCH] cciss: fixes to 32/64-bit conversions +# +# This patch fixes our usage of copy_to_user. We were passing in the size of +# the address rather than the size of the struct. +# +# Signed-off-by: Andrew Morton +# Signed-off-by: Linus Torvalds +# +# drivers/block/cciss.c +# 2004/08/23 01:15:27-07:00 mike.miller@hp.com +2 -2 +# cciss: fixes to 32/64-bit conversions +# +diff -Nru a/MAINTAINERS b/MAINTAINERS +--- a/MAINTAINERS 2004-08-25 12:16:15 +02:00 ++++ b/MAINTAINERS 2004-08-25 12:16:15 +02:00 +@@ -910,18 +910,18 @@ + S: Maintained + + HEWLETT-PACKARD FIBRE CHANNEL 64-bit/66MHz PCI non-intelligent HBA +-P: Chase Maupin +-M: chase.maupin@hp.com ++P: Chirag Kantharia ++M: chirag.kantharia@hp.com + L: iss_storagedev@hp.com + S: Maintained + + HEWLETT-PACKARD SMART2 RAID DRIVER +-P: Francis Wiran +-M: francis.wiran@hp.com ++P: Chirag Kantharia ++M: chirag.kantharia@hp.com + L: iss_storagedev@hp.com + S: Maintained + +-HEWLETT-PACKARD SMART CISS RAID DRIVER ++HEWLETT-PACKARD SMART CISS RAID DRIVER (cciss) + P: Mike Miller + M: mike.miller@hp.com + L: iss_storagedev@hp.com +diff -Nru a/drivers/block/Kconfig b/drivers/block/Kconfig +--- a/drivers/block/Kconfig 2004-08-25 12:16:15 +02:00 ++++ b/drivers/block/Kconfig 2004-08-25 12:16:15 +02:00 +@@ -166,7 +166,7 @@ + + config CISS_SCSI_TAPE + bool "SCSI tape drive support for Smart Array 5xxx" +- depends on BLK_CPQ_CISS_DA && SCSI ++ depends on BLK_CPQ_CISS_DA && SCSI && PROC_FS + help + When enabled (Y), this option allows SCSI tape drives and SCSI medium + changers (tape robots) to be accessed via a Compaq 5xxx array +diff -Nru a/drivers/block/cciss.c b/drivers/block/cciss.c +--- a/drivers/block/cciss.c 2004-08-25 12:16:15 +02:00 ++++ b/drivers/block/cciss.c 2004-08-25 12:16:15 +02:00 +@@ -46,14 +46,14 @@ + #include + + #define CCISS_DRIVER_VERSION(maj,min,submin) ((maj<<16)|(min<<8)|(submin)) +-#define DRIVER_NAME "Compaq CISS Driver (v 2.6.2)" ++#define DRIVER_NAME "HP CISS Driver (v 2.6.2)" + #define DRIVER_VERSION CCISS_DRIVER_VERSION(2,6,2) + + /* Embedded module documentation macros - see modules.h */ + MODULE_AUTHOR("Hewlett-Packard Company"); + MODULE_DESCRIPTION("Driver for HP Controller SA5xxx SA6xxx version 2.6.2"); + MODULE_SUPPORTED_DEVICE("HP SA5i SA5i+ SA532 SA5300 SA5312 SA641 SA642 SA6400" +- " SA6i"); ++ " SA6i V100"); + MODULE_LICENSE("GPL"); + + #include "cciss_cmd.h" +@@ -82,7 +82,7 @@ + 0x0E11, 0x4091, 0, 0, 0}, + { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSC, + 0x0E11, 0x409E, 0, 0, 0}, +- { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSC, ++ { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISS, + 0x103C, 0x3211, 0, 0, 0}, + {0,} + }; +@@ -115,7 +115,7 @@ + /*define how many times we will try a command because of bus resets */ + #define MAX_CMD_RETRIES 3 + +-#define READ_AHEAD 256 ++#define READ_AHEAD 1024 + #define NR_CMDS 384 /* #commands that can be outstanding */ + #define MAX_CTLR 8 + +@@ -192,10 +192,10 @@ + /* + * Report information about this controller. + */ +-#define ENG_GIG 1048576000 ++#define ENG_GIG 1000000000 + #define ENG_GIG_FACTOR (ENG_GIG/512) + #define RAID_UNKNOWN 6 +-static const char *raid_label[] = {"0","4","1(0+1)","5","5+1","ADG", ++static const char *raid_label[] = {"0","4","1(1+0)","5","5+1","ADG", + "UNKNOWN"}; + + static struct proc_dir_entry *proc_cciss; +@@ -209,7 +209,7 @@ + ctlr_info_t *h = (ctlr_info_t*)data; + drive_info_struct *drv; + unsigned long flags; +- unsigned int vol_sz, vol_sz_frac; ++ sector_t vol_sz, vol_sz_frac; + + ctlr = h->ctlr; + +@@ -246,32 +246,21 @@ + pos += size; len += size; + cciss_proc_tape_report(ctlr, buffer, &pos, &len); + for(i=0; i<=h->highest_lun; i++) { +- sector_t tmp; + + drv = &h->drv[i]; + if (drv->block_size == 0) + continue; +- vol_sz = drv->nr_blocks; +- sector_div(vol_sz, ENG_GIG_FACTOR); +- +- /* +- * Awkwardly do this: +- * vol_sz_frac = +- * (drv->nr_blocks%ENG_GIG_FACTOR)*100/ENG_GIG_FACTOR; +- */ +- tmp = drv->nr_blocks; +- vol_sz_frac = sector_div(tmp, ENG_GIG_FACTOR); +- +- /* Now, vol_sz_frac = (drv->nr_blocks%ENG_GIG_FACTOR) */ + ++ vol_sz = drv->nr_blocks; ++ vol_sz_frac = sector_div(vol_sz, ENG_GIG_FACTOR); + vol_sz_frac *= 100; + sector_div(vol_sz_frac, ENG_GIG_FACTOR); + + if (drv->raid_level > 5) + drv->raid_level = RAID_UNKNOWN; + size = sprintf(buffer+len, "cciss/c%dd%d:" +- "\t%4d.%02dGB\tRAID %s\n", +- ctlr, i, vol_sz,vol_sz_frac, ++ "\t%4u.%02uGB\tRAID %s\n", ++ ctlr, i, (int)vol_sz, (int)vol_sz_frac, + raid_label[drv->raid_level]); + pos += size; len += size; + } +@@ -578,7 +567,7 @@ + err = sys_ioctl(fd, CCISS_PASSTHRU, (unsigned long) p); + if (err) + return err; +- err |= copy_in_user(&arg32->error_info, &p->error_info, sizeof(&arg32->error_info)); ++ err |= copy_in_user(&arg32->error_info, &p->error_info, sizeof(arg32->error_info)); + if (err) + return -EFAULT; + return err; +@@ -610,7 +599,7 @@ + err = sys_ioctl(fd, CCISS_BIG_PASSTHRU, (unsigned long) p); + if (err) + return err; +- err |= copy_in_user(&arg32->error_info, &p->error_info, sizeof(&arg32->error_info)); ++ err |= copy_in_user(&arg32->error_info, &p->error_info, sizeof(arg32->error_info)); + if (err) + return -EFAULT; + return err; +@@ -866,6 +855,8 @@ + kfree(buff); + return -EFAULT; + } ++ } else { ++ memset(buff, 0, iocommand.buf_size); + } + if ((c = cmd_alloc(host , 0)) == NULL) + { +@@ -1012,6 +1003,8 @@ + copy_from_user(buff[sg_used], data_ptr, sz)) { + status = -ENOMEM; + goto cleanup1; ++ } else { ++ memset(buff[sg_used], 0, sz); + } + left -= sz; + data_ptr += sz; +@@ -1477,12 +1470,19 @@ + drv->sectors = 32; // Sectors per track + drv->cylinders = total_size / 255 / 32; + } else { ++ unsigned int t; ++ + drv->block_size = block_size; + drv->nr_blocks = total_size; + drv->heads = inq_buff->data_byte[6]; + drv->sectors = inq_buff->data_byte[7]; + drv->cylinders = (inq_buff->data_byte[4] & 0xff) << 8; + drv->cylinders += inq_buff->data_byte[5]; ++ drv->raid_level = inq_buff->data_byte[8]; ++ t = drv->heads * drv->sectors; ++ if (t > 1) { ++ drv->cylinders = total_size/t; ++ } + } + } else { /* Get geometry failed */ + printk(KERN_WARNING "cciss: reading geometry failed, " +@@ -2300,7 +2300,6 @@ + static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev) + { + ushort subsystem_vendor_id, subsystem_device_id, command; +- unchar irq = pdev->irq; + __u32 board_id, scratchpad = 0; + __u64 cfg_offset; + __u32 cfg_base_addr; +@@ -2359,11 +2358,11 @@ + + #ifdef CCISS_DEBUG + printk("command = %x\n", command); +- printk("irq = %x\n", irq); ++ printk("irq = %x\n", pdev->irq); + printk("board_id = %x\n", board_id); + #endif /* CCISS_DEBUG */ + +- c->intr = irq; ++ c->intr = pdev->irq; + + /* + * Memory base addr is first addr , the second points to the config +diff -Nru a/drivers/block/cciss.h b/drivers/block/cciss.h +--- a/drivers/block/cciss.h 2004-08-25 12:16:15 +02:00 ++++ b/drivers/block/cciss.h 2004-08-25 12:16:15 +02:00 +@@ -48,7 +48,7 @@ + unsigned long io_mem_addr; + unsigned long io_mem_length; + CfgTable_struct *cfgtable; +- int intr; ++ unsigned int intr; + int interrupts_enabled; + int max_commands; + int commands_outstanding; +diff -Nru a/include/linux/pci_ids.h b/include/linux/pci_ids.h +--- a/include/linux/pci_ids.h 2004-08-25 12:16:15 +02:00 ++++ b/include/linux/pci_ids.h 2004-08-25 12:16:15 +02:00 +@@ -675,6 +675,7 @@ + #define PCI_DEVICE_ID_HP_SX1000_IOC 0x127c + #define PCI_DEVICE_ID_HP_DIVA_EVEREST 0x1282 + #define PCI_DEVICE_ID_HP_DIVA_AUX 0x1290 ++#define PCI_DEVICE_ID_HP_CISS 0x3210 + + #define PCI_VENDOR_ID_PCTECH 0x1042 + #define PCI_DEVICE_ID_PCTECH_RZ1000 0x1000 --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/cmsg-ok.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/cmsg-ok.dpatch @@ -0,0 +1,115 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Fix CMSG validation checks wrt signedness. +## DP: Patch author: Herbert Xu, David Miller +## DP: Upstream status: backport + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN x/include/linux/socket.h y/include/linux/socket.h +--- x/include/linux/socket.h 2004-08-24 17:18:39.000000000 +1000 ++++ y/include/linux/socket.h 2004-12-10 21:29:17.000000000 +1100 +@@ -90,6 +90,10 @@ + (struct cmsghdr *)(ctl) : \ + (struct cmsghdr *)NULL) + #define CMSG_FIRSTHDR(msg) __CMSG_FIRSTHDR((msg)->msg_control, (msg)->msg_controllen) ++#define CMSG_OK(mhdr, cmsg) ((cmsg)->cmsg_len >= sizeof(struct cmsghdr) && \ ++ (cmsg)->cmsg_len <= (unsigned long) \ ++ ((mhdr)->msg_controllen - \ ++ ((char *)(cmsg) - (char *)(mhdr)->msg_control))) + + /* + * This mess will go away with glibc +diff -urN x/net/compat.c y/net/compat.c +--- x/net/compat.c 2004-08-24 17:17:55.000000000 +1000 ++++ y/net/compat.c 2004-12-10 21:24:13.000000000 +1100 +@@ -123,6 +123,12 @@ + (struct compat_cmsghdr __user *)((msg)->msg_control) : \ + (struct compat_cmsghdr __user *)NULL) + ++#define CMSG_COMPAT_OK(ucmlen, ucmsg, mhdr) \ ++ ((ucmlen) >= sizeof(struct cmsghdr) && \ ++ (ucmlen) <= (unsigned long) \ ++ ((mhdr)->msg_controllen - \ ++ ((char *)(ucmsg) - (char *)(mhdr)->msg_control))) ++ + static inline struct compat_cmsghdr __user *cmsg_compat_nxthdr(struct msghdr *msg, + struct compat_cmsghdr __user *cmsg, int cmsg_len) + { +@@ -153,11 +159,7 @@ + return -EFAULT; + + /* Catch bogons. */ +- if(CMSG_COMPAT_ALIGN(ucmlen) < +- CMSG_COMPAT_ALIGN(sizeof(struct compat_cmsghdr))) +- return -EINVAL; +- if((unsigned long)(((char __user *)ucmsg - (char __user *)kmsg->msg_control) +- + ucmlen) > kmsg->msg_controllen) ++ if (!CMSG_COMPAT_OK(ucmlen, ucmsg, kmsg)) + return -EINVAL; + + tmp = ((ucmlen - CMSG_COMPAT_ALIGN(sizeof(*ucmsg))) + +diff -urN x/net/core/scm.c y/net/core/scm.c +--- x/net/core/scm.c 2004-08-24 17:16:55.000000000 +1000 ++++ y/net/core/scm.c 2004-12-10 21:29:17.000000000 +1100 +@@ -127,9 +127,7 @@ + for too short ancillary data object at all! Oops. + OK, let's add it... + */ +- if (cmsg->cmsg_len < sizeof(struct cmsghdr) || +- (unsigned long)(((char*)cmsg - (char*)msg->msg_control) +- + cmsg->cmsg_len) > msg->msg_controllen) ++ if (!CMSG_OK(msg, cmsg)) + goto error; + + if (cmsg->cmsg_level != SOL_SOCKET) +diff -urN x/net/ipv4/ip_sockglue.c y/net/ipv4/ip_sockglue.c +--- x/net/ipv4/ip_sockglue.c 2004-08-24 17:16:28.000000000 +1000 ++++ y/net/ipv4/ip_sockglue.c 2004-12-10 21:29:17.000000000 +1100 +@@ -146,11 +146,8 @@ + struct cmsghdr *cmsg; + + for (cmsg = CMSG_FIRSTHDR(msg); cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) { +- if (cmsg->cmsg_len < sizeof(struct cmsghdr) || +- (unsigned long)(((char*)cmsg - (char*)msg->msg_control) +- + cmsg->cmsg_len) > msg->msg_controllen) { ++ if (!CMSG_OK(msg, cmsg)) + return -EINVAL; +- } + if (cmsg->cmsg_level != SOL_IP) + continue; + switch (cmsg->cmsg_type) { +diff -urN x/net/ipv6/datagram.c y/net/ipv6/datagram.c +--- x/net/ipv6/datagram.c 2004-08-24 17:15:40.000000000 +1000 ++++ y/net/ipv6/datagram.c 2004-12-10 21:29:17.000000000 +1100 +@@ -416,9 +416,7 @@ + int addr_type; + struct net_device *dev = NULL; + +- if (cmsg->cmsg_len < sizeof(struct cmsghdr) || +- (unsigned long)(((char*)cmsg - (char*)msg->msg_control) +- + cmsg->cmsg_len) > msg->msg_controllen) { ++ if (!CMSG_OK(msg, cmsg)) { + err = -EINVAL; + goto exit_f; + } +diff -urN x/net/sctp/socket.c y/net/sctp/socket.c +--- x/net/sctp/socket.c 2004-08-24 17:20:00.000000000 +1000 ++++ y/net/sctp/socket.c 2004-12-10 21:29:17.000000000 +1100 +@@ -4052,12 +4052,8 @@ + for (cmsg = CMSG_FIRSTHDR(msg); + cmsg != NULL; + cmsg = CMSG_NXTHDR((struct msghdr*)msg, cmsg)) { +- /* Check for minimum length. The SCM code has this check. */ +- if (cmsg->cmsg_len < sizeof(struct cmsghdr) || +- (unsigned long)(((char*)cmsg - (char*)msg->msg_control) +- + cmsg->cmsg_len) > msg->msg_controllen) { ++ if (!CMSG_OK(msg, cmsg)) + return -EINVAL; +- } + + /* Should we parse this header or ignore? */ + if (cmsg->cmsg_level != IPPROTO_SCTP) --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/stolen-from-head_CAN-2005-3109.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/stolen-from-head_CAN-2005-3109.dpatch @@ -0,0 +1,87 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: +## DP: Patch author: +## DP: Upstream status: backport + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -Narud linux-source-2.6.8.1-2.6.8.1.old/fs/hfs/mdb.c linux-source-2.6.8.1-2.6.8.1/fs/hfs/mdb.c +--- linux-source-2.6.8.1-2.6.8.1.old/fs/hfs/mdb.c 2004-08-24 09:16:58.000000000 +0200 ++++ linux-source-2.6.8.1-2.6.8.1/fs/hfs/mdb.c 2005-10-09 12:23:02.000000000 +0200 +@@ -333,6 +333,8 @@ + * Release the resources associated with the in-core MDB. */ + void hfs_mdb_put(struct super_block *sb) + { ++ if (!HFS_SB(sb)) ++ return; + /* free the B-trees */ + hfs_btree_close(HFS_SB(sb)->ext_tree); + hfs_btree_close(HFS_SB(sb)->cat_tree); +@@ -340,4 +342,7 @@ + /* free the buffers holding the primary and alternate MDBs */ + brelse(HFS_SB(sb)->mdb_bh); + brelse(HFS_SB(sb)->alt_mdb_bh); ++ ++ kfree(HFS_SB(sb)); ++ sb->s_fs_info = NULL; + } +diff -Narud linux-source-2.6.8.1-2.6.8.1.old/fs/hfs/super.c linux-source-2.6.8.1-2.6.8.1/fs/hfs/super.c +--- linux-source-2.6.8.1-2.6.8.1.old/fs/hfs/super.c 2004-08-24 09:16:48.000000000 +0200 ++++ linux-source-2.6.8.1-2.6.8.1/fs/hfs/super.c 2005-10-09 12:23:02.000000000 +0200 +@@ -265,7 +265,7 @@ + res = -EINVAL; + if (!parse_options((char *)data, sbi)) { + hfs_warn("hfs_fs: unable to parse mount options.\n"); +- goto bail3; ++ goto bail; + } + + sb->s_op = &hfs_super_operations; +@@ -278,7 +278,7 @@ + hfs_warn("VFS: Can't find a HFS filesystem on dev %s.\n", + hfs_mdb_name(sb)); + res = -EINVAL; +- goto bail2; ++ goto bail; + } + + /* try to get the root inode */ +@@ -308,10 +308,8 @@ + iput(root_inode); + bail_no_root: + hfs_warn("hfs_fs: get root inode failed.\n"); ++bail: + hfs_mdb_put(sb); +-bail2: +-bail3: +- kfree(sbi); + return res; + } + +diff -Narud linux-source-2.6.8.1-2.6.8.1.old/fs/hfsplus/super.c linux-source-2.6.8.1-2.6.8.1/fs/hfsplus/super.c +--- linux-source-2.6.8.1-2.6.8.1.old/fs/hfsplus/super.c 2004-08-24 09:16:09.000000000 +0200 ++++ linux-source-2.6.8.1-2.6.8.1/fs/hfsplus/super.c 2005-10-09 12:23:02.000000000 +0200 +@@ -206,7 +206,9 @@ + static void hfsplus_put_super(struct super_block *sb) + { + dprint(DBG_SUPER, "hfsplus_put_super\n"); +- if (!(sb->s_flags & MS_RDONLY)) { ++ if (!sb->s_fs_info) ++ return; ++ if (!(sb->s_flags & MS_RDONLY) && HFSPLUS_SB(sb).s_vhdr) { + struct hfsplus_vh *vhdr = HFSPLUS_SB(sb).s_vhdr; + + vhdr->modify_date = hfsp_now2mt(); +@@ -222,6 +224,8 @@ + iput(HFSPLUS_SB(sb).alloc_file); + iput(HFSPLUS_SB(sb).hidden_dir); + brelse(HFSPLUS_SB(sb).s_vhbh); ++ kfree(sb->s_fs_info); ++ sb->s_fs_info = NULL; + } + + static int hfsplus_statfs(struct super_block *sb, struct kstatfs *buf) --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/disable-lapic-in-acpi-power-off.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/disable-lapic-in-acpi-power-off.dpatch @@ -0,0 +1,27 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Disable local APIC in acpi_power_off. +## DP: Patch author: unknown +## DP: Upstream status: unknown + +. $(dirname $0)/DPATCH + +@DPATCH@ +--- linux-2.6.7.bak/drivers/acpi/sleep/poweroff.c 2004-06-16 07:20:04.000000000 +0200 ++++ linux-2.6.7/drivers/acpi/sleep/poweroff.c 2004-06-17 19:44:49.000000000 +0200 +@@ -9,11 +9,13 @@ + #include + #include + #include ++#include + + static void + acpi_power_off (void) + { + printk("%s called\n",__FUNCTION__); ++ disable_local_APIC(); + /* Some SMP machines only can poweroff in boot CPU */ + set_cpus_allowed(current, cpumask_of_cpu(0)); + acpi_enter_sleep_state_prep(ACPI_STATE_S5); --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/do-brk-locked.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/do-brk-locked.dpatch @@ -0,0 +1,230 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Fixed do_brk races. +## DP: Patch author: Marcelo Tosatti +## DP: Upstream status: backport + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN x/arch/mips/kernel/irixelf.c y/arch/mips/kernel/irixelf.c +--- x/arch/mips/kernel/irixelf.c 2004-08-24 17:20:01.000000000 +1000 ++++ y/arch/mips/kernel/irixelf.c 2005-01-07 18:07:31.000000000 +1100 +@@ -127,7 +127,7 @@ + end = PAGE_ALIGN(end); + if (end <= start) + return; +- do_brk(start, end - start); ++ do_brk_locked(start, end - start); + } + + +diff -urN x/arch/x86_64/ia32/ia32_aout.c y/arch/x86_64/ia32/ia32_aout.c +--- x/arch/x86_64/ia32/ia32_aout.c 2004-08-24 17:19:39.000000000 +1000 ++++ y/arch/x86_64/ia32/ia32_aout.c 2005-01-07 18:07:31.000000000 +1100 +@@ -113,7 +113,7 @@ + end = PAGE_ALIGN(end); + if (end <= start) + return; +- do_brk(start, end - start); ++ do_brk_locked(start, end - start); + } + + #if CORE_DUMP +@@ -323,7 +323,7 @@ + pos = 32; + map_size = ex.a_text+ex.a_data; + +- error = do_brk(text_addr & PAGE_MASK, map_size); ++ error = do_brk_locked(text_addr & PAGE_MASK, map_size); + if (error != (text_addr & PAGE_MASK)) { + send_sig(SIGKILL, current, 0); + return error; +@@ -359,7 +359,7 @@ + + if (!bprm->file->f_op->mmap||((fd_offset & ~PAGE_MASK) != 0)) { + loff_t pos = fd_offset; +- do_brk(N_TXTADDR(ex), ex.a_text+ex.a_data); ++ do_brk_locked(N_TXTADDR(ex), ex.a_text+ex.a_data); + bprm->file->f_op->read(bprm->file,(char *)N_TXTADDR(ex), + ex.a_text+ex.a_data, &pos); + flush_icache_range((unsigned long) N_TXTADDR(ex), +@@ -468,7 +468,7 @@ + } + #endif + +- do_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss); ++ do_brk_locked(start_addr, ex.a_text + ex.a_data + ex.a_bss); + + file->f_op->read(file, (char *)start_addr, + ex.a_text + ex.a_data, &pos); +@@ -492,7 +492,7 @@ + len = PAGE_ALIGN(ex.a_text + ex.a_data); + bss = ex.a_text + ex.a_data + ex.a_bss; + if (bss > len) { +- error = do_brk(start_addr + len, bss - len); ++ error = do_brk_locked(start_addr + len, bss - len); + retval = error; + if (error != start_addr + len) + goto out; +diff -urN x/fs/binfmt_aout.c y/fs/binfmt_aout.c +--- x/fs/binfmt_aout.c 2004-12-30 17:04:26.000000000 +1100 ++++ y/fs/binfmt_aout.c 2005-01-07 18:07:31.000000000 +1100 +@@ -50,7 +50,7 @@ + start = PAGE_ALIGN(start); + end = PAGE_ALIGN(end); + if (end > start) { +- unsigned long addr = do_brk(start, end - start); ++ unsigned long addr = do_brk_locked(start, end - start); + if (BAD_ADDR(addr)) + return addr; + } +@@ -323,10 +323,10 @@ + loff_t pos = fd_offset; + /* Fuck me plenty... */ + /* */ +- error = do_brk(N_TXTADDR(ex), ex.a_text); ++ error = do_brk_locked(N_TXTADDR(ex), ex.a_text); + bprm->file->f_op->read(bprm->file, (char *) N_TXTADDR(ex), + ex.a_text, &pos); +- error = do_brk(N_DATADDR(ex), ex.a_data); ++ error = do_brk_locked(N_DATADDR(ex), ex.a_data); + bprm->file->f_op->read(bprm->file, (char *) N_DATADDR(ex), + ex.a_data, &pos); + goto beyond_if; +@@ -347,7 +347,7 @@ + map_size = ex.a_text+ex.a_data; + #endif + +- error = do_brk(text_addr & PAGE_MASK, map_size); ++ error = do_brk_locked(text_addr & PAGE_MASK, map_size); + if (error != (text_addr & PAGE_MASK)) { + send_sig(SIGKILL, current, 0); + return error; +@@ -382,7 +382,7 @@ + + if (!bprm->file->f_op->mmap||((fd_offset & ~PAGE_MASK) != 0)) { + loff_t pos = fd_offset; +- do_brk(N_TXTADDR(ex), ex.a_text+ex.a_data); ++ do_brk_locked(N_TXTADDR(ex), ex.a_text+ex.a_data); + bprm->file->f_op->read(bprm->file, + (char __user *)N_TXTADDR(ex), + ex.a_text+ex.a_data, &pos); +@@ -488,7 +488,7 @@ + error_time = jiffies; + } + +- do_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss); ++ do_brk_locked(start_addr, ex.a_text + ex.a_data + ex.a_bss); + + file->f_op->read(file, (char __user *)start_addr, + ex.a_text + ex.a_data, &pos); +@@ -512,7 +512,7 @@ + len = PAGE_ALIGN(ex.a_text + ex.a_data); + bss = ex.a_text + ex.a_data + ex.a_bss; + if (bss > len) { +- error = do_brk(start_addr + len, bss - len); ++ error = do_brk_locked(start_addr + len, bss - len); + retval = error; + if (error != start_addr + len) + goto out; +diff -urN x/fs/binfmt_elf.c y/fs/binfmt_elf.c +--- x/fs/binfmt_elf.c 2004-12-30 17:04:26.000000000 +1100 ++++ y/fs/binfmt_elf.c 2005-01-07 18:07:31.000000000 +1100 +@@ -87,7 +87,7 @@ + start = ELF_PAGEALIGN(start); + end = ELF_PAGEALIGN(end); + if (end > start) { +- unsigned long addr = do_brk(start, end - start); ++ unsigned long addr = do_brk_locked(start, end - start); + if (BAD_ADDR(addr)) + return addr; + } +@@ -407,7 +407,7 @@ + + /* Map the last of the bss segment */ + if (last_bss > elf_bss) { +- error = do_brk(elf_bss, last_bss - elf_bss); ++ error = do_brk_locked(elf_bss, last_bss - elf_bss); + if (BAD_ADDR(error)) + goto out_close; + } +@@ -447,7 +447,7 @@ + goto out; + } + +- do_brk(0, text_data); ++ do_brk_locked(0, text_data); + if (!interpreter->f_op || !interpreter->f_op->read) + goto out; + if (interpreter->f_op->read(interpreter, addr, text_data, &offset) < 0) +@@ -455,7 +455,7 @@ + flush_icache_range((unsigned long)addr, + (unsigned long)addr + text_data); + +- do_brk(ELF_PAGESTART(text_data + ELF_MIN_ALIGN - 1), ++ do_brk_locked(ELF_PAGESTART(text_data + ELF_MIN_ALIGN - 1), + interp_ex->a_bss); + elf_entry = interp_ex->a_entry; + +@@ -1006,7 +1006,7 @@ + len = ELF_PAGESTART(elf_phdata->p_filesz + elf_phdata->p_vaddr + ELF_MIN_ALIGN - 1); + bss = elf_phdata->p_memsz + elf_phdata->p_vaddr; + if (bss > len) +- do_brk(len, bss - len); ++ do_brk_locked(len, bss - len); + error = 0; + + out_free_ph: +diff -urN x/include/linux/mm.h y/include/linux/mm.h +--- x/include/linux/mm.h 2004-12-30 17:04:27.000000000 +1100 ++++ y/include/linux/mm.h 2005-01-07 18:07:31.000000000 +1100 +@@ -664,6 +664,7 @@ + extern int do_munmap(struct mm_struct *, unsigned long, size_t); + + extern unsigned long do_brk(unsigned long, unsigned long); ++extern unsigned long do_brk_locked(unsigned long, unsigned long); + + /* filemap.c */ + extern unsigned long page_unuse(struct page *); +diff -urN x/mm/mmap.c y/mm/mmap.c +--- x/mm/mmap.c 2004-12-30 17:04:27.000000000 +1100 ++++ y/mm/mmap.c 2005-01-07 18:07:31.000000000 +1100 +@@ -1697,6 +1697,20 @@ + + EXPORT_SYMBOL(do_brk); + ++/* locking version of do_brk. */ ++unsigned long do_brk_locked(unsigned long addr, unsigned long len) ++{ ++ unsigned long ret; ++ ++ down_write(¤t->mm->mmap_sem); ++ ret = do_brk(addr, len); ++ up_write(¤t->mm->mmap_sem); ++ ++ return ret; ++} ++ ++EXPORT_SYMBOL(do_brk_locked); ++ + /* Release all mmaps. */ + void exit_mmap(struct mm_struct *mm) + { +diff -urN x/mm/nommu.c y/mm/nommu.c +--- x/mm/nommu.c 2004-08-24 17:19:06.000000000 +1000 ++++ y/mm/nommu.c 2005-01-07 18:07:31.000000000 +1100 +@@ -227,6 +227,11 @@ + return mm->brk = brk; + } + ++unsigned long do_brk_locked(unsigned long addr, unsigned long len) ++{ ++ return -ENOMEM; ++} ++ + /* + * Combine the mmap "prot" and "flags" argument into one "vm_flags" used + * internally. Essentially, translate the "PROT_xxx" and "MAP_xxx" bits --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/doc-post_halloween.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/doc-post_halloween.dpatch @@ -0,0 +1,1289 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: add post-halloween-2.6.txt +## DP: Patch author: unknown +## DP: Upstream status: not submitted + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN kernel-source-2.6.6/Documentation/post-halloween-2.6.txt kernel-source-2.6.6-1/Documentation/post-halloween-2.6.txt +--- kernel-source-2.6.6/Documentation/post-halloween-2.6.txt 1970-01-01 10:00:00.000000000 +1000 ++++ kernel-source-2.6.6-1/Documentation/post-halloween-2.6.txt 2004-02-23 08:01:43.000000000 +1100 +@@ -0,0 +1,1274 @@ ++ ++ The post-halloween document. v0.48 ++ (aka, 2.6 - what to expect) ++ ++ Dave Jones ++ ++ (Updated as of 2.6.0) ++ ++This document explains some of the new functionality to be found in the 2.6 ++Linux kernel, some pitfalls you may encounter, and also points out some new ++features which could really use testing. ++Note, that "contact foo@bar.com" below also implies that you should also ++cc: linux-kernel@vger.kernel.org. ++ ++Latest version of this document can always be found at ++http://www.codemonkey.org.uk/docs/post-halloween-2.6.txt ++ ++Thanks to many [far too many to list] people for valuable feedback. ++ ++Note, that this document is somewhat x86-centric, but most features ++documented here affect all platforms anyway. ++ ++Translations: ++Spanish - http://www.terra.es/personal/diegocg/post-halloween-2.6.es.txt ++German - http://www.kubieziel.de/computer/halloween-german.html ++Polish - http://soltysiak.com/linux/post-halloween-2.6.pl.txt ++pt_BR - http://www.maluco.com.br/thiago/docs/post-halloween-2.6-pt_BR.txt ++ ++ ++Applying patches. ++~~~~~~~~~~~~~~~~~ ++- In 2.4 and previous kernels, the recommended way to apply patches was ++ to use a command line such as ... ++ gzip -cd patchXX.gz | patch -p0 ++ In 2.6, Linus started adding an extra path element to the diffs, ++ so using -p1 in the untarred 'to be patched' directory is necessary. ++ ++Reporting bugs. ++~~~~~~~~~~~~~~~ ++Most large subsystems of the kernel have their own mailing list. ++Mailing these with bug reports is always good. If in doubt, send ++them to linux-kernel@vger.kernel.org ++ ++ ACPI - acpi-devel@lists.sourceforge.net ++ Bluetooth - bluez-devel@lists.sourceforge.net ++ Ext2 - ext2-devel@lists.sourceforge.net ++ Firewire - linux1394-devel@lists.sourceforge.net ++ SCSI - linux-scsi@vger.kernel.org ++ USB - linux-usb-users@lists.sourceforge.net ++ XFS - linux-xfs@oss.sgi.com ++ ++Known gotchas. ++~~~~~~~~~~~~~~ ++Certain known bugs are being reported over and over. Here are the ++workarounds. ++- Blank screen after decompressing kernel? ++ Make sure your .config has ++ CONFIG_INPUT=y ++ CONFIG_VT=y ++ CONFIG_VGA_CONSOLE=y ++ CONFIG_VT_CONSOLE=y ++ A lot of people have discovered that taking their .config from 2.4 and ++ running make oldconfig to pick up new options leads to problems, notably ++ with CONFIG_VT not being set. ++- An additional bug biting some people is that NICs fail to receive packets ++ (usually notable by a NIC not getting a DHCP lease for eg, despite being ++ sent one by the server). Booting with "noapic" "acpi=off" or a combination ++ of both fixes this for most people. ++- (Possibly linked to above bug) VIA APIC routing is currently broken. ++ boot with 'noapic'. ++- Can't load any modules? You need updated tools (See modules section below). ++- depmod reports Unresolved symbols? depmod from modutils instead of ++ depmod from module-init-tools is first in $PATH (might be different ++ $PATHs as $USER and $ROOT) ++ ++ ++Regressions. ++~~~~~~~~~~~~ ++(Things not expected to work just yet) ++- The hptraid/promise drivers for proprietary RAID formats are currently ++ non functional, and will probably be converted to use device-mapper. ++- Some filesystems still need work (Intermezzo, UFS, HFS, HPFS..) ++ - UMSDOS fs is currently missing, pending rewrite. ++ - EFS (has a blocksize problem, depending on the device that the ++ filesystem is being mounted on) ++- A number of drivers don't compile currently due to them needing various ++ work to convert them to the new APIs ++- The format of /proc/stat changed, which could break some ++ applications that still depend on the old layout. ++- Some people seem to have trouble running rpm, most notably Red Hat 9 users. ++ This is a known bug of rpm. ++ Workaround: run "export LD_ASSUME_KERNEL=2.2.5", before running rpm. ++ This is thought to be a bug related to db4 and O_DIRECT interaction. ++ ++ ++Stuff needing forward porting from 2.4. ++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++- HFSPlus ++- SuperH 64 ++ ++ ++Removed features. ++~~~~~~~~~~~~~~~~~ ++- khttpd is gone. ++- Older Direct Rendering Manager (DRM) support (For XFree86 4.0) ++ has been removed. Upgrade to XFree86 4.1.0 or higher. ++- LVM1 has been removed. See Device-mapper below. ++- The system call table is no longer exported. Any module that relied ++ on this previously will no longer work. ++- Soundmodem hamradio support has been removed. Its functionality ++ has been superceded by a userspace replacement. ++ http://www.baycom.org/~tom/ham/soundmodem ++- Direct booting from floppy is no longer supported. ++ You should now use a boot loader program such as syslinux instead. ++ "make bzdisk" continues to work (now using syslinux). ++- Callout tty devices (/dev/cua) have been deprecated since 2.1.90pre2. ++ Support is now removed. ++ ++ ++Deprecated/obsolete features. ++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++- devfs will be obsoleted in favour of udev (http://www.kernel.org/pub/linux/utils/kernel/hotplug/) ++- boot time root= parsing changed. ++ ramdisks are now ram instead of rd and cm206 is cm206cd (instead of ++ cm206). ++- usbdevfs will be going away in 2.7. The same filesystem can ++ be mounted as 'usbfs' in recent 2.4 kernels, and in 2.5.52 ++ and above, which is what the filesystem will furthermore be ++ known as. ++- elvtune is deprecated (as are the ioctl's it used). ++ Instead, the io scheduler tunables are exported in sysfs (see below) ++ in the /sys/block//queue/iosched directory. ++ Jens wrote a document explaining the tunables of the new scheduler at ++ http://www.lib.uaa.alaska.edu/linux-kernel/archive/2002-Week-44/att-deadline-iosched.txt ++- Using sysctls by numeric values is deprecated, and will go away ++ in the next development series. ++ ++ ++Modules. ++~~~~~~~~ ++- The in-kernel module loader was reimplemented. ++- You need replacement module utilities from ++ http://www.kernel.org/pub/linux/kernel/people/rusty/modules/ ++- A backwards compatible set of module utilities is also available ++ from the same URL in RPM format. ++- Debian sarge/sid or Conectiva snapshot users can just use ++ 'apt-get install module-init-tools' ++- Modules now free stuff marked with __init or __initdata. ++- For Red Hat users, there's another pitfall in "/etc/rc.sysinit". ++ During startup, the script sets up the binary used to dynamically load ++ modules stored at "/proc/sys/kernel/modprobe". The initscript looks ++ for "/proc/ksyms", but since it doesn't exist in 2.6 kernels, the ++ binary used is "/sbin/true" instead. ++ ++ This, eventually, will keep modules from working. Red Hat users will ++ have to patch the "/etc/rc.sysinit" script to set ++ "/proc/sys/kernel/modprobe" to "/sbin/modprobe", even ++ when "/proc/ksyms" doesn't exist. ++- Modules now have a .ko suffix instead of .o ++- Some (older) versions of 'mkinitrd' don't search for modules ++ that end with .ko, so update your mkinitrd if this is a problem. ++ ++ ++Kernel build system. ++~~~~~~~~~~~~~~~~~~~~ ++- The build system is much improved compared to 2.4. ++ You should notice quicker builds, and less spontaneous rebuilds ++ of files on subsequent builds from already built trees. ++- There are new graphical config tools. ++ "make xconfig" now requires the qt libraries. ++ "make gconfig" uses gtk libraries. ++- Make menuconfig/oldconfig has no user-visible changes other than speed, ++ whilst numerous improvements have been made. ++- Several new debug targets exist: 'allyesconfig' 'allnoconfig' 'allmodconfig'. ++- Note: The new configuration system is not CML2 related. ++- Also note: Whilst some ideas were taken from it, Keith Owens' ++ kbuild-2.5 project was not integrated. ++- "make" is now the preferred command, without a target; it does ++ and modules. ++- "make -jN" is now the preferred parallel-make execution. ++ Do not bother to provide "MAKE=xxx" ++- The build is now much less verbose. If you want to see exactly what's ++ going on, try "make V=1" or set KBUILD_VERBOSE=1 in your environment. ++- 'make kernel/mm.o' will build the named file, provided a ++ corresponding source exists. This also works for (non-composite) ++ modules. (FIXME: broken for modules right now?) ++- 'make kernel/' will compile all files in a subdirectory and below. ++- There is no need to run 'make dep' at any stage. ++- 'make help' provides a list of typical targets, including debugging targets. ++- You can now build in a separate tree from the source by doing ++ make O=builddir ++ ++ ++IO subsystem. ++~~~~~~~~~~~~~ ++- You should notice considerable throughput improvements over 2.4 due ++ to much reworking of the block and the memory management layers. ++- Report any regressions in this area to Jens Axboe ++ and Andrew Morton ++- Two different IO elevators are available. The default is the ++ anticipatory IO scheduler. You can select the deadline scheduler by ++ booting with "elevator=deadline" on the kernel command line. ++- For some workloads the anticipatory scheduler is around 10% slower ++ than deadline. Most notably, database workloads which seek all over the ++ disk performing reads and synchronous writes. Database folks will likely ++ want to boot with elevator=deadline to get that last bit of performance back. ++- Assorted changes throughout the block layer meant various block ++ device drivers had a large scale cleanup whilst being updated to ++ newer APIs. ++- The size and alignment of O_DIRECT file IO requests now matches that ++ of the device, not the filesystem. Typically this means that you ++ can perform O_DIRECT IO with 512-byte granularity rather than 4k. ++ But if you rely upon this, your application will not work on 2.4 kernels ++ and will not work on some devices. ++ ++ ++block device size support. ++~~~~~~~~~~~~~~~~~~~~~~~~~~ ++- Thanks to work done by Peter Chubb, block devices can now access up to ++ 16TB on 32-bit architectures, and up to 8EB on 64-bit architectures. ++- To use the new BLKGETSZ64 ioctls, you'll need updated file-utils. ++ (Currently only jfsutils 1.0.20 has this change, patches for other ++ filesystems are still pending merging) ++- The old 'struct statfs' is not able to describe large devices - the ++ statfs() system call will now return -EOVERFLOW for such devices. ++ A new system call called statfs64() with a new structure has been added ++ to support large devices. It it unknown at time of writing how many ++ userspace utilities have been converted to take advantage of this ++ syscall when available. ++ ++ ++POSIX ACLs & Extended attributes. ++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++- Userspace tools available at http://acl.bestbits.at ++ ++ ++VM Changes. ++~~~~~~~~~~~ ++- Version zero swap partitions are no longer supported (everything is ++ using v1 now anyway - rerun mkswap if in doubt). ++ Linux 2.0.x requires v0 swap space, Linux v2.1.117 and later ++ support v1. mkswap(8) can format swap space in either format. ++- The actual 'reverse mappings' part of Rik van Riel's rmap vm was merged. ++ VM behaviour under certain loads should improve. ++- VM misbehaviour should be reported to linux-mm@kvack.org ++- The VM explicitly checks for sparse swapfiles, and aborts if one is found. ++- /proc/sys/vm/swappiness defines the kernel's preference for pagecache over ++ mapped memory. Setting it to 100 (percent) makes it treat both types of ++ memory equally. Setting it to zero makes the kernel very much prefer to ++ reclaim plain pagecache rather than mapped-into-pagetables memory. ++- The bdflush() syscall is now officially deprecated. The syscall ++ does nothing, and prints a stern warning to users. The functionality ++ is replaced by the pdflush daemons. ++- Due to various changes, swap files should be just as fast as swap partitions. ++- In 2.4, up to 64 swap files were possible. In 2.6, this number is reduced ++ to 32. Like 2.4, these files can be up to 64GB in size, though you will ++ need a recent util-linux to have a mkswap utility that supports >2GB ++ ++ ++Kernel preemption. ++~~~~~~~~~~~~~~~~~~ ++- The much talked about preemption patches made it into 2.6. ++ With this included you should notice much lower latencies especially ++ in demanding multimedia applications. ++- Note, there are still cases where preemption must be temporarily disabled ++ where we do not. These areas occur in places where per-CPU data is used. ++- If you get "xxx exited with preempt count=n" messages in syslog, ++ don't panic, these are non fatal, but are somewhat unclean. ++ (Something is taking a lock, and exiting without unlocking) ++- If you DO notice high latency with kernel preemption enabled in ++ a specific code path, please report that to Andrew Morton ++ and Robert Love . ++ The report should be something like "the latency in my xyz application ++ hits xxx ms when I do foo but is normally yyy" where foo is an action ++ like "unlink a huge directory tree". ++ ++ ++Process scheduler improvements. ++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++- Another much talked about feature. Ingo Molnar reworked the process ++ scheduler to use an O(1) algorithm. In operation, you should notice ++ no changes with low loads, and increased scalability with large numbers ++ of processes, especially on large SMP systems. ++- Scheduler is now Hyperthreading SMP aware and will disperse processes ++ over physically different CPUs, instead of just over logical CPUs. ++- Robert Love wrote various utilities for changing behaviour of the ++ scheduler (binding processes to CPUs etc). You can find these tools at ++ http://tech9.net/rml/schedutils ++- The behavior of sched_yield() changed a lot. A task that uses ++ this system call should now expect to sleep for possibly a very ++ long time. Tasks that do not really desire to give up the ++ processor for a while should probably not make heavy use of this ++ function. Unfortunately, some GUI programs (like Open Office) ++ do make excessive use of this call and under load their ++ performance is poor. It seems this new 2.6 behavior is optimal ++ but some user-space applications may need fixing. ++- The above applies to use of yield() in the kernel, too. ++- 2.6 adds system calls for manipulating a task's processor ++ affinity: sched_getaffinity() and sched_setaffinity() ++- Regressions to mingo@redhat.com and rml@tech9.net ++- Debian users who encounter effects such as skips in mp3 ++ playback, jerky mouse movement may want to stop the ++ X server from renicing itself to -10 ++ You can alter this permanently with 'dpkg-reconfigure xserver-common'; ++ if you elect not to have /etc/X11/Xwrapper.config managed by debconf, ++ simply edit it directly. ++- Balancing of IRQs between multiple CPUs should be handled using the ++ irqbalance (http://people.redhat.com/arjanv/irqbalance/) program. ++- David Mosberger maintains a webpage containing some current 'known gotchas' ++ of the O(1) scheduler at http://www.hpl.hp.com/research/linux/kernel/o1.php ++ ++ ++PCI. ++~~~~ ++- PCI domain support has been added. For most people, this just means that ++ all PCI slot names are extended with "0000:" on the front, but for people ++ with bigger servers it means they're able to access all their PCI devices. ++- More hotplug drivers have been added, including a fake PCI hotplug driver ++ so people without specialised hardware can test hotplug features. ++ ++Random. ++~~~~~~~ ++- /dev/hwrandom got support for some new hardware (now also backported to 2.4) ++ such as the HW RNG on newer VIA Cyrix CPUs. ++- rng-tools can be found at http://sourceforge.net/projects/gkernel ++ ++ ++Fast userspace mutexes (Futexes). ++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++- Rusty Russell added functionality that allows userspace to have ++ fast mutexes that only use syscalls when there is contention. Used by ++ NPTL. ++- Additional information on futexes can be found in Ulrich Dreppers ++ paper on the subject at http://people.redhat.com/drepper/futex.pdf ++- Bert Hubert has written some documentation on this functionality ++ at http://ds9a.nl/futex-manpages ++ ++ ++epoll ++~~~~~ ++Davide Libenzi wrote an event based poll replacement that got ++included in 2.6. More info available at ++http://www.xmailserver.org/linux-patches/nio-improve.html ++http://lwn.net/Articles/13587/ ++ ++ ++Threading improvements. ++~~~~~~~~~~~~~~~~~~~~~~~ ++- Ingo Molnar put a lot of work into threading improvements for 2.6. ++ Some of the features of this work are: ++ - Generic pid allocator (arbitrary number of PIDs with no slowdown, ++ unified pidhash). ++ - Thread Local Storage syscalls ++ - sys_clone() enhancements (CLONE_SETTLS, CLONE_PARENT_SETTID, CLONE_SETTID, ++ CLONE_CLEARTID, CLONE_DETACHED) ++ - POSIX thread signals stuff (atomic signals, shared signals, etc.) ++ - Per-CPU GDT ++ - Threaded coredumping support ++ - sys_exit() speedups (O(1) exit) ++ - Generic, improved futexes, vcache ++ - New, threading related ptrace features ++ - exit/fork task cache ++ - /proc updates for threading ++ - API changes for threading. ++- Users should notice a significant speedup in basic thread operations. ++ This is true to a lesser extent even for old-threading userspace libraries ++ such as LinuxThreads. ++- Regressions should go to Ingo Molnar and ++ phil-list@redhat.com. Regressions could happen in the area of signal ++ handling and related threading semantics, plus coredumping. ++- Native Posix Threading Library (NPTL). ++ Ulrich Drepper worked closely with Ingo on the threading enhancements, and ++ developed a 1:1 model threading library. You can find out more about NPTL at ++ http://people.redhat.com/drepper/nptl-design.pdf ++ ++ ++Enhanced coredumping. ++~~~~~~~~~~~~~~~~~~~~~ ++- 2.6 offers you the ability to configure the way core files are ++ named through a /proc/sys/kernel/core_pattern file. ++ You can use various format identifiers in this name to affect ++ how the core dump is named. ++ ++ %p - insert pid into filename ++ %u - insert current uid into filename ++ %g - insert current gid into filename ++ %s - insert signal that caused the coredump into the filename ++ %t - insert UNIX time that the coredump occurred into filename ++ %h - insert hostname where the coredump happened into filename ++ %e - insert coredumping executable name into filename ++ ++ You should ensure that the string does not exceed 64 bytes. ++- Multithreaded processes can now dump core ++ ++ ++Input layer. ++~~~~~~~~~~~~ ++- Possibly the most visible change to the end user. If misconfigured, ++ you'll find that your keyboard/mouse/other input device will no longer work. ++ 2.6 offers a much more flexible interface to devices such as keyboards. ++- The downside is more confusing options. ++ In the "Input device support" menu, be sure to enable at least the following. ++ ++ --- Input I/O drivers ++ < > Serial i/o support ++ < > i8042 PC Keyboard controller ++ [ ] Keyboards ++ [ ] Mice ++ ++ (Also choose the relevant keyboard/mouse from the list) ++ ++- If you find your keyboard/mouse still don't work, edit the file ++ drivers/input/serio/i8042.c, and replace the #undef DEBUG ++ with a #define DEBUG, recompile and reinstall. ++ ++ When you boot, you should now see a lot more debugging information. ++ Forward this information to Vojtech Pavlik ++ ++- If you use a KVM switcher, and experience problems, booting with the boot ++ time argument 'psmouse_noext' should fix your problems. ++- Users of multimedia keys without X will see changes in how the kernel ++ handles those keys. People who customize keymaps or keycodes in 2.4 ++ may need to make some changes in 2.6 ++- Users wanting support for the PC speaker need to enable CONFIG_INPUT_PCSPKR, ++ or you won't get a single beep. ++- Synaptics touchpad users may be interested to check out ++ http://w1.894.telia.com/~u89404340/touchpad/ ++- In 2.4 users of Japanese keyboards were able to type '|' or ++ '\' characters without loading any custom keymap on the ++ console. With the keymap in 2.6, this is not possible ++ anymore. People with these keyboards have to load a keymap ++ with loadkeys rebuilt from the source, since loadkeys in some ++ vendor distributions cannot load keycodes larger than 127. ++ There is a patch to fix this, but it has not been integrated ++ (http://tinyurl.com/t75a). ++ ++PnP layer. ++~~~~~~~~~~ ++- Support for plug and play devices such as early ISAPnP cards has improved a ++ lot in the 2.6 kernel. The new code behaves more closely to the code ++ handling PCI devices (probe, remove etc callbacks), and also merges ++ PnP BIOS access code. ++- Report any regressions in plug & play functionality to ++ Adam Belay ++ ++ ++ALSA. ++~~~~~ ++- The advanced linux sound architecture was merged into 2.6. ++ This offers considerably improved functionality over the older OSS drivers, ++ but requires new userspace tools. ++- Several distros have shipped ALSA for some time, so you may already have the ++ necessary tools. If not, you can find them at http://www.alsa-project.org/ ++- ALSA can emulate OSS interface using the snd_pcm_oss/snd_pcm_mixer ++ modules, if your card produces nothing but silence, you may need to run ++ alsamixer to unmute channels wich /dev/mixer doesn't see ++- Note that the OSS drivers are also still functional, and still present. ++ Many features/fixes that went into 2.4 are still not applied to these ++ drivers, and it's still unclear if they will remain when 2.6 ships. ++ The long term goal is to get everyone moved over to (the superior) ALSA. ++ ++ ++AGP. ++~~~~ ++- The agpgart driver got a long overdue cleanup which involved ++ splitting it into an agpgart core, and per-chipset drivers. ++ You may need to adjust your modules configuration to autoload ++ the chipset drivers on loading the agpgart module. ++- Generic AGP 3.0 support is now included. ++ ++DRI. ++~~~~ ++- Direct rendering in 2.6 hasn't had much (if any?) testing on ++ older versions of XFree86. Feedback on whether 4.1 works would ++ be useful. ++ ++ ++Faster system calls. ++~~~~~~~~~~~~~~~~~~~~ ++- Systems that support the SYSENTER extension (Basically Intel Pentium-II ++ and above, and AMD Athlons) now have a faster method of making the ++ transition from userspace to kernelspace when a syscall is performed. ++- Pentium Pro also has SYSENTER, but due to errata, is unusable. ++- Without an updated glibc, this will not be noticable. ++- VMWare 4 users may get crashes due to this. ++ Zwane Mwaikambo wrote a patch for a "nosysenter" option which is worth ++ googling for if there isn't a vmware update available. ++- Regressions to torvalds@osdl.org and libc-alpha@sources.redhat.com ++ ++ ++procps. ++~~~~~~~ ++- The 2.6 /proc filesystems changed some statistics, which confuse older ++ versions of procps. Rik van Riel and Robert Love have been maintaining a ++ version of procps during the development of 2.6 which tracks changes to ++ /proc which you can find at http://tech9.net/rml/procps/ ++- Alternatively, the procps by Albert Cahalan now supports the altered formats ++ since v3.0.5 -- http://procps.sf.net/ ++- The /proc/meminfo format changed slightly which also broke gtop in strange ++ ways. Likely this also broke some of the KDE/GNOME panel applets. ++ ++ ++Framebuffer layer. ++~~~~~~~~~~~~~~~~~~ ++- James Simmons has reworked the framebuffer/console layer considerably for ++ 2.6. Support for some cards is still lagging a little, but it should be ++ functionally no different than previous incarnations. ++- boot time arguments may have changed depending on your driver. ++ an example of the change is.. ++ append = "video=radeon:1024x768-24@100" ++ needs to become.. ++ append = "video=radeonfb:1024x768-24@100" ++- Current userspace tools (fbset for eg) are not yet updated, ++ and won't function as expected. ++- The VESA framebuffer now enables MTRRs for the framebuffer memory range during ++ initialisation (Note: PCI cards only). ++ If you notice screen corruption, please report this, along with an lspci output, ++ so your card can be blacklisted. ++- Any problems should go to ++ ++ ++IDE. ++~~~~ ++- The IDE code rewrite was subject to much criticism in early 2.5.x, which ++ put off a lot of people from testing. This work was then subsequently ++ dropped, and reverted back to a 2.4.18 IDE status. ++ Since then additional work has occurred, but not to the extent ++ of the first cleanup attempts. ++- Known problems with the current IDE code. ++ o Simplex IDE devices (eg Ali15x3) are missing DMA sometimes ++ o Most PCMCIA devices have unload races and may oops on eject ++ o Modular IDE does not yet work, modular IDE PCI modules sometimes ++ oops on loading ++ o ide-scsi is completely broken in 2.6 currently. Known problem. ++ If you need it either use 2.4 or fix it 8) ++- IDE disk geometry translators like OnTrack, EZ Partition, Disk Manager ++ are no longer autodetected. The only way forward is to remove the translator ++ from the drive, and start over, or use boot parameters depending on the ++ type of remapper used :- ++ hdx=remap63 - add 63 to each sector (For OnTrack DM) ++ hdx=remap - remap 0->1 (For EZDrive) ++- See also the CD Recording section for some important changes ++ related to IDE CD writers. ++ ++IDE TCQ. ++~~~~~~~~ ++- Tagged command queueing for IDE devices has been included. ++- Not all combinations of controllers & devices may like this, ++ so handle with care. ++ READ AS: ** Don't use IDE TCQ on any data you value. ++ It's likely bad combinations will be blacklisted as and when discovered. ++ ++- If you didn't choose the "TCQ on by default" option, you can enable ++ it by using the command ++ ++ echo "using_tcq:32" > /proc/ide/hdX/settings ++ ++ (replacing 32 with 0 disables TCQ again). ++ ++- Report success/failure stories to Jens Axboe with ++ inclusion of hdparm -i /dev/hdX, and lspci output. ++ ++ ++SCSI. ++~~~~~ ++- Various SCSI drivers still need work, and don't even compile. ++- Various drivers currently lack error handling. ++ These drivers will cause warnings during compilation due to ++ missing abort: & reset: functions. ++- Note, that some drivers have had these members removed, but still ++ lack error handling. Those noticed so far are ncr53c8xxx, sym53c8xx ++- large dev_t support allowing thousands of disks to be ++ supported (was 128 or 256 in the 2.4 series) ++- major code cleanup, initially to support the block layer (bio) ++ improvements have led to: ++ - better throughput (?) [less double handling of data] ++ - per HBA locks (there was a single io_request_lock in ++ the 2.4 series) ++ - more flexible interface to HBA drivers ++ - better hotplug support, especially for USB mass storage ++ and ieee1394 sbp2 devices [well it's work_in_progress] ++- improved error processing and scanning code (support for ++ large, sparse lun spaces) ++- lots of scsi driver internals available via sysfs ++ ++ ++v4l2. ++~~~~~ ++- The video4linux API finally got its long awaited cleanup. ++- xawtv, bttv and most other existing v4l tools are also compatible ++ with the new v4l2 layer. You should notice no loss in functionality. ++- See http://bytesex.org/v4l/ for more information. ++ ++ ++Quota reworking. ++~~~~~~~~~~~~~~~~ ++The new quota system needs new tools. Supports 32 bit uids. ++http://www.sf.net/projects/linuxquota/ ++ ++ ++CD Recording. ++~~~~~~~~~~~~~ ++- Jens Axboe added the ability to use DMA for writing CDs on ++ ATAPI devices. Writing CDs should be much faster than it ++ was in 2.4, and also less prone to buffer underruns and the like. ++- With a recent cdrecord, you also no longer need ide-scsi in order to use ++ an IDE CD writer. ++- Ripping audio tracks off of CDs now also uses DMA and should be ++ notably faster. You can also find an updated cdda2wav at: ++ *.kernel.org/pub/linux/kernel/people/axboe/tools/ ++- Send good/bad reports of audio extraction with cdda2wav and burning with ++ the cdrecord to Jens Axboe ++- Currently only 'open by device name' works in cdrecord. ++ cdrecord -dev=/dev/hdX -inq ++- More info at http://lwn.net/Articles/13538/ & http://lwn.net/Articles/13160/ ++ ++ ++USB: ++~~~~ ++- USB host controller drivers were renamed in 2.6. They are now ++ uhci-hcd for UHCI controllers. ++ ohci-hcd for OHCI controllers. ++ ehci-hcd for EHCI (USB 2.0) controllers. ++- Very little user visible changes, the only noticable 'major' change ++ is that there is now only one UHCI driver. As noted elsewhere, usbdevfs ++ was renamed to usbfs. ++- USB-storage has changed behaviour. A device which is disconnected and ++ then reconnected is not reassociated with the old /dev node. ++- USB storage also got several performance enhancements. ++ ++- USB 'gadget' support. ++ There's a new "USB Gadget" API supporting USB devices that ++ run Linux inside. Examples include PDAs, cable modems, ++ and some printers. That API is how the driver for the ++ USB Device Controller (UDC) hardware talks with portable ++ "gadget drivers". A gadget driver is what makes that ++ hardware act like a "network link" or a "printer". ++ ++ When you don't want to write a gadget driver in the kernel, ++ then "gadgetfs" lets you do it in user mode programs. ++ Each endpoint appears as a single file, so it's a lot ++ simpler than "usbfs". Currently it's purely synchronous, ++ but it should be natural for someone to add AIO support. ++ ++ See http://www.linux-usb.org/gadget for more information ++ about this API framework, including a pthreaded example ++ "gadgetfs" program. See the 2.6 kerneldoc for API info. ++ ++ ++Nanosecond stat: ++~~~~~~~~~~~~~~~~ ++The stat64() syscall was changed to return jiffies granularity. ++This allows make(1) to make better decisions on whether or not it ++needs to recompile a file. Not all filesystems may support such precision. ++ ++ ++Filesystems: ++~~~~~~~~~~~~ ++A number of additional filesystems have made their way into 2.6. ++Currently it supports: ext2, ext3, reiserfs, jfs, xfs, minix, romfs, ++iso9660, udf, msdos, vfat, ntfs (ro), adfs, amiga ffs, apple macintosh hfs, ++BeOS befs (ro), bfs, efs (ro), cramfs, free vxfs, os/2 hpfs, qnx4fs, ++sysvfs, ufs. ++Whilst these have had testing out of tree, the level of testing ++after merging is unparalleled. Be wary of trusting data to immature ++filesystems. A number of new features and improvements have also ++been made to the existing filesystems from 2.4. ++ ++Reports of stress testing with the various tools available would ++be beneficial. ++ ++ ++Generic VFS changes. ++~~~~~~~~~~~~~~~~~~~~ ++- Since Linux 2.5.1 it is possible to atomically move a subtree to ++ another place. The usage is... ++ mount --move olddir newdir ++- Since 2.5.43, dmask=value sets the umask applied to directories only. ++ The default is the umask of the current process. ++ The fmask=value sets the umask applied to regular files only. ++ Again, the default is the umask of the current process. ++- Directories can now be marked as synchronous using chattr +S, ++ so that all changes will be immediately written to disk. ++ Note, this does not guarantee atomicity, at least not for all filesystems ++ and for all operations. You *can* be guaranteed that system calls will ++ not return until the changes are on disk; note though that this does have ++ has some significant performance impacts. ++ ++ ++ ++devfs. ++~~~~~~ ++- devfs was somewhat stripped down and a lot of duplicate functionality ++ was removed. You now need to enable CONFIG_DEVPTS_FS=y and mount ++ the devpts filesystem in the same manner you would if you were not ++ using devfs. ++ ++ ++EXT2. ++~~~~~ ++- 2.5.49 included an extension to ext2 which will cause it to not attach ++ buffer_head structures to file or directory pagecache at all, ever. ++ This is for the big highmem machines. It is enabled via the `-o nobh' ++ mount option. ++- The ext2 filesystem is now using finer-grained locking which yields reduced ++ context switch rates and higher throughput on large SMP machines. ++ ++ ++EXT3. ++~~~~~ ++- The ext3 filesystem has gained indexed directory support, which offers ++ considerable performance gains when used on filesystems with directories ++ containing large numbers of files. ++- In order to use the htree feature, you need at least version 1.32 of ++ e2fsprogs. ++- Existing filesystems can be converted using the command ++ ++ tune2fs -O dir_index /dev/hdXXX ++ ++- The latest e2fsprogs can be found at ++ http://prdownloads.sourceforge.net/e2fsprogs ++- The ext2 and ext3 filesystems have new file allocations policies (the "Orlov ++ allocator") which will place subdirectories closer together on-disk. This ++ tends to mean that operations which touch many files in a directory tree are ++ much faster if that tree was created under a 2.6 kernel. ++ ++Reiserfs. ++~~~~~~~~~ ++- Reiserfs now supports inode attributes such as immutable. ++ (Also included in 2.4.17, so not really 'new'). ++- Relocated/non-standard size journal support (also backported ++ to 2.4.22pre3) ++- Support for writes larger than 4KB in size, which means speedups ++ on large file writes, esp in append mode, should also be more ++ SMP friendly. ++- Variable blocksize support. (Ie, you can choose any blocksize ++ in the range of 1024 .. PAGE_CACHE_SIZE, must be power of 2). ++ ++ ++NFS. ++~~~~ ++- Basic support has been added for NFSv4 (server and client) ++- Additionally, kNFSD now supports transport over TCP. ++ This experimental feature is also backported to 2.4.20 ++- Interoperability reports with other OS's would be useful. ++- v1.0.3 of nfs-utils supports the newer 2.6 kernels change ++ of kdev_t type. You can grab it at http://nfs.sourceforge.net ++- Problems to nfs@lists.sourceforge.net ++ ++ ++NTFS. ++~~~~~ ++- A new, rewritten NTFS driver was merged for 2.6. It has the ++ following main benefits over the old driver: ++ - SMP and reentrant safe ++ - support bigger than 4 kB cluster sizes ++ - full support for sparse files on W2K/XP/W2K3 ++ - mmap() support ++ - More stable, and much faster than the previous NTFS driver. ++ - Still read-only, but with safe file overwrite support without changes ++ to the file size ++ - More information is available at http://linux-ntfs.sf.net ++ ++ ++sysfs. ++~~~~~~ ++In simple terms, the sysfs filesystem is a saner way for ++drivers to export their innards than /proc. ++This filesystem is always compiled in, and can be mounted ++just like another virtual filesystem. No userspace tools ++beyond cat(1) and echo(1) are needed. tree(1) is also good for ++viewing its overall structure. ++ ++ mount -t sysfs none /sys ++ ++See Documentation/filesystems/sysfs.txt for more info. ++ ++ ++JFS. ++~~~~ ++IBM's JFS was merged for 2.6. (And backported to 2.4.20, but ++it was still a new feature here first. You can read more about JFS at ++http://www-124.ibm.com/developerworks/oss/jfs/index.html ++ ++ ++XFS. ++~~~~ ++The SGI XFS filesystem has been merged, and has a number of userspace ++features. Users are encouraged to read http://oss.sgi.com/projects/xfs ++for more information. ++The various utilities for creating and manipulating XFS volumes can ++be found on SGI's ftp server: ++ftp://oss.sgi.com/projects/xfs/download/download/cmd_tars/xfsprogs-2.5.4.src.tar.gz ++ ++ ++CIFS. ++~~~~~ ++Support utilities and documentation for the common internet file system (CIFS) ++can be found at http://us1.samba.org/samba/Linux_CIFS_client.html ++ ++ ++FAT. ++~~~~ ++CVF (Compressed VFAT) support has been removed. This means you ++will no longer be able to access DriveSpace partitions. ++ ++ ++HugeTLBfs. ++~~~~~~~~~~ ++Files in this filesystem are backed by large pages if the CPU ++supports them. See Documentation/vm/hugetlbpage.txt for more details. ++ ++ ++Internal filesystems. ++~~~~~~~~~~~~~~~~~~~~~ ++/proc/filesystems will contain several filesystems that are not ++mountable in userspace, but are used internally by the kernel ++to keep track of things. Amongst these filesystems are futexfs ++and eventpollfs. ++ ++ ++Kernel Asynchronous I/O (AIO) Support ++~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++Support for kernel AIO has been included in 2.6. ++ ++AIO enables even a single application thread to overlap I/O ++operations with other processing, by providing an interface ++for submitting one or more i/o requests in one system call ++(io_submit) without waiting for completion, and a separate ++interface (io_getevents) to reap completed i/o operations ++associated with a given completion group. ++ ++The following is a quick summary of what works today as ++expected: ++- AIO read and write on raw (and O_DIRECT on blockdev) ++- AIO read and write on files opened with O_DIRECT on ++ ext2, ext3, jfs, xfs ++ ++And what doesn't work as expected or is not currently ++supported: ++- AIO read and write on files opened without O_DIRECT ++ (i.e. normal buffered filesystem AIO). On ext2, ext3, ++ jfs, xfs and nfs, these do not return an explicit ++ error, but quietly default to synchronous or rather ++ non-AIO behaviour (i.e io_submit waits for i/o to complete ++ in these cases). For most other filesystems, -EINVAL is ++ reported. ++- AIO fsync (not supported for any filesystem) ++- AIO read and write on sockets (doesn't return an ++ explicit error, but quietly defaults to synchronous ++ or rather non-AIO behaviour) ++ ++You need to install libaio-0.3.92 (available at ++http://www.kernel.org/pub/linux/kernel/people/bcrl/aio/) ++if you are writing AIO applications which use the native ++AIO interfaces. ++ ++More info is available at http://lse.sf.net/io/aio.html ++ ++ ++Profiling. ++~~~~~~~~~~ ++- A system wide performance profiler (Oprofile) has been included in 2.6. ++ With this option compiled in, you'll get an oprofilefs filesystem ++ which you can mount, that the userspace utilities talk to. ++ You can find out more at http://oprofile.sf.net/ ++- You need a fixed readprofile utility for 2.6. ++ Present in util-linux as of 2.11z ++ ++ ++ ++Improved BIOS table support. ++~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++- Linux now supports various new BIOS extensions. ++ ++ ++Simple boot flag support. ++~~~~~~~~~~~~~~~~~~~~~~~~~ ++The SBF specification is an x86 BIOS extension that allows improved ++system boot speeds. It does this by marking a CMOS field to say ++"I booted okay, skip extensive POST next reboot". ++Userspace tool is at http://www.codemonkey.org.uk/projects/sbf/sbf.c ++More info on SBF is at http://www.microsoft.com/hwdev/resources/specs/simp_bios.asp ++ ++ ++EDD Support. ++~~~~~~~~~~~~ ++- Support for BIOS Enhanced Disk Drive Services (EDD) was added, ++ which exports information on what the BIOS thinks is the boot ++ drive and other useful info to /sys/firmware/edd ++- Matt Domsch is interested in hearing success/fails on this code ++ with some simple tests decribed at http://domsch.com/linux/edd30/results.html ++ ++ ++Improved system monitoring. ++~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++- lm_sensors. ++ - Shipped in vendors kernels for years, lm_sensors is now part of mainline. ++ It does however have a different interface. (/sysfs instead of /proc ++ - http://www.xs4all.nl/~thospel/ASIS/bin/psensors is a handy script ++ for parsing the new sysfs fields. ++- IPMI. (Intelligent Platform Management Interface) ++ - IPMI is a standard for monitoring the hardware in a system. ++ - Project home page: http://openipmi.sourceforge.net ++ - Specification: http://www.intel.com/design/servers/ipmi/spec.htm ++ ++ ++x86 CPU detection. ++~~~~~~~~~~~~~~~~~~ ++- The CPU detection code got a pretty hefty shake up. To be certain your ++ CPU has all relevant workarounds applied, be sure to check that it was ++ detected correctly. cat /proc/cpuinfo will tell what the kernel thinks it is. ++- Likewise, the x86 MTRR driver got a considerable makeover. ++ Check that XFree86 sets up MTRRs in the same way it did in 2.4 ++ (Failures will get logged in /var/log/XFree86.log) ++- Early PII Xeon processors and possibly other early PII processors ++ require microcode updates either from the BIOS or the microcode driver ++ to work around CPU bugs the O(1) scheduler exposes. ++ You can find the relevant microcode tools at ++ http://www.urbanmyth.org/microcode/ ++- Any regressions in both should go to mochel@osdl.org Cc: davej@codemonkey.org.uk ++ ++ ++Extra tainting. ++~~~~~~~~~~~~~~~ ++Running certain AMD processors in SMP boxes is out of spec, and will taint ++the kernel with the 'S' flag. Running 2 Athlon XPs for example may seem to ++work fine, but may also introduce difficult to pin down bugs. ++In time it's likely this tainting will be extended to cover other out of ++spec cases. ++ ++Additionally, the new modules interface will taint the kernel if you try ++to 'force' a module to load with insmod -f. ++ ++ ++Power management. ++~~~~~~~~~~~~~~~~~ ++- 2.6 contains a more up to date snapshot of the ACPI driver. Should ++ you experience any problems booting, try booting with the argument ++ "acpi=off" to rule out any ACPI interaction. ACPI has a much more involved ++ role in bringing the system up in 2.6 than it did in 2.4 ++- The old "acpismp=force" boot option is now obsolete, and will be ignored ++ due to the old "mini ACPI" parser being removed. ++- software suspend is still in development, and in need of more work. ++ Use with SMP and/or PREEMPT not advised. ++- The ACPI code will do basic sanity checks on the DMI structure in the BIOS ++ to determine the date it was written. BIOSes older than year 2000 are ++ assumed to be broken. In some circumstances, this assumption is wrong. ++ If you see a message saying ACPI is disabled for this reason, try booting ++ with acpi=force. If things work fine, send the output of dmidecode ++ (http://www.nongnu.org/dmidecode/) to acpi-devel@lists.sf.net ++ with an explanation of why your BIOS shouldn't be blacklisted. ++ ++CPU frequency scaling. ++~~~~~~~~~~~~~~~~~~~~~~ ++Certain processors have the facility to scale their voltage/clockspeed. ++2.6 introduces an interface to this feature, see Documentation/cpufreq ++for more information. This functionality also covers features like ++Intel's speedstep, and the Powernow! feature present in mobile AMD Athlons. ++In addition to x86 variants, this framework also supports various ARM CPUs. ++You can find a userspace daemon that monitors battery life and ++adjusts accordingly at: http://sourceforge.net/projects/cpufreqd ++ ++ ++Background polling of MCE. ++~~~~~~~~~~~~~~~~~~~~~~~~~~ ++The machine check handler has been extended so that it regularly polls ++for any problems on AMD Athlon, and Intel Pentium 4 systems. ++This may result in machine check exceptions occuring more frequently ++than they did in 2.4 on out of spec systems (Overclocking/inadequate ++cooling/underated PSU etc..). ++ ++ ++LVM2 - DeviceMapper. ++~~~~~~~~~~~~~~~~~~~~ ++The LVM1 code was removed wholesale, and replaced with a much better ++designed 'device mapper'. ++- This is backwards compatible with the LVM1 disk format. ++- Device mapper does require new tools to manage volumes however. ++ You can get these from ftp://ftp.sistina.com/pub/LVM2/tools/ ++ ++ ++Debugging options. ++~~~~~~~~~~~~~~~~~~ ++During the stabilising period, it's likely that the debugging options ++in the kernel hacking menu will trigger quite a few problems. ++Please report any of these problems to linux-kernel@vger.kernel.org ++rather than just disabling the relevant CONFIG_ options. ++ ++Merging of kksymoops means that the kernel will now spit out ++automatically decoded oopses (no more feeding them to ksymoops). ++For this reason, you should always enable the option in the ++kernel hacking menu labelled "Load all symbols for debugging/kksymoops". ++ ++Testing with CONFIG_PREEMPT will also increase the amount of debug ++code that gets enabled in the kernel. Kernel preemption gives us ++the ability to do a whole slew of debugging checks like sleeping ++with locks held, scheduling while atomic, exiting with locks held, etc. ++ ++ ++Compiler issues. ++~~~~~~~~~~~~~~~~ ++- The recommended compiler (for x86) is still 2.95.3. ++- When compiled with a modern gcc (Ie gcc 3.x), 2.6 will use additional ++ optimisations that 2.4 didn't. This may shake out compiler bugs that ++ 2.4 didn't expose. ++- Do not use gcc 3.0.x on x86 due to a stack pointer handling bug. ++- gcc 2.96 is not supported with CONFIG_FRAME_POINTER=y due to a stack ++ pointer handling bug. ++ ++ ++Security concerns. ++~~~~~~~~~~~~~~~~~~ ++Several security issues solved in 2.4 may not yet be forward ported ++to 2.6. For this reason 2.6.x kernels should not be tested on ++untrusted systems. Testing known 2.4 exploits and reporting results ++is useful. ++ ++SELinux. ++~~~~~~~~ ++NSA Security-Enhanced Linux (SELinux) was merged in 2.6. ++SELinux defaults to not being config'd in. If you ++config it in it defaults to enabled. If you also config the bootparam ++you can use that param to disable it, otherwise selinux=1 is redundant ++as that's the default. ++ ++You can obtain SELinux tools and an example policy configuration from ++http://www.nsa.gov/selinux ++ ++ ++ ++Networking. ++~~~~~~~~~~~ ++- ebtables ++ The bridging firewall code was merged. To manage these you'll ++ need the ebtables tool available from ++ http://users.pandora.be/bart.de.schuymer/ebtables/ ++ More on bridge-nf can be found at http://bridge.sourceforge.net ++- Bridged packets can now be 'seen' by iptables. ++- IPSec ++ Linux finally has IPSec support in mainline. Use the KAME tools port on ++ http://sourceforge.net/projects/ipsec-tools ++ For more info see http://www.lib.uaa.alaska.edu/linux-kernel/archive/2002-Week-44/1127.html ++ Also Bert Hubert has a howto at http://lartc.org/howto/lartc.ipsec.html ++ Additionally, ipsec-utils is at http://sourceforge.net/projects/ipsec-tools ++ Herbert Xu also has patches against FreeSWAN 2.00 to allow its userspace ++ to use the 2.6 IPSec functionality. They can be downloaded from ++ http://gondor.apana.org.au/~herbert/freeswan/ ++ An additional HOWTO is at http://www.ipsec-howto.org ++- Some applications may trigger the kernel to spit out warnings about ++ 'process xxx using obsolete setsockopt SO_BSDCOMPAT' . ++ - Bind 9.2.2 checks for #ifdef SO_BSDCOMPAT in correctly, ++ so a recompile is all that is needed. ++ - bind9-host from debian testing triggers, though the 'host' package doesn't. ++ - process `snmpd' is using obsolete setsockopt SO_BSDCOMPAT ++ - process `snmptrapd' is using obsolete setsockopt SO_BSDCOMPAT ++ - ntop uses obsolete (PF_INET,SOCK_PACKET) ++- Users of boxes with >1 NIC may find that for eg, eth0 and eth1 refer to ++ the opposites of what they did in 2.4. This is a bug that will be fixed ++ before 2.6.0. One option (or management workaround) for this is to use ++ 'nameif' to name Ethernet interfaces. There is a HOWTO for doing this at ++ ++- Support for various new RFCs. ++ - RFC3173 (IP Payload Compression). ++ - RFC3041 (IPv6 Privacy Extensions). ++ - RFC2473 (IPv6 in IPv6 tunnels). ++ - RFC2960 (SCTP - see below). ++- Linux reaches congestion collapse when subjected to heavy network load. ++ NAPI fixes this amongst other things and therefore improving network ++ performance. ++ More info at http://www.cyberus.ca/~hadi/usenix-paper.tgz and ++ ftp://robur.slu.se/pub/Linux/net-development/NAPI/ ++- IPVS (IP Virtual Server) ++ http://www.linuxvirtualserver.org/ ++- RFC 2960 - SCTP (Stream Control Transmission Protocol) ++ SCTP is an IP based, message oriented reliable transport protocol with ++ congestion control, support for transparent multi-homing and multiple ++ ordered streams of messages. RFC2960 defines the core protocol. ++ More information about the protocol can be found at ++ http://www.ietf.org/rfc/rfc2960.txt ++ and about the Linux kernel implementation at ++ http://lksctp.sourceforge.net ++- ANSI/IEEE 802.2 LLC type 2 Support ++ Full implementation of LLC 1 and 2 stack, used by Appletalk, IPX and Token ++ Ring, also needed for the out of the tree, not yet functional NetBEUI ++ stack and for the for Linux SNA. ++ ++ This is based on the stack released under the GPL by Procom Inc. for the ++ 2.0.30 Linux kernel. ++ ++ ++Crypto ++~~~~~~ ++- A generic crypto API has been merged, offering support for various ++ algorithms (HMAC,MD4,MD5,SHA-1,SHA256,SHA384,SHA512,DES,Triple DES EDE, ++ Blowfish, Twofish, Serpent, AES, CAST5, CAST6) ++ ++- This functionality is used by IPSec and the crypto-loop. It's possible ++ that it will later also be available for use in userspace through a crypto ++ device, possibly compatible with the OpenBSD crypto userspace. ++ ++- The in-kernel loopback device can now do crypto using the CryptoAPI. ++ May need new userspace tools. ++ ++- A 2.4->2.6 cryptoloop migration guide is at http://clemens.endorphin.org/Cryptoloop_Migration_Guide.html ++ ++Ports. ++~~~~~~ ++- 2.6 features support for several new architectures. ++ - x86-64 (AMD Hammer) ++ - ppc64 ++ - UML (User mode Linux) ++ See http://user-mode-linux.sf.net for more information. ++ - uCLinux: m68k(w/o MMU), h8300 and v850. sh also added a uCLinux option. ++- The 64 bit s390x port was collapsed into a single port, appearing ++ as a config option in the base s390 arch. ++- In the opposite direction, arm26 was split out from arm. ++- x86 architecture also got 'subarch' support to support 'strange' x86 ++ boxes (usually big boy toys). Currently supported subarchs include ++ - ES7000 ++ - PC9800 (incomplete merge) ++ - VISWS (Was in 2.4, but now maintained again) ++ - Voyager. (http://www.hansenpartnership.com/voyager/) ++ ++ ++- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++Revision history: ++0.48 - gadgetfs ++ cryptoloop howto URL. ++ Mailing list pointers. ++0.47 - Add futex paper URL. ++ Correct libc-alpha mailing list. ++ Jeff Garzik shouldn't get IRQ routing problems ++ Clarify syslinux necessity for boot disks. ++ Add depmod to common gotchas ++ Add EFS regression ++ Add mkinitrd note to modules section. ++ Various grammar cleanups ++ Mention tree(1) in sysfs section ++ SELinux corrections. ++ Duh, numerical sysctls are deprecated not syscalls. ++ Document seperate build dir feature. ++ /proc/stat changes broke more than just DOTS. ++ Add Japanese keyboard issue to input section. ++0.46 - Update akpm's email address. ++ Mention LLC in the networking section. ++ Added link to 2.6 migration guide. ++0.45 - DEVFS is obsolete. ++ Add pt_BR translation. ++0.44 - lm_sensors. ++ x86 subarch support. ++ Add link to Joseph Pranevich's 2.6 doc. ++ Mention chattr +S ++ Update dmidecode URL ++ Fix sbf.c URL ++ Fix typos (s/proprietory/proprietary/) ++ add URL to patched cdda2wav. ++ Mention which filesystems does 2.6 actually supports. ++ Add a small note about SELinux ++ Add a few more RFCs which we now support in the Networking section ++ Change IPVS to IPVS (IP Virtual Server) ++ Mention additional encryption algorithms that crypto api supports ++ Add a few things to TODO section ++ Add URL to AIO. ++ Polish translation URL added. ++ Fix up a stray davej@suse.de that I missed. ++ Update spanish translation URL. ++0.43 - oprofile URL changed. ++ Update Linus' email ++ Drop report of buggy Red Hat 3.2.2-5 gcc. ++ Remove reference to Jens' hacked cdrecord, standard version is now ok. ++ PC Speaker note added. ++ Mention elevator=deadline for database folks. ++ Merge two deprecated sections. ++ Update URL to xfsprogs. ++ Mention Conectiva module-init-tools ++ Mention acpi=force, and DMI blacklist. ++ DRI CFT on X4.1 ++ Pentium Pro SYSENTER is broken. ++ Update Alans list of IDE bugs ++ Add geometry translator workarounds. ++ Mention swapfile limitations. ++ Update Reiserfs new features. ++ Move some features marked as 'deprecated' to 'removed'. ++ Add 'needs forward porting' section. ++ Pointer to synaptics touchpad driver webpage. ++ Update ipsec utils URL. ++ Mention usb-storage changes. ++ Modules are now .ko instead of .o ++ Mention how to change elevator on command line. ++ Document statfs64() ++ ext3 data=journal mode should now be fixed. ++ Fix iosched pathname. ++ Document USB changes. ++ Add SCTP to Networking. ++ s/2.5/2.6/ in most of the doc. ++ Mention AIO. ++ Add additional IPSEC howto URL. ++ Deprecate numeric sysctls ++0.42 - CONFIG_LOG_BUF_SHIFT is now sanity checked by Kconfig ++ Hyperthreading scheduler improvements. ++ ALSA OSS emulation. ++ 32bit uids in new quota. ++ Not all filesystems support nanosecond stat. ++ Note that NTFS still isn't R/W ++ Mention CryptoLoop. ++0.41 - V=0 is now default. Document V=1 ++ s/Redhat/Red Hat/ everywhere. ++ Added vmware sysenter note. ++ MTRR for vesafb ++ Various grammar fixes. ++ Selectable elevators. ++ PCI domains ++0.40 - Callout tty devices are removed. ++ Added note about modules in Red Hat 9 ++0.39 - irqbalance note added. ++ Added ntop, snmp tools obsolete messages. ++ Added link to David Mosberger's O(1) page. ++ Mention Herbert Xu's FreeSWAN patches. ++ Add CONFIG_VGA_CONSOLE to the list of gotchas. ++ Add note about 2.4 .config's to gotchas. ++ Reword devpts note. ++0.38 - Fixed URL to nameif ++0.37 - devfs users now need to mount devpts. ++ mention h8300 port. ++ mentioned NTFS rewrite. ++0.36 - Include Doug Gilberts 'positive SCSI spin'. ++ Mention NAPI. ++ Reword the CPU bug workaround that the O(1) scheduler exposes. ++ Added 'Known Gotchas' section ++0.35 - Note about KDE panel applets. ++ mount --move, dmask, fmask ++ Removed note about oprofile utilities being underdeveloped. ++ Mention ext2 locking, and ext2/ext3 orlov allocator. ++0.34 - Remove people.redhat.com NPTL URLs on Ulrich Dreppers request. ++ Added note about s390x going away. ++ Various kbuild updates. ++ Note about swap files. ++ Added note about -p1 vs -p0 ++ Lots of typo fixes from Randy Dunlap. ++ RPM from RH9 seems to have problems. ++0.33 - Networking RFCs section added. ++0.32 - Added Soundmodem userspace replacement URL. ++0.31 - ext3 data=journal breakage noted. ++0.30 - Athlon powernow is now supported. ++0.29 - Mention NIC renumbering and ACPI/APIC NIC bugs. ++0.28 - SO_BSDCOMPAT obsolete messages, nfsutils. ++0.27 - radeon -> radeonfb ++0.26 - Added info about readprofile. ++0.25 - Added cdrecord example. Added URL to Spanish translation. ++0.1->0.24 - Unrecorded history ++ ++- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ++Other Links. ++http://www.kernelnewbies.org/status/ ++http://bugzilla.kernel.org/ ++http://www.kniggit.net/wwol26.html ++http://thomer.com/linux/migrate-to-2.6.html ++ ++ ++TODO: (Please mail me a few lines about these if you are ++ the owner of these). ++ ++ PCI IDs (new_id, agpgart try_unsupported) ++ libsysfs ++ kdev_t changes? ++ ISDN rewrite? ++ AFS ++ DVB ++ Hangcheck timer ++ /proc/sysrq-trigger ++ libata ++ initramfs ? ++ --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/drivers-ftape.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/drivers-ftape.dpatch @@ -0,0 +1,160 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: apply x86/64bit fix in drivers/char/ftape/lowlevel/ftape-calibr.c +## DP: Patch author: unknown +## DP: Upstream status: not submitted + +. $(dirname $0)/DPATCH + +@DPATCH@ +--- kernel-source-2.6.6/drivers/char/ftape/lowlevel/ftape-calibr.c 2004-03-11 13:55:24.000000000 +1100 ++++ kernel-source-2.6.6-1/drivers/char/ftape/lowlevel/ftape-calibr.c 2003-10-22 21:08:21.000000000 +1000 +@@ -31,7 +31,10 @@ + #include + #if defined(__alpha__) + # include +-#elif defined(__i386__) || defined(__x86_64__) ++#elif defined(__x86_64__) ++# include ++# include ++#elif defined(__i386__) + # include + #endif + #include +@@ -45,7 +48,7 @@ + # error Ftape is not implemented for this architecture! + #endif + +-#if defined(__alpha__) ++#if defined(__alpha__) || defined(__x86_64__) + static unsigned long ps_per_cycle = 0; + #endif + +@@ -72,7 +75,18 @@ + + asm volatile ("rpcc %0" : "=r" (r)); + return r; +-#elif defined(__i386__) || defined(__x86_64__) ++#elif defined(__x86_64__) ++ unsigned long r; ++ rdtscl(r); ++ return r; ++#elif defined(__i386__) ++ ++/* ++ * Note that there is some time between counter underflowing and jiffies ++ * increasing, so the code below won't always give correct output. ++ * -Vojtech ++ */ ++ + unsigned long flags; + __u16 lo; + __u16 hi; +@@ -89,9 +103,9 @@ + + static unsigned int short_ftape_timestamp(void) + { +-#if defined(__alpha__) ++#if defined(__alpha__) || defined(__x86_64__) + return ftape_timestamp(); +-#elif defined(__i386__) || defined(__x86_64__) ++#elif defined(__i386__) + unsigned int count; + unsigned long flags; + +@@ -106,9 +120,9 @@ + + static unsigned int diff(unsigned int t0, unsigned int t1) + { +-#if defined(__alpha__) +- return (t1 <= t0) ? t1 + (1UL << 32) - t0 : t1 - t0; +-#elif defined(__i386__) || defined(__x86_64__) ++#if defined(__alpha__) || defined(__x86_64__) ++ return (t1 - t0); ++#elif defined(__i386__) + /* + * This is tricky: to work for both short and full ftape_timestamps + * we'll have to discriminate between these. +@@ -122,9 +136,9 @@ + + static unsigned int usecs(unsigned int count) + { +-#if defined(__alpha__) ++#if defined(__alpha__) || defined(__x86_64__) + return (ps_per_cycle * count) / 1000000UL; +-#elif defined(__i386__) || defined(__x86_64__) ++#elif defined(__i386__) + return (10000 * count) / ((CLOCK_TICK_RATE + 50) / 100); + #endif + } +@@ -163,38 +177,13 @@ + + static void init_clock(void) + { +-#if defined(__i386__) || defined(__x86_64__) +- unsigned int t; +- int i; + TRACE_FUN(ft_t_any); + +- /* Haven't studied on why, but there sometimes is a problem +- * with the tick timer readout. The two bytes get swapped. +- * This hack solves that problem by doing one extra input. +- */ +- for (i = 0; i < 1000; ++i) { +- t = short_ftape_timestamp(); +- if (t > LATCH) { +- inb_p(0x40); /* get in sync again */ +- TRACE(ft_t_warn, "clock counter fixed"); +- break; +- } +- } ++#if defined(__x86_64__) ++ ps_per_cycle = 1000000000UL / cpu_khz; + #elif defined(__alpha__) +-#if CONFIG_FT_ALPHA_CLOCK == 0 +-#error You must define and set CONFIG_FT_ALPHA_CLOCK in 'make config' ! +-#endif + extern struct hwrpb_struct *hwrpb; +- TRACE_FUN(ft_t_any); +- +- if (hwrpb->cycle_freq != 0) { +- ps_per_cycle = (1000*1000*1000*1000UL) / hwrpb->cycle_freq; +- } else { +- /* +- * HELP: Linux 2.0.x doesn't set cycle_freq on my noname ! +- */ +- ps_per_cycle = (1000*1000*1000*1000UL) / CONFIG_FT_ALPHA_CLOCK; +- } ++ ps_per_cycle = (1000*1000*1000*1000UL) / hwrpb->cycle_freq; + #endif + TRACE_EXIT; + } +@@ -213,7 +202,7 @@ + unsigned int tc = 0; + unsigned int count; + unsigned int time; +-#if defined(__i386__) || defined(__x86_64__) ++#if defined(__i386__) + unsigned int old_tc = 0; + unsigned int old_count = 1; + unsigned int old_time = 1; +@@ -255,7 +244,7 @@ + tc = (1000 * time) / (count - 1); + TRACE(ft_t_any, "once:%3d us,%6d times:%6d us, TC:%5d ns", + usecs(once), count - 1, usecs(multiple), tc); +-#if defined(__alpha__) ++#if defined(__alpha__) || defined(__x86_64__) + /* + * Increase the calibration count exponentially until the + * calibration time exceeds 100 ms. +@@ -263,7 +252,7 @@ + if (time >= 100*1000) { + break; + } +-#elif defined(__i386__) || defined(__x86_64__) ++#elif defined(__i386__) + /* + * increase the count until the resulting time nears 2/HZ, + * then the tc will drop sharply because we lose LATCH counts. --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/stolen-from-head_CAN-2005-3110.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/stolen-from-head_CAN-2005-3110.dpatch @@ -0,0 +1,26 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: +## DP: Patch author: +## DP: Upstream status: backport + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -Narud linux-source-2.6.8.1-2.6.8.1.old/net/bridge/netfilter/ebtables.c linux-source-2.6.8.1-2.6.8.1/net/bridge/netfilter/ebtables.c +--- linux-source-2.6.8.1-2.6.8.1.old/net/bridge/netfilter/ebtables.c 2004-08-24 09:16:48.000000000 +0200 ++++ linux-source-2.6.8.1-2.6.8.1/net/bridge/netfilter/ebtables.c 2005-10-09 12:25:56.000000000 +0200 +@@ -173,9 +173,10 @@ + struct ebt_chainstack *cs; + struct ebt_entries *chaininfo; + char *base; +- struct ebt_table_info *private = table->private; ++ struct ebt_table_info *private; + + read_lock_bh(&table->lock); ++ private = table->private; + cb_base = COUNTER_BASE(private->counters, private->nentries, + smp_processor_id()); + if (private->chainstack) --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/drivers-ide-dma-blacklist-toshiba.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/drivers-ide-dma-blacklist-toshiba.dpatch @@ -0,0 +1,21 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: blacklist "TOSHIBA CD-ROM XM-1702BC" in drivers/ide/ide-dma.c +## DP: Patch author: unknown +## DP: Upstream status: not submitted + +. $(dirname $0)/DPATCH + +@DPATCH@ +--- kernel-source-2.6.6/drivers/ide/ide-dma.c 2004-04-05 19:49:28.000000000 +1000 ++++ kernel-source-2.6.6-1/drivers/ide/ide-dma.c 2004-04-05 20:54:34.000000000 +1000 +@@ -125,6 +125,7 @@ + { "HITACHI CDR-8335" , "ALL" }, + { "HITACHI CDR-8435" , "ALL" }, + { "Toshiba CD-ROM XM-6202B" , "ALL" }, ++ { "TOSHIBA CD-ROM XM-1702BC" , "ALL" }, + { "CD-532E-A" , "ALL" }, + { "E-IDE CD-ROM CR-840", "ALL" }, + { "CD-ROM Drive/F5A", "ALL" }, --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/drivers-usb-devio_CVE-2005-3055.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/drivers-usb-devio_CVE-2005-3055.dpatch @@ -0,0 +1,106 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urNad /home/fabbione/i386/linux-source-2.6.8.1-2.6.8.1/drivers/usb/core/devio.c linux-source-2.6.8.1-2.6.8.1/drivers/usb/core/devio.c +--- /home/fabbione/i386/linux-source-2.6.8.1-2.6.8.1/drivers/usb/core/devio.c 2005-11-17 10:23:44.000000000 +0000 ++++ linux-source-2.6.8.1-2.6.8.1/drivers/usb/core/devio.c 2005-11-17 10:24:35.000000000 +0000 +@@ -30,6 +30,8 @@ + * Revision history + * 22.12.1999 0.1 Initial release (split from proc_usb.c) + * 04.01.2000 0.2 Turned into its own filesystem ++ * 30.09.2005 0.3 Fix user-triggerable oops in async URB delivery ++ * (CAN-2005-3055) + */ + + /*****************************************************************************/ +@@ -53,7 +55,8 @@ + struct async { + struct list_head asynclist; + struct dev_state *ps; +- struct task_struct *task; ++ pid_t pid; ++ uid_t uid, euid; + unsigned int signr; + unsigned int ifnum; + void __user *userbuffer; +@@ -270,7 +273,8 @@ + sinfo.si_errno = as->urb->status; + sinfo.si_code = SI_ASYNCIO; + sinfo.si_addr = as->userurb; +- send_sig_info(as->signr, &sinfo, as->task); ++ kill_proc_info_as_uid(as->signr, &sinfo, as->pid, as->uid, ++ as->euid); + } + wake_up(&ps->wait); + } +@@ -940,7 +944,9 @@ + as->userbuffer = NULL; + as->signr = uurb.signr; + as->ifnum = ifnum; +- as->task = current; ++ as->pid = current->pid; ++ as->uid = current->uid; ++ as->euid = current->euid; + if (!(uurb.endpoint & USB_DIR_IN)) { + if (copy_from_user(as->urb->transfer_buffer, uurb.buffer, as->urb->transfer_buffer_length)) { + free_async(as); +diff -urNad /home/fabbione/i386/linux-source-2.6.8.1-2.6.8.1/include/linux/sched.h linux-source-2.6.8.1-2.6.8.1/include/linux/sched.h +--- /home/fabbione/i386/linux-source-2.6.8.1-2.6.8.1/include/linux/sched.h 2005-11-17 10:24:30.000000000 +0000 ++++ linux-source-2.6.8.1-2.6.8.1/include/linux/sched.h 2005-11-17 10:24:35.000000000 +0000 +@@ -795,6 +795,7 @@ + extern int kill_pg_info(int, struct siginfo *, pid_t); + extern int kill_sl_info(int, struct siginfo *, pid_t); + extern int kill_proc_info(int, struct siginfo *, pid_t); ++extern int kill_proc_info_as_uid(int, struct siginfo *, pid_t, uid_t, uid_t); + extern void notify_parent(struct task_struct *, int); + extern void do_notify_parent(struct task_struct *, int); + extern void force_sig(int, struct task_struct *); +diff -urNad /home/fabbione/i386/linux-source-2.6.8.1-2.6.8.1/kernel/signal.c linux-source-2.6.8.1-2.6.8.1/kernel/signal.c +--- /home/fabbione/i386/linux-source-2.6.8.1-2.6.8.1/kernel/signal.c 2005-11-17 10:23:44.000000000 +0000 ++++ linux-source-2.6.8.1-2.6.8.1/kernel/signal.c 2005-11-17 10:28:55.000000000 +0000 +@@ -1148,6 +1148,40 @@ + return error; + } + ++/* like kill_proc_info(), but doesn't use uid/euid of "current" */ ++int kill_proc_info_as_uid(int sig, struct siginfo *info, pid_t pid, ++ uid_t uid, uid_t euid) ++{ ++ int ret = -EINVAL; ++ struct task_struct *p; ++ ++ if (sig < 0 || sig > _NSIG) ++ return ret; ++ ++ read_lock(&tasklist_lock); ++ p = find_task_by_pid(pid); ++ if (!p) { ++ ret = -ESRCH; ++ goto out_unlock; ++ } ++ if ((!info || ((unsigned long)info != 1 && ++ (unsigned long)info != 2 && SI_FROMUSER(info))) ++ && (euid != p->suid) && (euid != p->uid) ++ && (uid != p->suid) && (uid != p->uid)) { ++ ret = -EPERM; ++ goto out_unlock; ++ } ++ if (sig && p->sighand) { ++ unsigned long flags; ++ spin_lock_irqsave(&p->sighand->siglock, flags); ++ ret = __group_send_sig_info(sig, info, p); ++ spin_unlock_irqrestore(&p->sighand->siglock, flags); ++ } ++out_unlock: ++ read_unlock(&tasklist_lock); ++ return ret; ++} ++EXPORT_SYMBOL_GPL(kill_proc_info_as_uid); + + /* + * kill_something_info() interprets pid in interesting ways just like kill(2). --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/drivers-input-hiddev-HIDIOCGUCODE.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/drivers-input-hiddev-HIDIOCGUCODE.dpatch @@ -0,0 +1,123 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: fix boundary checks for GUSAGE/SUSAGE in drivers/usb/input/hiddev.c +## DP: Patch author: Herbert Xu +## DP: Upstream status: submitted + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN kernel-source-2.6.6/drivers/usb/input/hiddev.c kernel-source-2.6.6-1/drivers/usb/input/hiddev.c +--- kernel-source-2.6.6/drivers/usb/input/hiddev.c 2004-05-10 19:48:01.000000000 +1000 ++++ kernel-source-2.6.6-1/drivers/usb/input/hiddev.c 2004-05-11 20:07:38.000000000 +1000 +@@ -573,38 +573,11 @@ + + return 0; + +- case HIDIOCGUCODE: +- uref_multi = kmalloc(sizeof(struct hiddev_usage_ref_multi), GFP_KERNEL); +- if (!uref_multi) +- return -ENOMEM; +- uref = &uref_multi->uref; +- if (copy_from_user(uref, user_arg, sizeof(*uref))) +- goto fault; +- +- rinfo.report_type = uref->report_type; +- rinfo.report_id = uref->report_id; +- if ((report = hiddev_lookup_report(hid, &rinfo)) == NULL) +- goto inval; +- +- if (uref->field_index >= report->maxfield) +- goto inval; +- +- field = report->field[uref->field_index]; +- if (uref->usage_index >= field->maxusage) +- goto inval; +- +- uref->usage_code = field->usage[uref->usage_index].hid; +- +- if (copy_to_user(user_arg, uref, sizeof(*uref))) +- goto fault; +- +- kfree(uref_multi); +- return 0; +- + case HIDIOCGUSAGE: + case HIDIOCSUSAGE: + case HIDIOCGUSAGES: + case HIDIOCSUSAGES: ++ case HIDIOCGUCODE: + case HIDIOCGCOLLECTIONINDEX: + uref_multi = kmalloc(sizeof(struct hiddev_usage_ref_multi), GFP_KERNEL); + if (!uref_multi) +@@ -621,10 +594,12 @@ + + if (cmd != HIDIOCGUSAGE && + cmd != HIDIOCGUSAGES && ++ cmd != HIDIOCGUCODE && + uref->report_type == HID_REPORT_TYPE_INPUT) + goto inval; + +- if (uref->report_id == HID_REPORT_ID_UNKNOWN) { ++ if (cmd != HIDIOCGUCODE && ++ uref->report_id == HID_REPORT_ID_UNKNOWN) { + field = hiddev_lookup_usage(hid, uref); + if (field == NULL) + goto inval; +@@ -638,28 +613,34 @@ + goto inval; + + field = report->field[uref->field_index]; +- if (uref->usage_index >= field->maxusage) +- goto inval; +- +- if (cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) { +- if (uref_multi->num_values >= HID_MAX_USAGES || +- uref->usage_index >= field->maxusage || +- (uref->usage_index + uref_multi->num_values) >= field->maxusage) ++ if (cmd == HIDIOCGUCODE || ++ cmd == HIDIOCGCOLLECTIONINDEX) { ++ if (uref->usage_index >= field->maxusage) + goto inval; +- } ++ } else if (uref->usage_index >= field->report_count) ++ goto inval; ++ else if ((cmd == HIDIOCGUSAGES || ++ cmd == HIDIOCSUSAGES) && ++ (uref->usage_index + uref_multi->num_values >= ++ field->report_count || ++ uref->usage_index + uref_multi->num_values < ++ uref->usage_index)) ++ goto inval; + } + + switch (cmd) { + case HIDIOCGUSAGE: + uref->value = field->value[uref->usage_index]; +- if (copy_to_user(user_arg, uref, sizeof(*uref))) +- goto fault; +- goto goodreturn; ++ break; + + case HIDIOCSUSAGE: + field->value[uref->usage_index] = uref->value; + goto goodreturn; + ++ case HIDIOCGUCODE: ++ uref->usage_code = field->usage[uref->usage_index].hid; ++ break; ++ + case HIDIOCGCOLLECTIONINDEX: + kfree(uref_multi); + return field->usage[uref->usage_index].collection_index; +@@ -678,6 +659,8 @@ + goto goodreturn; + } + ++ if (copy_to_user(user_arg, uref, sizeof(*uref))) ++ goto fault; + goodreturn: + kfree(uref_multi); + return 0; --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/audit-syscall_mem-leak-CAN-2005-3181.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/audit-syscall_mem-leak-CAN-2005-3181.dpatch @@ -0,0 +1,36 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: +## DP: Patch author: +## DP: Upstream status: + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -Naurd linux-source-2.6.8.1-2.6.8.1.old/fs/namei.c linux-source-2.6.8.1-2.6.8.1/fs/namei.c +--- linux-source-2.6.8.1-2.6.8.1.old/fs/namei.c 2004-08-24 09:16:48.000000000 +0200 ++++ linux-source-2.6.8.1-2.6.8.1/fs/namei.c 2005-10-10 11:07:28.000000000 +0200 +@@ -1469,18 +1469,18 @@ + if (nd->last_type != LAST_NORM) + goto exit; + if (nd->last.name[nd->last.len]) { +- putname(nd->last.name); ++ __putname(nd->last.name); + goto exit; + } + error = -ELOOP; + if (count++==32) { +- putname(nd->last.name); ++ __putname(nd->last.name); + goto exit; + } + dir = nd->dentry; + down(&dir->d_inode->i_sem); + dentry = __lookup_hash(&nd->last, nd->dentry, nd); +- putname(nd->last.name); ++ __putname(nd->last.name); + goto do_last; + } + --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/drivers-input-psaux-hacks.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/drivers-input-psaux-hacks.dpatch @@ -0,0 +1,53 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: add INPUT_MOUSEDEV_PSAUX_ENABLE +## DP: Patch author: Herbert Xu +## DP: Upstream status: not submitted + +. $(dirname $0)/DPATCH + +@DPATCH@ +--- kernel-source-2.6.6/drivers/input/Kconfig 2004-03-11 13:55:22.000000000 +1100 ++++ kernel-source-2.6.6-1/drivers/input/Kconfig 2004-01-27 21:05:58.000000000 +1100 +@@ -65,6 +65,11 @@ + screen resolution you are using to correctly scale the data. If + you're not using a digitizer, this value is ignored. + ++config INPUT_MOUSEDEV_PSAUX_ENABLE ++ bool "Enable /dev/psaux device by default" ++ default y ++ depends on INPUT_MOUSEDEV_PSAUX ++ + config INPUT_JOYDEV + tristate "Joystick interface" + depends on INPUT +--- kernel-source-2.6.6/drivers/input/mousedev.c 2004-03-11 13:55:44.000000000 +1100 ++++ kernel-source-2.6.6-1/drivers/input/mousedev.c 2004-02-05 20:20:54.000000000 +1100 +@@ -47,6 +47,16 @@ + module_param(yres, uint, 0); + MODULE_PARM_DESC(yres, "Vertical screen resolution"); + ++#ifdef CONFIG_INPUT_MOUSEDEV_PSAUX ++#ifdef CONFIG_INPUT_MOUSEDEV_PSAUX_ENABLE ++#define psaux 1 ++#else ++static int psaux; ++module_param(psaux, uint, 0); ++MODULE_PARM_DESC(psaux, "Enable legacy /dev/psaux interface"); ++#endif ++#endif ++ + struct mousedev { + int exist; + int open; +@@ -572,7 +582,7 @@ + NULL, "mice"); + + #ifdef CONFIG_INPUT_MOUSEDEV_PSAUX +- if (!(psaux_registered = !misc_register(&psaux_mouse))) ++ if (psaux && !(psaux_registered = !misc_register(&psaux_mouse))) + printk(KERN_WARNING "mice: could not misc_register the device\n"); + #endif + --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/net-rose-roseroute_CVE-2005-3273.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/net-rose-roseroute_CVE-2005-3273.dpatch @@ -0,0 +1,22 @@ +#! /bin/sh -e +## net-rose-roseroute_CVE-2005-3273.dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: No description. + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urNad linux-source-2.6.10-2.6.10~/net/rose/rose_route.c linux-source-2.6.10-2.6.10/net/rose/rose_route.c +--- linux-source-2.6.10-2.6.10~/net/rose/rose_route.c 2004-12-24 22:35:39.000000000 +0100 ++++ linux-source-2.6.10-2.6.10/net/rose/rose_route.c 2005-11-16 10:48:00.000000000 +0100 +@@ -727,7 +727,8 @@ + } + if (rose_route.mask > 10) /* Mask can't be more than 10 digits */ + return -EINVAL; +- ++ if (rose_route.ndigis > 8) /* No more than 8 digipeats */ ++ return -EINVAL; + err = rose_add_node(&rose_route, dev); + dev_put(dev); + return err; --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/drivers-macintosh-adb-trackpad.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/drivers-macintosh-adb-trackpad.dpatch @@ -0,0 +1,21 @@ +#! /bin/sh -e +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: disable spurious 2nd mouse event for apple trackpads. +## DP: Patch author: Alexander Clausen +## DP: Upstream status: reviewed and submitted by benh. + +. $(dirname $0)/DPATCH + +@DPATCH@ +--- kernel-source-2.6.8/drivers/macintosh/adbhid.c.orig 2004-03-10 23:41:43.000000000 +0100 ++++ kernel-source-2.6.8/drivers/macintosh/adbhid.c 2004-03-10 23:41:34.000000000 +0100 +@@ -326,7 +326,7 @@ + input_report_key(&adbhid[id]->input, BTN_LEFT, !((data[1] >> 7) & 1)); + input_report_key(&adbhid[id]->input, BTN_MIDDLE, !((data[2] >> 7) & 1)); + +- if (nb >= 4) ++ if (nb >= 4 && adbhid[id]->mouse_kind != ADBMOUSE_TRACKPAD) + input_report_key(&adbhid[id]->input, BTN_RIGHT, !((data[3] >> 7) & 1)); + + input_report_rel(&adbhid[id]->input, REL_X, --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/drivers-net-8139too-locking.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/drivers-net-8139too-locking.dpatch @@ -0,0 +1,78 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: fix deadlock on shutdown in drivers/net/8139too.c +## DP: Patch author: Herbert Xu +## DP: Upstream status: discussed with viro and jgarzik, probably wants an +## DP: Upstream status: interruptible rtnl_lock variant + +. $(dirname $0)/DPATCH + +@DPATCH@ +--- kernel-source-2.6.6/drivers/net/8139too.c 2004-05-10 19:47:54.000000000 +1000 ++++ kernel-source-2.6.6-1/drivers/net/8139too.c 2004-05-10 22:21:32.000000000 +1000 +@@ -112,6 +112,7 @@ + #include + #include + #include ++#include + #include + #include + +@@ -590,6 +591,7 @@ + struct rtl_extra_stats xstats; + int time_to_die; + struct mii_if_info mii; ++ struct semaphore mdio_sem; + unsigned int regs_len; + }; + +@@ -1025,6 +1027,7 @@ + tp->mii.mdio_write = mdio_write; + tp->mii.phy_id_mask = 0x3f; + tp->mii.reg_num_mask = 0x1f; ++ init_MUTEX (&tp->mdio_sem); + + /* dev is fully set up and ready to use now */ + DPRINTK("about to register device named %s (%p)...\n", dev->name, dev); +@@ -1633,9 +1636,10 @@ + if (tp->time_to_die) + break; + +- rtnl_lock (); ++ if (down_interruptible (&tp->mdio_sem)) ++ break; + rtl8139_thread_iter (dev, tp, tp->mmio_addr); +- rtnl_unlock (); ++ up (&tp->mdio_sem); + } + + complete_and_exit (&tp->thr_exited, 0); +@@ -2221,9 +2225,9 @@ + ret = kill_proc (tp->thr_pid, SIGTERM, 1); + if (ret) { + printk (KERN_ERR "%s: unable to signal thread\n", dev->name); +- return ret; ++ } else { ++ wait_for_completion (&tp->thr_exited); + } +- wait_for_completion (&tp->thr_exited); + } + + if (netif_msg_ifdown(tp)) +@@ -2464,10 +2468,14 @@ + if (!netif_running(dev)) + return -EINVAL; + ++ if (down_interruptible (&np->mdio_sem)) ++ return -ERESTARTSYS; ++ + spin_lock_irq(&np->lock); + rc = generic_mii_ioctl(&np->mii, if_mii(rq), cmd, NULL); + spin_unlock_irq(&np->lock); + ++ up (&np->mdio_sem); + return rc; + } + --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/net-ipv4-ipvs-ip_vs_conn_CVE-2005-3274.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/net-ipv4-ipvs-ip_vs_conn_CVE-2005-3274.dpatch @@ -0,0 +1,80 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -Naurd linux-source-2.6.8.1-2.6.8.1.ORIG/net/ipv4/ipvs/ip_vs_conn.c linux-source-2.6.8.1-2.6.8.1/net/ipv4/ipvs/ip_vs_conn.c +--- linux-source-2.6.8.1-2.6.8.1.ORIG/net/ipv4/ipvs/ip_vs_conn.c 2004-08-24 09:19:15.000000000 +0200 ++++ linux-source-2.6.8.1-2.6.8.1/net/ipv4/ipvs/ip_vs_conn.c 2005-11-16 11:27:40.000000000 +0100 +@@ -546,7 +546,6 @@ + { + if (del_timer(&cp->timer)) + mod_timer(&cp->timer, jiffies); +- __ip_vs_conn_put(cp); + } + + +@@ -762,7 +761,6 @@ + { + int idx; + struct ip_vs_conn *cp; +- struct ip_vs_conn *ct; + + /* + * Randomly scan 1/32 of the whole table every second +@@ -799,21 +797,12 @@ + continue; + } + +- /* +- * Drop the entry, and drop its ct if not referenced +- */ +- atomic_inc(&cp->refcnt); +- ct_write_unlock(hash); +- +- if ((ct = cp->control)) +- atomic_inc(&ct->refcnt); + IP_VS_DBG(4, "del connection\n"); + ip_vs_conn_expire_now(cp); +- if (ct) { ++ if (cp->control) { + IP_VS_DBG(4, "del conn template\n"); +- ip_vs_conn_expire_now(ct); ++ ip_vs_conn_expire_now(cp->control); + } +- ct_write_lock(hash); + } + ct_write_unlock(hash); + } +@@ -827,7 +816,6 @@ + { + int idx; + struct ip_vs_conn *cp; +- struct ip_vs_conn *ct; + + flush_again: + for (idx=0; idxrefcnt); +- ct_write_unlock(idx); + +- if ((ct = cp->control)) +- atomic_inc(&ct->refcnt); + IP_VS_DBG(4, "del connection\n"); + ip_vs_conn_expire_now(cp); +- if (ct) { ++ if (cp->control) { + IP_VS_DBG(4, "del conn template\n"); +- ip_vs_conn_expire_now(ct); ++ ip_vs_conn_expire_now(cp->control); + } +- ct_write_lock(idx); + } + ct_write_unlock_bh(idx); + } --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/drivers-scsi-generic_proc_info.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/drivers-scsi-generic_proc_info.dpatch @@ -0,0 +1,92 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: restore generic SCSI proc_info function in drivers/scsi/scsi_proc.c +## DP: Patch author: unknown +## DP: Upstream status: rejected + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN kernel-source-2.6.6/drivers/scsi/scsi_proc.c kernel-source-2.6.6-1/drivers/scsi/scsi_proc.c +--- kernel-source-2.6.6/drivers/scsi/scsi_proc.c 2004-03-11 13:55:22.000000000 +1100 ++++ kernel-source-2.6.6-1/drivers/scsi/scsi_proc.c 2004-02-16 18:23:47.000000000 +1100 +@@ -42,13 +42,47 @@ + /* Protect sht->present and sht->proc_dir */ + static DECLARE_MUTEX(global_host_template_sem); + ++/* Used if the driver currently has no own support for /proc/scsi */ ++static int generic_proc_info(char *buffer, char **start, off_t offset, ++ int count, const char *(*info)(struct Scsi_Host *), ++ struct Scsi_Host *shost) ++{ ++ int len, pos, begin = 0; ++ static const char noprocfs[] = ++ "The driver does not yet support the proc-fs\n"; ++ ++ if (info && shost) ++ len = sprintf(buffer, "%s\n", info(shost)); ++ else ++ len = sprintf(buffer, "%s\n", noprocfs); ++ ++ pos = len; ++ if (pos < offset) { ++ len = 0; ++ begin = pos; ++ } ++ ++ *start = buffer + (offset - begin); ++ len -= (offset - begin); ++ if (len > count) ++ len = count; ++ ++ return len; ++} ++ + static int proc_scsi_read(char *buffer, char **start, off_t offset, + int length, int *eof, void *data) + { + struct Scsi_Host *shost = data; + int n; + +- n = shost->hostt->proc_info(shost, buffer, start, offset, length, 0); ++ if (shost->hostt->proc_info == NULL) ++ n = generic_proc_info(buffer, start, offset, length, ++ shost->hostt->info, shost); ++ else ++ n = shost->hostt->proc_info(shost, buffer, start, offset, ++ length, 0); ++ + *eof = (n < length); + + return n; +@@ -62,6 +96,8 @@ + char *page; + char *start; + ++ if (!shost->hostt->proc_info) ++ return -ENOSYS; + if (count > PROC_BLOCK_SIZE) + return -EOVERFLOW; + +@@ -79,9 +115,6 @@ + + void scsi_proc_hostdir_add(struct scsi_host_template *sht) + { +- if (!sht->proc_info) +- return; +- + down(&global_host_template_sem); + if (!sht->present++) { + sht->proc_dir = proc_mkdir(sht->proc_name, proc_scsi); +@@ -96,9 +129,6 @@ + + void scsi_proc_hostdir_rm(struct scsi_host_template *sht) + { +- if (!sht->proc_info) +- return; +- + down(&global_host_template_sem); + if (!--sht->present && sht->proc_dir) { + remove_proc_entry(sht->proc_name, proc_scsi); --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/drivers-scsi-sym_2-dv-hang.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/drivers-scsi-sym_2-dv-hang.dpatch @@ -0,0 +1,42 @@ +#! /bin/sh -e +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Fix DV hang with certain devices +## DP: Patch author: James Bottomley +## DP: Upstream status: Submitted + +. $(dirname $0)/DPATCH + +@DPATCH@ +There's a bad hang where the driver locks the system solid trying to do +domain validation with certain devices. The one I've managed to +reproduce it with is a Quantum Atlas. + +What happens is that setting the offset to zero is an async negotiation +message. However, the driver still seems to have DT set (which is +illegal). Most devices just reject this as stupid, but the Quantum +seems to try to obey it and hangs the bus. + +The simple fix is to reset all PPR options when the offset is set to +zero. + +James + +===== drivers/scsi/sym53c8xx_2/sym_glue.c 1.44 vs edited ===== +--- 1.44/drivers/scsi/sym53c8xx_2/sym_glue.c 2004-07-26 17:24:36 -04:00 ++++ edited/drivers/scsi/sym53c8xx_2/sym_glue.c 2004-08-19 22:30:35 -04:00 +@@ -2383,6 +2383,9 @@ + struct sym_hcb *np = ((struct host_data *)sdev->host->hostdata)->ncb; + struct sym_tcb *tp = &np->target[sdev->id]; + ++ if (offset == 0) ++ tp->tinfo.goal.options = 0; ++ + if (tp->tinfo.curr.options & PPR_OPT_DT) { + if (offset > np->maxoffs_dt) + offset = np->maxoffs_dt; + +- +To unsubscribe from this list: send the line "unsubscribe linux-scsi" in +the body of a message to majordomo@vger.kernel.org +More majordomo info at http://vger.kernel.org/majordomo-info.html --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/drivers-scsi_changer.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/drivers-scsi_changer.dpatch @@ -0,0 +1,1537 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: SCSI Media Changer - http://bytesex.org/patches/ +## DP: Patch author: unknown +## DP: Upstream status: not submitted + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN kernel-source-2.6.6/Documentation/scsi-changer.txt kernel-source-2.6.6-1/Documentation/scsi-changer.txt +--- kernel-source-2.6.6/Documentation/scsi-changer.txt 1970-01-01 10:00:00.000000000 +1000 ++++ kernel-source-2.6.6-1/Documentation/scsi-changer.txt 2004-03-17 21:24:11.000000000 +1100 +@@ -0,0 +1,184 @@ ++ ++README for the SCSI media changer driver ++======================================== ++ ++This is a driver for SCSI Medium Changer devices, which are listed ++with "Type: Medium Changer" in /proc/scsi/scsi. ++ ++This is for *real* Jukeboxes. It is *not* supported to work with ++common small CD-ROM changers, neither one-lun-per-slot SCSI changers ++nor IDE drives. ++ ++Userland tools available from: http://bytesex.org/changer.html ++ ++ ++General Information ++------------------- ++ ++First some words about how changers work: A changer has 2 (possibly ++more) SCSI ID's. One for the changer device which controls the robot, ++and one for the device which actually reads and writes the data. The ++later may be anything, a MOD, a CD-ROM, a tape or whatever. For the ++changer device this is a "don't care", he *only* shuffles around the ++media, nothing else. ++ ++ ++The SCSI changer model is complex, compared to - for example - IDE-CD ++changers. But it allows to handle nearly all possible cases. It knows ++4 different types of changer elements: ++ ++ media transport - this one shuffles around the media, i.e. the ++ transport arm. Also known as "picker". ++ storage - a slot which can hold a media. ++ import/export - the same as above, but is accessable from outside, ++ i.e. there the operator (you !) can use this to ++ fill in and remove media from the changer. ++ Sometimes named "mailslot". ++ data transfer - this is the device which reads/writes, i.e. the ++ CD-ROM / Tape / whatever drive. ++ ++None of these is limited to one: A huge Jukebox could have slots for ++123 CD-ROM's, 5 CD-ROM readers (and therefore 6 SCSI ID's: the changer ++and each CD-ROM) and 2 transport arms. No problem to handle. ++ ++ ++How it is implemented ++--------------------- ++ ++I implemented the driver as character device driver with a NetBSD-like ++ioctl interface. Just grabbed NetBSD's header file and one of the ++other linux SCSI device drivers as starting point. The interface ++should be source code compatible with NetBSD. So if there is any ++software (anybody knows ???) which supports a BSDish changer driver, ++it should work with this driver too. ++ ++Over time a few more ioctls where added, volume tag support for example ++wasn't covered by the NetBSD ioctl API. ++ ++ ++Current State ++------------- ++ ++Support for more than one transport arm is not implemented yet (and ++nobody asked for it so far...). ++ ++I test and use the driver myself with a 35 slot cdrom jukebox from ++Grundig. I got some reports telling it works ok with tape autoloaders ++(Exabyte, HP and DEC). Some People use this driver with amanda. It ++works fine with small (11 slots) and a huge (4 MOs, 88 slots) ++magneto-optical Jukebox. Probably with lots of other changers too, most ++(but not all :-) people mail me only if it does *not* work... ++ ++I don't have any device lists, neither black-list nor white-list. Thus ++it is quite useless to ask me whenever a specific device is supported or ++not. In theory every changer device which supports the SCSI-2 media ++changer command set should work out-of-the-box with this driver. If it ++doesn't, it is a bug. Either within the driver or within the firmware ++of the changer device. ++ ++ ++Using it ++-------- ++ ++This is a character device with major number is 86, so use ++"mknod /dev/sch0 c 86 0" to create the special file for the driver. ++ ++If the module finds the changer, it prints some messages about the ++device [ try "dmesg" if you don't see anything ] and should show up in ++/proc/devices. If not.... some changers use ID ? / LUN 0 for the ++device and ID ? / LUN 1 for the robot mechanism. But Linux does *not* ++look for LUN's other than 0 as default, becauce there are to many ++broken devices. So you can try: ++ ++ 1) echo "scsi add-single-device 0 0 ID 1" > /proc/scsi/scsi ++ (replace ID with the SCSI-ID of the device) ++ 2) boot the kernel with "max_scsi_luns=1" on the command line ++ (append="max_scsi_luns=1" in lilo.conf should do the trick) ++ ++ ++Trouble? ++-------- ++ ++If you insmod the driver with "insmod debug=1", it will be verbose and ++prints a lot of stuff to the syslog. Compiling the kernel with ++CONFIG_SCSI_CONSTANTS=y improves the quality of the error messages alot ++because the kernel will translate the error codes into human-readable ++strings then. ++ ++You can display these messages with the dmesg command (or check the ++logfiles). If you email me some question becauce of a problem with the ++driver, please include these messages. ++ ++ ++Insmod options ++-------------- ++ ++debug=0/1 ++ Enable debug messages (see above, default: 0). ++ ++verbose=0/1 ++ Be verbose (default: 1). ++ ++init=0/1 ++ Send INITIALIZE ELEMENT STATUS command to the changer ++ at insmod time (default: 1). ++ ++check_busy=0/1 ++ When moving media from/to data transfer elements, check ++ whenever the device is busy and refuse to move if so ++ (default: 1). ++ ++timeout_init= ++ timeout for the INITIALIZE ELEMENT STATUS command ++ (default: 3600). ++ ++timeout_move= ++ timeout for all other commands (default: 120). ++ ++dt_id=,,... ++dt_lun=,,... ++ These two allow to specify the SCSI ID and LUN for the data ++ transfer elements. You likely don't need this as the jukebox ++ should provide this information. But some devices don't ... ++ ++vendor_firsts= ++vendor_counts= ++vendor_labels= ++ These insmod options can be used to tell the driver that there ++ are some vendor-specific element types. Grundig for example ++ does this. Some jukeboxes have a printer to label fresh burned ++ CDs, which is addressed as element 0xc000 (type 5). To tell the ++ driver about this vendor-specific element, use this: ++ $ insmod ch \ ++ vendor_firsts=0xc000 \ ++ vendor_counts=1 \ ++ vendor_labels=printer ++ All three insmod options accept up to four comma-separated ++ values, this way you can configure the element types 5-8. ++ You likely need the SCSI specs for the device in question to ++ find the correct values as they are not covered by the SCSI-2 ++ standard. ++ ++ ++Credits ++------- ++ ++I wrote this driver using the famous mailing-patches-around-the-world ++method. With (more or less) help from: ++ ++ Daniel Moehwald ++ Dane Jasper ++ R. Scott Bailey ++ Jonathan Corbet ++ ++Special thanks go to ++ Martin Kuehne ++for a old, second-hand (but full functional) cdrom jukebox which I use ++to develop/test driver and tools now. ++ ++Have fun, ++ ++ Gerd ++ ++-- ++Gerd Knorr +diff -urN kernel-source-2.6.6/drivers/scsi/Kconfig kernel-source-2.6.6-1/drivers/scsi/Kconfig +--- kernel-source-2.6.6/drivers/scsi/Kconfig 2004-05-10 19:47:58.000000000 +1000 ++++ kernel-source-2.6.6-1/drivers/scsi/Kconfig 2004-05-10 22:21:38.000000000 +1000 +@@ -137,6 +137,24 @@ + + If unsure, say N. + ++config CHR_DEV_SCH ++ tristate "SCSI media changer support" ++ depends on SCSI ++ ---help--- ++ This is a driver for SCSI media changers. Most common devices are ++ tape libraries and MOD/CDROM jukeboxes. *Real* jukeboxes, you ++ don't need this for those tiny 6-slot cdrom changers. Media ++ changers are listed as "Type: Medium Changer" in /proc/scsi/scsi. ++ If you have such hardware and want to use it with linux, say Y ++ here. Check for details. ++ ++ If you want to compile this as a module ( = code which can be ++ inserted in and removed from the running kernel whenever you want), ++ say M here and read and ++ . The module will be called ch.o. ++ If unsure, say N. ++ ++ + comment "Some SCSI devices (e.g. CD jukebox) support multiple LUNs" + depends on SCSI + +diff -urN kernel-source-2.6.6/drivers/scsi/Makefile kernel-source-2.6.6-1/drivers/scsi/Makefile +--- kernel-source-2.6.6/drivers/scsi/Makefile 2004-05-10 19:47:58.000000000 +1000 ++++ kernel-source-2.6.6-1/drivers/scsi/Makefile 2004-05-10 22:21:38.000000000 +1000 +@@ -132,6 +131,7 @@ + obj-$(CONFIG_BLK_DEV_SD) += sd_mod.o + obj-$(CONFIG_BLK_DEV_SR) += sr_mod.o + obj-$(CONFIG_CHR_DEV_SG) += sg.o ++obj-$(CONFIG_CHR_DEV_SCH) += ch.o + + scsi_mod-y += scsi.o hosts.o scsi_ioctl.o constants.o \ + scsicam.o scsi_error.o scsi_lib.o \ +diff -urN kernel-source-2.6.6/drivers/scsi/ch.c kernel-source-2.6.6-1/drivers/scsi/ch.c +--- kernel-source-2.6.6/drivers/scsi/ch.c 1970-01-01 10:00:00.000000000 +1000 ++++ kernel-source-2.6.6-1/drivers/scsi/ch.c 2004-03-17 21:24:11.000000000 +1100 +@@ -0,0 +1,1085 @@ ++/* ++ * SCSI Media Changer device driver for Linux 2.6 ++ * ++ * (c) 1996-2003 Gerd Knorr ++ * ++ */ ++ ++#define VERSION "0.22" ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include /* here are all the ioctls */ ++ ++#define MAJOR_NR SCSI_CHANGER_MAJOR ++ ++#define CH_DT_MAX 16 ++#define CH_TYPES 8 ++ ++#include ++#include ++#include ++ ++#include "scsi.h" ++#include "hosts.h" ++ ++MODULE_SUPPORTED_DEVICE("sch"); ++MODULE_DESCRIPTION("device driver for scsi media changer devices"); ++MODULE_AUTHOR("Gerd Knorr "); ++MODULE_LICENSE("GPL"); ++ ++static int check_busy = 1; ++MODULE_PARM(check_busy,"i"); ++MODULE_PARM_DESC(check_busy, \ ++ "enable/disable busy check for data transfer elements (default: on)"); ++ ++static int init = 1; ++MODULE_PARM(init,"i"); ++MODULE_PARM_DESC(init, \ ++ "initialize element status on driver load (default: on)"); ++ ++static int timeout_move = 300; ++MODULE_PARM(timeout_move,"i"); ++MODULE_PARM_DESC(timeout_move,"timeout for move commands " ++ "(default: 300 seconds)"); ++ ++static int timeout_init = 3600; ++MODULE_PARM(timeout_init,"i"); ++MODULE_PARM_DESC(timeout_init,"timeout for INITIALIZE ELEMENT STATUS " ++ "(default: 3600 seconds)"); ++ ++static int verbose = 1; ++MODULE_PARM(verbose,"i"); ++MODULE_PARM_DESC(verbose,"be verbose (default: on)"); ++ ++static int debug = 0; ++MODULE_PARM(debug,"i"); ++MODULE_PARM_DESC(debug,"enable/disable debug messages, also prints more " ++ "detailed sense codes on scsi errors (default: off)"); ++ ++static int dt_id[CH_DT_MAX] = { [ 0 ... (CH_DT_MAX-1) ] = -1 }; ++static int dt_lun[CH_DT_MAX]; ++MODULE_PARM(dt_id,"1-" __MODULE_STRING(CH_DT_MAX) "i"); ++MODULE_PARM(dt_lun,"1-" __MODULE_STRING(CH_DT_MAX) "i"); ++ ++/* tell the driver about vendor-specific slots */ ++static int vendor_firsts[CH_TYPES-4]; ++static int vendor_counts[CH_TYPES-4]; ++static char *vendor_labels[CH_TYPES-4]; ++MODULE_PARM(vendor_firsts,"1-4i"); ++MODULE_PARM(vendor_counts,"1-4i"); ++MODULE_PARM(vendor_labels,"1-4s"); ++ ++#define dprintk(fmt, arg...) if (debug) \ ++ printk(KERN_DEBUG "%s: " fmt, ch->name, ##arg) ++#define vprintk(fmt, arg...) if (verbose) \ ++ printk(KERN_INFO "%s: " fmt, ch->name, ##arg) ++ ++/* ------------------------------------------------------------------- */ ++ ++#define MAX_RETRIES 1 ++ ++static int ch_probe(struct device *); ++static int ch_remove(struct device *); ++static int ch_open(struct inode * inode, struct file * filp); ++static int ch_release(struct inode * inode, struct file * filp); ++static int ch_ioctl(struct inode * inode, struct file * filp, ++ unsigned int cmd, unsigned long arg); ++ ++typedef struct { ++ struct list_head list; ++ int minor; ++ char name[8]; ++ Scsi_Device *device; ++ Scsi_Device **dt; /* ptrs to data transfer elements */ ++ u_int firsts[CH_TYPES]; ++ u_int counts[CH_TYPES]; ++ u_int unit_attention; ++ u_int voltags; ++ struct semaphore lock; ++} scsi_changer; ++ ++static LIST_HEAD(ch_devlist); ++static spinlock_t ch_devlist_lock = SPIN_LOCK_UNLOCKED; ++static int ch_devcount; ++ ++struct scsi_driver ch_template = ++{ ++ .owner = THIS_MODULE, ++ .gendrv = { ++ .name = "ch", ++ .probe = ch_probe, ++ .remove = ch_remove, ++ }, ++}; ++ ++static struct file_operations changer_fops = ++{ ++ .owner = THIS_MODULE, ++ .open = ch_open, ++ .release = ch_release, ++ .ioctl = ch_ioctl, ++}; ++ ++static struct { ++ unsigned char sense; ++ unsigned char asc; ++ unsigned char ascq; ++ int errno; ++} err[] = { ++/* Just filled in what looks right. Hav'nt checked any standard paper for ++ these errno assignments, so they may be wrong... */ ++ { ++ .sense = ILLEGAL_REQUEST, ++ .asc = 0x21, ++ .ascq = 0x01, ++ .errno = EBADSLT, /* Invalid element address */ ++ },{ ++ .sense = ILLEGAL_REQUEST, ++ .asc = 0x28, ++ .ascq = 0x01, ++ .errno = EBADE, /* Import or export element accessed */ ++ },{ ++ .sense = ILLEGAL_REQUEST, ++ .asc = 0x3B, ++ .ascq = 0x0D, ++ .errno = EXFULL, /* Medium destination element full */ ++ },{ ++ .sense = ILLEGAL_REQUEST, ++ .asc = 0x3B, ++ .ascq = 0x0E, ++ .errno = EBADE, /* Medium source element empty */ ++ },{ ++ .sense = ILLEGAL_REQUEST, ++ .asc = 0x20, ++ .ascq = 0x00, ++ .errno = EBADRQC, /* Invalid command operation code */ ++ },{ ++ /* end of list */ ++ } ++}; ++ ++/* ------------------------------------------------------------------- */ ++/* ioctl32 compat */ ++ ++#ifdef CONFIG_COMPAT ++ ++struct changer_element_status32 { ++ int ces_type; ++ compat_uptr_t ces_data; ++}; ++#define CHIOGSTATUS32 _IOW('c', 8,struct changer_element_status32) ++ ++static struct { ++ unsigned int cmd; ++ int reg; ++} ioctl32_cmds[] = { ++ { .cmd = CHIOMOVE }, ++ { .cmd = CHIOEXCHANGE }, ++ { .cmd = CHIOPOSITION }, ++ { .cmd = CHIOGPICKER }, ++ { .cmd = CHIOSPICKER }, ++ { .cmd = CHIOGPARAMS }, ++ { .cmd = CHIOGELEM }, ++ { .cmd = CHIOINITELEM }, ++ { .cmd = CHIOSVOLTAG }, ++ { .cmd = CHIOGVPARAMS }, ++ { .cmd = CHIOGSTATUS32 }, ++}; ++ ++static int ioctl32_register(void) ++{ ++ unsigned int i; ++ int err; ++ ++ for (i = 0; i < ARRAY_SIZE(ioctl32_cmds); i++) { ++ err = register_ioctl32_conversion(ioctl32_cmds[i].cmd,NULL); ++ if (err >= 0) ++ ioctl32_cmds[i].reg++; ++ } ++ return 0; ++} ++static int ioctl32_unregister(void) ++{ ++ unsigned int i; ++ ++ for (i = 0; i < ARRAY_SIZE(ioctl32_cmds); i++) { ++ if (ioctl32_cmds[i].reg) { ++ unregister_ioctl32_conversion(ioctl32_cmds[i].cmd); ++ ioctl32_cmds[i].reg--; ++ } ++ } ++ return 0; ++} ++ ++#else ++ ++static int ioctl32_register(void) { return 0; } ++static int ioctl32_unregister(void) { return 0; } ++ ++#endif ++ ++/* ------------------------------------------------------------------- */ ++ ++static int ch_find_errno(unsigned char *sense_buffer) ++{ ++ int i,errno = 0; ++ ++ /* Check to see if additional sense information is available */ ++ if (sense_buffer[7] > 5 && ++ sense_buffer[12] != 0) { ++ for (i = 0; err[i].errno != 0; i++) { ++ if (err[i].sense == sense_buffer[ 2] && ++ err[i].asc == sense_buffer[12] && ++ err[i].ascq == sense_buffer[13]) { ++ errno = -err[i].errno; ++ break; ++ } ++ } ++ } ++ if (errno == 0) ++ errno = -EIO; ++ return errno; ++} ++ ++static void ++ch_request_done (Scsi_Cmnd * sc) ++{ ++ sc->request->rq_status = RQ_SCSI_DONE; /* Busy, but indicate request done */ ++ if (sc->request->waiting != NULL) ++ complete(sc->request->waiting); ++} ++ ++static int ++ch_do_scsi(scsi_changer *ch, unsigned char *cmd, ++ void *buffer, unsigned buflength) ++{ ++ int errno, retries = 0, timeout; ++ DECLARE_COMPLETION(wait); ++ Scsi_Request *sr; ++ ++ sr = scsi_allocate_request(ch->device, GFP_ATOMIC); ++ if (NULL == sr) ++ return -ENOMEM; ++ ++ retry: ++ errno = 0; ++ if (debug) { ++ dprintk("command: %s",""); ++ print_command(cmd); ++ } ++ ++ sr->sr_request->waiting = &wait; ++ timeout = (cmd[0] == INITIALIZE_ELEMENT_STATUS) ++ ? timeout_init : timeout_move; ++ scsi_do_req(sr, cmd, buffer, buflength, ch_request_done, ++ timeout * HZ, MAX_RETRIES); ++ wait_for_completion(&wait); ++ sr->sr_request->waiting = NULL; ++ ++ dprintk("result: 0x%x\n",sr->sr_result); ++ if (driver_byte(sr->sr_result) != 0) { ++ if (debug) ++ print_req_sense(ch->name, sr); ++ errno = ch_find_errno(sr->sr_sense_buffer); ++ ++ switch(sr->sr_sense_buffer[2] & 0xf) { ++ case UNIT_ATTENTION: ++ ch->unit_attention = 1; ++ if (retries++ < 3) ++ goto retry; ++ break; ++ } ++ } ++ scsi_release_request(sr); ++ return errno; ++} ++ ++/* ------------------------------------------------------------------------ */ ++ ++static int ++ch_elem_to_typecode(scsi_changer *ch, u_int elem) ++{ ++ int i; ++ ++ for (i = 0; i < CH_TYPES; i++) { ++ if (elem >= ch->firsts[i] && ++ elem < ch->firsts[i] + ++ ch->counts[i]) ++ return i+1; ++ } ++ return 0; ++} ++ ++static int ++ch_read_element_status(scsi_changer *ch, u_int elem, char *data) ++{ ++ u_char cmd[12]; ++ u_char *buffer; ++ int result; ++ ++ buffer = kmalloc(512, GFP_KERNEL); ++ if(!buffer) ++ return -ENOMEM; ++ ++ retry: ++ memset(cmd,0,sizeof(cmd)); ++ cmd[0] = READ_ELEMENT_STATUS; ++ cmd[1] = (ch->device->lun << 5) | ++ (ch->voltags ? 0x10 : 0) | ++ ch_elem_to_typecode(ch,elem); ++ cmd[2] = (elem >> 8) & 0xff; ++ cmd[3] = elem & 0xff; ++ cmd[5] = 1; ++ cmd[9] = 255; ++ if (0 == (result = ch_do_scsi(ch, cmd, buffer, 256))) { ++ if (((buffer[16] << 8) | buffer[17]) != elem) { ++ dprintk("asked for element 0x%02x, got 0x%02x\n", ++ elem,(buffer[16] << 8) | buffer[17]); ++ kfree(buffer); ++ return -EIO; ++ } ++ memcpy(data,buffer+16,16); ++ } else { ++ if (ch->voltags) { ++ ch->voltags = 0; ++ vprintk("device has no volume tag support%s\n",""); ++ goto retry; ++ } ++ dprintk("READ ELEMENT STATUS for element 0x%x failed\n",elem); ++ } ++ kfree(buffer); ++ return result; ++} ++ ++static int ++ch_init_elem(scsi_changer *ch) ++{ ++ int err; ++ u_char cmd[6]; ++ ++ vprintk("INITIALIZE ELEMENT STATUS, may take some time ...%s\n",""); ++ memset(cmd,0,sizeof(cmd)); ++ cmd[0] = INITIALIZE_ELEMENT_STATUS; ++ cmd[1] = ch->device->lun << 5; ++ err = ch_do_scsi(ch, cmd, NULL, 0); ++ vprintk("... finished%s\n",""); ++ return err; ++} ++ ++static int ++ch_readconfig(scsi_changer *ch) ++{ ++ u_char cmd[10], data[16]; ++ u_char *buffer; ++ int result,id,lun,i; ++ u_int elem; ++ ++ buffer = kmalloc(512, GFP_KERNEL); ++ if (!buffer) ++ return -ENOMEM; ++ memset(buffer,0,512); ++ ++ memset(cmd,0,sizeof(cmd)); ++ cmd[0] = MODE_SENSE; ++ cmd[1] = ch->device->lun << 5; ++ cmd[2] = 0x1d; ++ cmd[4] = 255; ++ result = ch_do_scsi(ch, cmd, buffer, 255); ++ if (0 != result) { ++ cmd[1] |= (1<<3); ++ result = ch_do_scsi(ch, cmd, buffer, 255); ++ } ++ if (0 == result) { ++ ch->firsts[CHET_MT] = ++ (buffer[buffer[3]+ 6] << 8) | buffer[buffer[3]+ 7]; ++ ch->counts[CHET_MT] = ++ (buffer[buffer[3]+ 8] << 8) | buffer[buffer[3]+ 9]; ++ ch->firsts[CHET_ST] = ++ (buffer[buffer[3]+10] << 8) | buffer[buffer[3]+11]; ++ ch->counts[CHET_ST] = ++ (buffer[buffer[3]+12] << 8) | buffer[buffer[3]+13]; ++ ch->firsts[CHET_IE] = ++ (buffer[buffer[3]+14] << 8) | buffer[buffer[3]+15]; ++ ch->counts[CHET_IE] = ++ (buffer[buffer[3]+16] << 8) | buffer[buffer[3]+17]; ++ ch->firsts[CHET_DT] = ++ (buffer[buffer[3]+18] << 8) | buffer[buffer[3]+19]; ++ ch->counts[CHET_DT] = ++ (buffer[buffer[3]+20] << 8) | buffer[buffer[3]+21]; ++ vprintk("type #1 (mt): 0x%x+%d [medium transport]\n", ++ ch->firsts[CHET_MT], ++ ch->counts[CHET_MT]); ++ vprintk("type #2 (st): 0x%x+%d [storage]\n", ++ ch->firsts[CHET_ST], ++ ch->counts[CHET_ST]); ++ vprintk("type #3 (ie): 0x%x+%d [import/export]\n", ++ ch->firsts[CHET_IE], ++ ch->counts[CHET_IE]); ++ vprintk("type #4 (dt): 0x%x+%d [data transfer]\n", ++ ch->firsts[CHET_DT], ++ ch->counts[CHET_DT]); ++ } else { ++ vprintk("reading element address assigment page failed!%s\n", ++ ""); ++ } ++ ++ /* vendor specific element types */ ++ for (i = 0; i < 4; i++) { ++ if (0 == vendor_counts[i]) ++ continue; ++ if (NULL == vendor_labels[i]) ++ continue; ++ ch->firsts[CHET_V1+i] = vendor_firsts[i]; ++ ch->counts[CHET_V1+i] = vendor_counts[i]; ++ vprintk("type #%d (v%d): 0x%x+%d [%s, vendor specific]\n", ++ i+5,i+1,vendor_firsts[i],vendor_counts[i], ++ vendor_labels[i]); ++ } ++ ++ /* look up the devices of the data transfer elements */ ++ ch->dt = ++ kmalloc(ch->counts[CHET_DT]*sizeof(Scsi_Device*), ++ GFP_ATOMIC); ++ for (elem = 0; elem < ch->counts[CHET_DT]; elem++) { ++ id = -1; ++ lun = 0; ++ if (-1 != dt_id[elem]) { ++ id = dt_id[elem]; ++ lun = dt_lun[elem]; ++ vprintk("dt 0x%x: [insmod option] ", ++ elem+ch->firsts[CHET_DT]); ++ } else if (0 != ch_read_element_status ++ (ch,elem+ch->firsts[CHET_DT],data)) { ++ vprintk("dt 0x%x: READ ELEMENT STATUS failed\n", ++ elem+ch->firsts[CHET_DT]); ++ } else { ++ vprintk("dt 0x%x: ",elem+ch->firsts[CHET_DT]); ++ if (data[6] & 0x80) { ++ if (verbose) ++ printk("not this SCSI bus\n"); ++ ch->dt[elem] = NULL; ++ } else if (0 == (data[6] & 0x30)) { ++ if (verbose) ++ printk("ID/LUN unknown\n"); ++ ch->dt[elem] = NULL; ++ } else { ++ id = ch->device->id; ++ lun = 0; ++ if (data[6] & 0x20) id = data[7]; ++ if (data[6] & 0x10) lun = data[6] & 7; ++ } ++ } ++ if (-1 != id) { ++ if (verbose) ++ printk("ID %i, LUN %i, ",id,lun); ++ ch->dt[elem] = ++ scsi_device_lookup(ch->device->host, ++ ch->device->channel, ++ id,lun); ++ if (!ch->dt[elem]) { ++ /* should not happen */ ++ if (verbose) ++ printk("Huh? device not found!\n"); ++ } else { ++ if (verbose) ++ printk("name: %8.8s %16.16s %4.4s\n", ++ ch->dt[elem]->vendor, ++ ch->dt[elem]->model, ++ ch->dt[elem]->rev); ++ } ++ } ++ } ++ ch->voltags = 1; ++ kfree(buffer); ++ ++ return 0; ++} ++ ++/* ------------------------------------------------------------------------ */ ++ ++static int ++ch_position(scsi_changer *ch, u_int trans, u_int elem, int rotate) ++{ ++ u_char cmd[10]; ++ ++ dprintk("position: 0x%x\n",elem); ++ if (0 == trans) ++ trans = ch->firsts[CHET_MT]; ++ memset(cmd,0,sizeof(cmd)); ++ cmd[0] = POSITION_TO_ELEMENT; ++ cmd[1] = ch->device->lun << 5; ++ cmd[2] = (trans >> 8) & 0xff; ++ cmd[3] = trans & 0xff; ++ cmd[4] = (elem >> 8) & 0xff; ++ cmd[5] = elem & 0xff; ++ cmd[8] = rotate ? 1 : 0; ++ return ch_do_scsi(ch, cmd, NULL,0); ++} ++ ++static int ++ch_move(scsi_changer *ch, u_int trans, u_int src, u_int dest, int rotate) ++{ ++ u_char cmd[12]; ++ ++ dprintk("move: 0x%x => 0x%x\n",src,dest); ++ if (0 == trans) ++ trans = ch->firsts[CHET_MT]; ++ memset(cmd,0,sizeof(cmd)); ++ cmd[0] = MOVE_MEDIUM; ++ cmd[1] = ch->device->lun << 5; ++ cmd[2] = (trans >> 8) & 0xff; ++ cmd[3] = trans & 0xff; ++ cmd[4] = (src >> 8) & 0xff; ++ cmd[5] = src & 0xff; ++ cmd[6] = (dest >> 8) & 0xff; ++ cmd[7] = dest & 0xff; ++ cmd[10] = rotate ? 1 : 0; ++ return ch_do_scsi(ch, cmd, NULL,0); ++} ++ ++static int ++ch_exchange(scsi_changer *ch, u_int trans, u_int src, ++ u_int dest1, u_int dest2, int rotate1, int rotate2) ++{ ++ u_char cmd[12]; ++ ++ dprintk("exchange: 0x%x => 0x%x => 0x%x\n", ++ src,dest1,dest2); ++ if (0 == trans) ++ trans = ch->firsts[CHET_MT]; ++ memset(cmd,0,sizeof(cmd)); ++ cmd[0] = EXCHANGE_MEDIUM; ++ cmd[1] = ch->device->lun << 5; ++ cmd[2] = (trans >> 8) & 0xff; ++ cmd[3] = trans & 0xff; ++ cmd[4] = (src >> 8) & 0xff; ++ cmd[5] = src & 0xff; ++ cmd[6] = (dest1 >> 8) & 0xff; ++ cmd[7] = dest1 & 0xff; ++ cmd[8] = (dest2 >> 8) & 0xff; ++ cmd[9] = dest2 & 0xff; ++ cmd[10] = (rotate1 ? 1 : 0) | (rotate2 ? 2 : 0); ++ ++ return ch_do_scsi(ch, cmd, NULL,0); ++} ++ ++static void ++ch_check_voltag(char *tag) ++{ ++ int i; ++ ++ for (i = 0; i < 32; i++) { ++ /* restrict to ascii */ ++ if (tag[i] >= 0x7f || tag[i] < 0x20) ++ tag[i] = ' '; ++ /* don't allow search wildcards */ ++ if (tag[i] == '?' || ++ tag[i] == '*') ++ tag[i] = ' '; ++ } ++} ++ ++static int ++ch_set_voltag(scsi_changer *ch, u_int elem, ++ int alternate, int clear, u_char *tag) ++{ ++ u_char cmd[12]; ++ u_char *buffer; ++ int result; ++ ++ buffer = kmalloc(512, GFP_KERNEL); ++ if (!buffer) ++ return -ENOMEM; ++ memset(buffer,0,512); ++ ++ dprintk("%s %s voltag: 0x%x => \"%s\"\n", ++ clear ? "clear" : "set", ++ alternate ? "alternate" : "primary", ++ elem, tag); ++ memset(cmd,0,sizeof(cmd)); ++ cmd[0] = SEND_VOLUME_TAG; ++ cmd[1] = (ch->device->lun << 5) | ++ ch_elem_to_typecode(ch,elem); ++ cmd[2] = (elem >> 8) & 0xff; ++ cmd[3] = elem & 0xff; ++ cmd[5] = clear ++ ? (alternate ? 0x0d : 0x0c) ++ : (alternate ? 0x0b : 0x0a); ++ ++ cmd[9] = 255; ++ ++ memcpy(buffer,tag,32); ++ ch_check_voltag(buffer); ++ ++ result = ch_do_scsi(ch, cmd, buffer, 256); ++ kfree(buffer); ++ return result; ++} ++ ++static int ch_gstatus(scsi_changer *ch, int type, unsigned char *dest) ++{ ++ int retval = 0; ++ u_char data[16]; ++ unsigned int i; ++ ++ down(&ch->lock); ++ for (i = 0; i < ch->counts[type]; i++) { ++ if (0 != ch_read_element_status ++ (ch, ch->firsts[type]+i,data)) { ++ retval = -EIO; ++ break; ++ } ++ put_user(data[2], dest+i); ++ if (data[2] & CESTATUS_EXCEPT) ++ vprintk("element 0x%x: asc=0x%x, ascq=0x%x\n", ++ ch->firsts[type]+i, ++ (int)data[4],(int)data[5]); ++ retval = ch_read_element_status ++ (ch, ch->firsts[type]+i,data); ++ if (0 != retval) ++ break; ++ } ++ up(&ch->lock); ++ return retval; ++} ++ ++/* ------------------------------------------------------------------------ */ ++ ++static int ++ch_release(struct inode *inode, struct file *file) ++{ ++ scsi_changer *ch = file->private_data; ++ ++ scsi_device_put(ch->device); ++ file->private_data = NULL; ++ return 0; ++} ++ ++static int ++ch_open(struct inode *inode, struct file *file) ++{ ++ struct list_head *item; ++ scsi_changer *tmp, *ch; ++ int minor = iminor(inode); ++ ++ spin_lock(&ch_devlist_lock); ++ ch = NULL; ++ list_for_each(item,&ch_devlist) { ++ tmp = list_entry(item, scsi_changer, list); ++ if (tmp->minor == minor) ++ ch = tmp; ++ } ++ if (NULL == ch || scsi_device_get(ch->device)) { ++ spin_unlock(&ch_devlist_lock); ++ return -ENXIO; ++ } ++ spin_unlock(&ch_devlist_lock); ++ ++ file->private_data = ch; ++ return 0; ++} ++ ++static int ++ch_checkrange(scsi_changer *ch, unsigned int type, unsigned int unit) ++{ ++ if (type >= CH_TYPES || unit >= ch->counts[type]) ++ return -1; ++ return 0; ++} ++ ++/* for data transfer elements: check if they are busy */ ++static int ++ch_is_busy(scsi_changer *ch, int type, int unit) ++{ ++#if 0 /* hmm, access_count is gone :-/ */ ++ if (!check_busy) ++ return 0; ++ if (type != CHET_DT) ++ return 0; ++ if (!ch->dt[unit]) ++ return 0; ++ return atomic_read(&ch->dt[unit]->access_count); ++#else ++ return 0; ++#endif ++} ++ ++static int ch_ioctl(struct inode * inode, struct file * file, ++ unsigned int cmd, unsigned long arg) ++{ ++ scsi_changer *ch = file->private_data; ++ int retval; ++ ++ switch (cmd) { ++ case CHIOGPARAMS: ++ { ++ struct changer_params params; ++ ++ params.cp_curpicker = 0; ++ params.cp_npickers = ch->counts[CHET_MT]; ++ params.cp_nslots = ch->counts[CHET_ST]; ++ params.cp_nportals = ch->counts[CHET_IE]; ++ params.cp_ndrives = ch->counts[CHET_DT]; ++ ++ if (copy_to_user((void *) arg, ¶ms, sizeof(params))) ++ return -EFAULT; ++ return 0; ++ } ++ case CHIOGVPARAMS: ++ { ++ struct changer_vendor_params vparams; ++ ++ memset(&vparams,0,sizeof(vparams)); ++ if (ch->counts[CHET_V1]) { ++ vparams.cvp_n1 = ch->counts[CHET_V1]; ++ strncpy(vparams.cvp_label1,vendor_labels[0],16); ++ } ++ if (ch->counts[CHET_V2]) { ++ vparams.cvp_n2 = ch->counts[CHET_V2]; ++ strncpy(vparams.cvp_label2,vendor_labels[1],16); ++ } ++ if (ch->counts[CHET_V3]) { ++ vparams.cvp_n3 = ch->counts[CHET_V3]; ++ strncpy(vparams.cvp_label3,vendor_labels[2],16); ++ } ++ if (ch->counts[CHET_V4]) { ++ vparams.cvp_n4 = ch->counts[CHET_V4]; ++ strncpy(vparams.cvp_label4,vendor_labels[3],16); ++ } ++ if (copy_to_user((void *) arg, &vparams, sizeof(vparams))) ++ return -EFAULT; ++ return 0; ++ } ++ ++ case CHIOPOSITION: ++ { ++ struct changer_position pos; ++ ++ if (copy_from_user(&pos, (void*)arg, sizeof (pos))) ++ return -EFAULT; ++ ++ if (0 != ch_checkrange(ch, pos.cp_type, pos.cp_unit)) { ++ dprintk("CHIOPOSITION: invalid parameter%s\n",""); ++ return -EBADSLT; ++ } ++ down(&ch->lock); ++ retval = ch_position(ch,0, ++ ch->firsts[pos.cp_type] + pos.cp_unit, ++ pos.cp_flags & CP_INVERT); ++ up(&ch->lock); ++ return retval; ++ } ++ ++ case CHIOMOVE: ++ { ++ struct changer_move mv; ++ ++ if (copy_from_user(&mv, (void*)arg, sizeof (mv))) ++ return -EFAULT; ++ ++ if (0 != ch_checkrange(ch, mv.cm_fromtype, mv.cm_fromunit) || ++ 0 != ch_checkrange(ch, mv.cm_totype, mv.cm_tounit )) { ++ dprintk("CHIOMOVE: invalid parameter%s\n",""); ++ return -EBADSLT; ++ } ++ if (ch_is_busy(ch, mv.cm_fromtype, mv.cm_fromunit) || ++ ch_is_busy(ch, mv.cm_totype, mv.cm_tounit )) ++ return -EBUSY; ++ ++ down(&ch->lock); ++ retval = ch_move(ch,0, ++ ch->firsts[mv.cm_fromtype] + mv.cm_fromunit, ++ ch->firsts[mv.cm_totype] + mv.cm_tounit, ++ mv.cm_flags & CM_INVERT); ++ up(&ch->lock); ++ return retval; ++ } ++ ++ case CHIOEXCHANGE: ++ { ++ struct changer_exchange mv; ++ ++ if (copy_from_user(&mv, (void*)arg, sizeof (mv))) ++ return -EFAULT; ++ ++ if (0 != ch_checkrange(ch, mv.ce_srctype, mv.ce_srcunit ) || ++ 0 != ch_checkrange(ch, mv.ce_fdsttype, mv.ce_fdstunit) || ++ 0 != ch_checkrange(ch, mv.ce_sdsttype, mv.ce_sdstunit)) { ++ dprintk("CHIOEXCHANGE: invalid parameter%s\n",""); ++ return -EBADSLT; ++ } ++ if (0 != ch_is_busy(ch, mv.ce_srctype, mv.ce_srcunit ) || ++ 0 != ch_is_busy(ch, mv.ce_fdsttype, mv.ce_fdstunit) || ++ 0 != ch_is_busy(ch, mv.ce_sdsttype, mv.ce_sdstunit)) ++ return -EBUSY; ++ ++ down(&ch->lock); ++ retval = ch_exchange ++ (ch,0, ++ ch->firsts[mv.ce_srctype] + mv.ce_srcunit, ++ ch->firsts[mv.ce_fdsttype] + mv.ce_fdstunit, ++ ch->firsts[mv.ce_sdsttype] + mv.ce_sdstunit, ++ mv.ce_flags & CE_INVERT1, mv.ce_flags & CE_INVERT2); ++ up(&ch->lock); ++ return retval; ++ } ++ ++ case CHIOGSTATUS: ++ { ++ struct changer_element_status ces; ++ ++ if (copy_from_user(&ces, (void*)arg, sizeof (ces))) ++ return -EFAULT; ++ if (ces.ces_type < 0 || ces.ces_type >= CH_TYPES) ++ return -EINVAL; ++ ++ return ch_gstatus(ch, ces.ces_type, ces.ces_data); ++ } ++ ++#ifdef CONFIG_COMPAT ++ case CHIOGSTATUS32: ++ { ++ struct changer_element_status32 ces32; ++ unsigned char *data; ++ ++ if (copy_from_user(&ces32, (void*)arg, sizeof (ces32))) ++ return -EFAULT; ++ if (ces32.ces_type < 0 || ces32.ces_type >= CH_TYPES) ++ return -EINVAL; ++ ++ data = compat_ptr(ces32.ces_data); ++ return ch_gstatus(ch, ces32.ces_type, data); ++ } ++#endif ++ ++ case CHIOGELEM: ++ { ++ struct changer_get_element cge; ++ u_char cmd[12]; ++ u_char *buffer; ++ unsigned int elem; ++ int result,i; ++ ++ if (copy_from_user(&cge, (void*)arg, sizeof (cge))) ++ return -EFAULT; ++ ++ if (0 != ch_checkrange(ch, cge.cge_type, cge.cge_unit)) ++ return -EINVAL; ++ elem = ch->firsts[cge.cge_type] + cge.cge_unit; ++ ++ buffer = kmalloc(512, GFP_KERNEL); ++ if (!buffer) ++ return -ENOMEM; ++ down(&ch->lock); ++ ++ voltag_retry: ++ memset(cmd,0,sizeof(cmd)); ++ cmd[0] = READ_ELEMENT_STATUS; ++ cmd[1] = (ch->device->lun << 5) | ++ (ch->voltags ? 0x10 : 0) | ++ ch_elem_to_typecode(ch,elem); ++ cmd[2] = (elem >> 8) & 0xff; ++ cmd[3] = elem & 0xff; ++ cmd[5] = 1; ++ cmd[9] = 255; ++ ++ if (0 == (result = ch_do_scsi(ch, cmd, buffer, 256))) { ++ cge.cge_status = buffer[18]; ++ cge.cge_flags = 0; ++ if (buffer[18] & CESTATUS_EXCEPT) { ++ /* FIXME: fill cge_errno */ ++ } ++ if (buffer[25] & 0x80) { ++ cge.cge_flags |= CGE_SRC; ++ if (buffer[25] & 0x40) ++ cge.cge_flags |= CGE_INVERT; ++ elem = (buffer[26]<<8) | buffer[27]; ++ for (i = 0; i < 4; i++) { ++ if (elem >= ch->firsts[i] && ++ elem < ch->firsts[i] + ch->counts[i]) { ++ cge.cge_srctype = i; ++ cge.cge_srcunit = elem-ch->firsts[i]; ++ } ++ } ++ } ++ if ((buffer[22] & 0x30) == 0x30) { ++ cge.cge_flags |= CGE_IDLUN; ++ cge.cge_id = buffer[23]; ++ cge.cge_lun = buffer[22] & 7; ++ } ++ if (buffer[9] & 0x80) { ++ cge.cge_flags |= CGE_PVOLTAG; ++ memcpy(cge.cge_pvoltag,buffer+28,36); ++ } ++ if (buffer[9] & 0x40) { ++ cge.cge_flags |= CGE_AVOLTAG; ++ memcpy(cge.cge_avoltag,buffer+64,36); ++ } ++ } else if (ch->voltags) { ++ ch->voltags = 0; ++ vprintk("device has no volume tag support%s\n",""); ++ goto voltag_retry; ++ } ++ kfree(buffer); ++ up(&ch->lock); ++ ++ if (copy_to_user((void*)arg, &cge, sizeof (cge))) ++ return -EFAULT; ++ return result; ++ } ++ ++ case CHIOINITELEM: ++ { ++ down(&ch->lock); ++ retval = ch_init_elem(ch); ++ up(&ch->lock); ++ return retval; ++ } ++ ++ case CHIOSVOLTAG: ++ { ++ struct changer_set_voltag csv; ++ int elem; ++ ++ if (copy_from_user(&csv, (void*)arg, sizeof(csv))) ++ return -EFAULT; ++ ++ if (0 != ch_checkrange(ch, csv.csv_type, csv.csv_unit)) { ++ dprintk("CHIOSVOLTAG: invalid parameter%s\n",""); ++ return -EBADSLT; ++ } ++ elem = ch->firsts[csv.csv_type] + csv.csv_unit; ++ down(&ch->lock); ++ retval = ch_set_voltag(ch, elem, ++ csv.csv_flags & CSV_AVOLTAG, ++ csv.csv_flags & CSV_CLEARTAG, ++ csv.csv_voltag); ++ up(&ch->lock); ++ return retval; ++ } ++ ++ default: ++ return scsi_ioctl(ch->device, cmd, (void*)arg); ++ ++ } ++} ++ ++/* ------------------------------------------------------------------------ */ ++ ++static int ch_probe(struct device *dev) ++{ ++ struct scsi_device *sd = to_scsi_device(dev); ++ scsi_changer *ch; ++ ++ if (sd->type != TYPE_MEDIUM_CHANGER) ++ return -ENODEV; ++ ++ ch = kmalloc(sizeof(*ch), GFP_KERNEL); ++ if (NULL == ch) ++ return -ENOMEM; ++ ++ memset(ch,0,sizeof(*ch)); ++ ch->minor = ch_devcount; ++ sprintf(ch->name,"ch%d",ch->minor); ++ init_MUTEX(&ch->lock); ++ ch->device = sd; ++ ch_readconfig(ch); ++ if (init) ++ ch_init_elem(ch); ++ ++ devfs_mk_cdev(MKDEV(MAJOR_NR,ch->minor), ++ S_IFCHR | S_IRUGO | S_IWUGO, ch->name); ++ ++ printk(KERN_INFO "Attached scsi changer %s " ++ "at scsi%d, channel %d, id %d, lun %d\n", ++ ch->name, sd->host->host_no, sd->channel, sd->id, sd->lun); ++ ++ spin_lock(&ch_devlist_lock); ++ list_add_tail(&ch->list,&ch_devlist); ++ ch_devcount++; ++ spin_unlock(&ch_devlist_lock); ++ return 0; ++} ++ ++static int ch_remove(struct device *dev) ++{ ++ struct scsi_device *sd = to_scsi_device(dev); ++ struct list_head *item; ++ scsi_changer *tmp, *ch; ++ ++ spin_lock(&ch_devlist_lock); ++ ch = NULL; ++ list_for_each(item,&ch_devlist) { ++ tmp = list_entry(item, scsi_changer, list); ++ if (tmp->device == sd) ++ ch = tmp; ++ } ++ BUG_ON(NULL == ch); ++ list_del(&ch->list); ++ spin_unlock(&ch_devlist_lock); ++ ++ devfs_remove(ch->name); ++ kfree(ch->dt); ++ kfree(ch); ++ ch_devcount--; ++ return 0; ++} ++ ++static int __init init_ch_module(void) ++{ ++ int rc; ++ ++ printk(KERN_INFO "SCSI Media Changer driver v" VERSION ++ " for Linux " UTS_RELEASE "\n"); ++ rc = register_chrdev(MAJOR_NR,"ch",&changer_fops); ++ if (rc < 0) { ++ printk("Unable to get major %d for SCSI-Changer\n", ++ MAJOR_NR); ++ return rc; ++ } ++ ioctl32_register(); ++ rc = scsi_register_driver(&ch_template.gendrv); ++ if (rc < 0) ++ goto fail1; ++ return 0; ++ ++ fail1: ++ ioctl32_unregister(); ++ unregister_chrdev(MAJOR_NR, "ch"); ++ return rc; ++} ++ ++static void __exit exit_ch_module(void) ++{ ++ scsi_unregister_driver(&ch_template.gendrv); ++ unregister_chrdev(MAJOR_NR, "ch"); ++ ioctl32_unregister(); ++} ++ ++module_init(init_ch_module); ++module_exit(exit_ch_module); ++ ++/* ++ * Local variables: ++ * c-basic-offset: 8 ++ * End: ++ */ +diff -urN kernel-source-2.6.6/include/linux/chio.h kernel-source-2.6.6-1/include/linux/chio.h +--- kernel-source-2.6.6/include/linux/chio.h 1970-01-01 10:00:00.000000000 +1000 ++++ kernel-source-2.6.6-1/include/linux/chio.h 2004-03-17 21:24:11.000000000 +1100 +@@ -0,0 +1,168 @@ ++/* ++ * ioctl interface for the scsi media changer driver ++ */ ++ ++/* changer element types */ ++#define CHET_MT 0 /* media transport element (robot) */ ++#define CHET_ST 1 /* storage element (media slots) */ ++#define CHET_IE 2 /* import/export element */ ++#define CHET_DT 3 /* data transfer element (tape/cdrom/whatever) */ ++#define CHET_V1 4 /* vendor specific #1 */ ++#define CHET_V2 5 /* vendor specific #2 */ ++#define CHET_V3 6 /* vendor specific #3 */ ++#define CHET_V4 7 /* vendor specific #4 */ ++ ++ ++/* ++ * CHIOGPARAMS ++ * query changer properties ++ * ++ * CHIOVGPARAMS ++ * query vendor-specific element types ++ * ++ * accessing elements works by specifing type and unit of the element. ++ * for eample, storage elements are addressed with type = CHET_ST and ++ * unit = 0 .. cp_nslots-1 ++ * ++ */ ++struct changer_params { ++ int cp_curpicker; /* current transport element */ ++ int cp_npickers; /* number of transport elements (CHET_MT) */ ++ int cp_nslots; /* number of storage elements (CHET_ST) */ ++ int cp_nportals; /* number of import/export elements (CHET_IE) */ ++ int cp_ndrives; /* number of data transfer elements (CHET_DT) */ ++}; ++struct changer_vendor_params { ++ int cvp_n1; /* number of vendor specific elems (CHET_V1) */ ++ char cvp_label1[16]; ++ int cvp_n2; /* number of vendor specific elems (CHET_V2) */ ++ char cvp_label2[16]; ++ int cvp_n3; /* number of vendor specific elems (CHET_V3) */ ++ char cvp_label3[16]; ++ int cvp_n4; /* number of vendor specific elems (CHET_V4) */ ++ char cvp_label4[16]; ++ int reserved[8]; ++}; ++ ++ ++/* ++ * CHIOMOVE ++ * move a medium from one element to another ++ */ ++struct changer_move { ++ int cm_fromtype; /* type/unit of source element */ ++ int cm_fromunit; ++ int cm_totype; /* type/unit of destination element */ ++ int cm_tounit; ++ int cm_flags; ++}; ++#define CM_INVERT 1 /* flag: rotate media (for double-sided like MOD) */ ++ ++ ++/* ++ * CHIOEXCHANGE ++ * move one medium from element #1 to element #2, ++ * and another one from element #2 to element #3. ++ * element #1 and #3 are allowed to be identical. ++ */ ++struct changer_exchange { ++ int ce_srctype; /* type/unit of element #1 */ ++ int ce_srcunit; ++ int ce_fdsttype; /* type/unit of element #2 */ ++ int ce_fdstunit; ++ int ce_sdsttype; /* type/unit of element #3 */ ++ int ce_sdstunit; ++ int ce_flags; ++}; ++#define CE_INVERT1 1 ++#define CE_INVERT2 2 ++ ++ ++/* ++ * CHIOPOSITION ++ * move the transport element (robot arm) to a specific element. ++ */ ++struct changer_position { ++ int cp_type; ++ int cp_unit; ++ int cp_flags; ++}; ++#define CP_INVERT 1 ++ ++ ++/* ++ * CHIOGSTATUS ++ * get element status for all elements of a specific type ++ */ ++struct changer_element_status { ++ int ces_type; ++ unsigned char *ces_data; ++}; ++#define CESTATUS_FULL 0x01 /* full */ ++#define CESTATUS_IMPEXP 0x02 /* media was imported (inserted by sysop) */ ++#define CESTATUS_EXCEPT 0x04 /* error condition */ ++#define CESTATUS_ACCESS 0x08 /* access allowed */ ++#define CESTATUS_EXENAB 0x10 /* element can export media */ ++#define CESTATUS_INENAB 0x20 /* element can import media */ ++ ++ ++/* ++ * CHIOGELEM ++ * get more detailed status informtion for a single element ++ */ ++struct changer_get_element { ++ int cge_type; /* type/unit */ ++ int cge_unit; ++ int cge_status; /* status */ ++ int cge_errno; /* errno */ ++ int cge_srctype; /* source element of the last move/exchange */ ++ int cge_srcunit; ++ int cge_id; /* scsi id (for data transfer elements) */ ++ int cge_lun; /* scsi lun (for data transfer elements) */ ++ char cge_pvoltag[36]; /* primary volume tag */ ++ char cge_avoltag[36]; /* alternate volume tag */ ++ int cge_flags; ++}; ++/* flags */ ++#define CGE_ERRNO 0x01 /* errno available */ ++#define CGE_INVERT 0x02 /* media inverted */ ++#define CGE_SRC 0x04 /* media src available */ ++#define CGE_IDLUN 0x08 /* ID+LUN available */ ++#define CGE_PVOLTAG 0x10 /* primary volume tag available */ ++#define CGE_AVOLTAG 0x20 /* alternate volume tag available */ ++ ++ ++/* ++ * CHIOSVOLTAG ++ * set volume tag ++ */ ++struct changer_set_voltag { ++ int csv_type; /* type/unit */ ++ int csv_unit; ++ char csv_voltag[36]; /* volume tag */ ++ int csv_flags; ++}; ++#define CSV_PVOLTAG 0x01 /* primary volume tag */ ++#define CSV_AVOLTAG 0x02 /* alternate volume tag */ ++#define CSV_CLEARTAG 0x04 /* clear volume tag */ ++ ++/* ioctls */ ++#define CHIOMOVE _IOW('c', 1,struct changer_move) ++#define CHIOEXCHANGE _IOW('c', 2,struct changer_exchange) ++#define CHIOPOSITION _IOW('c', 3,struct changer_position) ++#define CHIOGPICKER _IOR('c', 4,int) /* not impl. */ ++#define CHIOSPICKER _IOW('c', 5,int) /* not impl. */ ++#define CHIOGPARAMS _IOR('c', 6,struct changer_params) ++#define CHIOGSTATUS _IOW('c', 8,struct changer_element_status) ++#define CHIOGELEM _IOW('c',16,struct changer_get_element) ++#define CHIOINITELEM _IO('c',17) ++#define CHIOSVOLTAG _IOW('c',18,struct changer_set_voltag) ++#define CHIOGVPARAMS _IOR('c',19,struct changer_vendor_params) ++ ++/* ---------------------------------------------------------------------- */ ++ ++/* ++ * Local variables: ++ * c-basic-offset: 8 ++ * End: ++ */ +diff -urN kernel-source-2.6.6/include/linux/major.h kernel-source-2.6.6-1/include/linux/major.h +--- kernel-source-2.6.6/include/linux/major.h 2004-04-05 19:49:42.000000000 +1000 ++++ kernel-source-2.6.6-1/include/linux/major.h 2004-04-05 20:54:51.000000000 +1000 +@@ -101,6 +101,7 @@ + #define I2O_MAJOR 80 /* 80->87 */ + + #define SHMIQ_MAJOR 85 /* Linux/mips, SGI /dev/shmiq */ ++#define SCSI_CHANGER_MAJOR 86 + + #define IDE6_MAJOR 88 + #define IDE7_MAJOR 89 +diff -urN kernel-source-2.6.6/include/scsi/scsi.h kernel-source-2.6.6-1/include/scsi/scsi.h +--- kernel-source-2.6.6/include/scsi/scsi.h 2004-04-05 19:49:43.000000000 +1000 ++++ kernel-source-2.6.6-1/include/scsi/scsi.h 2004-04-05 20:54:52.000000000 +1000 +@@ -41,6 +41,7 @@ + #define FORMAT_UNIT 0x04 + #define READ_BLOCK_LIMITS 0x05 + #define REASSIGN_BLOCKS 0x07 ++#define INITIALIZE_ELEMENT_STATUS 0x07 + #define READ_6 0x08 + #define WRITE_6 0x0a + #define SEEK_6 0x0b +@@ -65,6 +66,7 @@ + #define READ_10 0x28 + #define WRITE_10 0x2a + #define SEEK_10 0x2b ++#define POSITION_TO_ELEMENT 0x2b + #define WRITE_VERIFY 0x2e + #define VERIFY 0x2f + #define SEARCH_HIGH 0x30 +@@ -97,6 +99,7 @@ + #define PERSISTENT_RESERVE_OUT 0x5f + #define REPORT_LUNS 0xa0 + #define MOVE_MEDIUM 0xa5 ++#define EXCHANGE_MEDIUM 0xa6 + #define READ_12 0xa8 + #define WRITE_12 0xaa + #define WRITE_VERIFY_12 0xae --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/drm-lock.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/drm-lock.dpatch @@ -0,0 +1,213 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Check lock ownership in DRM. +## DP: Patch author: unknown +## DP: Upstream status: unknown + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN x/drivers/char/drm/i810_dma.c y/drivers/char/drm/i810_dma.c +--- x/drivers/char/drm/i810_dma.c 2004-08-24 17:16:47.000000000 +1000 ++++ y/drivers/char/drm/i810_dma.c 2004-11-30 20:51:53.000000000 +1100 +@@ -1034,10 +1034,7 @@ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + +- if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { +- DRM_ERROR("i810_flush_ioctl called without lock held\n"); +- return -EINVAL; +- } ++ LOCK_TEST_WITH_RETURN( dev, filp ); + + i810_flush_queue(dev); + return 0; +@@ -1059,10 +1056,7 @@ + if (copy_from_user(&vertex, (drm_i810_vertex_t __user *)arg, sizeof(vertex))) + return -EFAULT; + +- if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { +- DRM_ERROR("i810_dma_vertex called without lock held\n"); +- return -EINVAL; +- } ++ LOCK_TEST_WITH_RETURN( dev, filp ); + + DRM_DEBUG("i810 dma vertex, idx %d used %d discard %d\n", + vertex.idx, vertex.used, vertex.discard); +@@ -1094,10 +1088,7 @@ + if (copy_from_user(&clear, (drm_i810_clear_t __user *)arg, sizeof(clear))) + return -EFAULT; + +- if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { +- DRM_ERROR("i810_clear_bufs called without lock held\n"); +- return -EINVAL; +- } ++ LOCK_TEST_WITH_RETURN( dev, filp ); + + /* GH: Someone's doing nasty things... */ + if (!dev->dev_private) { +@@ -1118,10 +1109,8 @@ + + DRM_DEBUG("i810_swap_bufs\n"); + +- if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { +- DRM_ERROR("i810_swap_buf called without lock held\n"); +- return -EINVAL; +- } ++ ++ LOCK_TEST_WITH_RETURN( dev, filp ); + + i810_dma_dispatch_swap( dev ); + return 0; +@@ -1156,10 +1145,7 @@ + if (copy_from_user(&d, (drm_i810_dma_t __user *)arg, sizeof(d))) + return -EFAULT; + +- if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { +- DRM_ERROR("i810_dma called without lock held\n"); +- return -EINVAL; +- } ++ LOCK_TEST_WITH_RETURN( dev, filp ); + + d.granted = 0; + +@@ -1270,10 +1256,7 @@ + return -EFAULT; + + +- if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { +- DRM_ERROR("i810_dma_mc called without lock held\n"); +- return -EINVAL; +- } ++ LOCK_TEST_WITH_RETURN( dev, filp ); + + if (mc.idx >= dma->buf_count || mc.idx < 0) + return -EINVAL; +@@ -1321,10 +1304,7 @@ + drm_device_t *dev = priv->dev; + drm_i810_private_t *dev_priv = (drm_i810_private_t *)dev->dev_private; + +- if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { +- DRM_ERROR("i810_fstatus called without lock held\n"); +- return -EINVAL; +- } ++ LOCK_TEST_WITH_RETURN( dev, filp ); + return I810_READ(0x30008); + } + +@@ -1335,10 +1315,7 @@ + drm_device_t *dev = priv->dev; + drm_i810_private_t *dev_priv = (drm_i810_private_t *)dev->dev_private; + +- if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { +- DRM_ERROR("i810_ov0_flip called without lock held\n"); +- return -EINVAL; +- } ++ LOCK_TEST_WITH_RETURN( dev, filp ); + + //Tell the overlay to update + I810_WRITE(0x30000,dev_priv->overlay_physical | 0x80000000); +@@ -1380,10 +1357,7 @@ + + DRM_DEBUG("%s\n", __FUNCTION__); + +- if (!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { +- DRM_ERROR("i810_flip_buf called without lock held\n"); +- return -EINVAL; +- } ++ LOCK_TEST_WITH_RETURN( dev, filp ); + + if (!dev_priv->page_flipping) + i810_do_init_pageflip( dev ); +diff -urN x/drivers/char/drm/i830_dma.c y/drivers/char/drm/i830_dma.c +--- x/drivers/char/drm/i830_dma.c 2004-08-24 17:15:39.000000000 +1000 ++++ y/drivers/char/drm/i830_dma.c 2004-11-30 20:51:53.000000000 +1100 +@@ -1321,10 +1321,7 @@ + drm_file_t *priv = filp->private_data; + drm_device_t *dev = priv->dev; + +- if(!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { +- DRM_ERROR("i830_flush_ioctl called without lock held\n"); +- return -EINVAL; +- } ++ LOCK_TEST_WITH_RETURN( dev, filp ); + + i830_flush_queue(dev); + return 0; +@@ -1345,10 +1342,7 @@ + if (copy_from_user(&vertex, (drm_i830_vertex_t __user *)arg, sizeof(vertex))) + return -EFAULT; + +- if(!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { +- DRM_ERROR("i830_dma_vertex called without lock held\n"); +- return -EINVAL; +- } ++ LOCK_TEST_WITH_RETURN( dev, filp ); + + DRM_DEBUG("i830 dma vertex, idx %d used %d discard %d\n", + vertex.idx, vertex.used, vertex.discard); +@@ -1375,10 +1369,7 @@ + if (copy_from_user(&clear, (drm_i830_clear_t __user *)arg, sizeof(clear))) + return -EFAULT; + +- if(!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { +- DRM_ERROR("i830_clear_bufs called without lock held\n"); +- return -EINVAL; +- } ++ LOCK_TEST_WITH_RETURN( dev, filp ); + + /* GH: Someone's doing nasty things... */ + if (!dev->dev_private) { +@@ -1400,10 +1391,7 @@ + + DRM_DEBUG("i830_swap_bufs\n"); + +- if(!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { +- DRM_ERROR("i830_swap_buf called without lock held\n"); +- return -EINVAL; +- } ++ LOCK_TEST_WITH_RETURN( dev, filp ); + + i830_dma_dispatch_swap( dev ); + return 0; +@@ -1444,10 +1432,7 @@ + + DRM_DEBUG("%s\n", __FUNCTION__); + +- if(!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { +- DRM_ERROR("i830_flip_buf called without lock held\n"); +- return -EINVAL; +- } ++ LOCK_TEST_WITH_RETURN( dev, filp ); + + if (!dev_priv->page_flipping) + i830_do_init_pageflip( dev ); +@@ -1486,10 +1471,7 @@ + if (copy_from_user(&d, (drm_i830_dma_t __user *)arg, sizeof(d))) + return -EFAULT; + +- if(!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { +- DRM_ERROR("i830_dma called without lock held\n"); +- return -EINVAL; +- } ++ LOCK_TEST_WITH_RETURN( dev, filp ); + + d.granted = 0; + +diff -urN x/drivers/char/drm/i830_irq.c y/drivers/char/drm/i830_irq.c +--- x/drivers/char/drm/i830_irq.c 2004-08-24 17:18:35.000000000 +1000 ++++ y/drivers/char/drm/i830_irq.c 2004-11-30 20:51:53.000000000 +1100 +@@ -129,10 +129,7 @@ + drm_i830_irq_emit_t emit; + int result; + +- if(!_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock)) { +- DRM_ERROR("i830_irq_emit called without lock held\n"); +- return -EINVAL; +- } ++ LOCK_TEST_WITH_RETURN( dev, filp ); + + if ( !dev_priv ) { + DRM_ERROR( "%s called with no initialization\n", __FUNCTION__ ); --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/dummy-cap.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/dummy-cap.dpatch @@ -0,0 +1,44 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Track capabilities in default dummy security module code. +## DP: Patch author: Chris Wright +## DP: Upstream status: backport + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN x/security/dummy.c y/security/dummy.c +--- x/security/dummy.c 2004-08-24 17:16:12.000000000 +1000 ++++ y/security/dummy.c 2005-01-07 19:51:16.000000000 +1100 +@@ -74,11 +74,8 @@ + + static int dummy_capable (struct task_struct *tsk, int cap) + { +- if (cap_is_fs_cap (cap) ? tsk->fsuid == 0 : tsk->euid == 0) +- /* capability granted */ ++ if (cap_raised (tsk->cap_effective, cap)) + return 0; +- +- /* capability denied */ + return -EPERM; + } + +@@ -184,6 +181,8 @@ + + current->suid = current->euid = current->fsuid = bprm->e_uid; + current->sgid = current->egid = current->fsgid = bprm->e_gid; ++ ++ dummy_capget(current, ¤t->cap_effective, ¤t->cap_inheritable, ¤t->cap_permitted); + } + + static int dummy_bprm_set_security (struct linux_binprm *bprm) +@@ -544,6 +543,7 @@ + + static int dummy_task_post_setuid (uid_t id0, uid_t id1, uid_t id2, int flags) + { ++ dummy_capget(current, ¤t->cap_effective, ¤t->cap_inheritable, ¤t->cap_permitted); + return 0; + } + --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/eagle-usb.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/eagle-usb.dpatch @@ -0,0 +1,19501 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Added Eagle USB ADSL support. +## DP: Patch author: Frederick Ros +## DP: Upstream status: unknown + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN x/drivers/usb/misc/Kconfig y/drivers/usb/misc/Kconfig +--- x/drivers/usb/misc/Kconfig 2004-08-29 17:16:52.000000000 +1000 ++++ y/drivers/usb/misc/Kconfig 2004-09-26 20:18:11.000000000 +1000 +@@ -157,3 +157,13 @@ + See for more information, + including sample test device firmware and "how to use it". + ++config USB_EAGLE ++ tristate "Eagle USB ADSL modem support" ++ depends on USB ++ help ++ ++ Say Y here if you have an Eagle USB ADSL modem. ++ ++ To compile this driver as a module, choose M here: the ++ module will be called eagle-usb. ++ +diff -urN x/drivers/usb/misc/Makefile y/drivers/usb/misc/Makefile +--- x/drivers/usb/misc/Makefile 2004-08-29 17:16:52.000000000 +1000 ++++ y/drivers/usb/misc/Makefile 2004-09-26 20:18:29.000000000 +1000 +@@ -16,3 +16,4 @@ + obj-$(CONFIG_USB_TIGL) += tiglusb.o + obj-$(CONFIG_USB_USS720) += uss720.o + obj-$(CONFIG_USB_PHIDGETSERVO) += phidgetservo.o ++obj-$(CONFIG_USB_EAGLE) += eagle-usb/ +diff -urN x/drivers/usb/misc/eagle-usb/Adiutil.h y/drivers/usb/misc/eagle-usb/Adiutil.h +--- x/drivers/usb/misc/eagle-usb/Adiutil.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/Adiutil.h 2004-02-07 09:01:34.000000000 +1100 +@@ -0,0 +1,99 @@ ++/***********************************************************************************/ ++/* $Id: Adiutil.h,v 1.1 2004/02/06 22:01:34 sleeper Exp $ */ ++/* */ ++/* Adiutil.h */ ++/* */ ++/* Includes all headers necessary for using Adiutil */ ++/* */ ++/* This file is part of the "ADI USB ADSL Driver for Linux". */ ++/* */ ++/* "ADI USB ADSL Driver for Linux" is free software; you can redistribute it */ ++/* and/or modify it under the terms of the GNU General Public License as */ ++/* published by the Free Software Foundation; either version 2 of the License, */ ++/* or (at your option) any later version. */ ++/* */ ++/* "ADI USB ADSL Driver for Linux" is distributed in the hope that it will be */ ++/* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of */ ++/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ ++/* GNU General Public License for more details. */ ++/* */ ++/* You should have received a copy of the GNU General Public License */ ++/* along with "ADI USB ADSL Driver for Linux"; if not, write to the Free Software */ ++/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ ++/***********************************************************************************/ ++ ++#ifndef __ADIHEADERS_H__ ++#define __ADIHEADERS_H__ ++ ++#ifndef LINUX_VERSION_CODE ++#include ++#endif ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) ++#define LINUX_2_4 ++#else ++#define LINUX_2_6 ++#endif ++ ++/*Include OS includes here ...*/ ++#include ++#ifdef LINUX_2_4 ++#if defined(CONFIG_MODVERSIONS) && !defined(MODVERSIONS) ++#define MODVERSIONS ++#endif ++#if defined(MODVERSIONS) ++#include ++#endif ++#endif /* LINUX_2_4 */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#ifdef LINUX_2_6 ++#define EXPORT_NO_SYMBOLS ++#endif ++ ++/* Types definition */ ++typedef uint8_t UInt8; ++typedef uint16_t UInt16; ++typedef uint32_t UInt32; ++typedef int32_t SInt32; ++typedef unsigned int Boolean; ++#define FALSE 0 ++#define TRUE 1 ++ ++typedef struct list_head QHdr; ++ ++ ++ ++ ++#ifdef USEBULK ++ ++/* ++ * Get Read Buffer from urb ++ */ ++#define GET_RBUF(u) (void *)((unsigned long)(u)->transfer_buffer - \ ++ (unsigned long)(&((eu_bulk_rb_t *)0)->data)) ++ ++#else ++ ++#define GET_RBUF(u) (u)->transfer_buffer ++ ++#endif /* USEBULK */ ++ ++ ++#endif /*ADIUTIL_H*/ ++ +diff -urN x/drivers/usb/misc/eagle-usb/Cmv.h y/drivers/usb/misc/eagle-usb/Cmv.h +--- x/drivers/usb/misc/eagle-usb/Cmv.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/Cmv.h 2004-02-07 09:01:34.000000000 +1100 +@@ -0,0 +1,439 @@ ++/**********************************************************************************/ ++/* $Id: Cmv.h,v 1.1 2004/02/06 22:01:34 sleeper Exp $ */ ++/* */ ++/* Copyright (c) 2001, Analog Devices Inc., All Rights Reserved */ ++/* */ ++/* CMV.H */ ++/* */ ++/* Contains definitions for the bits of CMV Requests and Replies.. */ ++/* Taken virtually as is from NDIS ADI project, some comments added. */ ++/* */ ++/* Rewrite for MAC OS, 10/2001 */ ++/* */ ++/* This file is part of the "ADI USB ADSL Driver for Linux". */ ++/* */ ++/* "ADI USB ADSL Driver for Linux" is free software; you can redistribute it */ ++/* and/or modify it under the terms of the GNU General Public License as */ ++/* published by the Free Software Foundation; either version 2 of the License, */ ++/* or (at your option) any later version. */ ++/* */ ++/* "ADI USB ADSL Driver for Linux" is distributed in the hope that it will be */ ++/* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of */ ++/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ ++/* GNU General Public License for more details. */ ++/* */ ++/* You should have received a copy of the GNU General Public License */ ++/* along with "ADI USB ADSL Driver for Linux"; if not, write to the Free Software */ ++/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ ++/**********************************************************************************/ ++ ++#ifndef _CMV_H_ ++#define _CMV_H_ ++ ++#define ON 1 ++#define OFF 0 ++ ++/*STAT.status CMV bit definitions, field masks & shift counts*/ ++#define STAT_STATUS_OFFSET 0x00 ++ ++#define STAT_HW_PASS 0x0 ++#define STAT_HW_FAIL 0x1 ++#define STAT_DME_PASS 0x0 ++#define STAT_DME_FAIL 0x1 ++#define STAT_DTIR_PASS 0x0 ++#define STAT_DTIR_FAIL 0x1 ++ ++#define STAT_SW_R_ACT_REQ 0x0 ++#define STAT_SW_CIDLE 0x0 ++#define STAT_SW_INITIALIZATION 0x1 ++#define STAT_SW_OPERATIONAL 0x2 ++#define STAT_SW_FAIL 0x3 ++#define STAT_SW_TESTSIGNAL 0x4 ++#define STAT_SW_TESTHW 0x5 ++#define STAT_SW_FASTRETRAIN 0x7 ++ ++#define STAT_CRC_NORMAL 0x0 ++#define STAT_CRC_DS 0x1 ++#define STAT_CRC_US 0x2 ++ ++#define STAT_INIT_SUCCESS 0x0 ++#define STAT_INIT_CRC1_ERROR 0x1 ++#define STAT_INIT_CRC2_ERROR 0x2 ++#define STAT_INIT_CRC3_ERROR 0x3 ++#define STAT_INIT_CRC4_ERROR 0x4 ++#define STAT_INIT_CRC5_ERROR 0x5 ++#define STAT_INIT_CQUIET2_FAIL 0x6 ++#define STAT_INIT_RQUIET2_FAIL 0x7 ++#define STAT_INIT_RREVERB3_TIMEOUT 0x8 ++#define STAT_INIT_CREVERB4_TIMEOUT 0x9 ++#define STAT_INIT_CREVERB5_TIMEOUT 0xa ++#define STAT_INIT_LOWSNR 0xc ++ ++#define STAT_CORT_CO 0x0 ++#define STAT_CORT_RT 0x1 ++ ++#define STAT_HW_MASK 0x00000001 ++#define STAT_DME_MASK 0x00000002 ++#define STAT_DTIR_MASK 0x00000004 ++#define STAT_SW_MASK 0x00000f00 ++#define STAT_CRC_MASK 0x00003000 ++#define STAT_INIT_MASK 0x00070000 ++#define STAT_RACTREQDET_MASK 0x00080000 ++#define STAT_OPTION_MASK 0x1fe00000 ++#define STAT_CORT_MASK 0x80000000 ++ ++#define STAT_HW_LSB 0x00000000 ++#define STAT_DME_LSB 0x00000001 ++#define STAT_DTIR_LSB 0x00000002 ++#define STAT_SW_LSB 0x00000008 ++#define STAT_CRC_LSB 0x0000000c ++#define STAT_INIT_LSB 0x00000010 ++#define STAT_RACTREQDET_LSB 0x00000014 ++#define STAT_OPTION_LSB 0x00000015 ++#define STAT_CORT_LSB 0x0000001f ++ ++/*RATE.actual CMV bit field masks & shift counts*/ ++#define RATE_ACTUAL_OFFSET 0x00 ++ ++#define RATE_DUPLXUS_MASK 0x000000ff ++#define RATE_DUPLXDS_MASK 0x0000ff00 ++#define RATE_SIMPLXDS_MASK 0x01ff0000 ++ ++#define RATE_DUPLXUS_LSB 0x00000000 ++#define RATE_DUPLXDS_LSB 0x00000008 ++#define RATE_SIMPLXDS_LSB 0x00000010 ++ ++/* CNTL.control CMV bit definitions, field masks & shift counts*/ ++#define CNTL_CONTROL_OFFSET 0x00 ++ ++/*ATU-C*/ ++#define CNTL_ATUC_STATE_CIDLE 0x0 ++#define CNTL_ATUC_STATE_CQUIET1 0x2 ++#define CNTL_ATUC_STATE_CTESTSIGNAL 0x4 ++#define CNTL_ATUC_STATE_CTESTHW 0x5 ++ ++#define CNTL_ATUC_CHCONFIG_EXPLICIT 0x0 ++#define CNTL_ATUC_CHCONFIG_ADAPTIVE 0x1 ++ ++#define CNTL_ATUC_STATE_MASK 0x00000007 ++#define CNTL_ATUC_CHCONFIG_MASK 0x000000e0 ++ ++#define CNTL_ATUC_STATE_LSB 0x00000000 ++#define CNTL_ATUC_CHCONFIG_LSB 0x00000005 ++ ++/*ATU-R*/ ++#define CNTL_ATUR_STATE_RACTREQ 0x0 ++#define CNTL_ATUR_STATE_CTESTSIGNAL 0x4 ++#define CNTL_ATUR_STATE_CTESTHW 0x5 ++ ++#define CNTL_ATUR_STATE_MASK 0x00000007 ++#define CNTL_ATUR_STATE_LSB 0x00000000 ++ ++/* ADPT.downstream CMV bit definitions, field masks & shift counts*/ ++#define ADPT_DOWNSTREAM_OFFSET 0x00 ++ ++#define ADPT_DS_CODING_ON 0x1 ++#define ADPT_DS_CODING_OFF 0x0 ++ ++#define ADPT_DS_MINDATARATE_MASK 0x000001ff ++#define ADPT_DS_INTLVDEPTH_MASK 0x0000fe00 ++#define ADPT_DS_MAXDATARATE_MASK 0x01ff0000 ++#define ADPT_DS_CODING_MASK 0x02000000 ++#define ADPT_DS_MARGIN_MASK 0xf0000000 ++ ++#define ADPT_DS_MINDATARATE_LSB 0x00000000 ++#define ADPT_DS_INTLVDEPTH_LSB 0x00000009 ++#define ADPT_DS_MAXDATARATE_LSB 0x00000010 ++#define ADPT_DS_CODING_LSB 0x00000019 ++#define ADPT_DS_MARGIN_LSB 0x0000001c ++ ++/*ADPT.upstream CMV bit definitions, field masks & shift counts*/ ++#define ADPT_UPSTREAM_OFFSET 0x01 ++ ++#define ADPT_US_CODING_ON 0x1 ++#define ADPT_US_CODING_OFF 0x0 ++ ++#define ADPT_US_MINDATARATE_MASK 0x000001ff ++#define ADPT_US_INTLVDEPTH_MASK 0x0000fe00 ++#define ADPT_US_MAXDATARATE_MASK 0x01ff0000 ++#define ADPT_US_CODING_MASK 0x02000000 ++#define ADPT_US_MARGIN_MASK 0xf0000000 ++ ++#define ADPT_US_MINDATARATE_LSB 0x00000000 ++#define ADPT_US_INTLVDEPTH_LSB 0x00000009 ++#define ADPT_US_MAXDATARATE_LSB 0x00000010 ++#define ADPT_US_CODING_LSB 0x00000019 ++#define ADPT_US_MARGIN_LSB 0x0000001c ++ ++/*INFO.RT_serial_number CMV bit definitions, field masks & shift counts*/ ++#define INFO_RT_SERIALNUMBER0_OFFSET 0x00 ++#define INFO_RT_SERIALNUMBER1_OFFSET 0x01 ++#define INFO_RT_SERIALNUMBER2_OFFSET 0x02 ++#define INFO_RT_SERIALNUMBER3_OFFSET 0x03 ++#define INFO_RT_SERIALNUMBER4_OFFSET 0x04 ++#define INFO_RT_SERIALNUMBER5_OFFSET 0x05 ++#define INFO_RT_SERIALNUMBER6_OFFSET 0x06 ++#define INFO_RT_SERIALNUMBER7_OFFSET 0x07 ++#define INFO_RT_SERIALNUMBER8_OFFSET 0x08 ++ ++#define INFO_RT_SERIALNUMBER_MASK 0xffffffff ++#define INFO_RT_SERIALNUMBER_LSB 0x0 ++ ++/*INFO.RT_vendor_ID CMV bit definitions, field masks & shift counts*/ ++#define INFO_RT_VENDORID_OFFSET 0x09 ++ ++#define INFO_RT_VENDORID_MASK 0x000000ff ++#define INFO_RT_VENDORID_LSB 0x0 ++ ++/*INFO.RT_version_number CMV bit definitions, field masks & shift counts*/ ++#define INFO_RT_VERSIONNUMBER_OFFSET 0x0a ++ ++#define INFO_RT_VERSIONNUMBER_MASK 0x000000ff ++#define INFO_RT_VERSIONNUMBER_LSB 0x0 ++ ++/*INFO.RT_firmware_version CMV bit definitions, field masks & shift counts*/ ++/*RT only*/ ++#define INFO_RT_FIRMWAREVERSION_OFFSET 0x0b ++ ++#define INFO_RT_FIRMWAREVERSION_MASK 0xffffffff ++#define INFO_RT_FIRMWAREVERSION_LSB 0x0 ++ ++/*INFO.CO_firmware_version CMV bit definitions, field masks & shift counts*/ ++/*CO Only*/ ++#define INFO_CO_FIRMWAREVERSION_OFFSET 0x0b ++ ++#define INFO_CO_FIRMWAREVERSION_MASK 0xffffffff ++#define INFO_CO_FIRMWAREVERSION_LSB 0x0 ++ ++ ++/*DIAG.control CMV bit definitions, field masks & shift counts*/ ++#define DIAG_CONTROL_OFFSET 0x00 ++ ++#define DIAG_CONTROL_DSCRCCORRUPT_ON 0x1 ++#define DIAG_CONTROL_DSCRCCORRUPT_OFF 0x0 ++ ++#define DIAG_CONTROL_USCRCCORRUPT_ON 0x1 ++#define DIAG_CONTROL_USCRCCORRUPT_OFF 0x0 ++ ++#define DIAG_CONTROL_CLRNECOUNTS_MASK 0x00000001 ++#define DIAG_CONTROL_CLRFECOUNTS_MASK 0x00000002 ++#define DIAG_CONTROL_CLRNELATCH_MASK 0x00000004 ++#define DIAG_CONTROL_CLRFELATCH_MASK 0x00000008 ++#define DIAG_CONTROL_DSCRCCORRUPT_MASK 0x00010000 ++#define DIAG_CONTROL_USCRCCORRUPT_MASK 0x00020000 ++ ++#define DIAG_CONTROL_CLRNECOUNTS_LSB 0x0 ++#define DIAG_CONTROL_CLRFECOUNTS_LSB 0x1 ++#define DIAG_CONTROL_CLRNELATCH_LSB 0x2 ++#define DIAG_CONTROL_CLRFELATCH_LSB 0x3 ++#define DIAG_CONTROL_DSCRCCORRUPT_LSB 0x10 ++#define DIAG_CONTROL_USCRCCORRUPT_LSB 0x11 ++ ++/*DIAG.flags CMV bit definitions, field masks & shift counts*/ ++#define DIAG_FLAGS_OFFSET 0x01 ++ ++#define DIAG_FLAGS_ASSERTED 0x1 ++#define DIAG_FLAGS_NEGATED 0x0 ++ ++#define DIAG_FLAGS_NEFASTFEC_MASK 0x00000001 ++#define DIAG_FLAGS_NEINTLFEC_MASK 0x00000002 ++#define DIAG_FLAGS_NEFASTCRC_MASK 0x00000004 ++#define DIAG_FLAGS_NEINTLCRC_MASK 0x00000008 ++#define DIAG_FLAGS_NELOSDEFECT_MASK 0x00000010 ++#define DIAG_FLAGS_NELOSFAILURE_MASK 0x00000020 ++#define DIAG_FLAGS_NESEFDEFECT_MASK 0x00000040 ++#define DIAG_FLAGS_NESEFFAILURE_MASK 0x00000080 ++#define DIAG_FLAGS_NELPRDEFECT_MASK 0x00000100 ++#define DIAG_FLAGS_NELPRFAILURE_MASK 0x00000200 ++ ++#define DIAG_FLAGS_NEINTLLODFAIL_MASK 0x00001000 ++#define DIAG_FLAGS_NEFASTLODFAIL_MASK 0x00002000 ++#define DIAG_FLAGS_NEINTLHECFAIL_MASK 0x00004000 ++#define DIAG_FLAGS_NEFASTHECFAIL_MASK 0x00008000 ++ ++#define DIAG_FLAGS_FEFASTFEC_MASK 0x00010000 ++#define DIAG_FLAGS_FEINTLFEC_MASK 0x00020000 ++#define DIAG_FLAGS_FEFASTCRC_MASK 0x00040000 ++#define DIAG_FLAGS_FEINTLCRC_MASK 0x00080000 ++#define DIAG_FLAGS_FELOSDEFECT_MASK 0x00100000 ++#define DIAG_FLAGS_FELOSFAILURE_MASK 0x00200000 ++#define DIAG_FLAGS_FESEFDEFECT_MASK 0x00400000 ++#define DIAG_FLAGS_FESEFFAILURE_MASK 0x00800000 ++#define DIAG_FLAGS_FELPRDEFECT_MASK 0x01000000 ++#define DIAG_FLAGS_FELPRFAILURE_MASK 0x02000000 ++ ++#define DIAG_FLAGS_NEFASTFEC_LSB 0x00 ++#define DIAG_FLAGS_NEINTLFEC_LSB 0x01 ++#define DIAG_FLAGS_NEFASTCRC_LSB 0x02 ++#define DIAG_FLAGS_NEINTLCRC_LSB 0x03 ++#define DIAG_FLAGS_NELOSDEFECT_LSB 0x04 ++#define DIAG_FLAGS_NELOSFAILURE_LSB 0x05 ++#define DIAG_FLAGS_NESEFDEFECT_LSB 0x06 ++#define DIAG_FLAGS_NESEFFAILURE_LSB 0x07 ++#define DIAG_FLAGS_NELPRDEFECT_LSB 0x08 ++#define DIAG_FLAGS_NELPRFAILURE_LSB 0x09 ++#define DIAG_FLAGS_FEFASTFEC_LSB 0x10 ++#define DIAG_FLAGS_FEINTLFEC_LSB 0x11 ++#define DIAG_FLAGS_FEFASTCRC_LSB 0x12 ++#define DIAG_FLAGS_FEINTLCRC_LSb 0x13 ++#define DIAG_FLAGS_FELOSDEFECT_LSB 0x14 ++#define DIAG_FLAGS_FELOSFAILURE_LSB 0x15 ++#define DIAG_FLAGS_FESEFDEFECT_LSB 0x16 ++#define DIAG_FLAGS_FESEFFAILURE_LSB 0x17 ++#define DIAG_FLAGS_FELPRDEFECT_LSB 0x18 ++#define DIAG_FLAGS_FELPRFAILURE_LSB 0x19 ++ ++/*DIAG.flags_latched CMV bit definitions, field masks & shift counts*/ ++#define DIAG_FLAGS_LATCHED_OFFSET 0x02 ++ ++#define DIAG_FLAGS_LATCHED_ASSERTED 0x1 ++#define DIAG_FLAGS_LATCHED_NEGATED 0x0 ++ ++#define DIAG_FLAGS_LATCHED_NEFASTFEC_MASK 0x00000001 ++#define DIAG_FLAGS_LATCHED_NEINTLFEC_MASK 0x00000002 ++#define DIAG_FLAGS_LATCHED_NEFASTCRC_MASK 0x00000004 ++#define DIAG_FLAGS_LATCHED_NEINTLCRC_MASK 0x00000008 ++#define DIAG_FLAGS_LATCHED_NELOSDEFECT_MASK 0x00000010 ++#define DIAG_FLAGS_LATCHED_NELOSFAILURE_MASK 0x00000020 ++#define DIAG_FLAGS_LATCHED_NESEFDEFECT_MASK 0x00000040 ++#define DIAG_FLAGS_LATCHED_NESEFFAILURE_MASK 0x00000080 ++#define DIAG_FLAGS_LATCHED_NELPRDEFECT_MASK 0x00000100 ++#define DIAG_FLAGS_LATCHED_NELPRFAILURE_MASK 0x00000200 ++#define DIAG_FLAGS_LATCHED_FEFASTFEC_MASK 0x00010000 ++#define DIAG_FLAGS_LATCHED_FEINTLFEC_MASK 0x00020000 ++#define DIAG_FLAGS_LATCHED_FEFASTCRC_MASK 0x00040000 ++#define DIAG_FLAGS_LATCHED_FEINTLCRC_MASK 0x00080000 ++#define DIAG_FLAGS_LATCHED_FELOSDEFECT_MASK 0x00100000 ++#define DIAG_FLAGS_LATCHED_FELOSFAILURE_MASK 0x00200000 ++#define DIAG_FLAGS_LATCHED_FESEFDEFECT_MASK 0x00400000 ++#define DIAG_FLAGS_LATCHED_FESEFFAILURE_MASK 0x00800000 ++#define DIAG_FLAGS_LATCHED_FELPRDEFECT_MASK 0x01000000 ++#define DIAG_FLAGS_LATCHED_FELPRFAILURE_MASK 0x02000000 ++ ++#define DIAG_FLAGS_LATCHED_NEFASTFEC_LSB 0x00 ++#define DIAG_FLAGS_LATCHED_NEINTLFEC_LSB 0x01 ++#define DIAG_FLAGS_LATCHED_NEFASTCRC_LSB 0x02 ++#define DIAG_FLAGS_LATCHED_NEINTLCRC_LSB 0x03 ++#define DIAG_FLAGS_LATCHED_NELOSDEFECT_LSB 0x04 ++#define DIAG_FLAGS_LATCHED_NELOSFAILURE_LSB 0x05 ++#define DIAG_FLAGS_LATCHED_NESEFDEFECT_LSB 0x06 ++#define DIAG_FLAGS_LATCHED_NESEFFAILURE_LSB 0x07 ++#define DIAG_FLAGS_LATCHED_NELPRDEFECT_LSB 0x08 ++#define DIAG_FLAGS_LATCHED_NELPRFAILURE_LSB 0x09 ++#define DIAG_FLAGS_LATCHED_FEFASTFEC_LSB 0x10 ++#define DIAG_FLAGS_LATCHED_FEINTLFEC_LSB 0x11 ++#define DIAG_FLAGS_LATCHED_FEFASTCRC_LSB 0x12 ++#define DIAG_FLAGS_LATCHED_FEINTLCRC_LSB 0x13 ++#define DIAG_FLAGS_LATCHED_FELOSDEFECT_LSB 0x14 ++#define DIAG_FLAGS_LATCHED_FELOSFAILURE_LSB 0x15 ++#define DIAG_FLAGS_LATCHED_FESEFDEFECT_LSB 0x16 ++#define DIAG_FLAGS_LATCHED_FESEFFAILURE_LSB 0x17 ++#define DIAG_FLAGS_LATCHED_FELPRDEFECT_LSB 0x18 ++#define DIAG_FLAGS_LATCHED_FELPRFAILURE_LSB 0x19 ++ ++/*FLAG.mask CMV bit definitions, field masks & shift counts*/ ++#define FLAG_MASK_OFFSET 0x00 ++ ++#define FLAG_MASK_UNMASKED 0x1 ++#define FLAG_MASK_MASKED 0x0 ++ ++#define FLAG_MASK_NEFASTFEC_MASK 0x00000001 ++#define FLAG_MASK_NEINTLFEC_MASK 0x00000002 ++#define FLAG_MASK_NEFASTCRC_MASK 0x00000004 ++#define FLAG_MASK_NEINTLCRC_MASK 0x00000008 ++#define FLAG_MASK_NELOSDEFECT_MASK 0x00000010 ++#define FLAG_MASK_NELOSFAILURE_MASK 0x00000020 ++#define FLAG_MASK_NESEFDEFECT_MASK 0x00000040 ++#define FLAG_MASK_NESEFFAILURE_MASK 0x00000080 ++#define FLAG_MASK_NELPRDEFECT_MASK 0x00000100 ++#define FLAG_MASK_NELPRFAILURE_MASK 0x00000200 ++#define FLAG_MASK_NEMAILBOXFULL_MASK 0x00000400 ++#define FLAG_MASK_FEFASTFEC_MASK 0x00010000 ++#define FLAG_MASK_FEINTLFEC_MASK 0x00020000 ++#define FLAG_MASK_FEFASTCRC_MASK 0x00040000 ++#define FLAG_MASK_FEINTLCRC_MASK 0x00080000 ++#define FLAG_MASK_FELOSDEFECT_MASK 0x00100000 ++#define FLAG_MASK_FELOSFAILURE_MASK 0x00200000 ++#define FLAG_MASK_FESEFDEFECT_MASK 0x00400000 ++#define FLAG_MASK_FESEFFAILURE_MASK 0x00800000 ++#define FLAG_MASK_FELPRDEFECT_MASK 0x01000000 ++#define FLAG_MASK_FELPRFAILURE_MASK 0x02000000 ++ ++#define FLAG_MASK_NEFASTFEC_LSB 0x00 ++#define FLAG_MASK_NEINTLFEC_LSB 0x01 ++#define FLAG_MASK_NEFASTCRC_LSB 0x02 ++#define FLAG_MASK_NEINTLCRC_LSB 0x03 ++#define FLAG_MASK_NELOSDEFECT_LSB 0x04 ++#define FLAG_MASK_NELOSFAILURE_LSB 0x05 ++#define FLAG_MASK_NESEFDEFECT_LSB 0x06 ++#define FLAG_MASK_NESEFFAILURE_LSB 0x07 ++#define FLAG_MASK_NELPRDEFECT_LSB 0x08 ++#define FLAG_MASK_NELPRFAILURE_LSB 0x09 ++#define FLAG_MASK_NEMAILBOXFULL_LSB 0x0a ++#define FLAG_MASK_FEFASTFEC_LSB 0x10 ++#define FLAG_MASK_FEINTLFEC_LSB 0x11 ++#define FLAG_MASK_FEFASTCRC_LSB 0x12 ++#define FLAG_MASK_FEINTLCRC_LSB 0x13 ++#define FLAG_MASK_FELOSDEFECT_LSB 0x14 ++#define FLAG_MASK_FELOSFAILURE_LSB 0x15 ++#define FLAG_MASK_FESEFDEFECT_LSB 0x16 ++#define FLAG_MASK_FESEFFAILURE_LSB 0x17 ++#define FLAG_MASK_FELPRDEFECT_LSB 0x18 ++#define FLAG_MASK_FELPRFAILURE_LSB 0x19 ++ ++/*TXDA.length CMV bit definitions, field masks & shift counts*/ ++#define TXDA_LENGTH_OFFSET 0x00 ++#define TXDA_DATA_OFFSET 0x01 ++#define TXDA_MAILBOX_OFFSET 0x0b ++ ++#define RXDA_LENGTH_OFFSET 0x00 ++#define RXDA_DATA_OFFSET 0x01 ++#define RXDA_MAILBOX_OFFSET 0x0b ++ ++ ++/*OPTN.options CMV bit definitions, field masks & shift counts*/ ++#define OPTN_OPTIONS_OFFSET 0x00 ++ ++#define OPTN_EC_AVAIL_MASK 0x00000001 ++#define OPTN_TCM_AVAIL_MASK 0x00000002 ++#define OPTN_FDQ_AVAIL_MASK 0x00000004 ++#define OPTN_EC_CONFIG_MASK 0x00000010 ++#define OPTN_TCM_CONFIG_MASK 0x00000020 ++#define OPTN_FDQ_CONFIG_MASK 0x00000040 ++#define OPTN_EC_INUSE_MASK 0x00000100 ++#define OPTN_TCM_INUSE_MASK 0x00000200 ++#define OPTN_FDQ_INUSe_MASK 0x00000400 ++ ++#define OPTN_EC_AVAIL_LSB 0x00000001 ++#define OPTN_TCM_AVAIL_LSB 0x00000002 ++#define OPTN_FDQ_AVAIL_LSB 0x00000003 ++#define OPTN_EC_CONFIG_LSB 0x00000004 ++#define OPTN_TCM_CONFIG_LSB 0x00000005 ++#define OPTN_FDQ_CONFIG_LSB 0x00000006 ++#define OPTN_EC_INUSE_LSB 0x00000008 ++#define OPTN_TCM_INUSE_LSB 0x00000009 ++#define OPTN_FDQ_INUSE_LSB 0x0000000a ++ ++#endif /*_CMV_H_*/ ++ ++/************************************************** ++$Log: Cmv.h,v $ ++Revision 1.1 2004/02/06 22:01:34 sleeper ++Initial creation ++ ++Revision 1.2 2003/09/14 22:09:00 sleeper ++Various changes ( I know this is not a good reason :) ++ ++Revision 1.1.1.1 2003/02/10 23:29:49 sleeper ++Imported sources ++ ++Revision 1.30 2002/05/24 21:59:30 Anoosh Naderi ++Clean up the code. ++ ++Revision 1.2 2002/01/14 21:59:30 chris.edgington ++Added GPL header. ++ ++Revision 1.1 2001/12/22 21:38:04 chris.edgington ++Initial versions - from MacOS9 project tree. ++**************************************************/ ++ +diff -urN x/drivers/usb/misc/eagle-usb/Dsp.c y/drivers/usb/misc/eagle-usb/Dsp.c +--- x/drivers/usb/misc/eagle-usb/Dsp.c 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/Dsp.c 2004-06-05 04:56:19.000000000 +1000 +@@ -0,0 +1,378 @@ ++/* ++ * ++ * Copyright (c) 2004, Frederick Ros (sl33p3r@free.fr) ++ * ++ * Dsp.c ++ * ++ * ++ * This file is part of the eagle-usb driver package. ++ * ++ * eagle-usb driver package is free software; you can redistribute it ++ * and/or modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of the License, ++ * or (at your option) any later version. ++ * ++ * "eagle-usb driver package" is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with "ADI USB ADSL Driver for Linux"; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ * $Id: Dsp.c,v 1.2 2004/06/04 18:56:19 sleeper Exp $ ++ */ ++ ++ ++#include "Adiutil.h" ++#include "Dsp.h" ++#include "macros.h" ++#include "debug.h" ++ ++/****************************************************************************/ ++/* itoi - straight from NDIS code */ ++/* - does nibble swapping for endian conversions */ ++/****************************************************************************/ ++static UInt32 itoi(UInt8 *h, UInt32 l) ++{ ++ UInt32 num, i; ++ for (num = 0, i=0; iBlockCount = 0; ++ pMainPage->Blocks = NULL; ++ *ppSwapPages = NULL; ++ *pSwapPageCount = 0; ++ ++ /* Get main page offset and swap page count from DSP header: */ ++ if (IDMAStart + 5 >= DSPSize) ++ { ++ retval = -EINVAL; ++ goto end_process_dspcode; ++ } ++ DSPIndex = IDMAStart; ++ MainPageFileOffset = itoi(pDSP + DSPIndex, 4); DSPIndex+=4; ++ SwapPageCount = itoi(pDSP + DSPIndex, 1); DSPIndex+=1; ++ ++ /* Page block count is stored on a single byte, and ++ each page offset is stored on 4 bytes (see below): */ ++ if (MainPageFileOffset + 1 >= DSPSize ++ || ++ DSPIndex + 4 * SwapPageCount >= DSPSize) ++ { ++ retval = -EINVAL; ++ goto end_process_dspcode; ++ } ++ ++ /* Allocate space for our swap page array: */ ++ pPages = (IDMAPage *) GET_VBUFFER(sizeof(IDMAPage) * SwapPageCount); ++ if (NULL == pPages) ++ { ++ retval = -ENOMEM; ++ goto end_process_dspcode; ++ } ++ *ppSwapPages = pPages; ++ *pSwapPageCount = SwapPageCount; ++ ++ /* Allocate memory for swap page blocks and get their file offsets: */ ++ for (i=0; i= DSPSize) ++ { ++ retval = -EINVAL; ++ continue; ++ } ++ /* Swap pages have two blocks at most: */ ++ pPages[i].Blocks = (IDMABlock *) GET_VBUFFER(sizeof(IDMABlock)*2); ++ if (NULL == pPages[i].Blocks) ++ retval = -ENOMEM; ++ } ++ } ++ if (retval != 0) ++ goto end_process_dspcode; ++ ++ /* Read swap pages: */ ++ for (i=0; i 2) ++ { ++ pPages[i].BlockCount = 0; ++ retval = -EINVAL; ++ continue; ++ } ++ /* Read page blocks: */ ++ for (j=0; j= DSPSize) ++ { ++ retval = -EINVAL; ++ continue; ++ } ++ pPages[i].Blocks[j].DSPAddr = itoi(pDSP + DSPIndex, 2); DSPIndex+=2; ++ pPages[i].Blocks[j].DSPSize = itoi(pDSP + DSPIndex, 2); DSPIndex+=2; ++ pPages[i].Blocks[j].DSPExtendedSize = itoi(pDSP + DSPIndex, 2); DSPIndex+=2; ++ Size = pPages[i].Blocks[j].DSPExtendedSize; ++ if (DSPIndex + Size >= DSPSize) ++ { ++ retval = -EINVAL; ++ continue; ++ } ++ DataBlock = pPages[i].Blocks[j].DSPAddr & 0x4000; ++ /* If this is data memory, we can leave it alone: */ ++ if (DataBlock) ++ { ++ pPages[i].Blocks[j].MemOffset = (UInt8 *) GET_VBUFFER(Size); ++ if (pPages[i].Blocks[j].MemOffset != NULL) ++ memcpy(pPages[i].Blocks[j].MemOffset, pDSP + DSPIndex, Size); ++ else ++ retval = -ENOMEM; ++ } ++ else ++ /**********************************************************************/ ++ /* However, if it is program memory, we have to stuff pad bytes. Since*/ ++ /* each PM word is 3 bytes, 21 "words" = 63 bytes. USB transfers are */ ++ /* broken into 64 byte chunks by the low level drivers/hardware. In */ ++ /* order to keep from sending partial words, the firmware expects each*/ ++ /* 64 byte chunk to end in a pad byte - he throws it away. So, we have*/ ++ /* to make a new PM buffer that has these pad bytes */ ++ /**********************************************************************/ ++ { ++ /* Allocate the same number of 64byte chunks as 63byte chunks we already have: */ ++ UInt8 *pNewPM = (UInt8 *) GET_VBUFFER(((Size/63)+1)*64); ++ pPages[i].Blocks[j].MemOffset = pNewPM; ++ if (pNewPM != NULL) ++ { ++ /* a = source index, b = dest index: */ ++ UInt32 a, b; ++ UInt8 *pBlockCode = pDSP + DSPIndex; ++ for (a=0, b=0; a < Size; a+=3, b+=3) ++ { ++ /* Are we at byte 63? (which would really be byte 64): */ ++ if (b && ((a%63)==0)) ++ { ++ pNewPM[b++] = 0xFF; /* Stuff in an extra byte */ ++ pPages[i].Blocks[j].DSPExtendedSize++; /* Add it to the total length */ ++ } ++ pNewPM[b + 0] = pBlockCode[a + 0]; ++ pNewPM[b + 1] = pBlockCode[a + 1]; ++ pNewPM[b + 2] = pBlockCode[a + 2]; ++ } ++ } ++ else ++ retval = -ENOMEM; ++ } ++ /* Go to the next block: */ ++ DSPIndex += Size; ++ } ++ } ++ if (retval != 0) ++ goto end_process_dspcode; ++ ++ /* Get space for main page blocks: */ ++ MainBlockCount = itoi(pDSP + MainPageFileOffset, 1); ++ pBlocks = (IDMABlock *) GET_VBUFFER(sizeof(IDMABlock)*MainBlockCount); ++ if (NULL == pBlocks) ++ { ++ retval = -ENOMEM; ++ goto end_process_dspcode; ++ } ++ pMainPage->BlockCount = MainBlockCount; ++ pMainPage->Blocks = pBlocks; ++ ++ /* Read main page blocks: */ ++ for (i=0; i= DSPSize) ++ { ++ retval = -EINVAL; ++ continue; ++ } ++ pBlocks[i].DSPAddr = itoi(pDSP + DSPIndex, 2); DSPIndex+=2; ++ DataBlock = pBlocks[i].DSPAddr & 0x4000; ++ pBlocks[i].DSPSize = (itoi(pDSP + DSPIndex, 2))*((DataBlock)?2:3); DSPIndex+=2; ++ pBlocks[i].DSPExtendedSize = itoi(pDSP + DSPIndex, 2); DSPIndex+=2; ++ Size = pBlocks[i].DSPSize; ++ if (DSPIndex + Size >= DSPSize) ++ { ++ retval = -EINVAL; ++ continue; ++ } ++ /* If this is data memory, we can leave it alone: */ ++ if (DataBlock) ++ { ++ pBlocks[i].MemOffset = (UInt8 *) GET_VBUFFER(Size); ++ if (pBlocks[i].MemOffset != NULL) ++ memcpy(pBlocks[i].MemOffset, pDSP + DSPIndex, Size); ++ else ++ retval = -ENOMEM; ++ } ++ else ++ /* Otherwise we must do some padding: */ ++ { ++ UInt8 *pNewPM = (UInt8 *) GET_VBUFFER(((Size/63)+1)*64); ++ pBlocks[i].MemOffset = pNewPM; ++ if (pNewPM != NULL) ++ { ++ UInt32 a, b; ++ UInt8 *pBlockCode = pDSP + DSPIndex; ++ /***********************************************************************/ ++ /* If this is the "first" block (which will be the last one sent), */ ++ /* we need to offset our padding by 3 bytes, 'cause we don't include */ ++ /* the first 3 bytes in the full block send. The DSP starts up when */ ++ /* offset 0 is written, so we save those 3 bytes until last. */ ++ /* (Yes, it really does make sense.) */ ++ /***********************************************************************/ ++ if (pBlocks[i].DSPAddr == 0) ++ { ++ pNewPM[0] = pBlockCode[0]; ++ pNewPM[1] = pBlockCode[1]; ++ pNewPM[2] = pBlockCode[2]; ++ pNewPM += 3; ++ pBlockCode += 3; ++ } ++ /* a = source index, b = dest index: */ ++ for (a=0, b=0; aBlockCount; ++i) ++ FREE_VBUFFER(pMainPage->Blocks[i].MemOffset); ++ FREE_VBUFFER(pMainPage->Blocks); ++ pMainPage->BlockCount = 0; ++ ++ /* Then free swap pages: */ ++ for (i=0; i<*pSwapPageCount; ++i) ++ { ++ UInt32 j; ++ for (j=0; j<(*ppSwapPages)[i].BlockCount; ++j) ++ FREE_VBUFFER((*ppSwapPages)[i].Blocks[j].MemOffset); ++ FREE_VBUFFER((*ppSwapPages)[i].Blocks); ++ } ++ FREE_VBUFFER(*ppSwapPages); ++ *pSwapPageCount = 0; ++ ++ eu_leaves (DBG_DSP); ++} ++ ++/*************************************************************************** ++$Log: Dsp.c,v $ ++Revision 1.2 2004/06/04 18:56:19 sleeper ++Cosmetics ++ ++Revision 1.1 2004/02/06 22:01:34 sleeper ++Initial creation ++ ++Revision 1.2 2003/09/14 22:09:00 sleeper ++Various changes ( I know this is not a good reason :) ++ ++Revision 1.2 2003/06/03 22:51:55 sleeper ++Changed ZAPS to eu_dbg/err macros ++ ++Revision 1.1.1.1 2003/02/10 23:29:49 sleeper ++Imported sources ++ ++Revision 1.70 2002/05/24 22:59:33 Anoosh Naderi ++Clean up the code ++ ++Revision 1.6 2002/01/16 22:59:33 steve.urquhart ++Moved portion of DspFoodProcessor and invocation of BootTheModem to ++eu_user ioctl handler. Removed LoadAndPrepareDsp. Cleaned up the ioctl ++interface. Decreased initial DSP vmalloc to less than .5MB. ++ ++Revision 1.5 2002/01/14 21:59:30 chris.edgington ++Added GPL header. ++ ++Revision 1.4 2001/12/22 19:45:55 chris.edgington ++Actually use the return value from DspFoodProcessor. ++ ++Revision 1.3 2001/12/20 22:35:17 chris.edgington ++Replaced tabs(\t) in ZAPs with kTAB - Linux doesn't like tabs. ++Replaced direct pointer access of DSP code with itoi function for endian ++conversion. ++ ++Revision 1.2 2001/12/17 22:06:28 chris.edgington ++Redid ZAPs to comply with Linux peculararities. ++ ++Revision 1.1.1.1 2001/12/14 21:27:11 chris.edgington ++Initial import ++***************************************************************************/ +diff -urN x/drivers/usb/misc/eagle-usb/Dsp.h y/drivers/usb/misc/eagle-usb/Dsp.h +--- x/drivers/usb/misc/eagle-usb/Dsp.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/Dsp.h 2004-02-07 09:01:34.000000000 +1100 +@@ -0,0 +1,34 @@ ++/*************************************************************************************/ ++/* */ ++/* Dsp.h */ ++/* */ ++/* Functions to initialize DSP data before sending them to device. */ ++/* */ ++/* This file is part of the "ADI USB ADSL Driver for Linux". */ ++/* */ ++/* "ADI USB ADSL Driver for Linux" is free software; you can redistribute it */ ++/* and/or modify it under the terms of the GNU General Public License as */ ++/* published by the Free Software Foundation; either version 2 of the License, */ ++/* or (at your option) any later version. */ ++/* */ ++/* "ADI USB ADSL Driver for Linux" is distributed in the hope that it will be */ ++/* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of */ ++/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ ++/* GNU General Public License for more details. */ ++/* */ ++/* You should have received a copy of the GNU General Public License */ ++/* along with "ADI USB ADSL Driver for Linux"; if not, write to the Free Software */ ++/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ ++/*************************************************************************************/ ++ ++#ifndef __ADIDSP_H__ ++#define __ADIDSP_H__ ++ ++#include "eagle-usb.h" ++ ++extern int ProcessDSPCode(eu_instance_t *ins, UInt8 *pDSP, UInt32 IDMAStart, UInt32 DSPSize, ++ IDMAPage *pMainPage, IDMAPage **ppSwapPages, UInt32 *pSwapPageCount); ++extern void FreeDspData(IDMAPage *pMainPage, ++ IDMAPage **ppSwapPages, UInt32 *pSwapPageCount); ++ ++#endif +diff -urN x/drivers/usb/misc/eagle-usb/Makefile y/drivers/usb/misc/eagle-usb/Makefile +--- x/drivers/usb/misc/eagle-usb/Makefile 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/Makefile 2004-09-26 20:15:52.000000000 +1000 +@@ -0,0 +1,22 @@ ++# $Id: Makefile,v 1.3 2004/06/30 20:32:32 sleeper Exp $ ++ ++ ++OBJS = eu_main.o \ ++ eu_utils.o \ ++ Pipes.o \ ++ Me.o \ ++ Sm.o \ ++ eu_msg.o \ ++ Dsp.o \ ++ Mpoa.o \ ++ Uni.o \ ++ Sar.o \ ++ Oam.o \ ++ eu_eth.o \ ++ eu_boot_sm.o ++ ++ ++EXTRA_CFLAGS+= '-DEAGLEUSBVERSION="1.9.9"' ++ ++obj-$(CONFIG_USB_EAGLE) := eagle-usb.o ++eagle-usb-objs := $(OBJS) +diff -urN x/drivers/usb/misc/eagle-usb/Me.c y/drivers/usb/misc/eagle-usb/Me.c +--- x/drivers/usb/misc/eagle-usb/Me.c 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/Me.c 2004-06-05 04:56:19.000000000 +1000 +@@ -0,0 +1,436 @@ ++/* ++ * ++ * Copyright (c) 2004, Frederick Ros (sl33p3r@free.fr) ++ * ++ * Me.c ++ * ++ * ++ * This file is part of the eagle-usb driver package. ++ * ++ * eagle-usb driver package is free software; you can redistribute it ++ * and/or modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of the License, ++ * or (at your option) any later version. ++ * ++ * "eagle-usb driver package" is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with "ADI USB ADSL Driver for Linux"; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ * $Id: Me.c,v 1.2 2004/06/04 18:56:19 sleeper Exp $ ++ */ ++ ++/*************************************************************************************/ ++/* The initial concept for MODEM DEVICE MANAGEMENT had been built around */ ++/* timer callbacks after 100 msec (0.1 sec), which is far from elegant. */ ++/* */ ++/* MAC OS USL provides completion callback for each USB transaction, */ ++/* moreover, refernce says at the time of callback the structs are reusable. */ ++/* */ ++/* Hence, timer callback makes sense only as watchdog for modem gone AWOL, */ ++/* but not to receive modem responses - that task goes in InterruptHandler. */ ++/* */ ++/* Yet modem can go retraining all by itself, w/o host being notified. */ ++/* QUESTION: can we get retrain IRQ from modem, to avoid polling? */ ++/* else, to discover such changes, periodic poll will be unavoidable. */ ++/* */ ++/* This implementation had to cope w/ variety of timing issues. */ ++/* Quite often, the ADSL book would say one thing, */ ++/* and the prototype code would to rather different. */ ++/* */ ++/* It is built around completion callbacks, that are implemented in MAC OS. */ ++/* The sequence of reading/writing USB addresses is *absolutely* important. */ ++/* */ ++/* */ ++/* Terminology: */ ++/* Request - a CMV sent out from this code to Modem */ ++/* Reply - a CMV response to the most recent Request. */ ++/* Requests and replies are processed synchronously. */ ++/* */ ++/* Alert - unsolicited message from Modem, usu. about specific event. */ ++/* The most important one is MODEM_READY. */ ++/* */ ++/* */ ++/* */ ++/* This MANAGEMENT ENTITY consists of following routines: */ ++/* */ ++/* */ ++/* 1. ProcessIncomingCmv( eu_instance_t* ins, UInt16* pMessage ) */ ++/* */ ++/* This fxn is called from the interrupt handler, whenever it */ ++/* finds out that the IRQ message is a CMV (SWAPs are filtered) */ ++/* Cleaning of TSX mailbox is done immediatelly, it is all-important! */ ++/* */ ++/* All input data are passed at once to State Machine for processing. */ ++/* */ ++/* */ ++/* 2. WatchdogTimer callback (to be implemented) */ ++/* This routine is of the type callback. */ ++/* Its main purpose is to detect incomplete transactions */ ++/* and to initiate transition to RESET upon such condition. */ ++/* The timeout period is be set at 3 secs, to reduce overload. */ ++/* */ ++/* Its secondary purpose is to ping the device periodically, */ ++/* when there's no command activity going on. Host has no means to detect */ ++/* modem's self-initiated RERTRAIN transition, exept w/ polling. */ ++/* Not that we care too much, successful retrain may go unnoticed, */ ++/* ditto successful autoreboot that will return modem in OPERATIONAL. */ ++/* */ ++/* If modem goes to FAIL state, nothing except host-initiated RESET */ ++/* will resurrect it; therefore, implementation of periodical polls is a must. */ ++/* */ ++/* */ ++/* 3. SetTimerInterval routine */ ++/* A simple utility routine, used by the fxns herein to reset timer watchdog. */ ++/* There are two possible time periods to be set: */ ++/* - heartbeat timeout - every 3 secs to see if modem is alive. */ ++/* - special times set from inside ModemSM, */ ++/* for specific delays between series of CMVs, or */ ++/* for specific timeots while waiting for rely. */ ++/* Ultimately, will be called w/ as callback. */ ++/* */ ++/* */ ++/* 4. IS THE EXTERNAL MODULE w/ FXNS THAT SEND COMMANDS TO MODEM. */ ++/* It does the detailed processing of incoming CMV base on the current state. */ ++/* */ ++/* It is called either from USB receive interrupt, or from timer routine, */ ++/* but NEVER EVER by both in the same time - that would be a disaster!!! */ ++/* */ ++/* If necessary, will send out a CMV to the modem and wait for Reply. */ ++/* The Reply is expected to arrive timely, if no Reply comes, watchdog kick in. */ ++/* */ ++/* */ ++/* */ ++/* One more task of ModemSM is to tell upper network services about state changes */ ++/* and connection availability/speed/business etc. */ ++/* Which fxn calls are req'd in MAC OS, is yet to be seen. */ ++/* */ ++/* */ ++/* These notes are subject to revision w/ implementation's progress. */ ++/* */ ++/* Ilko Dossev, Oct. 06, 2001, revision 3 */ ++/* */ ++/*************************************************************************************/ ++ ++#include "Adiutil.h" ++#include ++#include "Me.h" ++#include "macros.h" ++#include "eu_sm.h" ++#include "eu_msg.h" ++#include "debug.h" ++ ++/************************************************************************/ ++/* ProcessIncomingCmv */ ++/* */ ++/* Invoked on secondary System Task Level thread, this routine grabs */ ++/* new data from modem and clears TX mailbox status early on. */ ++/* Input data are passed immediatelly to State Machine for processing. */ ++/* Messages are discriminated to Replies and Alerts according to */ ++/* the type in the header, Replies are always synchronous messages. */ ++/* */ ++/* We expect response to arrive from modem within few hundred msecs. */ ++/* It gets all messages - either Replies or unsolicited Alerts. */ ++/************************************************************************/ ++void ProcessIncomingCmv(eu_instance_t *ins, UInt16 *pMsg) ++{ ++ UInt32 rv; ++ eu_msg_t Msg; /*decoded message struct*/ ++ Boolean* pFlag; /*which flag to clear at exit*/ ++ ++ eu_enters (DBG_MSG); ++ ++ rv = eu_decode_msg ( &Msg, pMsg ); ++ ++ if ( Msg.type == MP_FUNCTION_TYPE_ADSLDIRECTIVE ) ++ { ++ /*Alerts from modem, arrive ASYNCHRONOUSLY*/ ++ ins->AdiModemSm.InboundAsyncPending = TRUE; ++ pFlag = &ins->AdiModemSm.InboundAsyncPending; ++ if ( rv ) ++ { ++ eu_dbg (DBG_MSG,"ProcessIncomingCmv: EVENT_RX_ASYNC\n"); ++ rv = EVENT_RX_ASYNC; ++ } ++ else ++ { ++ eu_dbg (DBG_MSG,"ProcessIncomingCmv: EVENT_RX_ASYNC_ERROR\n"); ++ ++ rv = EVENT_RX_ASYNC_ERROR; ++ } ++ } ++ else ++ { ++ /*Replies from modem, arrive SYNCHRONOUSLY*/ ++ ins->AdiModemSm.InboundSyncPending = TRUE; ++ pFlag = &ins->AdiModemSm.InboundSyncPending; ++ if ( rv ) ++ { ++ eu_dbg (DBG_MSG,"ProcessIncomingCmv: EVENT_RX_SYNC\n"); ++ rv = EVENT_RX_SYNC; ++ } ++ else ++ { ++ eu_dbg (DBG_MSG,"ProcessIncomingCmv: EVENT_RX_SYNC_ERROR\n"); ++ rv = EVENT_RX_SYNC_ERROR; ++ } ++ /* when SYNC reply arrives, we can clear outbound CMV flag*/ ++ /* it is set in fxn, that may be called from */ ++ ins->AdiModemSm.OutboundPending = FALSE; ++ } ++ ++ /* process the message and reflect new SM state*/ ++ ModemSM((UInt16)rv, ins, &Msg); ++ *pFlag = FALSE; ++ ++ eu_leaves (DBG_MSG); ++} ++ ++ ++/******************************************************************************/ ++/* */ ++/* WatchdogTimer */ ++/* */ ++/* This routine is of the type for timer, */ ++/* guaranteed to be called at , never */ ++/* */ ++/* Its main purpose is to detect modem gone AWOL, and to kick-off RESET. */ ++/* If some USB command transaction did not complete, that's failure. */ ++/* If there is no USB command sequence going on at the moment, */ ++/* the function will initiate "Poll Status" for modem periodically. */ ++/* */ ++/* To avoid too frequent polling, "at ease" interval is set to 1 sec or so. */ ++/* */ ++/* When this callback is invoked, pGlobals->timerSM is already released. */ ++/* No need to do anything w/ it, only set to NULL just in case. */ ++/******************************************************************************/ ++void WatchdogTimer(unsigned long ptr) ++{ ++ eu_instance_t* ins = (eu_instance_t *)ptr; ++ AdiMSM* pAdiSm = &(ins->AdiModemSm); ++ ++ eu_enters (DBG_MSG); ++ ++ if (pAdiSm->ModemReplyExpected == MP_FUNCTION_TYPE_WAITING_4_REPLY ) ++ { ++ eu_dbg (DBG_MSG,"Watchdog timer found modem error - starting RESET!\n"); ++ ++ /*modem AWOL, initiate reset and terminate Modem SM*/ ++ ResetModemSM(pAdiSm); ++ } ++ ++ /*call State Machine to process the TIMER_TICK event*/ ++ if (ins->AdiModemSm.InboundSyncPending == FALSE && ++ ins->AdiModemSm.InboundAsyncPending == FALSE ) ++ { ++ eu_dbg (DBG_MSG,"Timer tick going to SM\n"); ++ ++ ModemSM(EVENT_TIMER_TICK, ins, NULL); ++ } ++ ++ /*if no timer is set inside State Machine, set default timeout*/ ++ if ( !timer_pending(&pAdiSm->timerSM) ) ++ { ++ eu_dbg (DBG_MSG,"Default timeout value set (0x%x)\n", TRANS_TIME_HEARTBEAT); ++ ++ SetTimerInterval(ins, TRANS_TIME_HEARTBEAT); ++ } ++ ++ eu_leaves (DBG_MSG); ++} ++ ++/***************************************************************************/ ++/* */ ++/* SetTimerInterval */ ++/* */ ++/* This utility sets next timer interval, as requested by caller. */ ++/* Caller provides delay in millisecond units, conversion done inside. */ ++/* If current timer hasn't expire yet, it is cancelled at once. */ ++/* New timer is created *automatically* and its Id is placed in pGlobals. */ ++/* */ ++/* WARNING! */ ++/* There are no provisions to cope w/ failure. */ ++/* MAC OS manuals say, it will always succeed, so in them we trust! */ ++/* */ ++/* COMPATIBILITY */ ++/* This call is "Carbon"-incompatible, good for MAC OS 8 and 9 only. */ ++/* For MAC OS X, rewrite will be an absolute must. */ ++/***************************************************************************/ ++int SetTimerInterval(eu_instance_t* ins, int reqDelay) ++{ ++ AdiMSM *pAdiSm = &(ins->AdiModemSm); ++ int curtime = jiffies; ++ int delay = MSEC_TO_JIFFIES(reqDelay); ++ int exptime; ++ ++ eu_enters (DBG_MSG); ++ eu_dbg (DBG_MSG,"Requested delay = %d\n",reqDelay); ++ ++ /*If the timer is currently running, delete it*/ ++ if ( timer_pending(&pAdiSm->timerSM) ) ++ del_timer(&pAdiSm->timerSM); ++ ++ pAdiSm->CurrentExpirationTime = curtime; ++ if ( reqDelay == 0 ) ++ goto SetTimer_exit; ++ ++ /*calculate the minimal delay requested*/ ++ if ( curtime < pAdiSm->SwapPageRequiredTime ) ++ { ++ int newDelay; ++ newDelay = pAdiSm->SwapPageRequiredTime - curtime; ++ if ( delay < newDelay ) ++ delay = newDelay; ++ } ++ ++ exptime = curtime + delay; ++ pAdiSm->timerSM.expires = exptime; ++ pAdiSm->CurrentExpirationTime = exptime; ++ ++ /*we expect this system call to succeed always*/ ++ add_timer(&pAdiSm->timerSM); ++ ++ SetTimer_exit: ++ eu_leaves (DBG_MSG); ++ return 0; ++} ++ ++ ++/******************************************************************** ++$Log: Me.c,v $ ++Revision 1.2 2004/06/04 18:56:19 sleeper ++Cosmetics ++ ++Revision 1.1 2004/02/06 22:01:34 sleeper ++Initial creation ++ ++Revision 1.3 2003/10/04 14:25:47 sleeper ++2.6 portage ++ ++Revision 1.2 2003/09/14 22:09:00 sleeper ++Various changes ( I know this is not a good reason :) ++ ++Revision 1.2 2003/06/03 22:42:29 sleeper ++Changed ZAPS to eu_dbg/err macros ++ ++Revision 1.1.1.1 2003/02/10 23:29:49 sleeper ++Imported sources ++ ++Revision 1.50 2002/05/24 21:59:33 Anoosh Naderi ++Clean up the code ++ ++Revision 1.4 2002/01/14 21:59:33 chris.edgington ++Added GPL header. ++ ++Revision 1.3 2001/12/28 19:36:17 chris.edgington ++Removed setting of ModemReplyExpected in WatchdogTimer. ++Added comments from Ilko to AdjustTimerInterval. ++ ++Revision 1.2 2001/12/26 22:48:02 chris.edgington ++Added kernel timer support. ++ ++Revision 1.1 2001/12/22 21:38:04 chris.edgington ++Initial versions - from MacOS9 project tree. ++ ++--------------------------------------------------------------------------- ++ Log from MacOS9 project ++--------------------------------------------------------------------------- ++ ++Revision 1.29 2001/12/14 06:41:17 ilko.dossev ++Trace messages added for special timer cases. ++ checks for invalid max delay (zero is now prohibited). ++ ++Revision 1.28 2001/12/05 22:16:00 chris.edgington ++Added Analog Devices copyright notice. ++ ++Revision 1.27 2001/11/19 18:12:37 ilko.dossev ++OS 9 specific code moved to module. ++Obsolete special debug traces removed. ++ ++Revision 1.26 2001/11/13 20:40:50 ilko.dossev ++ stub function defined, to be completed later. ++Pls, see comments before function definition. ++ ++Revision 1.25 2001/11/09 03:21:04 ilko.dossev ++Removed quick return from ME if message fails to decode. ++ ++Revision 1.24 2001/10/18 22:43:39 martyn.deobald ++Added quick cutout in ProcessIncomingCMV if the message doesn't decode OK ++ ++Revision 1.23 2001/10/18 21:42:51 ilko.dossev ++Writing MAILBOX_EMPTY not req'd any more w/ latest ADI firmware. ++ ++Revision 1.22 2001/10/11 17:01:16 ilko.dossev ++Var names changed to reflect their actual usage in AdiMSM structure ++ ++Revision 1.21 2001/10/07 03:32:03 ilko.dossev ++Processing simplified for incoming messages, immediate call to Statte Machine from USB interrupt callback. ++Timer procedure simplified, special care taken that: ++ - no timer will be initialized twice by accident; ++ - no call to ModemSM will occur while processing USB interrupt. ++Discarded obsolete procedure. ++ ++Revision 1.20 2001/10/05 23:35:00 ilko.dossev ++Changed ModemSM calls - to include as parameter a pointer to the decoded message structure. ++ ++Revision 1.19 2001/10/04 15:44:06 chris.edgington ++Added code to disable DCON output while we're in timer handler. ++ ++Revision 1.18 2001/10/03 21:30:49 chris.edgington ++Major rework and simplification in order to get CMV upload and training sequence working. ++ ++Revision 1.17 2001/10/03 18:33:21 ilko.dossev ++Comments' sectoin revised, comments brought up-to date, worths reading them. ++Parsing error is passed for processing to StateMachine, as it is in the original code. ++Special comment about secondary RX mailbox cleanup put in the code. ++ ++Revision 1.16 2001/10/03 16:32:54 ilko.dossev ++The process for receiving CMV from modem changed to three-step. ++First, RX and TX mailboxes are cleared. ++Next, after completion of these writes, SM is called. ++Finally, outbound CMV is placed in the queue. ++ ++Revision 1.15 2001/10/02 16:14:55 ilko.dossev ++Sending message to modem cleared from this module - moved to ModemSM fxn. ++ ++Revision 1.14 2001/10/02 01:40:29 ilko.dossev ++Delayed initialization sequence implemented ++ ++Revision 1.13 2001/10/01 21:47:10 ilko.dossev ++Some extra debug output added. ++Fixed HARD_RESET setting for state machine. ++ ++Revision 1.12 2001/09/29 04:31:16 ilko.dossev ++Timer loop for State Macine refined, now exits when driver unloaded. ++Some extra trace output added for message decoding. ++ ++Revision 1.11 2001/09/28 20:50:58 ilko.dossev ++Cleaned up ModemME, w/ only ProcessIncomingCmv and Timer Watchdog. ++ ++Revision 1.9 2001/09/27 23:22:13 ilko.dossev ++ZAPs added in ProcessIncomingCmv ++ ++Revision 1.8 2001/09/27 22:07:18 ilko.dossev ++ProcessIncomingCmv function added, message processing architecture to be revised. ++ ++Revision 1.7 2001/09/26 22:33:23 ilko.dossev ++Functions modified following changes in MsgProtocol.C ++Important functions ZAP-ed (debug output). ++ ++Revision 1.6 2001/09/26 15:43:16 chris.edgington ++Moved all the boot code to Boot.c. ++ ++Revision 1.5 2001/09/25 22:30:06 chris.edgington ++Added BootModem, StateMachine, and StateMachineCompletionHandler. ++ ++Revision 1.4 2001/09/25 18:42:46 ilko.dossev ++$ID$ and $LOG$ sections added. ++ ++Revision 1.3 2001/09/24 20:59:52 ilko.dossev ++**********************************************************************************/ ++ ++ +diff -urN x/drivers/usb/misc/eagle-usb/Me.h y/drivers/usb/misc/eagle-usb/Me.h +--- x/drivers/usb/misc/eagle-usb/Me.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/Me.h 2004-02-07 09:01:34.000000000 +1100 +@@ -0,0 +1,33 @@ ++/*************************************************************************************/ ++/* */ ++/* Me.h */ ++/* */ ++/* Functions to manage modem state. */ ++/* */ ++/* This file is part of the "ADI USB ADSL Driver for Linux". */ ++/* */ ++/* "ADI USB ADSL Driver for Linux" is free software; you can redistribute it */ ++/* and/or modify it under the terms of the GNU General Public License as */ ++/* published by the Free Software Foundation; either version 2 of the License, */ ++/* or (at your option) any later version. */ ++/* */ ++/* "ADI USB ADSL Driver for Linux" is distributed in the hope that it will be */ ++/* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of */ ++/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ ++/* GNU General Public License for more details. */ ++/* */ ++/* You should have received a copy of the GNU General Public License */ ++/* along with "ADI USB ADSL Driver for Linux"; if not, write to the Free Software */ ++/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ ++/*************************************************************************************/ ++ ++#ifndef __ADIME_H__ ++#define __ADIME_H__ ++ ++#include "eagle-usb.h" ++ ++extern void ProcessIncomingCmv(eu_instance_t *ins, UInt16 *pMsg); ++extern int SetTimerInterval( eu_instance_t*, int Duration ); ++extern void WatchdogTimer(unsigned long ptr); ++ ++#endif +diff -urN x/drivers/usb/misc/eagle-usb/Mpoa.c y/drivers/usb/misc/eagle-usb/Mpoa.c +--- x/drivers/usb/misc/eagle-usb/Mpoa.c 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/Mpoa.c 2004-08-30 18:57:39.000000000 +1000 +@@ -0,0 +1,844 @@ ++ ++/* ++ * Mpoa.c ++ * ++ * Copyright (c) 2001, Analog Devices Inc., All Rights Reserved ++ * ++ * RFC2684(1483) "Multi-Protocol Encapsulation Over ATM AAL5" support module ++ * ++ * Fix by Robert.Siemer-eagleusb@backsla.sh 22.8.2004: ++ * Correction of mru in PPPoA cases. ++ * ++ * ---------------------------------------------------------------------------- ++ * ++ * This file is part of the eagle-usb driver package. ++ * ++ * "eagle-usb driver package" is free software; you can redistribute it ++ * and/or modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of the License, ++ * or (at your option) any later version. ++ * ++ * "eagle-usb driver package" is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with "eagle-usb driver package"; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ * ++ * $Id: Mpoa.c,v 1.5 2004/08/26 20:47:54 sleeper Exp $ ++ */ ++ ++#include "Adiutil.h" ++#include "Mpoa.h" ++#include "Uni.h" ++#include "debug.h" ++ ++/**********************************************************************************/ ++/* This module provides support similar to Rfc1483.c from the NDIS code. */ ++/* Therefore, the following text from Rfc1483.c is provided, modified slightly, */ ++/* as an explanation for how the various encapsulation types are handled. It */ ++/* should be noted that some of the resonsibility for encapsulation is shared */ ++/* by the more generic UniSendPdu routine. It checks to see if an encapsulation */ ++/* header has been specified and includes it went sending the Pdu. This eliminates*/ ++/* an additional call for the most common operations. */ ++/* */ ++/* The MPOA module supports four PDU options: */ ++/* 1. LLC Encapsulated Ethernet */ ++/* 2. VC Encapsulated Ethernet (without FCS) */ ++/* 3. LLC Encapsulated IP */ ++/* 4. VC Encapsulated IP */ ++/* */ ++/* The type of encapsulation is set during initialization, based on the */ ++/* MpoaMode configuration option. The default mode is LLC Encapsulated */ ++/* Ethernet. Each of the PDU options is described briefly below. */ ++/* See http://www.ietf.org/rfc/rfc2684.txt?number=2684 for details. */ ++/* (Note that OT = Open Transport.) */ ++/* */ ++/* 1. LLC Encapsulated Ethernet */ ++/* */ ++/* Ethernet frames are accepted from OT and encapsulated as shown below. */ ++/* Note that the PID value of 0x00-07 is used, indicating that the LAN */ ++/* FCS (Frame Check Sequence) is not present. */ ++/* */ ++/* +-------------------------------+ */ ++/* | LLC 0xAA-AA-03 | */ ++/* +-------------------------------+ */ ++/* | OUI 0x00-80-C2 | */ ++/* +-------------------------------+ */ ++/* | PID 0x00-07 | */ ++/* +-------------------------------+ */ ++/* | PAD 0x00-00 | */ ++/* +-------------------------------+ */ ++/* | MAC destination address | */ ++/* +-------------------------------+ */ ++/* | | */ ++/* | (remainder of MAC frame) | */ ++/* | | */ ++/* +-------------------------------+ */ ++/* */ ++/* Once encapsulated, the RFC2684 PDUs are sent using AAL5 on the PVC */ ++/* provisioned during initialization. */ ++/* */ ++/* Inbound LLC encapsulated 802.3 frames are accepted from the ATM UNI */ ++/* module. Note that in the inbound direction, either PID value is */ ++/* allowed. If the PID value is 0x00-01 (indicating LAN FCS is present), */ ++/* the LAN FCS is simply discarded. The LLC encapsulation is removed and */ ++/* the Ethernet frame is indicated to OT. */ ++/* */ ++/* 2. VC Encapsulated Ethernet */ ++/* */ ++/* Same as (1) above with the exception that the LLC header is ommitted */ ++/* (except for the PAD field). Thus the PDUs transmitted are as shown */ ++/* below. */ ++/* */ ++/* +-------------------------------+ */ ++/* | PAD 0x00-00 | */ ++/* +-------------------------------+ */ ++/* | MAC destination address | */ ++/* +-------------------------------+ */ ++/* | | */ ++/* | (remainder of MAC frame) | */ ++/* | | */ ++/* +-------------------------------+ */ ++/* */ ++/* Note that the inclusion of the LAN FCS is not supported with VC */ ++/* Encapsulated Ethernet. */ ++/* */ ++/* 3. LLC Encapsulated IP */ ++/* */ ++/* Ethernet frames are accepted from OT and the Ethernet header is */ ++/* discarded up to the EtherType. If the EtherType is not IP, the */ ++/* frame is discarded. Otherwise, the frame is encapsulated and sent */ ++/* as shown below. */ ++/* */ ++/* +-------------------------------+ */ ++/* | LLC 0xAA-AA-03 | */ ++/* +-------------------------------+ */ ++/* | OUI 0x00-00-00 | */ ++/* +-------------------------------+ */ ++/* | EtherType 0x08-00 (IP) | */ ++/* +-------------------------------+ */ ++/* | | */ ++/* | IP PDU | */ ++/* | | */ ++/* +-------------------------------+ */ ++/* */ ++/* In addition, the MPOA module will generate responses to outbound */ ++/* Ethernet ARP requests in order to satisfy the IP stack. */ ++/* Note: */ ++/* I do not know if the above statement will be true on the Mac platform, */ ++/* real debugging will determine whether or not we need to do this. */ ++/* */ ++/* 4. VC Encapsulated IP */ ++/* */ ++/* Same as (3) above except that the LLC header and Ethertype are ommitted. */ ++/* Thus the PDUs transmitted are as shown below. */ ++/* */ ++/* +-------------------------------+ */ ++/* | | */ ++/* | IP PDU | */ ++/* | | */ ++/* +-------------------------------+ */ ++/* */ ++/**********************************************************************************/ ++ ++/**********************************************************************************/ ++/* Local prototypes */ ++/**********************************************************************************/ ++static Boolean MpoaFilterReceivedPacket(eu_instance_t *ins, struct ethhdr *pMac); ++ ++ ++/* ++ * For processing network data ++ */ ++#define MPOA_MAX_ENCAP_SIZE 10 ++#define MPOA_LLC_ENCAP_BRIDGED_ETH_SIZE 10 ++#define MPOA_LLC_ENCAP_ROUTED_IP_SIZE 8 ++#define MPOA_VC_ENCAP_BRIDGED_ETH_SIZE 2 ++#define MPOA_LLC_ENCAP_PPPOA_SIZE 4 ++ ++/**********************************************************************************/ ++/* These static data structures are the encapsulation headers we need for Mpoa */ ++/**********************************************************************************/ ++ ++#define IS_LLCBRIDGEDETHNOFCS(p) (\ ++ (cpu_to_le32(*((UInt32 *)p)) == 0x0003AAAA) && \ ++ (cpu_to_le32(*((UInt32 *)(p+4))) == 0x0700C280) && \ ++ (cpu_to_le32(*((UInt32 *)(p+6))) == 0x00000700)) ++ ++typedef struct LLC_HEADER ++{ ++ uint8_t Llc[3]; ++ uint8_t Oui[3]; ++ uint8_t Pid[2]; ++ uint8_t Pad[2]; ++} LLC_HEADER; ++ ++ ++static const LLC_HEADER MpoaHdr_LlcEncapBridgedEthNoFcs = ++{ {0xAA,0xAA,0x03}, ++ {0x00,0x80,0xC2}, ++ {0x00,0x07}, ++ {0x00,0x00} ++}; ++ ++#define IS_LLCBRIDGEDETHFCS(p) (\ ++ (cpu_to_le32(*((UInt32 *)p)) == 0x0003AAAA) && \ ++ (cpu_to_le32(*((UInt32 *)(p+4))) == 0x0100C280) && \ ++ (cpu_to_le32(*((UInt32 *)(p+6))) == 0x00000100)) ++ ++#ifdef LATER_LATER_LATER /* this isn't used right now */ ++static const LLC_HEADER MpoaHdr_LlcEncapBridgedEthFcs = ++{ {0xAA,0xAA,0x03}, ++ {0x00,0x80,0xC2}, ++ {0x00,0x01}, ++ {0x00,0x00} ++}; ++#endif ++ ++#define IS_LLCROUTEDIP(p) (\ ++ (cpu_to_le32(*((UInt32 *)p)) == 0x0003AAAA) && \ ++ (cpu_to_le32(*((UInt32 *)(p+4))) == 0x00080000)) ++ ++static const LLC_HEADER MpoaHdr_LlcEncapRoutedIp = ++{ {0xAA,0xAA,0x03}, ++ {0x00,0x00,0x00}, ++ {0x08,0x00} ++}; ++ ++#define IS_VCBRIDGEDETH(p) (\ ++ (*((UInt16 *)p) == 0x0000)) ++ ++static const UInt8 MpoaHdr_VcEncapBridgedEth[ MPOA_VC_ENCAP_BRIDGED_ETH_SIZE] = ++{ 0x00,0x00 }; ++ ++/**********************************************************************************/ ++/* Added on April 30,2002 by Anoosh to support PPPoA */ ++static const UInt8 MpoaHdr_LlcEncapPPPoA[ MPOA_LLC_ENCAP_PPPOA_SIZE ] = { 0xFE, 0xFE, 0x03, 0xCF }; ++ ++#define IS_LLCPPPOA(p) (\ ++ (cpu_to_le32(*((UInt32 *)p)) == 0xCF03FEFE)) ++/**********************************************************************************/ ++ ++static const UInt8 MacBroadcast[ ETH_ALEN ] = ++{ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF }; ++ ++#define EQUAL_MACHDR(a1,a2) (\ ++ (*((UInt32 *)a1) == *((UInt32 *)a2)) && \ ++ (*((UInt32 *)(a1+2)) == *((UInt32 *)(a2+2)))) ++ ++#define MAC_SIZE 6 ++#define IP_SIZE 4 ++#define ARP_OP_REQUEST 0x0100 ++#define ARP_OP_REPLY 0x0200 ++ ++// Field names taken from RFC826 ++typedef struct ARP_PACKET ++{ ++ uint16_t Hrd; ++ uint16_t Pro; ++ uint8_t Hln; ++ uint8_t Pln; ++ uint16_t Op; ++ uint8_t Sha[MAC_SIZE]; ++ uint8_t Spa[IP_SIZE]; ++ uint8_t Tha[MAC_SIZE]; ++ uint8_t Tpa[IP_SIZE]; ++} ARP_PACKET; ++ ++ ++/**********************************************************************************/ ++/* MpoaInitialize */ ++/* Prepares for MPOA processing by setting up the proper encapsulation */ ++/**********************************************************************************/ ++void MpoaInitialize( eu_instance_t *ins, const eu_options_t opt) ++{ ++ UInt16 HdrSize=0; ++ UInt8 *pHdr=NULL; ++ UInt32 MpoaMode = opt[CFG_ENCAPS].value; ++ ++ eu_enters (DBG_MPOA); ++ ++ ++ /*Setup the encapsulation header and function pointer based on the mode specified*/ ++ switch (MpoaMode) ++ { ++ case MPOA_MODE_BRIDGED_ETH_LLC: ++ eu_dbg(DBG_MPOA,"MpoaInitialize - MPOA mode set at: MPOA_MODE_BRIDGED_ETH_LLC\n"); ++ ++ pHdr = (UInt8 *)&MpoaHdr_LlcEncapBridgedEthNoFcs; ++ HdrSize = MPOA_LLC_ENCAP_BRIDGED_ETH_SIZE; ++ break; ++ case MPOA_MODE_BRIDGED_ETH_VC: ++ eu_dbg (DBG_MPOA,"MpoaInitialize - MPOA mode set at: MPOA_MODE_BRIDGED_ETH_VC\n"); ++ ++ pHdr = (UInt8 *)&MpoaHdr_VcEncapBridgedEth; ++ HdrSize = MPOA_VC_ENCAP_BRIDGED_ETH_SIZE; ++ break; ++ case MPOA_MODE_ROUTED_IP_LLC: ++ eu_dbg (DBG_MPOA,"MpoaInitialize - MPOA mode set at: MPOA_MODE_ROUTED_IP_LLC\n"); ++ ++ pHdr = (UInt8 *)&MpoaHdr_LlcEncapRoutedIp; ++ HdrSize = MPOA_LLC_ENCAP_ROUTED_IP_SIZE; ++ break; ++ case MPOA_MODE_ROUTED_IP_VC: ++ eu_dbg (DBG_MPOA,"MpoaInitialize - MPOA mode set at: MPOA_MODE_ROUTED_IP_VC\n"); ++ ++ /* Since there is no ethernet header and the encapsulation is already*/ ++ /* a part of the VC by definition, no additional header info needs */ ++ /* stuffed into packets when in this mode */ ++ pHdr = NULL; ++ HdrSize = 0; ++ break; ++ /**************************************************************************/ ++ /*The following two cases added on April30,2002 by Anoosh to support PPPoA*/ ++ case MPOA_MODE_PPPOA_LLC: ++ eu_dbg (DBG_MPOA,"MpoaInitialize - MPOA mode set at: MPOA_MODE_PPPOA_LLC\n"); ++ ++ pHdr = (UInt8 *)&MpoaHdr_LlcEncapPPPoA; ++ HdrSize = MPOA_LLC_ENCAP_PPPOA_SIZE; ++ break; ++ case MPOA_MODE_PPPOA_VC: ++ eu_dbg (DBG_MPOA,"MpoaInitialize - MPOA mode set at: MPOA_MODE_PPPOA_VC\n"); ++ ++ pHdr = NULL; ++ HdrSize = 0; ++ break; ++ /**********************************************************************/ ++ } ++ ++ /* ++ * The NDIS code has a distinction between "creating" and "activating" the ++ * virtual channel. That code is only necessary when dealing with ++ * higher-level software that understands and manages virtual channels (like ++ * NDIS 5). Since this is the Mac ethernet driver, we know that nobody above ++ * us is going to talk ATM, so we combined both functions into one, ++ * UniEstablishVc. ++ */ ++ eu_uni_establish_vc ( ins, ++ pHdr, ++ HdrSize, ++ opt[CFG_VPI].value, ++ opt[CFG_VCI].value ); ++ ++ ins->MpoaMode = MpoaMode; ++ ++ /* ++ * We also need to set the reassembly size that will be used. By default it ++ * is set to the size of the pReassemblyBuffer, which is 1536, but as this ++ * size is used to control that the received PDU is not to big, we should ++ * set it up accordingly to the encapsulation type ++ */ ++ switch (MpoaMode) ++ { ++ case MPOA_MODE_BRIDGED_ETH_LLC: ++ case MPOA_MODE_BRIDGED_ETH_VC: ++ ins->mru = 1524; ++ ins->eth_hdr = 0; ++ break; ++ ++ case MPOA_MODE_ROUTED_IP_LLC: ++ case MPOA_MODE_ROUTED_IP_VC: ++ /* Do not change it ... set to 1536 */ ++ ins->mru = 1536; ++ ins->eth_hdr = 14; ++ break; ++ ++ case MPOA_MODE_PPPOA_LLC: ++ /* ++ *Like VC, but LLC occupies 4 Bytes AAL5 space ++ */ ++ ins->mru= 65535-4; ++ ins->eth_hdr = 16; ++ break; ++ ++ case MPOA_MODE_PPPOA_VC: ++ /* ++ * PPPoA packet should hold in an Ethernet frame. Thus it is limited ++ * to 1500 bytes. As we'll add 2 bytes for packet size following ++ * ethernet header, the payload size is 1498. ++ * ++ * What is a PPPoA packet? PPPoA is a method. ++ * Okay, let's say it's a PPP packet going to be ++ * transmitted or was received over an ATM link. ++ * So, a PPPoA packet should hold a PPP packet, which can be ++ * 65537 Bytes. Unfortunately AAL5 can carry only 65535 Bytes. ++ * Robert ++ */ ++ ins->mru = 65535; ++ ins->eth_hdr = 16; ++ break; ++ ++ default: ++ eu_warn( "Unknown encapsulation type 0x%x\n",MpoaMode); ++ break; ++ } ++ ++ eu_leaves (DBG_MPOA); ++ ++} ++ ++/**********************************************************************************/ ++/* MpoaProcessReceivedPdu */ ++/* */ ++/* This routine will be called by the receive data routine by the "user" */ ++/* of this driver. I thought it was best to delay as much processing so */ ++/* we could exit the data receiver handler as soon as possible */ ++/* Return TRUE if the packet should be dropped */ ++/**********************************************************************************/ ++unsigned int MpoaProcessReceivedPdu ( ++ eu_instance_t *ins, ++ struct sk_buff *skb, ++ uint32_t *encaps_skip_size ++ ) ++{ ++ unsigned int drop_packet = FALSE; /* Do not drop this packet */ ++ ++ struct ethhdr *phdr; ++ ++ eu_dbg (DBG_MPOA,"MpoaProcessReceivedPdu\n"); ++ ++ ++ switch ( ins->MpoaMode ) ++ { ++ case MPOA_MODE_BRIDGED_ETH_LLC: ++ if ( IS_LLCBRIDGEDETHNOFCS(skb->data) ) ++ { ++ /* We've got an LLC encapsulated ethernet packet without FCS,*/ ++ /* since our "user" is ethernet, skip over the LLC header */ ++ *encaps_skip_size = MPOA_LLC_ENCAP_BRIDGED_ETH_SIZE; ++ } ++ else ++ { ++ if ( IS_LLCBRIDGEDETHFCS(skb->data) ) ++ { ++ /* We've got an LLC encapsulated ethernet packet with FCS,*/ ++ /* since our "user" is ethernet, skip over the LLC header */ ++ *encaps_skip_size = MPOA_LLC_ENCAP_BRIDGED_ETH_SIZE; ++ } ++ else ++ { ++ eu_dbg (DBG_MPOA,"MpoaProcessReceivedPdu: invalid LLC header\n"); ++ drop_packet = TRUE; /* Drop it */ ++ } ++ } ++ break; ++ case MPOA_MODE_BRIDGED_ETH_VC: ++ if ( IS_VCBRIDGEDETH (skb->data) ) ++ { ++ /* We've got a VC encapsulated ethernet packet, */ ++ /* since our "user" is ethernet, skip over the VC header*/ ++ *encaps_skip_size = MPOA_VC_ENCAP_BRIDGED_ETH_SIZE; ++ } ++ else ++ { ++ /* The header for this Pdu did not match our stored VC header,*/ ++ /* so we cannot with good faith accept this Pdu */ ++ eu_dbg (DBG_MPOA,"MpoaProcessReceivedPdu: invalid VC header\n"); ++ ++ drop_packet = TRUE; /* Drop it */ ++ } ++ break; ++ case MPOA_MODE_ROUTED_IP_LLC: ++ if( IS_LLCROUTEDIP (skb->data) ) ++ { ++ *encaps_skip_size = MPOA_LLC_ENCAP_ROUTED_IP_SIZE ; ++ } ++ else ++ { ++ eu_dbg (DBG_MPOA,"MpoaProcessReceivedPdu: invalid LLC header\n"); ++ ++ drop_packet = TRUE; /* Drop it */ ++ } ++ break; ++ ++ case MPOA_MODE_ROUTED_IP_VC: ++ *encaps_skip_size = 0; ++ break; ++ ++ case MPOA_MODE_PPPOA_LLC: ++ if ( IS_LLCPPPOA (skb->data) ) ++ { ++ /* We've got an LLC encapsulated PPPoA packet, */ ++ /* since our "user" is PPP, skip over the LLC header*/ ++ *encaps_skip_size = MPOA_LLC_ENCAP_PPPOA_SIZE; ++ } ++ else ++ { ++ /* We're in LLC PPPOA mode, but this packet does not have an LLC*/ ++ /* header, so we cannot with good faith accept this Pdu */ ++ eu_dbg (DBG_MPOA,"MpoaProcessReceivedPdu: invalid LLC header\n"); ++ ++ drop_packet = TRUE; /* Drop it */ ++ } ++ break; ++ ++ case MPOA_MODE_PPPOA_VC: ++ /* In PPPOA_VC mode, there is no MPOA header, so we don't do skip anything*/ ++ *encaps_skip_size = 0; ++ break; ++ ++ /****************************************************************************/ ++ default: ++ eu_err ("MpoaProcessReceivedPdu: unsupported MpoaMode\n"); ++ drop_packet = TRUE; /* Drop it */ ++ break; ++ } ++ ++ /**************************************************************************/ ++ /* This comment has been added on April 30,2002 by Anoosh to support PPPoA*/ ++ /* We do not do packet filtering in any of the PPP modes, therefore I need*/ ++ /* to add a flag to see if this isPPP then do not do packet filtering like*/ ++ /* MAC driver in Mpoa.c line 364 */ ++ /**************************************************************************/ ++ ++ /****************************************************************************/ ++ /* We've determined any header size that we need to skip and verified that */ ++ /* we have a valid header. If we determined that this Pdu should be dropped,*/ ++ /* we shouldn't do any more processing */ ++ /****************************************************************************/ ++ if ( !drop_packet ) ++ { ++ phdr = (struct ethhdr *)(skb->data + *encaps_skip_size); ++ ++ /**************************************************************/ ++ /* Comment and added by Anoosh on April30,2002 to support */ ++ /* PPPoA we do not do packet filtering in any of the PPP modes*/ ++ switch ( ins->MpoaMode ) ++ { ++ case MPOA_MODE_ROUTED_IP_LLC: ++ case MPOA_MODE_ROUTED_IP_VC: ++ case MPOA_MODE_PPPOA_LLC: ++ case MPOA_MODE_PPPOA_VC: ++ /*****************************************************************************/ ++ /*Comment by Anoosh on April30,2002 to support PPPoA */ ++ /*This is when we are in PPPoA mode and we do not have any packet filtering */ ++ /*We do not do anything here. MAC driver do some stuff for PPPoE to make */ ++ /*sure about the type of ethernet packet and session ID and if that is */ ++ /*correct then it take out the extra header for PPPoE and passes to PPP stack*/ ++ /*****************************************************************************/ ++ break; ++ default: ++ /************************************************************************/ ++ /*Comment by Anoosh on April30,2002 to support PPPoA */ ++ /*This is the normal situation for LAN driver that we filter that packet*/ ++ /************************************************************************/ ++ drop_packet = MpoaFilterReceivedPacket (ins, phdr); ++ if ( drop_packet ) ++ { ++ ins->Statistics[STAT_PAKTS_FILTERED]++; ++ } ++ ++ break; ++ } ++ /**************************************************************/ ++ } ++ ++ eu_leaves (DBG_MPOA); ++ ++ return (drop_packet); ++ ++} ++ ++/**********************************************************************************/ ++/* MpoaFilterReceivedPacket */ ++/* */ ++/* Checks the MAC header relative to our current filter mode. Returns */ ++/* TRUE if this packet should be filtered (not processed). */ ++/**********************************************************************************/ ++static Boolean MpoaFilterReceivedPacket(eu_instance_t *ins, struct ethhdr *phdr) ++{ ++ struct net_device *ether = ins->eth; ++ Boolean FilterIt = FALSE; ++ ++ eu_enters (DBG_MPOA); ++ ++ ++ ++ /* If we're in promiscuous mode - then all packets go through!*/ ++ if (ether->flags & IFF_PROMISC) ++ { ++ eu_dbg (DBG_MPOA,"IFF_PROMISC set.\n"); ++ ++ FilterIt = FALSE; ++ } ++ else ++ { ++ /* Lets determine if this is a Directed, Broadcast, or Multicast packet*/ ++ if ( phdr->h_dest[0] & 0x01 ) ++ { ++ /* This is either a Broadcast or Multicast packet*/ ++ if ( EQUAL_MACHDR(phdr->h_dest, MacBroadcast) ) ++ { ++ /* This is a broadcast packet*/ ++ eu_dbg (DBG_MPOA,"Broadcast packet.\n"); ++ FilterIt = FALSE; ++ } ++ else ++ { ++ /* This is a multicast packet*/ ++ if ( ether->flags & IFF_ALLMULTI ) ++ { ++ eu_dbg (DBG_MPOA,"IFF_ALLMULTI set.\n"); ++ ++ FilterIt = FALSE; ++ } ++ else ++ { ++ eu_dbg (DBG_MPOA,"Multicast packet.\n"); ++ ++ /* Now we have to compare the DstAddress with our list*/ ++ /* of acceptable multicast addresses */ ++ if (ether->mc_count > 0) ++ { ++ int i; ++ struct dev_mc_list *mc; ++ ++ /* Start out by assuming that we need to filter this*/ ++ /* packet, since we will encounter a match only when*/ ++ /* this is a valid packet to go through (not filter)*/ ++ FilterIt = TRUE; ++ ++ /* This loop works because z will evaluate to 0 or NULL*/ ++ /* when z->next is NULL, which will stop the loop */ ++ for (i = 0, mc = ether->mc_list; ++ mc && i < ether->mc_count; ++ i++, mc = mc->next) ++ { ++ if ( EQUAL_MACHDR(phdr->h_dest, mc->dmi_addr) ) ++ { ++ FilterIt = FALSE; ++ break; /* We found it - get out of the loop*/ ++ } ++ } ++ } ++ else ++ { ++ FilterIt = TRUE; ++ } ++ } ++ } ++ } ++ else ++ { ++ /* This is a directed packet*/ ++ if ( EQUAL_MACHDR(phdr->h_dest, ins->mac) ) ++ { ++ eu_dbg (DBG_MPOA,"Directed packet match.\n"); ++ ++ /* This packet is directed to us*/ ++ FilterIt = FALSE; ++ } ++ else ++ { ++ eu_dbg (DBG_MPOA,"Directed packet not a match.\n"); ++ ++ /* This packet is not directed to us */ ++ FilterIt = TRUE; ++ } ++ } ++ } ++ ++ eu_leaves (DBG_MPOA); ++ ++ return FilterIt; ++} ++ ++// FFD120602 : (BUG?) Added for routed mode. It seems that there is a problem with ++// indicating the linux system that the send is complete. I had to do some calls after ++// ARP call to make it working for now. Should be inverstigated later. ++//--------------------------------------------------------------------------- ++// EthernetArpReply ++// ++// Simulates an ARP reply, used when in routed IP mode. Note, the logic ++// for this code was taken from the Windows NDIS code. ++//--------------------------------------------------------------------------- ++#if 0 ++void EthernetArpReply(eu_instance_t *ins, UInt8 *pBuf, UInt32 PacketSize) ++{ ++ struct ethhdr *req_hdr; ++ struct ethhdr *reply_hdr; ++ ARP_PACKET *pArp; ++ uint32_t ip_src, ip_dst; ++ struct sk_buff *skb; ++ ++ eu_enters (DBG_ROUTEIP); ++ ++ ++ req_hdr = (struct ethhdr *)pBuf; ++ reply_hdr = (struct ethhdr *)ins->pPacket; ++ ++ // First, copy the original ARP request into our reply packet ++ memcpy ( ins->pPacket, pBuf, PacketSize ); ++ ++ pArp = (ARP_PACKET *)(ins->pPacket + sizeof(struct ethhdr)); ++ ip_src = *(uint32_t *)(pArp->Spa); ++ ip_dst = *(uint32_t *)(pArp->Tpa); ++ ++ eu_dbg (DBG_ROUTEIP,"ARP Src IP: "); ++ eu_dbg (DBG_ROUTEIP,"%d.%d.%d.%d", pArp->Spa[0], pArp->Spa[1], pArp->Spa[2], pArp->Spa[3]); ++ eu_dbg (DBG_ROUTEIP," Dst IP: "); ++ eu_dbg (DBG_ROUTEIP,"%d.%d.%d.%d", pArp->Tpa[0], pArp->Tpa[1], pArp->Tpa[2], pArp->Tpa[3]); ++ eu_dbg (DBG_ROUTEIP,"\nARP IPs, UInt32 versions - Src: %x, Dst: %x\n", ip_src, ip_dst); ++ ++ /* ++ * Gratuitous RAP request : do not reply ++ */ ++ if ( ( ip_src == ip_dst ) || ( ip_src == 0x0000 ) ) ++ { ++ eu_dbg (DBG_ROUTEIP,"Gratuitous ARP, no reply generated.\n"); ++ ++ goto EthArpReplyExit; ++ } ++ ++ /* ++ * Build our ARP reply ++ */ ++ pArp->Op = ARP_OP_REPLY; ++ ++ ++ /* ++ * Swap source and dest IP addresses ++ */ ++ *(uint32_t *)pArp->Spa = ip_dst; ++ *(uint32_t *)pArp->Tpa = ip_src; ++ ++ /* ++ * Set the dest hardware address to the original source address ++ */ ++ memcpy ( pArp->Tha, pArp->Sha, MAC_SIZE ); ++ ++ /* ++ * Set source hardware address to the original dest IP address ++ */ ++ ++ *(uint32_t *)(pArp->Sha+2) = ip_dst; ++ ++ /* ++ * Do the same in the ethernet header ++ */ ++ memcpy ( reply_hdr->h_dest, reply_hdr->h_source, ETH_ALEN ); ++ ++ *(uint32_t *) (reply_hdr->h_source+2) = ip_dst; ++ ++ /* ++ * The packet is ready ... set the flag and tell OT ++ */ ++ ins->FakePacketSize = PacketSize; ++ ins->FakePacketReady = TRUE; ++ ++ ++ if ( !(skb = dev_alloc_skb(ETH_DATA_LEN+14+2)) ) ++ { ++ eu_dbg (DBG_ROUTEIP,"Error allocating skb!\n"); ++ ++ goto EthArpReplyExit; ++ } ++ skb->dev = ins->eth; ++ eu_dbg (DBG_ROUTEIP,"EthernetArpReply: ROUTED : CALLING eth_copy_and_sum\n"); ++ ++ ++ eth_copy_and_sum(skb, ins->pPacket, PacketSize + 2 , 0); ++ ++ skb_put(skb, PacketSize + 2); ++ skb->protocol = eth_type_trans(skb, ins->eth); ++ netif_rx(skb); ++ ++ ++ EthArpReplyExit: ++ eu_leaves (DBG_ROUTEIP); ++ ++} ++#endif /* 0 */ ++ ++void EthernetArpReply(eu_instance_t *ins, UInt8 *pBuf, UInt32 PacketSize) ++{ ++ struct ethhdr *req_hdr; ++ struct ethhdr *reply_hdr; ++ ARP_PACKET *pArp; ++ uint32_t ip_src, ip_dst; ++ struct sk_buff *skb; ++ ++ eu_enters (DBG_ROUTEIP); ++ ++ ++ req_hdr = (struct ethhdr *)pBuf; ++ ++ ++ pArp = (ARP_PACKET *)(pBuf + sizeof(struct ethhdr)); ++ ip_src = *(uint32_t *)(pArp->Spa); ++ ip_dst = *(uint32_t *)(pArp->Tpa); ++ ++ eu_dbg (DBG_ROUTEIP,"ARP Src IP: "); ++ eu_dbg (DBG_ROUTEIP,"%d.%d.%d.%d", pArp->Spa[0], pArp->Spa[1], pArp->Spa[2], pArp->Spa[3]); ++ eu_dbg (DBG_ROUTEIP," Dst IP: "); ++ eu_dbg (DBG_ROUTEIP,"%d.%d.%d.%d", pArp->Tpa[0], pArp->Tpa[1], pArp->Tpa[2], pArp->Tpa[3]); ++ eu_dbg (DBG_ROUTEIP,"\nARP IPs, UInt32 versions - Src: %x, Dst: %x\n", ip_src, ip_dst); ++ ++ /* ++ * Gratuitous RAP request : do not reply ++ */ ++ if ( ( ip_src == ip_dst ) || ( ip_src == 0x0000 ) ) ++ { ++ eu_dbg (DBG_ROUTEIP,"Gratuitous ARP, no reply generated.\n"); ++ ++ goto EthArpReplyExit; ++ } ++ ++ if ( !(skb = dev_alloc_skb(ETH_DATA_LEN+14+2)) ) ++ { ++ eu_dbg (DBG_ROUTEIP,"Error allocating skb!\n"); ++ ++ goto EthArpReplyExit; ++ } ++ skb->dev = ins->eth; ++ ++ pArp = (ARP_PACKET *)(skb->data + sizeof(struct ethhdr)); ++ ++ memcpy ( skb->data, pBuf, PacketSize ); ++ reply_hdr = (struct ethhdr *)skb->data ; ++ ++ /* ++ * Build our ARP reply ++ */ ++ pArp->Op = ARP_OP_REPLY; ++ ++ ++ /* ++ * Swap source and dest IP addresses ++ */ ++ *(uint32_t *)pArp->Spa = ip_dst; ++ *(uint32_t *)pArp->Tpa = ip_src; ++ ++ /* ++ * Set the dest hardware address to the original source address ++ */ ++ memcpy ( pArp->Tha, pArp->Sha, MAC_SIZE ); ++ ++ /* ++ * Set source hardware address to the original dest IP address ++ */ ++ ++ *(uint32_t *)(pArp->Sha+2) = ip_dst; ++ ++ /* ++ * Do the same in the ethernet header ++ */ ++ memcpy ( reply_hdr->h_dest, reply_hdr->h_source, ETH_ALEN ); ++ ++ *(uint32_t *) (reply_hdr->h_source+2) = ip_dst; ++ ++ eu_dbg (DBG_ROUTEIP,"EthernetArpReply: ROUTED : CALLING eth_copy_and_sum\n"); ++ ++ skb_put(skb, PacketSize + 2); ++ skb->protocol = eth_type_trans(skb, ins->eth); ++ netif_rx(skb); ++ ++ ++ EthArpReplyExit: ++ eu_leaves (DBG_ROUTEIP); ++ ++} +diff -urN x/drivers/usb/misc/eagle-usb/Mpoa.h y/drivers/usb/misc/eagle-usb/Mpoa.h +--- x/drivers/usb/misc/eagle-usb/Mpoa.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/Mpoa.h 2004-02-07 09:01:34.000000000 +1100 +@@ -0,0 +1,37 @@ ++/*************************************************************************************/ ++/* */ ++/* Mpoa.h */ ++/* */ ++/* Helper functions for encapsulated protocols. */ ++/* */ ++/* This file is part of the "ADI USB ADSL Driver for Linux". */ ++/* */ ++/* "ADI USB ADSL Driver for Linux" is free software; you can redistribute it */ ++/* and/or modify it under the terms of the GNU General Public License as */ ++/* published by the Free Software Foundation; either version 2 of the License, */ ++/* or (at your option) any later version. */ ++/* */ ++/* "ADI USB ADSL Driver for Linux" is distributed in the hope that it will be */ ++/* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of */ ++/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ ++/* GNU General Public License for more details. */ ++/* */ ++/* You should have received a copy of the GNU General Public License */ ++/* along with "ADI USB ADSL Driver for Linux"; if not, write to the Free Software */ ++/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ ++/*************************************************************************************/ ++ ++#ifndef __ADIMPOA_H__ ++#define __ADIMPOA_H__ ++ ++#include "eagle-usb.h" ++ ++extern void MpoaInitialize(eu_instance_t *ins, const eu_options_t opt); ++extern unsigned int MpoaProcessReceivedPdu ( ++ eu_instance_t *ins, ++ struct sk_buff *skb, ++ uint32_t *encaps_skip_size ++ ); ++extern void EthernetArpReply(eu_instance_t *ins, UInt8 *pBuf, UInt32 PacketSize); ++ ++#endif +diff -urN x/drivers/usb/misc/eagle-usb/Oam.c y/drivers/usb/misc/eagle-usb/Oam.c +--- x/drivers/usb/misc/eagle-usb/Oam.c 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/Oam.c 2004-06-05 04:56:19.000000000 +1000 +@@ -0,0 +1,798 @@ ++ ++/* $Id: Oam.c,v 1.3 2004/06/04 18:56:19 sleeper Exp $ */ ++ ++//--------------------------------------------------------------------------- ++// ++// Copyright (c) 2002, Analog Devices Inc., All Rights Reserved ++// ++// Oam.c ++// ++// Operations And Maintenance ATM support module ++// ++// Some abbreviations ... ++// ++// CC = Continuity Check ++// AIS = Alarm Indication Signal ++// RDI = Remote Defect Indication ++// ++//--------------------------------------------------------------------------- ++ ++#include "Adiutil.h" ++#include "eagle-usb.h" ++#include "Oam.h" ++#include "Sar.h" ++#include "macros.h" ++#include "eu_sm.h" ++#include "debug.h" ++ ++//--------------------------------------------------------------------------- ++// Some sample OAM cells from Dennis Chan ... ++//--------------------------------------------------------------------------- ++ ++// OAM F5 E2E cell: ++// 00 00 03 2A 00 18 01 00 00 00 01 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 6A 6A 6A 6A 6A 6A 6A 6A 03 93 ++// ++// OAM F5 Segment cell: ++// 00 00 03 28 00 18 01 00 00 00 02 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 6A 6A 6A 6A 6A 6A 6A 6A 01 23 ++// ++// OAM F4 E2E cell: ++// 00 00 00 40 00 18 01 00 00 00 03 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 6A 6A 6A 6A 6A 6A 6A 6A 00 B3 ++// ++// OAM F4 Segment cell: ++// 00 00 00 30 00 18 01 00 00 00 04 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 6A 6A 6A 6A 6A 6A 6A 6A 02 70 ++// ++// UInt8 OAM01[ATM_CELL_SIZE] = { ++// 0x00, 0x00, 0x03, 0x2A, 0x00, ++// 0x18, 0x01, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, ++// 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, ++// 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, ++// 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, ++// 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6A, 0x6A, ++// 0x6A, 0x6A, 0x6A, 0x6A, 0x6A, 0x6A, 0x00, 0x00 }; ++ ++//--------------------------------------------------------------------------- ++// Local function prototypes ++//--------------------------------------------------------------------------- ++ ++Boolean CheckForAndProcessOAMCell(eu_instance_t *ins, UInt8 *pCell); ++static Boolean CheckForAndProcessOAMCCChange(eu_instance_t *ins, UInt8 *pCell); ++static Boolean CheckForAndProcessOAMResponse(eu_instance_t *ins, UInt8 *pCell, UInt32 CellType); ++//static Boolean CheckForAndProcessOAMCC(eu_instance_t *ins, UInt8 *pCell); ++static UInt16 ByteCalcCRC10(UInt8 *pData, UInt32 Size); ++static void USBSendAmoeba(eu_instance_t *ins, UInt8 *pCell, Boolean MoreThanOneCell); ++#ifdef LINUX_2_4 ++static void AmoebaCompletion(struct urb *urb); ++ ++#else ++static void AmoebaCompletion(struct urb *urb, struct pt_regs *regs ); ++#endif ++static void ArmOAMTimer(eu_instance_t *ins); ++int SetOAMTimerInterval(eu_instance_t* ins, int reqDelay); ++void StopOAMTimer(eu_instance_t *ins); ++ ++// Add queuing feature for USBBulkWrite - Shahriar ++// Tag : QUEUE ++void WriteToUSB (void); ++ ++//--------------------------------------------------------------------------- ++// CheckForAndProcessOAMCell ++// ++// If the provided data is an OAM cell, process the cell appropriately and ++// returns TRUE. Otherwise, returns FALSE. ++// ++// Much of the logic is modeled after the Windows driver OAM.c code. ++//--------------------------------------------------------------------------- ++ ++Boolean CheckForAndProcessOAMCell(eu_instance_t *ins, UInt8 *pCell) ++{ ++ UInt32 OAMType = OAM_NONE; ++ UInt32 PTI, VPI, VCI, VpiVci,CellHeader; ++ ++ eu_enters (DBG_OAM); ++ ++ CellHeader = be32_to_cpu(*((UInt32 *)pCell)); // FFD102902 ++ VpiVci = (CellHeader >> 4) & ATM_CELL_REMOVE_GFC_MASK; // FFD102902 ++ ++ PTI = (pCell[ATM_CELL_HEADER_PT_OFFSET] & 0x0E) >> 1; ++ VPI = (VpiVci & 0x00FF0000) >> 16; ++ VCI = (VpiVci & 0x0000FFFF); ++ ++ eu_dbg (DBG_OAM,"OAM cell: VPI=%#X, VCI=%#X, PTI=%#X\n", VPI, VCI, PTI); ++ ++ ++// was : FFD102902 ++ // Check for F5 segment cell ++ if ( (PTI == 0x04) && ++ (VCI != 0x00) && (VCI != 0x03) && ++ (VCI != 0x04) && (VCI != 0x06) && (VCI != 0x07) ) ++ { ++ eu_dbg (DBG_OAM,"OAM F5 segment cell received.\n"); ++ ++ OAMType = OAM_F5_SEGMENT; ++ /*************************/ ++ // this is the place I test the timer FFDFFD ++ // ArmOAMTimer(ins); ++ /**************************/ ++ } ++ ++ // Check for F5 end-to-end cell ++ if ( (PTI == 0x05) && ++ (VCI != 0x00) && (VCI != 0x03) && ++ (VCI != 0x04) && (VCI != 0x06) && (VCI != 0x07) ) ++ { ++ eu_dbg (DBG_OAM,"OAM F5 end-to-end cell received.\n"); ++ ++ OAMType = OAM_F5_ENDTOEND; ++ } ++ ++ // Check for F4 segment cell ++ if (VCI == 0x03) ++ { ++ eu_dbg (DBG_OAM,"OAM F4 segment cell received.\n"); ++ ++ OAMType = OAM_F4_SEGMENT; ++ } ++ ++ // And finally, check for F4 end-to-end cell ++ if (VCI == 0x04) ++ { ++ eu_dbg (DBG_OAM,"OAM F4 end-to-end cell received.\n"); ++ ++ OAMType = OAM_F4_ENDTOEND; ++ } ++ ++// END FFD102902 ++ ++ // If this is not an OAM cell, we're done ++ if (OAMType == OAM_NONE) ++ goto OAM_Done; ++ ++ eu_dbg (DBG_OAM,"OAM cell: VPI=%#X, VCI=%#X, PTI=%#X\n", VPI, VCI, PTI); ++ ++ ++ // Check for and process CC activate and deactivate ++ if (!CheckForAndProcessOAMCCChange(ins, pCell)) ++ { ++ // This is not a CC activate or deactivate cell, see if this is ++ // an OAM cell that needs a response (loopback, AIS, RDI) ++ if (!CheckForAndProcessOAMResponse(ins, pCell, OAMType)) ++ { ++ /* FFD : Shahriar suggestion: removed ..... ++ // This is not a cell that needed a response, so its either ++ // a CC cell or a response to a loopback request that originated ++ // with us (which currently is not possible). ++ if (!CheckForAndProcessOAMCC(ins, pCell)) ++ { ++ // Must be a loopback response ... should never get them ++ // because we currently provide no mechanism for requesting! ++ ZAP(DEBUG_OAM, DEBUG_ATTN, (kTAB"OAM loopback indicator = 0!\n")); ++ } ++ */ ++ } ++ } ++ ++OAM_Done: ++ eu_leaves (DBG_OAM); ++ memcpy(ins->pOAMCell,pCell,ATM_CELL_SIZE); // ffd nov26 DC : now we use pOAMCell ++ memcpy(ins->OAMCellHeader,pCell,ATM_CELL_HEADER_SIZE); ++ ++ if (OAMType == OAM_NONE) ++ return FALSE; ++ else ++ return TRUE; ++} ++ ++ ++//--------------------------------------------------------------------------- ++// CheckForAndProcessOAMCCChange ++//--------------------------------------------------------------------------- ++ ++static Boolean CheckForAndProcessOAMCCChange(eu_instance_t *ins, UInt8 *pCell) ++{ ++ Boolean Retval = FALSE; ++ eu_enters (DBG_OAM); ++ ++ if (pCell[OAM_TYPE_AND_FN] == OAM_ACTIVATION_CC) ++ { ++ Retval = TRUE; ++ ++ switch (pCell[OAM_MSGID_AND_DIR] & OAM_MASK_MSGID) ++ { ++ // As far as I know, we should only receive requests. The ++ // confirm and denied messages only go to those endpoints ++ // who actually originate CC activation changes - we don't. ++ case OAM_ACTIVATE_REQUEST: ++ { ++ UInt8 OAM_Dir; ++ ++ eu_dbg (DBG_OAM,"OAM CC activate request\n"); ++ ++ ++ OAM_Dir = pCell[OAM_MSGID_AND_DIR] & OAM_MASK_DIR; ++ if (OAM_Dir & OAM_MASK_DIR_AB) ++ { ++ eu_dbg (DBG_OAM,"AB direction.\n"); ++ ++ ins->OAMState_SendingCC = TRUE; ++ ++ } ++ ++ if (OAM_Dir & OAM_MASK_DIR_BA) ++ { ++ eu_dbg (DBG_OAM,"BA direction.\n"); ++ ++ ins->OAMState_ReceiveCC = TRUE; ++ } ++ ++ // If OAM_Dir is non-zero, then it is valid ++ if (OAM_Dir) ++ { ++ eu_dbg (DBG_OAM,"Preparing and sending OAM CC activate confirm.\n"); ++ ++ // We have no real use for this cell after we're done ++ // here, so we'll just modify it in place and use it to send ++ // back the activate confirmation. Much of the cell format is ++ // the same as the request cell, so we don't have to change much. ++ pCell[OAM_MSGID_AND_DIR] = OAM_Dir | OAM_ACTIVATE_CONFIRMED; ++ ++ // Store a copy of the cell's header for later use ++ memcpy( ins->OAMCellHeader,pCell, ATM_CELL_HEADER_SIZE); ++ ++ CALC_AND_STORE_CRC10(pCell); ++ ++ USBSendAmoeba(ins, pCell, FALSE); ++ ++ // We need to be timing the time between receives or sends ++ // of CC cells, so start the timer if its not already ticking. ++ if (ins->OAMState_TimerOn == FALSE) ++ { ++ ArmOAMTimer(ins); ++ } ++ } ++ else ++ { ++ eu_err ( "CC activation with no direction.\n" ); ++ ++ } ++ } break; ++ ++ case OAM_DEACTIVATE_REQUEST: ++ { ++ UInt8 OAM_Dir; ++ ++ eu_dbg (DBG_OAM,"OAM CC deactivate request.\n"); ++ ++ ++ OAM_Dir = pCell[OAM_MSGID_AND_DIR] & OAM_MASK_DIR; ++ if (OAM_Dir & OAM_MASK_DIR_AB) ++ { ++ eu_dbg (DBG_OAM,"AB direction.\n"); ++ ++ ins->OAMState_SendingCC = FALSE; ++ } ++ ++ if (OAM_Dir & OAM_MASK_DIR_BA) ++ { ++ eu_dbg (DBG_OAM,"BA direction.\n"); ++ ++ ins->OAMState_ReceiveCC = FALSE; ++ // When BA direction is deactivated, AIS state needs cleared ++ ins->OAMState_AIS = FALSE; ++ // Reset our received CC cell counter ++ ins->OAMState_CCSink = 0; ++ } ++ ++ if (OAM_Dir) ++ { ++ eu_dbg (DBG_OAM,"Preparing and sending OAM CC deactivate confirm.\n"); ++ ++ ++ // If sending and receiving are now deactivated and the timer ++ // is currently running, shut it off. ++ if ((ins->OAMState_TimerOn == TRUE) && ++ (ins->OAMState_SendingCC == FALSE) && ++ (ins->OAMState_ReceiveCC == FALSE)) ++ { ++ StopOAMTimer(ins); ++ } ++ ++ // We have no real use for this cell after we're done ++ // here, so we'll just modify it in place and use it to send ++ // back the activate confirmation. Much of the cell format is ++ // the same as the request cell, so we don't have to change much. ++ pCell[OAM_MSGID_AND_DIR] = OAM_Dir | OAM_DEACTIVATE_CONFIRMED; ++ ++ CALC_AND_STORE_CRC10(pCell); ++ ++ USBSendAmoeba(ins, pCell, FALSE); ++ } ++ else ++ { ++ eu_err ("CC deactivation with no direction.\n"); ++ ++ } ++ ++ } break; ++ ++ case OAM_ACTIVATE_CONFIRMED: ++ case OAM_ACTIVATE_REQUEST_DENIED: ++ case OAM_DEACTIVATE_CONFIRMED: ++ case OAM_DEACTIVATE_REQUEST_DENIED: ++ { ++ eu_dbg (DBG_OAM,"Warning - OAM activation change response received.\n"); ++ ++ goto CCChange_Done; ++ } break; ++ } ++ } ++ ++CCChange_Done: ++ eu_leaves (DBG_OAM); ++ return Retval; ++} ++ ++ ++//--------------------------------------------------------------------------- ++// CheckForAndProcessOAMResponse ++// ++// Loopback, AIS, and RDI OAM F5 cells need to have a response sent back. ++//--------------------------------------------------------------------------- ++ ++static Boolean CheckForAndProcessOAMResponse(eu_instance_t *ins, UInt8 *pCell, UInt32 CellType) ++{ ++ Boolean Retval = FALSE; ++ eu_enters (DBG_OAM); ++ ++ // First, make sure the cell type is F5 (segment or end-to-end), as thats ++ // a requirement for all of these OAM types. ++// To enable F4 reply - Shahriar ++// Tag : ECIOAMCC ++/* ++ if ((CellType != OAM_F5_SEGMENT) && ++ (CellType != OAM_F5_ENDTOEND)) ++ { ++ ZAP(DEBUG_OAM, DEBUG_INFO, (kTAB"Not an F5 cell.\n")); ++ goto Response_Done; ++ } ++*/ ++ ++ switch (pCell[OAM_TYPE_AND_FN]) ++ { ++ case OAM_LOOPBACK: ++ { ++ if (pCell[OAM_LOOPBACK_INDICATOR] & OAM_LOOPBACK_REPLY_MASK) ++ { ++ eu_dbg (DBG_OAM,"Loopback reply request received.\n"); ++ ++ ++ // Mark this cell as a loopback response ++ pCell[OAM_LOOPBACK_INDICATOR] = 0; ++ ++ // Tell lower code to send response cell ++ Retval = TRUE; ++ } ++ else ++ { ++ // We should never get here, 'cause we have no current mechanism ++ // for originating a loopback reply request. ++ eu_dbg (DBG_OAM,"Loopback reply received.\n"); ++ ++ } ++ } break; ++ ++ case OAM_AIS: ++ { ++ eu_dbg (DBG_OAM,"AIS received.\n"); ++ ++ ++ // Per ADI Windows code, ASI gets an RDI response ++ pCell[OAM_TYPE_AND_FN] = OAM_RDI; ++ ++ // Tell lower code to send response cell ++ Retval = TRUE; ++ } break; ++ ++ case OAM_RDI: ++ { ++ // Per ADI Windows code, RDI gets a CC response ++ pCell[OAM_TYPE_AND_FN] = OAM_CC; ++ ++ // Tell lower code to send response cell ++ Retval = TRUE; ++ } break; ++ ++ // To enable CC reply - Shahriar ++ // Tag : ECIOAMCC ++ ////////////////// ++ case OAM_CC: ++ { ++ eu_dbg (DBG_OAM,"CC received.\n"); ++ ++ // Improve OAM CC - Shahriar ++ // Tag: OAMCC ++ //////////////// ++ if ( ins->OAMState_ReceiveCC == TRUE ) ++ { ++ ins->OAMState_CCSink = 0; ++ } ++ else ++ { ++ // Per ADI Windows code, CC gets an CC response ++ pCell[OAM_TYPE_AND_FN] = OAM_CC; ++ ++ // Tell lower code to send response cell ++ Retval = TRUE; ++ } ++ //////////////// ++ } break; ++ ++ default: ++ { ++ } break; ++ ////////////////// ++ } ++ ++ // This will be TRUE if a cell needs to be sent ++ if (Retval == TRUE) ++ { ++ CALC_AND_STORE_CRC10(pCell); ++ USBSendAmoeba(ins, pCell, FALSE); ++ ++ //pCell[OAM_LOOPBACK_INDICATOR] = 1; ++ //USBSendAmoeba(ins, pCell, FALSE); // extra ffdffdffd========================================= ++ ++ } ++ ++// Response_Done: ++ eu_leaves (DBG_OAM); ++ return Retval; ++} ++ ++ ++//--------------------------------------------------------------------------- ++// CheckForAndProcessOAMCC ++//--------------------------------------------------------------------------- ++/* ++static Boolean CheckForAndProcessOAMCC(eu_instance_t *ins, UInt8 *pCell) ++{ ++ Boolean Retval = FALSE; ++ eu_enters (DBG_OAM); ++ ++ if (pCell[OAM_TYPE_AND_FN] == OAM_CC) ++ { ++ ZAP(DEBUG_OAM, DEBUG_INFO, (kTAB"CC received.\n")); ++ ++ // Reset CC receive timeout counter (counts seconds between CC cells) ++ ins->OAMState_CCSink = 0; ++ ++ // Clear AIS state ++ ins->OAMState_AIS = FALSE; ++ ++ Retval = TRUE; ++ } ++ ++ eu_leaves (DBG_OAM); ++ return Retval; ++} ++*/ ++//--------------------------------------------------------------------------- ++// ByteCalcCRC10 ++// ++// Taken pretty much verbatim from ADI Windows driver source ++//--------------------------------------------------------------------------- ++ ++#define POLYNOMIAL 0x633 ++ ++static UInt16 ByteCalcCRC10(UInt8 *pData, UInt32 Size) ++{ ++ UInt32 i; ++ UInt16 crc10_accum = 0; ++ static Boolean AlreadyDone = FALSE; ++ static UInt16 byte_crc10_table[256]; ++ ++ // Generate byte values for use, needs to be done once ++ if (!AlreadyDone) ++ { ++ UInt32 k, j; ++ UInt16 Gen_crc10_accum; ++ ++ for (k = 0; k < 256; k++) ++ { ++ Gen_crc10_accum = ((UInt16) k << 2); ++ for (j = 0; j < 8; j++) ++ { ++ if ((Gen_crc10_accum <<= 1) & 0x400) ++ Gen_crc10_accum ^= POLYNOMIAL; ++ } ++ byte_crc10_table[k] = Gen_crc10_accum; ++ } ++ ++ AlreadyDone = TRUE; ++ } ++ ++ for (i = 0; i < Size; i++) ++ { ++ crc10_accum = ((crc10_accum << 8) & 0x3ff) ^ byte_crc10_table[( crc10_accum >> 2) & 0xff] ++ ^ *pData++; ++ } ++ ++ return crc10_accum; ++} ++ ++//--------------------------------------------------------------------------- ++// USBSendAmoeba ++// ++// An amoeba is a single-celled organism. We're sending a single ATM cell :) ++// One potential problem is the fact that we're using a single PB for all ++// OAM related sends. If there is ever a time where we need to send a new ++// cell and the previous write has not completed, I don't know what will happen. ++// However, it seems that the likelihood of that happening are virtually nil. ++//--------------------------------------------------------------------------- ++ ++// FFDTEST TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT ++static void USBSendAmoeba(eu_instance_t *ins, UInt8 *pCell, Boolean MoreThanOneCell) ++{ ++ ++ int result; ++ int cntr; ++ UInt32 uiTotalBytes = 0; ++ UInt8 MyCell[ATM_CELL_SIZE*2]; ++ ++ eu_enters (DBG_OAM); ++ eu_dbg (DBG_OAM,"******* FFD >>>> ins = 0x%x\n", (unsigned int)ins); ++ ++ if ( MoreThanOneCell == TRUE ) ++ uiTotalBytes = ATM_CELL_SIZE*2; ++ else ++ uiTotalBytes = ATM_CELL_SIZE; ++ ++ memcpy(MyCell,pCell,uiTotalBytes); ++ ++ for (cntr=0;cntrurb_oam_write, ins->usbdev, ++ ins->pipe_bulk_data_out, ++ pCell,uiTotalBytes , AmoebaCompletion, ins); ++ ++ result = USB_SUBMIT_URB ( ins->urb_oam_write , GFP_ATOMIC ); ++ ++ eu_dbg (DBG_OAM,"usb_submit_urb result=%d \n",result); ++ eu_leaves (DBG_OAM); ++ ++ ++} ++ ++//--------------------------------------------------------------------------- ++// AmoebaCompletion ++//--------------------------------------------------------------------------- ++#ifdef LINUX_2_4 ++static void AmoebaCompletion(struct urb *urb) ++#else ++static void AmoebaCompletion(struct urb *urb, struct pt_regs *regs ) ++#endif ++{ ++ ++ eu_instance_t *ins = (eu_instance_t *) urb->context; ++// struct net_device *ether; ++ ++ ++ eu_enters (DBG_OAM); ++ ++ if ((ins == NULL) || ( !EU_TEST_FLAG(ins, EU_OPEN ) ) ) ++ { ++ eu_err("NULL urb->context or Open=FALSE in AmoebaCompletion!\n"); ++ goto WriteCompletion_exit; ++ } ++/*************************************************************************************** ++ ether = ins->eth; ++ ++ if (!netif_device_present(ether)) ++ { ++ ZAP(DEBUG_OAM, DEBUG_ERRORS, (kTAB"Network interface no longer present!\n")); ++ goto WriteCompletion_exit; ++ } ++ ++ if (urb->status) ++ ZAP(DEBUG_OAM, DEBUG_ERRORS, (kTAB"urb has status of %x\n", urb->status)); ++ ++ ether->trans_start = jiffies; ++ netif_wake_queue(ether); ++***************************************************************************************/ ++ ++WriteCompletion_exit: ++ eu_leaves (DBG_OAM); ++ ++} ++// END FFDTEST ------------------------------------------------------------------------ ++ ++ ++ ++//--------------------------------------------------------------------------- ++// ArmOAMTimer ++//--------------------------------------------------------------------------- ++ ++static void ArmOAMTimer(eu_instance_t *ins) ++{ ++ eu_enters (DBG_OAM); ++ ins->OAMState_TimerOn = TRUE; ++ SetOAMTimerInterval(ins,OAM_TIMER_VALUE); ++ eu_leaves (DBG_OAM); ++} ++ ++//--------------------------------------------------------------------------- ++// StopOAMTimer ++//--------------------------------------------------------------------------- ++ ++void StopOAMTimer(eu_instance_t *ins) ++{ ++ ++ eu_enters (DBG_OAM); ++ ++ ins->OAMState_TimerOn = FALSE; ++ ++ del_timer(&ins->OAMTimer); ++ ++ eu_leaves (DBG_OAM); ++} ++ ++//--------------------------------------------------------------------------- ++// OAMTimer ++// ++// Called every 1 second. ++//--------------------------------------------------------------------------- ++ ++void OAMTimerFunction(unsigned long ptr) ++{ ++ eu_instance_t *ins = (eu_instance_t *)ptr; ++ ++ UInt8 *pCell; ++ ++ eu_enters (DBG_OAM); ++ ++ ++ if (!(ins->AdiModemSm.CurrentAdiState & STATE_OPERATIONAL)) ++ { ++ eu_dbg (DBG_OAM," ***FFD*** Called while not at OPER state.\n"); ++ ++ goto OAMTimer_Done; ++ } ++ ++ //pCell = (UInt8 *)&ins->OAMCell; ++ pCell = (UInt8 *)ins->pOAMCell; ++ ++ ++// TESTTESETESTTESTTESTESTTESTTESETESTTESTTESTESTTESTTESETESTTESTTESTESTTESTTESETESTTESTTESTEST ++/***************************** I send a dummy OAM here ..... ++ if (true) ++ { ++ ZAP(DEBUG_OAM, DEBUG_INFO, (kTAB"====>>>>>FFD>>>>>>>>>>>>>>>> Sending an OAM CELL TEST TEST...\n")); ++ //COPY_MEM(ins->OAMCell, pCell, ATM_CELL_SIZE); ++ //pCell[OAM_TYPE_AND_FN] = OAM_CC; ++ pCell[OAM_LOOPBACK_INDICATOR]=1; ++ CALC_AND_STORE_CRC10(pCell); ++ // if (ins->OAMState_ReceiveCC == FALSE) ++ USBSendAmoeba(ins, pCell, FALSE); ++ } ++*****************************************************************************************/ ++// TESTTESETESTTESTTESTESTTESTTESETESTTESTTESTESTTESTTESETESTTESTTESTESTTESTTESETESTTESTTESTEST ++ ++ // If CC sending is enabled, then we need to send a CC ++ if (ins->OAMState_SendingCC == TRUE) ++ { ++ eu_dbg (DBG_OAM,"====>>>>> Sending CC...\n"); ++ ++ ++ // FFD - DC bug with a ? ++ memcpy( pCell, ins->OAMCellHeader, ATM_CELL_HEADER_SIZE); ++ ++ pCell[OAM_TYPE_AND_FN] = OAM_CC; ++ ++ CALC_AND_STORE_CRC10(pCell); ++ ++ // Improve OAM CC - Shahriar ++ // Tag: OAMCC ++ if (ins->OAMState_ReceiveCC == FALSE) ++ USBSendAmoeba(ins, pCell, FALSE); ++ } ++ ++ // If CC receive is enabled, inc counter and send RDI if necessary ++ if (ins->OAMState_ReceiveCC == TRUE) ++ { ++ if (++ins->OAMState_CCSink > 4) ++ { ++ eu_dbg (DBG_OAM,"Sending RDI...\n"); ++ ++ // Turn on AIS state ++ ins->OAMState_AIS = TRUE; ++ ++ // Keep our sink timer counter from rolling over ++ ins->OAMState_CCSink = 5; ++ ++ // Improve OAM CC - Shahriar //////////////////////////////////// ++ // Tag: OAMCC ++ // was : ++ // COPY_MEM(ins->OAMCellHeader, pCell, ATM_CELL_HEADER_SIZE); ++ ++ // pCell[OAM_TYPE_AND_FN] = OAM_RDI; ++ ++ // CALC_AND_STORE_CRC10(pCell); ++ ++ // USBSendAmoeba(ins, pCell); ++ // ++ ////////////////////////////////////////////////////////////////// ++ if (ins->OAMState_SendingCC == TRUE) ++ { ++ memcpy( (pCell + ATM_CELL_SIZE),ins->OAMCellHeader, ATM_CELL_HEADER_SIZE); ++ ++ pCell [ATM_CELL_SIZE + OAM_TYPE_AND_FN] = OAM_RDI; ++ ++ CALC_AND_STORE_CRC10((pCell + ATM_CELL_SIZE)); ++ USBSendAmoeba(ins, pCell, TRUE); ++ ++ } ++ else ++ { ++ memcpy( pCell,ins->OAMCellHeader, ATM_CELL_HEADER_SIZE); ++ ++ pCell[OAM_TYPE_AND_FN] = OAM_RDI; ++ ++ CALC_AND_STORE_CRC10(pCell); ++ ++ USBSendAmoeba(ins, pCell, FALSE); ++ } ++ ////////////////// ++ } ++ // Improve OAM CC - Shahriar ++ // Tag: OAMCC ++ //////////////// ++ else ++ { ++ if (ins->OAMState_SendingCC == TRUE) ++ { ++ USBSendAmoeba(ins, pCell, FALSE); ++ } ++ } ++ //////////////// ++ } ++ else ++ { ++ // Improve OAM CC - Shahriar ++ // Tag: OAMCC ++// // Request from ECI for CC - Shahriar ++// // Tag : ECICC ++// if (++ins->OAMState_CCSink > 4) ++// { ++// ins->OAMState_ReceiveCC = TRUE; ++// } ++ } ++ ++OAMTimer_Done: ++ // Need to reschedule the timer to go again ++ ArmOAMTimer(ins); ++ ++ eu_leaves (DBG_OAM); ++} ++ ++ ++int SetOAMTimerInterval(eu_instance_t* ins, int reqDelay) ++{ ++ ++ eu_enters (DBG_OAM); ++ eu_dbg (DBG_OAM,"Requested delay = %d\n",reqDelay); ++ ++ /*If the timer is currently running, delete it*/ ++ if ( timer_pending(&ins->OAMTimer) ) ++ del_timer(&ins->OAMTimer); ++ ++ ins->OAMTimer.expires = jiffies + MSEC_TO_JIFFIES(reqDelay); // ffdfix: Nov25, 2002 ++ ++ ++ add_timer(&ins->OAMTimer); ++ ++ eu_leaves (DBG_OAM); ++ return 0; ++} +diff -urN x/drivers/usb/misc/eagle-usb/Oam.h y/drivers/usb/misc/eagle-usb/Oam.h +--- x/drivers/usb/misc/eagle-usb/Oam.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/Oam.h 2004-02-07 09:01:34.000000000 +1100 +@@ -0,0 +1,93 @@ ++ ++/* $Id: Oam.h,v 1.1 2004/02/06 22:01:34 sleeper Exp $ */ ++ ++//--------------------------------------------------------------------------- ++// ++// Copyright (c) 2002, Analog Devices Inc., All Rights Reserved ++// ++// Oam.h ++// ++// Operations And Maintenance ATM support module ++// ++//--------------------------------------------------------------------------- ++ ++void OAMTimerFunction(unsigned long ptr); ++ ++// Offsets into cell ++#define OAM_TYPE_AND_FN (ATM_CELL_HEADER_SIZE+0) ++#define OAM_MSGID_AND_DIR (OAM_TYPE_AND_FN+1) ++#define OAM_LOOPBACK_INDICATOR (OAM_TYPE_AND_FN+1) ++#define OAM_CRC10_0 (ATM_CELL_SIZE-2) ++#define OAM_CRC10_1 (ATM_CELL_SIZE-1) ++#define OAM_FIRST_UNUSED_BYTE (OAM_TYPE_AND_FN+1) ++#define OAM_LAST_UNUSED_BYTE (ATM_CELL_SIZE-3) ++ ++// Function and type definitions ++#define OAM_ACTIVATION_CC 0x81 ++#define OAM_LOOPBACK 0x18 ++#define OAM_AIS 0x10 ++#define OAM_RDI 0x11 ++#define OAM_CC 0x14 ++ ++// Masks / values for various fields ++#define OAM_MASK_MSGID 0xFC ++#define OAM_MASK_DIR 0x03 ++#define OAM_MASK_DIR_AB 0x01 ++#define OAM_MASK_DIR_BA 0x02 ++#define OAM_LOOPBACK_REPLY_MASK 0x01 ++#define OAM_ACTIVATE_REQUEST 0x04 ++#define OAM_ACTIVATE_CONFIRMED 0x08 ++#define OAM_ACTIVATE_REQUEST_DENIED 0x0C ++#define OAM_DEACTIVATE_REQUEST 0x14 ++#define OAM_DEACTIVATE_CONFIRMED 0x18 ++#define OAM_DEACTIVATE_REQUEST_DENIED 0x1C ++ ++// OAM cell types ++#define OAM_NONE 0x00 ++#define OAM_F4_SEGMENT 0x01 ++#define OAM_F4_ENDTOEND 0x02 ++#define OAM_F5_SEGMENT 0x03 ++#define OAM_F5_ENDTOEND 0x04 ++ ++#define OAM_TIMER_VALUE 1000 // 1000 msecs = 1 sec ++ ++// Macros ++#define CALC_AND_STORE_CRC10(CellPtr) \ ++ { \ ++ UInt16 OAMCRC10; \ ++ CellPtr[OAM_CRC10_0] = 0; \ ++ CellPtr[OAM_CRC10_1] = 0; \ ++ OAMCRC10 = ByteCalcCRC10((UInt8 *)(CellPtr+ATM_CELL_HEADER_SIZE), \ ++ ATM_CELL_PAYLOAD_SIZE); \ ++ CellPtr[OAM_CRC10_0] ^= (OAMCRC10 >> 8); \ ++ CellPtr[OAM_CRC10_1] ^= (OAMCRC10 & 0xFF); \ ++ } ++ ++/* ++$Log: Oam.h,v $ ++Revision 1.1 2004/02/06 22:01:34 sleeper ++Initial creation ++ ++Revision 1.2 2003/09/14 22:09:00 sleeper ++Various changes ( I know this is not a good reason :) ++ ++Revision 1.1 2003/03/11 00:42:39 sleeper ++Initial version ++ ++Revision 1.4 2002/07/25 15:54:16 chris.edgington ++Fixed reversed bits for AB and BA CC activation - fixes last OAM bug. ++ ++Revision 1.3 2002/07/19 17:14:33 chris.edgington ++Fixed compile errors. ++ ++Revision 1.2 2002/07/19 16:46:28 chris.edgington ++Added LOOPBACK defines. ++ ++Revision 1.1 2002/07/18 20:37:11 chris.edgington ++First version. ++ ++ ++*/ ++ ++ ++ +diff -urN x/drivers/usb/misc/eagle-usb/Pipes.c y/drivers/usb/misc/eagle-usb/Pipes.c +--- x/drivers/usb/misc/eagle-usb/Pipes.c 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/Pipes.c 2004-06-05 04:56:19.000000000 +1000 +@@ -0,0 +1,946 @@ ++/*********************************************************************************//* ++ * ++ * Copyright (c) 2003, Frederick Ros (sl33p3r@free.fr) ++ * Forked from ADI Linux driver from Analog Devices Inc., ++ * ++ * Pipes.c ++ * ++ * -------------------------------------------------------------------------------- ++ * ++ * This file is part of the eagle-usb driver package. ++ * ++ * "eagle-usb driver package" is free software; you can redistribute it ++ * and/or modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of the License, ++ * or (at your option) any later version. ++ * ++ * "eagle-usb driver package" is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with "eagle-usb driver package"; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ * ++ * $Id: Pipes.c,v 1.5 2004/06/04 18:56:19 sleeper Exp $ ++ */ ++ ++#include "Adiutil.h" ++#include "macros.h" ++#include "Pipes.h" ++#include "Mpoa.h" ++#include "Uni.h" ++#include "debug.h" ++#include "eu_sm.h" ++ ++/** ++ * --| Reception Mechanism: ++ * ++ * ++ * Data reception is done by sending read requests via URBs + callback. USB ++ * sub-system then calls the callback, with the associated request URB as ++ * parameter when data is available. ++ * ++ * Each URB is associated to a Read Buffer (eu_rb_t), which hold ++ * meta-information (that will be used later on) and received data. Callbacks ++ * are executed in interruption mode: thus they should be as quick as ++ * possible. To achieve this, we use tasklets, to re-assemble ATM frames. ++ * ++ * Callbacks are simple: they just "de-associate" received buffer from the URB, ++ * put it in a queue, schedule the "receive complete tasklet, get a new read ++ * buffer, associates it with the URB, and re-submit the URB. ++ * ++ * Consummer thread, just wakes up, look if there's some data to process, and ++ * processes it. ++ * ++ * Read Buffer structures are different whether driver is compiled to use Bulk ++ * mode (USEBULK), or ISO mode. ++ * ++ * In Bulk mode, eu_rb_t is defined to be adi_bulk_rb_t: ++ * ++ * +--------------------------+ ++ * | next | to link read buffers in completed queue ++ * +--------------------------+ ++ * | length | length of received data ++ * +--------------------------+ ++ * | | Received Data (max=INCOMING_DATA_SIZE) ++ * | | ++ * ........................... ++ * | | ++ * | | ++ * +--------------------------+ ++ * ++ * It is linked in the following way with the URB : ++ * ++ * ++ * +----------------+ ++ * URB | next | ++ * +-----------------------+ +----------------+ ++ * | | | length | ++ * | transfer_buffer +--------> +----------------+ ++ * | | | | ++ * ....................... ................ ++ * | | | | ++ * +-----------------------+ +----------------+ ++ * ++ * In ISO mode, eu_rb_t is defined to be adi_iso_rb_t ++ * ++ * +------------------------+ ++ * | next | To link read buffers in completed queue ++ * +------------------------+ ---+ ++ * | eu_iso_frame_t | \ ++ * +------------------------+ \ ++ * | eu_iso_frame_t | \ ++ * +------------------------+ FRAMES_PER_ISO_URB ++ * ........................ / ++ * +------------------------+ / ++ * | eu_iso_frame_t | / ++ * +------------------------+ ---+ ++ * ++ * An eu_iso_frame_t describes a frame, as well as it's status after ++ * reception and it's length ++ * ++ * +------------------------+ ++ * | status | Status of the reception for this frame ++ * +------------------------+ ++ * | length | Received Data Length ++ * +------------------------+ ++ * | | Received Data (max=FASTEST_ISO_RATE bytes) ++ * ........................ ++ * | | ++ * +------------------------+ ++ * ++ * It is linked with the URB in the followin way: ++ * ++ * +--->+-----------------+ ++ * +------------------------+ | | next | ++ * | | | +-----------------+ ++ * +------------------------+ | | status | ++ * | transfer_buffer ---+-+ +-----------------+ ++ * +------------------------+ | length | ++ * | offset --------------+----->+-----------------+ ++ * | length | | | ++ * +------------------------+ ................. ++ * | offset -----------------+ | | ++ * | length | | +-----------------+ ++ * +------------------------+ | | status | ++ * ........................ | +-----------------+ ++ * | offset | | | length | ++ * | length | +-->+-----------------+ ++ * +------------------------+ | | ++ * ................. ++ * | | ++ * ................. ++ * | | ++ * +-----------------+ ++ * ++ * Associated callbacks, copies each status/length from the URB to the ++ * concerned ISO frame in the read buffer. Thus the kernel thread can process ++ * the received buffer, without having to refer to an URB. ++ * ++ * As we're going to allocate a lot of read buffers, they are allocated from a ++ * lookaside cache (slab). ++ * ++ * --| Reassembly: ++ * ++ * To speed up reassembly, we'll be using directly an skbuff, to hold the ++ * de-assembled cells. ++ * ++ */ ++ ++ ++/* ++ * Local prototypes ++ */ ++ ++#ifdef USEBULK ++static USB_COMPLETION_PROTO (eu_bulk_read_completion,urb,regs); ++#else ++static USB_COMPLETION_PROTO (eu_iso_read_completion,urb,regs); ++#endif ++ ++static USB_COMPLETION_PROTO (eu_write_completion,urb,regs); ++ ++ ++ ++/** ++ * eu_start_read_pipe - prepare receiving subsystem ++ * ++ * @ins Concerned instance ++ * @return 0 on success, error code otherwise. ++ * ++ * Prepare the receiving subsystem by queueing BULK or ISO IN urbs. ++ * ++ */ ++int eu_start_read_pipe (eu_instance_t *ins) ++{ ++ int result; ++ int retcode = 1; ++ int i; ++#ifndef USEBULK ++ int j; ++ unsigned iso_off; ++#endif ++ struct urb *purb; ++ eu_rb_t *rb; ++ ++ ++ if (ins->AdiModemSm.CurrentAdiState & STATE_OPERATIONAL ) ++ { ++ eu_enters (DBG_SAR); ++ ++ for ( i=0; iread_urb[i]; ++ ++ rb = (eu_rb_t *)kmem_cache_alloc ( ins->rb_cache , GFP_KERNEL ); ++ ++ if ( rb == NULL ) ++ { ++ goto byebye; ++ } ++ ++ ++#ifdef USEBULK ++ ++ usb_fill_bulk_urb ( ins->read_urb[i], ++ ins->usbdev, ++ ins->pipe_bulk_data_in, ++ &rb->data[0], ++ INCOMING_DATA_SIZE, ++ eu_bulk_read_completion, ++ ins); ++ ++ ins->read_urb[i]->transfer_flags |= USB_QUEUE_BULK; ++#else ++ /* ++ * Init the URB fields per the spec ++ */ ++#ifdef LINUX_2_4 ++ purb->next = ins->read_urb[(i+1) % INCOMING_Q_SIZE]; ++#endif ++ purb->dev = ins->usbdev; ++ purb->pipe = ins->pipe_iso_data_in; ++ purb->context = ins; ++ purb->complete = eu_iso_read_completion; ++#ifdef LINUX_2_6 ++ purb->interval = 1; ++#endif ++ /* ++ * Get a receive buffer from lookaside cache ++ */ ++ purb->transfer_buffer = rb; ++ purb->transfer_buffer_length = sizeof ( eu_rb_t); ++ purb->number_of_packets = FRAMES_PER_ISO_URB; ++ purb->transfer_flags = URB_ISO_ASAP; ++ ++ /* ++ * Setup the frame descriptors that will receive the data ++ */ ++ iso_off = offsetof (eu_iso_rb_t, frames[0]); ++ ++ for ( j=0; j < purb->number_of_packets; ++j ) ++ { ++ ++ purb->iso_frame_desc[j].offset = iso_off + ++ offsetof (eu_iso_frame_t,data[0]); ++ purb->iso_frame_desc[j].length = FASTEST_ISO_RATE; ++ ++ eu_dbg ( DBG_INIT," Set frame %d of URB %d to offset: %u\n", ++ j,i, purb->iso_frame_desc[j].offset); ++ ++ iso_off += sizeof (eu_iso_frame_t); ++ } ++ ++#endif /* USEBULK */ ++ } ++ ++ for ( i=0; iread_urb[i], GFP_KERNEL) ) ) ++ { ++ eu_dbg (DBG_READ,"Error %d on read URB submission.\n", result); ++ } ++ } ++ ++ retcode = 0; ++ ++ byebye: ++ if ( retcode != 0 ) ++ { ++ /* ++ * Free previously allocated data ++ */ ++ for ( i=0; iread_urb[i]->transfer_buffer ) ++ { ++ kmem_cache_free ( ins->rb_cache, ++ GET_RBUF (ins->read_urb[i] )); ++ ins->read_urb[i]->transfer_buffer = NULL; ++ } ++ } ++ } ++ ++ ++ eu_leaves (DBG_READ); ++ } ++ ++ return (retcode); ++} ++ ++ ++#ifdef USEBULK ++/** ++ * eu_bulk_read_completion - BULK mode read completion function ++ * ++ * @urb Completed URB ++ * @regs ++ * ++ * Called when inbound BULK urb is ready to be processed. We check some ++ * conditions, add it to the received urb queue, and schedule the tasklet to ++ * process it. ++ * We can then resend a read URB and quit. ++ */ ++static USB_COMPLETION_PROTO (eu_bulk_read_completion,urb,regs) ++{ ++ eu_instance_t *ins = urb->context; ++ struct net_device *ether; ++ int result; ++ eu_bulk_rb_t *rb; ++ unsigned long flags; ++ ++ ++ eu_enters (DBG_READ); ++ ++ ++ /*This should never happen - but in a kernel driver, better safe than sorry!*/ ++ if ( !ins ) ++ { ++ eu_dbg (DBG_READ,"NULL ins from urb->context!\n"); ++ ++ goto Read_exit; ++ } ++ ++ /* If we're not open for business, ignore this callback*/ ++ if ( !EU_TEST_FLAG(ins, EU_OPEN) ) ++ { ++ eu_dbg (DBG_READ,"Read callback, but Open = FALSE!\n"); ++ goto Read_exit; ++ } ++ ++ ether = ins->eth; ++ if ( !netif_device_present(ether) ) ++ { ++ eu_dbg (DBG_READ,"Somebody has killed our network interface.\n"); ++ ++ goto Read_exit; ++ } ++ ++ if ( ++ ( urb->status == -ENOENT ) || ++ (urb->status == -ECONNRESET ) ++ ( urb->status == -ESHUTDOWN ) ++ ) ++ { ++ ++ eu_dbg (DBG_READ,"BULK URB unlinked.\n"); ++ if ( urb->transfer_buffer) ++ { ++ kmem_cache_free (ins->rb_cache, urb->transfer_buffer); ++ urb->transfer_buffer = NULL; ++ urb->transfer_buffer_length = 0; ++ } ++ goto Read_exit; ++ } ++ ++#ifdef SYNC_READS ++ /***************************************************************************/ ++ /* We only allow one read to happen at a time. Since we only queue up one */ ++ /* BULK IN urb, I don't know how we could get called again. But, we do need*/ ++ /* to make sure that we're not being reentered, just in case. */ ++ /***************************************************************************/ ++ if ( EU_TEST_FLAG ( ins, EU_READING ) ) ++ { ++ ins->LinuxStats.rx_errors++; ++ eu_dbg (DBG_READ,"Read callback, but Reading = TRUE!\n"); ++ ++ goto Read_exit; ++ } ++ ++ EU_SET_FLAG (ins, EU_READING); ++ ++#endif ++ ++ if ( urb->status != 0) ++ { ++ /* ++ * These errors seem to be what we get when the device has been unplugged, so ++ * lets stop a bunch of these from happening by unlinking the urb now ++ */ ++ if ( (urb->status != -EILSEQ) && ++ (urb->status != -ETIMEDOUT) ) ++ { ++ eu_dbg (DBG_READ,"Error status = %d in eu_bulk_read_completion - requeuing\n", ++ urb->status); ++ ++ goto ReadResubmit; ++ } ++ else ++ { ++ eu_dbg (DBG_READ,"Error status = %d in eu_bulk_read_completion - not requeuing\n", ++ urb->status); ++ ++ goto Read_exit; ++ } ++ } ++ ++ /* ++ * If this was a zero-length read, we're done ++ */ ++ if ( !urb->actual_length ) ++ { ++ goto ReadResubmit; ++ } ++ ++ eu_dbg ( DBG_READ,"Read data length is %#x bytes.\n", urb->actual_length ); ++ ++ rb = GET_RBUF (urb); ++ rb->length = urb->actual_length; ++ ++ /* ++ * Enqueue received buffer completed read list ++ */ ++ spin_lock_irqsave (&ins->comp_read_q_lock, flags); ++ list_add_tail ( &rb->next, &ins->comp_read_q); ++ spin_unlock_irqrestore (&ins->comp_read_q_lock, flags); ++ ++ ++ /* ++ * Schedule tasklet ++ */ ++ tasklet_schedule ( &ins->rcv_complete_tasklet ); ++ ++ ++ /* ++ * Get a new bunch of memory (we're in interrupt mode) ++ */ ++ rb = (eu_bulk_rb_t *)kmem_cache_alloc ( ins->rb_cache, GFP_ATOMIC ); ++ ++ if ( !rb ) ++ { ++ eu_err ("Not enough mem to allocate read buffer.\n"); ++ ++ goto Read_exit; ++ } ++ ++ /* ++ * And skip a list head ++ */ ++ urb->transfer_buffer = &rb->data[0]; ++ ++ ReadResubmit: ++ ++ if ( ins->AdiModemSm.CurrentAdiState & STATE_OPERATIONAL ) ++ { ++ usb_fill_bulk_urb(urb, ins->usbdev, ins->pipe_bulk_data_in, ++ urb->transfer_buffer, INCOMING_DATA_SIZE, ++ eu_bulk_read_completion, ins); ++ if ( ( result = USB_SUBMIT_URB ( urb, GFP_ATOMIC ) ) ) ++ { ++ eu_dbg (DBG_READ,"Error %d on read URB submit.\n", result); ++ } ++ ++ } ++ ++#ifdef SYNC_READS ++ EU_CLEAR_FLAG (ins, EU_READING); ++#endif ++ ++/*We will only jump to here on conditions where we don't want to queue another read*/ ++ Read_exit: ++ eu_leaves (DBG_READ); ++ ++ return; ++} ++ ++#else /* USEBULK */ ++ ++/** ++ * eu_iso_read_completion - ISO mode read completion function ++ * ++ * @urb Completed URB ++ * @regs ++ * ++ * Called when inbound ISO urb is ready to be processed. We check some ++ * conditions, add it to the received urb queue, and schedule the tasklet to ++ * process it. ++ * We then resubmit a read URB ( on 2.6 kernels only ) and quit. ++ */ ++ ++static USB_COMPLETION_PROTO (eu_iso_read_completion,urb,regs) ++{ ++ eu_instance_t *ins = urb->context; ++ struct net_device *ether; ++ int i; ++ eu_iso_rb_t *rb; ++ unsigned long flags; ++ ++ ++ eu_enters (DBG_READ); ++ ++ ++ /* ++ * This should never happen - but in a kernel driver, better safe than sorry! ++ */ ++ if ( !ins ) ++ { ++ eu_err ("NULL ins from urb->context!\n"); ++ ++ goto byebye; ++ ++ } ++ ++ /* ++ * If we're not open for business, ignore this callback ++ */ ++ if ( !EU_TEST_FLAG(ins, EU_OPEN) ) ++ { ++ eu_err ("Read callback, but Open = FALSE!\n"); ++ ++ if ( urb->transfer_buffer) ++ { ++ kmem_cache_free (ins->rb_cache, urb->transfer_buffer); ++ urb->transfer_buffer = NULL; ++ urb->transfer_buffer_length = 0; ++ } ++ ++ goto get_new_urb_buffer; ++ } ++ ++ ether = ins->eth; ++ if ( !netif_device_present(ether) ) ++ { ++ eu_err ("Somebody has killed our network interface.\n"); ++ ++ goto byebye; ++ } ++ ++ if ( ++ ( urb->status == -ENOENT ) || ++ ( urb->status == -ECONNRESET ) || ++ ( urb->status == -ENOENT ) ++ ) ++ { ++ ++ eu_dbg (DBG_READ,"ISO URB unlinked.\n"); ++ if ( urb->transfer_buffer) ++ { ++ kmem_cache_free (ins->rb_cache, urb->transfer_buffer); ++ urb->transfer_buffer = NULL; ++ urb->transfer_buffer_length = 0; ++ } ++ goto byebye; ++ } ++ ++ /* ++ * If this was a zero-length read, we're done ++ */ ++ if ( !urb->actual_length ) ++ { ++ goto clear_status; ++ } ++ ++ /* ++ * We can now process incoming data. We must go through each frame, copy the ++ * status/length returned to in relevant fields in the eu_iso_rb_t structure, ++ * enqueue the buffer in the list of completed read, and wake-up the consumer ++ * thread, and get a new bunch of memory. ++ */ ++ urb->status = 0; ++ rb = GET_RBUF (urb); ++ for ( i=0; inumber_of_packets; i++ ) ++ { ++ rb->frames[i].status = urb->iso_frame_desc[i].status; ++ rb->frames[i].length = urb->iso_frame_desc[i].actual_length; ++ ++ urb->iso_frame_desc[i].status = 0; ++ } ++ ++ /* ++ * Enqueue in completed read list ++ */ ++ spin_lock_irqsave (&ins->comp_read_q_lock, flags); ++ list_add_tail ( &rb->next, &ins->comp_read_q ); ++ spin_unlock_irqrestore (&ins->comp_read_q_lock, flags); ++ ++ ++ /* ++ * Schedule tasklet ++ */ ++ tasklet_schedule ( &ins->rcv_complete_tasklet ); ++ ++ get_new_urb_buffer: ++ /* ++ * Get a new bunch of memory (we're in interrupt mode) ++ */ ++ rb = (eu_iso_rb_t *) kmem_cache_alloc ( ins->rb_cache, GFP_ATOMIC ); ++ ++ if ( !rb ) ++ { ++ eu_err ("Not enough mem to allocate read buffer.\n"); ++ urb->transfer_buffer = NULL; ++ urb->transfer_buffer_length = 0; ++ goto byebye; ++ } ++ ++ urb->transfer_buffer = rb; ++ urb->transfer_buffer_length = sizeof ( eu_rb_t); ++ ++ clear_status: ++ ++ for (i=0; inumber_of_packets; i++) ++ { ++ urb->iso_frame_desc[i].status = 0; ++ urb->iso_frame_desc[i].actual_length = 0; ++ } ++ urb->status = 0; ++ ++ ++#ifdef LINUX_2_6 ++ { ++ int ret; ++ ++ urb->dev = ins->usbdev; ++ ++ ret = USB_SUBMIT_URB (urb, GFP_ATOMIC); ++ ++ if ( ret ) ++ { ++ eu_err ("eu_iso_read_completion: Can't submit urb (%d)\n",ret); ++ } ++ } ++#endif ++ ++ byebye: ++ eu_leaves (DBG_READ); ++ ++ return; ++} ++ ++#endif /* USEBULK */ ++ ++/**********************************************************************************/ ++/* eu_stop_read_pipe */ ++/* */ ++/* Simple, really, but maybe we'll eventually have to do more. */ ++/**********************************************************************************/ ++void eu_stop_read_pipe ( eu_instance_t *ins ) ++{ ++ int i; ++ ++ eu_enters (DBG_READ); ++ ++ for (i=0; iread_urb[i]) ++ { ++ eu_dbg (DBG_READ,"About to unlink read urb %u\n",i); ++ ins->read_urb[i]->transfer_flags &= ~URB_ASYNC_UNLINK; ++ usb_unlink_urb( ins->read_urb[i] ); ++ ++ eu_dbg (DBG_READ,"Read urb %u unlinked.\n",i); ++ } ++ else ++ { ++ eu_dbg (DBG_READ,"Read urb %u not present\n",i); ++ continue; ++ } ++ ++ ++ ++ /* ++ * And free read buffers ++ */ ++ if ( ins->read_urb[i]->transfer_buffer ) ++ { ++ eu_dbg (DBG_READ,"About to free rb (0x%p)from urb %u\n", ++ ins->read_urb[i]->transfer_buffer,i); ++ kmem_cache_free ( ins->rb_cache, GET_RBUF (ins->read_urb[i])); ++ ins->read_urb[i]->transfer_buffer = NULL; ++ ins->read_urb[i]->transfer_buffer_length = 0; ++ eu_dbg (DBG_READ,"Read urb %u rb freed.\n",i); ++ } ++ } ++ ++ eu_leaves (DBG_READ); ++} ++ ++/**********************************************************************************/ ++/* eu_read_to_uplayers */ ++/* */ ++/* This is called by the Uni code once it has determined that a valid */ ++/* ethernet packet has been reassembled and is ready for processing */ ++/* by higher level network code. First we'll do things that a normal */ ++/* ethernet card would do in hardware (packet filtering, etc.), then */ ++/* we'll follow the standard procedure for sending data back up the stack. */ ++/* Comment by Anoosh on Apri30,2002, In MAC driver in ReadWaitingData function */ ++/* in read.c we check if we are using PPPoA then use RealSize for the size of */ ++/* data that we send up and for ethernet we pad packets smaller than 64 bytes */ ++/* and add space for Ethernet FCS. But here in linux it looks that we just use */ ++/* RealSize for the size of data without adding anything therefore we just */ ++/* ignore adding anything here to match with MAC driver. Look into read.c in */ ++/* MAC driver line 168 */ ++/**********************************************************************************/ ++void eu_read_to_uplayers ( eu_instance_t *ins, struct sk_buff *skb ) ++{ ++ uint32_t packet_size = 0; ++ uint32_t encaps_skip_size = 0; ++ static const uint8_t PPP_ETH_ADDR_DEST[ETH_ALEN] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06}; ++ static const uint8_t PPP_ETH_ADDR_SRC[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; ++ ++ eu_enters (DBG_READ); ++ ++ ++ if ( MpoaProcessReceivedPdu (ins, skb, &encaps_skip_size) ) ++ { ++ /* ++ * Drop it ++ */ ++ ins->LinuxStats.rx_errors++; ++ dev_kfree_skb( skb ); ++ goto byebye; ++ } ++ ++ ++ /* ++ * Drop encapsulation if needed ++ */ ++ skb_pull (skb, encaps_skip_size ); ++ ++ packet_size = skb->len; ++ ++ ++ switch ( ins->MpoaMode ) ++ { ++ case MPOA_MODE_BRIDGED_ETH_LLC: ++ case MPOA_MODE_BRIDGED_ETH_VC : ++ { ++ /* ++ * Everything is already done ++ */ ++ } ++ break; ++ ++ case MPOA_MODE_ROUTED_IP_LLC : ++ case MPOA_MODE_ROUTED_IP_VC : ++ { ++ /* ++ * Push an ethernet frame at beginning ++ */ ++ skb_push ( skb, 14 ); ++ ++ /* ++ * Copy ethernet header info ++ */ ++ memcpy ( skb->data, ins->eth->dev_addr, ETH_ALEN); ++ memcpy ( skb->data + 6, ins->eth->dev_addr, ETH_ALEN); ++ skb->data[11] ^=0x1; /* Try a fake address */ ++ skb->data[12] = (uint8_t) 0x08; /* ETH_P_IP */ ++ skb->data[13] = (uint8_t) 0x00; ++ } ++ break; ++ ++ ++ case MPOA_MODE_PPPOA_LLC : ++ case MPOA_MODE_PPPOA_VC : ++ { ++ ++ ++ /* ++ * Push an (ethernet frame + packet size) at beginning ++ */ ++ skb_push ( skb, 16 ); ++ ++ /* ++ * Copy fake source and destination ++ */ ++ memcpy(skb->data, PPP_ETH_ADDR_DEST, ETH_ALEN); ++ memcpy(skb->data+ETH_ALEN, PPP_ETH_ADDR_SRC, ETH_ALEN); ++ ++ /* ++ * Set the ethernet proto filed ( 0x0003 is for every packet ++ */ ++ skb->data[12] = (uint8_t) 0x00; ++ skb->data[13] = (uint8_t) 0x03; ++ ++ /* ++ * Set the packet size field: ++ */ ++ skb->data[14] = (uint8_t) (packet_size >> 8); ++ skb->data[15] = (uint8_t) (packet_size); ++ ++ } ++ break; ++ } ++ ++ ++ /* ++ * Set up packet type: ++ */ ++ skb->protocol = eth_type_trans (skb, ins->eth); ++ ++ /* ++ * Update statistics: ++ */ ++ ins->eth->last_rx = jiffies; ++ ++ins->LinuxStats.rx_packets; ++ ins->LinuxStats.rx_bytes += packet_size; ++ ++ /* ++ * Send the packet to upper layer: ++ */ ++ netif_rx (skb); ++ ++ byebye: ++ eu_leaves (DBG_READ); ++ return; ++} ++ ++ ++/** ++ * eu_write_atm_data - Just send ATM cells to modem ++ */ ++ ++int eu_write_atm_data ( eu_instance_t *ins ) ++{ ++ int result; ++ ++ if ( ins->AdiModemSm.CurrentAdiState & STATE_OPERATIONAL ) ++ { ++ eu_dbg (DBG_READ,"*** Writing %#x bytes to USB\n", ins->Vc.segmenter.size); ++ ++ /* ++ * Prepare the URB ++ */ ++ ++#ifdef LINUX_2_6 ++ usb_init_urb (ins->urb_write); ++#endif ++ ins->urb_write->status = 0; ++ ++ usb_fill_bulk_urb ( ins->urb_write, ++ ins->usbdev, ++ ins->pipe_bulk_data_out, ++ ins->segmentation_buffer, ++ ins->Vc.segmenter.size, ++ eu_write_completion, ++ ins ); ++ /* ++ * Marks the writing URB as pending ++ */ ++ EU_SET_FLAG (ins,EU_WRITING); ++ ins->urb_write->transfer_flags |= USB_QUEUE_BULK; ++ ++ /* ++ * Send it: ++ */ ++ result = USB_SUBMIT_URB ( ins->urb_write , GFP_ATOMIC ); ++ } ++ else ++ { ++ /*I want to make sure that we return error if modem is*/ ++ /*not in OPERATIONAL mode because otherwise we screw */ ++ /*USB pipes again. We do not want to send anything to */ ++ /*USB if modem is not in OPERATIONAL mode */ ++ result = 1; ++ } ++ ++ return result; ++} ++ ++ ++/** ++ * eu_write_completion - Called when the write of outgoing ATM cells is complete. ++ */ ++static USB_COMPLETION_PROTO (eu_write_completion,urb,regs) ++{ ++ eu_instance_t *ins = urb->context; ++ struct net_device *ether; ++ ++ eu_enters (DBG_READ); ++ ++ ++ if ( (ins == NULL) || (!EU_TEST_FLAG(ins, EU_OPEN)) ) ++ { ++ eu_dbg (DBG_READ,"NULL urb->context or Open=FALSE in WriteCompletion!\n"); ++ ++ goto byebye; ++ } ++ ++ ether = ins->eth; ++ ++ if ( !netif_device_present(ether) ) ++ { ++ eu_dbg (DBG_READ,"Network interface no longer present!\n"); ++ ++ goto byebye; ++ } ++ ++ /* Update transmission statistics: */ ++ if ( 0 == urb->status ) ++ { ++ ++ins->LinuxStats.tx_packets; ++ ins->LinuxStats.tx_bytes += ins->out_pkt_size; ++ } ++ else ++ { ++ if ( ++ ( urb->status == -ENOENT ) || ++ ( urb->status == -ECONNRESET ) || ++ ( urb->status == -ENOENT ) ++ ) ++ { ++ eu_warn ("transmit URB %p cancelled\n", urb); ++ ++ ++ins->LinuxStats.tx_aborted_errors; ++ /* ++ * Clear status in order to be able to re-use this URB : otherwise ++ * host (UHCI/OHCI), will see status as -ECONNRESET when doing the ++ * next usb_submit_urb, and will refuse to send it, returning ++ * -EINVAL. ++ */ ++ urb->status = 0; ++ urb->transfer_flags &= ~URB_ASYNC_UNLINK; ++ } ++ else ++ { ++ eu_warn ("transmit error with URB status %d\n", urb->status); ++ ++ ++ins->LinuxStats.tx_carrier_errors; ++ } ++ ++ ++ins->LinuxStats.tx_errors; ++ ins->out_pkt_size = 0; ++ } ++ ++ /* ++ * Ask for another outgoing socket buffer ++ */ ++ EU_CLEAR_FLAG (ins,EU_WRITING); ++ ++ netif_wake_queue(ether); ++ ++byebye: ++ eu_leaves (DBG_READ); ++ ++} ++ +diff -urN x/drivers/usb/misc/eagle-usb/Pipes.h y/drivers/usb/misc/eagle-usb/Pipes.h +--- x/drivers/usb/misc/eagle-usb/Pipes.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/Pipes.h 2004-02-07 09:01:34.000000000 +1100 +@@ -0,0 +1,34 @@ ++/*************************************************************************************/ ++/* */ ++/* Pipes.h */ ++/* */ ++/* Functions to send to and read data from the device. */ ++/* */ ++/* This file is part of the "ADI USB ADSL Driver for Linux". */ ++/* */ ++/* "ADI USB ADSL Driver for Linux" is free software; you can redistribute it */ ++/* and/or modify it under the terms of the GNU General Public License as */ ++/* published by the Free Software Foundation; either version 2 of the License, */ ++/* or (at your option) any later version. */ ++/* */ ++/* "ADI USB ADSL Driver for Linux" is distributed in the hope that it will be */ ++/* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of */ ++/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ ++/* GNU General Public License for more details. */ ++/* */ ++/* You should have received a copy of the GNU General Public License */ ++/* along with "ADI USB ADSL Driver for Linux"; if not, write to the Free Software */ ++/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ ++/*************************************************************************************/ ++ ++#ifndef __ADIPIPES_H__ ++#define __ADIPIPES_H__ ++ ++#include "eagle-usb.h" ++ ++extern int eu_start_read_pipe (eu_instance_t *ins); ++extern void eu_stop_read_pipe ( eu_instance_t *ins ); ++extern void eu_read_to_uplayers ( eu_instance_t *ins, struct sk_buff *skb ); ++extern int eu_write_atm_data ( eu_instance_t *ins ); ++ ++#endif +diff -urN x/drivers/usb/misc/eagle-usb/Sar.c y/drivers/usb/misc/eagle-usb/Sar.c +--- x/drivers/usb/misc/eagle-usb/Sar.c 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/Sar.c 2004-02-07 09:01:34.000000000 +1100 +@@ -0,0 +1,524 @@ ++/***************************************************************************************/ ++/* $Id: Sar.c,v 1.1 2004/02/06 22:01:34 sleeper Exp $ */ ++/* */ ++/* Copyright (c) 2001, Analog Devices Inc., All Rights Reserved */ ++/* */ ++/* Sar.c */ ++/* */ ++/* AAL5 Segmentation and Reassembly support routines */ ++/* */ ++/* This file is part of the "ADI USB ADSL Driver for Linux". */ ++/* */ ++/* "ADI USB ADSL Driver for Linux" is free software; you can redistribute it */ ++/* and/or modify it under the terms of the GNU General Public License as */ ++/* published by the Free Software Foundation; either version 2 of the License, */ ++/* or (at your option) any later version. */ ++/* */ ++/* "ADI USB ADSL Driver for Linux" is distributed in the hope that it will be */ ++/* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of */ ++/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ ++/* GNU General Public License for more details. */ ++/* */ ++/* You should have received a copy of the GNU General Public License */ ++/* along with "ADI USB ADSL Driver for Linux"; if not, write to the Free Software */ ++/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ ++/***************************************************************************************/ ++ ++#include "Adiutil.h" ++#include "Sar.h" ++#include "eu_utils.h" ++#include "debug.h" ++ ++#define CRC_INITIAL_VALUE 0xFFFFFFFF ++#define ATM_AAL5_TRAILER_SIZE 8 ++#define ATM_AAL5_CRC_SIZE 4 ++ ++ ++/***************************************************************************************/ ++/* Aal5InitSegmenter */ ++/* */ ++/* Initializes the specified Sar segmenting state machine, preparing for segmentation */ ++/* */ ++/* Notes: */ ++/* If the PDU is encapsulated, the total encapsulated length should be */ ++/* passed in as the PduLength */ ++/***************************************************************************************/ ++/** ++ * eu_aal5_seg_init - Initialize segmenter state machine ++ */ ++ ++void eu_aal5_seg_init ( ++ eu_sar_s_t *psar, ++ uint32_t pdu_length, ++ uint8_t *out_buff, ++ uint8_t *cell_hdr ++ ) ++{ ++ eu_enters (DBG_SAR); ++ ++ ++ psar->out_buff = out_buff; ++ psar->cell_hdr = cell_hdr; ++ psar->raw_pdu_length = pdu_length; ++ psar->padding_len = 0; ++ psar->bytes_left_in_curr_cell = 0; ++ psar->cell_count = 0; ++ psar->running_crc = CRC_INITIAL_VALUE; ++ ++ eu_leaves (DBG_SAR); ++ ++} ++ ++/** ++ * eu_aal5_segment - Segment the input buffer ++ * ++ * Splits input data into ATM_CELL_PAYLOAD_SIZE sized packets, with an ATM cell ++ * header at beginning of each packet, leading to an ATM_CELL_SIZE sized packet. ++ * ++ * @buff - Input buffer ++ * @len - Length of input buffer ++ * ++ */ ++void eu_aal5_segment ( ++ eu_sar_s_t *psar, ++ uint8_t *buff, ++ uint32_t len ++ ) ++{ ++ uint16_t bytes_to_copy; ++ ++ eu_enters (DBG_SAR); ++ ++ ++ /* ++ * Lets start by first calculating the CRC for this input buffer ++ */ ++ psar->running_crc = eu_crc_calculate ( buff, len, psar->running_crc ); ++ ++ /* ++ * Loop until we exhaust the bytes in the input buffer ++ */ ++ while ( len ) ++ { ++ if ( psar->bytes_left_in_curr_cell == 0 ) ++ { ++ /* ++ * This is the start of a new ATM cell, so copy the default cell header ++ */ ++ eu_dbg (DBG_SAR,"src=%p, dst=%p, len=%x\n", psar->cell_hdr, ++ psar->out_buff, ATM_CELL_HEADER_SIZE); ++ ++ memcpy ( psar->out_buff, psar->cell_hdr, ATM_CELL_HEADER_SIZE); ++ ++ psar->out_buff += ATM_CELL_HEADER_SIZE; ++ ++ /* ++ * Now that we've actually started the cell, set the bytes left accordingly ++ */ ++ psar->bytes_left_in_curr_cell = ATM_CELL_PAYLOAD_SIZE; ++ psar->cell_count++; ++ } ++ ++ /* ++ * We have two possibilities, either the data left in the input buffer will ++ * be exhausted within the current cell, or it will require additional cells ++ */ ++ bytes_to_copy = min ( psar->bytes_left_in_curr_cell, len ); ++ ++ eu_dbg (DBG_SAR,"src=%p, dst=%p, len=%x\n", buff, ++ psar->out_buff, bytes_to_copy); ++ ++ memcpy ( psar->out_buff, buff, bytes_to_copy ); ++ ++ psar->bytes_left_in_curr_cell -= bytes_to_copy; ++ psar->out_buff += bytes_to_copy; ++ buff += bytes_to_copy; ++ len -= bytes_to_copy; ++ } ++ ++ eu_leaves (DBG_SAR); ++ ++} ++ ++/***************************************************************************************/ ++/* Aal5WritePadAndTrailer */ ++/* */ ++/* Performs cell padding when necessary and writes the CPCS PDU trailer */ ++/* */ ++/* Returns the total count of ATM cells created for the Pdu */ ++/***************************************************************************************/ ++uint16_t eu_aal5_write_pad_and_trailer ( ++ eu_sar_s_t *psar, ++ uint8_t cpcs_uu, ++ uint8_t cpi ++ ) ++{ ++ uint16_t padding_size; ++ uint8_t *pcell; ++ eu_aal5_trailer_t *ptrail; ++ ++ eu_enters (DBG_SAR); ++ ++ ++ /* ++ * If we don't have room for the trailer in the current packet, then ++ * we need to pad out the rest of the current packet and start a new one ++ */ ++ if ( psar->bytes_left_in_curr_cell < ATM_AAL5_TRAILER_SIZE ) ++ { ++ /* ++ * We might have 0 bytes left in the current cell, which would mean we ++ * still need to start a new cell for the trailer, but we don't need ++ * to pad the current cell ++ */ ++ ++ if ( psar->bytes_left_in_curr_cell ) ++ { ++ memset ( psar->out_buff, 0, psar->bytes_left_in_curr_cell ); ++ ++ /* ++ * Account for the padding in the CRC ++ */ ++ psar->running_crc = eu_crc_calculate ( psar->out_buff, ++ psar->bytes_left_in_curr_cell, ++ psar->running_crc ); ++ ++ psar->out_buff += psar->bytes_left_in_curr_cell; ++ } ++ ++ /* ++ * Start the new cell that will contain padding + trailer ++ */ ++ eu_dbg ( DBG_SAR,"src=%p, dst=%p, len=%x\n", psar->cell_hdr, ++ psar->out_buff, ATM_CELL_HEADER_SIZE); ++ ++ memcpy ( psar->out_buff, psar->cell_hdr, ATM_CELL_HEADER_SIZE ); ++ ++ psar->out_buff += ATM_CELL_HEADER_SIZE; ++ psar->bytes_left_in_curr_cell = ATM_CELL_PAYLOAD_SIZE; ++ psar->cell_count ++; ++ ++ } ++ ++ ++ /* ++ * We're now ready with the cell that will contain trailer and possible padding ++ */ ++ ++ padding_size = psar->bytes_left_in_curr_cell - ATM_AAL5_TRAILER_SIZE; ++ ++ if ( padding_size ) ++ { ++ memset ( psar->out_buff, 0, padding_size ); ++ ++ /* ++ * Account for the padding in the CRC ++ */ ++ psar->running_crc = eu_crc_calculate ( psar->out_buff, ++ padding_size, ++ psar->running_crc); ++ psar->bytes_left_in_curr_cell -= padding_size; ++ psar->out_buff += padding_size; ++ ++ } ++ ++ /* ++ * Set the "AAL_Indicate" bit in the Payload Type field of the current ATM cell ++ */ ++ pcell = psar->out_buff - ( ATM_CELL_SIZE - psar->bytes_left_in_curr_cell ); ++ pcell[ATM_CELL_HEADER_PT_OFFSET] |= ATM_PT_AAL_INDICATE; ++ ++ /* ++ * Finally, write out the CPCS PDU trailer ++ */ ++ ptrail = (eu_aal5_trailer_t *)(psar->out_buff); ++ ptrail->cpcs_uu = cpcs_uu; ++ ptrail->cpi = cpi; ++ ptrail->pdu_len = cpu_to_be16 ( psar->raw_pdu_length ); ++ ++ /* ++ * Finish the CRC by calculating the CRC for the trailer ++ */ ++ psar->running_crc = eu_crc_calculate ( psar->out_buff, ++ ATM_AAL5_TRAILER_SIZE - ATM_AAL5_CRC_SIZE, ++ psar->running_crc ); ++ ptrail->crc = cpu_to_be32 ( ~psar->running_crc ); ++ psar->out_buff += ATM_AAL5_TRAILER_SIZE; ++ psar->bytes_left_in_curr_cell -= ATM_AAL5_TRAILER_SIZE; ++ ++ /* ++ * Actually, BytesLeftInCurrentCell had better equal 0! ++ */ ++ if ( psar->bytes_left_in_curr_cell ) ++ { ++ eu_dbg (DBG_SAR,"eu_aal5_write_pad_and_trailer finished with BytesLeftInCurrentCell != 0!\n"); ++ } ++ ++ eu_leaves (DBG_SAR); ++ ++ ++ return psar->cell_count; ++} ++ ++/***************************************************************************************/ ++/* Aal5InitReassembler */ ++/* */ ++/* Initializes the specified Sar reassembly state machine, preparing for reassembly */ ++/***************************************************************************************/ ++void Aal5InitReassembler ( eu_sar_r_t *psar ) ++{ ++ eu_enters (DBG_SAR); ++ eu_dbg (DBG_SAR,"Aal5InitReassembler: psar=%p \n", psar); ++ ++/* pSar->pQueueEntry = pBuf; */ ++/* pSar->pReassemblyBuffer = pBuf->GB.pData; */ ++/* pSar->BytesLeftInReassembly = pSar->ReassemblyBufferSize = pBuf->GB.AllocedSize; */ ++ psar->pdu_len_from_trailer = 0; ++ psar->running_crc = CRC_INITIAL_VALUE; ++ psar->cell_count = 0; ++ ++ eu_leaves (DBG_SAR); ++ ++} ++ ++/***************************************************************************************/ ++/* Aal5ReassembleNonFinalCell */ ++/* */ ++/* Simply copies the payload of the cell into the reassembly buffer. Since we */ ++/* don't do anything with the cell header, the function expects the pointer */ ++/* to be pointing to the payload of the cell, not the beginning of the cell */ ++/* */ ++/* Notes: */ ++/* Assumes there is ample space in the reassembly buffer for the cell */ ++/***************************************************************************************/ ++void Aal5ReassembleNonFinalCell( ++ eu_sar_r_t *psar, ++ uint8_t *pCellPayload ++ ) ++{ ++ eu_enters (DBG_SAR); ++ ++ ++ /* ++ * First, lets calculate the crc for the cell ++ */ ++ psar->running_crc = eu_crc_calculate ( ++ pCellPayload, ++ ATM_CELL_PAYLOAD_SIZE, ++ psar->running_crc ++ ); ++ ++ /* ++ * Copy the cell data into the reassembly buffer ++ */ ++ ++ memcpy(skb_put (psar->skb, ATM_CELL_PAYLOAD_SIZE), ++ pCellPayload, ATM_CELL_PAYLOAD_SIZE); ++ ++ ++ eu_leaves (DBG_SAR); ++ ++} ++ ++/***************************************************************************************/ ++/* Aal5ReassembleFinalCell */ ++/* */ ++/* If this final cell contains real Pdu data, copies that data into the */ ++/* reassembly buffer. If not, determines if we copied some padding from the */ ++/* previous cell and backs up our reassembly pointer appropriately */ ++/* */ ++/* Notes: */ ++/* Assumes there is ample space in the reassembly buffer for the cell */ ++/***************************************************************************************/ ++void Aal5ReassembleFinalCell( ++ eu_sar_r_t *psar, ++ uint8_t *pCellPayload ++ ) ++{ ++ eu_aal5_trailer_t *ptrail; ++ uint16_t real_pdu_data_left, padding_size; ++ ++ eu_enters (DBG_SAR); ++ ++ ++ ptrail = (eu_aal5_trailer_t *)(pCellPayload + ++ (ATM_CELL_PAYLOAD_SIZE-ATM_AAL5_TRAILER_SIZE)); ++ ++ /*******************************************************************************/ ++ /* First, lets calculate the crc for the cell. Since this is the last cell, */ ++ /* it will have the stored CRC as the last dword. Including the stored CRC */ ++ /* in the CRC calculation should result in the final CRC (stored in RunningCRC)*/ ++ /* being a known value (CRC_RESIDUE from Crc.h). */ ++ /*******************************************************************************/ ++ psar->running_crc = eu_crc_calculate ( ++ pCellPayload, ++ ATM_CELL_PAYLOAD_SIZE, ++ psar->running_crc ++ ); ++ ++ /*******************************************************************************/ ++ /* Before we do any actual data copying, we have to figure out how much of */ ++ /* this cell is actual Pdu data. It will be one of the following formats: */ ++ /* data+trailer */ ++ /* data+padding+trailer */ ++ /* padding+trailer */ ++ /*******************************************************************************/ ++ psar->pdu_len_from_trailer = be16_to_cpu(ptrail->pdu_len); ++ real_pdu_data_left = psar->pdu_len_from_trailer % ATM_CELL_PAYLOAD_SIZE; ++ ++ /*******************************************************************************/ ++ /* Note that RealPduDataLeft will actually be the amount of real Pdu data */ ++ /* in the previous cell if there wasn't enough space left in that cell for */ ++ /* the trailer. That would mean this packet contains padding+trailer */ ++ /*******************************************************************************/ ++ ++ if ( real_pdu_data_left > (ATM_CELL_PAYLOAD_SIZE-ATM_AAL5_TRAILER_SIZE)) ++ { ++ /* Yep, this cell is just padding+trailer, so last cell was last real data*/ ++ /* We need to backup our reassembly info to account for padding we copied */ ++ ++/* pSar->pReassemblyBuffer -= padding_size; */ ++/* pSar->BytesLeftInReassembly += padding_size; */ ++ ++ padding_size = ATM_CELL_PAYLOAD_SIZE - real_pdu_data_left; ++ skb_trim ( psar->skb , psar->skb->len - padding_size ); ++ } ++ else ++ { ++ /* if RealPduDataLeft == 0, then the last cell contained 100% Pdu data, and*/ ++ /* it finished out the Pdu, so we don't have to do any backtracking or */ ++ /* additional copying */ ++ if ( real_pdu_data_left != 0 ) ++ { ++ /* This cell contains some valid Pdu data to copy into the reassembly buffer*/ ++/* eu_dbg (DBG_SAR,"src=%p, dst=%p, len=%x\n", pCellPayload, */ ++/* pSar->pReassemblyBuffer, RealPduDataLeft); */ ++ ++/* memcpy(pSar->pReassemblyBuffer, pCellPayload, RealPduDataLeft); */ ++/* pSar->BytesLeftInReassembly -= RealPduDataLeft; */ ++/* pSar->pReassemblyBuffer += RealPduDataLeft; */ ++ ++ memcpy ( skb_put ( psar->skb, real_pdu_data_left ) , ++ pCellPayload, real_pdu_data_left ); ++ ++ } ++ } ++ ++ eu_leaves (DBG_SAR); ++ ++} ++ ++ ++/**************************************************************************************** ++$Log: Sar.c,v $ ++Revision 1.1 2004/02/06 22:01:34 sleeper ++Initial creation ++ ++Revision 1.2 2003/09/14 21:54:12 sleeper ++Assembler/Segmenter rewrote ++ ++Revision 1.3 2003/06/03 22:42:54 sleeper ++Changed ZAPS to eu_dbg/err macros ++ ++Revision 1.2 2003/04/23 22:27:03 sleeper ++PPC support ++ ++Revision 1.1.1.1 2003/02/10 23:29:49 sleeper ++Imported sources ++ ++Revision 1.30 2002/05/27 21:59:34 Anoosh Naderi ++Clean up the code ++ ++Revision 1.2 2002/01/14 21:59:34 chris.edgington ++Added GPL header. ++ ++Revision 1.1 2002/01/02 21:56:31 chris.edgington ++First version - from MacOS9 project (with Linux mods to get to compile). ++ ++ ++------------------------------------------------------------------------------ ++ Log from MacOS9 project ++------------------------------------------------------------------------------ ++ ++Revision 1.26 2001/12/05 22:09:55 chris.edgington ++Added Analog Devices copyright notice. ++ ++Revision 1.25 2001/11/12 14:23:25 chris.edgington ++Added some comments and did some simple reformatting in preparation for code review. ++ ++Revision 1.24 2001/10/25 19:08:23 chris.edgington ++Reset cell counter when initializing reassembler. ++ ++Revision 1.23 2001/10/15 17:00:46 chris.edgington ++Fixed CRC problem on outgoing packets - CRC stored in trailer had to be negated before storing! ++ ++Revision 1.22 2001/10/12 22:38:04 chris.edgington ++Added more debug output. ++ ++Revision 1.21 2001/10/09 15:12:41 chris.edgington ++Updated to reflect new buffer field names. ++ ++Revision 1.20 2001/10/05 16:07:28 chris.edgington ++Added more debug output. ++Removed endian translations on packet fields - we're already big-endian and that's what network-byte-order is. ++ ++Revision 1.19 2001/09/24 18:05:44 chris.edgington ++Removed include of multiple files, added single include of Adiutil.h. ++ ++Revision 1.18 2001/09/20 21:14:17 chris.edgington ++Fixed typo in one of the ZAPs. ++ ++Revision 1.17 2001/09/10 18:17:03 chris.edgington ++Changed UInt16 size parameters to UInt32. ++ ++Revision 1.16 2001/09/07 22:22:48 chris.edgington ++Aal5InitReassembler now gets a pointer to the full ATMUSB_BUFFER instead of just a pointer to the data buffer. ++ ++Revision 1.15 2001/09/07 19:33:46 chris.edgington ++Added more fields to keep better track of reassembly process. ++ ++Revision 1.14 2001/09/06 21:23:37 chris.edgington ++Made Aal5WritePadAndTrailer return the total cell count of the PDU, so the size can be calculated by the caller. ++ ++Revision 1.13 2001/09/05 20:43:35 chris.edgington ++Fixed Aal5ReassembleFinalCell to include the last DWORD in the CRC calculation, to match the NDIS code, which should result in a final calculated CRC of CRC_RESIDUE. ++ ++Revision 1.12 2001/09/04 22:30:30 chris.edgington ++A few cosmetic fixes. ++ ++Revision 1.11 2001/09/04 14:48:42 chris.edgington ++Added Aal5InitReassembler ++ ++Revision 1.10 2001/08/31 19:34:18 chris.edgington ++Fixed a few typos, file now compiles properly. ++ ++Revision 1.9 2001/08/31 15:08:39 chris.edgington ++Moved data definitions, constants, macros, and prototypes to header files. ++ ++Revision 1.8 2001/08/31 14:57:18 chris.edgington ++Changed memory manipulation calls to macros to make code more portable. ++ ++Revision 1.7 2001/08/30 22:37:51 chris.edgington ++Changed Aal5WritePadAndTrailer to use Aal5Trailer structure instead of raw buffer manipulation. ++Wrote Aal5ReassembleNonFinalCell and Aal5ReassembleFinalCell. ++ ++Revision 1.6 2001/08/30 20:27:35 chris.edgington ++Changed ZAPs to fit modified API. ++ ++Revision 1.5 2001/08/30 20:02:28 chris.edgington ++Renamed SarState to SarSegmenter. ++Added CellCount field and code for keeping it up to date. ++Some other minor reformatting and restructuring. ++ ++Revision 1.4 2001/08/30 19:18:42 chris.edgington ++Small optimization to Aal5Segment. Complete implementation of Aal5WritePadAndTrailer. ++ ++Revision 1.3 2001/08/30 16:01:31 chris.edgington ++Finished Aal5Segment. Added RunningCRC to SarSegmenter struct. ++ ++Revision 1.2 2001/08/29 22:16:21 chris.edgington ++Wrote Aal5InitSar and part of Aal5Segment. ++ ++Revision 1.1 2001/08/29 21:23:58 chris.edgington ++Initial version. ++******************************************************************************************/ +diff -urN x/drivers/usb/misc/eagle-usb/Sar.h y/drivers/usb/misc/eagle-usb/Sar.h +--- x/drivers/usb/misc/eagle-usb/Sar.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/Sar.h 2004-02-07 09:01:34.000000000 +1100 +@@ -0,0 +1,64 @@ ++/*************************************************************************************/ ++/* */ ++/* Sar.h */ ++/* */ ++/* Helper functions for AAL5 segmentation and reassembly. */ ++/* */ ++/* This file is part of the "ADI USB ADSL Driver for Linux". */ ++/* */ ++/* "ADI USB ADSL Driver for Linux" is free software; you can redistribute it */ ++/* and/or modify it under the terms of the GNU General Public License as */ ++/* published by the Free Software Foundation; either version 2 of the License, */ ++/* or (at your option) any later version. */ ++/* */ ++/* "ADI USB ADSL Driver for Linux" is distributed in the hope that it will be */ ++/* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of */ ++/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ ++/* GNU General Public License for more details. */ ++/* */ ++/* You should have received a copy of the GNU General Public License */ ++/* along with "ADI USB ADSL Driver for Linux"; if not, write to the Free Software */ ++/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ ++/*************************************************************************************/ ++ ++#ifndef __ADISAR_H__ ++#define __ADISAR_H__ ++ ++#include "eagle-usb.h" ++ ++#define ATM_CELL_PAYLOAD_SIZE 48 ++#define ATM_PT_AAL_INDICATE 2 ++#define ATM_CELL_REMOVE_GFC_MASK 0x00FFFFFF ++#define ATM_CELL_HEADER_PT_OFFSET 3 ++ ++#define CRC_RESIDUE 0xC704DD7B ++ ++extern void eu_aal5_seg_init ( ++ eu_sar_s_t *psar, ++ uint32_t pdu_length, ++ uint8_t *out_buff, ++ uint8_t *cell_hdr ++ ); ++ ++extern void eu_aal5_segment ( ++ eu_sar_s_t *psar, ++ uint8_t *buff, ++ uint32_t len ++ ); ++ ++extern void Aal5InitReassembler ( eu_sar_r_t *psar ); ++extern uint16_t eu_aal5_write_pad_and_trailer ( ++ eu_sar_s_t *psar, ++ uint8_t cpcs_uu, ++ uint8_t cpi ++ ); ++ ++extern void Aal5ReassembleFinalCell( ++ eu_sar_r_t *psar, ++ uint8_t *pCellPayload ++ ); ++extern void Aal5ReassembleNonFinalCell( ++ eu_sar_r_t *psar, ++ uint8_t *pCellPayload ++ ); ++#endif +diff -urN x/drivers/usb/misc/eagle-usb/Sm.c y/drivers/usb/misc/eagle-usb/Sm.c +--- x/drivers/usb/misc/eagle-usb/Sm.c 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/Sm.c 2004-07-01 06:32:02.000000000 +1000 +@@ -0,0 +1,1078 @@ ++/* ++ * ++ * Copyright (c) 2004, Frederick Ros (sl33p3r@free.fr) ++ * ++ * Sm.c (State Machine) ++ * ++ * ++ * This file is part of the eagle-usb driver package. ++ * ++ * eagle-usb driver package is free software; you can redistribute it ++ * and/or modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of the License, ++ * or (at your option) any later version. ++ * ++ * "eagle-usb driver package" is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with "ADI USB ADSL Driver for Linux"; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ * $Id: Sm.c,v 1.5 2004/06/30 20:32:02 sleeper Exp $ ++ */ ++ ++#include "Adiutil.h" ++#include "eu_sm.h" ++#include "eu_eth.h" ++#include "Cmv.h" ++#include "macros.h" ++#include "eu_utils.h" ++#include "eu_msg.h" ++#include "Me.h" ++#include "debug.h" ++#include "eu_boot_sm.h" ++#ifdef LINUX_2_4 ++#include ++#elif defined(LINUX_2_6) ++#include ++#else ++#warning "Unsupported version" ++#endif ++ ++#define RESET_TIMER(_TIMEOUT_) pAdiSM->ModemReplyExpected = MP_FUNCTION_TYPE_WAITING_4_REPLY; \ ++ SetTimerInterval(ins,_TIMEOUT_); ++ ++#define ENDCASE SetTimerInterval(ins,TRANS_TIME_50MSEC_PAUSE); break; ++ ++#define OPER_CHECK_FREQ 3 ++#define OPER_CHECK_FREQ_DETAIL 0xF ++ ++#define LOS_DEFECT_RETRAIN_THRESHOLD 2 /* about 1 */ ++#define CRC_RETRAIN_THRESHOLD 4 /* about 10 secs of continuous CRC to cause retrain */ ++ ++ ++#define RETRY_LIMIT 10 ++#define MAX_IDLE_COUNT 100 ++#define RETRAIN_ATTEMPTS 160 ++ ++ ++/* quasi-functions to force beginning of SM reset */ ++/* actual processing would happen when timer expires*/ ++#define TimerResetModemSM SetTimerInterval(ins,TRANS_TIME_2_BEGINRESET); \ ++ ResetModemSM(pAdiSM); ++ ++#ifdef LINUX_2_4 ++static struct tq_struct eth_create_cb = { ++ routine: eu_eth_create, ++}; ++#endif ++ ++ ++/***************************************************************/ ++/* */ ++/* ModemSM.C */ ++/* */ ++/* Contains functions to maintain State Machine for ADI modem. */ ++/* */ ++/* Rewrite for MAC OS, 09/2001 */ ++/* */ ++/***************************************************************/ ++void ModemSM(UInt16 uEventCode, eu_instance_t *ins, void *pData) ++{ ++ UInt32 DspStatus; ++ eu_msg_t *pMsg = (eu_msg_t *) pData; ++ AdiMSM* pAdiSM = &(ins->AdiModemSm); ++ UInt16 tmpState = pAdiSM->CurrentAdiState; ++ ++ dbg (DBG_SM,"Entering SM : current state is 0x%x\n" ++ " new event is 0x%x\n", ++ tmpState,uEventCode); ++ ++ ++ /* first of all, see if we are dead forever*/ ++ if ( tmpState == STATE_STALLED_FOREVER ) ++ { ++ dbg (DBG_SM, "SM: STALLED FOREVER\n"); ++ CancelTimerSM(ins); ++ goto ExitSM; ++ } ++ ++ /* check for bad conditions (should not happen, though)*/ ++ if (pData == NULL && ++ ( uEventCode != EVENT_HARD_RESET && uEventCode != EVENT_TIMER_TICK ) ) ++ { ++ eu_err ("**** NULL data ptr in SM!!! ****\n"); ++ ++ goto ExitSM; ++ } ++ ++ /* keep current event code*/ ++ pAdiSM->ModemReplyExpected = uEventCode; ++ ++ /* cancel the timer*/ ++ CancelTimerSM(ins); ++ ++ /* in *all* cases EVENT_HARD_RESET is procesed the same way*/ ++ if (uEventCode == EVENT_HARD_RESET ) ++ { ++ eu_dbg (DBG_SM,"SM: HARD RESET requested\n"); ++ ++ tmpState = STATE_UNDEFINED; /* will fall thru default case */ ++ } ++ ++ switch( tmpState ) ++ { ++ case STATE_HARD_RESET_INITIATE: ++ if (uEventCode == EVENT_TIMER_TICK ) ++ { ++ eu_dbg (DBG_SM,"SM: HARD RESET INITIATED!\n"); ++ ++ /* clear all mailbox flags*/ ++ pAdiSM->OutboundPending = FALSE; ++ pAdiSM->InboundAsyncPending = FALSE; ++ pAdiSM->InboundSyncPending = FALSE; ++ ++ /* CLEAN UP some vars (will review later - IIDos)*/ ++ pAdiSM->LOS_count = 0; ++ pAdiSM->CRC_count = 0; ++ pAdiSM->XferRate0 = 0; ++ pAdiSM->FwRxTimeout = 0; ++ ++ pAdiSM->stats_Ne_Fast_Lod_Failure = FALSE; ++ pAdiSM->stats_Ne_Fast_Hec_Failure = FALSE; ++ ++ /* set timer watchdog to quite a few seconds for that*/ ++ SetTimerInterval(ins,TRANS_TIME_4_RESETINIT); ++ /* clear control var to allow timer reset*/ ++ pAdiSM->ModemReplyExpected = MP_FUNCTION_TYPE_WAITING_4_REPLY; ++ ++ /* execute machine boot in rebooting mode*/ ++ ins->boot_state = REBOOT; ++ EU_SCHEDULE ( &ins->boot_sm); ++ ++ /* the last step of BootMachine will: */ ++ /* load main page; */ ++ /* set state to STATE_BOOT_WAIT; */ ++ /* set timer interval to TRANS_TIME_4_BOOTWAIT secs.*/ ++ } ++ else ++ { ++ eu_dbg (DBG_SM,"SM: HARD RESET REQUEST at int time, re-posting the request.\n"); ++ ++ /* set timer watchdog to complete RESET after a few msecs*/ ++ SetTimerInterval(ins,TRANS_TIME_HEARTBEAT); ++ } ++ break; ++ case STATE_HARD_RESET_END: ++ /* this step will never actually happens,*/ ++ /* it is hidden in BootMachine - step 5 */ ++ break; ++ ++ case STATE_BOOT_STAGE_1: ++ /* ++ If we're here from a timer tick, we can call ++ the required function ++ */ ++ if ( uEventCode == EVENT_TIMER_TICK ) ++ { ++ ins->boot_state = STAGE_1; ++ EU_SCHEDULE ( &ins->boot_sm ); ++ } ++ break; ++ ++ case STATE_BOOT_STAGE_2: ++ /* ++ If we're here from a timer tick, we can call ++ the required function ++ */ ++ if ( uEventCode == EVENT_TIMER_TICK ) ++ { ++ ins->boot_state = STAGE_2; ++ EU_SCHEDULE ( &ins->boot_sm ); ++ } ++ ++ break; ++ ++ case STATE_BOOT_STAGE_3: ++ /* ++ If we're here from a timer tick, we can call ++ the required function ++ */ ++ if ( uEventCode == EVENT_TIMER_TICK ) ++ { ++ ins->boot_state = STAGE_3; ++ EU_SCHEDULE ( &ins->boot_sm ); ++ } ++ break; ++ ++ ++ case STATE_BOOT_WAIT: ++ switch( uEventCode ) ++ { ++ default: ++ case EVENT_RX_SYNC_ERROR: ++ eu_dbg (DBG_SM, "*********** FFD >>>> EVENT_RX_SYNC_ERROR(3) => RESTE.\n"); ++ ++ /// FFDTEST : FFD020303 ++ TimerResetModemSM; ++ break; ++ case EVENT_RX_ASYNC_ERROR: ++ // By Mani /////////////////////////////////////// ++ //TimerResetModemSM; // ++ ////////////////////////////////////////////////// ++ break; ++ case EVENT_RX_ASYNC: ++ /* Original code does not check for MODEM_READY*/ ++ if (pMsg->type == MP_FUNCTION_TYPE_ADSLDIRECTIVE ) ++ { ++ /* FROM ORIGINAL ADI CODE -- */ ++ /* we need to check if the modem is in modem or kernel mode*/ ++ /* sometimes the modem wakes up in kernel mode (why?). */ ++ /* when this happens, we request modem mode & reboot. */ ++ if (pMsg->subtype == SUBTYPE_ADSLDIRECTIVE_MODEMREADY ) ++ { ++ eu_dbg (DBG_SM,"MODEM READY alert received, starting State Machine.\n"); ++ ++ /* set small delay before it */ ++ SetTimerInterval(ins,TRANS_TIME_BOOTWAIT_2_UNTRAIN); ++ /* advance to next state*/ ++ pAdiSM->CurrentAdiState = STATE_UNTRAIN; ++ ++ /* clear heartbeat counter before proceeding*/ ++ pAdiSM->HeartbeatCounter = 0; ++ ++ break; ++ } ++ else ++ { ++ if (pMsg->subtype == SUBTYPE_ADSLDIRECTIVE_KERNELREADY ) ++ { ++ eu_dbg (DBG_SM,"KERNEL READY alert received unexpectedly!\n"); ++ ++ TimerResetModemSM; ++ break; ++ } ++ } ++ } ++ case EVENT_TIMER_TICK: ++ eu_dbg (DBG_SM,"BOOT_WAIT going to HARD_RESET\n"); ++ ++ TimerResetModemSM; ++ break; ++ } ++ break; ++ case STATE_UNTRAIN: ++ pAdiSM->RetryCount = 0; ++ pAdiSM->MsgStage = 0; ++ case STATE_UNTRAIN_TX: ++ /* this stage shall execute only on timer tick trigger*/ ++ if (uEventCode == EVENT_TIMER_TICK ) ++ { ++ eu_dbg (DBG_SM,"UNTRAIN\n"); ++ ++ ++ /* send out the beginning of the sequence from stage 0*/ ++ eu_send_msg(ins, pAdiSM->MsgSeq_Retrainer.MsgMax.RawCmd[pAdiSM->MsgStage]); ++ ++ /* prepare watchdog timer*/ ++ RESET_TIMER(TRANS_TIME_4_UNTRAIN); ++ ++ /* next progress will depend on timely replies from modem*/ ++ pAdiSM->CurrentAdiState = STATE_UNTRAIN_RX; ++ } ++ break; ++ case STATE_UNTRAIN_RX: ++ /* continuation of UNTRAIN, goes when modem confirms CMV*/ ++ if ( uEventCode == EVENT_RX_SYNC ) ++ { ++ eu_dbg (DBG_SM,"UNTRAIN_RX stage %i complete\n",pAdiSM->MsgStage); ++ ++ /* send next command to untrain*/ ++ eu_send_msg(ins, pAdiSM->MsgSeq_Retrainer.MsgMax.RawCmd[++pAdiSM->MsgStage]); ++ ++ /* prepare watchdog timer*/ ++ RESET_TIMER(TRANS_TIME_4_UNTRAIN); ++ ++ /* if it is the last, make transition*/ ++ if (pAdiSM->MsgStage+1 >= pAdiSM->MsgSeq_Retrainer.MsgCount ) ++ { ++ pAdiSM->CurrentAdiState = STATE_INITIALIZING; ++ } ++ } ++ else ++ { ++ if (uEventCode == EVENT_RX_SYNC_ERROR ) ++ { ++ eu_dbg (DBG_SM,"RxSyncError - retrying UNTRAIN\n"); ++ ++ /* set wait time for the retry*/ ++ SetTimerInterval(ins,TRANS_TIME_B4_UNTRAIN); ++ /* Idle state - no CO detected, retry again*/ ++ pAdiSM->CurrentAdiState = STATE_UNTRAIN_TX; ++ /* do not retry infinitely*/ ++ if ( pAdiSM->RetryCount++ > RETRY_LIMIT ) ++ ResetModemSM(pAdiSM); ++ } ++ } ++ break; ++ case STATE_INITIALIZING: ++ pAdiSM->RetryCount = 0; ++ pAdiSM->MsgStage = 0; ++ pAdiSM->ReTrain = 0; ++ case STATE_INITIALIZING_TX: ++ /* if it is smooth continuation from UNTRAIN, it is on SYNC*/ ++ /* otherwise, may be transition from mid-sequence on timer */ ++ if (pAdiSM->MsgStage < MAX_IDLE_COUNT && ++ (uEventCode == EVENT_RX_SYNC || uEventCode == EVENT_TIMER_TICK )) ++ { ++ eu_dbg (DBG_SM,"INITIALIZING\n"); ++ ++ /* send the only one CMV to initialize*/ ++ eu_send_msg(ins, pAdiSM->MsgSeq_Stat.MsgMax.RawCmd[0]); ++ ++ /* prepare watchdog timer*/ ++ RESET_TIMER(TRANS_TIME_4_INITIALIZE); ++ ++ /* we know there's only one command in STAT*/ ++ pAdiSM->CurrentAdiState = STATE_INITIALIZING_RX; ++ } ++ else ++ { ++ TimerResetModemSM; ++ } ++ break; ++ case STATE_INITIALIZING_RX: ++ if (uEventCode == EVENT_RX_SYNC) ++ { ++ /* WE DO NOT CHECK FOR POINTER HERE - */ ++ /* WE TRUST OUR CODE WILL NEVER DO BAD THING!*/ ++ DspStatus = (pMsg->data&STAT_SW_MASK)>>STAT_SW_LSB; ++ ++ switch( DspStatus ) ++ { ++ /* ----------------- SUCCESS! */ ++ case STAT_SW_OPERATIONAL: ++ eu_dbg (DBG_SM,"INIT DspStatus = STAT_SW_OPERATIONAL\n"); ++ ++ /* Need to reenable ADSL traffic in the FPGA*/ ++ if (pAdiSM->HeartbeatCounter == 0 ) ++ eu_cmd_to_modem(ins, EU_CMD_SET_MODE, MODE_LOOPBACK_OFF, 0, NULL); ++ ++ /* set wait time for transition*/ ++ SetTimerInterval(ins,TRANS_TIME_B4_OPERATIONAL); ++ /* this is success!*/ ++ pAdiSM->CurrentAdiState = STATE_OPERATIONAL; ++ eu_report ( "Modem operational !!\n"); ++ break; ++ ++ /* ----------------- fast retrain for G.Lite modes*/ ++ case STAT_SW_FASTRETRAIN: ++ eu_dbg (DBG_SM,"INIT DspStatus = STAT_SW_FASTRETRAIN\n"); ++ ++ /* set wait time for the retry*/ ++ SetTimerInterval(ins,TRANS_TIME_B4_FASTRETRAIN); ++ /* Fast retrain is enabled for this modem*/ ++ pAdiSM->CurrentAdiState = STATE_FAST_RETRAIN; ++ break; ++ ++ /* ----------------- can stay forever in this state, if line not connected*/ ++ case STAT_SW_R_ACT_REQ: ++ eu_dbg (DBG_SM,"INIT DspStatus = STAT_SW_R_ACT_REQ\n"); ++ ++ /* set wait time for the retry*/ ++ SetTimerInterval(ins,TRANS_TIME_B4_INITIALIZE); ++ /* Idle state - no CO detected, retry again*/ ++ pAdiSM->CurrentAdiState = STATE_INITIALIZING_TX; ++ /* keep track of retry attempts*/ ++ pAdiSM->MsgStage++; ++ break; ++ ++ /* ----------------- retry INIT (for how long?)*/ ++ case STAT_SW_INITIALIZATION: ++ eu_dbg (DBG_SM,"INIT DspStatus = STAT_SW_INITIALIZATION\n"); ++ ++ /* if training had taken too long, fall thru RESET*/ ++ if ( ++pAdiSM->ReTrain < RETRAIN_ATTEMPTS ) ++ { ++ /* set wait time for the retry*/ ++ SetTimerInterval(ins,TRANS_TIME_B4_INITIALIZE); ++ /* keep on initializing for a while*/ ++ pAdiSM->CurrentAdiState = STATE_INITIALIZING_TX; ++ break; ++ } ++ ++ /* ----------------- invoke RESET*/ ++ case STAT_SW_FAIL: ++ case STAT_SW_TESTSIGNAL: ++ case STAT_SW_TESTHW: ++ default: ++ eu_dbg (DBG_SM,"SM: INIT DspStatus = %x to RESET\n", DspStatus); ++ ++ TimerResetModemSM; ++ } ++ } ++ else ++ { ++ if (uEventCode == EVENT_RX_SYNC_ERROR ) ++ { ++ eu_dbg (DBG_SM,"RxSyncError - retrying INIT\n"); ++ ++ /* set wait time for the retry*/ ++ SetTimerInterval(ins,TRANS_TIME_B4_INITIALIZE); ++ /* Idle state - no CO detected, retry again*/ ++ pAdiSM->CurrentAdiState = STATE_INITIALIZING_TX; ++ /* do not retry infinitely*/ ++ if (pAdiSM->RetryCount++ > RETRY_LIMIT ) ++ ResetModemSM(pAdiSM); ++ } ++ } ++ break; ++ case STATE_EN_FASTTRAIN: ++ pAdiSM->RetryCount = 0; ++ pAdiSM->MsgStage = 0; ++ pAdiSM->ReTrain = 0; ++ case STATE_EN_FASTTRAIN_TX: ++ if ( uEventCode == EVENT_TIMER_TICK ) ++ { ++ eu_dbg (DBG_SM,"EN_FAST_RETRAIN - Warning!!! ****\n"); ++ ++ ++ /* send the only one CMV to initialize*/ ++ eu_send_msg(ins, pAdiSM->MsgSeq_EnaFR.MsgMax.RawCmd[0]); ++ ++ /* prepare watchdog timer*/ ++ RESET_TIMER(TRANS_TIME_4_ENAFAST); ++ ++ /* we know there's only one command in STAT*/ ++ pAdiSM->CurrentAdiState = STATE_EN_FASTTRAIN_RX; ++ } ++ break; ++ case STATE_EN_FASTTRAIN_RX: ++ if (uEventCode == EVENT_RX_SYNC) ++ { ++ eu_dbg (DBG_SM,"EN_FAST_RETRAIN accepted\n"); ++ ++ /* set wait time for the retry*/ ++ SetTimerInterval(ins,TRANS_TIME_B4_FASTRETRAIN); ++ /* then fast retrain may begin*/ ++ pAdiSM->CurrentAdiState = STATE_FAST_RETRAIN; ++ } ++ else ++ { ++ if ( uEventCode == EVENT_RX_SYNC_ERROR ) ++ { ++ eu_dbg (DBG_SM,"RxSyncError - retrying EN_FASTTRAIN\n"); ++ ++ /* set wait time for the retry*/ ++ SetTimerInterval(ins,TRANS_TIME_B4_ENAFAST); ++ /* Idle state - no CO detected, retry again*/ ++ pAdiSM->CurrentAdiState = STATE_EN_FASTTRAIN_TX; ++ /* do not retry infinitely*/ ++ if (pAdiSM->RetryCount++ > RETRY_LIMIT) ++ ResetModemSM(pAdiSM); ++ } ++ } ++ break; ++ case STATE_FAST_RETRAIN: ++ pAdiSM->RetryCount = 0; ++ pAdiSM->MsgStage = 0; ++ pAdiSM->ReTrain = 0; ++ case STATE_FAST_RETRAIN_TX: ++ /* this stage shall execute only on timer tick trigger, identical to INIT*/ ++ if (uEventCode == EVENT_TIMER_TICK) ++ { ++ eu_dbg (DBG_SM,"FAST RETRAIN BEGINS\n"); ++ ++ /* send the only one CMV to check status*/ ++ eu_send_msg(ins, pAdiSM->MsgSeq_Stat.MsgMax.RawCmd[0]); ++ ++ /* prepare watchdog timer*/ ++ RESET_TIMER(TRANS_TIME_4_FASTRETRAIN); ++ ++ /* we know there's only one command in STAT*/ ++ pAdiSM->CurrentAdiState = STATE_FAST_RETRAIN_RX; ++ } ++ else ++ { ++ TimerResetModemSM; ++ } ++ break; ++ case STATE_FAST_RETRAIN_RX: ++ if (uEventCode == EVENT_RX_SYNC) ++ { ++ /* WE DO NOT CHECK FOR POINTER HERE - */ ++ /* WE TRUST OUR CODE WILL NEVER DO BAD THING!*/ ++ DspStatus = (pMsg->data&STAT_SW_MASK)>>STAT_SW_LSB; ++ ++ switch( DspStatus ) ++ { ++ /* ----------------- SUCCESS!*/ ++ case STAT_SW_OPERATIONAL: ++ eu_dbg (DBG_SM,"FAST DspStatus = STAT_SW_OPERATIONAL\n"); ++ ++ /* set wait time for transition*/ ++ SetTimerInterval(ins,TRANS_TIME_B4_OPERATIONAL); ++ /* this is success!*/ ++ pAdiSM->CurrentAdiState = STATE_OPERATIONAL; ++ eu_err ("Modem operational\n"); ++ break; ++ ++ /* ----------------- retry INIT*/ ++ case STAT_SW_INITIALIZATION: ++ eu_dbg (DBG_SM,"FAST DspStatus = STAT_SW_INITIALIZATION\n"); ++ ++ /* set wait time for the retry*/ ++ SetTimerInterval(ins,TRANS_TIME_B4_INITIALIZE); ++ /* Idle state - no CO detected, retry again*/ ++ pAdiSM->CurrentAdiState = STATE_INITIALIZING; ++ break; ++ ++ /* ----------------- keep on retraining (for how long?)*/ ++ case STAT_SW_FASTRETRAIN: ++ eu_dbg (DBG_SM,"FAST DspStatus = STAT_SW_FASTRETRAIN\n"); ++ ++ /* if training had taken too long, fall thru RESET*/ ++ if (++pAdiSM->ReTrain < RETRAIN_ATTEMPTS) ++ { ++ /* set wait time for the retry*/ ++ SetTimerInterval(ins,TRANS_TIME_B4_FASTRETRAIN); ++ /* Idle state - no CO detected, retry again*/ ++ pAdiSM->CurrentAdiState = STATE_FAST_RETRAIN_TX; ++ break; ++ } ++ ++ /* ----------------- invoke RESET*/ ++ case STAT_SW_R_ACT_REQ: ++ case STAT_SW_FAIL: ++ case STAT_SW_TESTSIGNAL: ++ case STAT_SW_TESTHW: ++ default: ++ eu_dbg (DBG_SM,"FAST DspStatus = %x to RESET\n", DspStatus); ++ ++ TimerResetModemSM; ++ } ++ } ++ else ++ { ++ if (uEventCode == EVENT_RX_SYNC_ERROR) ++ { ++ eu_dbg (DBG_SM,"RxSyncError - retrying FAST\n"); ++ ++ /* set wait time for the retry*/ ++ SetTimerInterval(ins,TRANS_TIME_B4_FASTRETRAIN); ++ /* Idle state - no CO detected, retry again*/ ++ pAdiSM->CurrentAdiState = STATE_FAST_RETRAIN_RX; ++ /* do not retry infinitely*/ ++ if (pAdiSM->RetryCount++ > RETRY_LIMIT) ++ ResetModemSM(pAdiSM); ++ } ++ } ++ break; ++ case STATE_KERNEL: ++ case STATE_KERNEL_TX: ++ case STATE_KERNEL_RX: ++ eu_dbg (DBG_SM,"KERNEL state\n"); ++ ++ TimerResetModemSM; ++ break; ++ case STATE_TEST: ++ case STATE_TEST_TX: ++ case STATE_TEST_RX: ++ eu_dbg (DBG_SM,"TEST state\n"); ++ ++ TimerResetModemSM; ++ break; ++ case STATE_OPERATIONAL: ++ /* check if we're getting to OPER from some other state*/ ++ if ( (pAdiSM->PrevAdiState&0xFFF0) != STATE_OPERATIONAL ) ++ { ++ /* prepare this special start value!*/ ++ pAdiSM->MsgStage = pAdiSM->MsgSeq_OpStat.MsgCount; ++ ++ pAdiSM->LOS_count = 0; ++ pAdiSM->CRC_count = 0; ++ pAdiSM->Block_CRC90 = 0; ++ pAdiSM->Block_CRC97 = 0; ++ pAdiSM->stats_Rx_Blks = 0; ++ pAdiSM->stats_Corr_Blks = 0; ++ pAdiSM->stats_Uncorr_Blks = 0; ++ pAdiSM->stats_Uncorr_Blks_Delta = 0; ++ pAdiSM->watchBadBlocks = FALSE; ++ eu_dbg (DBG_SM,"*** Transition to OPER state successful! ***\n"); ++ ++ wake_up_interruptible(&ins->sync_q); ++ } ++ ++ /* This case is built around timer tick. */ ++ /* From time to time, heavy OpSTAT sequence is sent out. */ ++ /* more often, it goes to light Stat to recheck the status.*/ ++ if (uEventCode == EVENT_TIMER_TICK) ++ { ++ /* no command will be sent if anything is under way*/ ++ if ( pAdiSM->MsgStage >= pAdiSM->MsgSeq_OpStat.MsgCount ) ++ { ++ eu_dbg (DBG_SM,"Starting OPER stat sequence\n"); ++ ++ /* set the stage for the Stat sequence*/ ++ pAdiSM->MsgStage = 0; ++ /* begin transmission*/ ++ eu_send_msg(ins, pAdiSM->MsgSeq_OpStat.MsgMax.RawCmd[pAdiSM->MsgStage]); ++ /* clear retry counter*/ ++ pAdiSM->RetryCount = 0; ++ /* prepare watchdog timer*/ ++ RESET_TIMER(TRANS_TIME_B4_OPSTAT); ++ /* continue w/ reading the first stat*/ ++ pAdiSM->CurrentAdiState = STATE_OPERATIONAL_RX; ++ } ++ /* increment the global counter*/ ++ pAdiSM->HeartbeatCounter++; ++ } ++ break; ++ case STATE_OPERATIONAL_TX: ++ if (uEventCode == EVENT_TIMER_TICK) ++ { ++ eu_dbg (DBG_SM,"OPER_TX stage %i\n",pAdiSM->MsgStage+1); ++ ++ /* send out CMV for the next stage*/ ++ eu_send_msg (ins, pAdiSM->MsgSeq_OpStat.MsgMax.RawCmd[++pAdiSM->MsgStage]); ++ /* prepare watchdog timer*/ ++ if (pAdiSM->MsgStage != 0 && ++ pAdiSM->MsgStage < pAdiSM->MsgSeq_OpStat.MsgCount-1) ++ { ++ RESET_TIMER(TRANS_TIME_4_OPSTAT); ++ } ++ else ++ { ++ RESET_TIMER(TRANS_TIME_B4_OPSTAT); ++ } ++ /* set the new state*/ ++ pAdiSM->CurrentAdiState = STATE_OPERATIONAL_RX; ++ } ++ break; ++ case STATE_OPERATIONAL_RX: ++ if (uEventCode == EVENT_RX_SYNC) ++ { ++ /* clear retry counter*/ ++ pAdiSM->RetryCount = 0; ++ /* get ready for the next transmission*/ ++ pAdiSM->CurrentAdiState = STATE_OPERATIONAL_TX; ++ ++ eu_dbg (DBG_SM,"OPER_RX processing stage %i\n",pAdiSM->MsgStage); ++ ++ ++ switch( pAdiSM->MsgStage ) ++ { ++ /* Actual examination of the returned values must be done here*/ ++ case 0: /* STAT.status*/ ++ pAdiSM->sw_status = (pMsg->data&STAT_SW_MASK)>>STAT_SW_LSB; ++ pAdiSM->crc_status = (pMsg->data&STAT_CRC_MASK)>>STAT_CRC_LSB; ++ ENDCASE; ++ case 1: /* DIAG.flags (DIAG.1)*/ ++ pAdiSM->flags = pMsg->data; ++ ++ switch( pAdiSM->sw_status ) ++ { ++ /* ----------------- invoke RESET for all other values*/ ++ case STAT_SW_FAIL: ++ case STAT_SW_TESTSIGNAL: ++ case STAT_SW_TESTHW: ++ default: ++ eu_dbg (DBG_SM,"OPSTAT step1 to RESET\n"); ++ ++ TimerResetModemSM; ++ break; ++ /* ----------------- go to INIT, nevermind it's not in the diagram*/ ++ case STAT_SW_R_ACT_REQ: ++ case STAT_SW_INITIALIZATION: ++ eu_dbg (DBG_SM,"OPSTAT step1 to INIT\n"); ++ ++ /* set wait time for the retry*/ ++ SetTimerInterval(ins,TRANS_TIME_B4_INITIALIZE); ++ /* Idle state - no CO detected, retry again*/ ++ pAdiSM->CurrentAdiState = STATE_INITIALIZING_TX; ++ break; ++ /* ----------------- go to FAST RETRAIN for G.Lite modes*/ ++ case STAT_SW_FASTRETRAIN: ++ eu_dbg (DBG_SM,"SM: OPSTAT step1 to FASTRETRAIN\n"); ++ ++ /* set wait time for the retry*/ ++ SetTimerInterval(ins,TRANS_TIME_B4_FASTRETRAIN); ++ /* Idle state - no CO detected, retry again*/ ++ pAdiSM->CurrentAdiState = STATE_FAST_RETRAIN; ++ break; ++ case STAT_SW_OPERATIONAL: ++ eu_dbg (DBG_SM,"OPSTAT step1 is OPERATIONAL\n"); ++ ++ /* check CRC detect flag*/ ++ if ((pAdiSM->flags & ++ (DIAG_FLAGS_NEFASTCRC_MASK|DIAG_FLAGS_NEINTLCRC_MASK) ) != 0) ++ { ++ ++ if (++pAdiSM->CRC_count >= CRC_RETRAIN_THRESHOLD) ++ { ++ eu_dbg (DBG_SM,"OPSTAT step1 CRC thresh RESET\n"); ++ ++ eu_err("CRC count treshold reached. Rebooting\n"); ++ ResetModemSM(pAdiSM); ++ } ++ } ++ else ++ { ++ /* crc status back to normal, reset the count */ ++ pAdiSM->CRC_count = 0; ++ } ++ /* check for LOS_defect flag */ ++ if ((pAdiSM->flags & DIAG_FLAGS_NELOSDEFECT_MASK) != 0) ++ { ++ eu_err (" SM: LOS Defect\n"); ++ if (++pAdiSM->LOS_count >= LOS_DEFECT_RETRAIN_THRESHOLD) ++ { ++ eu_dbg (DBG_SM,"OPSTAT step1 LOS thresh RESET\n"); ++ ++ eu_report ("LOS Defect threshold reached. Rebooting\n"); ++ ResetModemSM(pAdiSM); ++ ++ } ++ } ++ else ++ { ++ /* reset the LOS count as the line is ok */ ++ pAdiSM->LOS_count = 0; ++ } ++ /* added check for ratio of bad/good blocks*/ ++ if ( pAdiSM->watchBadBlocks ) ++ { ++ if ( pAdiSM->stats_Rx_Blks_Delta != 0 ) ++ { ++ /* no need to go digital on ratio calcs, we can use hex*/ ++ int BadGoodRatio = (pAdiSM->stats_Uncorr_Blks_Delta<<8) / ++ pAdiSM->stats_Rx_Blks_Delta; ++ ++ eu_dbg (DBG_SM," Cycle %i, bad/good ratio is %i, cnt90/97=(%i,%i)\n", ++ pAdiSM->HeartbeatCounter,BadGoodRatio, ++ pAdiSM->Block_CRC90,pAdiSM->Block_CRC97); ++ ++ /* if bad/good ratio is 98% or more*/ ++ if (BadGoodRatio > 250) ++ { ++ /* if this is second consequtive time (6 secs)*/ ++ if (++pAdiSM->Block_CRC97 >= 1) ++ { ++ ++ eu_report("97th Rx err threshold reached. Rebooting\n"); ++ ++ ResetModemSM(pAdiSM); ++ ++ } ++ } ++ else ++ { ++ /* clear ultra hi-err counter*/ ++ pAdiSM->Block_CRC97 = 0; ++ ++ /* check for error ratio of 90% or more*/ ++ if (BadGoodRatio > 230) ++ { ++ /* for 20 secs we're getting 90% bad, go to reset*/ ++ if (++pAdiSM->Block_CRC90 > 6) ++ { ++ eu_report ("90th Rx err threshold reached. Rebooting\n"); ++ ++ ResetModemSM(pAdiSM); ++ } ++ } ++ else ++ { ++ /* clear hi-err counter*/ ++ pAdiSM->Block_CRC90 = 0; ++ /* clear error watch flag*/ ++ pAdiSM->watchBadBlocks = FALSE; ++ } ++ } ++ } ++ } ++ ++ /* check & set for ATM Sync/Hunt status*/ ++ pAdiSM->stats_Ne_Fast_Lod_Failure = ++ pAdiSM->flags & DIAG_FLAGS_NEFASTLODFAIL_MASK; ++ ++ /* check for HEC errors*/ ++ pAdiSM->stats_Ne_Fast_Hec_Failure = ++ pAdiSM->flags & DIAG_FLAGS_NEFASTHECFAIL_MASK; ++ ++ SetTimerInterval(ins,TRANS_TIME_5MSEC_PAUSE); ++ } ++ break; ++ case 2: /* DIAG.near_end_total_ES_count (DIAG.22)*/ ++ pAdiSM->stats_ES_count = pMsg->data; ++ ++ if (pAdiSM->stats_ES_count > 20) ++ { ++ eu_dbg (DBG_SM,"OPSTAT step2 total ES count RESET\n"); ++ ++ /* if negative, certain error*/ ++ ++ } ++ ENDCASE; ++ case 3: /* DIAG.near_end_Current_Attenuation (DIAG.23)*/ ++ pAdiSM->stats_Cur_Atten = pMsg->data; ++ ENDCASE; ++ case 4: /* DIAG.near_end_Current_SNR_Margin (DIAG.25)*/ ++ pAdiSM->stats_Cur_SNR = pMsg->data; ++ if ((int)(pAdiSM->stats_Cur_SNR) < 0) ++ { ++ ++ eu_report ("SNR margin < 0 . Rebooting\n"); ++ /* if negative, certain error*/ ++ ResetModemSM(pAdiSM); ++ } ++ else ++ { ++ /* ++ if (pAdiSM->watchBadBlocks == FALSE && ++ (pAdiSM->HeartbeatCounter & OPER_CHECK_FREQ) != 0) ++ { ++ // rarified polls only if ADI monitor is NOT running ++ if (!ins->MonitoringApp) ++ { ++ // fast forward to last STAT ++ pAdiSM->MsgStage = pAdiSM->MsgSeq_OpStat.MsgCount-2; ++ } ++ } ++ */ ++ } ++ ENDCASE; ++ case 5: /* DIAG.near_end_Current_Rcvd_Blocks (DIAG.51)*/ ++ pAdiSM->stats_Rx_Blks_Delta = pMsg->data - pAdiSM->stats_Rx_Blks; ++ pAdiSM->stats_Rx_Blks = pMsg->data; ++ ENDCASE; ++ case 6: /* DIAG.near_end_Current_Xmitted_Blocks (DIAG.52)*/ ++ pAdiSM->stats_Tx_Blks = pMsg->data; ++ ENDCASE; ++ case 7: /* DIAG>near_end_Current_Corrected_Blocks (DIAG.53)*/ ++ pAdiSM->stats_Corr_Blks_Delta = pMsg->data - pAdiSM->stats_Corr_Blks; ++ pAdiSM->stats_Corr_Blks = pMsg->data; ++ ENDCASE; ++ case 8: /* DIAG.near_end_Current_Uncorr_Blocks (DIAG.54)*/ ++ /* if for two consequtive checks there's delta in err count, set watch on*/ ++ pAdiSM->watchBadBlocks |= (pAdiSM->stats_Uncorr_Blks_Delta!=0); ++ pAdiSM->stats_Uncorr_Blks_Delta = pMsg->data - pAdiSM->stats_Uncorr_Blks; ++ if (pAdiSM->stats_Uncorr_Blks_Delta == 0) ++ { ++ pAdiSM->Block_CRC90 = ++ pAdiSM->Block_CRC97 = 0; ++ pAdiSM->watchBadBlocks = FALSE; ++ } ++ pAdiSM->stats_Uncorr_Blks = pMsg->data; ++ ENDCASE; ++ case 9: /* RATE.actual*/ ++ pAdiSM->XferRate0 = pMsg->data; ++ pAdiSM->DownRate = (pMsg->data>>16) *32*1024; ++ pAdiSM->UpRate = (pMsg->data&0xFFFF) *32*1024; ++ ++ if ( !EU_TEST_FLAG(ins,EU_LOW_RATE) ) ++ { ++ if (pAdiSM->DownRate < (1024*1024)) ++ { ++ eu_err (" **** LOW LINE RATE (0x%x) ****\n",pAdiSM->DownRate); ++ eu_cmd_to_modem(ins, EU_CMD_SET_TIMEOUT, 0, 0, NULL); ++ } ++ else ++ { ++ eu_err ("***** HIGH LINE RATE (0x%x) *****\n", pAdiSM->DownRate); ++ ++ eu_cmd_to_modem(ins, EU_CMD_SET_TIMEOUT, 0xFF, 0, NULL); ++ } ++ } ++ ++ EU_SET_FLAG (ins, EU_LOW_RATE); ++ ++ if (pAdiSM->FwRxTimeout != pAdiSM->XferRate0) ++ { ++ UInt32 threshold; ++ if (pAdiSM->DownRate <= 0x80 *32*1024) ++ { ++ threshold = 0xB000; ++ } ++ else ++ { ++ threshold = 0xF000; ++ } ++ if (pAdiSM->FwRxTimeout != threshold) ++ { ++ pAdiSM->FwRxTimeout = threshold; ++ /**********************************************************************/ ++ /* We're getting an error -6912 back from the device */ ++ /* when we send this command. Waiting to hear back */ ++ /* from ADI about this, 'cause the NDIS code doesn't */ ++ /* actually send it. */ ++ /* eu_cmd_to_modemNoPB( ins, ADI_CMD_SET_TIMEOUT, threshold, 0, NULL );*/ ++ /* ADI says not to worry about this - hardware does */ ++ /* fine without having the driver set this value */ ++ /**********************************************************************/ ++ } ++ } ++ ENDCASE; ++ case 10: /* DIAG.3*/ ++ pAdiSM->DIAG03 = pMsg->data; ++/* ins->Statistics[STAT_ATMHEC] += pMsg->data; */ ++ ++ ENDCASE; ++ case 11: /* DIAG.47*/ ++ pAdiSM->DIAG47 = pMsg->data; ++ ENDCASE; ++ case 12: /* DIAG.49*/ ++ pAdiSM->DIAG49 = pMsg->data; ++ ENDCASE; ++ case 13: /* INFO.10*/ ++ pAdiSM->INFO10 = pMsg->data; ++ ENDCASE; ++ case 14: /* PSDM.1*/ ++ pAdiSM->PSDM01 = pMsg->data; ++ ENDCASE; ++ case 15: /* INFO.8*/ ++ pAdiSM->INFO08 = pMsg->data; ++ ENDCASE; ++ case 16: /* INFO.14*/ ++ pAdiSM->INFO14 = pMsg->data; ++ ENDCASE; ++ /* this is the quick stat poll - always the last in the sequence*/ ++ default: ++ DspStatus = (pMsg->data&STAT_SW_MASK)>>STAT_SW_LSB; ++ ++ switch (DspStatus) ++ { ++ /* ----------------- OPERATIONAL it remains!*/ ++ case STAT_SW_OPERATIONAL: ++ eu_dbg (DBG_SM,"OPER DspStatus = STAT_SW_OPERATIONAL\n"); ++ ++ /* set wait time for transition*/ ++/* SetTimerInterval(ins,TRANS_TIME_HEARTBEAT); */ ++ SetTimerInterval(ins,1000); ++ /* this is success!*/ ++ pAdiSM->CurrentAdiState = STATE_OPERATIONAL; ++ break; ++ /* ----------------- go to FAST RETRAIN for G.Lite modes*/ ++ case STAT_SW_FASTRETRAIN: ++ eu_dbg (DBG_SM,"OPER DspStatus = STAT_SW_FASTRETRAIN\n"); ++ ++ /* set wait time for the retry*/ ++ SetTimerInterval(ins,TRANS_TIME_B4_FASTRETRAIN); ++ /* Idle state - no CO detected, retry again*/ ++ pAdiSM->CurrentAdiState = STATE_FAST_RETRAIN; ++ break; ++ /* ----------------- go to INIT, nevermind it's not in the diagram*/ ++ case STAT_SW_R_ACT_REQ: ++ case STAT_SW_INITIALIZATION: ++ eu_dbg (DBG_SM,"OPER DspStatus = INIT/R_ACT_REQ\n"); ++ ++ /* set wait time for the retry*/ ++ SetTimerInterval(ins,TRANS_TIME_B4_INITIALIZE); ++ /* Idle state - no CO detected, retry again*/ ++ pAdiSM->CurrentAdiState = STATE_INITIALIZING_TX; ++ break; ++ /* ----------------- invoke RESET for all other values*/ ++ case STAT_SW_FAIL: ++ case STAT_SW_TESTSIGNAL: ++ case STAT_SW_TESTHW: ++ default: ++ eu_dbg (DBG_SM,"OPER DspStatus = %x to RESET\n", DspStatus); ++ TimerResetModemSM; ++ break; ++ } ++ pAdiSM->MsgStage = pAdiSM->MsgSeq_OpStat.MsgCount; ++ break; ++ } ++ } ++ else ++ { ++ if (uEventCode == EVENT_RX_SYNC_ERROR) ++ { ++ /* repeat the last stage - TX will auto-increment*/ ++ pAdiSM->MsgStage--; ++ /* set wait time for the retry*/ ++ SetTimerInterval(ins,TRANS_TIME_B4_OPERATIONAL); ++ /* retry the transmission*/ ++ pAdiSM->CurrentAdiState = STATE_OPERATIONAL_TX; ++ /* do not retry infinitely*/ ++ if (pAdiSM->RetryCount++ > RETRY_LIMIT) ++ ResetModemSM(pAdiSM); ++ } ++ } ++ break; ++ default: /* STATE_UNDEFINED et all*/ ++ eu_dbg (DBG_SM,"Error - undefined state!\n"); ++ TimerResetModemSM; ++ break; ++ } ++ ++ /* ++ * Create ethernet device if not present ++ */ ++ if ( ( ins->eth == NULL ) && ++ ( ! EU_TEST_FLAG (ins, EU_ETH_REGISTERING ) ) && ++ ( (pAdiSM->CurrentAdiState & 0xFFF0) == STATE_OPERATIONAL ) ) ++ { ++ EU_SET_FLAG (ins,EU_ETH_REGISTERING); ++ ++#ifdef LINUX_2_4 ++ INIT_TQUEUE (ð_create_cb, eu_eth_create, ins); ++ ++ if ( !schedule_task ( ð_create_cb ) ) ++#elif defined(LINUX_2_6) ++ /* ++ * Task queue have been removed in 2.6 in favor of workqueue ++ */ ++ if ( !schedule_work( &ins->create_eth) ) ++#else ++ #warning "Unsupported version" ++#endif ++ { ++ eu_err ("Sm: Scheduled net dev. creation dropped.\n"); ++ EU_CLEAR_FLAG (ins,EU_ETH_REGISTERING); ++ } ++ else ++ { ++ eu_dbg (DBG_SM,"Ethernet dev. creation scheduled.\n"); ++ } ++ ++ } ++ ++ ++ /* ++ * Add carrier sense information ++ */ ++ ++ if (ins->eth) ++ { ++ ++ if ( ( (pAdiSM->CurrentAdiState & 0xFFF0) == STATE_OPERATIONAL ) && ++ ( !netif_carrier_ok(ins->eth) ) ++ ) ++ { ++ eu_dbg (DBG_SM,"** Carrier ON ** \n"); ++ netif_carrier_on(ins->eth); ++ } ++ else if ( ( (tmpState & 0xFFF0) == STATE_OPERATIONAL ) && ++ ( ( pAdiSM->CurrentAdiState & 0xFFF0) != STATE_OPERATIONAL ) ++ ) ++ { ++ eu_dbg (DBG_SM,"** Carrier OFF **\n"); ++ ++ netif_carrier_off(ins->eth); ++ } ++ } ++ ++ ++ /* refresh previous state to be last known current one*/ ++ pAdiSM->PrevAdiState = tmpState; ++ ++ ExitSM: ++ eu_dbg (DBG_SM," New State is 0x%x\n",pAdiSM->CurrentAdiState); ++ eu_leaves (DBG_SM); ++} ++ ++ +diff -urN x/drivers/usb/misc/eagle-usb/Uni.c y/drivers/usb/misc/eagle-usb/Uni.c +--- x/drivers/usb/misc/eagle-usb/Uni.c 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/Uni.c 2004-07-01 06:32:02.000000000 +1000 +@@ -0,0 +1,639 @@ ++/***********************************************************************************/ ++/* $Id: Uni.c,v 1.2 2004/06/30 20:32:02 sleeper Exp $ */ ++/* */ ++/* Copyright (c) 2001, Analog Devices Inc., All Rights Reserved */ ++/* */ ++/* Uni.c */ ++/* */ ++/* UNI (User Network Interface) support module (similar to AtmUni.c from NDIS) */ ++/* */ ++/* This file is part of the "ADI USB ADSL Driver for Linux". */ ++/* */ ++/* "ADI USB ADSL Driver for Linux" is free software; you can redistribute it */ ++/* and/or modify it under the terms of the GNU General Public License as */ ++/* published by the Free Software Foundation; either version 2 of the License, */ ++/* or (at your option) any later version. */ ++/* */ ++/* "ADI USB ADSL Driver for Linux" is distributed in the hope that it will be */ ++/* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of */ ++/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ ++/* GNU General Public License for more details. */ ++/* */ ++/* You should have received a copy of the GNU General Public License */ ++/* along with "ADI USB ADSL Driver for Linux"; if not, write to the Free Software */ ++/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ ++/***********************************************************************************/ ++ ++#include "Adiutil.h" ++#include "Uni.h" ++#include "Pipes.h" ++#include "Sar.h" ++#include "debug.h" ++ ++extern Boolean CheckForAndProcessOAMCell(eu_instance_t *ins, UInt8 *pCell); ++ ++/**********************************************************************************/ ++/* IsPTICell */ ++/**********************************************************************************/ ++#define ATM_PTI_OAM_CELL 0x04 ++/* static int IsPTICell(UInt32 header) */ ++/* { */ ++/* return (((header >> 1) & ATM_PTI_OAM_CELL) == ATM_PTI_OAM_CELL); */ ++/* } */ ++#define IS_PTI_CELL(h) ((((h) >> 1) & ATM_PTI_OAM_CELL) == ATM_PTI_OAM_CELL) ++ ++/*********************************************************************************/ ++/* This will hold network packet data that is waiting to be sent back to */ ++/* the higher-level stack. Two queues of these will be maintained - a free */ ++/* queue and a waiting queue */ ++/*********************************************************************************/ ++#define ETHERNET_PACKET_Q_SIZE 64 ++#define ETHERNET_PACKET_DATA_SIZE 1536 ++ ++ ++/***********************************************************************************/ ++/* UniEstablishVc */ ++/* */ ++/* Allocates memory for and initializes our Vc (virtual channel, virtual circuit) */ ++/* for this session. Real ATM allows multiple Vc's per Uni, but it seems that */ ++/* there are no circumstances at this point that will require more than one */ ++/* Vc in this driver. So, we don't do all the extra logic of managing multiple */ ++/* Vc's. */ ++/***********************************************************************************/ ++void eu_uni_establish_vc ( ++ eu_instance_t *ins, ++ uint8_t *encap_hdr, ++ uint32_t encap_size, ++ uint32_t vpi, ++ uint32_t vci ++ ) ++{ ++ eu_enters (DBG_UNI); ++ ++ ++ /* ++ * Initialize the various fields of the VC ++ */ ++ ins->Vc.encaps_hdr = encap_hdr; ++ ins->Vc.encaps_size = encap_size; ++ ins->Vc.vpi = vpi; ++ ins->Vc.vci = vci; ++ ins->Vc.vpi_vci = (ins->Vc.vpi<<16) | ins->Vc.vci; ++ ins->Vc.max_sdu_size = (OUTGOING_DATA_SIZE / ATM_CELL_SIZE) * ATM_CELL_PAYLOAD_SIZE; ++ ins->Vc.reassembly_ipg = FALSE; ++ ++ /* ++ * NDIS4 code always sets these to 0 ++ */ ++ ins->Vc.cpcs_uu = 0; ++ ins->Vc.cpi = 0; ++ ++ /* ++ * This came straight from the NDIS4 code. Build Cell Header ++ */ ++ ++ ins->Vc.cell_hdr[0] = (uint8_t)( ( 0 << 4) | ((ins->Vc.vpi & 0xF0) >> 4)); ++ ins->Vc.cell_hdr[1] = (uint8_t)( (ins->Vc.vpi << 4) | ((ins->Vc.vci & 0xF000) >> 12)); ++ ins->Vc.cell_hdr[2] = (uint8_t)( (ins->Vc.vci & 0x0FF0) >> 4); ++ ins->Vc.cell_hdr[3] = (uint8_t)( (ins->Vc.vci & 0x000F) << 4); ++ ins->Vc.cell_hdr[4] = 0; ++ ++ eu_leaves (DBG_UNI); ++ ++ return; ++} ++ ++/***********************************************************************************/ ++/* eu_uni_process_out_pdu */ ++/* */ ++/* Takes an ethernet or raw IP packet and turns it into ATM data. Modeled after */ ++/* AtmUniSend in the NDIS code. Where we differ from the NDIS code, comments */ ++/* explain why. One major difference is that we will get an entire packet in one */ ++/* buffer. The NDIS code gets multiple buffers that compose the entire packet. */ ++/* Also, this routine doesn't actually send the data - it just processes the */ ++/* input data into and output buffer. */ ++/* */ ++/* This routine assumes that all parameters have been verified (it doesn't */ ++/* check for NULL pointers or zero lengths). */ ++/* */ ++/* Assumes the following fields in the Vc are initialized: */ ++/* EncapSize, pEncapHdr */ ++/* MaxSduSize */ ++/* CellHeader */ ++/* CpcsUu, Cpi */ ++/***********************************************************************************/ ++int eu_uni_process_out_pdu ( eu_instance_t *ins, uint8_t *packet, uint32_t size ) ++{ ++ uint32_t cells_in_output; ++ ++ eu_enters (DBG_UNI); ++ ++ ++ /* The NDIS code checks to make sure the VC is ACTIVE. However, since*/ ++ /* we don't deal with ACTIVE or INACTIVE VC's, we don't need to worry*/ ++ /* about that check */ ++ ++ /* Make sure that the packet + encapsulation is within the max SDU size*/ ++ if ((size + ins->Vc.encaps_size) > ins->Vc.max_sdu_size) ++ { ++ eu_dbg (DBG_UNI,"eu_uni_process_out_pdu: Packet+Encap size > MaxSduSize\n"); ++ ++ ins->Statistics[STAT_PAKTS_LOST_OSIZE]++; ++ return -EMSGSIZE; ++ } ++ ++ /* Prepare our segmentation state machine for segmentation by first grabbing*/ ++ /* a segmentation buffer, then initializing the state machine */ ++ ++ eu_aal5_seg_init ( &ins->Vc.segmenter, ++ size + ins->Vc.encaps_size, ++ ins->segmentation_buffer, ++ &ins->Vc.cell_hdr[0] ); ++ ++ /* ++ * If there is some RFC2684 encapsulation enabled, put that in the output first ++ */ ++ if ( ins->Vc.encaps_size ) ++ { ++ eu_aal5_segment ( &ins->Vc.segmenter, ++ ins->Vc.encaps_hdr, ++ ins->Vc.encaps_size ++ ); ++ } ++ ++ /* ++ * Now segment the real network packet into ATM cells ++ */ ++ eu_aal5_segment ( &ins->Vc.segmenter, packet, size ); ++ ++ /* ++ * Finish the CPCS PDU processing by writing the trailer and any padding ++ */ ++ cells_in_output = eu_aal5_write_pad_and_trailer ( &ins->Vc.segmenter, ++ ins->Vc.cpcs_uu, ++ ins->Vc.cpi ); ++ ins->Statistics[STAT_CELLS_TX] += cells_in_output; ++ ins->Statistics[STAT_PAKTS_TX] ++; ++ ++ /* ++ * Size of output buffer is ATM cell count * size of ATM cell ++ */ ++ ins->Vc.segmenter.size = cells_in_output * ATM_CELL_SIZE; ++ ++ eu_dbg ( DBG_UNI, ++ "eu_uni_process_out_pdu: packet processed into ATM cells " ++ "- ready to be sent!\n" ); ++ ++ ++ eu_leaves (DBG_UNI); ++ ++ return 0; /* success in Linux*/ ++} ++ ++ ++/***********************************************************************************/ ++/* eu_uni_process_in_data */ ++/* */ ++/* Processes the ATM data, reassembling into a CPCS PDU (which is really just */ ++/* an ethernet packet with the CPCS trailer). Once an entire Pdu has been */ ++/* received, adds the completed ethernet packet buffer to the ReadWaitingQ */ ++/* so the caller (the upper-level network stack components) can get the packet. */ ++/***********************************************************************************/ ++int eu_uni_process_in_data ( eu_instance_t *ins, uint8_t *data, uint32_t len ) ++{ ++ ++ uint32_t cell_hdr, vpi_vci; ++ uint32_t is_last_cell; ++ eu_atm_vc_t *pvc; ++ eu_sar_r_t *psar; ++ ++ eu_enters (DBG_UNI); ++ eu_dbg (DBG_UNI,"eu_uni_process_in_data: data=%p, len=%x\n",data, len); ++ ++ ++ /* ++ * Lets first make sure there is an integral number of ATM cells in the buffer ++ */ ++ if ( (len % ATM_CELL_SIZE) != 0 ) ++ { ++ eu_err ("eu_uni_process_in_data: non-integral number of cells in incoming data.\n"); ++ eu_err ("eu_uni_process_in_data: incoming data length = %x.\n", len); ++ eu_err ("eu_uni_process_in_data: ATM_CELL_SIZE = %x.\n", ATM_CELL_SIZE); ++ ++ return -EMSGSIZE; ++ } ++ ++ /* ++ * Process each ATM cell in the input buffer ++ */ ++ while (len) ++ { ++ /* ++ * The first DWORD of the ATM cell contains all but the HEC byte of the ++ * cell's ATM header - but we don't look at the HEC byte anyway ++ */ ++ cell_hdr = be32_to_cpu(*((uint32_t *)data)); ++ is_last_cell = (uint32_t)(cell_hdr & ATM_PT_AAL_INDICATE); ++ vpi_vci = (cell_hdr >> 4) & ATM_CELL_REMOVE_GFC_MASK; ++ ++ if ( ins->Vc.vpi_vci == vpi_vci ) ++ { ++ pvc = &ins->Vc; ++ } ++ else ++ { ++ /* ++ * No need to warn user : just emit a dbg statement ++ */ ++ eu_dbg (DBG_UNI,"Received VPI/VCI (0x%x) does not match ours (0x%x)\n", ++ ins->Vc.vpi_vci, vpi_vci ); ++ pvc = NULL; ++ } ++ ++ ++ if ( CheckForAndProcessOAMCell (ins, data) ) ++ { ++ /* ++ * This cell was an OAM cell, so we don't want to include it in ++ * the reassembly. Therefore, skip the cell and continue on ... ++ */ ++ eu_dbg (DBG_UNI,"OAM cell received and processed.\n"); ++ ++ len -= ATM_CELL_SIZE; ++ data += ATM_CELL_SIZE; ++ ins->Statistics[STAT_CELLS_OAM_RCVD]++; ++ continue; ++ } ++ ++ /* ++ * If we cannot find an open VC for this cell, drop the cell ++ */ ++ if ( NULL == pvc ) ++ { ++ eu_dbg (DBG_UNI,"eu_uni_process_in_data: no VC for cell, VpiVci=%x\n", vpi_vci); ++ ++ ins->Statistics[STAT_CELLS_LOST_VPIVCI]++; ++ ++ /* ++ * Next cell ++ */ ++ len -= ATM_CELL_SIZE; ++ data += ATM_CELL_SIZE; ++ continue; ++ } ++ ++ if ( IS_PTI_CELL (cell_hdr) ) ++ { ++ eu_dbg (DBG_UNI,"eu_uni_process_in_data: PTI cell received\n"); ++ ++ /* ++ * Next cell ++ */ ++ len -= ATM_CELL_SIZE; ++ data += ATM_CELL_SIZE; ++ continue; ++ } ++ ++ /* ++ * NDIS code now checks to make sure the VC is in the Active state . ++ * Our VC is a PVC that is always active, so we don't do this right now ++ * Go ahead and skip over the header for this cell ++ */ ++ len -= ATM_CELL_HEADER_SIZE; ++ data += ATM_CELL_HEADER_SIZE; ++ ++ psar = &pvc->reassembler; ++ ++ ++ /* ++ * If there is not already a reassembly happening on this VC, get the ++ * reassembly structure initialized so we can get started with this cell ++ */ ++ if ( !pvc->reassembly_ipg ) ++ { ++ ++ /* ++ * Check if a previously allocated skb is here. If so reset it to ++ * correct values, otherwise get a new one ++ */ ++ if ( psar->skb ) ++ { ++ psar->skb->data = psar->skb->head; ++ psar->skb->tail = psar->skb->head; ++ psar->skb->len = 0; ++ ++ /* ++ * Reserve space for an Ethernet header ++ */ ++ skb_reserve ( psar->skb, ins->eth_hdr ); ++ ++ } ++ else ++ { ++ ++ /* ++ * Allocate a new sk_buff ++ */ ++ psar->skb = dev_alloc_skb ( ETHERNET_PACKET_DATA_SIZE + ++ ins->eth_hdr); ++ if ( !psar->skb ) ++ { ++ eu_err ("eu_uni_process_in_data: Not enough memory.\n"); ++ ++ /* ++ * Next Cell ++ */ ++ len -= ATM_CELL_PAYLOAD_SIZE; ++ data += ATM_CELL_PAYLOAD_SIZE; ++ continue; ++ } ++ ++ /* ++ * Associate to ethernet device ++ */ ++ psar->skb->dev = ins->eth; ++ ++ /* ++ * Reserve space for an Ethernet header ++ */ ++ skb_reserve ( psar->skb, ins->eth_hdr ); ++ ++ } ++ ++ Aal5InitReassembler (psar); ++ ++ pvc->reassembly_ipg = TRUE; ++ } ++ ++ /* ++ * If we do not have sufficient space in reassembly buffer to hold another ++ * cell paylod, drop the ENTIRE pdu being reassembled. ++ * (This can happen if the last cell of a PDU is lost, causing 2 PDUs to get ++ * concatenated ) ++ */ ++ if ( skb_tailroom (psar->skb) < ATM_CELL_PAYLOAD_SIZE ) ++ { ++ eu_dbg (DBG_UNI, ++ "eu_uni_process_in_data: no space left in buffer for cell, dropping PDU,\n"); ++ ++ pvc->reassembly_ipg = FALSE; ++ ins->Statistics[STAT_CELLS_LOST_OTHER] += psar->cell_count; ++ ++ /* ++ * Next cell ++ */ ++ len -= ATM_CELL_PAYLOAD_SIZE; ++ data += ATM_CELL_PAYLOAD_SIZE; ++ continue; ++ } ++ ++ /* ++ * We can now saefly re-assemble :) ++ */ ++ ++ if ( !is_last_cell ) ++ { ++ Aal5ReassembleNonFinalCell(psar, data); ++ } ++ else ++ { ++ Aal5ReassembleFinalCell(psar, data); ++ } ++ ++ psar->cell_count++; ++ ++ /* ++ * Next cell ++ */ ++ len -= ATM_CELL_PAYLOAD_SIZE; ++ data += ATM_CELL_PAYLOAD_SIZE; ++ ++ /* If this cell was the last cell in the PDU, do PDU processing*/ ++ if ( is_last_cell ) ++ { ++ ++ ++ /* ++ * We can now check whether or not the message is too big ++ */ ++ if ( psar->skb->len > ins->mru ) ++ { ++ /* Discard message */ ++ eu_warn("Discarding message (pdu %u > mru %u)\n", ++ psar->skb->len,ins->mru); ++ ++ ins->Statistics[STAT_CELLS_LOST_OTHER] += psar->cell_count; ++ pvc->reassembly_ipg = FALSE; ++ continue; ++ } ++ ++ ++ /**************************************************************************/ ++ /* The way the CRC is calculated should result in the final calculated CRC*/ ++ /* of the incoming PDU being a known value (because the CRC stored in the */ ++ /* trailer of the PDU is used in the calculation), so we can verify the */ ++ /* CRC by just comparing the end result with the fixed value (CRC_RESIDUE)*/ ++ /**************************************************************************/ ++ ++ if ( psar->running_crc != CRC_RESIDUE ) ++ { ++ eu_dbg ( DBG_UNI, "eu_uni_process_in_data: CRC error, dropping PDU,\n"); ++ ++ pvc->reassembly_ipg = FALSE; ++ ins->Statistics[STAT_CELLS_LOST_CRC]++; ++ } ++ else ++ { ++ /* ++ * CRC is ok, lets check the packet length ++ */ ++ if ( psar->skb->len != psar->pdu_len_from_trailer) ++ { ++ eu_dbg (DBG_UNI,"eu_uni_process_in_data: PDU length error, " ++ "dropping PDU, Calculated = %x, stored = %x\n", ++ psar->skb->len, ++ psar->pdu_len_from_trailer); ++ ++ ++ pvc->reassembly_ipg = FALSE; ++ ins->Statistics[STAT_PAKTS_LOST_OSIZE]++; ++ } ++ ++ /* If we get here and ReassemblyInProgress is still true, then we can*/ ++ /* go ahead and mark this buffer as being ready to receive. */ ++ if ( pvc->reassembly_ipg ) ++ { ++ /***********************************************************/ ++ /* There might be some MPOA (RFC1483/2684) processing that */ ++ /* needs to be done, but we can wait until the higher level*/ ++ /* code actually asks us for this packet. Reset skip size */ ++ /* for now to make sure its at a known value */ ++ /***********************************************************/ ++ ++ ins->Statistics[STAT_CELLS_RX] += psar->cell_count; ++ ins->Statistics[STAT_PAKTS_RX] ++; ++ eu_dbg (DBG_UNI,"eu_uni_process_in_data: Pdu processed successfully," ++ " calling eu_read_to_uplayers,\n"); ++ ++ pvc->reassembly_ipg = FALSE; ++ ++ eu_read_to_uplayers ( ins, psar->skb ); ++ ++ psar->skb = NULL; ++ ++ } ++ } ++ } ++ } ++ ++ eu_leaves (DBG_UNI); ++ ++ return 0; /* linux success*/ ++} ++ ++/****************************************************************************************************** ++$Log: Uni.c,v $ ++Revision 1.2 2004/06/30 20:32:02 sleeper ++Implemented new boot state machine ++ ++Revision 1.1 2004/02/06 22:01:34 sleeper ++Initial creation ++ ++Revision 1.4 2004/01/09 20:32:32 sleeper ++Re-wrote integrality test in bulk mode ++ ++Revision 1.3 2003/12/01 22:07:45 sleeper ++Fix a bug that will overwrite end of skb when dropping cells ++ ++Revision 1.2 2003/09/14 22:09:00 sleeper ++Various changes ( I know this is not a good reason :) ++ ++Revision 1.7 2003/06/03 22:51:55 sleeper ++Changed ZAPS to eu_dbg/err macros ++ ++Revision 1.6 2003/04/08 23:10:53 sleeper ++Add mru ++ ++Revision 1.5 2003/04/23 22:28:20 sleeper ++Add stats ++ ++Revision 1.4 2003/03/31 22:03:37 sleeper ++Fix a comment ++ ++Revision 1.3 2003/03/21 00:22:41 sleeper ++Msg Initialization modifs from 2.0.1 ++ ++Revision 1.2 2003/03/11 00:38:03 sleeper ++Add OAM modifs as present in Sagemn 2.0.1 driver ++ ++Revision 1.1.1.1 2003/02/10 23:29:49 sleeper ++Imported sources ++ ++Revision 1.60 2002/05/27 18:04:42 Anoosh Naderi ++Clean up the code ++ ++Revision 1.5 2002/01/18 18:04:42 chris.edgington ++Pull VPI and VCI from driver options if they exist. ++ ++Revision 1.4 2002/01/14 21:59:34 chris.edgington ++Added GPL header. ++ ++Revision 1.3 2002/01/08 16:02:43 chris.edgington ++Added some necessary comments. ++ ++Revision 1.2 2002/01/04 20:59:02 chris.edgington ++Changed data processing routines to use static buffers from eu_instance_t struct ++instead of pulling buffers from queues (since we're not using queues on Linux). ++Added call to ReadSendItUp when read to send data up the network stack. ++ ++Revision 1.1 2002/01/02 21:56:31 chris.edgington ++First version - from MacOS9 project (with Linux mods to get to compile). ++ ++ ++--------------------------------------------------------------------------- ++ Log from MacOS9 project ++--------------------------------------------------------------------------- ++ ++Revision 1.23 2002/07/24 11:32:39 Chinda Keodouangsy ++Added support to handle PTI/OAM cells ++ ++Revision 1.22 2001/12/05 22:09:55 chris.edgington ++Added Analog Devices copyright notice. ++ ++Revision 1.21 2001/11/12 14:23:25 chris.edgington ++Added some comments and did some simple reformatting in preparation for code review. ++ ++Revision 1.20 2001/10/30 19:39:24 chris.edgington ++Added error messages to USBExpertStatusLevel in appropriate places. ++ ++Revision 1.19 2001/10/29 23:53:14 martyn.deobald ++Modified UniEstablishVC to use values read from config file ++ ++Revision 1.18 2001/10/26 18:22:45 chris.edgington ++Changed CRC loss counter to packets instead of cells. ++ ++Revision 1.17 2001/10/25 19:09:33 chris.edgington ++Added incs of packet and cell counters. ++ ++Revision 1.16 2001/10/17 21:08:46 chris.edgington ++Removed ZAP that was reporting incorrect message. ++ ++Revision 1.15 2001/10/12 22:35:13 chris.edgington ++Re-enabled read CRC checking. ++ ++Revision 1.14 2001/10/11 19:49:44 chris.edgington ++Removed a DANGER that is no longer necessary. ++ ++Revision 1.13 2001/10/09 15:17:25 chris.edgington ++Removed UniCreate, UniCreateQueues, UniDestroyQueues, UniEmptyQueues - no longer needed. ++Updated to reflect new buffer field names. ++Uni code now pulls buffers from buffer queues in eu_instance_t. ++ ++Revision 1.12 2001/10/05 16:09:37 chris.edgington ++Temporarily disabled CRC verification of incoming packets. ++Changed nils to NULLs. ++Added more debug output. ++Removed some endian translations - we're already big-endian and that's what the network expects. ++ ++Revision 1.11 2001/10/04 15:54:21 chris.edgington ++Added call to notify TCPIP stack that there is network data available. ++(Currently HACKed - find better fix when network traffic is working.) ++ ++Revision 1.10 2001/10/01 18:41:30 chris.edgington ++Save the size of the reassembled PDU in the PDU holder buffer's RealDataSize field. ++ ++Revision 1.9 2001/09/28 15:22:07 chris.edgington ++Since ATMUNI Uni is part of eu_instance_t, we don't have to allocate space for it in UniCreate. ++We should probably change the name of the function to UniInitialize. ++ ++Revision 1.8 2001/09/24 18:05:51 chris.edgington ++Removed include of multiple files, added single include of Adiutil.h. ++ ++Revision 1.7 2001/09/11 15:35:53 chris.edgington ++Added separate free queues for send and receive. ++Added missing initialization to UniCreate and UniEstablishVc. ++ ++Revision 1.6 2001/09/10 18:16:00 chris.edgington ++Moved header stuff into header files. ++Fixed a few problems found in compile. ++ ++Revision 1.5 2001/09/07 22:25:36 chris.edgington ++Wrote queue GET and PUT macros to make the code more portable. ++Fixed a few problems found during code reading (typos, etc.). ++ ++Revision 1.4 2001/09/07 19:39:52 chris.edgington ++Wrote UniCreate, UniCreateQueues, UniEmptyQueue, UniDestroyQueues. ++Finished to 95% UniProcessInboundData. ++Added ATMUNI and ATMUSB_BUFFER structs. ++Not compilable - work in progress. ++ ++Revision 1.3 2001/09/06 22:30:42 chris.edgington ++Changed UniProcessPdu to UniProcessOutboundPdu. ++Started UniProcessInboundData. ++ ++Revision 1.2 2001/09/06 21:25:09 chris.edgington ++Wrote UniProcessPdu. ++ ++Revision 1.1 2001/09/05 22:26:21 chris.edgington ++Initial version. ++*************************************************************************************************/ +diff -urN x/drivers/usb/misc/eagle-usb/Uni.h y/drivers/usb/misc/eagle-usb/Uni.h +--- x/drivers/usb/misc/eagle-usb/Uni.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/Uni.h 2004-02-07 09:01:34.000000000 +1100 +@@ -0,0 +1,40 @@ ++/*************************************************************************************/ ++/* */ ++/* Uni.h */ ++/* */ ++/* Helper functions for User Network Interface. */ ++/* */ ++/* This file is part of the "ADI USB ADSL Driver for Linux". */ ++/* */ ++/* "ADI USB ADSL Driver for Linux" is free software; you can redistribute it */ ++/* and/or modify it under the terms of the GNU General Public License as */ ++/* published by the Free Software Foundation; either version 2 of the License, */ ++/* or (at your option) any later version. */ ++/* */ ++/* "ADI USB ADSL Driver for Linux" is distributed in the hope that it will be */ ++/* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of */ ++/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ ++/* GNU General Public License for more details. */ ++/* */ ++/* You should have received a copy of the GNU General Public License */ ++/* along with "ADI USB ADSL Driver for Linux"; if not, write to the Free Software */ ++/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ ++/*************************************************************************************/ ++ ++#ifndef __ADIUNI_H__ ++#define __ADIUNI_H__ ++ ++#include "eagle-usb.h" ++ ++extern void eu_uni_establish_vc ( ++ eu_instance_t *ins, ++ uint8_t *encap_hdr, ++ uint32_t encap_size, ++ uint32_t vpi, ++ uint32_t vci ++ ); ++extern int eu_uni_process_out_pdu ( eu_instance_t *ins, uint8_t *packet, uint32_t size ); ++extern int eu_uni_process_in_data ( eu_instance_t *ins, uint8_t *data, uint32_t len ); ++ ++ ++#endif +diff -urN x/drivers/usb/misc/eagle-usb/debug.h y/drivers/usb/misc/eagle-usb/debug.h +--- x/drivers/usb/misc/eagle-usb/debug.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/debug.h 2004-02-09 10:47:25.000000000 +1100 +@@ -0,0 +1,71 @@ ++#ifndef __DEBUG_H__ ++ ++#define __DEBUG_H__ ++ ++/* ++ * The module mask : in Adiusbadsl.c ++ */ ++extern unsigned int module_dbg_mask; ++ ++#ifdef __KERNEL__ ++ ++/* ++ * Output debug statement for module m ++ */ ++#define eu_dbg(m,format,args...) \ ++ do \ ++ { \ ++ if ( module_dbg_mask & (m) ) \ ++ { \ ++ printk(KERN_DEBUG"[eu - " #m "] " format, ##args); \ ++ } \ ++ } while (0) ++ ++ ++/* ++ * Based on dbg : enters and leaves macro ++ */ ++#define eu_enters(m) eu_dbg(m,"Entering %s\n",__FUNCTION__ ) ++#define eu_leaves(m) eu_dbg(m,"Leaving %s\n",__FUNCTION__ ) ++ ++/* ++ * Output error message (unconditionally) ++ */ ++#define eu_err(format,args...) printk(KERN_ERR "[EAGLE-USB] " format, ##args) ++ ++/* ++ * Output warning message (unconditionally) ++ */ ++#define eu_warn(format,args...) printk(KERN_WARNING "[Eagle-usb] " format, ##args) ++ ++/* ++ * Output informational message (unconditionally) ++ */ ++#define eu_report(format,args...) printk(KERN_INFO "[eagle-usb] " format, ##args) ++ ++#endif /* __KERNEL__ */ ++ ++/* ++ * Modules ++ */ ++ ++typedef enum { ++ DBG_SAR = (1<<0), ++ DBG_UNI = (1<<1), ++ DBG_MPOA = (1<<2), ++ DBG_INIT = (1<<3), ++ DBG_ENET = (1<<4), ++ DBG_BOOT = (1<<5), ++ DBG_UTILS = (1<<6), ++ DBG_MSG = (1<<7), ++ DBG_SM = (1<<8), ++ DBG_READ = (1<<9), ++ DBG_INTS = (1<<10), ++ DBG_CRC = (1<<11), ++ DBG_DSP = (1<<12), ++ DBG_OAM = (1<<13), ++ DBG_ROUTEIP = (1<<14) ++} dbg_sec_t; ++ ++ ++#endif /* __DEBUG_H__ */ +diff -urN x/drivers/usb/misc/eagle-usb/eagle-usb.h y/drivers/usb/misc/eagle-usb/eagle-usb.h +--- x/drivers/usb/misc/eagle-usb/eagle-usb.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/eagle-usb.h 2004-02-07 09:01:34.000000000 +1100 +@@ -0,0 +1,76 @@ ++/* ++ * ++ * Copyright (c) 2003, Frederick Ros (sl33p3r@free.fr) ++ * ++ * eagle-usb.h ++ * ++ * ++ * This file is part of the eagle-usb driver package. ++ * ++ * eagle-usb driver package is free software; you can redistribute it ++ * and/or modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of the License, ++ * or (at your option) any later version. ++ * ++ * "eagle-usb driver package" is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with "ADI USB ADSL Driver for Linux"; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ * $Id: eagle-usb.h,v 1.1 2004/02/06 22:01:34 sleeper Exp $ ++ */ ++ ++#ifndef __EAGLE_USB_H__ ++#define __EAGLE_USB_H__ ++ ++#include "eu_types.h" ++ ++/* ++ * Sagem USB IDs ++ */ ++#define EAGLE_VID 0x1110 ++#define EAGLE_I_PID_PREFIRM 0x9010 /* Eagle I */ ++#define EAGLE_I_PID_PSTFIRM 0x900F /* Eagle I */ ++ ++#define EAGLE_IIC_PID_PREFIRM 0x9024 /* Eagle IIC */ ++#define EAGLE_IIC_PID_PSTFIRM 0x9023 /* Eagle IIC */ ++ ++#define EAGLE_II_PID_PREFIRM 0x9022 /* Eagle II */ ++#define EAGLE_II_PID_PSTFIRM 0x9021 /* Eagle II */ ++ ++ ++/* ++ * USR USB IDs ++ */ ++#define USR_VID 0x0BAF ++#define MILLER_A_PID_PREFIRM 0x00F2 ++#define MILLER_A_PID_PSTFIRM 0x00F1 ++#define MILLER_B_PID_PREFIRM 0x00FA ++#define MILLER_B_PID_PSTFIRM 0x00F9 ++#define HEINEKEN_A_PID_PREFIRM 0x00F6 ++#define HEINEKEN_A_PID_PSTFIRM 0x00F5 ++#define HEINEKEN_B_PID_PREFIRM 0x00F8 ++#define HEINEKEN_B_PID_PSTFIRM 0x00F7 ++ ++#define IS_EAGLE_I(c) ( EAGLE_I_PID_PREFIRM == (c) || \ ++ MILLER_A_PID_PREFIRM == (c) || MILLER_B_PID_PREFIRM == (c) || \ ++ HEINEKEN_A_PID_PREFIRM == (c) || HEINEKEN_B_PID_PREFIRM == (c) \ ++ ) ++ ++ ++#ifdef __KERNEL__ ++ ++ ++ ++void eu_msg_initialize ( eu_instance_t *ins, const eu_options_t opt ); ++ ++void eu_send_msg ( eu_instance_t *ins, uint16_t *packet ); ++ ++ ++#endif /* __KERNEL__ */ ++ ++#endif /* __EAGLE-USB_H__ */ +diff -urN x/drivers/usb/misc/eagle-usb/eu_boot_sm.c y/drivers/usb/misc/eagle-usb/eu_boot_sm.c +--- x/drivers/usb/misc/eagle-usb/eu_boot_sm.c 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/eu_boot_sm.c 2004-07-14 05:01:48.000000000 +1000 +@@ -0,0 +1,607 @@ ++ ++/* ++ * ++ * Copyright (c) 2004, Frederick Ros (sl33p3r@free.fr) ++ * Forked from ADI Linux driver from Analog Devices Inc., ++ * ++ * eu_boot_sm.c ++ * ++ * ---------------------------------------------------------------------------- ++ * ++ * This file is part of the eagle-usb driver package. ++ * ++ * "eagle-usb driver package" is free software; you can redistribute it ++ * and/or modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of the License, ++ * or (at your option) any later version. ++ * ++ * "eagle-usb driver package" is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with "eagle-usb driver package"; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ * ++ * $Id: eu_boot_sm.c,v 1.2 2004/07/13 19:01:48 sleeper Exp $ ++ */ ++ ++#include "eu_boot_sm.h" ++#include "Adiutil.h" ++#include "Me.h" ++#include "eu_types.h" ++#include "eu_utils.h" ++#include "debug.h" ++#include "eu_sm.h" ++ ++#define kMAILBOX_EMPTY 0 ++#define kMAILBOX_FULL 1 ++ ++static int reboot (eu_instance_t *ins); ++static int stage_1 (eu_instance_t *ins); ++static int stage_2 (eu_instance_t *ins); ++static int stage_3 (eu_instance_t *ins); ++int boot_the_modem (eu_instance_t *ins); ++static void boot_sm_advance (eu_instance_t *ins); ++static void eu_upload_idma_mainp (eu_instance_t *ins); ++static int eu_idma_write (eu_instance_t *ins, void *data, uint32_t size); ++static int upload_p ( eu_instance_t *ins ) ; ++USB_COMPLETION_PROTO (eu_idma_complete,urb,regs); ++ ++ ++static int (*state_funcs[STATE_MAX])(eu_instance_t *) = ++{ ++ &boot_the_modem, ++ &stage_1, ++ &stage_2, ++ &stage_3, ++ &reboot, ++ &upload_p, ++}; ++ ++/* ++ * Structure required by the IDMA boot engine to load pages ++ */ ++typedef struct ++{ ++ uint16_t ADIHeader; ++ uint16_t Addr; ++ uint16_t Size; ++ uint16_t OvlOffset; ++ uint16_t Ovl; ++ uint16_t LastBlock; ++} IDMALoadBlockInfo; ++ ++ ++/** ++ * Advance boot state machine ... This is indeed a front-end ++ * to boot_sm_advance ++ * ++ */ ++ ++void eu_boot_sm ( void *data ) ++{ ++ eu_instance_t *ins = (eu_instance_t *)data; ++ ++ eu_enters (DBG_BOOT); ++ ++ /* ++ * Check we get instance ... ++ */ ++ if ( !ins ) ++ { ++ eu_err ("Invalid instance pointer !\n"); ++ return; ++ } ++ ++ boot_sm_advance (ins); ++ ++ eu_leaves (DBG_BOOT); ++ ++} ++ ++ ++ ++ ++ ++/* ++ * Advance to the next state of the boot FSM. ++ */ ++static void boot_sm_advance (eu_instance_t *ins) ++{ ++ int retcode; ++ ++ eu_enters (DBG_BOOT); ++ ++ /* ++ * ins already checked by caller ... ++ */ ++ ++ if ( ins->boot_state >= STATE_MAX ) ++ { ++ eu_err ("Invalid boot state value: 0x%x\n",ins->boot_state); ++ retcode = -EINVAL; ++ goto byebye; ++ } ++ ++ retcode = (*state_funcs[ins->boot_state])(ins); ++ ++ ++ byebye: ++ ++ if ( retcode != 0 ) ++ { ++ reboot (ins); ++ } ++ eu_leaves (DBG_BOOT); ++} ++ ++ ++int boot_the_modem (eu_instance_t *ins) ++{ ++ int stat; ++ ++ eu_enters (DBG_BOOT); ++ ++ /* ++ * To kickoff the boot process, do a custom command, SET_MODE to ++ * BOOTMODE_IDMA ++ */ ++ stat = eu_cmd_to_modem(ins, EU_CMD_SET_MODE, MODE_BOOTMODE_IDMA, 0, NULL); ++ if ( stat != 0 ) ++ { ++ eu_err( "eu_cmd_to_modem error %x on SET_MODE BOOTMODE_IDMA\n", stat); ++ goto end_boot; ++ } ++ /* ++ * LOOPBACK_ON correlates to ENUM_FPGALBK in the NDIS code ++ */ ++ stat = eu_cmd_to_modem(ins, EU_CMD_SET_MODE, MODE_LOOPBACK_ON, 0, NULL); ++ if ( stat != 0 ) ++ { ++ eu_err("eu_cmd_to_modem error %x on SET_MODE LOOPBACK_ON\n", stat); ++ goto end_boot; ++ } ++ ++ stat = reboot (ins); ++ ++ end_boot: ++ eu_leaves (DBG_BOOT); ++ return stat; ++} ++ ++ ++static int stage_1 (eu_instance_t *ins) ++{ ++ int stat = 0; ++ ++ eu_enters (DBG_BOOT); ++ ++ stat = eu_cmd_to_modem(ins, EU_CMD_SET_MODE, MODE_START_RESET, 0, NULL); ++ if ( stat != 0 ) ++ { ++ eu_err ("eu_cmd_to_modem error %x on SET_MODE START_RESET\n", stat); ++ goto end_boot; ++ } ++ ++ /* ++ * Advance to stage 2 and wait for 200 ms ++ */ ++ ins->AdiModemSm.CurrentAdiState = STATE_BOOT_STAGE_2; ++ ins->boot_state = STAGE_2; ++ SetTimerInterval(ins, TRANS_TIME_2_BOOT_STAGE_2); ++ ++ end_boot: ++ eu_leaves (DBG_BOOT); ++ return stat; ++} ++ ++static int stage_2 (eu_instance_t *ins) ++{ ++ int stat = 0; ++ uint16_t word; ++ ++ eu_enters (DBG_BOOT); ++ ++ stat = eu_cmd_to_modem(ins, EU_CMD_SET_MODE, MODE_END_RESET, 0, NULL); ++ if ( stat != 0 ) ++ { ++ eu_err ("eu_cmd_to_modem error %x on SET_MODE END_RESET\n", stat); ++ goto end_boot; ++ } ++ ++ /* ++ * Clear all of the CMV mailboxes - this is a MUST!!! [IIDos-Oct.18,01] ++ */ ++ word = cpu_to_le16(kMAILBOX_EMPTY); ++ stat = eu_cmd_to_modem(ins, EU_CMD_SET_2183_DATA, (DSP_MP_TX_MAILBOX | 0x4000), ++ 2, (UInt8 *)&word); ++ stat = eu_cmd_to_modem(ins, EU_CMD_SET_2183_DATA, (DSP_MP_RX_MAILBOX | 0x4000), ++ 2, (UInt8 *)&word); ++ stat = eu_cmd_to_modem(ins, EU_CMD_SET_2183_DATA, (DSP_SWAP_MAILBOX | 0x4000), ++ 2, (UInt8 *)&word); ++ ++ ins->AdiModemSm.CurrentAdiState = STATE_BOOT_STAGE_3; ++ ins->boot_state = STAGE_2; ++ SetTimerInterval(ins, TRANS_TIME_2_BOOT_STAGE_3); ++ ++ end_boot: ++ eu_leaves (DBG_BOOT); ++ return stat; ++} ++ ++ ++static int stage_3 (eu_instance_t *ins) ++{ ++ int stat = 0; ++ ++ eu_enters (DBG_BOOT); ++ ++ /* ++ * Finally, we get to do something that seems substantial! ++ */ ++ eu_upload_idma_mainp (ins); ++ ++ /* ++ * This is the last operation in our sequence of tasks for device ++ * initialization. Everything else will be driven by the hardware. ++ * Once the main page is loaded, the hardware will start requesting ++ * swap pages. ++ * Put our modem in the BOOT_WAIT state and start our watchdog! ++ */ ++ ins->AdiModemSm.CurrentAdiState = STATE_BOOT_WAIT; ++ ins->boot_state = PRE_BOOT; ++ SetTimerInterval(ins, TRANS_TIME_4_BOOTWAIT); ++ ++ eu_leaves (DBG_BOOT); ++ ++ return stat; ++} ++ ++static int reboot (eu_instance_t *ins) ++{ ++ int stat = 0; ++ ++ eu_enters (DBG_BOOT); ++ ++ /* ++ * Original code comments states: ++ * ++ * The steps in the boot process are not documented, they were "gleaned" ++ * from the NDIS code. A different, simpler process might be possible, ++ * but we have no way to prove it at this point. ++ * ++ */ ++ ++ ++ stat = eu_cmd_to_modem(ins, EU_CMD_SET_MODE, MODE_BOOTMODE_IDMA, 0, NULL); ++ if ( stat != 0 ) ++ { ++ eu_err("eu_cmd_to_modem error %x on SET_MODE BOOTMODE_IDMA\n", stat); ++ goto end_boot; ++ } ++ ++ ins->AdiModemSm.CurrentAdiState = STATE_BOOT_STAGE_1; ++ ins->boot_state = STAGE_1; ++ ins->AdiModemSm.ModemReplyExpected = EVENT_TIMER_TICK; ++ SetTimerInterval(ins, TRANS_TIME_2_BOOT_STAGE_1); ++ ++ end_boot: ++ eu_leaves (DBG_BOOT); ++ return stat; ++ ++} ++ ++static int upload_p ( eu_instance_t *ins ) ++{ ++ int retcode = 0; ++ ++ eu_enters (DBG_BOOT); ++ ++ if ( EU_TEST_FLAG( ins, EU_DSP_IPG ) ) ++ { ++ eu_report ("DSP is being uploaded. I give up."); ++ retcode = -1; ++ goto byebye; ++ } ++ ++ eu_upload_idma_swapp ( ins, ins->swap_data ); ++ ++ byebye: ++ eu_leaves (DBG_BOOT); ++ return (retcode); ++} ++ ++/** ++ * eu_upload_idma_mainp ++ * ++ * Comments from orignla function: " ++ * Send the main page block of the DSP code through the IDMA interface. Note ++ * that the bulk of this logic is straight from legacy Buffer.c in NDIS code, ++ * there was virtually no doc on how this is supposed to work. " ++ * ++ */ ++static void eu_upload_idma_mainp (eu_instance_t *ins) ++{ ++ int stat; ++ uint32_t i, myBlockSize; ++ uint8_t *pLastBits = NULL; ++ uint8_t *pBlockData; ++ IDMALoadBlockInfo myBLI; ++ ++ eu_enters (DBG_BOOT); ++ ++ eu_dbg (DBG_BOOT,"Loading 0x%#x blocks from main page.\n", ++ ins->MainPage.BlockCount); ++ ++ ++ for (i=0; iMainPage.BlockCount; i++) ++ { ++ /* ++ * Init data that is not block-location-specific ++ */ ++ myBLI.ADIHeader = cpu_to_le16(0xABCD); ++ myBLI.Ovl = 0; ++ myBLI.OvlOffset = cpu_to_le16(0x8000); ++ myBLI.LastBlock = 0; ++ ++ /* ++ * Is this NOT the first block? ++ */ ++ if (ins->MainPage.Blocks[i].DSPAddr != 0) ++ { ++ myBLI.Size = cpu_to_le16((UInt16)(ins->MainPage.Blocks[i].DSPSize)); ++ myBLI.Addr = cpu_to_le16(ins->MainPage.Blocks[i].DSPAddr); ++ myBlockSize = (UInt16)(ins->MainPage.Blocks[i].DSPSize); ++ pBlockData = ins->MainPage.Blocks[i].MemOffset; ++ } ++ /* ++ * This is block 0 - we want to send all but offset 0 - so we start at ++ * offset 1 ++ */ ++ ++ /* ++ * We should only get here once! ++ */ ++ else ++ { ++ myBLI.Size = cpu_to_le16((UInt16)(ins->MainPage.Blocks[i].DSPSize - 3)); ++ myBLI.Addr = cpu_to_le16(1); ++ myBlockSize = (UInt16)(ins->MainPage.Blocks[i].DSPSize - 3); ++ pBlockData = ins->MainPage.Blocks[i].MemOffset+3; ++ pLastBits = ins->MainPage.Blocks[i].MemOffset; ++ } ++ ++ /* ++ * Write the structure telling the DSP what to expect in the next block ++ */ ++ stat = eu_idma_write(ins, (void *)&myBLI, sizeof(IDMALoadBlockInfo)); ++ ++ if ( stat != 0 ) ++ { ++ eu_err ("Error %#X on IDMA write of BlockLoadInfo\n", stat); ++ } ++ ++ /* ++ * Occassionally the modem will freak out during idma boot and get in ++ * a weird mode where it requests wrong swap pages, etc. ++ * Comparing the usb traces of linux and Windows reveals that linux ++ * does things MUCH faster, so my theory is that we're overwhelming ++ * the hardware. So, I'll inject a tiny delay here to keep things ++ * under control ++ */ ++ ++ wait_ms(1); ++ ++ /* Now write the actual block data ++ */ ++ stat = eu_idma_write(ins, (void *)pBlockData, myBlockSize); ++ ++ if ( stat != 0 ) ++ { ++ eu_err ("Error %#X on IDMA write of block data\n", stat); ++ } ++ ++ ++ wait_ms(1); ++ } ++ ++ /* ++ * All blocks are loaded, now we can write out offset 0 of the first block, ++ * which will tell the hardware to start - resulting in requests for swap ++ * pages ++ */ ++ myBLI.ADIHeader = cpu_to_le16(0xABCD); ++ myBLI.Ovl = 0; ++ myBLI.OvlOffset = cpu_to_le16(0x8000); ++ myBLI.LastBlock = cpu_to_le16(1); ++ myBLI.Size = cpu_to_le16(3); ++ myBLI.Addr = 0; ++ myBlockSize = 3; ++ pBlockData = pLastBits; ++ eu_dbg (DBG_BOOT,"sending last entry from main page, DSP will start soon!.\n"); ++ ++ ++ /* ++ * Write the structure telling the DSP what to expect in the next block ++ */ ++ stat = eu_idma_write(ins, (void *)&myBLI, sizeof(IDMALoadBlockInfo)); ++ ++ if ( stat != 0 ) ++ { ++ eu_err ("Error %#X on IDMA write of BlockLoadInfo\n", stat); ++ } ++ ++ ++ /* ++ * Now write the actual block data ++ */ ++ stat = eu_idma_write(ins, (void *)pBlockData, myBlockSize); ++ ++ if ( stat != 0 ) ++ { ++ eu_err ("Error %#X on IDMA write of block data\n", stat); ++ } ++ eu_leaves (DBG_BOOT); ++} ++ ++ ++/** ++ * eu_upload_idma_swapp ++ * ++ * Sends the blocks of the requested swap page through the IDMA interface. Note ++ * that the bulk of this logic is straight from Buffer.c in the NDIS code, there ++ * was virtually no documentation on how this is supposed to work. ++ * ++ */ ++void eu_upload_idma_swapp(eu_instance_t *ins, uint16_t swap_info) ++{ ++ int stat; ++ uint32_t i, myBlockSize; ++ uint16_t PageIndex, Ovl; ++ IDMALoadBlockInfo myBLI; ++ ++ eu_enters (DBG_BOOT); ++ ++ PageIndex = (swap_info & 0x00FF) - 1; ++ Ovl = ((swap_info & 0xF000) >> 12) | ((swap_info & 0x0F00) >> 4); ++ ++ eu_dbg (DBG_BOOT,"Loading 0x%x blocks from swap page 0x%x, ovl=0x%x.\n", ++ ins->pSwapPages[PageIndex].BlockCount, PageIndex, Ovl); ++ ++ if (PageIndex > ins->SwapPageCount) ++ { ++ eu_err ("Request for swap page 0x%x when only 0x%x pages exist!\n", ++ PageIndex, ins->SwapPageCount); ++ return; ++ } ++ ++ /* ++ * For swap pages, we actually know we won't have more than 2 blocks ++ */ ++ for (i=0; ipSwapPages[PageIndex].BlockCount; i++) ++ { ++ /* ++ * Init data that is not block-location-specific ++ */ ++ myBLI.ADIHeader = cpu_to_le16(0xABCD); ++ myBLI.Ovl = cpu_to_le16(Ovl); ++ myBLI.OvlOffset = cpu_to_le16(0x8000 | Ovl); ++ myBlockSize = ins->pSwapPages[PageIndex].Blocks[i].DSPExtendedSize; ++ myBLI.Size = cpu_to_le16((UInt16)myBlockSize); ++ myBLI.Addr = cpu_to_le16(ins->pSwapPages[PageIndex].Blocks[i].DSPAddr); ++ ++ if ((ins->pSwapPages[PageIndex].BlockCount-1) == i) ++ { ++ myBLI.LastBlock = cpu_to_le16(1); ++ } ++ else ++ { ++ myBLI.LastBlock = cpu_to_le16(0); ++ } ++ ++ ++ /* ++ * Write the structure telling the DSP what to expect in the next block ++ */ ++ stat = eu_idma_write(ins, (void *)&myBLI, sizeof(IDMALoadBlockInfo)); ++ if ( stat != 0 ) ++ { ++ eu_err ("Error %#X on IDMA write of BlockLoadInfo\n", stat); ++ } ++ ++ ++ /* ++ * Occassionally the modem will freak out during idma boot and get in a ++ * weird mode where it requests wrong swap pages, etc. Comparing the ++ * usb traces of linux and Windows reveals that linux does things MUCH ++ * faster, so my theory is that we're overwhelming the hardware. So, ++ * I'll inject a tiny delay here to keep things under control ++ */ ++ ++ wait_ms(1); ++ ++ /* ++ * Now write the actual block data ++ */ ++ stat = eu_idma_write(ins, (void *)(ins->pSwapPages[PageIndex].Blocks[i].MemOffset), myBlockSize); ++ if ( stat != 0 ) ++ { ++ eu_err ("Error %#X on IDMA write of block data\n", stat); ++ } ++ ++ wait_ms(1); ++ } ++ ++ eu_leaves (DBG_BOOT); ++} ++ ++ ++/** ++ * eu_idma_write ++ * ++ * Responsible for sending data to the IDMA interface via the BULK IDMA OUT ++ * pipe. ++ * ++ */ ++ static int eu_idma_write (eu_instance_t *ins, void *data, uint32_t size) ++{ ++ int ret = 0; ++ struct urb *urb; ++ uint8_t *xfer_buf = GET_KBUFFER(size); ++ ++ eu_enters (DBG_BOOT); ++ ++ if (!xfer_buf) ++ { ++ eu_err ("kmalloc in eu_idma_write for %#X bytes failed\n", size); ++ ++ ret = -ENOMEM; ++ goto IDMA_exit; ++ } ++ ++ memcpy(xfer_buf, data, size); ++ ++ /* ++ * Get an URB and prepare it for submission ++ */ ++ urb = USB_ALLOC_URB ( 0 , GFP_ATOMIC ); ++ ++ usb_fill_bulk_urb ( urb, ins->usbdev, ins->pipe_bulk_idma_out, ++ xfer_buf, size, eu_idma_complete, ins ); ++ ++ urb->transfer_flags |= USB_QUEUE_BULK; ++ ++ eu_dbg (DBG_BOOT,"Submitting BULK URB %p\n", urb); ++ ++ ret = USB_SUBMIT_URB ( urb, GFP_ATOMIC ); ++ ++IDMA_exit: ++ eu_leaves (DBG_BOOT); ++ return ret; ++} ++ ++/** ++ * eu_idma_complete ++ * ++ * Called when an eu_idma_write urb has completed. All we have to do is free ++ * the memory allocated in eu_idma_write. ++ * ++ */ ++ ++USB_COMPLETION_PROTO (eu_idma_complete,urb,regs) ++{ ++ eu_enters (DBG_BOOT); ++ ++ /* ++ * All we really need to do is free the memory we alloced and free the urb ++ */ ++ FREE_KBUFFER(urb->transfer_buffer); ++ usb_free_urb(urb); ++ ++ eu_dbg (DBG_BOOT,"Freed BULK URB %p\n", urb); ++ ++ eu_leaves (DBG_BOOT); ++} +diff -urN x/drivers/usb/misc/eagle-usb/eu_boot_sm.h y/drivers/usb/misc/eagle-usb/eu_boot_sm.h +--- x/drivers/usb/misc/eagle-usb/eu_boot_sm.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/eu_boot_sm.h 2004-07-01 06:32:02.000000000 +1000 +@@ -0,0 +1,47 @@ ++ ++/* ++ * ++ * Copyright (c) 2004, Frederick Ros (sl33p3r@free.fr) ++ * ++ * eu_boot_sm.h ++ * ++ * ---------------------------------------------------------------------------- ++ * ++ * This file is part of the eagle-usb driver package. ++ * ++ * "eagle-usb driver package" is free software; you can redistribute it ++ * and/or modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of the License, ++ * or (at your option) any later version. ++ * ++ * "eagle-usb driver package" is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with "eagle-usb driver package"; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ * ++ * $Id: eu_boot_sm.h,v 1.1 2004/06/30 20:32:02 sleeper Exp $ ++ */ ++#ifndef __BOOT_SM_H__ ++#define __BOOT_SM_H__ ++ ++#include "Adiutil.h" ++#include "eu_types.h" ++ ++/** ++ * Advance boot state machine ... This is indeed a front-end ++ * to boot_sm_advance ++ * ++ */ ++ ++void eu_boot_sm ( void *data ); ++ ++void eu_upload_idma_swapp(eu_instance_t *ins, uint16_t swap_info); ++ ++int boot_the_modem (eu_instance_t *ins); ++ ++#endif /* __BOOT_SM_H__ */ +diff -urN x/drivers/usb/misc/eagle-usb/eu_eth.c y/drivers/usb/misc/eagle-usb/eu_eth.c +--- x/drivers/usb/misc/eagle-usb/eu_eth.c 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/eu_eth.c 2004-08-30 18:57:39.000000000 +1000 +@@ -0,0 +1,515 @@ ++/* ++ * eu_eth - Ethernet handling functions. ++ * Copyright (C) 2004 Frederick Ros (sl33p3r@free.fr) ++ * ++ * Fix by Robert.Siemer-eagleusb@backsla.sh 22.8.2004: ++ * Lift MTU limit in PPPoA case so the kernel will not return ++ * -EMSGSIZE on send()-alike syscalls before asking us... ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License ++ * as published by the Free Software Foundation; either version 2 ++ * of the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ * ++ * $Id: eu_eth.c,v 1.5 2004/08/26 20:47:54 sleeper Exp $ ++ */ ++ ++#include "Adiutil.h" ++#include ++#include /* For isxdigit */ ++#include "Pipes.h" ++#include "macros.h" ++#include "Uni.h" ++#include "Mpoa.h" ++#include "debug.h" ++#include "eu_eth.h" ++#include "eu_sm.h" ++ ++ ++ ++/* --------------------- Private Functions Declaration --------------------- */ ++static int eu_eth_open ( struct net_device *dev ); ++static int eu_eth_close ( struct net_device *dev ); ++static int eu_eth_ioctl ( struct net_device *dev, struct ifreq *rq, int cmd ); ++static struct net_device_stats *eu_eth_stats ( struct net_device *dev ); ++static int eu_eth_start_xmit ( struct sk_buff *skb, struct net_device *dev ); ++static void eu_eth_set_multicast ( struct net_device *dev ); ++static void eu_eth_tx_timeout ( struct net_device *dev ); ++ ++ ++/* -------------------------- Exported Functions --------------------------- */ ++ ++/** ++ * eu_eth_create - Creates our ethernet device ++ * ++ */ ++void eu_eth_create ( void *data ) ++{ ++ eu_instance_t *ins = (eu_instance_t *)data; ++ ++ struct net_device *ether = NULL; ++ int result = 0; ++ ++ /* ++ * First allocate an ethernet device structure ++ */ ++ ++ ether = alloc_etherdev (0); ++ ++ if ( !ether ) ++ { ++ eu_err ("eu_eth_create: Can't allocate etherdev.\n"); ++ return ; ++ } ++ ++ /* Initialize the Ethernet device: */ ++ ether->priv = ins; ++ ++ if ( ins->if_name[0] != '\0' ) ++ { ++ /* User supplied a name */ ++ strncpy ( ether->name, ins->if_name, IFNAMSIZ ); ++ ether->name[IFNAMSIZ-1] = '\0'; ++ } ++ ++ ether->init = eu_eth_init; ++ ++ /* ++ * Register device to network subsystem: this will call in return eu_eth_init ++ */ ++ result = register_netdev ( ether ); ++ ++ if ( result != 0 ) ++ { ++ kfree (ether); ++ eu_err ("eu_create_etherdev: Cannot register to network (res=%d)\n",result); ++ ++ } ++ else ++ { ++ eu_report (" Ethernet device %s created.\n", ++ ether->name); ++ } ++ ++ ins->eth = ether; ++ ++ EU_SET_FLAG (ins, EU_ETH_REGISTERED); ++ EU_CLEAR_FLAG (ins,EU_ETH_REGISTERING); ++ ++} ++ ++ ++/** ++ * eu_eth_init - Initialize ethernet device structure ++ * ++ */ ++int eu_eth_init ( struct net_device *dev ) ++{ ++ eu_instance_t *ins = (eu_instance_t *)dev->priv; ++ ++ if ( ins == NULL ) ++ { ++ eu_err ("eu_eth_init: No instance !\n"); ++ return (-EINVAL); ++ } ++ ++ if (ins->MpoaMode == MPOA_MODE_PPPOA_VC || ++ ins->MpoaMode == MPOA_MODE_PPPOA_LLC) { ++ dev->mtu = ins->mru; /* Who wonders: quite symetric here */ ++ dev->change_mtu = NULL; ++ } ++ ++ dev->open = eu_eth_open; ++ dev->stop = eu_eth_close; ++ dev->do_ioctl = eu_eth_ioctl; ++ dev->get_stats = eu_eth_stats; ++ dev->hard_start_xmit = eu_eth_start_xmit; ++ ++ dev->set_multicast_list = eu_eth_set_multicast; ++ dev->tx_timeout = eu_eth_tx_timeout; ++ dev->watchdog_timeo = TRANSMIT_TIMEOUT; ++ ++ /* ++ * MAC address has already been retrieved from device at init time ++ */ ++ memcpy ( dev->dev_addr, ins->mac, ETH_ALEN ); ++ ++ SET_MODULE_OWNER(dev); ++ ++ eu_dbg (DBG_ENET,"Ethernet device initialized.\n"); ++ ++ return 0; ++} ++ ++/* --------------------------- Private Functions --------------------------- */ ++ ++/** ++ * eu_eth_open - Someone opens the ethernet interface ++ * ++ */ ++static int eu_eth_open ( struct net_device *dev ) ++{ ++ eu_instance_t *ins = (eu_instance_t *)dev->priv; ++ int retcode = 0; ++ ++ if ( !ins ) ++ { ++ eu_err ("eu_eth_open: No instance !\n"); ++ return (-EINVAL); ++ } ++ ++ MODULE_USER_GET; ++ eu_enters (DBG_ENET); ++ ++ ++ if ( !(ins->AdiModemSm.CurrentAdiState & STATE_OPERATIONAL ) ) ++ { ++ eu_err ("eu_eth_open: Can't open ethernet device until modem is synchronized.\n"); ++ retcode = -EINVAL; ++ goto byebye; ++ } ++ ++ EU_SET_FLAG (ins,EU_OPEN); ++ ++ /* ++ * Create incoming data URBs ++ */ ++ if ( eu_start_read_pipe (ins) != 0 ) ++ { ++ eu_err ("Error while trying to start comm\n"); ++ EU_CLEAR_FLAG (ins, EU_OPEN); ++ retcode = -ERESTARTSYS; ++ goto byebye; ++ } ++ ++ ++ /* ++ * Tell the kernel we're ready for network traffic flow ++ */ ++ EU_CLEAR_FLAG (ins, EU_WRITING); ++ netif_start_queue (dev); ++ ++ byebye: ++ ++ if ( retcode != 0 ) ++ { ++ MODULE_USER_RELEASE; ++ } ++ ++ eu_leaves (DBG_ENET); ++ ++ return (retcode); ++} ++ ++/** ++ * eu_eth_close - Shutdown of our ethernet interface ++ * ++ */ ++static int eu_eth_close ( struct net_device *dev ) ++{ ++ eu_instance_t *ins = (eu_instance_t *)dev->priv; ++ ++ if ( !ins ) ++ { ++ eu_err ("eu_eth_close: No instance !\n"); ++ return (-EINVAL); ++ } ++ ++ eu_enters (DBG_ENET); ++ ++ /* ++ * Tell the kernel that we do not want any more network traffic ++ */ ++ netif_stop_queue (dev); ++ ++ /* ++ * Stop our outgoing data urbs ++ */ ++ if ( EU_TEST_FLAG (ins, EU_WRITING ) ) ++ { ++ ins->urb_write->transfer_flags &= ~URB_ASYNC_UNLINK; ++ usb_unlink_urb(ins->urb_write); ++ } ++ ++ /* ++ * Stop our incoming data urbs ++ */ ++ eu_stop_read_pipe (ins); ++ ++ ++ /* ++ * Tell ourselves that we're closed for business! ++ */ ++ EU_CLEAR_FLAG (ins,EU_OPEN); ++ ++ eu_leaves (DBG_ENET); ++ ++ MODULE_USER_RELEASE; ++ return 0; ++} ++ ++/** ++ * eu_eth_ioctl - Handles ioctl on our ethernet if. Currently no ioctl are supported. ++ * ++ */ ++static int eu_eth_ioctl ( struct net_device *dev, struct ifreq *rq, int cmd ) ++{ ++ eu_instance_t *ins = (eu_instance_t *)dev->priv; ++ ++ if ( !ins ) ++ { ++ eu_err ("eu_eth_ioctl: No instance !\n"); ++ return (-EINVAL); ++ } ++ ++ eu_enters (DBG_ENET); ++ ++ ++ eu_leaves (DBG_ENET); ++ ++ return -ENOTTY; ++} ++ ++/** ++ * eu_eth_stats - return ethernet device stats ++ * ++ */ ++static struct net_device_stats *eu_eth_stats ( struct net_device *dev ) ++{ ++ eu_instance_t *ins = (eu_instance_t *)dev->priv; ++ ++ if ( !ins ) ++ { ++ eu_err ("eu_eth_stats: No instance !\n"); ++ return (NULL); ++ } ++ ++ eu_enters (DBG_ENET); ++ ++ ++ eu_leaves (DBG_ENET); ++ ++ return &ins->LinuxStats; ++} ++ ++ ++/** ++ * eu_eth_start_xmit - Sends a packet on the network. ++ * ++ */ ++static int eu_eth_start_xmit ( struct sk_buff *skb, struct net_device *dev ) ++{ ++ eu_instance_t *ins = (eu_instance_t *)dev->priv; ++ struct ethhdr *phdr = (struct ethhdr *) skb->data; ++ int result=0, packet_sent=0; ++ ++ if ( !ins ) ++ { ++ eu_err ("eu_eth_start_xmit: No instance !\n"); ++ return (-EINVAL); ++ } ++ ++ eu_enters (DBG_ENET); ++ ++ ++ /* ++ * Tell the kernel to hold off until we're done sending this packet ++ */ ++ netif_stop_queue (dev); ++ ++ /* ++ * Send the packet through the SAR to get ATM cells ++ */ ++ switch ( ins->MpoaMode ) ++ { ++ case MPOA_MODE_BRIDGED_ETH_LLC : ++ case MPOA_MODE_BRIDGED_ETH_VC : ++ result = eu_uni_process_out_pdu ( ins, skb->data, skb->len ); ++ break; ++ ++ case MPOA_MODE_ROUTED_IP_LLC : ++ case MPOA_MODE_ROUTED_IP_VC : ++ ++ if ( ( phdr->h_proto != ETHERTYPE_IP ) && ++ ( phdr->h_proto != ETHERTYPE_IPV6 ) ) ++ { ++ if (phdr->h_proto == ETHERTYPE_ARP) ++ { ++ EthernetArpReply (ins, skb->data, skb->len); ++ ++ result = eu_uni_process_out_pdu ( ins, skb->data, skb->len ); ++ } ++ else ++ { ++ /* ++ * If the packet is not an ARP or IP, then its invalid, but ++ * tell Linux that all is well ++ */ ++ eu_err ("Invalid ethernet in packet %x.\n",phdr->h_proto); ++ goto xmit_exit; ++ } ++ } ++ else ++ { ++ /* ++ * Adjust the packet pointer and size so we ++ * skip the ethernet header ++ */ ++ skb->data += sizeof (struct ethhdr); ++ skb->len -= sizeof (struct ethhdr); ++ result = eu_uni_process_out_pdu ( ins, skb->data, skb->len ); ++ } ++ ++ break; ++ ++ case MPOA_MODE_PPPOA_LLC : ++ case MPOA_MODE_PPPOA_VC : ++ result = eu_uni_process_out_pdu ( ins, skb->data+16, skb->len-16 ); ++ break; ++ } ++ ++ /* ++ * If all is OK, send the data: ++ */ ++ if ( !result && !packet_sent) ++ { ++ /* ++ * Fix the timestamp of transaction for timeout detection: ++ */ ++ dev->trans_start = jiffies; ++ ++ /* ++ * Store packet information for transmit statistics: ++ */ ++ ins->out_pkt_size = skb->len; ++ ++ /* ++ * Uni says all is ok to proceed with sending the data: ++ */ ++ result = eu_write_atm_data (ins); ++ } ++ /* ++ * We've copied the data into our own internal buffers, so we can ++ * go ahead and free the kernel's buffer for this packet. ++ */ ++ ++ xmit_exit: ++ dev_kfree_skb(skb); ++ ++ if ( 0 != result ) ++ { ++ ++ /* ++ * Update statistics: count only real errors (not "not sent" that occured ++ * because the modem is (re)booting ++ */ ++ if ( result != 1 ) ++ { ++ eu_warn ("Packet transmission error: result=%d\n", result); ++ ++ ++ins->LinuxStats.tx_errors; ++ ++ins->LinuxStats.tx_carrier_errors; ++ } ++ ++ /* ++ * There will be no URB completion, so we must wake up the network layer ++ * ourself: ++ */ ++ EU_CLEAR_FLAG (ins, EU_WRITING); ++ netif_wake_queue (dev); ++ } ++ else ++ { ++ /*******************************************************************************/ ++ /* You'll notice that, in this case, we do not wake up the netif queue */ ++ /* .... that's because we're only using one write URB, so we have */ ++ /* to wait until the completion handler for the write is called */ ++ /* or a transmit timeout occur before we can tell kernel that we can handle */ ++ /* more network data. */ ++ /* A potential performance improvement would be to have an internal */ ++ /* URB queue for outgoing data, so we could (theoretically) start */ ++ /* the software-processing of a packet while another one is being sent. */ ++ /*******************************************************************************/ ++ } ++ ++ eu_leaves (DBG_ENET); ++ ++ return 0; ++} ++ ++/** ++ * eu_eth_set_multicast - Set multicast for our ethernet device ++ * ++ */ ++static void eu_eth_set_multicast ( struct net_device *dev ) ++{ ++ eu_enters (DBG_ENET); ++ ++ ++ /*******************************************************************************/ ++ /* Our ethernet side is really all software, so anything that */ ++ /* a normal ethernet card would do in hardware, we do here in the driver. */ ++ /* On a normal ethernet card, you would upload the filter address list */ ++ /* to the card - but we just loop through a fast software compare. */ ++ /* Since we will just always check whats in the net_device *, we don't */ ++ /* have to do anything here! */ ++ /*******************************************************************************/ ++ ++ eu_leaves (DBG_ENET); ++ ++} ++ ++/** ++ * eu_eth_tx_timeout - Transmission timeout ++ * ++ */ ++static void eu_eth_tx_timeout ( struct net_device *dev ) ++{ ++ eu_instance_t *ins = (eu_instance_t *)dev->priv; ++ ++ if ( !ins ) ++ { ++ eu_err ("eu_eth_tx_timeout: No instance !\n"); ++ return; ++ } ++ ++ eu_warn ("Transmission timed out!\n"); ++ ++ /* ++ * Other linux drivers don't seem to recover and resend ++ * the socket buffer Linux gives them. However, O'Reilly's ++ * Linux Device Driver says we must not lose the buffer. ++ * But, as packets may anyway be lost by media in general, ++ * it's quite certain the protocol will resend it sooner or ++ * later, or consider packet lost as normal. Therefore, this ++ * driver do not attempt anything more than removing the broken ++ * URB. This will call WriteCompletion, which will call ++ * netif_wakequeue: ++ */ ++ ++ ins->urb_write->transfer_flags |= URB_ASYNC_UNLINK; ++ usb_unlink_urb(ins->urb_write); ++ ++ ins->urb_oam_write->transfer_flags |= URB_ASYNC_UNLINK; ++ usb_unlink_urb(ins->urb_oam_write); ++ ++ /* We must reset the transaction time to keep the watchdog quiet: */ ++ dev->trans_start = jiffies; ++ ++ /* ++ * restart queue if needed ++ */ ++ netif_wake_queue (dev); ++ ++ eu_leaves (DBG_ENET); ++ ++} +diff -urN x/drivers/usb/misc/eagle-usb/eu_eth.h y/drivers/usb/misc/eagle-usb/eu_eth.h +--- x/drivers/usb/misc/eagle-usb/eu_eth.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/eu_eth.h 2004-02-07 09:01:34.000000000 +1100 +@@ -0,0 +1,28 @@ ++/* ++ * eu_eth - Ethernet handling functions header ++ * Copyright (C) 2003 Frederick Ros (sl33p3r@free.fr) ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License ++ * as published by the Free Software Foundation; either version 2 ++ * of the License, or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ * ++ * $Id: eu_eth.h,v 1.1 2004/02/06 22:01:34 sleeper Exp $ ++ */ ++ ++#ifndef __EU_ETH_H__ ++#define __EU_ETH_H__ ++ ++extern int eu_eth_init ( struct net_device *dev ); ++extern void eu_eth_create ( void *data); ++ ++#endif /* __EU_ETH_H__ */ +diff -urN x/drivers/usb/misc/eagle-usb/eu_firmware.h y/drivers/usb/misc/eagle-usb/eu_firmware.h +--- x/drivers/usb/misc/eagle-usb/eu_firmware.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/eu_firmware.h 2004-02-07 09:01:34.000000000 +1100 +@@ -0,0 +1,6422 @@ ++/* ++ * eu_firmware.h ++* ++* This file is part of the "eagle-usb driver package". ++* ++* "ADI USB ADSL Driver for Linux" is free software; you can redistribute it ++* and/or modify it under the terms of the GNU General Public License as ++* published by the Free Software Foundation; either version 2 of the License, ++* or (at your option) any later version. ++* ++* "ADI USB ADSL Driver for Linux" is distributed in the hope that it will be ++* useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++* GNU General Public License for more details. ++* ++* You should have received a copy of the GNU General Public License ++* along with "ADI USB ADSL Driver for Linux"; if not, write to the Free Software ++* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++* ++* Based on code furnished by Analog Devices, in the file Firmware8051.h ++* ++*/ ++#ifndef __EU_FIRMWARE_H__ ++#define __EU_FIRMWARE_H__ ++ ++#define MAX_RECORD_LENGTH 16 ++ ++typedef struct ++{ ++ uint8_t length; ++ uint16_t address; ++ uint8_t type; ++ uint8_t data[MAX_RECORD_LENGTH]; ++} eu_hex_record_t; ++ ++ ++eu_hex_record_t eu_eagle_II_firmware[] = { ++ { ++ 16, ++ 0x109e, ++ 0, ++ {0x90,0x7f,0xec,0xe0,0xf4,0x54,0x80,0xff,0xc4,0x54,0x0f,0xff,0xe0,0x54,0x07,0x2f}}, ++ { ++ 16, ++ 0x10ae, ++ 0, ++ {0x25,0xe0,0x24,0xb4,0xf5,0x82,0xe4,0x34,0x7f,0xf5,0x83,0x22,0x90,0x7f,0xb4,0xe0}}, ++ { ++ 16, ++ 0x10be, ++ 0, ++ {0x44,0x01,0xf0,0x22,0x90,0x7f,0xec,0xe0,0x24,0x27,0xf5,0x82,0xe4,0x34,0x18,0xf5}}, ++ { ++ 16, ++ 0x10ce, ++ 0, ++ {0x83,0x22,0xe2,0xfc,0x08,0xe2,0xfd,0x24,0x07,0xf5,0x82,0xe4,0x3c,0xf5,0x83,0x22}}, ++ { ++ 16, ++ 0x10de, ++ 0, ++ {0x90,0x7f,0x00,0xf0,0xe4,0xa3,0xf0,0x90,0x7f,0xb5,0x74,0x02,0xf0,0x22,0xca,0xee}}, ++ { ++ 16, ++ 0x10ee, ++ 0, ++ {0xca,0xc9,0xef,0xc9,0x7b,0x01,0x8b,0x69,0x8a,0x6a,0x89,0x6b,0xea,0x49,0x22,0xf0}}, ++ { ++ 16, ++ 0x10fe, ++ 0, ++ {0x74,0x18,0x90,0x7f,0xd4,0xf0,0x74,0x01,0x90,0x7f,0xd5,0xf0,0x22,0x90,0x7f,0xb4}}, ++ { ++ 16, ++ 0x110e, ++ 0, ++ {0xe0,0x44,0x02,0xf0,0x22,0xee,0x90,0x7f,0xd4,0xf0,0xef,0x90,0x7f,0xd5,0xf0,0x22}}, ++ { ++ 16, ++ 0x111e, ++ 0, ++ {0x90,0x7f,0x00,0xf0,0x90,0x7f,0xb5,0x74,0x01,0xf0,0x22,0xe4,0xf5,0x0d,0xf5,0x0c}}, ++ { ++ 5, ++ 0x112e, ++ 0, ++ {0xf5,0x0b,0xf5,0x0a,0x22}}, ++ { ++ 16, ++ 0x9ee, ++ 0, ++ {0x12,0x11,0x29,0x75,0x92,0x47,0x90,0x48,0x39,0xf0,0x12,0x0d,0x73,0x90,0x18,0x00}}, ++ { ++ 16, ++ 0x9fe, ++ 0, ++ {0x74,0x01,0xf0,0x90,0x18,0x20,0x74,0x40,0xf0,0xe4,0x90,0x18,0x21,0xf0,0x90,0x18}}, ++ { ++ 16, ++ 0xa0e, ++ 0, ++ {0x22,0x74,0x40,0xf0,0x90,0x18,0x23,0x74,0x06,0xf0,0xe4,0x90,0x18,0x7b,0xf0,0x90}}, ++ { ++ 16, ++ 0xa1e, ++ 0, ++ {0x18,0x7c,0xf0,0x90,0x18,0x27,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x7f,0x92,0xe0,0xa2}}, ++ { ++ 16, ++ 0xa2e, ++ 0, ++ {0xe3,0x92,0x02,0xc2,0x12,0xc2,0x11,0xc2,0x01,0xd2,0x00,0x7e,0x30,0x7f,0x00,0x8e}}, ++ { ++ 16, ++ 0xa3e, ++ 0, ++ {0x25,0x8f,0x26,0x75,0x27,0x30,0x75,0x28,0x12,0x75,0x29,0x30,0x75,0x2a,0xfa,0x75}}, ++ { ++ 16, ++ 0xa4e, ++ 0, ++ {0x0e,0x19,0x75,0x0f,0x00,0x8e,0x10,0x8f,0x11,0x75,0x08,0x01,0x75,0x09,0x84,0xe4}}, ++ { ++ 16, ++ 0xa5e, ++ 0, ++ {0xff,0xfe,0xc3,0xef,0x95,0x09,0xee,0x95,0x08,0x50,0x21,0xe5,0x11,0x2f,0xfd,0xe5}}, ++ { ++ 16, ++ 0xa6e, ++ 0, ++ {0x10,0x3e,0x8d,0x82,0xf5,0x83,0xe0,0xfd,0xe5,0x0f,0x2f,0xfb,0xe5,0x0e,0x3e,0x8b}}, ++ { ++ 16, ++ 0xa7e, ++ 0, ++ {0x82,0xf5,0x83,0xed,0xf0,0x0f,0xbf,0x00,0x01,0x0e,0x80,0xd6,0xc3,0x74,0x00,0x95}}, ++ { ++ 16, ++ 0xa8e, ++ 0, ++ {0x0f,0xff,0x74,0x30,0x95,0x0e,0xfe,0x85,0x0e,0x25,0x85,0x0f,0x26,0xc3,0xe5,0x28}}, ++ { ++ 16, ++ 0xa9e, ++ 0, ++ {0x9f,0xf5,0x28,0xe5,0x27,0x9e,0xf5,0x27,0xc3,0xe5,0x2a,0x9f,0xf5,0x2a,0xe5,0x29}}, ++ { ++ 16, ++ 0xaae, ++ 0, ++ {0x9e,0xf5,0x29,0x12,0x0f,0xf0,0x90,0x7f,0xa5,0xe0,0x54,0x10,0xff,0xc4,0x54,0x0f}}, ++ { ++ 16, ++ 0xabe, ++ 0, ++ {0x44,0x50,0xf5,0x42,0x13,0xe4,0x33,0xf5,0x41,0x90,0x7f,0xab,0x74,0xff,0xf0,0x12}}, ++ { ++ 16, ++ 0xace, ++ 0, ++ {0x10,0x00,0x90,0x18,0x32,0xe0,0x30,0xe4,0x06,0x53,0x2e,0xfb,0x85,0x2e,0xb0,0xd2}}, ++ { ++ 16, ++ 0xade, ++ 0, ++ {0xe8,0x43,0xd8,0x20,0x20,0x11,0x41,0x20,0x11,0x0b,0xd2,0x21,0x75,0x74,0x07,0x75}}, ++ { ++ 16, ++ 0xaee, ++ 0, ++ {0x75,0xd0,0x12,0x37,0x2f,0x12,0x11,0x29,0x7f,0x40,0x7e,0x92,0x7d,0x04,0x7c,0x00}}, ++ { ++ 16, ++ 0xafe, ++ 0, ++ {0xab,0x0d,0xaa,0x0c,0xa9,0x0b,0xa8,0x0a,0xc3,0x12,0x0d,0x3c,0x50,0xd6,0x20,0x11}}, ++ { ++ 16, ++ 0xb0e, ++ 0, ++ {0xd3,0xe5,0x0d,0x24,0x01,0xf5,0x0d,0xe4,0x35,0x0c,0xf5,0x0c,0xe4,0x35,0x0b,0xf5}}, ++ { ++ 16, ++ 0xb1e, ++ 0, ++ {0x0b,0xe4,0x35,0x0a,0xf5,0x0a,0x80,0xd0,0x90,0x18,0x2a,0xe0,0xff,0x64,0xb4,0x60}}, ++ { ++ 16, ++ 0xb2e, ++ 0, ++ {0x04,0xef,0xb4,0xb6,0x03,0x12,0x0e,0x39,0x12,0x0f,0xf8,0x53,0x8e,0xf8,0x43,0x8e}}, ++ { ++ 16, ++ 0xb3e, ++ 0, ++ {0x28,0xc2,0x12,0x30,0x11,0x05,0x12,0x08,0x00,0xc2,0x11,0x12,0x12,0xee,0x30,0x12}}, ++ { ++ 16, ++ 0xb4e, ++ 0, ++ {0x0e,0x90,0x18,0x21,0xe0,0x70,0x08,0x12,0x32,0xb4,0x50,0x03,0x12,0x32,0x8e,0xc2}}, ++ { ++ 16, ++ 0xb5e, ++ 0, ++ {0x13,0xe5,0x46,0xb4,0x04,0x05,0x12,0x3d,0x02,0x80,0xd8,0xe5,0x46,0xb4,0x03,0xd3}}, ++ { ++ 5, ++ 0xb6e, ++ 0, ++ {0x12,0x39,0x63,0x80,0xce}}, ++ { ++ 16, ++ 0xe39, ++ 0, ++ {0x90,0x19,0x00,0xe0,0x24,0x00,0x78,0x01,0xf2,0xe4,0x34,0x19,0x18,0xf2,0x90,0x18}}, ++ { ++ 16, ++ 0xe49, ++ 0, ++ {0x32,0xe0,0xff,0x30,0xe5,0x11,0x12,0x10,0xd0,0xe0,0x44,0x40,0xf0,0x74,0x08,0x2d}}, ++ { ++ 16, ++ 0xe59, ++ 0, ++ {0x12,0x10,0xd7,0xe4,0xf0,0x80,0x12,0x78,0x00,0x12,0x10,0xd0,0xe0,0x54,0xbf,0xf0}}, ++ { ++ 16, ++ 0xe69, ++ 0, ++ {0x74,0x08,0x2d,0x12,0x10,0xd7,0x74,0xc8,0xf0,0x90,0x18,0x2b,0xe0,0x90,0x19,0x08}}, ++ { ++ 16, ++ 0xe79, ++ 0, ++ {0xf0,0x90,0x18,0x2c,0xe0,0x90,0x19,0x09,0xf0,0x90,0x18,0x2e,0xe0,0x90,0x19,0x0b}}, ++ { ++ 16, ++ 0xe89, ++ 0, ++ {0xf0,0x90,0x18,0x2d,0xe0,0x14,0x90,0x19,0x0a,0xf0,0xe0,0xb4,0xff,0x04,0xa3,0xe0}}, ++ { ++ 16, ++ 0xe99, ++ 0, ++ {0x14,0xf0,0x90,0x18,0x2f,0xe0,0x90,0x19,0x0c,0xf0,0x90,0x18,0x30,0xe0,0x90,0x19}}, ++ { ++ 16, ++ 0xea9, ++ 0, ++ {0x0d,0xf0,0xef,0x30,0xe3,0x0a,0x90,0x18,0x75,0xe0,0x90,0x19,0x0c,0xf0,0x80,0x08}}, ++ { ++ 16, ++ 0xeb9, ++ 0, ++ {0x90,0x18,0x39,0xe0,0x90,0x19,0x0c,0xf0,0x90,0x19,0x0d,0xc0,0x83,0xc0,0x82,0xe0}}, ++ { ++ 16, ++ 0xec9, ++ 0, ++ {0xff,0x90,0x7f,0x92,0xe0,0x54,0xf0,0xfe,0xc4,0x54,0x0f,0xfe,0xef,0x4e,0xd0,0x82}}, ++ { ++ 4, ++ 0xed9, ++ 0, ++ {0xd0,0x83,0xf0,0x22}}, ++ { ++ 16, ++ 0x800, ++ 0, ++ {0x90,0x7f,0xe8,0xe0,0xb4,0x40,0x0a,0x12,0x00,0x80,0x50,0x02,0x21,0xed,0x02,0x11}}, ++ { ++ 16, ++ 0x810, ++ 0, ++ {0x0b,0x90,0x7f,0xe8,0xe0,0xb4,0xc0,0x0a,0x12,0x02,0xec,0x50,0x02,0x21,0xed,0x02}}, ++ { ++ 16, ++ 0x820, ++ 0, ++ {0x11,0x0b,0x90,0x7f,0xe9,0xe0,0x70,0x02,0x21,0x36,0x14,0x70,0x02,0x21,0x71,0x24}}, ++ { ++ 16, ++ 0x830, ++ 0, ++ {0xfe,0x70,0x02,0x21,0xb8,0x24,0xfb,0x70,0x02,0x21,0x2d,0x14,0x70,0x02,0x21,0x02}}, ++ { ++ 16, ++ 0x840, ++ 0, ++ {0x14,0x70,0x02,0x01,0xda,0x14,0x70,0x02,0x01,0xe3,0x24,0x05,0x60,0x02,0x21,0xe7}}, ++ { ++ 16, ++ 0x850, ++ 0, ++ {0x90,0x7f,0xeb,0xe0,0x24,0xfe,0x60,0x15,0x14,0x60,0x29,0x24,0x02,0x70,0x76,0xe5}}, ++ { ++ 16, ++ 0x860, ++ 0, ++ {0x25,0x90,0x7f,0xd4,0xf0,0xe5,0x26,0x90,0x7f,0xd5,0xf0,0x21,0xea,0x90,0x7f,0xea}}, ++ { ++ 16, ++ 0x870, ++ 0, ++ {0xe0,0xff,0x12,0x11,0xbf,0x12,0x10,0xec,0x60,0x05,0x12,0x11,0x13,0x21,0xea,0x12}}, ++ { ++ 16, ++ 0x880, ++ 0, ++ {0x10,0xba,0x21,0xea,0x90,0x18,0x2a,0xe0,0xfd,0x64,0xb4,0x60,0x05,0xed,0x64,0xb6}}, ++ { ++ 16, ++ 0x890, ++ 0, ++ {0x70,0x11,0x90,0x7f,0xea,0xe0,0xb4,0x04,0x0a,0x90,0x18,0x01,0x74,0x1e,0x12,0x10}}, ++ { ++ 16, ++ 0x8a0, ++ 0, ++ {0xfd,0x21,0xea,0xed,0x64,0xb4,0x60,0x05,0xed,0x64,0xb6,0x70,0x11,0x90,0x7f,0xea}}, ++ { ++ 16, ++ 0x8b0, ++ 0, ++ {0xe0,0xb4,0x03,0x0a,0x90,0x18,0x01,0x74,0x1a,0x12,0x10,0xfd,0x21,0xea,0x90,0x7f}}, ++ { ++ 16, ++ 0x8c0, ++ 0, ++ {0xea,0xe0,0xff,0x12,0x14,0x22,0x12,0x10,0xec,0x60,0x05,0x12,0x11,0x13,0x21,0xea}}, ++ { ++ 16, ++ 0x8d0, ++ 0, ++ {0x12,0x10,0xba,0x21,0xea,0x12,0x10,0xba,0x21,0xea,0x12,0x10,0xc2,0xe0,0x12,0x11}}, ++ { ++ 16, ++ 0x8e0, ++ 0, ++ {0x1e,0x21,0xea,0x90,0x7f,0xea,0xe0,0xff,0x12,0x10,0xc2,0xef,0xf0,0x90,0x7f,0xec}}, ++ { ++ 16, ++ 0x8f0, ++ 0, ++ {0xe0,0x64,0x02,0x60,0x02,0x21,0xea,0x12,0x10,0xc5,0xe0,0xf5,0x47,0x12,0x39,0x92}}, ++ { ++ 16, ++ 0x900, ++ 0, ++ {0x21,0xea,0x90,0x7f,0xea,0xe0,0x90,0x18,0x26,0xf0,0xe0,0xb4,0x01,0x05,0x12,0x32}}, ++ { ++ 16, ++ 0x910, ++ 0, ++ {0xf9,0x21,0xea,0x90,0x18,0x26,0xe0,0x60,0x02,0x21,0xea,0x90,0x18,0x27,0xf0,0xa3}}, ++ { ++ 16, ++ 0x920, ++ 0, ++ {0xf0,0xa3,0xf0,0xf5,0x47,0x12,0x39,0x92,0x12,0x32,0xb4,0x21,0xea,0x90,0x18,0x26}}, ++ { ++ 16, ++ 0x930, ++ 0, ++ {0xe0,0x12,0x11,0x1e,0x21,0xea,0x90,0x7f,0xe8,0xe0,0x24,0x7f,0x60,0x19,0x14,0x60}}, ++ { ++ 16, ++ 0x940, ++ 0, ++ {0x20,0x24,0x02,0x70,0x27,0xa2,0x00,0xe4,0x33,0xff,0x25,0xe0,0xff,0xa2,0x01,0xe4}}, ++ { ++ 16, ++ 0x950, ++ 0, ++ {0x33,0x4f,0x12,0x10,0xde,0x21,0xea,0xe4,0x90,0x7f,0x00,0xf0,0x12,0x10,0xe3,0x21}}, ++ { ++ 16, ++ 0x960, ++ 0, ++ {0xea,0x12,0x10,0x9e,0xe0,0x54,0x01,0x12,0x10,0xde,0x21,0xea,0x12,0x10,0xba,0x21}}, ++ { ++ 16, ++ 0x970, ++ 0, ++ {0xea,0x90,0x7f,0xe8,0xe0,0x24,0xfe,0x60,0x14,0x24,0x02,0x70,0x6d,0x90,0x7f,0xea}}, ++ { ++ 16, ++ 0x980, ++ 0, ++ {0xe0,0xb4,0x01,0x04,0xc2,0x00,0x21,0xea,0x12,0x10,0xba,0x21,0xea,0x90,0x7f,0xea}}, ++ { ++ 16, ++ 0x990, ++ 0, ++ {0xe0,0x70,0x20,0x12,0x10,0x9e,0xe4,0xf0,0x90,0x7f,0xec,0xe0,0x54,0x80,0xff,0x13}}, ++ { ++ 16, ++ 0x9a0, ++ 0, ++ {0x13,0x13,0x54,0x1f,0xff,0xe0,0x54,0x07,0x2f,0x90,0x7f,0xd7,0xf0,0xe0,0x44,0x20}}, ++ { ++ 16, ++ 0x9b0, ++ 0, ++ {0xf0,0x80,0x37,0x12,0x10,0xba,0x80,0x32,0x90,0x7f,0xe8,0xe0,0x24,0xfe,0x60,0x14}}, ++ { ++ 16, ++ 0x9c0, ++ 0, ++ {0x24,0x02,0x70,0x26,0x90,0x7f,0xea,0xe0,0xb4,0x01,0x04,0xd2,0x00,0x80,0x1b,0x12}}, ++ { ++ 16, ++ 0x9d0, ++ 0, ++ {0x10,0xba,0x80,0x16,0x90,0x7f,0xea,0xe0,0x70,0x08,0x12,0x10,0x9e,0x74,0x01,0xf0}}, ++ { ++ 14, ++ 0x9e0, ++ 0, ++ {0x80,0x08,0x12,0x10,0xba,0x80,0x03,0x12,0x10,0xba,0x12,0x11,0x0b,0x22}}, ++ { ++ 3, ++ 0x33, ++ 0, ++ {0x02,0x07,0xfc}}, ++ { ++ 4, ++ 0x7fc, ++ 0, ++ {0x53,0xd8,0xef,0x32}}, ++ { ++ 3, ++ 0x63, ++ 0, ++ {0x02,0x13,0xf5}}, ++ { ++ 16, ++ 0x13f5, ++ 0, ++ {0xc0,0xe0,0xc0,0x83,0xc0,0x82,0xc0,0x85,0xc0,0x84,0xc0,0x86,0x75,0x86,0x00,0xc0}}, ++ { ++ 16, ++ 0x1405, ++ 0, ++ {0xd0,0x90,0x48,0x2d,0xe0,0x54,0x03,0x24,0xff,0x92,0x15,0x53,0xd8,0xf7,0xd0,0xd0}}, ++ { ++ 13, ++ 0x1415, ++ 0, ++ {0xd0,0x86,0xd0,0x84,0xd0,0x85,0xd0,0x82,0xd0,0x83,0xd0,0xe0,0x32}}, ++ { ++ 16, ++ 0x12a9, ++ 0, ++ {0xc1,0x07,0xc1,0x08,0xc1,0x0a,0xc1,0x0b,0xc1,0x0e,0xc1,0x0f,0xc1,0x10,0x01,0x37}}, ++ { ++ 16, ++ 0x12b9, ++ 0, ++ {0x00,0x01,0x38,0x00,0x01,0x39,0x00,0x01,0x3f,0x14,0x01,0x44,0x00,0x01,0x47,0x00}}, ++ { ++ 16, ++ 0x12c9, ++ 0, ++ {0x41,0x18,0x00,0x01,0x41,0x18,0x20,0x40,0x41,0x18,0x21,0x00,0x41,0x18,0x22,0x40}}, ++ { ++ 12, ++ 0x12d9, ++ 0, ++ {0x41,0x18,0x23,0x06,0x41,0x18,0x7b,0x00,0x41,0x18,0x7c,0x00}}, ++ { ++ 16, ++ 0xedd, ++ 0, ++ {0x85,0x2c,0x90,0x43,0x2c,0x04,0x85,0x2c,0x90,0x53,0x2c,0xfb,0x85,0x2c,0x90,0x43}}, ++ { ++ 16, ++ 0xeed, ++ 0, ++ {0x2c,0x08,0x85,0x2c,0x90,0x53,0x2c,0xf7,0x85,0x2c,0x90,0x22,0x90,0x7f,0xb4,0xe0}}, ++ { ++ 16, ++ 0xefd, ++ 0, ++ {0x44,0x01,0xf0,0x22,0x90,0x7f,0xed,0xe0,0xff,0x90,0x7f,0xec,0xe0,0xfd,0x22,0x90}}, ++ { ++ 16, ++ 0xf0d, ++ 0, ++ {0x7f,0xee,0xe0,0x75,0x1b,0x00,0xf5,0x1c,0xa3,0xe0,0xfe,0xe4,0xee,0x42,0x1b,0x90}}, ++ { ++ 16, ++ 0xf1d, ++ 0, ++ {0x7f,0xec,0xe0,0x75,0x19,0x00,0xf5,0x1a,0xa3,0xe0,0xfe,0xe4,0xee,0x42,0x19,0x22}}, ++ { ++ 16, ++ 0xf2d, ++ 0, ++ {0x90,0x7f,0xec,0xe0,0x75,0x13,0x00,0xf5,0x14,0xa3,0xe0,0xfe,0xe4,0xee,0x42,0x13}}, ++ { ++ 16, ++ 0xf3d, ++ 0, ++ {0x22,0x75,0x48,0x01,0x75,0x49,0xff,0xc2,0x09,0xd2,0x04,0x90,0x7f,0xee,0xe0,0xf5}}, ++ { ++ 16, ++ 0xf4d, ++ 0, ++ {0x3a,0x22,0x53,0x91,0xef,0x90,0x7f,0xab,0x22,0x90,0x7f,0xed,0xe0,0xfe,0x90,0x7f}}, ++ { ++ 16, ++ 0xf5d, ++ 0, ++ {0xec,0xe0,0x7c,0x00,0x24,0x00,0x22,0x43,0x2e,0x08,0x85,0x2e,0xb0,0x22,0x43,0x2e}}, ++ { ++ 15, ++ 0xf6d, ++ 0, ++ {0x10,0x85,0x2e,0xb0,0x22,0x85,0x2d,0xa0,0x53,0x2d,0xf7,0x85,0x2d,0xa0,0x22}}, ++ { ++ 16, ++ 0xd73, ++ 0, ++ {0x90,0x48,0x39,0xe4,0xf0,0x90,0x7f,0x93,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x78,0x4a}}, ++ { ++ 16, ++ 0xd83, ++ 0, ++ {0xf0,0x90,0x78,0x49,0x04,0xf0,0xe4,0x90,0x78,0x4b,0xf0,0xf5,0x2b,0x85,0x2b,0x80}}, ++ { ++ 16, ++ 0xd93, ++ 0, ++ {0x43,0x2b,0x08,0x85,0x2b,0x80,0x43,0x2b,0x10,0x85,0x2b,0x80,0xf5,0x2e,0x85,0x2e}}, ++ { ++ 16, ++ 0xda3, ++ 0, ++ {0xb0,0x43,0x2e,0x01,0x85,0x2e,0xb0,0x43,0x2e,0x02,0x85,0x2e,0xb0,0x43,0x2e,0x04}}, ++ { ++ 16, ++ 0xdb3, ++ 0, ++ {0x85,0x2e,0xb0,0x12,0x0f,0x64,0x12,0x0f,0x6b,0x78,0x80,0x76,0x88,0xe6,0xf5,0xb2}}, ++ { ++ 16, ++ 0xdc3, ++ 0, ++ {0x08,0x76,0x08,0xe6,0xf5,0xb3,0x08,0x76,0xe4,0xe6,0xf5,0xb4,0xe6,0x44,0x10,0xf6}}, ++ { ++ 16, ++ 0xdd3, ++ 0, ++ {0xe6,0x90,0x7f,0x9e,0xf0,0xe6,0x54,0xdf,0xf6,0xe6,0xf0,0x08,0x76,0x80,0xe6,0xf5}}, ++ { ++ 16, ++ 0xde3, ++ 0, ++ {0xb5,0xe4,0xf5,0x2c,0x12,0x0e,0xdd,0x53,0x2c,0xef,0x85,0x2c,0x90,0x75,0x2d,0x01}}, ++ { ++ 16, ++ 0xdf3, ++ 0, ++ {0x85,0x2d,0xa0,0x53,0x2d,0xfe,0x85,0x2d,0xa0,0x53,0x2d,0xfd,0x85,0x2d,0xa0,0x53}}, ++ { ++ 16, ++ 0xe03, ++ 0, ++ {0x2d,0xfb,0x12,0x0f,0x72,0x53,0x2d,0xef,0x85,0x2d,0xa0,0x90,0x7f,0xaf,0xe0,0x44}}, ++ { ++ 16, ++ 0xe13, ++ 0, ++ {0x01,0xf0,0x90,0x7f,0xae,0xe0,0x44,0x1f,0xf0,0x12,0x39,0x92,0x75,0xc8,0x01,0xe4}}, ++ { ++ 16, ++ 0xe23, ++ 0, ++ {0x90,0x7f,0xe2,0xf0,0x90,0x78,0x57,0x74,0x03,0xf0,0x53,0xd8,0xf7,0x43,0xe8,0x10}}, ++ { ++ 6, ++ 0xe33, ++ 0, ++ {0x53,0xf8,0xef,0xd2,0xaf,0x22}}, ++ { ++ 16, ++ 0x1000, ++ 0, ++ {0x75,0x3f,0x14,0xd2,0x17,0xe4,0xf5,0x45,0xc2,0x16,0xc2,0x14,0xc2,0x03,0xc2,0x04}}, ++ { ++ 16, ++ 0x1010, ++ 0, ++ {0xf5,0x4e,0xf5,0x4f,0xc2,0x09,0xc2,0x05,0xc2,0x06,0xf5,0x3b,0xf5,0x3c,0xf5,0x46}}, ++ { ++ 16, ++ 0x1020, ++ 0, ++ {0xd2,0x07,0xc2,0x15,0xf5,0x3e,0x12,0x35,0x4b,0x12,0x07,0xf3,0x90,0x18,0x24,0x74}}, ++ { ++ 16, ++ 0x1030, ++ 0, ++ {0x03,0xf0,0x43,0x2c,0x10,0x12,0x0e,0xdd,0x53,0x2c,0xef,0x85,0x2c,0x90,0x12,0x34}}, ++ { ++ 16, ++ 0x1040, ++ 0, ++ {0x0d,0x12,0x0f,0xf0,0x90,0x7f,0xa5,0xe0,0x54,0x10,0xff,0xc4,0x54,0x0f,0x44,0x50}}, ++ { ++ 16, ++ 0x1050, ++ 0, ++ {0xf5,0x42,0x13,0xe4,0x33,0xf5,0x41,0x7a,0x18,0x7b,0x2a,0x7d,0x50,0xe4,0xff,0xfe}}, ++ { ++ 16, ++ 0x1060, ++ 0, ++ {0x12,0x38,0xa1,0xe4,0x90,0x18,0x25,0xf0,0x90,0x18,0x32,0xe0,0x30,0xe3,0x0c,0x90}}, ++ { ++ 16, ++ 0x1070, ++ 0, ++ {0x18,0x75,0xe0,0x54,0xc0,0x90,0x18,0x25,0xf0,0x80,0x0a,0x90,0x18,0x39,0xe0,0x54}}, ++ { ++ 16, ++ 0x1080, ++ 0, ++ {0xc0,0x90,0x18,0x25,0xf0,0x12,0x38,0x00,0x90,0x18,0x32,0xe0,0xff,0x54,0x01,0xf5}}, ++ { ++ 14, ++ 0x1090, ++ 0, ++ {0x44,0xef,0x54,0x06,0x90,0x18,0x7a,0xf0,0xe0,0xff,0xc3,0x13,0xf0,0x22}}, ++ { ++ 1, ++ 0xff8, ++ 0, ++ {0x22}}, ++ { ++ 16, ++ 0x80, ++ 0, ++ {0xc2,0x1d,0x90,0x7f,0xea,0xe0,0x12,0x0d,0x4d,0x01,0x00,0x01,0x01,0x6d,0x03,0x00}}, ++ { ++ 16, ++ 0x90, ++ 0, ++ {0xcb,0x04,0x02,0xbb,0x11,0x00,0xa8,0x12,0x01,0x58,0x14,0x02,0x3e,0x15,0x02,0x52}}, ++ { ++ 16, ++ 0xa0, ++ 0, ++ {0x16,0x02,0x1c,0xf0,0x00,0x00,0x02,0xe6,0x12,0x0f,0x2d,0x90,0x7f,0xb4,0xe0,0x44}}, ++ { ++ 16, ++ 0xb0, ++ 0, ++ {0x02,0xf0,0x12,0x33,0x6e,0x7f,0xe8,0x7e,0x03,0x12,0x14,0x4e,0xd2,0x21,0x85,0x13}}, ++ { ++ 16, ++ 0xc0, ++ 0, ++ {0x74,0x85,0x14,0x75,0x12,0x37,0x2f,0xd2,0x1d,0x41,0xe9,0x30,0x03,0x05,0x12,0x0e}}, ++ { ++ 16, ++ 0xd0, ++ 0, ++ {0xf9,0x41,0xe9,0xe4,0x90,0x7f,0xc5,0xf0,0xff,0x12,0x31,0x84,0x12,0x0f,0x01,0x12}}, ++ { ++ 16, ++ 0xe0, ++ 0, ++ {0x32,0x49,0xe5,0x46,0x64,0x03,0x60,0x11,0x90,0x7f,0xb4,0xe0,0x20,0xe3,0xf9,0xd2}}, ++ { ++ 16, ++ 0xf0, ++ 0, ++ {0x1b,0xe4,0xfd,0xff,0x12,0x31,0xb3,0x41,0xe9,0x12,0x0f,0x3e,0xd2,0x1d,0x41,0xe9}}, ++ { ++ 16, ++ 0x100, ++ 0, ++ {0x30,0x03,0x05,0x12,0x0e,0xf9,0x41,0xe9,0xe4,0x90,0x7f,0xc5,0xf0,0x12,0x0f,0x01}}, ++ { ++ 16, ++ 0x110, ++ 0, ++ {0x12,0x32,0x49,0xe5,0x46,0x64,0x03,0x60,0x38,0x12,0x0f,0x48,0x90,0x7f,0xb4,0xe0}}, ++ { ++ 16, ++ 0x120, ++ 0, ++ {0x20,0xe3,0xf9,0xe4,0xf5,0x12,0xe5,0x12,0xc3,0x95,0x3a,0x50,0x0f,0xd2,0x1b,0xe4}}, ++ { ++ 16, ++ 0x130, ++ 0, ++ {0xfd,0xaf,0x12,0x12,0x31,0xb3,0x05,0x12,0x05,0x12,0x80,0xea,0xc2,0x1b,0x7d,0x01}}, ++ { ++ 16, ++ 0x140, ++ 0, ++ {0xe4,0xff,0x12,0x31,0xb3,0xe5,0x46,0x64,0x04,0x60,0x02,0x41,0xe9,0xc2,0x17,0x41}}, ++ { ++ 16, ++ 0x150, ++ 0, ++ {0xe9,0x12,0x0f,0x3e,0xd2,0x1d,0x41,0xe9,0x90,0x7f,0xec,0xe0,0x90,0x18,0x7b,0xf0}}, ++ { ++ 16, ++ 0x160, ++ 0, ++ {0x90,0x7f,0xed,0xe0,0x90,0x18,0x7c,0xf0,0x12,0x35,0x4b,0x41,0xe9,0x90,0x7f,0xed}}, ++ { ++ 16, ++ 0x170, ++ 0, ++ {0xe0,0x60,0x05,0x12,0x0e,0xf9,0x41,0xe9,0x90,0x7f,0xec,0xe0,0x24,0xfe,0x60,0x17}}, ++ { ++ 16, ++ 0x180, ++ 0, ++ {0x24,0xfc,0x60,0x22,0x14,0x60,0x4b,0x14,0x60,0x50,0x24,0x05,0x60,0x02,0x41,0x17}}, ++ { ++ 16, ++ 0x190, ++ 0, ++ {0xe4,0xf5,0x46,0xd2,0x13,0x41,0xe9,0xe5,0x46,0x64,0x03,0x70,0x02,0x41,0xe9,0x75}}, ++ { ++ 16, ++ 0x1a0, ++ 0, ++ {0x46,0x03,0xd2,0x13,0x41,0xe9,0xe5,0x46,0x64,0x04,0x70,0x02,0x41,0xe9,0x30,0x0b}}, ++ { ++ 16, ++ 0x1b0, ++ 0, ++ {0x1a,0x53,0xb1,0xfd,0x43,0xb6,0x02,0x7f,0xfa,0x7e,0x00,0x12,0x14,0x4e,0x43,0xb1}}, ++ { ++ 16, ++ 0x1c0, ++ 0, ++ {0x04,0x43,0xb6,0x04,0x7f,0x32,0x7e,0x00,0x12,0x14,0x4e,0x75,0x46,0x04,0xd2,0x13}}, ++ { ++ 16, ++ 0x1d0, ++ 0, ++ {0x41,0xe9,0x53,0x2d,0xef,0x12,0x0f,0x72,0x41,0xe9,0x12,0x07,0xf3,0x12,0x34,0x0d}}, ++ { ++ 16, ++ 0x1e0, ++ 0, ++ {0x12,0x0e,0xe0,0x43,0x2d,0x10,0x85,0x2d,0xa0,0x43,0x2d,0x08,0x85,0x2d,0xa0,0x75}}, ++ { ++ 16, ++ 0x1f0, ++ 0, ++ {0x3f,0x14,0xd2,0x17,0xe4,0xf5,0x45,0xc2,0x09,0xc2,0x04,0xc2,0x03,0xc2,0x10,0x90}}, ++ { ++ 16, ++ 0x200, ++ 0, ++ {0x18,0x7b,0xe0,0x20,0xe4,0x03,0x12,0x0f,0x6b,0x90,0x18,0x7b,0xe0,0x30,0xe3,0x02}}, ++ { ++ 16, ++ 0x210, ++ 0, ++ {0x41,0xe9,0x12,0x0f,0x64,0x41,0xe9,0x12,0x0e,0xf9,0x41,0xe9,0xe4,0x90,0x7f,0xc5}}, ++ { ++ 16, ++ 0x220, ++ 0, ++ {0xf0,0x90,0x7f,0xb4,0xe0,0x20,0xe3,0xf9,0x12,0x0f,0x56,0xf5,0x14,0xec,0x3e,0xf5}}, ++ { ++ 16, ++ 0x230, ++ 0, ++ {0x13,0x90,0x7f,0x00,0xe0,0x85,0x14,0x82,0x85,0x13,0x83,0xf0,0x41,0xe9,0x90,0x7f}}, ++ { ++ 16, ++ 0x240, ++ 0, ++ {0xed,0xe0,0x44,0x40,0x90,0x18,0x22,0xf0,0x90,0x7f,0xec,0xe0,0x90,0x18,0x23,0xf0}}, ++ { ++ 16, ++ 0x250, ++ 0, ++ {0x41,0xe9,0x90,0x7f,0xee,0xe0,0x75,0x15,0x00,0xf5,0x16,0xa3,0xe0,0xfe,0xe4,0xee}}, ++ { ++ 16, ++ 0x260, ++ 0, ++ {0x42,0x15,0x12,0x0f,0x2d,0xc3,0xe5,0x14,0x94,0x5a,0xe5,0x13,0x94,0x00,0x50,0x05}}, ++ { ++ 16, ++ 0x270, ++ 0, ++ {0x12,0x0e,0xf9,0x41,0xe9,0xe5,0x16,0x45,0x15,0x60,0x6e,0xe4,0x90,0x7f,0xc5,0xf0}}, ++ { ++ 16, ++ 0x280, ++ 0, ++ {0x90,0x7f,0xb4,0xe0,0x20,0xe3,0xf9,0x90,0x7f,0xc5,0xe0,0xf5,0x17,0x7a,0x7e,0x79}}, ++ { ++ 11, ++ 0x290, ++ 0, ++ {0xc0,0x7e,0x7e,0x7f,0xc0,0xcb,0xef,0xcb,0xfd,0xaf,0x14}}, ++ { ++ 16, ++ 0x29b, ++ 0, ++ {0xae,0x13,0x12,0x39,0x2e,0xaf,0x17,0x7e,0x00,0xef,0x25,0x14,0xf5,0x14,0xee,0x35}}, ++ { ++ 16, ++ 0x2ab, ++ 0, ++ {0x13,0xf5,0x13,0xc3,0xe5,0x16,0x9f,0xf5,0x16,0xe5,0x15,0x9e,0xf5,0x15,0x80,0xba}}, ++ { ++ 16, ++ 0x2bb, ++ 0, ++ {0x20,0x0f,0x23,0x12,0x0f,0x2d,0xe5,0x14,0x45,0x13,0x70,0x0d,0x75,0x33,0x80,0x75}}, ++ { ++ 16, ++ 0x2cb, ++ 0, ++ {0x34,0x50,0x75,0x31,0x40,0xf5,0x32,0x80,0x15,0x75,0x33,0xb0,0xe4,0xf5,0x34,0x75}}, ++ { ++ 16, ++ 0x2db, ++ 0, ++ {0x31,0xa0,0xf5,0x32,0x80,0x08,0x12,0x0e,0xf9,0x80,0x03,0x12,0x0e,0xf9,0xa2,0x1d}}, ++ { ++ 1, ++ 0x2eb, ++ 0, ++ {0x22}}, ++ { ++ 16, ++ 0x2ec, ++ 0, ++ {0xc2,0x1e,0x90,0x7f,0xea,0xe0,0x60,0x48,0x24,0xed,0x70,0x02,0x61,0x9c,0x24,0xfc}}, ++ { ++ 16, ++ 0x2fc, ++ 0, ++ {0x70,0x02,0x81,0x16,0x14,0x70,0x02,0x81,0x8a,0x24,0x28,0x70,0x02,0x61,0xc7,0x14}}, ++ { ++ 16, ++ 0x30c, ++ 0, ++ {0x70,0x02,0x61,0xe2,0x24,0xec,0x60,0x02,0x81,0xd1,0x30,0x03,0x05,0x12,0x0e,0xf9}}, ++ { ++ 16, ++ 0x31c, ++ 0, ++ {0x81,0xd4,0xe4,0xff,0x12,0x31,0x84,0x12,0x0f,0x01,0x12,0x32,0x49,0x7b,0x01,0x7a}}, ++ { ++ 16, ++ 0x32c, ++ 0, ++ {0x7f,0x79,0x00,0xe4,0xff,0x12,0x31,0xfc,0x90,0x7f,0xb5,0x74,0x02,0xf0,0x81,0xd4}}, ++ { ++ 16, ++ 0x33c, ++ 0, ++ {0x30,0x03,0x05,0x12,0x0e,0xf9,0x81,0xd4,0xe5,0x46,0x64,0x03,0x60,0x3b,0x12,0x0f}}, ++ { ++ 16, ++ 0x34c, ++ 0, ++ {0x48,0x12,0x0f,0x01,0x12,0x32,0x49,0xe4,0xf5,0x18,0xe5,0x18,0xc3,0x95,0x3a,0x50}}, ++ { ++ 16, ++ 0x35c, ++ 0, ++ {0x11,0x7b,0x01,0x7a,0x7f,0x79,0x00,0xaf,0x18,0x12,0x31,0xfc,0x05,0x18,0x05,0x18}}, ++ { ++ 16, ++ 0x36c, ++ 0, ++ {0x80,0xe8,0x90,0x7f,0xb5,0xe5,0x3a,0xf0,0x7d,0xdf,0x7f,0x7f,0x12,0x32,0x49,0xc2}}, ++ { ++ 16, ++ 0x37c, ++ 0, ++ {0x1b,0xe4,0xfd,0xff,0x12,0x31,0xb3,0x81,0xd4,0x12,0x0f,0x01,0x12,0x32,0x49,0x75}}, ++ { ++ 16, ++ 0x38c, ++ 0, ++ {0x3f,0x14,0xd2,0x03,0xd2,0x17,0xe4,0xf5,0x45,0x12,0x0f,0x48,0xd2,0x1e,0x81,0xd4}}, ++ { ++ 16, ++ 0x39c, ++ 0, ++ {0x90,0x7f,0xee,0xe0,0x64,0x04,0x60,0x09,0xa3,0xe0,0x60,0x05,0x12,0x0e,0xf9,0x81}}, ++ { ++ 16, ++ 0x3ac, ++ 0, ++ {0xd4,0x90,0x7f,0x00,0x74,0x07,0xf0,0xa3,0x74,0x03,0xf0,0xa3,0x74,0x01,0xf0,0xa3}}, ++ { ++ 16, ++ 0x3bc, ++ 0, ++ {0x74,0x31,0xf0,0x90,0x7f,0xb5,0x74,0x04,0xf0,0x81,0xd4,0x12,0x0f,0x56,0xf5,0x1a}}, ++ { ++ 16, ++ 0x3cc, ++ 0, ++ {0xec,0x3e,0xf5,0x19,0x85,0x1a,0x82,0xf5,0x83,0xe0,0x90,0x7f,0x00,0xf0,0x90,0x7f}}, ++ { ++ 16, ++ 0x3dc, ++ 0, ++ {0xb5,0x74,0x01,0xf0,0x81,0xd4,0x90,0x48,0x1f,0xe0,0x90,0x7f,0x00,0xf0,0x90,0x48}}, ++ { ++ 16, ++ 0x3ec, ++ 0, ++ {0x26,0xe0,0x90,0x7f,0x01,0xf0,0x90,0x48,0x25,0xe0,0x90,0x7f,0x02,0xf0,0x7b,0x01}}, ++ { ++ 16, ++ 0x3fc, ++ 0, ++ {0x7a,0x7f,0x79,0x03,0xe5,0x50,0x85,0x51,0xf0,0x12,0x0d,0x1d,0x90,0x7f,0x05,0xe5}}, ++ { ++ 16, ++ 0x40c, ++ 0, ++ {0x43,0xf0,0x90,0x7f,0xb5,0x74,0x06,0xf0,0x81,0xd4,0x12,0x0f,0x0c,0xe5,0x1c,0x45}}, ++ { ++ 16, ++ 0x41c, ++ 0, ++ {0x1b,0x70,0x02,0x81,0xd4,0xc3,0xe5,0x1c,0x94,0x40,0xe5,0x1b,0x94,0x00,0x50,0x05}}, ++ { ++ 16, ++ 0x42c, ++ 0, ++ {0x85,0x1c,0x1d,0x80,0x03,0x75,0x1d,0x40,0xe4,0xf5,0x18,0xe5,0x18,0xc3,0x95,0x1d}}, ++ { ++ 16, ++ 0x43c, ++ 0, ++ {0x50,0x12,0x74,0x00,0x25,0x18,0xf5,0x82,0xe4,0x34,0x7f,0xf5,0x83,0x74,0xcd,0xf0}}, ++ { ++ 16, ++ 0x44c, ++ 0, ++ {0x05,0x18,0x80,0xe7,0xad,0x1d,0x7a,0x7f,0x79,0x00,0x7e,0x7f,0x7f,0x00,0xcb,0xef}}, ++ { ++ 16, ++ 0x45c, ++ 0, ++ {0xcb,0xaf,0x1a,0xae,0x19,0x12,0x38,0xa1,0x90,0x7f,0xb5,0xe5,0x1d,0xf0,0xff,0x7e}}, ++ { ++ 16, ++ 0x46c, ++ 0, ++ {0x00,0x25,0x1a,0xf5,0x1a,0xee,0x35,0x19,0xf5,0x19,0xc3,0xe5,0x1c,0x9f,0xf5,0x1c}}, ++ { ++ 16, ++ 0x47c, ++ 0, ++ {0xe5,0x1b,0x9e,0xf5,0x1b,0x90,0x7f,0xb4,0xe0,0x30,0xe2,0x91,0x80,0xf7,0x12,0x0f}}, ++ { ++ 16, ++ 0x48c, ++ 0, ++ {0x0c,0x12,0x0f,0x04,0x12,0x32,0x49,0xe5,0x2c,0x20,0xe4,0x04,0x7f,0x01,0x80,0x02}}, ++ { ++ 16, ++ 0x49c, ++ 0, ++ {0x7f,0x00,0x8f,0x18,0x43,0x2c,0x10,0x85,0x2c,0x90,0x12,0x04,0xd7,0x90,0x7f,0x00}}, ++ { ++ 16, ++ 0x4ac, ++ 0, ++ {0xf0,0x90,0x48,0x04,0xe0,0x90,0x7f,0x01,0xf0,0x12,0x04,0xd7,0x90,0x7f,0x02,0xf0}}, ++ { ++ 16, ++ 0x4bc, ++ 0, ++ {0xe4,0xa3,0xf0,0x90,0x7f,0xb5,0xe5,0x1c,0xf0,0xe5,0x18,0x60,0x03,0x53,0x2c,0xef}}, ++ { ++ 16, ++ 0x4cc, ++ 0, ++ {0x85,0x2c,0x90,0x80,0x03,0x12,0x0e,0xf9,0xa2,0x1e,0x22,0x12,0x31,0xa3,0x43,0x2c}}, ++ { ++ 16, ++ 0x4dc, ++ 0, ++ {0x02,0x85,0x2c,0x90,0x53,0x2c,0xfc,0x85,0x2c,0x90,0x12,0x31,0xa3,0x90,0x48,0x03}}, ++ { ++ 2, ++ 0x4ec, ++ 0, ++ {0xe0,0x22}}, ++ { ++ 16, ++ 0x1474, ++ 0, ++ {0xc0,0xe0,0xc0,0x83,0xc0,0x82,0xc0,0x85,0xc0,0x84,0xc0,0x86,0x75,0x86,0x00,0xd2}}, ++ { ++ 16, ++ 0x1484, ++ 0, ++ {0x11,0x12,0x0f,0x4f,0x74,0x01,0xf0,0xd0,0x86,0xd0,0x84,0xd0,0x85,0xd0,0x82,0xd0}}, ++ { ++ 4, ++ 0x1494, ++ 0, ++ {0x83,0xd0,0xe0,0x32}}, ++ { ++ 16, ++ 0x14bc, ++ 0, ++ {0xc0,0xe0,0xc0,0x83,0xc0,0x82,0xc0,0x85,0xc0,0x84,0xc0,0x86,0x75,0x86,0x00,0x12}}, ++ { ++ 16, ++ 0x14cc, ++ 0, ++ {0x0f,0x4f,0x74,0x04,0xf0,0xd0,0x86,0xd0,0x84,0xd0,0x85,0xd0,0x82,0xd0,0x83,0xd0}}, ++ { ++ 2, ++ 0x14dc, ++ 0, ++ {0xe0,0x32}}, ++ { ++ 16, ++ 0xf7c, ++ 0, ++ {0xc0,0xe0,0xc0,0x83,0xc0,0x82,0xc0,0x85,0xc0,0x84,0xc0,0x86,0x75,0x86,0x00,0x20}}, ++ { ++ 16, ++ 0xf8c, ++ 0, ++ {0x17,0x0e,0x05,0x45,0x90,0x18,0x24,0xe0,0x65,0x45,0x70,0x04,0xf5,0x45,0xd2,0x17}}, ++ { ++ 16, ++ 0xf9c, ++ 0, ++ {0x30,0x0f,0x0f,0x75,0xc8,0x01,0x85,0x34,0xcc,0x85,0x33,0xcd,0x75,0xc8,0x05,0x85}}, ++ { ++ 16, ++ 0xfac, ++ 0, ++ {0x35,0x36,0x30,0x10,0x2a,0x90,0x18,0x7b,0xe0,0x20,0xe4,0x0e,0x30,0xb7,0x08,0x53}}, ++ { ++ 16, ++ 0xfbc, ++ 0, ++ {0x2e,0xef,0x85,0x2e,0xb0,0x80,0x03,0x12,0x0f,0x6b,0x90,0x18,0x7b,0xe0,0x20,0xe3}}, ++ { ++ 16, ++ 0xfcc, ++ 0, ++ {0x0e,0x30,0xb6,0x08,0x53,0x2e,0xf7,0x85,0x2e,0xb0,0x80,0x03,0x12,0x0f,0x64,0xd2}}, ++ { ++ 16, ++ 0xfdc, ++ 0, ++ {0x16,0x12,0x0f,0x4f,0x74,0x02,0xf0,0xd0,0x86,0xd0,0x84,0xd0,0x85,0xd0,0x82,0xd0}}, ++ { ++ 4, ++ 0xfec, ++ 0, ++ {0x83,0xd0,0xe0,0x32}}, ++ { ++ 16, ++ 0x1391, ++ 0, ++ {0xc0,0xe0,0xc0,0x83,0xc0,0x82,0xc0,0x85,0xc0,0x84,0xc0,0x86,0x75,0x86,0x00,0xd2}}, ++ { ++ 16, ++ 0x13a1, ++ 0, ++ {0x13,0x75,0x46,0x00,0xd2,0x14,0x90,0x7f,0xc9,0xe4,0xf0,0x90,0x7f,0xcd,0xf0,0x12}}, ++ { ++ 16, ++ 0x13b1, ++ 0, ++ {0x0f,0x4f,0x74,0x10,0xf0,0xd0,0x86,0xd0,0x84,0xd0,0x85,0xd0,0x82,0xd0,0x83,0xd0}}, ++ { ++ 2, ++ 0x13c1, ++ 0, ++ {0xe0,0x32}}, ++ { ++ 1, ++ 0xff9, ++ 0, ++ {0x32}}, ++ { ++ 16, ++ 0x1498, ++ 0, ++ {0xc0,0xe0,0xc0,0x83,0xc0,0x82,0xc0,0x85,0xc0,0x84,0xc0,0x86,0x75,0x86,0x00,0xd2}}, ++ { ++ 16, ++ 0x14a8, ++ 0, ++ {0x12,0x12,0x0f,0x4f,0x74,0x08,0xf0,0xd0,0x86,0xd0,0x84,0xd0,0x85,0xd0,0x82,0xd0}}, ++ { ++ 4, ++ 0x14b8, ++ 0, ++ {0x83,0xd0,0xe0,0x32}}, ++ { ++ 1, ++ 0xffa, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0xffb, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0xffc, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0xffd, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0xffe, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0xfff, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0x156c, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0x156d, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0x156e, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0x156f, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0x1570, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0x1571, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0x1572, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0x1573, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0x1574, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0x1575, ++ 0, ++ {0x32}}, ++ { ++ 16, ++ 0x144e, ++ 0, ++ {0x8e,0x1e,0x8f,0x1f,0x12,0x15,0x55,0x90,0x18,0x32,0xe0,0x30,0xe3,0x06,0x12,0x14}}, ++ { ++ 16, ++ 0x145e, ++ 0, ++ {0x6d,0x02,0x14,0x6d,0x30,0x02,0x07,0xaf,0x1f,0xae,0x1e,0x12,0x15,0x55,0x22,0xaf}}, ++ { ++ 6, ++ 0x146e, ++ 0, ++ {0x1f,0xae,0x1e,0x02,0x15,0x55}}, ++ { ++ 16, ++ 0x12ee, ++ 0, ++ {0x90,0x18,0x32,0xe0,0x30,0xe5,0x31,0xe5,0xb1,0x30,0xe0,0x0d,0x90,0x7f,0xd6,0xe0}}, ++ { ++ 16, ++ 0x12fe, ++ 0, ++ {0x54,0xf7,0xf0,0xe4,0x90,0x18,0x21,0xf0,0x22,0x90,0x7f,0xd6,0xe0,0x44,0x08,0xf0}}, ++ { ++ 16, ++ 0x130e, ++ 0, ++ {0xe0,0x44,0x02,0xf0,0x90,0x7f,0xab,0x74,0xff,0xf0,0x90,0x7f,0xa9,0xf0,0xa3,0xf0}}, ++ { ++ 9, ++ 0x131e, ++ 0, ++ {0x53,0x91,0xef,0xe4,0x90,0x18,0x21,0xf0,0x22}}, ++ { ++ 16, ++ 0x14ff, ++ 0, ++ {0x90,0x7f,0xd6,0xe0,0x30,0xe7,0x16,0xe0,0x44,0x01,0xf0,0x7f,0x0c,0x7e,0x00,0x12}}, ++ { ++ 14, ++ 0x150f, ++ 0, ++ {0x14,0x4e,0x90,0x7f,0xd6,0xe0,0x54,0xfe,0xf0,0xe0,0x44,0x80,0xf0,0x22}}, ++ { ++ 8, ++ 0x12e5, ++ 0, ++ {0x01,0x72,0x00,0x01,0x73,0x00,0xc1,0x1a}}, ++ { ++ 16, ++ 0x6e6, ++ 0, ++ {0x90,0x7d,0x00,0x74,0x08,0xf0,0xa3,0x74,0x01,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0xa3}}, ++ { ++ 16, ++ 0x6f6, ++ 0, ++ {0xf0,0xa3,0xf0,0xa3,0x74,0x14,0xf0,0xe4,0xa3,0xf0,0xa3,0x74,0x02,0xf0,0xe4,0xa3}}, ++ { ++ 16, ++ 0x706, ++ 0, ++ {0xf0,0x90,0x7d,0x1a,0x74,0x14,0xf0,0xe4,0xa3,0xf0,0x90,0x7f,0xbd,0x22,0x90,0x7f}}, ++ { ++ 16, ++ 0x716, ++ 0, ++ {0xe2,0x74,0x03,0xf0,0x90,0x78,0x57,0x22,0x05,0x39,0x53,0x38,0x1f,0xe5,0x38,0x75}}, ++ { ++ 16, ++ 0x726, ++ 0, ++ {0xf0,0x40,0xa4,0xae,0xf0,0x24,0x00,0xf5,0x4d,0xee,0x34,0x20,0xf5,0x4c,0x22,0x43}}, ++ { ++ 16, ++ 0x736, ++ 0, ++ {0x2e,0x02,0x85,0x2e,0xb0,0x22,0x53,0x2e,0xfd,0x85,0x2e,0xb0,0x22,0x53,0x65,0xef}}, ++ { ++ 16, ++ 0x746, ++ 0, ++ {0x90,0x48,0x00,0xe5,0x65,0xf0,0x90,0x18,0x32,0xe0,0x22,0x90,0x78,0x54,0x74,0x40}}, ++ { ++ 16, ++ 0x756, ++ 0, ++ {0xf0,0x90,0x78,0x55,0x74,0xff,0xf0,0x22,0x43,0x2c,0x10,0x85,0x2c,0x90,0x02,0x31}}, ++ { ++ 16, ++ 0x766, ++ 0, ++ {0xa3,0x43,0x2c,0x10,0x85,0x2c,0x90,0x43,0x2c,0x08,0x85,0x2c,0x90,0x53,0x2c,0xf7}}, ++ { ++ 16, ++ 0x776, ++ 0, ++ {0x85,0x2c,0x90,0x22,0xe4,0x90,0x7f,0xe2,0xf0,0x90,0x78,0x57,0x74,0x03,0xf0,0x53}}, ++ { ++ 16, ++ 0x786, ++ 0, ++ {0x2c,0xef,0x85,0x2c,0x90,0x22,0x43,0x2e,0x01,0x85,0x2e,0xb0,0x22,0xf5,0x37,0xf5}}, ++ { ++ 16, ++ 0x796, ++ 0, ++ {0x38,0x90,0x18,0x00,0x04,0xf0,0x22,0x24,0x0a,0xff,0x7b,0x01,0x7a,0x7d,0x79,0x00}}, ++ { ++ 16, ++ 0x7a6, ++ 0, ++ {0x22,0x90,0x18,0x22,0xe0,0x44,0x40,0xff,0x90,0x18,0x23,0xe0,0xfd,0x22,0x53,0x2e}}, ++ { ++ 16, ++ 0x7b6, ++ 0, ++ {0xfb,0x85,0x2e,0xb0,0x22,0xf5,0x82,0xe4,0x34,0x18,0xf5,0x83,0x22,0xf6,0xe6,0x90}}, ++ { ++ 16, ++ 0x7c6, ++ 0, ++ {0x7f,0x9e,0xf0,0x22,0x43,0x2e,0x04,0x85,0x2e,0xb0,0x22,0x43,0x2b,0x08,0x85,0x2b}}, ++ { ++ 16, ++ 0x7d6, ++ 0, ++ {0x80,0x22,0x43,0x2b,0x10,0x85,0x2b,0x80,0x22,0x05,0x3c,0x05,0x3b,0xe5,0x3c,0xd3}}, ++ { ++ 13, ++ 0x7e6, ++ 0, ++ {0x94,0x82,0x22,0xf5,0x83,0xef,0xf0,0xed,0x25,0xe0,0x25,0xe0,0x22}}, ++ { ++ 16, ++ 0x3184, ++ 0, ++ {0x8f,0x7a,0xad,0x7a,0x7f,0x80,0x12,0x32,0x49,0xc2,0x1b,0xad,0x7a,0xe4,0xff,0x02}}, ++ { ++ 2, ++ 0x3194, ++ 0, ++ {0x31,0xb3}}, ++ { ++ 16, ++ 0x3196, ++ 0, ++ {0xf0,0x43,0x2c,0x01,0x85,0x2c,0x90,0x53,0x2c,0xfc,0x85,0x2c,0x90,0xe4,0xff,0x20}}, ++ { ++ 13, ++ 0x31a6, ++ 0, ++ {0xb3,0x0a,0xce,0xef,0xce,0x0f,0xee,0xc3,0x94,0x50,0x40,0xf3,0x22}}, ++ { ++ 16, ++ 0x31b3, ++ 0, ++ {0xcc,0xef,0xcc,0xe5,0x2c,0x20,0xe4,0x03,0xd3,0x80,0x01,0xc3,0x92,0x1c,0x12,0x07}}, ++ { ++ 16, ++ 0x31c3, ++ 0, ++ {0x5e,0x30,0x1b,0x20,0x74,0xc0,0x2c,0xf5,0x82,0xe4,0x34,0x7e,0xf5,0x83,0xe0,0x90}}, ++ { ++ 16, ++ 0x31d3, ++ 0, ++ {0x48,0x03,0xf0,0x74,0xc1,0x2c,0xf5,0x82,0xe4,0x34,0x7e,0xf5,0x83,0xe0,0x90,0x48}}, ++ { ++ 16, ++ 0x31e3, ++ 0, ++ {0x04,0xf0,0x80,0x08,0x90,0x48,0x03,0xed,0xf0,0xa3,0xec,0xf0,0x12,0x31,0x97,0x30}}, ++ { ++ 9, ++ 0x31f3, ++ 0, ++ {0x1c,0x03,0x53,0x2c,0xef,0x85,0x2c,0x90,0x22}}, ++ { ++ 16, ++ 0x31fc, ++ 0, ++ {0x8b,0x6c,0x8a,0x6d,0x89,0x6e,0xcd,0xef,0xcd,0xe5,0x2c,0x20,0xe4,0x03,0xd3,0x80}}, ++ { ++ 16, ++ 0x320c, ++ 0, ++ {0x01,0xc3,0x92,0x1f,0x12,0x07,0x5e,0x43,0x2c,0x02,0x12,0x31,0x9a,0x90,0x48,0x03}}, ++ { ++ 16, ++ 0x321c, ++ 0, ++ {0xe0,0xab,0x6c,0xaa,0x6d,0xa9,0x6e,0x8d,0x82,0x75,0x83,0x00,0x12,0x0c,0xa6,0x90}}, ++ { ++ 16, ++ 0x322c, ++ 0, ++ {0x48,0x04,0xe0,0xff,0xed,0x7c,0x00,0x29,0xf9,0xec,0x3a,0xfa,0x90,0x00,0x01,0xef}}, ++ { ++ 13, ++ 0x323c, ++ 0, ++ {0x12,0x0c,0xa6,0x30,0x1f,0x03,0x53,0x2c,0xef,0x85,0x2c,0x90,0x22}}, ++ { ++ 16, ++ 0x3249, ++ 0, ++ {0xcc,0xef,0xcc,0xe5,0x2c,0x20,0xe4,0x03,0xd3,0x80,0x01,0xc3,0x92,0x20,0x12,0x07}}, ++ { ++ 16, ++ 0x3259, ++ 0, ++ {0x5e,0x90,0x48,0x02,0xec,0xf0,0x90,0x48,0x01,0xed,0xf0,0x43,0x2c,0x03,0x12,0x31}}, ++ { ++ 11, ++ 0x3269, ++ 0, ++ {0x9a,0x30,0x20,0x03,0x53,0x2c,0xef,0x85,0x2c,0x90,0x22}}, ++ { ++ 16, ++ 0x3274, ++ 0, ++ {0xcc,0xef,0xcc,0x12,0x07,0x5e,0x90,0x48,0x03,0xeb,0xf0,0xa3,0xed,0x12,0x31,0x96}}, ++ { ++ 10, ++ 0x3284, ++ 0, ++ {0x90,0x48,0x03,0xec,0xf0,0xa3,0xe4,0x02,0x31,0x96}}, ++ { ++ 16, ++ 0x328e, ++ 0, ++ {0xc2,0xaa,0xc2,0x12,0x90,0x18,0x32,0xe0,0x30,0xe5,0x05,0x12,0x12,0xee,0x80,0x03}}, ++ { ++ 16, ++ 0x329e, ++ 0, ++ {0x12,0x14,0xde,0x20,0x00,0x07,0x90,0x7f,0xd6,0xe0,0x20,0xe7,0xe7,0x12,0x14,0xff}}, ++ { ++ 6, ++ 0x32ae, ++ 0, ++ {0x12,0x32,0xd4,0x02,0x0f,0xf8}}, ++ { ++ 16, ++ 0x32b4, ++ 0, ++ {0xe4,0xff,0x12,0x31,0x84,0x12,0x07,0xa7,0x12,0x32,0x49,0xc2,0x1b,0x7d,0xad,0x7f}}, ++ { ++ 16, ++ 0x32c4, ++ 0, ++ {0xde,0x12,0x31,0xb3,0x7f,0x64,0x7e,0x00,0x12,0x14,0x4e,0x12,0x33,0x6e,0xd3,0x22}}, ++ { ++ 16, ++ 0x32d4, ++ 0, ++ {0x12,0x0d,0x73,0x12,0x10,0x00,0x90,0x18,0x32,0xe0,0x30,0xe4,0x03,0x12,0x07,0xb4}}, ++ { ++ 16, ++ 0x32e4, ++ 0, ++ {0xe4,0xff,0x12,0x31,0x84,0x12,0x07,0xa7,0x12,0x32,0x49,0xc2,0x1b,0xe4,0xfd,0xff}}, ++ { ++ 5, ++ 0x32f4, ++ 0, ++ {0x12,0x31,0xb3,0xd3,0x22}}, ++ { ++ 16, ++ 0x32f9, ++ 0, ++ {0x53,0x2d,0xf7,0x85,0x2d,0xa0,0x43,0x2d,0x02,0x12,0x33,0x5a,0x43,0x2d,0x08,0x12}}, ++ { ++ 16, ++ 0x3309, ++ 0, ++ {0x33,0x64,0x43,0x2d,0x01,0x12,0x33,0x64,0x43,0x2d,0x20,0x85,0x2d,0xa0,0x78,0x82}}, ++ { ++ 16, ++ 0x3319, ++ 0, ++ {0xe6,0x54,0x7f,0x12,0x07,0xc3,0x53,0x2d,0xef,0x12,0x33,0x5a,0x43,0x2d,0x10,0x85}}, ++ { ++ 16, ++ 0x3329, ++ 0, ++ {0x2d,0xa0,0x7f,0x0a,0x7e,0x00,0x12,0x14,0x4e,0x43,0x2d,0x04,0x85,0x2d,0xa0,0x90}}, ++ { ++ 16, ++ 0x3339, ++ 0, ++ {0x18,0x32,0xe0,0x30,0xe4,0x0c,0x90,0x18,0x7b,0xe0,0x20,0xe2,0x0f,0x12,0x07,0x3c}}, ++ { ++ 16, ++ 0x3349, ++ 0, ++ {0x80,0x0a,0x90,0x18,0x7b,0xe0,0x20,0xe2,0x03,0x12,0x07,0xb4,0xc2,0x10,0xd2,0x0b}}, ++ { ++ 16, ++ 0x3359, ++ 0, ++ {0x22,0x85,0x2d,0xa0,0x7f,0x0a,0x7e,0x00,0x02,0x14,0x4e,0x85,0x2d,0xa0,0x7f,0x64}}, ++ { ++ 5, ++ 0x3369, ++ 0, ++ {0x7e,0x00,0x02,0x14,0x4e}}, ++ { ++ 16, ++ 0x336e, ++ 0, ++ {0xc2,0x10,0x12,0x07,0xca,0x12,0x07,0x8c,0x12,0x07,0x35,0x12,0x07,0xd1,0x12,0x07}}, ++ { ++ 16, ++ 0x337e, ++ 0, ++ {0xd8,0x43,0x2e,0x08,0x85,0x2e,0xb0,0x43,0x2e,0x10,0x85,0x2e,0xb0,0x7d,0x2c,0x12}}, ++ { ++ 16, ++ 0x338e, ++ 0, ++ {0x34,0x06,0xfb,0xfd,0xff,0x12,0x32,0x74,0x7d,0x2d,0x12,0x34,0x06,0xfd,0xff,0x12}}, ++ { ++ 16, ++ 0x339e, ++ 0, ++ {0x32,0x74,0x7d,0x2e,0xe4,0xff,0x12,0x32,0x49,0xe4,0x7d,0x80,0x7f,0x02,0x12,0x32}}, ++ { ++ 16, ++ 0x33ae, ++ 0, ++ {0x74,0x7d,0x2f,0xe4,0xff,0x12,0x32,0x49,0x7b,0xcf,0x7d,0x02,0x7f,0x18,0x12,0x32}}, ++ { ++ 16, ++ 0x33be, ++ 0, ++ {0x74,0x7f,0x01,0x7e,0x00,0x12,0x14,0x4e,0x53,0x2d,0xfe,0x85,0x2d,0xa0,0x7f,0x02}}, ++ { ++ 16, ++ 0x33ce, ++ 0, ++ {0x7e,0x00,0x12,0x14,0x4e,0x53,0x2d,0xf7,0x85,0x2d,0xa0,0x53,0x2d,0xfb,0x85,0x2d}}, ++ { ++ 16, ++ 0x33de, ++ 0, ++ {0xa0,0x53,0xb6,0xfd,0x7f,0x0a,0x7e,0x00,0x12,0x14,0x4e,0x53,0xb1,0xfb,0x43,0xb6}}, ++ { ++ 16, ++ 0x33ee, ++ 0, ++ {0x04,0x7f,0x0a,0x7e,0x00,0x12,0x14,0x4e,0x7f,0x01,0x7e,0x00,0x12,0x14,0x4e,0x53}}, ++ { ++ 15, ++ 0x33fe, ++ 0, ++ {0x2d,0xfd,0x85,0x2d,0xa0,0xc2,0x0b,0x22,0xe4,0xff,0x12,0x32,0x49,0xe4,0x22}}, ++ { ++ 16, ++ 0x340d, ++ 0, ++ {0x90,0x48,0x12,0xe4,0xf0,0xa3,0x04,0xf0,0x90,0x18,0x20,0xe0,0x14,0x90,0x48,0x18}}, ++ { ++ 16, ++ 0x341d, ++ 0, ++ {0xf0,0x90,0x48,0x1e,0x74,0x3f,0xf0,0x90,0x48,0x11,0x74,0x3d,0xf0,0x90,0x48,0x10}}, ++ { ++ 16, ++ 0x342d, ++ 0, ++ {0x74,0x3f,0xf0,0x78,0x82,0xe6,0x44,0x40,0x12,0x07,0xc3,0x7f,0x02,0x7e,0x00,0x12}}, ++ { ++ 10, ++ 0x343d, ++ 0, ++ {0x14,0x4e,0x78,0x82,0xe6,0x54,0xbf,0x02,0x07,0xc3}}, ++ { ++ 9, ++ 0x7f3, ++ 0, ++ {0xe4,0xf5,0x39,0x12,0x07,0x93,0xc2,0x0e,0x22}}, ++ { ++ 16, ++ 0x3447, ++ 0, ++ {0x30,0x04,0x66,0x20,0x09,0x28,0x90,0x7f,0xb4,0xe0,0x20,0xe3,0x05,0xd2,0x09,0xe4}}, ++ { ++ 16, ++ 0x3457, ++ 0, ++ {0xf5,0x73,0xe5,0x49,0x15,0x49,0x70,0x02,0x15,0x48,0xe5,0x49,0x45,0x48,0x60,0x02}}, ++ { ++ 16, ++ 0x3467, ++ 0, ++ {0xa1,0x4a,0x90,0x7f,0xb4,0xe0,0x44,0x03,0xf0,0xc2,0x04,0xc2,0x09,0x22,0xd2,0x1b}}, ++ { ++ 16, ++ 0x3477, ++ 0, ++ {0xe4,0xfd,0xaf,0x73,0x12,0x31,0xb3,0x05,0x73,0x05,0x73,0xe5,0x73,0xc3,0x95,0x3a}}, ++ { ++ 16, ++ 0x3487, ++ 0, ++ {0x50,0x02,0xa1,0x4a,0x90,0x7f,0xb4,0xe0,0x44,0x02,0xf0,0xc2,0x09,0xc2,0x04,0xe5}}, ++ { ++ 16, ++ 0x3497, ++ 0, ++ {0x3a,0x64,0x10,0x60,0x02,0xa1,0x4a,0xc2,0x1b,0x0d,0xff,0x12,0x31,0xb3,0x75,0x3f}}, ++ { ++ 16, ++ 0x34a7, ++ 0, ++ {0x14,0xd2,0x03,0xc2,0x17,0xe4,0xf5,0x72,0x22,0x20,0x03,0x02,0xa1,0x4a,0x20,0x17}}, ++ { ++ 16, ++ 0x34b7, ++ 0, ++ {0x02,0xa1,0x4a,0xe5,0x72,0x70,0x3e,0x7d,0xdf,0x7f,0x7f,0x12,0x32,0x49,0x7b,0x00}}, ++ { ++ 16, ++ 0x34c7, ++ 0, ++ {0x7a,0x00,0x79,0x6f,0xe4,0xff,0x12,0x31,0xfc,0xe5,0x6f,0x70,0x04,0xe5,0x70,0x60}}, ++ { ++ 16, ++ 0x34d7, ++ 0, ++ {0x18,0x90,0x7f,0xbc,0xe0,0x20,0xe1,0x11,0x75,0x72,0x01,0x75,0x3a,0x10,0x7d,0xd7}}, ++ { ++ 16, ++ 0x34e7, ++ 0, ++ {0x7f,0x7f,0x12,0x32,0x49,0xe4,0xf5,0x73,0x22,0xd5,0x3f,0x06,0x75,0x72,0x01,0xd2}}, ++ { ++ 16, ++ 0x34f7, ++ 0, ++ {0x17,0x22,0xc2,0x17,0x22,0xe5,0x3f,0x60,0x0e,0xe5,0x73,0x12,0x07,0x9d,0x12,0x31}}, ++ { ++ 16, ++ 0x3507, ++ 0, ++ {0xfc,0x05,0x73,0x05,0x73,0x80,0x1b,0xe4,0xf5,0x71,0xe5,0x71,0xc3,0x95,0x3a,0x50}}, ++ { ++ 16, ++ 0x3517, ++ 0, ++ {0x11,0x74,0x0a,0x25,0x71,0xf5,0x82,0xe4,0x34,0x7d,0xf5,0x83,0xe4,0xf0,0x05,0x71}}, ++ { ++ 16, ++ 0x3527, ++ 0, ++ {0x80,0xe8,0xe5,0x73,0xc3,0x95,0x3a,0x50,0x04,0xe5,0x3f,0x70,0x16,0x12,0x06,0xe6}}, ++ { ++ 16, ++ 0x3537, ++ 0, ++ {0x74,0x1c,0xf0,0xc2,0x1b,0xe4,0xfd,0xff,0x12,0x31,0xb3,0x75,0x3f,0x14,0xc2,0x03}}, ++ { ++ 4, ++ 0x3547, ++ 0, ++ {0xe4,0xf5,0x72,0x22}}, ++ { ++ 16, ++ 0x354b, ++ 0, ++ {0x90,0x18,0x7b,0xe0,0x30,0xe1,0x0f,0x90,0x18,0x7c,0xe0,0x30,0xe1,0x05,0x12,0x07}}, ++ { ++ 16, ++ 0x355b, ++ 0, ++ {0x3c,0x80,0x03,0x12,0x07,0x35,0x90,0x18,0x7b,0xe0,0x30,0xe0,0x12,0x90,0x18,0x7c}}, ++ { ++ 16, ++ 0x356b, ++ 0, ++ {0xe0,0x30,0xe0,0x08,0x53,0x2e,0xfe,0x85,0x2e,0xb0,0x80,0x03,0x12,0x07,0x8c,0x90}}, ++ { ++ 16, ++ 0x357b, ++ 0, ++ {0x18,0x7b,0xe0,0x30,0xe2,0x11,0x90,0x18,0x7c,0xe0,0x30,0xe2,0x05,0x12,0x07,0xb4}}, ++ { ++ 16, ++ 0x358b, ++ 0, ++ {0x80,0x24,0x12,0x07,0xca,0x80,0x1f,0x90,0x18,0x32,0xe0,0x30,0xe4,0x0d,0x30,0x0b}}, ++ { ++ 16, ++ 0x359b, ++ 0, ++ {0x05,0x12,0x07,0x3c,0x80,0x10,0x12,0x07,0x35,0x80,0x0b,0x30,0x0b,0x05,0x12,0x07}}, ++ { ++ 16, ++ 0x35ab, ++ 0, ++ {0xb4,0x80,0x03,0x12,0x07,0xca,0x90,0x18,0x7b,0xe0,0x30,0xe3,0x1a,0x12,0x07,0xd1}}, ++ { ++ 16, ++ 0x35bb, ++ 0, ++ {0x90,0x18,0x7c,0xe0,0x30,0xe3,0x08,0x53,0x2e,0xf7,0x85,0x2e,0xb0,0x80,0x0b,0x43}}, ++ { ++ 16, ++ 0x35cb, ++ 0, ++ {0x2e,0x08,0x85,0x2e,0xb0,0x80,0x03,0x12,0x07,0xd1,0x90,0x18,0x7b,0xe0,0x30,0xe4}}, ++ { ++ 16, ++ 0x35db, ++ 0, ++ {0x18,0x12,0x07,0xd8,0x90,0x18,0x7c,0xe0,0x30,0xe4,0x07,0x53,0x2e,0xef,0x85,0x2e}}, ++ { ++ 13, ++ 0x35eb, ++ 0, ++ {0xb0,0x22,0x43,0x2e,0x10,0x85,0x2e,0xb0,0x22,0x12,0x07,0xd8,0x22}}, ++ { ++ 16, ++ 0x35f8, ++ 0, ++ {0xe5,0x44,0x70,0x6c,0x90,0x18,0x7b,0xe0,0x20,0xe1,0x2b,0x30,0x0c,0x19,0xe5,0x3c}}, ++ { ++ 16, ++ 0x3608, ++ 0, ++ {0xd3,0x94,0x80,0x40,0x12,0xc2,0x0c,0xe5,0x2e,0x20,0xe1,0x05,0x12,0x07,0x35,0x80}}, ++ { ++ 16, ++ 0x3618, ++ 0, ++ {0x03,0x12,0x07,0x3c,0xe4,0xf5,0x3c,0x05,0x3c,0xe5,0x3c,0xd3,0x94,0x82,0x40,0x06}}, ++ { ++ 16, ++ 0x3628, ++ 0, ++ {0x12,0x07,0x35,0xe4,0xf5,0x3c,0x90,0x18,0x7b,0xe0,0x30,0xe0,0x02,0xe1,0x2e,0x30}}, ++ { ++ 16, ++ 0x3638, ++ 0, ++ {0x0d,0x1c,0xe5,0x3b,0xd3,0x94,0x80,0x40,0x15,0xc2,0x0d,0xe5,0x2e,0x20,0xe0,0x05}}, ++ { ++ 16, ++ 0x3648, ++ 0, ++ {0x12,0x07,0x8c,0x80,0x06,0x53,0x2e,0xfe,0x85,0x2e,0xb0,0xe4,0xf5,0x3b,0x05,0x3b}}, ++ { ++ 16, ++ 0x3658, ++ 0, ++ {0xe5,0x3b,0xd3,0x94,0x82,0x50,0x02,0xe1,0x2e,0x12,0x07,0x8c,0xe4,0xf5,0x3b,0x22}}, ++ { ++ 16, ++ 0x3668, ++ 0, ++ {0x90,0x18,0x32,0xe0,0x30,0xe4,0x61,0x90,0x18,0x7b,0xe0,0x30,0xe1,0x02,0xe1,0x2e}}, ++ { ++ 16, ++ 0x3678, ++ 0, ++ {0x30,0x0c,0x07,0xe5,0x3c,0xd3,0x94,0x80,0x50,0x0a,0x30,0x0d,0x32,0xe5,0x3b,0xd3}}, ++ { ++ 16, ++ 0x3688, ++ 0, ++ {0x94,0x80,0x40,0x2b,0x30,0x0c,0x02,0xc2,0x0c,0x30,0x0d,0x02,0xc2,0x0d,0xe5,0x2e}}, ++ { ++ 16, ++ 0x3698, ++ 0, ++ {0x20,0xe1,0x05,0x12,0x07,0x35,0x80,0x03,0x12,0x07,0x3c,0xe5,0x3c,0xd3,0x94,0x80}}, ++ { ++ 16, ++ 0x36a8, ++ 0, ++ {0x40,0x03,0xe4,0xf5,0x3c,0xe5,0x3b,0xd3,0x94,0x80,0x40,0x03,0xe4,0xf5,0x3b,0x12}}, ++ { ++ 16, ++ 0x36b8, ++ 0, ++ {0x07,0xdf,0x40,0x06,0x12,0x07,0x3c,0xe4,0xf5,0x3c,0xe5,0x3b,0xd3,0x94,0x82,0x40}}, ++ { ++ 16, ++ 0x36c8, ++ 0, ++ {0x65,0x12,0x07,0x3c,0xe4,0xf5,0x3b,0x22,0x90,0x18,0x7b,0xe0,0x20,0xe1,0x57,0x30}}, ++ { ++ 16, ++ 0x36d8, ++ 0, ++ {0x0c,0x07,0xe5,0x3c,0xd3,0x94,0x80,0x50,0x0a,0x30,0x0d,0x32,0xe5,0x3b,0xd3,0x94}}, ++ { ++ 16, ++ 0x36e8, ++ 0, ++ {0x80,0x40,0x2b,0x30,0x0c,0x02,0xc2,0x0c,0x30,0x0d,0x02,0xc2,0x0d,0xe5,0x2e,0x20}}, ++ { ++ 16, ++ 0x36f8, ++ 0, ++ {0xe1,0x05,0x12,0x07,0x35,0x80,0x03,0x12,0x07,0x3c,0xe5,0x3c,0xd3,0x94,0x80,0x40}}, ++ { ++ 16, ++ 0x3708, ++ 0, ++ {0x03,0xe4,0xf5,0x3c,0xe5,0x3b,0xd3,0x94,0x80,0x40,0x03,0xe4,0xf5,0x3b,0x12,0x07}}, ++ { ++ 16, ++ 0x3718, ++ 0, ++ {0xdf,0x40,0x06,0x12,0x07,0x35,0xe4,0xf5,0x3c,0xe5,0x3b,0xd3,0x94,0x82,0x40,0x06}}, ++ { ++ 7, ++ 0x3728, ++ 0, ++ {0x12,0x07,0x35,0xe4,0xf5,0x3b,0x22}}, ++ { ++ 16, ++ 0x372f, ++ 0, ++ {0x90,0x7f,0xd6,0xe0,0x44,0x04,0x12,0x37,0x67,0x44,0x08,0xf0,0x30,0x21,0x04,0xe0}}, ++ { ++ 16, ++ 0x373f, ++ 0, ++ {0x44,0x02,0xf0,0xaf,0x75,0xae,0x74,0x12,0x14,0x4e,0x90,0x7f,0xab,0x74,0xff,0xf0}}, ++ { ++ 16, ++ 0x374f, ++ 0, ++ {0x90,0x7f,0xa9,0xf0,0x90,0x7f,0xaa,0xf0,0x53,0x91,0xef,0x90,0x7f,0xd6,0xe0,0x54}}, ++ { ++ 16, ++ 0x375f, ++ 0, ++ {0xf7,0x12,0x37,0x67,0x44,0x04,0xf0,0x22,0xf0,0x7f,0x0a,0x7e,0x00,0x12,0x14,0x4e}}, ++ { ++ 5, ++ 0x376f, ++ 0, ++ {0x90,0x7f,0xd6,0xe0,0x22}}, ++ { ++ 16, ++ 0x3800, ++ 0, ++ {0x90,0x18,0x01,0x74,0x1e,0xf0,0xa3,0x74,0x03,0xf0,0x90,0x18,0x1b,0x74,0x01,0xf0}}, ++ { ++ 16, ++ 0x3810, ++ 0, ++ {0xe4,0xa3,0xf0,0xa3,0x04,0xf0,0xe4,0xa3,0xf0,0x90,0x18,0x32,0xe0,0x30,0xe3,0x04}}, ++ { ++ 16, ++ 0x3820, ++ 0, ++ {0x7e,0x45,0x80,0x02,0x7e,0x09,0xe4,0xfd,0xed,0x2e,0xfc,0x24,0x2a,0xf5,0x82,0xe4}}, ++ { ++ 16, ++ 0x3830, ++ 0, ++ {0x34,0x18,0xf5,0x83,0xe0,0xfb,0xc4,0x54,0x0f,0xfb,0xc3,0x94,0x0a,0x50,0x06,0xeb}}, ++ { ++ 16, ++ 0x3840, ++ 0, ++ {0x24,0x30,0xff,0x80,0x04,0xeb,0x24,0x37,0xff,0xed,0x25,0xe0,0x25,0xe0,0x24,0x03}}, ++ { ++ 16, ++ 0x3850, ++ 0, ++ {0xf5,0x82,0xe4,0x34,0x18,0x12,0x07,0xe9,0x24,0x04,0xf5,0x82,0xe4,0x34,0x18,0xf5}}, ++ { ++ 16, ++ 0x3860, ++ 0, ++ {0x83,0xe4,0xf0,0x74,0x2a,0x2c,0xf5,0x82,0xe4,0x34,0x18,0xf5,0x83,0xe0,0x54,0x0f}}, ++ { ++ 16, ++ 0x3870, ++ 0, ++ {0xfb,0xc3,0x94,0x0a,0x50,0x06,0xeb,0x24,0x30,0xff,0x80,0x04,0xeb,0x24,0x37,0xff}}, ++ { ++ 16, ++ 0x3880, ++ 0, ++ {0xed,0x25,0xe0,0x25,0xe0,0x24,0x05,0xf5,0x82,0xe4,0x34,0x18,0x12,0x07,0xe9,0x24}}, ++ { ++ 16, ++ 0x3890, ++ 0, ++ {0x06,0xf5,0x82,0xe4,0x34,0x18,0xf5,0x83,0xe4,0xf0,0x0d,0xed,0x64,0x06,0x70,0x88}}, ++ { ++ 1, ++ 0x38a0, ++ 0, ++ {0x22}}, ++ { ++ 16, ++ 0x38a1, ++ 0, ++ {0x8e,0x52,0x8f,0x53,0x8d,0x54,0x8a,0x55,0x8b,0x56,0xe4,0xfd,0xf5,0x57,0xe5,0x41}}, ++ { ++ 16, ++ 0x38b1, ++ 0, ++ {0x60,0x12,0xe5,0x52,0xff,0x7e,0x00,0x0d,0xee,0x24,0x80,0xf5,0x82,0xe4,0x34,0x18}}, ++ { ++ 16, ++ 0x38c1, ++ 0, ++ {0xf5,0x83,0xef,0xf0,0xe5,0x53,0xce,0xed,0xce,0x0d,0x74,0x80,0x2e,0xf5,0x82,0xe4}}, ++ { ++ 16, ++ 0x38d1, ++ 0, ++ {0x34,0x18,0xf5,0x83,0xe5,0x53,0xf0,0x7a,0x18,0x7b,0x80,0xaf,0x42,0x12,0x15,0x39}}, ++ { ++ 11, ++ 0x38e1, ++ 0, ++ {0xab,0x56,0xaa,0x55,0xad,0x54,0xaf,0x42,0x02,0x15,0x1d}}, ++ { ++ 16, ++ 0x38ec, ++ 0, ++ {0xcb,0xef,0xcb,0xca,0xee,0xca,0xcc,0xed,0xcc,0xe4,0xfd,0xe5,0x41,0x60,0x0c,0xea}}, ++ { ++ 16, ++ 0x38fc, ++ 0, ++ {0x7e,0x00,0x0d,0xee,0x24,0x7d,0x12,0x07,0xbb,0xea,0xf0,0xeb,0xce,0xed,0xce,0x0d}}, ++ { ++ 16, ++ 0x390c, ++ 0, ++ {0x74,0x7d,0x2e,0x12,0x07,0xbb,0xeb,0xf0,0xcf,0xed,0xcf,0x0d,0x74,0x7d,0x2f,0x12}}, ++ { ++ 16, ++ 0x391c, ++ 0, ++ {0x07,0xbb,0xec,0xf0,0x7a,0x18,0x7b,0x7d,0xaf,0x42,0x12,0x15,0x39,0xaf,0x42,0x02}}, ++ { ++ 2, ++ 0x392c, ++ 0, ++ {0x13,0x27}}, ++ { ++ 16, ++ 0x392e, ++ 0, ++ {0x8e,0x58,0x8f,0x59,0x8d,0x5a,0x8a,0x5b,0x8b,0x5c,0xe4,0xf5,0x5d,0xe5,0x5d,0xc3}}, ++ { ++ 16, ++ 0x393e, ++ 0, ++ {0x95,0x5a,0x50,0x20,0x05,0x59,0xe5,0x59,0xae,0x58,0x70,0x02,0x05,0x58,0x14,0xff}}, ++ { ++ 16, ++ 0x394e, ++ 0, ++ {0xe5,0x5c,0x25,0x5d,0xf5,0x82,0xe4,0x35,0x5b,0xf5,0x83,0xe0,0xfd,0x12,0x38,0xec}}, ++ { ++ 5, ++ 0x395e, ++ 0, ++ {0x05,0x5d,0x80,0xd9,0x22}}, ++ { ++ 16, ++ 0x3963, ++ 0, ++ {0x90,0x48,0x2d,0xe4,0xf0,0xc2,0x15,0x12,0x04,0xee,0x90,0x18,0x7b,0xe0,0x20,0xe1}}, ++ { ++ 16, ++ 0x3973, ++ 0, ++ {0x0f,0x90,0x18,0x32,0xe0,0x30,0xe4,0x05,0x12,0x07,0x3c,0x80,0x03,0x12,0x07,0x35}}, ++ { ++ 15, ++ 0x3983, ++ 0, ++ {0x90,0x18,0x7b,0xe0,0x20,0xe0,0x07,0xe5,0x44,0x70,0x03,0x12,0x07,0x8c,0x22}}, ++ { ++ 16, ++ 0x3992, ++ 0, ++ {0x75,0xc8,0x01,0xe5,0x47,0x70,0x66,0x90,0x18,0x32,0xe0,0x30,0xe3,0x13,0x75,0x33}}, ++ { ++ 16, ++ 0x39a2, ++ 0, ++ {0x10,0x75,0x34,0x02,0x75,0x2f,0xf7,0x75,0x30,0x35,0xe4,0xf5,0x31,0xf5,0x32,0x80}}, ++ { ++ 16, ++ 0x39b2, ++ 0, ++ {0x28,0x30,0x02,0x14,0x75,0x33,0x60,0x75,0x34,0x01,0x75,0x2f,0xfa,0x75,0x30,0x23}}, ++ { ++ 16, ++ 0x39c2, ++ 0, ++ {0x75,0x31,0x40,0x75,0x32,0x01,0x80,0x11,0x75,0x33,0xb0,0xe4,0xf5,0x34,0x75,0x2f}}, ++ { ++ 16, ++ 0x39d2, ++ 0, ++ {0xfd,0x75,0x30,0x11,0x75,0x31,0xa0,0xf5,0x32,0xc2,0x0f,0x90,0x7f,0xdd,0x74,0x01}}, ++ { ++ 16, ++ 0x39e2, ++ 0, ++ {0xf0,0x90,0x7f,0xde,0x74,0x04,0xf0,0xe4,0x90,0x7f,0xe0,0xf0,0x90,0x7f,0xe1,0xf0}}, ++ { ++ 16, ++ 0x39f2, ++ 0, ++ {0x90,0x7f,0xa1,0x04,0xf0,0x90,0x18,0x20,0x74,0x40,0xf0,0x41,0xc5,0x90,0x18,0x32}}, ++ { ++ 16, ++ 0x3a02, ++ 0, ++ {0xe0,0x30,0xe3,0x08,0x75,0x33,0xc0,0x75,0x34,0xba,0x80,0x11,0x30,0x02,0x08,0x75}}, ++ { ++ 16, ++ 0x3a12, ++ 0, ++ {0x33,0xd5,0x75,0x34,0xd1,0x80,0x06,0x75,0x33,0xea,0x75,0x34,0xe8,0xd2,0x0f,0xe4}}, ++ { ++ 16, ++ 0x3a22, ++ 0, ++ {0x90,0x7f,0xdd,0xf0,0x90,0x7f,0xde,0xf0,0x90,0x7f,0xdf,0xf0,0x90,0x7f,0xdd,0xe0}}, ++ { ++ 16, ++ 0x3a32, ++ 0, ++ {0x54,0x7f,0xf0,0xe4,0x90,0x7f,0xf8,0xf0,0x90,0x7f,0xe0,0x04,0xf0,0xe4,0x90,0x7f}}, ++ { ++ 16, ++ 0x3a42, ++ 0, ++ {0xe1,0xf0,0x90,0x7f,0xa1,0xe0,0x54,0xfe,0xf0,0x90,0x18,0x20,0x74,0x35,0xf0,0xe5}}, ++ { ++ 16, ++ 0x3a52, ++ 0, ++ {0x47,0x14,0xb4,0x08,0x00,0x50,0x56,0x90,0x3a,0x5f,0x25,0xe0,0x73,0x41,0x6f,0x41}}, ++ { ++ 16, ++ 0x3a62, ++ 0, ++ {0x77,0x41,0x7f,0x41,0x87,0x41,0x8f,0x41,0x97,0x41,0x9f,0x41,0xa7,0x75,0x4a,0x00}}, ++ { ++ 16, ++ 0x3a72, ++ 0, ++ {0x75,0x4b,0x9f,0x80,0x3e,0x75,0x4a,0x01,0x75,0x4b,0x09,0x80,0x36,0x75,0x4a,0x01}}, ++ { ++ 16, ++ 0x3a82, ++ 0, ++ {0x75,0x4b,0xa8,0x80,0x2e,0x75,0x4a,0x02,0x75,0x4b,0x12,0x80,0x26,0x75,0x4a,0x02}}, ++ { ++ 16, ++ 0x3a92, ++ 0, ++ {0x75,0x4b,0x7c,0x80,0x1e,0x75,0x4a,0x03,0x75,0x4b,0x1b,0x80,0x16,0x75,0x4a,0x03}}, ++ { ++ 16, ++ 0x3aa2, ++ 0, ++ {0x75,0x4b,0x85,0x80,0x0e,0x75,0x4a,0x03,0x75,0x4b,0xef,0x80,0x06,0x75,0x4a,0x00}}, ++ { ++ 16, ++ 0x3ab2, ++ 0, ++ {0x75,0x4b,0x9f,0xae,0x4a,0xaf,0x4b,0x7c,0x00,0x7d,0x35,0x12,0x0c,0xc8,0x8f,0x35}}, ++ { ++ 16, ++ 0x3ac2, ++ 0, ++ {0xe4,0xf5,0x36,0x12,0x34,0x0d,0x12,0x07,0xf3,0x90,0x7f,0xdd,0xe0,0x44,0x1a,0xf0}}, ++ { ++ 16, ++ 0x3ad2, ++ 0, ++ {0x90,0x7f,0xde,0xe0,0x44,0x11,0xf0,0x90,0x7f,0xdf,0xe0,0x44,0x15,0xf0,0xe4,0x90}}, ++ { ++ 8, ++ 0x3ae2, ++ 0, ++ {0x7f,0xc9,0xf0,0x90,0x7f,0xcd,0xf0,0x22}}, ++ { ++ 16, ++ 0x3aea, ++ 0, ++ {0xe4,0xfe,0x30,0x15,0x20,0xee,0xc3,0x94,0x0a,0x50,0x1a,0xc2,0x15,0x0e,0xe4,0xff}}, ++ { ++ 16, ++ 0x3afa, ++ 0, ++ {0x20,0xb2,0xef,0x20,0xb1,0xec,0xef,0xc3,0x94,0x6a,0x50,0xe6,0x0f,0x90,0x48,0x08}}, ++ { ++ 8, ++ 0x3b0a, ++ 0, ++ {0xe0,0xf5,0x7b,0x80,0xeb,0xc2,0x15,0x22}}, ++ { ++ 16, ++ 0x3b12, ++ 0, ++ {0xe4,0xfd,0x90,0x18,0x00,0xe0,0xf9,0x64,0x01,0x60,0x04,0xe9,0xb4,0x04,0x1a,0x30}}, ++ { ++ 16, ++ 0x3b22, ++ 0, ++ {0x87,0x17,0x90,0x7f,0xb8,0xe0,0x20,0xe1,0x10,0x30,0x15,0x03,0x02,0x3a,0xea,0x90}}, ++ { ++ 16, ++ 0x3b32, ++ 0, ++ {0x18,0x00,0x74,0x04,0xf0,0x12,0x06,0x38,0x22,0xe9,0xb4,0x04,0x13,0x30,0x87,0x07}}, ++ { ++ 16, ++ 0x3b42, ++ 0, ++ {0x90,0x7f,0xb8,0xe0,0x30,0xe1,0x09,0xc2,0x0e,0x90,0x18,0x00,0x74,0x01,0xf0,0x22}}, ++ { ++ 16, ++ 0x3b52, ++ 0, ++ {0xe9,0x64,0x01,0x70,0x1e,0x20,0x0e,0x1b,0x30,0x87,0x18,0x90,0x7f,0xb8,0xe0,0x30}}, ++ { ++ 16, ++ 0x3b62, ++ 0, ++ {0xe1,0x11,0xd2,0x0e,0x75,0xc8,0x01,0x85,0x30,0xcc,0x85,0x2f,0xcd,0x75,0xc8,0x05}}, ++ { ++ 16, ++ 0x3b72, ++ 0, ++ {0xc2,0x07,0x22,0xe9,0x64,0x01,0x60,0x1c,0xe9,0x64,0x04,0x60,0x17,0x30,0x15,0x14}}, ++ { ++ 16, ++ 0x3b82, ++ 0, ++ {0x12,0x3a,0xea,0xe4,0x12,0x07,0x93,0x75,0xc8,0x01,0x85,0x34,0xcc,0x85,0x33,0xcd}}, ++ { ++ 16, ++ 0x3b92, ++ 0, ++ {0x75,0xc8,0x05,0x22,0xe9,0xb4,0x01,0x0d,0x30,0x87,0x0a,0x30,0xcf,0x07,0x90,0x7f}}, ++ { ++ 16, ++ 0x3ba2, ++ 0, ++ {0xb8,0xe0,0x20,0xe1,0x15,0xe9,0x64,0x02,0x70,0x5c,0x30,0x87,0x59,0xe5,0x39,0x64}}, ++ { ++ 16, ++ 0x3bb2, ++ 0, ++ {0x20,0x60,0x53,0x90,0x7f,0xb8,0xe0,0x30,0xe1,0x4c,0xc2,0x0e,0x90,0x18,0x00,0x74}}, ++ { ++ 16, ++ 0x3bc2, ++ 0, ++ {0x02,0xf0,0xe4,0xfd,0xc2,0x07,0x75,0xc8,0x01,0x12,0x07,0x1e,0x05,0x38,0x90,0x78}}, ++ { ++ 16, ++ 0x3bd2, ++ 0, ++ {0x4f,0x74,0x78,0xf0,0x90,0x78,0x50,0x74,0x58,0xf0,0x90,0x78,0x51,0xe5,0x4c,0xf0}}, ++ { ++ 16, ++ 0x3be2, ++ 0, ++ {0x90,0x78,0x52,0xe5,0x4d,0xf0,0x12,0x07,0x51,0x0d,0x90,0x78,0x55,0xe0,0x60,0xfa}}, ++ { ++ 16, ++ 0x3bf2, ++ 0, ++ {0xed,0xc3,0x94,0x08,0x50,0x10,0xe5,0x39,0x64,0x20,0x60,0x0a,0x30,0x87,0x07,0x90}}, ++ { ++ 16, ++ 0x3c02, ++ 0, ++ {0x7f,0xb8,0xe0,0x20,0xe1,0xc3,0x90,0x18,0x00,0xe0,0xff,0xb4,0x02,0x10,0x90,0x7f}}, ++ { ++ 16, ++ 0x3c12, ++ 0, ++ {0xb8,0xe0,0x20,0xe1,0x09,0xc2,0x07,0x90,0x18,0x00,0x74,0x03,0xf0,0x22,0xef,0x64}}, ++ { ++ 16, ++ 0x3c22, ++ 0, ++ {0x03,0x60,0x02,0x81,0xa9,0xc2,0x07,0x90,0x7f,0xb8,0xe0,0x20,0xe1,0x37,0xe5,0x39}}, ++ { ++ 16, ++ 0x3c32, ++ 0, ++ {0x60,0x33,0x15,0x39,0x53,0x37,0x1f,0xe5,0x37,0x12,0x07,0x25,0x05,0x37,0x90,0x78}}, ++ { ++ 16, ++ 0x3c42, ++ 0, ++ {0x4f,0xe5,0x4c,0xf0,0x90,0x78,0x50,0xe5,0x4d,0xf0,0x90,0x78,0x51,0x74,0x7e,0xf0}}, ++ { ++ 16, ++ 0x3c52, ++ 0, ++ {0x90,0x78,0x52,0x74,0x00,0xf0,0x12,0x07,0x51,0x90,0x78,0x55,0xe0,0x60,0xfa,0x90}}, ++ { ++ 16, ++ 0x3c62, ++ 0, ++ {0x7f,0xb9,0x74,0x40,0xf0,0x30,0x87,0x2c,0xe5,0x39,0x64,0x20,0x60,0x26,0x12,0x07}}, ++ { ++ 16, ++ 0x3c72, ++ 0, ++ {0x1e,0x05,0x38,0x90,0x78,0x4f,0x74,0x78,0xf0,0x90,0x78,0x50,0x74,0x58,0xf0,0x90}}, ++ { ++ 16, ++ 0x3c82, ++ 0, ++ {0x78,0x51,0xe5,0x4c,0xf0,0x90,0x78,0x52,0xe5,0x4d,0xf0,0x12,0x07,0x51,0x90,0x78}}, ++ { ++ 16, ++ 0x3c92, ++ 0, ++ {0x55,0xe0,0x60,0xfa,0xe5,0x39,0x70,0x0f,0x12,0x07,0x93,0x75,0xc8,0x01,0x85,0x34}}, ++ { ++ 8, ++ 0x3ca2, ++ 0, ++ {0xcc,0x85,0x33,0xcd,0x75,0xc8,0x05,0x22}}, ++ { ++ 16, ++ 0x1258, ++ 0, ++ {0x90,0x7f,0xbc,0xe0,0x20,0xe1,0x48,0x7d,0xcd,0x7f,0x7f,0x12,0x32,0x49,0x12,0x07}}, ++ { ++ 16, ++ 0x1268, ++ 0, ++ {0xa0,0x7f,0x0a,0x12,0x31,0xfc,0x90,0x7d,0x0a,0xe0,0x70,0x04,0xa3,0xe0,0x60,0x2d}}, ++ { ++ 16, ++ 0x1278, ++ 0, ++ {0xc2,0x0a,0x90,0x7d,0x00,0x74,0x08,0xf0,0xa3,0x74,0x01,0xf0,0xe4,0xa3,0xf0,0xa3}}, ++ { ++ 16, ++ 0x1288, ++ 0, ++ {0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x74,0x06,0xf0,0xe4,0xa3,0xf0,0xa3,0x04,0xf0,0xe4}}, ++ { ++ 16, ++ 0x1298, ++ 0, ++ {0xa3,0xf0,0x90,0x7d,0x0c,0x74,0x06,0x12,0x07,0x0c,0x74,0x0e,0xf0,0xd3,0x22,0xc3}}, ++ { ++ 1, ++ 0x12a8, ++ 0, ++ {0x22}}, ++ { ++ 16, ++ 0x3caa, ++ 0, ++ {0x90,0x7f,0xbc,0xe0,0x20,0xe1,0x4f,0xc2,0x17,0x7d,0xdf,0x7f,0x7f,0x12,0x32,0x49}}, ++ { ++ 16, ++ 0x3cba, ++ 0, ++ {0x12,0x07,0xa0,0xe4,0xff,0x12,0x31,0xfc,0x90,0x7d,0x00,0xe0,0x70,0x04,0xa3,0xe0}}, ++ { ++ 16, ++ 0x3cca, ++ 0, ++ {0x60,0x32,0x7d,0xd7,0x7f,0x7f,0x12,0x32,0x49,0xe4,0xf5,0x7c,0xe5,0x7c,0x12,0x07}}, ++ { ++ 16, ++ 0x3cda, ++ 0, ++ {0x9d,0x12,0x31,0xfc,0x05,0x7c,0x05,0x7c,0xe5,0x7c,0xc3,0x94,0x10,0x40,0xed,0x7d}}, ++ { ++ 16, ++ 0x3cea, ++ 0, ++ {0xdf,0x7f,0x7f,0x12,0x32,0x49,0xc2,0x1b,0xe4,0xfd,0xff,0x12,0x31,0xb3,0x12,0x06}}, ++ { ++ 8, ++ 0x3cfa, ++ 0, ++ {0xe6,0x74,0x1c,0xf0,0xd3,0x22,0xc3,0x22}}, ++ { ++ 16, ++ 0x3d02, ++ 0, ++ {0xc2,0x22,0xe4,0xf5,0x68,0xc2,0x0a,0xf5,0x66,0xf5,0x67,0xc2,0x1a,0xc2,0x22,0xc2}}, ++ { ++ 16, ++ 0x3d12, ++ 0, ++ {0x19,0x12,0x07,0x67,0x12,0x3f,0x15,0x90,0x18,0x24,0x74,0x03,0xf0,0xe4,0xf5,0x68}}, ++ { ++ 16, ++ 0x3d22, ++ 0, ++ {0x30,0x13,0x02,0xe1,0x07,0x30,0x11,0x3d,0xc2,0x11,0x12,0x07,0x7a,0x12,0x08,0x00}}, ++ { ++ 16, ++ 0x3d32, ++ 0, ++ {0x12,0x07,0x67,0x20,0x18,0x16,0x12,0x07,0x43,0x30,0xe3,0x08,0x12,0x07,0x14,0x74}}, ++ { ++ 16, ++ 0x3d42, ++ 0, ++ {0x0c,0xf0,0x80,0x1f,0x12,0x07,0x14,0x74,0x08,0xf0,0x80,0x17,0x43,0x65,0x10,0x12}}, ++ { ++ 16, ++ 0x3d52, ++ 0, ++ {0x07,0x46,0x30,0xe3,0x08,0x12,0x07,0x14,0x74,0x0c,0xf0,0x80,0x06,0x12,0x07,0x14}}, ++ { ++ 16, ++ 0x3d62, ++ 0, ++ {0x74,0x08,0xf0,0xd2,0x22,0x12,0x12,0xee,0x30,0x12,0x0e,0x90,0x18,0x21,0xe0,0x70}}, ++ { ++ 16, ++ 0x3d72, ++ 0, ++ {0x08,0x12,0x32,0xb4,0x50,0x03,0x12,0x32,0x8e,0x20,0x13,0xa4,0x90,0x7f,0xcc,0xe0}}, ++ { ++ 16, ++ 0x3d82, ++ 0, ++ {0x30,0xe1,0x02,0xc1,0xe8,0xa3,0xe0,0xfb,0x90,0x7c,0xc0,0xe0,0x64,0xcd,0x60,0x02}}, ++ { ++ 16, ++ 0x3d92, ++ 0, ++ {0xc1,0x3f,0xa3,0xe0,0x64,0xab,0x60,0x02,0xc1,0x3f,0x75,0x68,0x01,0xd2,0x1a,0xc2}}, ++ { ++ 16, ++ 0x3da2, ++ 0, ++ {0x0a,0x90,0x7c,0xc7,0xe0,0xff,0x90,0x7c,0xc6,0xe0,0xfd,0x12,0x32,0x49,0x90,0x7c}}, ++ { ++ 16, ++ 0x3db2, ++ 0, ++ {0xc9,0xe0,0xff,0x90,0x7c,0xc8,0xe0,0xfd,0xc2,0x1b,0x12,0x31,0xb3,0x90,0x7c,0xca}}, ++ { ++ 16, ++ 0x3dc2, ++ 0, ++ {0xe0,0x24,0xff,0x92,0x19,0x90,0x7c,0xc3,0xe0,0xfe,0x90,0x7c,0xc2,0xe0,0xfd,0xee}}, ++ { ++ 16, ++ 0x3dd2, ++ 0, ++ {0xf5,0x4e,0xed,0xf5,0x4f,0xa3,0xe0,0xff,0x90,0x7c,0xc2,0xe0,0xfd,0x12,0x32,0x49}}, ++ { ++ 16, ++ 0x3de2, ++ 0, ++ {0x90,0x7c,0xc3,0xe0,0x70,0x0a,0x90,0x7c,0xc2,0xe0,0x70,0x04,0xd2,0x17,0xf5,0x45}}, ++ { ++ 16, ++ 0x3df2, ++ 0, ++ {0x90,0x7c,0xc5,0xe0,0xfe,0x90,0x7c,0xc4,0xe0,0xfd,0xee,0xf5,0x66,0xed,0xf5,0x67}}, ++ { ++ 16, ++ 0x3e02, ++ 0, ++ {0xe5,0x4e,0x30,0xe6,0x18,0x12,0x07,0x43,0x30,0xe3,0x08,0x12,0x07,0x14,0x74,0x0c}}, ++ { ++ 16, ++ 0x3e12, ++ 0, ++ {0xf0,0x80,0x06,0x12,0x07,0x14,0x74,0x08,0xf0,0xc2,0x18,0x80,0x19,0x43,0x65,0x10}}, ++ { ++ 16, ++ 0x3e22, ++ 0, ++ {0x12,0x07,0x46,0x30,0xe3,0x08,0x12,0x07,0x14,0x74,0x0c,0xf0,0x80,0x06,0x12,0x07}}, ++ { ++ 16, ++ 0x3e32, ++ 0, ++ {0x14,0x74,0x08,0xf0,0xd2,0x18,0xe4,0x90,0x7f,0xcd,0xf0,0xc1,0xe8,0xeb,0xd3,0x94}}, ++ { ++ 16, ++ 0x3e42, ++ 0, ++ {0x00,0x50,0x02,0xc1,0xe8,0x30,0x22,0x0b,0xe5,0x4e,0xff,0xe5,0x4f,0xfd,0x12,0x32}}, ++ { ++ 16, ++ 0x3e52, ++ 0, ++ {0x49,0xc2,0x22,0x90,0x78,0x51,0x74,0x78,0xf0,0x90,0x78,0x52,0x74,0x58,0xf0,0x90}}, ++ { ++ 16, ++ 0x3e62, ++ 0, ++ {0x78,0x4f,0x74,0x7c,0xf0,0x90,0x78,0x50,0x74,0xc0,0xf0,0x30,0x18,0x19,0xbb,0x40}}, ++ { ++ 16, ++ 0x3e72, ++ 0, ++ {0x08,0x90,0x78,0x54,0x74,0x3f,0xf0,0x80,0x05,0x90,0x78,0x54,0xeb,0xf0,0xeb,0x75}}, ++ { ++ 16, ++ 0x3e82, ++ 0, ++ {0xf0,0x03,0x84,0xf5,0x64,0x80,0x0a,0xeb,0xc3,0x13,0xf5,0x64,0x90,0x78,0x54,0xeb}}, ++ { ++ 16, ++ 0x3e92, ++ 0, ++ {0xf0,0x12,0x07,0x57,0xcf,0xeb,0xcf,0xc3,0xe5,0x67,0x9b,0xf5,0x67,0xe5,0x66,0x94}}, ++ { ++ 16, ++ 0x3ea2, ++ 0, ++ {0x00,0xf5,0x66,0xe5,0x64,0x25,0x4f,0xf5,0x4f,0xe4,0x35,0x4e,0xf5,0x4e,0x90,0x78}}, ++ { ++ 16, ++ 0x3eb2, ++ 0, ++ {0x55,0xe0,0x60,0xfa,0xe4,0x90,0x7f,0xcd,0xf0,0x30,0x19,0x2a,0xe5,0x67,0x45,0x66}}, ++ { ++ 16, ++ 0x3ec2, ++ 0, ++ {0x70,0x24,0xe5,0x64,0x65,0x4f,0x70,0x02,0xe5,0x4e,0x60,0x13,0x7d,0xcd,0x7f,0x7f}}, ++ { ++ 16, ++ 0x3ed2, ++ 0, ++ {0x12,0x32,0x49,0xc2,0x1b,0xe4,0xfd,0xff,0x12,0x31,0xb3,0xd2,0x22,0x80,0x02,0xd2}}, ++ { ++ 16, ++ 0x3ee2, ++ 0, ++ {0x10,0xd2,0x0a,0xe4,0xf5,0x68,0x20,0x1a,0x02,0xa1,0x22,0xe5,0x68,0x60,0x02,0xa1}}, ++ { ++ 16, ++ 0x3ef2, ++ 0, ++ {0x22,0x30,0x0a,0x05,0x12,0x12,0x58,0xd2,0x22,0x20,0x19,0x02,0xa1,0x22,0x12,0x3c}}, ++ { ++ 15, ++ 0x3f02, ++ 0, ++ {0xaa,0xd2,0x22,0xa1,0x22,0x12,0x07,0x7a,0xe4,0x12,0x3f,0x15,0x90,0x18,0x24}}, ++ { ++ 16, ++ 0x3f11, ++ 0, ++ {0x74,0x09,0xf0,0x22,0xff,0x12,0x31,0x84,0x90,0x18,0x22,0xe0,0x44,0x40,0xff,0x90}}, ++ { ++ 15, ++ 0x3f21, ++ 0, ++ {0x18,0x23,0xe0,0xfd,0x12,0x32,0x49,0xc2,0x1b,0xe4,0xfd,0xff,0x02,0x31,0xb3}}, ++ { ++ 16, ++ 0x4ee, ++ 0, ++ {0x30,0x11,0x0f,0x12,0x08,0x00,0xc2,0x11,0x20,0x04,0x07,0x20,0x03,0x04,0x30,0x13}}, ++ { ++ 16, ++ 0x4fe, ++ 0, ++ {0x01,0x22,0x12,0x12,0xee,0x30,0x12,0x0e,0x90,0x18,0x21,0xe0,0x70,0x08,0x12,0x32}}, ++ { ++ 16, ++ 0x50e, ++ 0, ++ {0xb4,0x50,0x03,0x12,0x32,0x8e,0x30,0x16,0x05,0x12,0x35,0xf8,0xc2,0x16,0x12,0x34}}, ++ { ++ 16, ++ 0x51e, ++ 0, ++ {0x47,0x30,0x0f,0x24,0x30,0x15,0x03,0x12,0x3a,0xea,0x20,0xcf,0x0c,0x30,0x87,0x09}}, ++ { ++ 16, ++ 0x52e, ++ 0, ++ {0xe5,0x36,0x60,0x05,0x15,0x36,0x12,0x06,0x7b,0x30,0x97,0x0a,0x90,0x7f,0xc8,0xe0}}, ++ { ++ 16, ++ 0x53e, ++ 0, ++ {0x20,0xe1,0x03,0x12,0x06,0xa8,0x80,0xa8,0x30,0x07,0x0e,0xc2,0x07,0x75,0xc8,0x01}}, ++ { ++ 16, ++ 0x54e, ++ 0, ++ {0x85,0x32,0xcc,0x85,0x31,0xcd,0x75,0xc8,0x05,0x20,0xcf,0x03,0x02,0x06,0x25,0x30}}, ++ { ++ 16, ++ 0x55e, ++ 0, ++ {0x87,0x03,0x02,0x06,0x25,0x30,0xb1,0x05,0xd2,0x07,0x02,0x06,0x28,0x30,0x15,0x03}}, ++ { ++ 16, ++ 0x56e, ++ 0, ++ {0x12,0x3a,0xea,0x90,0x7f,0xb8,0xe0,0x30,0xe1,0x03,0x02,0x06,0x28,0x74,0x00,0x90}}, ++ { ++ 16, ++ 0x57e, ++ 0, ++ {0x7f,0xe4,0xf0,0xfa,0x05,0x86,0x90,0x7f,0xe5,0x05,0x86,0x74,0x7e,0x90,0x7f,0xe3}}, ++ { ++ 16, ++ 0x58e, ++ 0, ++ {0xf0,0x79,0x40,0xd9,0x02,0x80,0x79,0x20,0xb1,0x76,0x90,0x48,0x08,0xe0,0xf8,0x90}}, ++ { ++ 16, ++ 0x59e, ++ 0, ++ {0x48,0x09,0xe0,0x05,0x86,0xe8,0xf0,0x05,0x86,0x0a,0x90,0x7f,0xc8,0xe0,0x20,0xe1}}, ++ { ++ 16, ++ 0x5ae, ++ 0, ++ {0x06,0x30,0x97,0x03,0x12,0x06,0xa8,0x20,0x87,0x02,0x80,0xd7,0x90,0x7f,0xe3,0xe0}}, ++ { ++ 16, ++ 0x5be, ++ 0, ++ {0x90,0x78,0x51,0xf0,0x90,0x7f,0xe4,0xe0,0x90,0x78,0x52,0xf0,0x90,0x78,0x4f,0x74}}, ++ { ++ 16, ++ 0x5ce, ++ 0, ++ {0x78,0xf0,0x90,0x78,0x50,0x74,0x58,0xf0,0xe9,0x90,0x78,0x54,0xf0,0x90,0x78,0x55}}, ++ { ++ 16, ++ 0x5de, ++ 0, ++ {0x74,0xff,0xf0,0x90,0x78,0x55,0xe0,0x60,0xfa,0x74,0x40,0x90,0x7f,0xb9,0xf0,0x75}}, ++ { ++ 16, ++ 0x5ee, ++ 0, ++ {0xc8,0x01,0xc2,0x07,0x20,0x87,0x0b,0x85,0x34,0xcc,0x85,0x33,0xcd,0x75,0xc8,0x05}}, ++ { ++ 16, ++ 0x5fe, ++ 0, ++ {0x80,0x28,0x75,0xc8,0x01,0x85,0x30,0xcc,0x85,0x2f,0xcd,0x75,0xc8,0x05,0x80,0x1a}}, ++ { ++ 16, ++ 0x60e, ++ 0, ++ {0xd2,0x07,0xea,0x70,0x06,0x20,0x08,0x03,0x02,0x05,0x46,0xc2,0x08,0x90,0x7f,0xb9}}, ++ { ++ 16, ++ 0x61e, ++ 0, ++ {0xf0,0x75,0xc8,0x01,0x02,0x05,0x46,0x12,0x3b,0x12,0x30,0x97,0x0a,0x90,0x7f,0xc8}}, ++ { ++ 16, ++ 0x62e, ++ 0, ++ {0xe0,0x20,0xe1,0x03,0x12,0x06,0xa8,0x02,0x04,0xee,0x75,0xc8,0x01,0x74,0x00,0x90}}, ++ { ++ 16, ++ 0x63e, ++ 0, ++ {0x78,0x52,0xf0,0x74,0x7e,0x90,0x78,0x51,0xf0,0x74,0x78,0x90,0x78,0x4f,0xf0,0x74}}, ++ { ++ 16, ++ 0x64e, ++ 0, ++ {0x58,0x90,0x78,0x50,0xf0,0x74,0x40,0x90,0x78,0x54,0xf0,0x74,0xff,0x90,0x78,0x55}}, ++ { ++ 16, ++ 0x65e, ++ 0, ++ {0xf0,0xd2,0x08,0xc2,0x07,0x85,0x34,0xcc,0x85,0x33,0xcd,0x75,0xc8,0x05,0xd2,0x0d}}, ++ { ++ 16, ++ 0x66e, ++ 0, ++ {0x90,0x78,0x55,0xe0,0x60,0xfa,0x74,0x40,0x90,0x7f,0xb9,0xf0,0x22,0x90,0x78,0x4f}}, ++ { ++ 16, ++ 0x67e, ++ 0, ++ {0x74,0x78,0xf0,0x90,0x78,0x50,0x74,0x58,0xf0,0x90,0x78,0x51,0x74,0x7f,0xf0,0x90}}, ++ { ++ 16, ++ 0x68e, ++ 0, ++ {0x78,0x52,0x74,0x68,0xf0,0x74,0x35,0x90,0x78,0x54,0xf0,0x90,0x78,0x55,0x74,0xff}}, ++ { ++ 16, ++ 0x69e, ++ 0, ++ {0xf0,0xd2,0x0d,0x90,0x78,0x55,0xe0,0x60,0xfa,0x22,0x90,0x78,0x4f,0x74,0x7d,0xf0}}, ++ { ++ 16, ++ 0x6ae, ++ 0, ++ {0x90,0x78,0x50,0x74,0xc0,0xf0,0x90,0x78,0x51,0x74,0x78,0xf0,0x90,0x78,0x52,0x74}}, ++ { ++ 16, ++ 0x6be, ++ 0, ++ {0x58,0xf0,0x90,0x7f,0xc9,0xe0,0x90,0x78,0x54,0xf0,0x25,0x51,0xf5,0x51,0xe4,0x35}}, ++ { ++ 16, ++ 0x6ce, ++ 0, ++ {0x50,0xf5,0x50,0x05,0x43,0x90,0x78,0x55,0x74,0xff,0xf0,0x90,0x78,0x55,0xe0,0x60}}, ++ { ++ 8, ++ 0x6de, ++ 0, ++ {0xfa,0x90,0x7f,0xc9,0xf0,0xd2,0x0c,0x22}}, ++ { ++ 16, ++ 0x3000, ++ 0, ++ {0x12,0x01,0x00,0x01,0x02,0x00,0x00,0x40,0x10,0x11,0x21,0x90,0x00,0x50,0x00,0x02}}, ++ { ++ 16, ++ 0x3010, ++ 0, ++ {0x03,0x01,0x09,0x02,0xe8,0x00,0x03,0x01,0x00,0x80,0xc8,0x09,0x04,0x00,0x00,0x01}}, ++ { ++ 16, ++ 0x3020, ++ 0, ++ {0x02,0x07,0x00,0x00,0x05,0x24,0x00,0x10,0x01,0x0c,0x24,0x0f,0x04,0x02,0x00,0x00}}, ++ { ++ 16, ++ 0x3030, ++ 0, ++ {0x00,0x00,0x00,0x00,0x00,0x07,0x05,0x84,0x03,0x20,0x00,0x01,0x09,0x04,0x01,0x00}}, ++ { ++ 16, ++ 0x3040, ++ 0, ++ {0x02,0x0a,0x00,0x00,0x00,0x07,0x05,0x04,0x02,0x40,0x00,0x01,0x07,0x05,0x02,0x02}}, ++ { ++ 16, ++ 0x3050, ++ 0, ++ {0x40,0x00,0x01,0x09,0x04,0x01,0x01,0x02,0x0a,0x00,0x00,0x00,0x07,0x05,0x04,0x02}}, ++ { ++ 16, ++ 0x3060, ++ 0, ++ {0x40,0x00,0x01,0x07,0x05,0x02,0x03,0x40,0x00,0x01,0x09,0x04,0x02,0x00,0x01,0x0a}}, ++ { ++ 16, ++ 0x3070, ++ 0, ++ {0x00,0x00,0x00,0x07,0x05,0x82,0x02,0x40,0x00,0x01,0x09,0x04,0x02,0x01,0x01,0x0a}}, ++ { ++ 16, ++ 0x3080, ++ 0, ++ {0x00,0x00,0x00,0x07,0x05,0x88,0x01,0x9f,0x00,0x01,0x09,0x04,0x02,0x02,0x01,0x0a}}, ++ { ++ 16, ++ 0x3090, ++ 0, ++ {0x00,0x00,0x00,0x07,0x05,0x88,0x01,0x09,0x01,0x01,0x09,0x04,0x02,0x03,0x01,0x0a}}, ++ { ++ 16, ++ 0x30a0, ++ 0, ++ {0x00,0x00,0x00,0x07,0x05,0x88,0x01,0xa8,0x01,0x01,0x09,0x04,0x02,0x04,0x01,0x0a}}, ++ { ++ 16, ++ 0x30b0, ++ 0, ++ {0x00,0x00,0x00,0x07,0x05,0x88,0x01,0x12,0x02,0x01,0x09,0x04,0x02,0x05,0x01,0x0a}}, ++ { ++ 16, ++ 0x30c0, ++ 0, ++ {0x00,0x00,0x00,0x07,0x05,0x88,0x01,0x7c,0x02,0x01,0x09,0x04,0x02,0x06,0x01,0x0a}}, ++ { ++ 16, ++ 0x30d0, ++ 0, ++ {0x00,0x00,0x00,0x07,0x05,0x88,0x01,0x1b,0x03,0x01,0x09,0x04,0x02,0x07,0x01,0x0a}}, ++ { ++ 16, ++ 0x30e0, ++ 0, ++ {0x00,0x00,0x00,0x07,0x05,0x88,0x01,0x85,0x03,0x01,0x09,0x04,0x02,0x08,0x01,0x0a}}, ++ { ++ 16, ++ 0x30f0, ++ 0, ++ {0x00,0x00,0x00,0x07,0x05,0x88,0x01,0xef,0x03,0x01,0x04,0x03,0x09,0x04,0x2a,0x03}}, ++ { ++ 16, ++ 0x3100, ++ 0, ++ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, ++ { ++ 16, ++ 0x3110, ++ 0, ++ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, ++ { ++ 16, ++ 0x3120, ++ 0, ++ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x03,0x41,0x00,0x44,0x00,0x53,0x00}}, ++ { ++ 16, ++ 0x3130, ++ 0, ++ {0x4c,0x00,0x2d,0x00,0x55,0x00,0x53,0x00,0x42,0x00,0x20,0x00,0x4d,0x00,0x6f,0x00}}, ++ { ++ 16, ++ 0x3140, ++ 0, ++ {0x64,0x00,0x65,0x00,0x6d,0x00,0x1e,0x03,0x30,0x00,0x30,0x00,0x36,0x00,0x30,0x00}}, ++ { ++ 16, ++ 0x3150, ++ 0, ++ {0x46,0x00,0x39,0x00,0x30,0x00,0x32,0x00,0x30,0x00,0x33,0x00,0x30,0x00,0x34,0x00}}, ++ { ++ 16, ++ 0x3160, ++ 0, ++ {0x30,0x00,0x36,0x00,0x1e,0x03,0x30,0x00,0x30,0x00,0x36,0x00,0x30,0x00,0x46,0x00}}, ++ { ++ 16, ++ 0x3170, ++ 0, ++ {0x39,0x00,0x30,0x00,0x32,0x00,0x30,0x00,0x33,0x00,0x30,0x00,0x34,0x00,0x30,0x00}}, ++ { ++ 4, ++ 0x3180, ++ 0, ++ {0x36,0x00,0x00,0x00}}, ++ { ++ 16, ++ 0x14de, ++ 0, ++ {0x90,0x7f,0xd6,0xe0,0x44,0x80,0xf0,0x43,0x87,0x01,0x00,0x00,0x00,0x00,0x00,0x22}}, ++ { ++ 16, ++ 0x1555, ++ 0, ++ {0x8e,0x76,0x8f,0x77,0xe5,0x77,0x15,0x77,0xae,0x76,0x70,0x02,0x15,0x76,0x4e,0x60}}, ++ { ++ 7, ++ 0x1565, ++ 0, ++ {0x05,0x12,0x14,0xee,0x80,0xee,0x22}}, ++ { ++ 8, ++ 0xff0, ++ 0, ++ {0xe4,0xf5,0x63,0xd2,0xe9,0xd2,0xaf,0x22}}, ++ { ++ 16, ++ 0x1327, ++ 0, ++ {0x90,0x7f,0xa5,0xe0,0x20,0xe6,0xf9,0xc2,0xe9,0x90,0x7f,0xa5,0xe0,0x44,0x80,0xf0}}, ++ { ++ 16, ++ 0x1337, ++ 0, ++ {0xef,0x25,0xe0,0x90,0x7f,0xa6,0xf0,0x90,0x7f,0xa5,0xe0,0x30,0xe0,0xf9,0x90,0x7f}}, ++ { ++ 16, ++ 0x1347, ++ 0, ++ {0xa5,0xe0,0x44,0x40,0xf0,0x90,0x7f,0xa5,0xe0,0x20,0xe6,0xf9,0x90,0x7f,0xa5,0xe0}}, ++ { ++ 6, ++ 0x1357, ++ 0, ++ {0x30,0xe1,0xd6,0xd2,0xe9,0x22}}, ++ { ++ 16, ++ 0x13c3, ++ 0, ++ {0xa9,0x07,0x90,0x7f,0xa5,0xe0,0x20,0xe6,0xf9,0xe5,0x63,0x70,0x23,0x90,0x7f,0xa5}}, ++ { ++ 16, ++ 0x13d3, ++ 0, ++ {0xe0,0x44,0x80,0xf0,0xe9,0x25,0xe0,0x90,0x7f,0xa6,0xf0,0x8d,0x5e,0xaf,0x03,0xa9}}, ++ { ++ 16, ++ 0x13e3, ++ 0, ++ {0x07,0x75,0x5f,0x01,0x8a,0x60,0x89,0x61,0xe4,0xf5,0x62,0x75,0x63,0x01,0xd3,0x22}}, ++ { ++ 2, ++ 0x13f3, ++ 0, ++ {0xc3,0x22}}, ++ { ++ 16, ++ 0x135d, ++ 0, ++ {0xa9,0x07,0x90,0x7f,0xa5,0xe0,0x20,0xe6,0xf9,0xe5,0x63,0x70,0x25,0x90,0x7f,0xa5}}, ++ { ++ 16, ++ 0x136d, ++ 0, ++ {0xe0,0x44,0x80,0xf0,0xe9,0x25,0xe0,0x44,0x01,0x90,0x7f,0xa6,0xf0,0x8d,0x5e,0xaf}}, ++ { ++ 16, ++ 0x137d, ++ 0, ++ {0x03,0xa9,0x07,0x75,0x5f,0x01,0x8a,0x60,0x89,0x61,0xe4,0xf5,0x62,0x75,0x63,0x03}}, ++ { ++ 4, ++ 0x138d, ++ 0, ++ {0xd3,0x22,0xc3,0x22}}, ++ { ++ 3, ++ 0x4b, ++ 0, ++ {0x02,0x0b,0x73}}, ++ { ++ 16, ++ 0xb73, ++ 0, ++ {0xc0,0xe0,0xc0,0x83,0xc0,0x82,0xc0,0x85,0xc0,0x84,0xc0,0x86,0x75,0x86,0x00,0xc0}}, ++ { ++ 16, ++ 0xb83, ++ 0, ++ {0xd0,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x06,0xc0,0x07,0x90,0x7f,0xa5}}, ++ { ++ 16, ++ 0xb93, ++ 0, ++ {0xe0,0x30,0xe2,0x06,0x75,0x63,0x06,0x02,0x0c,0x5b,0x90,0x7f,0xa5,0xe0,0x20,0xe1}}, ++ { ++ 16, ++ 0xba3, ++ 0, ++ {0x0c,0xe5,0x63,0x64,0x02,0x60,0x06,0x75,0x63,0x07,0x02,0x0c,0x5b,0xaf,0x63,0xef}}, ++ { ++ 16, ++ 0xbb3, ++ 0, ++ {0x24,0xfe,0x60,0x5f,0x14,0x60,0x36,0x24,0xfe,0x70,0x03,0x02,0x0c,0x4c,0x24,0xfc}}, ++ { ++ 16, ++ 0xbc3, ++ 0, ++ {0x70,0x03,0x02,0x0c,0x58,0x24,0x08,0x60,0x03,0x02,0x0c,0x5b,0xab,0x5f,0xaa,0x60}}, ++ { ++ 16, ++ 0xbd3, ++ 0, ++ {0xa9,0x61,0xaf,0x62,0x05,0x62,0x8f,0x82,0x75,0x83,0x00,0x12,0x0c,0x79,0x90,0x7f}}, ++ { ++ 16, ++ 0xbe3, ++ 0, ++ {0xa6,0xf0,0xe5,0x62,0x65,0x5e,0x70,0x70,0x75,0x63,0x05,0x80,0x6b,0x90,0x7f,0xa6}}, ++ { ++ 16, ++ 0xbf3, ++ 0, ++ {0xe0,0xab,0x5f,0xaa,0x60,0xa9,0x61,0xae,0x62,0x8e,0x82,0x75,0x83,0x00,0x12,0x0c}}, ++ { ++ 16, ++ 0xc03, ++ 0, ++ {0xa6,0x75,0x63,0x02,0xe5,0x5e,0x64,0x01,0x70,0x4e,0x90,0x7f,0xa5,0xe0,0x44,0x20}}, ++ { ++ 16, ++ 0xc13, ++ 0, ++ {0xf0,0x80,0x45,0xe5,0x5e,0x24,0xfe,0xb5,0x62,0x07,0x90,0x7f,0xa5,0xe0,0x44,0x20}}, ++ { ++ 16, ++ 0xc23, ++ 0, ++ {0xf0,0xe5,0x5e,0x14,0xb5,0x62,0x0a,0x90,0x7f,0xa5,0xe0,0x44,0x40,0xf0,0xe4,0xf5}}, ++ { ++ 16, ++ 0xc33, ++ 0, ++ {0x63,0x90,0x7f,0xa6,0xe0,0xab,0x5f,0xaa,0x60,0xa9,0x61,0xae,0x62,0x8e,0x82,0x75}}, ++ { ++ 16, ++ 0xc43, ++ 0, ++ {0x83,0x00,0x12,0x0c,0xa6,0x05,0x62,0x80,0x0f,0x90,0x7f,0xa5,0xe0,0x44,0x40,0xf0}}, ++ { ++ 16, ++ 0xc53, ++ 0, ++ {0xe4,0xf5,0x63,0x80,0x03,0xe4,0xf5,0x63,0x53,0x91,0xdf,0xd0,0x07,0xd0,0x06,0xd0}}, ++ { ++ 16, ++ 0xc63, ++ 0, ++ {0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x86,0xd0,0x84,0xd0,0x85,0xd0}}, ++ { ++ 6, ++ 0xc73, ++ 0, ++ {0x82,0xd0,0x83,0xd0,0xe0,0x32}}, ++ { ++ 2, ++ 0x1422, ++ 0, ++ {0xa9,0x07}}, ++ { ++ 16, ++ 0x1424, ++ 0, ++ {0xae,0x29,0xaf,0x2a,0x8f,0x82,0x8e,0x83,0xa3,0xe0,0x64,0x03,0x70,0x17,0xad,0x01}}, ++ { ++ 16, ++ 0x1434, ++ 0, ++ {0x19,0xed,0x70,0x01,0x22,0x8f,0x82,0x8e,0x83,0xe0,0x7c,0x00,0x2f,0xfd,0xec,0x3e}}, ++ { ++ 9, ++ 0x1444, ++ 0, ++ {0xfe,0xaf,0x05,0x80,0xdf,0x7e,0x00,0x7f,0x00}}, ++ { ++ 1, ++ 0x144d, ++ 0, ++ {0x22}}, ++ { ++ 2, ++ 0x11bf, ++ 0, ++ {0xad,0x07}}, ++ { ++ 16, ++ 0x11c1, ++ 0, ++ {0xe4,0xfc,0xae,0x27,0xaf,0x28,0x8f,0x82,0x8e,0x83,0xa3,0xe0,0x64,0x02,0x70,0x2a}}, ++ { ++ 16, ++ 0x11d1, ++ 0, ++ {0xab,0x04,0x0c,0xeb,0xb5,0x05,0x01,0x22,0x8f,0x82,0x8e,0x83,0xa3,0xa3,0xe0,0xfa}}, ++ { ++ 16, ++ 0x11e1, ++ 0, ++ {0xa3,0xe0,0x8a,0x78,0xf5,0x79,0x62,0x78,0xe5,0x78,0x62,0x79,0xe5,0x79,0x62,0x78}}, ++ { ++ 14, ++ 0x11f1, ++ 0, ++ {0x2f,0xfb,0xe5,0x78,0x3e,0xfe,0xaf,0x03,0x80,0xcc,0x7e,0x00,0x7f,0x00}}, ++ { ++ 1, ++ 0x11ff, ++ 0, ++ {0x22}}, ++ { ++ 16, ++ 0x151d, ++ 0, ++ {0x12,0x13,0x5d,0xe5,0x63,0x24,0xfa,0x60,0x0e,0x14,0x60,0x06,0x24,0x07,0x70,0xf3}}, ++ { ++ 12, ++ 0x152d, ++ 0, ++ {0xd3,0x22,0xe4,0xf5,0x63,0xd3,0x22,0xe4,0xf5,0x63,0xd3,0x22}}, ++ { ++ 16, ++ 0x1539, ++ 0, ++ {0x12,0x13,0xc3,0xe5,0x63,0x24,0xfa,0x60,0x0e,0x14,0x60,0x06,0x24,0x07,0x70,0xf3}}, ++ { ++ 12, ++ 0x1549, ++ 0, ++ {0xd3,0x22,0xe4,0xf5,0x63,0xd3,0x22,0xe4,0xf5,0x63,0xd3,0x22}}, ++ { ++ 16, ++ 0x14ee, ++ 0, ++ {0x74,0x00,0xf5,0x86,0x90,0xfd,0xa5,0x7c,0x05,0xa3,0xe5,0x82,0x45,0x83,0x70,0xf9}}, ++ { ++ 1, ++ 0x14fe, ++ 0, ++ {0x22}}, ++ { ++ 3, ++ 0x43, ++ 0, ++ {0x02,0x12,0x00}}, ++ { ++ 16, ++ 0x1200, ++ 0, ++ {0x02,0x14,0x74,0x00,0x02,0x0f,0x7c,0x00,0x02,0x14,0xbc,0x00,0x02,0x14,0x98,0x00}}, ++ { ++ 16, ++ 0x1210, ++ 0, ++ {0x02,0x13,0x91,0x00,0x02,0x0f,0xf9,0x00,0x02,0x0f,0xfa,0x00,0x02,0x0f,0xfb,0x00}}, ++ { ++ 16, ++ 0x1220, ++ 0, ++ {0x02,0x0f,0xfc,0x00,0x02,0x0f,0xfd,0x00,0x02,0x0f,0xfe,0x00,0x02,0x0f,0xff,0x00}}, ++ { ++ 16, ++ 0x1230, ++ 0, ++ {0x02,0x15,0x6c,0x00,0x02,0x15,0x6d,0x00,0x02,0x15,0x6e,0x00,0x02,0x15,0x6f,0x00}}, ++ { ++ 16, ++ 0x1240, ++ 0, ++ {0x02,0x15,0x70,0x00,0x02,0x15,0x71,0x00,0x02,0x15,0x72,0x00,0x02,0x15,0x73,0x00}}, ++ { ++ 8, ++ 0x1250, ++ 0, ++ {0x02,0x15,0x74,0x00,0x02,0x15,0x75,0x00}}, ++ { ++ 3, ++ 0x0, ++ 0, ++ {0x02,0x11,0x33}}, ++ { ++ 12, ++ 0x1133, ++ 0, ++ {0x78,0x7f,0xe4,0xf6,0xd8,0xfd,0x75,0x81,0x83,0x02,0x11,0x7a}}, ++ { ++ 16, ++ 0xc79, ++ 0, ++ {0xbb,0x01,0x0c,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,0x22,0x50}}, ++ { ++ 16, ++ 0xc89, ++ 0, ++ {0x06,0xe9,0x25,0x82,0xf8,0xe6,0x22,0xbb,0xfe,0x06,0xe9,0x25,0x82,0xf8,0xe2,0x22}}, ++ { ++ 13, ++ 0xc99, ++ 0, ++ {0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe4,0x93,0x22}}, ++ { ++ 16, ++ 0xca6, ++ 0, ++ {0xf8,0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0}}, ++ { ++ 16, ++ 0xcb6, ++ 0, ++ {0x22,0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22,0xbb,0xfe,0x05,0xe9,0x25,0x82,0xc8}}, ++ { ++ 2, ++ 0xcc6, ++ 0, ++ {0xf2,0x22}}, ++ { ++ 16, ++ 0xcc8, ++ 0, ++ {0xbc,0x00,0x0b,0xbe,0x00,0x29,0xef,0x8d,0xf0,0x84,0xff,0xad,0xf0,0x22,0xe4,0xcc}}, ++ { ++ 16, ++ 0xcd8, ++ 0, ++ {0xf8,0x75,0xf0,0x08,0xef,0x2f,0xff,0xee,0x33,0xfe,0xec,0x33,0xfc,0xee,0x9d,0xec}}, ++ { ++ 16, ++ 0xce8, ++ 0, ++ {0x98,0x40,0x05,0xfc,0xee,0x9d,0xfe,0x0f,0xd5,0xf0,0xe9,0xe4,0xce,0xfd,0x22,0xed}}, ++ { ++ 16, ++ 0xcf8, ++ 0, ++ {0xf8,0xf5,0xf0,0xee,0x84,0x20,0xd2,0x1c,0xfe,0xad,0xf0,0x75,0xf0,0x08,0xef,0x2f}}, ++ { ++ 16, ++ 0xd08, ++ 0, ++ {0xff,0xed,0x33,0xfd,0x40,0x07,0x98,0x50,0x06,0xd5,0xf0,0xf2,0x22,0xc3,0x98,0xfd}}, ++ { ++ 5, ++ 0xd18, ++ 0, ++ {0x0f,0xd5,0xf0,0xea,0x22}}, ++ { ++ 16, ++ 0xd1d, ++ 0, ++ {0xbb,0x01,0x0a,0x89,0x82,0x8a,0x83,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x06,0xf7}}, ++ { ++ 15, ++ 0xd2d, ++ 0, ++ {0x09,0xa7,0xf0,0x19,0x22,0xbb,0xfe,0x06,0xf3,0xe5,0xf0,0x09,0xf3,0x19,0x22}}, ++ { ++ 16, ++ 0xd3c, ++ 0, ++ {0xeb,0x9f,0xf5,0xf0,0xea,0x9e,0x42,0xf0,0xe9,0x9d,0x42,0xf0,0xe8,0x9c,0x45,0xf0}}, ++ { ++ 1, ++ 0xd4c, ++ 0, ++ {0x22}}, ++ { ++ 16, ++ 0xd4d, ++ 0, ++ {0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12,0x74,0x01,0x93,0x70,0x0d,0xa3,0xa3}}, ++ { ++ 16, ++ 0xd5d, ++ 0, ++ {0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83,0xe4,0x73,0x74,0x02,0x93,0x68,0x60}}, ++ { ++ 6, ++ 0xd6d, ++ 0, ++ {0xef,0xa3,0xa3,0xa3,0x80,0xdf}}, ++ { ++ 16, ++ 0x113f, ++ 0, ++ {0x02,0x09,0xee,0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x03,0xf6,0x80,0x01,0xf2}}, ++ { ++ 16, ++ 0x114f, ++ 0, ++ {0x08,0xdf,0xf4,0x80,0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07,0x24,0x0c,0xc8,0xc3,0x33}}, ++ { ++ 16, ++ 0x115f, ++ 0, ++ {0xc4,0x54,0x0f,0x44,0x20,0xc8,0x83,0x40,0x04,0xf4,0x56,0x80,0x01,0x46,0xf6,0xdf}}, ++ { ++ 16, ++ 0x116f, ++ 0, ++ {0xe4,0x80,0x0b,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x90,0x12,0xa9,0xe4,0x7e}}, ++ { ++ 16, ++ 0x117f, ++ 0, ++ {0x01,0x93,0x60,0xbc,0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09,0x54,0x1f,0xfe,0xe4,0x93}}, ++ { ++ 16, ++ 0x118f, ++ 0, ++ {0xa3,0x60,0x01,0x0e,0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3}}, ++ { ++ 16, ++ 0x119f, ++ 0, ++ {0xfa,0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca}}, ++ { ++ 16, ++ 0x11af, ++ 0, ++ {0xf0,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe}}, ++ { ++ 1, ++ 0x12ed, ++ 0, ++ {0x00}}, ++ { ++ 0, ++ 0x0, ++ 1, ++ {0}} ++}; ++ ++eu_hex_record_t eu_eagle_I_firmware[] = { ++ { ++ 16, ++ 0xf27, ++ 0, ++ {0x90,0x7f,0xec,0xe0,0xf4,0x54,0x80,0xff,0xc4,0x54,0x0f,0xff,0xe0,0x54,0x07,0x2f}}, ++ { ++ 16, ++ 0xf37, ++ 0, ++ {0x25,0xe0,0x24,0xb4,0xf5,0x82,0xe4,0x34,0x7f,0xf5,0x83,0x22,0x90,0x7f,0xb4,0xe0}}, ++ { ++ 16, ++ 0xf47, ++ 0, ++ {0x44,0x01,0xf0,0x22,0x90,0x7f,0xec,0xe0,0x24,0x7a,0xf5,0x82,0xe4,0x34,0x18,0xf5}}, ++ { ++ 16, ++ 0xf57, ++ 0, ++ {0x83,0x22,0xe2,0xfc,0x08,0xe2,0xfd,0x24,0x07,0xf5,0x82,0xe4,0x3c,0xf5,0x83,0x22}}, ++ { ++ 16, ++ 0xf67, ++ 0, ++ {0x90,0x7f,0x00,0xf0,0xe4,0xa3,0xf0,0x90,0x7f,0xb5,0x74,0x02,0xf0,0x22,0xaa,0x06}}, ++ { ++ 16, ++ 0xf77, ++ 0, ++ {0xa9,0x07,0x7b,0x01,0x8b,0x65,0x8a,0x66,0x89,0x67,0xea,0x49,0x22,0xf0,0x74,0x18}}, ++ { ++ 16, ++ 0xf87, ++ 0, ++ {0x90,0x7f,0xd4,0xf0,0x74,0x56,0x90,0x7f,0xd5,0xf0,0x22,0x90,0x7f,0xb4,0xe0,0x44}}, ++ { ++ 16, ++ 0xf97, ++ 0, ++ {0x02,0xf0,0x22,0xee,0x90,0x7f,0xd4,0xf0,0xef,0x90,0x7f,0xd5,0xf0,0x22,0x90,0x7f}}, ++ { ++ 16, ++ 0xfa7, ++ 0, ++ {0x00,0xf0,0x90,0x7f,0xb5,0x74,0x01,0xf0,0x22,0xe4,0xf5,0x1f,0xf5,0x1e,0xf5,0x1d}}, ++ { ++ 3, ++ 0xfb7, ++ 0, ++ {0xf5,0x1c,0x22}}, ++ { ++ 16, ++ 0xc20, ++ 0, ++ {0x12,0x0f,0xb0,0x90,0x18,0x7a,0xf0,0xa3,0xf0,0xa3,0xf0,0x90,0x7f,0x92,0xe0,0xa2}}, ++ { ++ 16, ++ 0xc30, ++ 0, ++ {0xe3,0x92,0x17,0xc2,0x14,0xc2,0x13,0x12,0x14,0xe0,0xc2,0x16,0xd2,0x15,0x90,0x7f}}, ++ { ++ 16, ++ 0xc40, ++ 0, ++ {0xa5,0xe0,0x54,0x10,0xff,0xc4,0x54,0x0f,0x44,0x50,0xf5,0x15,0x13,0xe4,0x33,0xf5}}, ++ { ++ 16, ++ 0xc50, ++ 0, ++ {0x14,0x75,0x16,0x19,0x75,0x17,0x00,0x75,0x18,0x19,0x75,0x19,0x12,0x75,0x1a,0x19}}, ++ { ++ 16, ++ 0xc60, ++ 0, ++ {0x75,0x1b,0xfa,0x12,0x0d,0x16,0x12,0x10,0x46,0x90,0x18,0x0a,0xe0,0x30,0xe4,0x06}}, ++ { ++ 16, ++ 0xc70, ++ 0, ++ {0x53,0x31,0xfb,0x85,0x31,0xb0,0xd2,0xe8,0x43,0xd8,0x20,0x20,0x13,0x41,0x20,0x13}}, ++ { ++ 16, ++ 0xc80, ++ 0, ++ {0x0b,0xd2,0x21,0x75,0x70,0x07,0x75,0x71,0xd0,0x12,0x35,0x9d,0x12,0x0f,0xb0,0x7f}}, ++ { ++ 16, ++ 0xc90, ++ 0, ++ {0x40,0x7e,0x92,0x7d,0x04,0x7c,0x00,0xab,0x1f,0xaa,0x1e,0xa9,0x1d,0xa8,0x1c,0xc3}}, ++ { ++ 16, ++ 0xca0, ++ 0, ++ {0x12,0x0b,0xe9,0x50,0xd6,0x20,0x13,0xd3,0xe5,0x1f,0x24,0x01,0xf5,0x1f,0xe4,0x35}}, ++ { ++ 16, ++ 0xcb0, ++ 0, ++ {0x1e,0xf5,0x1e,0xe4,0x35,0x1d,0xf5,0x1d,0xe4,0x35,0x1c,0xf5,0x1c,0x80,0xd0,0x90}}, ++ { ++ 16, ++ 0xcc0, ++ 0, ++ {0x18,0x02,0xe0,0xff,0x64,0xb4,0x60,0x04,0xef,0xb4,0xb6,0x03,0x12,0x0d,0xe4,0x12}}, ++ { ++ 16, ++ 0xcd0, ++ 0, ++ {0x14,0xca,0x53,0x8e,0xf8,0x43,0x8e,0x28,0xc2,0x14,0x30,0x13,0x05,0x12,0x08,0x00}}, ++ { ++ 16, ++ 0xce0, ++ 0, ++ {0xc2,0x13,0x12,0x12,0x99,0x30,0x14,0x0e,0x90,0x18,0x76,0xe0,0x70,0x08,0x12,0x3a}}, ++ { ++ 16, ++ 0xcf0, ++ 0, ++ {0x6b,0x50,0x03,0x12,0x3a,0x51,0xc2,0x0e,0xe5,0x37,0xb4,0x04,0x05,0x12,0x38,0x00}}, ++ { ++ 16, ++ 0xd00, ++ 0, ++ {0x80,0xd8,0xe5,0x37,0xb4,0x05,0x05,0x12,0x37,0x97,0x80,0xce,0xe5,0x37,0xb4,0x03}}, ++ { ++ 6, ++ 0xd10, ++ 0, ++ {0xc9,0x12,0x3a,0x26,0x80,0xc4}}, ++ { ++ 16, ++ 0xde4, ++ 0, ++ {0x90,0x19,0x00,0xe0,0x24,0x00,0x78,0x01,0xf2,0xe4,0x34,0x19,0x18,0xf2,0x90,0x18}}, ++ { ++ 16, ++ 0xdf4, ++ 0, ++ {0x0a,0xe0,0xff,0x30,0xe5,0x11,0x12,0x0f,0x59,0xe0,0x44,0x40,0xf0,0x74,0x08,0x2d}}, ++ { ++ 16, ++ 0xe04, ++ 0, ++ {0x12,0x0f,0x60,0xe4,0xf0,0x80,0x12,0x78,0x00,0x12,0x0f,0x59,0xe0,0x54,0xbf,0xf0}}, ++ { ++ 16, ++ 0xe14, ++ 0, ++ {0x74,0x08,0x2d,0x12,0x0f,0x60,0x74,0xfa,0xf0,0x90,0x18,0x03,0xe0,0x90,0x19,0x08}}, ++ { ++ 16, ++ 0xe24, ++ 0, ++ {0xf0,0x90,0x18,0x04,0xe0,0x90,0x19,0x09,0xf0,0x90,0x18,0x06,0xe0,0x90,0x19,0x0b}}, ++ { ++ 16, ++ 0xe34, ++ 0, ++ {0xf0,0x90,0x18,0x05,0xe0,0x14,0x90,0x19,0x0a,0xf0,0xe0,0xb4,0xff,0x04,0xa3,0xe0}}, ++ { ++ 16, ++ 0xe44, ++ 0, ++ {0x14,0xf0,0x90,0x18,0x07,0xe0,0x90,0x19,0x0c,0xf0,0x90,0x18,0x08,0xe0,0x90,0x19}}, ++ { ++ 16, ++ 0xe54, ++ 0, ++ {0x0d,0xf0,0xef,0x30,0xe3,0x0a,0x90,0x18,0x4d,0xe0,0x90,0x19,0x0c,0xf0,0x80,0x08}}, ++ { ++ 16, ++ 0xe64, ++ 0, ++ {0x90,0x18,0x11,0xe0,0x90,0x19,0x0c,0xf0,0x90,0x19,0x0d,0xc0,0x83,0xc0,0x82,0xe0}}, ++ { ++ 16, ++ 0xe74, ++ 0, ++ {0xff,0x90,0x7f,0x92,0xe0,0x54,0xf0,0xfe,0xc4,0x54,0x0f,0xfe,0xef,0x4e,0xd0,0x82}}, ++ { ++ 4, ++ 0xe84, ++ 0, ++ {0xd0,0x83,0xf0,0x22}}, ++ { ++ 16, ++ 0x800, ++ 0, ++ {0x90,0x7f,0xe8,0xe0,0xb4,0x40,0x0a,0x12,0x00,0x80,0x50,0x02,0x21,0xeb,0x02,0x0f}}, ++ { ++ 16, ++ 0x810, ++ 0, ++ {0x92,0x90,0x7f,0xe8,0xe0,0xb4,0xc0,0x0a,0x12,0x02,0xe8,0x50,0x02,0x21,0xeb,0x02}}, ++ { ++ 16, ++ 0x820, ++ 0, ++ {0x0f,0x92,0x90,0x7f,0xe9,0xe0,0x70,0x02,0x21,0x34,0x14,0x70,0x02,0x21,0x6f,0x24}}, ++ { ++ 16, ++ 0x830, ++ 0, ++ {0xfe,0x70,0x02,0x21,0xb6,0x24,0xfb,0x70,0x02,0x21,0x2b,0x14,0x70,0x02,0x21,0x02}}, ++ { ++ 16, ++ 0x840, ++ 0, ++ {0x14,0x70,0x02,0x01,0xda,0x14,0x70,0x02,0x01,0xe3,0x24,0x05,0x60,0x02,0x21,0xe5}}, ++ { ++ 16, ++ 0x850, ++ 0, ++ {0x90,0x7f,0xeb,0xe0,0x24,0xfe,0x60,0x15,0x14,0x60,0x29,0x24,0x02,0x70,0x76,0xe5}}, ++ { ++ 16, ++ 0x860, ++ 0, ++ {0x16,0x90,0x7f,0xd4,0xf0,0xe5,0x17,0x90,0x7f,0xd5,0xf0,0x21,0xe8,0x90,0x7f,0xea}}, ++ { ++ 16, ++ 0x870, ++ 0, ++ {0xe0,0xff,0x12,0x12,0x58,0x12,0x0f,0x75,0x60,0x05,0x12,0x0f,0x9a,0x21,0xe8,0x12}}, ++ { ++ 16, ++ 0x880, ++ 0, ++ {0x0f,0x43,0x21,0xe8,0x90,0x18,0x02,0xe0,0xfd,0x64,0xb4,0x60,0x05,0xed,0x64,0xb6}}, ++ { ++ 16, ++ 0x890, ++ 0, ++ {0x70,0x11,0x90,0x7f,0xea,0xe0,0xb4,0x04,0x0a,0x90,0x18,0x56,0x74,0x1e,0x12,0x0f}}, ++ { ++ 16, ++ 0x8a0, ++ 0, ++ {0x84,0x21,0xe8,0xed,0x64,0xb4,0x60,0x05,0xed,0x64,0xb6,0x70,0x11,0x90,0x7f,0xea}}, ++ { ++ 16, ++ 0x8b0, ++ 0, ++ {0xe0,0xb4,0x03,0x0a,0x90,0x18,0x56,0x74,0x1a,0x12,0x0f,0x84,0x21,0xe8,0x90,0x7f}}, ++ { ++ 16, ++ 0x8c0, ++ 0, ++ {0xea,0xe0,0xff,0x12,0x13,0xcf,0x12,0x0f,0x75,0x60,0x05,0x12,0x0f,0x9a,0x21,0xe8}}, ++ { ++ 16, ++ 0x8d0, ++ 0, ++ {0x12,0x0f,0x43,0x21,0xe8,0x12,0x0f,0x43,0x21,0xe8,0x12,0x0f,0x4b,0xe0,0x12,0x0f}}, ++ { ++ 16, ++ 0x8e0, ++ 0, ++ {0xa5,0x21,0xe8,0x90,0x7f,0xea,0xe0,0xff,0x12,0x0f,0x4b,0xef,0xf0,0x90,0x7f,0xec}}, ++ { ++ 16, ++ 0x8f0, ++ 0, ++ {0xe0,0x64,0x02,0x60,0x02,0x21,0xe8,0x12,0x0f,0x4e,0xe0,0xf5,0x3a,0x12,0x3b,0x31}}, ++ { ++ 16, ++ 0x900, ++ 0, ++ {0x21,0xe8,0x90,0x7f,0xea,0xe0,0x90,0x18,0x79,0xf0,0xe0,0xb4,0x01,0x05,0x12,0x31}}, ++ { ++ 16, ++ 0x910, ++ 0, ++ {0x05,0x21,0xe8,0x90,0x18,0x79,0xe0,0x60,0x02,0x21,0xe8,0xa3,0xf0,0xa3,0xf0,0xa3}}, ++ { ++ 16, ++ 0x920, ++ 0, ++ {0xf0,0xf5,0x3a,0x12,0x3b,0x31,0x12,0x3a,0x6b,0x21,0xe8,0x90,0x18,0x79,0xe0,0x12}}, ++ { ++ 16, ++ 0x930, ++ 0, ++ {0x0f,0xa5,0x21,0xe8,0x90,0x7f,0xe8,0xe0,0x24,0x7f,0x60,0x19,0x14,0x60,0x20,0x24}}, ++ { ++ 16, ++ 0x940, ++ 0, ++ {0x02,0x70,0x27,0xa2,0x15,0xe4,0x33,0xff,0x25,0xe0,0xff,0xa2,0x16,0xe4,0x33,0x4f}}, ++ { ++ 16, ++ 0x950, ++ 0, ++ {0x12,0x0f,0x67,0x21,0xe8,0xe4,0x90,0x7f,0x00,0xf0,0x12,0x0f,0x6c,0x21,0xe8,0x12}}, ++ { ++ 16, ++ 0x960, ++ 0, ++ {0x0f,0x27,0xe0,0x54,0x01,0x12,0x0f,0x67,0x21,0xe8,0x12,0x0f,0x43,0x21,0xe8,0x90}}, ++ { ++ 16, ++ 0x970, ++ 0, ++ {0x7f,0xe8,0xe0,0x24,0xfe,0x60,0x14,0x24,0x02,0x70,0x6d,0x90,0x7f,0xea,0xe0,0xb4}}, ++ { ++ 16, ++ 0x980, ++ 0, ++ {0x01,0x04,0xc2,0x15,0x21,0xe8,0x12,0x0f,0x43,0x21,0xe8,0x90,0x7f,0xea,0xe0,0x70}}, ++ { ++ 16, ++ 0x990, ++ 0, ++ {0x20,0x12,0x0f,0x27,0xe4,0xf0,0x90,0x7f,0xec,0xe0,0x54,0x80,0xff,0x13,0x13,0x13}}, ++ { ++ 16, ++ 0x9a0, ++ 0, ++ {0x54,0x1f,0xff,0xe0,0x54,0x07,0x2f,0x90,0x7f,0xd7,0xf0,0xe0,0x44,0x20,0xf0,0x80}}, ++ { ++ 16, ++ 0x9b0, ++ 0, ++ {0x37,0x12,0x0f,0x43,0x80,0x32,0x90,0x7f,0xe8,0xe0,0x24,0xfe,0x60,0x14,0x24,0x02}}, ++ { ++ 16, ++ 0x9c0, ++ 0, ++ {0x70,0x26,0x90,0x7f,0xea,0xe0,0xb4,0x01,0x04,0xd2,0x15,0x80,0x1b,0x12,0x0f,0x43}}, ++ { ++ 16, ++ 0x9d0, ++ 0, ++ {0x80,0x16,0x90,0x7f,0xea,0xe0,0x70,0x08,0x12,0x0f,0x27,0x74,0x01,0xf0,0x80,0x08}}, ++ { ++ 12, ++ 0x9e0, ++ 0, ++ {0x12,0x0f,0x43,0x80,0x03,0x12,0x0f,0x43,0x12,0x0f,0x92,0x22}}, ++ { ++ 3, ++ 0x33, ++ 0, ++ {0x02,0x14,0xe8}}, ++ { ++ 4, ++ 0x14e8, ++ 0, ++ {0x53,0xd8,0xef,0x32}}, ++ { ++ 3, ++ 0x63, ++ 0, ++ {0x02,0x13,0xa2}}, ++ { ++ 16, ++ 0x13a2, ++ 0, ++ {0xc0,0xe0,0xc0,0x83,0xc0,0x82,0xc0,0x85,0xc0,0x84,0xc0,0x86,0x75,0x86,0x00,0xc0}}, ++ { ++ 16, ++ 0x13b2, ++ 0, ++ {0xd0,0x90,0x40,0x2d,0xe0,0x54,0x03,0x24,0xff,0x92,0x10,0x53,0xd8,0xf7,0xd0,0xd0}}, ++ { ++ 13, ++ 0x13c2, ++ 0, ++ {0xd0,0x86,0xd0,0x84,0xd0,0x85,0xd0,0x82,0xd0,0x83,0xd0,0xe0,0x32}}, ++ { ++ 3, ++ 0x13, ++ 0, ++ {0x02,0x07,0xfd}}, ++ { ++ 3, ++ 0x7fd, ++ 0, ++ {0xc2,0xaa,0x32}}, ++ { ++ 16, ++ 0x1196, ++ 0, ++ {0xc1,0x04,0xc1,0x05,0xc1,0x07,0xc1,0x08,0xc1,0x0b,0xc1,0x0c,0xc1,0x0d,0x01,0x27}}, ++ { ++ 16, ++ 0x11a6, ++ 0, ++ {0x00,0x01,0x28,0x00,0x01,0x29,0x00,0x41,0x18,0x55,0x01,0x01,0x34,0x14,0x01,0x35}}, ++ { ++ 16, ++ 0x11b6, ++ 0, ++ {0x00,0x01,0x38,0x00,0x01,0x39,0x00,0x01,0x3a,0x00,0x41,0x18,0x75,0x40,0x41,0x18}}, ++ { ++ 10, ++ 0x11c6, ++ 0, ++ {0x76,0x00,0x41,0x18,0x77,0x40,0x41,0x18,0x78,0x06}}, ++ { ++ 16, ++ 0xe88, ++ 0, ++ {0x85,0x2f,0x90,0x43,0x2f,0x04,0x85,0x2f,0x90,0x53,0x2f,0xfb,0x85,0x2f,0x90,0x43}}, ++ { ++ 16, ++ 0xe98, ++ 0, ++ {0x2f,0x08,0x85,0x2f,0x90,0x53,0x2f,0xf7,0x85,0x2f,0x90,0x22,0x90,0x7f,0xb4,0xe0}}, ++ { ++ 16, ++ 0xea8, ++ 0, ++ {0x44,0x01,0xf0,0x22,0x90,0x7f,0xed,0xe0,0xff,0x90,0x7f,0xec,0xe0,0xfd,0x22,0x90}}, ++ { ++ 16, ++ 0xeb8, ++ 0, ++ {0x7f,0xee,0xe0,0x75,0x4c,0x00,0xf5,0x4d,0xa3,0xe0,0xfe,0xe4,0xee,0x42,0x4c,0x90}}, ++ { ++ 16, ++ 0xec8, ++ 0, ++ {0x7f,0xec,0xe0,0x75,0x4a,0x00,0xf5,0x4b,0xa3,0xe0,0xfe,0xe4,0xee,0x42,0x4a,0x22}}, ++ { ++ 16, ++ 0xed8, ++ 0, ++ {0x90,0x7f,0xec,0xe0,0x75,0x44,0x00,0xf5,0x45,0xa3,0xe0,0xfe,0xe4,0xee,0x42,0x44}}, ++ { ++ 16, ++ 0xee8, ++ 0, ++ {0x22,0x75,0x3b,0x01,0x75,0x3c,0xff,0xc2,0x06,0xd2,0x01,0x90,0x7f,0xee,0xe0,0xf5}}, ++ { ++ 16, ++ 0xef8, ++ 0, ++ {0x2a,0x22,0x53,0x91,0xef,0x90,0x7f,0xab,0x22,0x90,0x7f,0xed,0xe0,0xfe,0x90,0x7f}}, ++ { ++ 16, ++ 0xf08, ++ 0, ++ {0xec,0xe0,0x7c,0x00,0x24,0x00,0x22,0x85,0x30,0xa0,0x53,0x30,0xf7,0x85,0x30,0xa0}}, ++ { ++ 15, ++ 0xf18, ++ 0, ++ {0x22,0x43,0x31,0x08,0x85,0x31,0xb0,0x22,0x43,0x31,0x10,0x85,0x31,0xb0,0x22}}, ++ { ++ 16, ++ 0xd16, ++ 0, ++ {0xe4,0x90,0x7f,0x93,0xf0,0x90,0x7f,0x94,0xf0,0x90,0x7f,0x95,0xf0,0x90,0x78,0x4a}}, ++ { ++ 16, ++ 0xd26, ++ 0, ++ {0xf0,0x90,0x78,0x49,0x04,0xf0,0xe4,0x90,0x78,0x4b,0xf0,0xf5,0xb2,0xf5,0x2e,0x85}}, ++ { ++ 16, ++ 0xd36, ++ 0, ++ {0x2e,0x80,0x43,0x2e,0x08,0x85,0x2e,0x80,0x43,0x2e,0x10,0x85,0x2e,0x80,0x75,0xb2}}, ++ { ++ 16, ++ 0xd46, ++ 0, ++ {0xff,0xf5,0xb3,0xf5,0x2f,0x12,0x0e,0x88,0x53,0x2f,0xef,0x85,0x2f,0x90,0x75,0xb3}}, ++ { ++ 16, ++ 0xd56, ++ 0, ++ {0xff,0xf5,0xb4,0xf5,0x30,0x85,0x30,0xa0,0x43,0x30,0x01,0x85,0x30,0xa0,0x53,0x30}}, ++ { ++ 16, ++ 0xd66, ++ 0, ++ {0xfd,0x85,0x30,0xa0,0x53,0x30,0xfb,0x12,0x0f,0x0f,0x43,0x30,0x10,0x85,0x30,0xa0}}, ++ { ++ 16, ++ 0xd76, ++ 0, ++ {0x43,0x30,0x20,0x85,0x30,0xa0,0x75,0xb4,0xff,0xf5,0xb5,0xf5,0x31,0x85,0x31,0xb0}}, ++ { ++ 16, ++ 0xd86, ++ 0, ++ {0x43,0x31,0x01,0x85,0x31,0xb0,0x43,0x31,0x02,0x85,0x31,0xb0,0x43,0x31,0x04,0x85}}, ++ { ++ 16, ++ 0xd96, ++ 0, ++ {0x31,0xb0,0x12,0x0f,0x19,0x12,0x0f,0x20,0x75,0xb5,0xff,0x75,0xb6,0x40,0xf5,0x32}}, ++ { ++ 16, ++ 0xda6, ++ 0, ++ {0x85,0x32,0xb1,0x90,0x7f,0xaf,0xe0,0x44,0x01,0xf0,0x90,0x7f,0xae,0xe0,0x44,0x1f}}, ++ { ++ 16, ++ 0xdb6, ++ 0, ++ {0xf0,0x12,0x3b,0x31,0x75,0xc8,0x01,0xe4,0x90,0x7f,0xe2,0xf0,0x90,0x78,0x57,0x74}}, ++ { ++ 16, ++ 0xdc6, ++ 0, ++ {0x03,0xf0,0x43,0x2f,0x40,0x85,0x2f,0x90,0x43,0x2e,0x20,0x85,0x2e,0x80,0xc2,0x8a}}, ++ { ++ 14, ++ 0xdd6, ++ 0, ++ {0xc2,0xaa,0x53,0xd8,0xf7,0x43,0xe8,0x10,0x53,0xf8,0xef,0xd2,0xaf,0x22}}, ++ { ++ 16, ++ 0x1046, ++ 0, ++ {0x75,0x34,0x14,0xd2,0x12,0xe4,0xf5,0x36,0xc2,0x11,0xc2,0x0f,0xc2,0x00,0xc2,0x01}}, ++ { ++ 16, ++ 0x1056, ++ 0, ++ {0xf5,0x41,0xf5,0x42,0xc2,0x06,0xc2,0x02,0xc2,0x03,0xf5,0x2b,0xf5,0x2c,0xf5,0x37}}, ++ { ++ 16, ++ 0x1066, ++ 0, ++ {0xd2,0x04,0xc2,0x10,0xf5,0x33,0x12,0x33,0xd5,0x12,0x14,0xd7,0x90,0x18,0x53,0x74}}, ++ { ++ 16, ++ 0x1076, ++ 0, ++ {0x03,0xf0,0x43,0x2f,0x10,0x12,0x0e,0x88,0x53,0x2f,0xef,0x85,0x2f,0x90,0x12,0x32}}, ++ { ++ 16, ++ 0x1086, ++ 0, ++ {0xab,0x12,0x14,0xe0,0x7a,0x18,0x7b,0x02,0x7d,0x50,0xe4,0xff,0xfe,0x12,0x36,0x83}}, ++ { ++ 16, ++ 0x1096, ++ 0, ++ {0xe4,0x90,0x18,0x54,0xf0,0x90,0x18,0x0a,0xe0,0x30,0xe3,0x0c,0x90,0x18,0x4d,0xe0}}, ++ { ++ 16, ++ 0x10a6, ++ 0, ++ {0x54,0xc0,0x90,0x18,0x54,0xf0,0x80,0x0a,0x90,0x18,0x11,0xe0,0x54,0xc0,0x90,0x18}}, ++ { ++ 16, ++ 0x10b6, ++ 0, ++ {0x54,0xf0,0x12,0x35,0xe2,0x90,0x18,0x0a,0xe0,0xff,0x54,0x01,0xf5,0x35,0xef,0x54}}, ++ { ++ 11, ++ 0x10c6, ++ 0, ++ {0x06,0x90,0x18,0x52,0xf0,0xe0,0xff,0xc3,0x13,0xf0,0x22}}, ++ { ++ 13, ++ 0x14ca, ++ 0, ++ {0x90,0x18,0x0a,0xe0,0x30,0xe5,0x03,0xd2,0xaa,0x22,0xc2,0xaa,0x22}}, ++ { ++ 16, ++ 0x80, ++ 0, ++ {0xc2,0x1d,0x90,0x7f,0xea,0xe0,0x12,0x0b,0xfa,0x01,0x00,0x01,0x01,0x6d,0x03,0x00}}, ++ { ++ 16, ++ 0x90, ++ 0, ++ {0xcb,0x04,0x02,0xb7,0x11,0x00,0xa8,0x12,0x01,0x5e,0x14,0x02,0x3b,0x15,0x02,0x4f}}, ++ { ++ 16, ++ 0xa0, ++ 0, ++ {0x16,0x02,0x19,0xf0,0x00,0x00,0x02,0xe2,0x12,0x0e,0xd8,0x90,0x7f,0xb4,0xe0,0x44}}, ++ { ++ 16, ++ 0xb0, ++ 0, ++ {0x02,0xf0,0x12,0x31,0xb7,0x7f,0xe8,0x7e,0x03,0x12,0x14,0xb8,0xd2,0x21,0x85,0x44}}, ++ { ++ 16, ++ 0xc0, ++ 0, ++ {0x70,0x85,0x45,0x71,0x12,0x35,0x9d,0xd2,0x1d,0x41,0xe5,0x30,0x00,0x05,0x12,0x0e}}, ++ { ++ 16, ++ 0xd0, ++ 0, ++ {0xa4,0x41,0xe5,0xe4,0x90,0x7f,0xc5,0xf0,0xff,0x12,0x30,0x00,0x12,0x0e,0xac,0x12}}, ++ { ++ 16, ++ 0xe0, ++ 0, ++ {0x30,0xc2,0xe5,0x37,0x64,0x03,0x60,0x11,0x90,0x7f,0xb4,0xe0,0x20,0xe3,0xf9,0xd2}}, ++ { ++ 16, ++ 0xf0, ++ 0, ++ {0x1b,0xe4,0xfd,0xff,0x12,0x30,0x2e,0x41,0xe5,0x12,0x0e,0xe9,0xd2,0x1d,0x41,0xe5}}, ++ { ++ 16, ++ 0x100, ++ 0, ++ {0x30,0x00,0x05,0x12,0x0e,0xa4,0x41,0xe5,0xe4,0x90,0x7f,0xc5,0xf0,0x12,0x0e,0xac}}, ++ { ++ 16, ++ 0x110, ++ 0, ++ {0x12,0x30,0xc2,0xe5,0x37,0x64,0x03,0x60,0x3e,0x12,0x0e,0xf3,0x90,0x7f,0xb4,0xe0}}, ++ { ++ 16, ++ 0x120, ++ 0, ++ {0x20,0xe3,0xf9,0xe4,0xf5,0x43,0xe5,0x43,0xc3,0x95,0x2a,0x50,0x0f,0xd2,0x1b,0xe4}}, ++ { ++ 16, ++ 0x130, ++ 0, ++ {0xfd,0xaf,0x43,0x12,0x30,0x2e,0x05,0x43,0x05,0x43,0x80,0xea,0xc2,0x1b,0x7d,0x01}}, ++ { ++ 16, ++ 0x140, ++ 0, ++ {0xe4,0xff,0x12,0x30,0x2e,0xe5,0x37,0x64,0x04,0x60,0x08,0xe5,0x37,0x64,0x05,0x60}}, ++ { ++ 16, ++ 0x150, ++ 0, ++ {0x02,0x41,0xe5,0xc2,0x12,0x41,0xe5,0x12,0x0e,0xe9,0xd2,0x1d,0x41,0xe5,0x90,0x7f}}, ++ { ++ 16, ++ 0x160, ++ 0, ++ {0xec,0xe0,0xf5,0x38,0xa3,0xe0,0xf5,0x39,0x12,0x33,0xd5,0x41,0xe5,0x90,0x7f,0xed}}, ++ { ++ 16, ++ 0x170, ++ 0, ++ {0xe0,0x60,0x05,0x12,0x0e,0xa4,0x41,0xe5,0x90,0x7f,0xec,0xe0,0x24,0xfe,0x60,0x1a}}, ++ { ++ 16, ++ 0x180, ++ 0, ++ {0x24,0xfd,0x60,0x25,0x14,0x60,0x37,0x14,0x60,0x49,0x14,0x60,0x4e,0x24,0x05,0x60}}, ++ { ++ 16, ++ 0x190, ++ 0, ++ {0x02,0x41,0x14,0xe4,0xf5,0x37,0xd2,0x0e,0x41,0xe5,0xe5,0x37,0x64,0x03,0x70,0x02}}, ++ { ++ 16, ++ 0x1a0, ++ 0, ++ {0x41,0xe5,0x75,0x37,0x03,0xd2,0x0e,0x41,0xe5,0xe5,0x37,0x64,0x05,0x70,0x02,0x41}}, ++ { ++ 16, ++ 0x1b0, ++ 0, ++ {0xe5,0x75,0x37,0x05,0xd2,0x0e,0x53,0x30,0xdf,0x85,0x30,0xa0,0x41,0xe5,0xe5,0x37}}, ++ { ++ 16, ++ 0x1c0, ++ 0, ++ {0x64,0x04,0x70,0x02,0x41,0xe5,0x75,0x37,0x04,0xd2,0x0e,0x43,0x30,0x20,0x85,0x30}}, ++ { ++ 16, ++ 0x1d0, ++ 0, ++ {0xa0,0x41,0xe5,0x53,0x30,0xef,0x12,0x0f,0x0f,0x41,0xe5,0x12,0x14,0xd7,0x12,0x32}}, ++ { ++ 16, ++ 0x1e0, ++ 0, ++ {0xab,0x12,0x0e,0x8b,0x43,0x30,0x10,0x85,0x30,0xa0,0x43,0x30,0x08,0x85,0x30,0xa0}}, ++ { ++ 16, ++ 0x1f0, ++ 0, ++ {0x75,0x34,0x14,0xd2,0x12,0xe4,0xf5,0x36,0xc2,0x06,0xc2,0x01,0xc2,0x00,0xc2,0x0d}}, ++ { ++ 16, ++ 0x200, ++ 0, ++ {0xe5,0x38,0x20,0xe4,0x03,0x12,0x0f,0x20,0xe5,0x38,0x30,0xe3,0x02,0x41,0xe5,0x12}}, ++ { ++ 16, ++ 0x210, ++ 0, ++ {0x0f,0x19,0x41,0xe5,0x12,0x0e,0xa4,0x41,0xe5,0xe4,0x90,0x7f,0xc5,0xf0,0x90,0x7f}}, ++ { ++ 14, ++ 0x220, ++ 0, ++ {0xb4,0xe0,0x20,0xe3,0xf9,0x12,0x0f,0x01,0xf5,0x45,0xec,0x3e,0xf5,0x44}}, ++ { ++ 16, ++ 0x22e, ++ 0, ++ {0x90,0x7f,0x00,0xe0,0x85,0x45,0x82,0x85,0x44,0x83,0xf0,0x41,0xe5,0x90,0x7f,0xed}}, ++ { ++ 16, ++ 0x23e, ++ 0, ++ {0xe0,0x44,0x40,0x90,0x18,0x77,0xf0,0x90,0x7f,0xec,0xe0,0x90,0x18,0x78,0xf0,0x41}}, ++ { ++ 16, ++ 0x24e, ++ 0, ++ {0xe5,0x90,0x7f,0xee,0xe0,0x75,0x46,0x00,0xf5,0x47,0xa3,0xe0,0xfe,0xe4,0xee,0x42}}, ++ { ++ 16, ++ 0x25e, ++ 0, ++ {0x46,0x12,0x0e,0xd8,0xc3,0xe5,0x45,0x94,0x5a,0xe5,0x44,0x94,0x00,0x50,0x05,0x12}}, ++ { ++ 16, ++ 0x26e, ++ 0, ++ {0x0e,0xa4,0x41,0xe5,0xe5,0x47,0x45,0x46,0x60,0x6d,0xe4,0x90,0x7f,0xc5,0xf0,0x90}}, ++ { ++ 16, ++ 0x27e, ++ 0, ++ {0x7f,0xb4,0xe0,0x20,0xe3,0xf9,0x90,0x7f,0xc5,0xe0,0xf5,0x48,0x7a,0x7e,0x79,0xc0}}, ++ { ++ 16, ++ 0x28e, ++ 0, ++ {0x7e,0x7e,0x7f,0xc0,0xab,0x07,0xfd,0xaf,0x45,0xae,0x44,0x12,0x37,0x0a,0xaf,0x48}}, ++ { ++ 16, ++ 0x29e, ++ 0, ++ {0x7e,0x00,0xef,0x25,0x45,0xf5,0x45,0xee,0x35,0x44,0xf5,0x44,0xc3,0xe5,0x47,0x9f}}, ++ { ++ 16, ++ 0x2ae, ++ 0, ++ {0xf5,0x47,0xe5,0x46,0x9e,0xf5,0x46,0x80,0xbb,0x20,0x0c,0x23,0x12,0x0e,0xd8,0xe5}}, ++ { ++ 16, ++ 0x2be, ++ 0, ++ {0x45,0x45,0x44,0x70,0x0d,0x75,0x12,0x80,0x75,0x13,0x50,0x75,0x10,0x10,0xf5,0x11}}, ++ { ++ 16, ++ 0x2ce, ++ 0, ++ {0x80,0x15,0x75,0x12,0xb0,0xe4,0xf5,0x13,0x75,0x10,0xa0,0xf5,0x11,0x80,0x08,0x12}}, ++ { ++ 10, ++ 0x2de, ++ 0, ++ {0x0e,0xa4,0x80,0x03,0x12,0x0e,0xa4,0xa2,0x1d,0x22}}, ++ { ++ 16, ++ 0x2e8, ++ 0, ++ {0xc2,0x1e,0x90,0x7f,0xea,0xe0,0x60,0x48,0x24,0xed,0x70,0x02,0x61,0x98,0x24,0xfc}}, ++ { ++ 16, ++ 0x2f8, ++ 0, ++ {0x70,0x02,0x81,0x11,0x14,0x70,0x02,0x81,0x84,0x24,0x28,0x70,0x02,0x61,0xc2,0x14}}, ++ { ++ 16, ++ 0x308, ++ 0, ++ {0x70,0x02,0x61,0xdd,0x24,0xec,0x60,0x02,0x81,0xcb,0x30,0x00,0x05,0x12,0x0e,0xa4}}, ++ { ++ 16, ++ 0x318, ++ 0, ++ {0x81,0xce,0xe4,0xff,0x12,0x30,0x00,0x12,0x0e,0xac,0x12,0x30,0xc2,0x7b,0x01,0x7a}}, ++ { ++ 16, ++ 0x328, ++ 0, ++ {0x7f,0x79,0x00,0xe4,0xff,0x12,0x30,0x76,0x90,0x7f,0xb5,0x74,0x02,0xf0,0x81,0xce}}, ++ { ++ 16, ++ 0x338, ++ 0, ++ {0x30,0x00,0x05,0x12,0x0e,0xa4,0x81,0xce,0xe5,0x37,0x64,0x03,0x60,0x3b,0x12,0x0e}}, ++ { ++ 16, ++ 0x348, ++ 0, ++ {0xf3,0x12,0x0e,0xac,0x12,0x30,0xc2,0xe4,0xf5,0x49,0xe5,0x49,0xc3,0x95,0x2a,0x50}}, ++ { ++ 16, ++ 0x358, ++ 0, ++ {0x11,0x7b,0x01,0x7a,0x7f,0x79,0x00,0xaf,0x49,0x12,0x30,0x76,0x05,0x49,0x05,0x49}}, ++ { ++ 16, ++ 0x368, ++ 0, ++ {0x80,0xe8,0x90,0x7f,0xb5,0xe5,0x2a,0xf0,0x7d,0xdf,0x7f,0x7f,0x12,0x30,0xc2,0xc2}}, ++ { ++ 16, ++ 0x378, ++ 0, ++ {0x1b,0xe4,0xfd,0xff,0x12,0x30,0x2e,0x81,0xce,0x12,0x0e,0xac,0x12,0x30,0xc2,0x75}}, ++ { ++ 16, ++ 0x388, ++ 0, ++ {0x34,0x14,0xd2,0x00,0xd2,0x12,0xe4,0xf5,0x36,0x12,0x0e,0xf3,0xd2,0x1e,0x81,0xce}}, ++ { ++ 16, ++ 0x398, ++ 0, ++ {0x90,0x7f,0xee,0xe0,0x64,0x04,0x60,0x09,0xa3,0xe0,0x60,0x05,0x12,0x0e,0xa4,0x81}}, ++ { ++ 16, ++ 0x3a8, ++ 0, ++ {0xce,0x90,0x7f,0x00,0x74,0x4e,0xf0,0xa3,0x74,0x02,0xf0,0xa3,0x14,0xf0,0xa3,0x74}}, ++ { ++ 16, ++ 0x3b8, ++ 0, ++ {0x31,0xf0,0x90,0x7f,0xb5,0x74,0x04,0xf0,0x81,0xce,0x12,0x0f,0x01,0xf5,0x4b,0xec}}, ++ { ++ 16, ++ 0x3c8, ++ 0, ++ {0x3e,0xf5,0x4a,0x85,0x4b,0x82,0xf5,0x83,0xe0,0x90,0x7f,0x00,0xf0,0x90,0x7f,0xb5}}, ++ { ++ 16, ++ 0x3d8, ++ 0, ++ {0x74,0x01,0xf0,0x81,0xce,0x90,0x40,0x1f,0xe0,0x90,0x7f,0x00,0xf0,0x90,0x40,0x26}}, ++ { ++ 16, ++ 0x3e8, ++ 0, ++ {0xe0,0x90,0x7f,0x01,0xf0,0x90,0x40,0x25,0xe0,0x90,0x7f,0x02,0xf0,0x7b,0x01,0x7a}}, ++ { ++ 16, ++ 0x3f8, ++ 0, ++ {0x7f,0x79,0x03,0xe5,0x0a,0x85,0x0b,0xf0,0x12,0x0b,0xca,0x90,0x7f,0x05,0xe5,0x0c}}, ++ { ++ 16, ++ 0x408, ++ 0, ++ {0xf0,0x90,0x7f,0xb5,0x74,0x06,0xf0,0x81,0xce,0x12,0x0e,0xb7,0xe5,0x4d,0x45,0x4c}}, ++ { ++ 16, ++ 0x418, ++ 0, ++ {0x70,0x02,0x81,0xce,0xc3,0xe5,0x4d,0x94,0x40,0xe5,0x4c,0x94,0x00,0x50,0x05,0x85}}, ++ { ++ 16, ++ 0x428, ++ 0, ++ {0x4d,0x4e,0x80,0x03,0x75,0x4e,0x40,0xe4,0xf5,0x49,0xe5,0x49,0xc3,0x95,0x4e,0x50}}, ++ { ++ 16, ++ 0x438, ++ 0, ++ {0x12,0x74,0x00,0x25,0x49,0xf5,0x82,0xe4,0x34,0x7f,0xf5,0x83,0x74,0xcd,0xf0,0x05}}, ++ { ++ 16, ++ 0x448, ++ 0, ++ {0x49,0x80,0xe7,0xad,0x4e,0x7a,0x7f,0x79,0x00,0x7e,0x7f,0x7f,0x00,0xab,0x07,0xaf}}, ++ { ++ 16, ++ 0x458, ++ 0, ++ {0x4b,0xae,0x4a,0x12,0x36,0x83,0x90,0x7f,0xb5,0xe5,0x4e,0xf0,0xff,0x7e,0x00,0x25}}, ++ { ++ 16, ++ 0x468, ++ 0, ++ {0x4b,0xf5,0x4b,0xee,0x35,0x4a,0xf5,0x4a,0xc3,0xe5,0x4d,0x9f,0xf5,0x4d,0xe5,0x4c}}, ++ { ++ 16, ++ 0x478, ++ 0, ++ {0x9e,0xf5,0x4c,0x90,0x7f,0xb4,0xe0,0x30,0xe2,0x92,0x80,0xf7,0x12,0x0e,0xb7,0x12}}, ++ { ++ 16, ++ 0x488, ++ 0, ++ {0x0e,0xaf,0x12,0x30,0xc2,0xe5,0x2f,0x20,0xe4,0x04,0x7f,0x01,0x80,0x02,0x7f,0x00}}, ++ { ++ 16, ++ 0x498, ++ 0, ++ {0x8f,0x49,0x43,0x2f,0x10,0x85,0x2f,0x90,0x12,0x04,0xd1,0x90,0x7f,0x00,0xf0,0x90}}, ++ { ++ 16, ++ 0x4a8, ++ 0, ++ {0x40,0x04,0xe0,0x90,0x7f,0x01,0xf0,0x12,0x04,0xd1,0x90,0x7f,0x02,0xf0,0xe4,0xa3}}, ++ { ++ 16, ++ 0x4b8, ++ 0, ++ {0xf0,0x90,0x7f,0xb5,0xe5,0x4d,0xf0,0xe5,0x49,0x60,0x03,0x53,0x2f,0xef,0x85,0x2f}}, ++ { ++ 8, ++ 0x4c8, ++ 0, ++ {0x90,0x80,0x03,0x12,0x0e,0xa4,0xa2,0x1e}}, ++ { ++ 16, ++ 0x4d0, ++ 0, ++ {0x22,0x12,0x30,0x1f,0x43,0x2f,0x02,0x85,0x2f,0x90,0x53,0x2f,0xfc,0x85,0x2f,0x90}}, ++ { ++ 8, ++ 0x4e0, ++ 0, ++ {0x12,0x30,0x1f,0x90,0x40,0x03,0xe0,0x22}}, ++ { ++ 16, ++ 0x11d9, ++ 0, ++ {0xc0,0xe0,0xc0,0x83,0xc0,0x82,0xc0,0x85,0xc0,0x84,0xc0,0x86,0x75,0x86,0x00,0xd2}}, ++ { ++ 16, ++ 0x11e9, ++ 0, ++ {0x13,0x12,0x0e,0xfa,0x74,0x01,0xf0,0xd0,0x86,0xd0,0x84,0xd0,0x85,0xd0,0x82,0xd0}}, ++ { ++ 4, ++ 0x11f9, ++ 0, ++ {0x83,0xd0,0xe0,0x32}}, ++ { ++ 16, ++ 0x141f, ++ 0, ++ {0xc0,0xe0,0xc0,0x83,0xc0,0x82,0xc0,0x85,0xc0,0x84,0xc0,0x86,0x75,0x86,0x00,0x12}}, ++ { ++ 16, ++ 0x142f, ++ 0, ++ {0x0e,0xfa,0x74,0x04,0xf0,0xd0,0x86,0xd0,0x84,0xd0,0x85,0xd0,0x82,0xd0,0x83,0xd0}}, ++ { ++ 2, ++ 0x143f, ++ 0, ++ {0xe0,0x32}}, ++ { ++ 16, ++ 0x10d1, ++ 0, ++ {0xc0,0xe0,0xc0,0x83,0xc0,0x82,0xc0,0x85,0xc0,0x84,0xc0,0x86,0x75,0x86,0x00,0xc0}}, ++ { ++ 16, ++ 0x10e1, ++ 0, ++ {0xd0,0x20,0x12,0x0e,0x05,0x36,0x90,0x18,0x53,0xe0,0xb5,0x36,0x05,0x75,0x36,0x00}}, ++ { ++ 16, ++ 0x10f1, ++ 0, ++ {0xd2,0x12,0x30,0x0c,0x0f,0x75,0xc8,0x01,0x85,0x13,0xcc,0x85,0x12,0xcd,0x75,0xc8}}, ++ { ++ 16, ++ 0x1101, ++ 0, ++ {0x05,0x85,0x25,0x26,0x30,0x0d,0x26,0xe5,0x38,0x20,0xe4,0x0e,0x30,0xb7,0x08,0x53}}, ++ { ++ 16, ++ 0x1111, ++ 0, ++ {0x31,0xef,0x85,0x31,0xb0,0x80,0x03,0x12,0x0f,0x20,0xe5,0x38,0x20,0xe3,0x0e,0x30}}, ++ { ++ 16, ++ 0x1121, ++ 0, ++ {0xb6,0x08,0x53,0x31,0xf7,0x85,0x31,0xb0,0x80,0x03,0x12,0x0f,0x19,0xd2,0x11,0x12}}, ++ { ++ 16, ++ 0x1131, ++ 0, ++ {0x0e,0xfa,0x74,0x02,0xf0,0xd0,0xd0,0xd0,0x86,0xd0,0x84,0xd0,0x85,0xd0,0x82,0xd0}}, ++ { ++ 4, ++ 0x1141, ++ 0, ++ {0x83,0xd0,0xe0,0x32}}, ++ { ++ 16, ++ 0x133e, ++ 0, ++ {0xc0,0xe0,0xc0,0x83,0xc0,0x82,0xc0,0x85,0xc0,0x84,0xc0,0x86,0x75,0x86,0x00,0xd2}}, ++ { ++ 16, ++ 0x134e, ++ 0, ++ {0x0e,0x75,0x37,0x00,0xd2,0x0f,0x90,0x7f,0xc9,0xe4,0xf0,0x90,0x7f,0xcd,0xf0,0x12}}, ++ { ++ 16, ++ 0x135e, ++ 0, ++ {0x0e,0xfa,0x74,0x10,0xf0,0xd0,0x86,0xd0,0x84,0xd0,0x85,0xd0,0x82,0xd0,0x83,0xd0}}, ++ { ++ 2, ++ 0x136e, ++ 0, ++ {0xe0,0x32}}, ++ { ++ 1, ++ 0x11fd, ++ 0, ++ {0x32}}, ++ { ++ 16, ++ 0x13fb, ++ 0, ++ {0xc0,0xe0,0xc0,0x83,0xc0,0x82,0xc0,0x85,0xc0,0x84,0xc0,0x86,0x75,0x86,0x00,0xd2}}, ++ { ++ 16, ++ 0x140b, ++ 0, ++ {0x14,0x12,0x0e,0xfa,0x74,0x08,0xf0,0xd0,0x86,0xd0,0x84,0xd0,0x85,0xd0,0x82,0xd0}}, ++ { ++ 4, ++ 0x141b, ++ 0, ++ {0x83,0xd0,0xe0,0x32}}, ++ { ++ 1, ++ 0x11fe, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0x11ff, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0x14ec, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0x14ed, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0x14ee, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0x14ef, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0x14f0, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0x14f1, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0x14f2, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0x14f3, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0x14f4, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0x14f5, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0x14f6, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0x14f7, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0x14f8, ++ 0, ++ {0x32}}, ++ { ++ 1, ++ 0x14f9, ++ 0, ++ {0x32}}, ++ { ++ 16, ++ 0x14b8, ++ 0, ++ {0x8e,0x6e,0x8f,0x6f,0x12,0x07,0xe6,0x30,0x17,0x07,0xaf,0x6f,0xae,0x6e,0x12,0x07}}, ++ { ++ 2, ++ 0x14c8, ++ 0, ++ {0xe6,0x22}}, ++ { ++ 16, ++ 0x1299, ++ 0, ++ {0x90,0x18,0x0a,0xe0,0x30,0xe5,0x33,0xd2,0xaa,0x20,0x8b,0x0d,0x90,0x7f,0xd6,0xe0}}, ++ { ++ 16, ++ 0x12a9, ++ 0, ++ {0x54,0xf7,0xf0,0xe4,0x90,0x18,0x76,0xf0,0x22,0x90,0x7f,0xd6,0xe0,0x44,0x08,0xf0}}, ++ { ++ 16, ++ 0x12b9, ++ 0, ++ {0xe0,0x44,0x02,0xf0,0x90,0x7f,0xab,0x74,0xff,0xf0,0x90,0x7f,0xa9,0xf0,0x90,0x7f}}, ++ { ++ 11, ++ 0x12c9, ++ 0, ++ {0xaa,0xf0,0x53,0x91,0xef,0xe4,0x90,0x18,0x76,0xf0,0x22}}, ++ { ++ 16, ++ 0x1462, ++ 0, ++ {0x90,0x7f,0xd6,0xe0,0x30,0xe7,0x16,0xe0,0x44,0x01,0xf0,0x7f,0x0c,0x7e,0x00,0x12}}, ++ { ++ 14, ++ 0x1472, ++ 0, ++ {0x14,0xb8,0x90,0x7f,0xd6,0xe0,0x54,0xfe,0xf0,0xe0,0x44,0x80,0xf0,0x22}}, ++ { ++ 8, ++ 0x11d0, ++ 0, ++ {0x01,0x08,0x00,0x01,0x09,0x00,0xc1,0x1a}}, ++ { ++ 16, ++ 0x9ec, ++ 0, ++ {0x53,0x62,0xef,0x90,0x40,0x00,0xe5,0x62,0xf0,0x90,0x7f,0xe2,0x74,0x03,0xf0,0x90}}, ++ { ++ 16, ++ 0x9fc, ++ 0, ++ {0x78,0x57,0x74,0x08,0xf0,0x22,0x90,0x7d,0x00,0x74,0x08,0xf0,0xa3,0x74,0x01,0xf0}}, ++ { ++ 16, ++ 0xa0c, ++ 0, ++ {0xe4,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x74,0x14,0xf0,0xe4,0xa3,0xf0}}, ++ { ++ 16, ++ 0xa1c, ++ 0, ++ {0xa3,0x74,0x02,0xf0,0xe4,0xa3,0xf0,0x90,0x7d,0x1a,0x74,0x14,0xf0,0xe4,0xa3,0xf0}}, ++ { ++ 16, ++ 0xa2c, ++ 0, ++ {0x90,0x7f,0xbd,0x22,0x05,0x29,0x53,0x28,0x1f,0xe5,0x28,0x75,0xf0,0x40,0xa4,0xae}}, ++ { ++ 16, ++ 0xa3c, ++ 0, ++ {0xf0,0x24,0x00,0xf5,0x40,0xee,0x34,0x20,0xf5,0x3f,0x22,0x43,0x31,0x02,0x85,0x31}}, ++ { ++ 16, ++ 0xa4c, ++ 0, ++ {0xb0,0x22,0x53,0x31,0xfd,0x85,0x31,0xb0,0x22,0x43,0x2f,0x10,0x85,0x2f,0x90,0x43}}, ++ { ++ 16, ++ 0xa5c, ++ 0, ++ {0x2f,0x08,0x85,0x2f,0x90,0x53,0x2f,0xf7,0x85,0x2f,0x90,0x22,0x90,0x78,0x54,0x74}}, ++ { ++ 16, ++ 0xa6c, ++ 0, ++ {0x40,0xf0,0x90,0x78,0x55,0x74,0xff,0xf0,0x22,0x43,0x2f,0x10,0x85,0x2f,0x90,0x02}}, ++ { ++ 16, ++ 0xa7c, ++ 0, ++ {0x30,0x1f,0x43,0x30,0x20,0x85,0x30,0xa0,0x53,0x30,0xf7,0x85,0x30,0xa0,0x22,0xe4}}, ++ { ++ 16, ++ 0xa8c, ++ 0, ++ {0x90,0x7f,0xe2,0xf0,0x90,0x78,0x57,0x74,0x03,0xf0,0x53,0x2f,0xef,0x85,0x2f,0x90}}, ++ { ++ 16, ++ 0xa9c, ++ 0, ++ {0x22,0x43,0x31,0x01,0x85,0x31,0xb0,0x22,0xf5,0x27,0xf5,0x28,0x90,0x18,0x55,0x04}}, ++ { ++ 16, ++ 0xaac, ++ 0, ++ {0xf0,0x22,0x24,0x0a,0xff,0x7b,0x01,0x7a,0x7d,0x79,0x00,0x22,0x53,0x32,0xfe,0x85}}, ++ { ++ 16, ++ 0xabc, ++ 0, ++ {0x32,0xb1,0x43,0xb6,0x01,0x22,0x53,0x32,0xfd,0x85,0x32,0xb1,0x43,0xb6,0x02,0x22}}, ++ { ++ 16, ++ 0xacc, ++ 0, ++ {0x43,0x32,0x08,0x85,0x32,0xb1,0x43,0xb6,0x08,0x22,0x53,0x31,0xfb,0x85,0x31,0xb0}}, ++ { ++ 16, ++ 0xadc, ++ 0, ++ {0x22,0x90,0x18,0x77,0xe0,0x44,0x40,0xff,0x90,0x18,0x78,0xe0,0xfd,0x22,0xf5,0x82}}, ++ { ++ 16, ++ 0xaec, ++ 0, ++ {0xe4,0x34,0x18,0xf5,0x83,0x22,0x90,0x7f,0x92,0xe0,0x54,0xf0,0xff,0xc4,0x54,0x0f}}, ++ { ++ 16, ++ 0xafc, ++ 0, ++ {0x22,0x43,0x31,0x04,0x85,0x31,0xb0,0x22,0x43,0x2e,0x08,0x85,0x2e,0x80,0x22,0x43}}, ++ { ++ 16, ++ 0xb0c, ++ 0, ++ {0x2e,0x10,0x85,0x2e,0x80,0x22,0x05,0x2c,0x05,0x2b,0xe5,0x2c,0xd3,0x94,0x82,0x22}}, ++ { ++ 10, ++ 0xb1c, ++ 0, ++ {0xf5,0x83,0xef,0xf0,0xed,0x25,0xe0,0x25,0xe0,0x22}}, ++ { ++ 16, ++ 0x3000, ++ 0, ++ {0x8f,0x76,0xad,0x76,0x7f,0x80,0x12,0x30,0xc2,0xc2,0x1b,0xad,0x76,0xe4,0xff,0x02}}, ++ { ++ 2, ++ 0x3010, ++ 0, ++ {0x30,0x2e}}, ++ { ++ 16, ++ 0x3012, ++ 0, ++ {0xf0,0x43,0x2f,0x01,0x85,0x2f,0x90,0x53,0x2f,0xfc,0x85,0x2f,0x90,0xe4,0xff,0x20}}, ++ { ++ 12, ++ 0x3022, ++ 0, ++ {0xb3,0x09,0xae,0x07,0x0f,0xee,0xc3,0x94,0x50,0x40,0xf4,0x22}}, ++ { ++ 16, ++ 0x302e, ++ 0, ++ {0xac,0x07,0xe5,0x2f,0x20,0xe4,0x03,0xd3,0x80,0x01,0xc3,0x92,0x1c,0x12,0x0a,0x75}}, ++ { ++ 16, ++ 0x303e, ++ 0, ++ {0x30,0x1b,0x20,0x74,0xc0,0x2c,0xf5,0x82,0xe4,0x34,0x7e,0xf5,0x83,0xe0,0x90,0x40}}, ++ { ++ 16, ++ 0x304e, ++ 0, ++ {0x03,0xf0,0x74,0xc1,0x2c,0xf5,0x82,0xe4,0x34,0x7e,0xf5,0x83,0xe0,0x90,0x40,0x04}}, ++ { ++ 16, ++ 0x305e, ++ 0, ++ {0xf0,0x80,0x08,0x90,0x40,0x03,0xed,0xf0,0xa3,0xec,0xf0,0x12,0x30,0x13,0x30,0x1c}}, ++ { ++ 8, ++ 0x306e, ++ 0, ++ {0x03,0x53,0x2f,0xef,0x85,0x2f,0x90,0x22}}, ++ { ++ 16, ++ 0x3076, ++ 0, ++ {0x8b,0x68,0x8a,0x69,0x89,0x6a,0xad,0x07,0xe5,0x2f,0x20,0xe4,0x03,0xd3,0x80,0x01}}, ++ { ++ 16, ++ 0x3086, ++ 0, ++ {0xc3,0x92,0x1f,0x12,0x0a,0x75,0x43,0x2f,0x02,0x12,0x30,0x16,0x90,0x40,0x03,0xe0}}, ++ { ++ 16, ++ 0x3096, ++ 0, ++ {0xab,0x68,0xaa,0x69,0xa9,0x6a,0x8d,0x82,0x75,0x83,0x00,0x12,0x0b,0x53,0x90,0x40}}, ++ { ++ 16, ++ 0x30a6, ++ 0, ++ {0x04,0xe0,0xff,0xed,0x7c,0x00,0x29,0xf9,0xec,0x3a,0xfa,0x90,0x00,0x01,0xef,0x12}}, ++ { ++ 12, ++ 0x30b6, ++ 0, ++ {0x0b,0x53,0x30,0x1f,0x03,0x53,0x2f,0xef,0x85,0x2f,0x90,0x22}}, ++ { ++ 16, ++ 0x30c2, ++ 0, ++ {0xac,0x07,0xe5,0x2f,0x20,0xe4,0x03,0xd3,0x80,0x01,0xc3,0x92,0x20,0x12,0x0a,0x75}}, ++ { ++ 16, ++ 0x30d2, ++ 0, ++ {0x90,0x40,0x02,0xec,0xf0,0x90,0x40,0x01,0xed,0xf0,0x43,0x2f,0x03,0x12,0x30,0x16}}, ++ { ++ 10, ++ 0x30e2, ++ 0, ++ {0x30,0x20,0x03,0x53,0x2f,0xef,0x85,0x2f,0x90,0x22}}, ++ { ++ 16, ++ 0x30ec, ++ 0, ++ {0xac,0x07,0x12,0x0a,0x75,0x90,0x40,0x03,0xeb,0xf0,0xa3,0xed,0x12,0x30,0x12,0x90}}, ++ { ++ 9, ++ 0x30fc, ++ 0, ++ {0x40,0x03,0xec,0xf0,0xa3,0xe4,0x02,0x30,0x12}}, ++ { ++ 16, ++ 0x3105, ++ 0, ++ {0x90,0x18,0x52,0xe0,0x70,0x3e,0x12,0x0a,0x7e,0x12,0x0a,0xb8,0x7f,0x64,0xfe,0x12}}, ++ { ++ 16, ++ 0x3115, ++ 0, ++ {0x14,0xb8,0x43,0x32,0x04,0x85,0x32,0xb1,0x43,0xb6,0x04,0x12,0x31,0xb0,0x12,0x0a}}, ++ { ++ 16, ++ 0x3125, ++ 0, ++ {0xc2,0x12,0x31,0xb0,0x43,0x30,0x02,0x85,0x30,0xa0,0x12,0x31,0xa3,0x43,0x30,0x01}}, ++ { ++ 16, ++ 0x3135, ++ 0, ++ {0x85,0x30,0xa0,0x43,0x30,0x10,0x85,0x30,0xa0,0x43,0x30,0x04,0x85,0x30,0xa0,0x12}}, ++ { ++ 16, ++ 0x3145, ++ 0, ++ {0x0a,0xcc,0x80,0x3c,0x90,0x18,0x52,0xe0,0x64,0x01,0x70,0x34,0x12,0x0a,0x7e,0x12}}, ++ { ++ 16, ++ 0x3155, ++ 0, ++ {0x0a,0xc2,0x43,0x30,0x02,0x85,0x30,0xa0,0x7f,0x0a,0xfe,0x12,0x14,0xb8,0x12,0x31}}, ++ { ++ 16, ++ 0x3165, ++ 0, ++ {0xa3,0x43,0x30,0x01,0x85,0x30,0xa0,0x7f,0x64,0x7e,0x00,0x12,0x14,0xb8,0x43,0x30}}, ++ { ++ 16, ++ 0x3175, ++ 0, ++ {0x10,0x85,0x30,0xa0,0x12,0x0a,0xb8,0x12,0x0a,0xcc,0x43,0x30,0x04,0x85,0x30,0xa0}}, ++ { ++ 16, ++ 0x3185, ++ 0, ++ {0x90,0x18,0x0a,0xe0,0x30,0xe4,0x0a,0xe5,0x38,0x20,0xe2,0x0d,0x12,0x0a,0x4e,0x80}}, ++ { ++ 16, ++ 0x3195, ++ 0, ++ {0x08,0xe5,0x38,0x20,0xe2,0x03,0x12,0x0a,0xd6,0xc2,0x0d,0xd2,0x08,0x22,0x43,0x30}}, ++ { ++ 16, ++ 0x31a5, ++ 0, ++ {0x08,0x85,0x30,0xa0,0x7f,0x64,0x7e,0x00,0x02,0x14,0xb8,0x7f,0x64,0x7e,0x00,0x02}}, ++ { ++ 2, ++ 0x31b5, ++ 0, ++ {0x14,0xb8}}, ++ { ++ 16, ++ 0x31b7, ++ 0, ++ {0xc2,0x0d,0x12,0x0a,0xfd,0x12,0x0a,0x9d,0x12,0x0a,0x47,0x12,0x0b,0x04,0x12,0x0b}}, ++ { ++ 16, ++ 0x31c7, ++ 0, ++ {0x0b,0x43,0x31,0x08,0x85,0x31,0xb0,0x43,0x31,0x10,0x85,0x31,0xb0,0x7d,0x2c,0x12}}, ++ { ++ 16, ++ 0x31d7, ++ 0, ++ {0x32,0xa4,0xfb,0xfd,0xff,0x12,0x30,0xec,0x7d,0x2d,0x12,0x32,0xa4,0xfd,0xff,0x12}}, ++ { ++ 16, ++ 0x31e7, ++ 0, ++ {0x30,0xec,0x7d,0x2e,0xe4,0xff,0x12,0x30,0xc2,0xe4,0x7d,0x80,0x7f,0x02,0x12,0x30}}, ++ { ++ 16, ++ 0x31f7, ++ 0, ++ {0xec,0x7d,0x2f,0xe4,0xff,0x12,0x30,0xc2,0x7b,0xcf,0x7d,0x02,0x7f,0x18,0x12,0x30}}, ++ { ++ 16, ++ 0x3207, ++ 0, ++ {0xec,0x7f,0x01,0x7e,0x00,0x12,0x14,0xb8,0x53,0x30,0xfe,0x85,0x30,0xa0,0x90,0x18}}, ++ { ++ 16, ++ 0x3217, ++ 0, ++ {0x52,0xe0,0x70,0x3e,0x53,0x32,0xf7,0x12,0x0a,0xcf,0x53,0x30,0xfb,0x85,0x30,0xa0}}, ++ { ++ 16, ++ 0x3227, ++ 0, ++ {0x12,0x0a,0xf2,0x70,0x03,0x12,0x0a,0x84,0x7f,0x0a,0x12,0x32,0x98,0x7f,0x0a,0x7e}}, ++ { ++ 16, ++ 0x3237, ++ 0, ++ {0x00,0x12,0x14,0xb8,0x43,0x32,0x02,0x12,0x0a,0xc5,0x7f,0x64,0x7e,0x00,0x12,0x14}}, ++ { ++ 16, ++ 0x3247, ++ 0, ++ {0xb8,0x53,0x32,0xfb,0x85,0x32,0xb1,0x43,0xb6,0x04,0x43,0x32,0x01,0x12,0x0a,0xbb}}, ++ { ++ 16, ++ 0x3257, ++ 0, ++ {0x80,0x33,0x90,0x18,0x52,0xe0,0x64,0x01,0x70,0x2b,0x53,0x30,0xfb,0x85,0x30,0xa0}}, ++ { ++ 16, ++ 0x3267, ++ 0, ++ {0x43,0x32,0x01,0x85,0x32,0xb1,0x53,0xb6,0xf7,0x53,0x32,0xf7,0x85,0x32,0xb1,0x7f}}, ++ { ++ 16, ++ 0x3277, ++ 0, ++ {0x01,0xfe,0x12,0x14,0xb8,0x53,0xb6,0xfe,0x12,0x0a,0xf2,0x70,0x03,0x12,0x0a,0x84}}, ++ { ++ 16, ++ 0x3287, ++ 0, ++ {0x7f,0x01,0x12,0x32,0x98,0xe4,0xf5,0x32,0x85,0x32,0xb1,0x75,0xb6,0x40,0xc2,0x08}}, ++ { ++ 16, ++ 0x3297, ++ 0, ++ {0x22,0x7e,0x00,0x12,0x14,0xb8,0x53,0x30,0xfd,0x85,0x30,0xa0,0x22,0xe4,0xff,0x12}}, ++ { ++ 4, ++ 0x32a7, ++ 0, ++ {0x30,0xc2,0xe4,0x22}}, ++ { ++ 16, ++ 0x32ab, ++ 0, ++ {0x90,0x40,0x12,0xe4,0xf0,0xa3,0x04,0xf0,0x90,0x18,0x75,0xe0,0x14,0x90,0x40,0x18}}, ++ { ++ 16, ++ 0x32bb, ++ 0, ++ {0xf0,0x90,0x40,0x1e,0x74,0x3f,0xf0,0x90,0x40,0x11,0x74,0x3d,0xf0,0x90,0x40,0x10}}, ++ { ++ 6, ++ 0x32cb, ++ 0, ++ {0x74,0x3f,0xf0,0xd2,0x04,0x22}}, ++ { ++ 9, ++ 0x14d7, ++ 0, ++ {0xe4,0xf5,0x29,0x12,0x0a,0xa4,0xc2,0x0b,0x22}}, ++ { ++ 16, ++ 0x32d1, ++ 0, ++ {0x30,0x01,0x66,0x20,0x06,0x28,0x90,0x7f,0xb4,0xe0,0x20,0xe3,0x05,0xd2,0x06,0xe4}}, ++ { ++ 16, ++ 0x32e1, ++ 0, ++ {0xf5,0x09,0xe5,0x3c,0x15,0x3c,0x70,0x02,0x15,0x3b,0xe5,0x3c,0x45,0x3b,0x60,0x02}}, ++ { ++ 16, ++ 0x32f1, ++ 0, ++ {0x61,0xd4,0x90,0x7f,0xb4,0xe0,0x44,0x03,0xf0,0xc2,0x01,0xc2,0x06,0x22,0xd2,0x1b}}, ++ { ++ 16, ++ 0x3301, ++ 0, ++ {0xe4,0xfd,0xaf,0x09,0x12,0x30,0x2e,0x05,0x09,0x05,0x09,0xe5,0x09,0xc3,0x95,0x2a}}, ++ { ++ 16, ++ 0x3311, ++ 0, ++ {0x50,0x02,0x61,0xd4,0x90,0x7f,0xb4,0xe0,0x44,0x02,0xf0,0xc2,0x06,0xc2,0x01,0xe5}}, ++ { ++ 16, ++ 0x3321, ++ 0, ++ {0x2a,0x64,0x10,0x60,0x02,0x61,0xd4,0xc2,0x1b,0x0d,0xff,0x12,0x30,0x2e,0x75,0x34}}, ++ { ++ 16, ++ 0x3331, ++ 0, ++ {0x14,0xd2,0x00,0xc2,0x12,0xe4,0xf5,0x08,0x22,0x20,0x00,0x02,0x61,0xd4,0x20,0x12}}, ++ { ++ 16, ++ 0x3341, ++ 0, ++ {0x02,0x61,0xd4,0xe5,0x08,0x70,0x3e,0x7d,0xdf,0x7f,0x7f,0x12,0x30,0xc2,0x7b,0x00}}, ++ { ++ 16, ++ 0x3351, ++ 0, ++ {0x7a,0x00,0x79,0x6b,0xe4,0xff,0x12,0x30,0x76,0xe5,0x6b,0x70,0x04,0xe5,0x6c,0x60}}, ++ { ++ 16, ++ 0x3361, ++ 0, ++ {0x18,0x90,0x7f,0xbc,0xe0,0x20,0xe1,0x11,0x75,0x08,0x01,0x75,0x2a,0x10,0x7d,0xd7}}, ++ { ++ 16, ++ 0x3371, ++ 0, ++ {0x7f,0x7f,0x12,0x30,0xc2,0xe4,0xf5,0x09,0x22,0xd5,0x34,0x06,0x75,0x08,0x01,0xd2}}, ++ { ++ 16, ++ 0x3381, ++ 0, ++ {0x12,0x22,0xc2,0x12,0x22,0xe5,0x34,0x60,0x0e,0xe5,0x09,0x12,0x0a,0xae,0x12,0x30}}, ++ { ++ 16, ++ 0x3391, ++ 0, ++ {0x76,0x05,0x09,0x05,0x09,0x80,0x1b,0xe4,0xf5,0x6d,0xe5,0x6d,0xc3,0x95,0x2a,0x50}}, ++ { ++ 16, ++ 0x33a1, ++ 0, ++ {0x11,0x74,0x0a,0x25,0x6d,0xf5,0x82,0xe4,0x34,0x7d,0xf5,0x83,0xe4,0xf0,0x05,0x6d}}, ++ { ++ 16, ++ 0x33b1, ++ 0, ++ {0x80,0xe8,0xe5,0x09,0xc3,0x95,0x2a,0x50,0x04,0xe5,0x34,0x70,0x16,0x12,0x0a,0x02}}, ++ { ++ 16, ++ 0x33c1, ++ 0, ++ {0x74,0x1c,0xf0,0xc2,0x1b,0xe4,0xfd,0xff,0x12,0x30,0x2e,0x75,0x34,0x14,0xc2,0x00}}, ++ { ++ 4, ++ 0x33d1, ++ 0, ++ {0xe4,0xf5,0x08,0x22}}, ++ { ++ 16, ++ 0x33d5, ++ 0, ++ {0xe5,0x38,0x30,0xe1,0x0d,0xe5,0x39,0x30,0xe1,0x05,0x12,0x0a,0x4e,0x80,0x03,0x12}}, ++ { ++ 16, ++ 0x33e5, ++ 0, ++ {0x0a,0x47,0xe5,0x38,0x30,0xe0,0x10,0xe5,0x39,0x30,0xe0,0x08,0x53,0x31,0xfe,0x85}}, ++ { ++ 16, ++ 0x33f5, ++ 0, ++ {0x31,0xb0,0x80,0x03,0x12,0x0a,0x9d,0xe5,0x38,0x30,0xe2,0x0f,0xe5,0x39,0x30,0xe2}}, ++ { ++ 16, ++ 0x3405, ++ 0, ++ {0x05,0x12,0x0a,0xd6,0x80,0x24,0x12,0x0a,0xfd,0x80,0x1f,0x90,0x18,0x0a,0xe0,0x30}}, ++ { ++ 16, ++ 0x3415, ++ 0, ++ {0xe4,0x0d,0x30,0x08,0x05,0x12,0x0a,0x4e,0x80,0x10,0x12,0x0a,0x47,0x80,0x0b,0x30}}, ++ { ++ 16, ++ 0x3425, ++ 0, ++ {0x08,0x05,0x12,0x0a,0xd6,0x80,0x03,0x12,0x0a,0xfd,0xe5,0x38,0x30,0xe3,0x18,0x12}}, ++ { ++ 16, ++ 0x3435, ++ 0, ++ {0x0b,0x04,0xe5,0x39,0x30,0xe3,0x08,0x53,0x31,0xf7,0x85,0x31,0xb0,0x80,0x0b,0x43}}, ++ { ++ 16, ++ 0x3445, ++ 0, ++ {0x31,0x08,0x85,0x31,0xb0,0x80,0x03,0x12,0x0b,0x04,0xe5,0x38,0x30,0xe4,0x16,0x12}}, ++ { ++ 16, ++ 0x3455, ++ 0, ++ {0x0b,0x0b,0xe5,0x39,0x30,0xe4,0x07,0x53,0x31,0xef,0x85,0x31,0xb0,0x22,0x43,0x31}}, ++ { ++ 9, ++ 0x3465, ++ 0, ++ {0x10,0x85,0x31,0xb0,0x22,0x12,0x0b,0x0b,0x22}}, ++ { ++ 16, ++ 0x346e, ++ 0, ++ {0xe5,0x35,0x70,0x68,0xe5,0x38,0x20,0xe1,0x2b,0x30,0x09,0x19,0xe5,0x2c,0xd3,0x94}}, ++ { ++ 16, ++ 0x347e, ++ 0, ++ {0x80,0x40,0x12,0xc2,0x09,0xe5,0x31,0x20,0xe1,0x05,0x12,0x0a,0x47,0x80,0x03,0x12}}, ++ { ++ 16, ++ 0x348e, ++ 0, ++ {0x0a,0x4e,0xe4,0xf5,0x2c,0x05,0x2c,0xe5,0x2c,0xd3,0x94,0x82,0x40,0x06,0x12,0x0a}}, ++ { ++ 16, ++ 0x349e, ++ 0, ++ {0x47,0xe4,0xf5,0x2c,0xe5,0x38,0x30,0xe0,0x02,0xa1,0x9c,0x30,0x0a,0x1c,0xe5,0x2b}}, ++ { ++ 16, ++ 0x34ae, ++ 0, ++ {0xd3,0x94,0x80,0x40,0x15,0xc2,0x0a,0xe5,0x31,0x20,0xe0,0x05,0x12,0x0a,0x9d,0x80}}, ++ { ++ 16, ++ 0x34be, ++ 0, ++ {0x06,0x53,0x31,0xfe,0x85,0x31,0xb0,0xe4,0xf5,0x2b,0x05,0x2b,0xe5,0x2b,0xd3,0x94}}, ++ { ++ 16, ++ 0x34ce, ++ 0, ++ {0x82,0x50,0x02,0xa1,0x9c,0x12,0x0a,0x9d,0xe4,0xf5,0x2b,0x22,0x90,0x18,0x0a,0xe0}}, ++ { ++ 16, ++ 0x34de, ++ 0, ++ {0x30,0xe4,0x5f,0xe5,0x38,0x30,0xe1,0x02,0xa1,0x9c,0x30,0x09,0x07,0xe5,0x2c,0xd3}}, ++ { ++ 16, ++ 0x34ee, ++ 0, ++ {0x94,0x80,0x50,0x0a,0x30,0x0a,0x32,0xe5,0x2b,0xd3,0x94,0x80,0x40,0x2b,0x30,0x09}}, ++ { ++ 16, ++ 0x34fe, ++ 0, ++ {0x02,0xc2,0x09,0x30,0x0a,0x02,0xc2,0x0a,0xe5,0x31,0x20,0xe1,0x05,0x12,0x0a,0x47}}, ++ { ++ 16, ++ 0x350e, ++ 0, ++ {0x80,0x03,0x12,0x0a,0x4e,0xe5,0x2c,0xd3,0x94,0x80,0x40,0x03,0xe4,0xf5,0x2c,0xe5}}, ++ { ++ 16, ++ 0x351e, ++ 0, ++ {0x2b,0xd3,0x94,0x80,0x40,0x03,0xe4,0xf5,0x2b,0x12,0x0b,0x12,0x40,0x06,0x12,0x0a}}, ++ { ++ 16, ++ 0x352e, ++ 0, ++ {0x4e,0xe4,0xf5,0x2c,0xe5,0x2b,0xd3,0x94,0x82,0x40,0x63,0x12,0x0a,0x4e,0xe4,0xf5}}, ++ { ++ 16, ++ 0x353e, ++ 0, ++ {0x2b,0x22,0xe5,0x38,0x20,0xe1,0x57,0x30,0x09,0x07,0xe5,0x2c,0xd3,0x94,0x80,0x50}}, ++ { ++ 16, ++ 0x354e, ++ 0, ++ {0x0a,0x30,0x0a,0x32,0xe5,0x2b,0xd3,0x94,0x80,0x40,0x2b,0x30,0x09,0x02,0xc2,0x09}}, ++ { ++ 16, ++ 0x355e, ++ 0, ++ {0x30,0x0a,0x02,0xc2,0x0a,0xe5,0x31,0x20,0xe1,0x05,0x12,0x0a,0x47,0x80,0x03,0x12}}, ++ { ++ 16, ++ 0x356e, ++ 0, ++ {0x0a,0x4e,0xe5,0x2c,0xd3,0x94,0x80,0x40,0x03,0xe4,0xf5,0x2c,0xe5,0x2b,0xd3,0x94}}, ++ { ++ 16, ++ 0x357e, ++ 0, ++ {0x80,0x40,0x03,0xe4,0xf5,0x2b,0x12,0x0b,0x12,0x40,0x06,0x12,0x0a,0x47,0xe4,0xf5}}, ++ { ++ 15, ++ 0x358e, ++ 0, ++ {0x2c,0xe5,0x2b,0xd3,0x94,0x82,0x40,0x06,0x12,0x0a,0x47,0xe4,0xf5,0x2b,0x22}}, ++ { ++ 16, ++ 0x359d, ++ 0, ++ {0x90,0x7f,0xd6,0xe0,0x44,0x04,0x12,0x35,0xd5,0x44,0x08,0xf0,0x30,0x21,0x04,0xe0}}, ++ { ++ 16, ++ 0x35ad, ++ 0, ++ {0x44,0x02,0xf0,0xaf,0x71,0xae,0x70,0x12,0x14,0xb8,0x90,0x7f,0xab,0x74,0xff,0xf0}}, ++ { ++ 16, ++ 0x35bd, ++ 0, ++ {0x90,0x7f,0xa9,0xf0,0x90,0x7f,0xaa,0xf0,0x53,0x91,0xef,0x90,0x7f,0xd6,0xe0,0x54}}, ++ { ++ 16, ++ 0x35cd, ++ 0, ++ {0xf7,0x12,0x35,0xd5,0x44,0x04,0xf0,0x22,0xf0,0x7f,0x0a,0x7e,0x00,0x12,0x14,0xb8}}, ++ { ++ 5, ++ 0x35dd, ++ 0, ++ {0x90,0x7f,0xd6,0xe0,0x22}}, ++ { ++ 16, ++ 0x35e2, ++ 0, ++ {0x90,0x18,0x56,0x74,0x1e,0xf0,0xa3,0x74,0x03,0xf0,0x90,0x18,0x70,0x74,0x01,0xf0}}, ++ { ++ 16, ++ 0x35f2, ++ 0, ++ {0xe4,0xa3,0xf0,0xa3,0x04,0xf0,0xe4,0xa3,0xf0,0x90,0x18,0x0a,0xe0,0x30,0xe3,0x04}}, ++ { ++ 16, ++ 0x3602, ++ 0, ++ {0x7e,0x45,0x80,0x02,0x7e,0x09,0xe4,0xfd,0xed,0x2e,0xfc,0x24,0x02,0xf5,0x82,0xe4}}, ++ { ++ 16, ++ 0x3612, ++ 0, ++ {0x34,0x18,0xf5,0x83,0xe0,0xfb,0xc4,0x54,0x0f,0xfb,0xc3,0x94,0x0a,0x50,0x06,0xeb}}, ++ { ++ 16, ++ 0x3622, ++ 0, ++ {0x24,0x30,0xff,0x80,0x04,0xeb,0x24,0x37,0xff,0xed,0x25,0xe0,0x25,0xe0,0x24,0x58}}, ++ { ++ 16, ++ 0x3632, ++ 0, ++ {0xf5,0x82,0xe4,0x34,0x18,0x12,0x0b,0x1c,0x24,0x59,0xf5,0x82,0xe4,0x34,0x18,0xf5}}, ++ { ++ 16, ++ 0x3642, ++ 0, ++ {0x83,0xe4,0xf0,0x74,0x02,0x2c,0xf5,0x82,0xe4,0x34,0x18,0xf5,0x83,0xe0,0x54,0x0f}}, ++ { ++ 16, ++ 0x3652, ++ 0, ++ {0xfb,0xc3,0x94,0x0a,0x50,0x06,0xeb,0x24,0x30,0xff,0x80,0x04,0xeb,0x24,0x37,0xff}}, ++ { ++ 16, ++ 0x3662, ++ 0, ++ {0xed,0x25,0xe0,0x25,0xe0,0x24,0x5a,0xf5,0x82,0xe4,0x34,0x18,0x12,0x0b,0x1c,0x24}}, ++ { ++ 16, ++ 0x3672, ++ 0, ++ {0x5b,0xf5,0x82,0xe4,0x34,0x18,0xf5,0x83,0xe4,0xf0,0x0d,0xed,0x64,0x06,0x70,0x88}}, ++ { ++ 1, ++ 0x3682, ++ 0, ++ {0x22}}, ++ { ++ 16, ++ 0x3683, ++ 0, ++ {0x8e,0x4f,0x8f,0x50,0x8d,0x51,0x8a,0x52,0x8b,0x53,0xe4,0xfd,0xf5,0x54,0xe5,0x14}}, ++ { ++ 16, ++ 0x3693, ++ 0, ++ {0x60,0x12,0xe5,0x4f,0xff,0x7e,0x00,0x0d,0xee,0x24,0x80,0xf5,0x82,0xe4,0x34,0x18}}, ++ { ++ 16, ++ 0x36a3, ++ 0, ++ {0xf5,0x83,0xef,0xf0,0xe5,0x50,0xae,0x05,0x0d,0x74,0x80,0x2e,0xf5,0x82,0xe4,0x34}}, ++ { ++ 16, ++ 0x36b3, ++ 0, ++ {0x18,0xf5,0x83,0xe5,0x50,0xf0,0x7a,0x18,0x7b,0x80,0xaf,0x15,0x12,0x14,0x9c,0xab}}, ++ { ++ 10, ++ 0x36c3, ++ 0, ++ {0x53,0xaa,0x52,0xad,0x51,0xaf,0x15,0x02,0x14,0x80}}, ++ { ++ 16, ++ 0x36cd, ++ 0, ++ {0xab,0x07,0xaa,0x06,0xac,0x05,0xe4,0xfd,0xe5,0x14,0x60,0x0c,0xea,0x7e,0x00,0x0d}}, ++ { ++ 16, ++ 0x36dd, ++ 0, ++ {0xee,0x24,0x7d,0x12,0x0a,0xea,0xea,0xf0,0xeb,0xae,0x05,0x0d,0x74,0x7d,0x2e,0x12}}, ++ { ++ 16, ++ 0x36ed, ++ 0, ++ {0x0a,0xea,0xeb,0xf0,0xaf,0x05,0x0d,0x74,0x7d,0x2f,0x12,0x0a,0xea,0xec,0xf0,0x7a}}, ++ { ++ 13, ++ 0x36fd, ++ 0, ++ {0x18,0x7b,0x7d,0xaf,0x15,0x12,0x14,0x9c,0xaf,0x15,0x02,0x12,0xd4}}, ++ { ++ 16, ++ 0x370a, ++ 0, ++ {0x8e,0x55,0x8f,0x56,0x8d,0x57,0x8a,0x58,0x8b,0x59,0xe4,0xf5,0x5a,0xe5,0x5a,0xc3}}, ++ { ++ 16, ++ 0x371a, ++ 0, ++ {0x95,0x57,0x50,0x20,0x05,0x56,0xe5,0x56,0xae,0x55,0x70,0x02,0x05,0x55,0x14,0xff}}, ++ { ++ 16, ++ 0x372a, ++ 0, ++ {0xe5,0x59,0x25,0x5a,0xf5,0x82,0xe4,0x35,0x58,0xf5,0x83,0xe0,0xfd,0x12,0x36,0xcd}}, ++ { ++ 5, ++ 0x373a, ++ 0, ++ {0x05,0x5a,0x80,0xd9,0x22}}, ++ { ++ 16, ++ 0x1145, ++ 0, ++ {0x90,0x7f,0xbc,0xe0,0x20,0xe1,0x48,0x7d,0xcd,0x7f,0x7f,0x12,0x30,0xc2,0x12,0x0a}}, ++ { ++ 16, ++ 0x1155, ++ 0, ++ {0xb1,0x7f,0x0a,0x12,0x30,0x76,0x90,0x7d,0x0a,0xe0,0x70,0x04,0xa3,0xe0,0x60,0x2d}}, ++ { ++ 16, ++ 0x1165, ++ 0, ++ {0xc2,0x07,0x90,0x7d,0x00,0x74,0x08,0xf0,0xa3,0x74,0x01,0xf0,0xe4,0xa3,0xf0,0xa3}}, ++ { ++ 16, ++ 0x1175, ++ 0, ++ {0xf0,0xa3,0xf0,0xa3,0xf0,0xa3,0x74,0x06,0xf0,0xe4,0xa3,0xf0,0xa3,0x04,0xf0,0xe4}}, ++ { ++ 16, ++ 0x1185, ++ 0, ++ {0xa3,0xf0,0x90,0x7d,0x0c,0x74,0x06,0x12,0x0a,0x28,0x74,0x0e,0xf0,0xd3,0x22,0xc3}}, ++ { ++ 1, ++ 0x1195, ++ 0, ++ {0x22}}, ++ { ++ 16, ++ 0x373f, ++ 0, ++ {0x90,0x7f,0xbc,0xe0,0x20,0xe1,0x4f,0xc2,0x12,0x7d,0xdf,0x7f,0x7f,0x12,0x30,0xc2}}, ++ { ++ 16, ++ 0x374f, ++ 0, ++ {0x12,0x0a,0xb1,0xe4,0xff,0x12,0x30,0x76,0x90,0x7d,0x00,0xe0,0x70,0x04,0xa3,0xe0}}, ++ { ++ 16, ++ 0x375f, ++ 0, ++ {0x60,0x32,0x7d,0xd7,0x7f,0x7f,0x12,0x30,0xc2,0xe4,0xf5,0x77,0xe5,0x77,0x12,0x0a}}, ++ { ++ 16, ++ 0x376f, ++ 0, ++ {0xae,0x12,0x30,0x76,0x05,0x77,0x05,0x77,0xe5,0x77,0xc3,0x94,0x10,0x40,0xed,0x7d}}, ++ { ++ 16, ++ 0x377f, ++ 0, ++ {0xdf,0x7f,0x7f,0x12,0x30,0xc2,0xc2,0x1b,0xe4,0xfd,0xff,0x12,0x30,0x2e,0x12,0x0a}}, ++ { ++ 8, ++ 0x378f, ++ 0, ++ {0x02,0x74,0x1c,0xf0,0xd3,0x22,0xc3,0x22}}, ++ { ++ 16, ++ 0x3797, ++ 0, ++ {0xd2,0x12,0x53,0x30,0xdf,0x85,0x30,0xa0,0xd2,0x0d,0x20,0x0e,0x21,0x30,0x13,0x05}}, ++ { ++ 16, ++ 0x37a7, ++ 0, ++ {0x12,0x08,0x00,0xc2,0x13,0x12,0x12,0x99,0x30,0x14,0x0e,0x90,0x18,0x76,0xe0,0x70}}, ++ { ++ 15, ++ 0x37b7, ++ 0, ++ {0x08,0x12,0x3a,0x6b,0x50,0x03,0x12,0x3a,0x51,0x12,0x37,0x3f,0x80,0xdc,0x22}}, ++ { ++ 16, ++ 0x3800, ++ 0, ++ {0xc2,0x22,0xc2,0x07,0xe4,0xf5,0x63,0xf5,0x64,0xc2,0x1a,0xc2,0x22,0xc2,0x19,0x43}}, ++ { ++ 16, ++ 0x3810, ++ 0, ++ {0x30,0x20,0x85,0x30,0xa0,0x12,0x0a,0x55,0x12,0x3a,0x02,0x90,0x18,0x53,0x74,0x03}}, ++ { ++ 16, ++ 0x3820, ++ 0, ++ {0xf0,0xe4,0x78,0x80,0xf6,0x30,0x0e,0x02,0x21,0xf4,0x30,0x13,0x1b,0xc2,0x13,0x12}}, ++ { ++ 16, ++ 0x3830, ++ 0, ++ {0x0a,0x8b,0x12,0x08,0x00,0x12,0x0a,0x55,0x20,0x18,0x05,0x12,0x09,0xec,0x80,0x06}}, ++ { ++ 16, ++ 0x3840, ++ 0, ++ {0x43,0x62,0x10,0x12,0x09,0xef,0xd2,0x22,0x12,0x12,0x99,0x30,0x14,0x0e,0x90,0x18}}, ++ { ++ 16, ++ 0x3850, ++ 0, ++ {0x76,0xe0,0x70,0x08,0x12,0x3a,0x6b,0x50,0x03,0x12,0x3a,0x51,0x20,0x0e,0xc6,0x90}}, ++ { ++ 16, ++ 0x3860, ++ 0, ++ {0x7f,0xcc,0xe0,0x30,0xe1,0x02,0x21,0xd4,0xa3,0xe0,0xfb,0x90,0x7c,0xc0,0xe0,0x64}}, ++ { ++ 16, ++ 0x3870, ++ 0, ++ {0xcd,0x60,0x02,0x01,0xfd,0xa3,0xe0,0x64,0xab,0x60,0x02,0x01,0xfd,0x78,0x80,0x76}}, ++ { ++ 16, ++ 0x3880, ++ 0, ++ {0x01,0xd2,0x1a,0x90,0x7c,0xc7,0xe0,0xff,0x90,0x7c,0xc6,0xe0,0xfd,0x12,0x30,0xc2}}, ++ { ++ 16, ++ 0x3890, ++ 0, ++ {0x90,0x7c,0xc9,0xe0,0xff,0x90,0x7c,0xc8,0xe0,0xfd,0xc2,0x1b,0x12,0x30,0x2e,0x90}}, ++ { ++ 16, ++ 0x38a0, ++ 0, ++ {0x7c,0xca,0xe0,0x24,0xff,0x92,0x19,0x90,0x7c,0xc3,0xe0,0xfe,0x90,0x7c,0xc2,0xe0}}, ++ { ++ 16, ++ 0x38b0, ++ 0, ++ {0xfd,0xee,0xf5,0x41,0xed,0xf5,0x42,0xa3,0xe0,0xff,0x90,0x7c,0xc2,0xe0,0xfd,0x12}}, ++ { ++ 16, ++ 0x38c0, ++ 0, ++ {0x30,0xc2,0x90,0x7c,0xc3,0xe0,0x70,0x0a,0x90,0x7c,0xc2,0xe0,0x70,0x04,0xd2,0x12}}, ++ { ++ 16, ++ 0x38d0, ++ 0, ++ {0xf5,0x36,0x90,0x7c,0xc5,0xe0,0xfe,0x90,0x7c,0xc4,0xe0,0xfd,0xee,0xf5,0x63,0xed}}, ++ { ++ 16, ++ 0x38e0, ++ 0, ++ {0xf5,0x64,0xe5,0x41,0x30,0xe6,0x07,0x12,0x09,0xec,0xc2,0x18,0x80,0x08,0x43,0x62}}, ++ { ++ 16, ++ 0x38f0, ++ 0, ++ {0x10,0x12,0x09,0xef,0xd2,0x18,0xe4,0x90,0x7f,0xcd,0xf0,0x21,0xd4,0xeb,0xd3,0x94}}, ++ { ++ 16, ++ 0x3900, ++ 0, ++ {0x00,0x50,0x02,0x21,0xd4,0xe4,0xfa,0x30,0x22,0x05,0x12,0x3a,0x1d,0xc2,0x22,0x90}}, ++ { ++ 16, ++ 0x3910, ++ 0, ++ {0x78,0x51,0x74,0x78,0xf0,0x90,0x78,0x52,0x74,0x58,0xf0,0x90,0x78,0x4f,0x74,0x7c}}, ++ { ++ 16, ++ 0x3920, ++ 0, ++ {0xf0,0x90,0x78,0x50,0x74,0xc0,0xf0,0x30,0x18,0x19,0xbb,0x40,0x08,0x90,0x78,0x54}}, ++ { ++ 16, ++ 0x3930, ++ 0, ++ {0x74,0x3f,0xf0,0x80,0x05,0x90,0x78,0x54,0xeb,0xf0,0xeb,0x75,0xf0,0x03,0x84,0xf5}}, ++ { ++ 16, ++ 0x3940, ++ 0, ++ {0x61,0x80,0x0a,0xeb,0xc3,0x13,0xf5,0x61,0x90,0x78,0x54,0xeb,0xf0,0x12,0x0a,0x6e}}, ++ { ++ 16, ++ 0x3950, ++ 0, ++ {0xeb,0xff,0xc3,0xe5,0x64,0x9f,0xf5,0x64,0xe5,0x63,0x94,0x00,0xf5,0x63,0xe5,0x61}}, ++ { ++ 16, ++ 0x3960, ++ 0, ++ {0x25,0x42,0xf5,0x42,0xe4,0x35,0x41,0xf5,0x41,0x90,0x78,0x55,0xe0,0x60,0xfa,0x30}}, ++ { ++ 16, ++ 0x3970, ++ 0, ++ {0xb5,0x2f,0xea,0xc3,0x94,0x05,0x50,0x29,0x53,0x62,0xf7,0x90,0x40,0x00,0xe5,0x62}}, ++ { ++ 16, ++ 0x3980, ++ 0, ++ {0xf0,0x0a,0x12,0x0a,0x5b,0xc3,0xe5,0x42,0x95,0x61,0xf5,0x42,0xe5,0x41,0x94,0x00}}, ++ { ++ 16, ++ 0x3990, ++ 0, ++ {0xf5,0x41,0xeb,0x25,0x64,0xf5,0x64,0xe4,0x35,0x63,0xf5,0x63,0x12,0x3a,0x1d,0x21}}, ++ { ++ 16, ++ 0x39a0, ++ 0, ++ {0x0f,0xe4,0x90,0x7f,0xcd,0xf0,0x30,0x19,0x2b,0xe5,0x64,0x45,0x63,0x70,0x25,0xe5}}, ++ { ++ 16, ++ 0x39b0, ++ 0, ++ {0x61,0x65,0x42,0x70,0x02,0xe5,0x41,0x60,0x13,0x7d,0xcd,0x7f,0x7f,0x12,0x30,0xc2}}, ++ { ++ 16, ++ 0x39c0, ++ 0, ++ {0xc2,0x1b,0xe4,0xfd,0xff,0x12,0x30,0x2e,0xd2,0x22,0x80,0x02,0xd2,0x0d,0xd2,0x07}}, ++ { ++ 16, ++ 0x39d0, ++ 0, ++ {0xe4,0x78,0x80,0xf6,0x20,0x1a,0x02,0x01,0x25,0x78,0x80,0xe6,0x60,0x02,0x01,0x25}}, ++ { ++ 16, ++ 0x39e0, ++ 0, ++ {0x30,0x07,0x05,0x12,0x11,0x45,0xd2,0x22,0x20,0x19,0x02,0x01,0x25,0x12,0x37,0x3f}}, ++ { ++ 2, ++ 0x39f0, ++ 0, ++ {0xd2,0x22}}, ++ { ++ 16, ++ 0x39f2, ++ 0, ++ {0x01,0x25,0x12,0x0a,0x8b,0xe4,0x12,0x3a,0x02,0x90,0x18,0x53,0x74,0x09,0xf0,0x22}}, ++ { ++ 16, ++ 0x3a02, ++ 0, ++ {0xff,0x12,0x30,0x00,0x90,0x18,0x77,0xe0,0x44,0x40,0xff,0x90,0x18,0x78,0xe0,0xfd}}, ++ { ++ 16, ++ 0x3a12, ++ 0, ++ {0x12,0x30,0xc2,0xc2,0x1b,0xe4,0xfd,0xff,0x02,0x30,0x2e,0xe5,0x41,0xff,0xe5,0x42}}, ++ { ++ 4, ++ 0x3a22, ++ 0, ++ {0xfd,0x02,0x30,0xc2}}, ++ { ++ 16, ++ 0x3a26, ++ 0, ++ {0x90,0x40,0x2d,0xe4,0xf0,0xc2,0x10,0x12,0x04,0xe8,0xe5,0x38,0x20,0xe1,0x0f,0x90}}, ++ { ++ 16, ++ 0x3a36, ++ 0, ++ {0x18,0x0a,0xe0,0x30,0xe4,0x05,0x12,0x0a,0x4e,0x80,0x03,0x12,0x0a,0x47,0xe5,0x38}}, ++ { ++ 11, ++ 0x3a46, ++ 0, ++ {0x20,0xe0,0x07,0xe5,0x35,0x70,0x03,0x12,0x0a,0x9d,0x22}}, ++ { ++ 16, ++ 0x3a51, ++ 0, ++ {0xc2,0xaa,0xc2,0x14,0x12,0x14,0x41,0x20,0x15,0x07,0x90,0x7f,0xd6,0xe0,0x20,0xe7}}, ++ { ++ 10, ++ 0x3a61, ++ 0, ++ {0xf3,0x12,0x14,0x62,0x12,0x3b,0x0c,0x02,0x14,0xca}}, ++ { ++ 16, ++ 0x3a6b, ++ 0, ++ {0xe4,0xff,0x12,0x30,0x00,0x12,0x0a,0xdd,0x12,0x30,0xc2,0xc2,0x1b,0x7d,0xad,0x7f}}, ++ { ++ 16, ++ 0x3a7b, ++ 0, ++ {0xde,0x12,0x30,0x2e,0x90,0x18,0x54,0xe0,0x60,0x1c,0x7d,0x69,0x7f,0x7f,0x12,0x30}}, ++ { ++ 16, ++ 0x3a8b, ++ 0, ++ {0xc2,0xc2,0x1b,0x7d,0x3c,0x7f,0x30,0x12,0x30,0x2e,0x7d,0x68,0x12,0x3a,0xfe,0x7d}}, ++ { ++ 16, ++ 0x3a9b, ++ 0, ++ {0x2b,0x12,0x3a,0xfe,0x80,0x25,0x12,0x3a,0xf4,0x7d,0x34,0x12,0x3a,0xe5,0x7d,0xff}}, ++ { ++ 16, ++ 0x3aab, ++ 0, ++ {0x7f,0x0f,0x12,0x3a,0xd2,0x7f,0x0a,0x7e,0x00,0x12,0x14,0xb8,0x12,0x3a,0xf4,0x7d}}, ++ { ++ 16, ++ 0x3abb, ++ 0, ++ {0x3c,0x12,0x3a,0xe5,0x7d,0x01,0xe4,0xff,0x12,0x3a,0xd2,0x7f,0x64,0x7e,0x00,0x12}}, ++ { ++ 16, ++ 0x3acb, ++ 0, ++ {0x14,0xb8,0x12,0x31,0xb7,0xd3,0x22,0x12,0x30,0x2e,0x7d,0xf6,0x7f,0x7e,0x12,0x30}}, ++ { ++ 16, ++ 0x3adb, ++ 0, ++ {0xc2,0xc2,0x1b,0x7d,0x01,0xe4,0xff,0x02,0x30,0x2e,0x7f,0x30,0x12,0x30,0x2e,0x7d}}, ++ { ++ 16, ++ 0x3aeb, ++ 0, ++ {0x2f,0x7f,0x7f,0x12,0x30,0xc2,0xc2,0x1b,0x22,0x7d,0x30,0x7f,0x7f,0x12,0x30,0xc2}}, ++ { ++ 16, ++ 0x3afb, ++ 0, ++ {0xc2,0x1b,0x22,0x7f,0x7f,0x12,0x30,0xc2,0xc2,0x1b,0x7d,0x01,0xe4,0xff,0x02,0x30}}, ++ { ++ 1, ++ 0x3b0b, ++ 0, ++ {0x2e}}, ++ { ++ 16, ++ 0x3b0c, ++ 0, ++ {0x12,0x0d,0x16,0x12,0x10,0x46,0x90,0x18,0x0a,0xe0,0x30,0xe4,0x03,0x12,0x0a,0xd6}}, ++ { ++ 16, ++ 0x3b1c, ++ 0, ++ {0xe4,0xff,0x12,0x30,0x00,0x12,0x0a,0xdd,0x12,0x30,0xc2,0xc2,0x1b,0xe4,0xfd,0xff}}, ++ { ++ 5, ++ 0x3b2c, ++ 0, ++ {0x12,0x30,0x2e,0xd3,0x22}}, ++ { ++ 16, ++ 0x3b31, ++ 0, ++ {0x75,0xc8,0x01,0xe5,0x3a,0x70,0x4c,0x30,0x17,0x14,0x75,0x12,0x60,0x75,0x13,0x01}}, ++ { ++ 16, ++ 0x3b41, ++ 0, ++ {0x75,0x0e,0xfa,0x75,0x0f,0x23,0x75,0x10,0x40,0x75,0x11,0x01,0x80,0x11,0x75,0x12}}, ++ { ++ 16, ++ 0x3b51, ++ 0, ++ {0xb0,0xe4,0xf5,0x13,0x75,0x0e,0xfd,0x75,0x0f,0x11,0x75,0x10,0xa0,0xf5,0x11,0xc2}}, ++ { ++ 16, ++ 0x3b61, ++ 0, ++ {0x0c,0x90,0x7f,0xdd,0x74,0x01,0xf0,0x90,0x7f,0xde,0x74,0x04,0xf0,0xe4,0x90,0x7f}}, ++ { ++ 16, ++ 0x3b71, ++ 0, ++ {0xe0,0xf0,0x90,0x7f,0xe1,0xf0,0x90,0x7f,0xa1,0x04,0xf0,0x90,0x18,0x75,0x74,0x40}}, ++ { ++ 16, ++ 0x3b81, ++ 0, ++ {0xf0,0x81,0x3b,0x30,0x17,0x08,0x75,0x12,0xd5,0x75,0x13,0xd1,0x80,0x06,0x75,0x12}}, ++ { ++ 16, ++ 0x3b91, ++ 0, ++ {0xea,0x75,0x13,0xe8,0xd2,0x0c,0xe4,0x90,0x7f,0xdd,0xf0,0x90,0x7f,0xde,0xf0,0x90}}, ++ { ++ 16, ++ 0x3ba1, ++ 0, ++ {0x7f,0xdf,0xf0,0x90,0x7f,0xdd,0xe0,0x54,0x7f,0xf0,0xe4,0x90,0x7f,0xf8,0xf0,0x90}}, ++ { ++ 16, ++ 0x3bb1, ++ 0, ++ {0x7f,0xe0,0x04,0xf0,0xe4,0x90,0x7f,0xe1,0xf0,0x90,0x7f,0xa1,0xe0,0x54,0xfe,0xf0}}, ++ { ++ 16, ++ 0x3bc1, ++ 0, ++ {0x90,0x18,0x75,0x74,0x35,0xf0,0xe5,0x3a,0x14,0xb4,0x08,0x00,0x50,0x56,0x90,0x3b}}, ++ { ++ 16, ++ 0x3bd1, ++ 0, ++ {0xd5,0x25,0xe0,0x73,0x61,0xe5,0x61,0xed,0x61,0xf5,0x61,0xfd,0x81,0x05,0x81,0x0d}}, ++ { ++ 16, ++ 0x3be1, ++ 0, ++ {0x81,0x15,0x81,0x1d,0x75,0x3d,0x00,0x75,0x3e,0x9f,0x80,0x3e,0x75,0x3d,0x01,0x75}}, ++ { ++ 16, ++ 0x3bf1, ++ 0, ++ {0x3e,0x09,0x80,0x36,0x75,0x3d,0x01,0x75,0x3e,0xa8,0x80,0x2e,0x75,0x3d,0x02,0x75}}, ++ { ++ 16, ++ 0x3c01, ++ 0, ++ {0x3e,0x12,0x80,0x26,0x75,0x3d,0x02,0x75,0x3e,0x7c,0x80,0x1e,0x75,0x3d,0x03,0x75}}, ++ { ++ 16, ++ 0x3c11, ++ 0, ++ {0x3e,0x1b,0x80,0x16,0x75,0x3d,0x03,0x75,0x3e,0x85,0x80,0x0e,0x75,0x3d,0x03,0x75}}, ++ { ++ 16, ++ 0x3c21, ++ 0, ++ {0x3e,0xef,0x80,0x06,0x75,0x3d,0x00,0x75,0x3e,0x9f,0xae,0x3d,0xaf,0x3e,0x7c,0x00}}, ++ { ++ 16, ++ 0x3c31, ++ 0, ++ {0x7d,0x35,0x12,0x0b,0x75,0x8f,0x25,0xe4,0xf5,0x26,0x12,0x32,0xab,0x12,0x14,0xd7}}, ++ { ++ 16, ++ 0x3c41, ++ 0, ++ {0x90,0x7f,0xdd,0xe0,0x44,0x1a,0xf0,0x90,0x7f,0xde,0xe0,0x44,0x11,0xf0,0x90,0x7f}}, ++ { ++ 15, ++ 0x3c51, ++ 0, ++ {0xdf,0xe0,0x44,0x15,0xf0,0xe4,0x90,0x7f,0xc9,0xf0,0x90,0x7f,0xcd,0xf0,0x22}}, ++ { ++ 16, ++ 0x3c60, ++ 0, ++ {0xe4,0xfe,0x30,0x10,0x20,0xee,0xc3,0x94,0x0a,0x50,0x1a,0xc2,0x10,0x0e,0xe4,0xff}}, ++ { ++ 16, ++ 0x3c70, ++ 0, ++ {0x20,0xb2,0xef,0x20,0xb1,0xec,0xef,0xc3,0x94,0x6a,0x50,0xe6,0x0f,0x90,0x40,0x08}}, ++ { ++ 8, ++ 0x3c80, ++ 0, ++ {0xe0,0xf5,0x78,0x80,0xeb,0xc2,0x10,0x22}}, ++ { ++ 16, ++ 0x3c88, ++ 0, ++ {0xe4,0xfd,0x90,0x18,0x55,0xe0,0xf9,0x64,0x01,0x60,0x04,0xe9,0xb4,0x04,0x1a,0x30}}, ++ { ++ 16, ++ 0x3c98, ++ 0, ++ {0x87,0x17,0x90,0x7f,0xb8,0xe0,0x20,0xe1,0x10,0x30,0x10,0x03,0x02,0x3c,0x60,0x90}}, ++ { ++ 16, ++ 0x3ca8, ++ 0, ++ {0x18,0x55,0x74,0x04,0xf0,0x12,0x06,0x32,0x22,0xe9,0xb4,0x04,0x13,0x30,0x87,0x07}}, ++ { ++ 16, ++ 0x3cb8, ++ 0, ++ {0x90,0x7f,0xb8,0xe0,0x30,0xe1,0x09,0xc2,0x0b,0x90,0x18,0x55,0x74,0x01,0xf0,0x22}}, ++ { ++ 16, ++ 0x3cc8, ++ 0, ++ {0xe9,0x64,0x01,0x70,0x1e,0x20,0x0b,0x1b,0x30,0x87,0x18,0x90,0x7f,0xb8,0xe0,0x30}}, ++ { ++ 16, ++ 0x3cd8, ++ 0, ++ {0xe1,0x11,0xd2,0x0b,0x75,0xc8,0x01,0x85,0x0f,0xcc,0x85,0x0e,0xcd,0x75,0xc8,0x05}}, ++ { ++ 16, ++ 0x3ce8, ++ 0, ++ {0xc2,0x04,0x22,0xe9,0x64,0x01,0x60,0x1c,0xe9,0x64,0x04,0x60,0x17,0x30,0x10,0x14}}, ++ { ++ 16, ++ 0x3cf8, ++ 0, ++ {0x12,0x3c,0x60,0xe4,0x12,0x0a,0xa4,0x75,0xc8,0x01,0x85,0x13,0xcc,0x85,0x12,0xcd}}, ++ { ++ 16, ++ 0x3d08, ++ 0, ++ {0x75,0xc8,0x05,0x22,0xe9,0xb4,0x01,0x0d,0x30,0x87,0x0a,0x30,0xcf,0x07,0x90,0x7f}}, ++ { ++ 16, ++ 0x3d18, ++ 0, ++ {0xb8,0xe0,0x20,0xe1,0x15,0xe9,0x64,0x02,0x70,0x5c,0x30,0x87,0x59,0xe5,0x29,0x64}}, ++ { ++ 16, ++ 0x3d28, ++ 0, ++ {0x20,0x60,0x53,0x90,0x7f,0xb8,0xe0,0x30,0xe1,0x4c,0xc2,0x0b,0x90,0x18,0x55,0x74}}, ++ { ++ 16, ++ 0x3d38, ++ 0, ++ {0x02,0xf0,0xe4,0xfd,0xc2,0x04,0x75,0xc8,0x01,0x12,0x0a,0x30,0x05,0x28,0x90,0x78}}, ++ { ++ 16, ++ 0x3d48, ++ 0, ++ {0x4f,0x74,0x78,0xf0,0x90,0x78,0x50,0x74,0x58,0xf0,0x90,0x78,0x51,0xe5,0x3f,0xf0}}, ++ { ++ 16, ++ 0x3d58, ++ 0, ++ {0x90,0x78,0x52,0xe5,0x40,0xf0,0x12,0x0a,0x68,0x0d,0x90,0x78,0x55,0xe0,0x60,0xfa}}, ++ { ++ 16, ++ 0x3d68, ++ 0, ++ {0xed,0xc3,0x94,0x08,0x50,0x10,0xe5,0x29,0x64,0x20,0x60,0x0a,0x30,0x87,0x07,0x90}}, ++ { ++ 16, ++ 0x3d78, ++ 0, ++ {0x7f,0xb8,0xe0,0x20,0xe1,0xc3,0x90,0x18,0x55,0xe0,0xff,0xb4,0x02,0x10,0x90,0x7f}}, ++ { ++ 16, ++ 0x3d88, ++ 0, ++ {0xb8,0xe0,0x20,0xe1,0x09,0xc2,0x04,0x90,0x18,0x55,0x74,0x03,0xf0,0x22,0xef,0x64}}, ++ { ++ 16, ++ 0x3d98, ++ 0, ++ {0x03,0x60,0x02,0xc1,0x1f,0xc2,0x04,0x90,0x7f,0xb8,0xe0,0x20,0xe1,0x37,0xe5,0x29}}, ++ { ++ 16, ++ 0x3da8, ++ 0, ++ {0x60,0x33,0x15,0x29,0x53,0x27,0x1f,0xe5,0x27,0x12,0x0a,0x37,0x05,0x27,0x90,0x78}}, ++ { ++ 16, ++ 0x3db8, ++ 0, ++ {0x4f,0xe5,0x3f,0xf0,0x90,0x78,0x50,0xe5,0x40,0xf0,0x90,0x78,0x51,0x74,0x7e,0xf0}}, ++ { ++ 16, ++ 0x3dc8, ++ 0, ++ {0x90,0x78,0x52,0x74,0x00,0xf0,0x12,0x0a,0x68,0x90,0x78,0x55,0xe0,0x60,0xfa,0x90}}, ++ { ++ 16, ++ 0x3dd8, ++ 0, ++ {0x7f,0xb9,0x74,0x40,0xf0,0x30,0x87,0x2c,0xe5,0x29,0x64,0x20,0x60,0x26,0x12,0x0a}}, ++ { ++ 16, ++ 0x3de8, ++ 0, ++ {0x30,0x05,0x28,0x90,0x78,0x4f,0x74,0x78,0xf0,0x90,0x78,0x50,0x74,0x58,0xf0,0x90}}, ++ { ++ 16, ++ 0x3df8, ++ 0, ++ {0x78,0x51,0xe5,0x3f,0xf0,0x90,0x78,0x52,0xe5,0x40,0xf0,0x12,0x0a,0x68,0x90,0x78}}, ++ { ++ 16, ++ 0x3e08, ++ 0, ++ {0x55,0xe0,0x60,0xfa,0xe5,0x29,0x70,0x0f,0x12,0x0a,0xa4,0x75,0xc8,0x01,0x85,0x13}}, ++ { ++ 8, ++ 0x3e18, ++ 0, ++ {0xcc,0x85,0x12,0xcd,0x75,0xc8,0x05,0x22}}, ++ { ++ 16, ++ 0x4e8, ++ 0, ++ {0x30,0x13,0x0f,0x12,0x08,0x00,0xc2,0x13,0x20,0x01,0x07,0x20,0x00,0x04,0x30,0x0e}}, ++ { ++ 16, ++ 0x4f8, ++ 0, ++ {0x01,0x22,0x12,0x12,0x99,0x30,0x14,0x0e,0x90,0x18,0x76,0xe0,0x70,0x08,0x12,0x3a}}, ++ { ++ 16, ++ 0x508, ++ 0, ++ {0x6b,0x50,0x03,0x12,0x3a,0x51,0x30,0x11,0x05,0x12,0x34,0x6e,0xc2,0x11,0x12,0x32}}, ++ { ++ 16, ++ 0x518, ++ 0, ++ {0xd1,0x30,0x0c,0x24,0x30,0x10,0x03,0x12,0x3c,0x60,0x20,0xcf,0x0c,0x30,0x87,0x09}}, ++ { ++ 16, ++ 0x528, ++ 0, ++ {0xe5,0x26,0x60,0x05,0x15,0x26,0x12,0x06,0x75,0x30,0x97,0x0a,0x90,0x7f,0xc8,0xe0}}, ++ { ++ 16, ++ 0x538, ++ 0, ++ {0x20,0xe1,0x03,0x12,0x06,0xa2,0x80,0xa8,0x30,0x04,0x0e,0xc2,0x04,0x75,0xc8,0x01}}, ++ { ++ 16, ++ 0x548, ++ 0, ++ {0x85,0x11,0xcc,0x85,0x10,0xcd,0x75,0xc8,0x05,0x20,0xcf,0x03,0x02,0x06,0x1f,0x30}}, ++ { ++ 16, ++ 0x558, ++ 0, ++ {0x87,0x03,0x02,0x06,0x1f,0x30,0xb1,0x05,0xd2,0x04,0x02,0x06,0x22,0x30,0x10,0x03}}, ++ { ++ 16, ++ 0x568, ++ 0, ++ {0x12,0x3c,0x60,0x90,0x7f,0xb8,0xe0,0x30,0xe1,0x03,0x02,0x06,0x22,0x74,0x00,0x90}}, ++ { ++ 16, ++ 0x578, ++ 0, ++ {0x7f,0xe4,0xf0,0xfa,0x05,0x86,0x90,0x7f,0xe5,0x05,0x86,0x74,0x7e,0x90,0x7f,0xe3}}, ++ { ++ 16, ++ 0x588, ++ 0, ++ {0xf0,0x79,0x40,0xd9,0x02,0x80,0x79,0x20,0xb1,0x76,0x90,0x40,0x08,0xe0,0xf8,0x90}}, ++ { ++ 16, ++ 0x598, ++ 0, ++ {0x40,0x09,0xe0,0x05,0x86,0xe8,0xf0,0x05,0x86,0x0a,0x90,0x7f,0xc8,0xe0,0x20,0xe1}}, ++ { ++ 16, ++ 0x5a8, ++ 0, ++ {0x06,0x30,0x97,0x03,0x12,0x06,0xa2,0x20,0x87,0x02,0x80,0xd7,0x90,0x7f,0xe3,0xe0}}, ++ { ++ 16, ++ 0x5b8, ++ 0, ++ {0x90,0x78,0x51,0xf0,0x90,0x7f,0xe4,0xe0,0x90,0x78,0x52,0xf0,0x90,0x78,0x4f,0x74}}, ++ { ++ 16, ++ 0x5c8, ++ 0, ++ {0x78,0xf0,0x90,0x78,0x50,0x74,0x58,0xf0,0xe9,0x90,0x78,0x54,0xf0,0x90,0x78,0x55}}, ++ { ++ 16, ++ 0x5d8, ++ 0, ++ {0x74,0xff,0xf0,0x90,0x78,0x55,0xe0,0x60,0xfa,0x74,0x40,0x90,0x7f,0xb9,0xf0,0x75}}, ++ { ++ 16, ++ 0x5e8, ++ 0, ++ {0xc8,0x01,0xc2,0x04,0x20,0x87,0x0b,0x85,0x13,0xcc,0x85,0x12,0xcd,0x75,0xc8,0x05}}, ++ { ++ 16, ++ 0x5f8, ++ 0, ++ {0x80,0x28,0x75,0xc8,0x01,0x85,0x0f,0xcc,0x85,0x0e,0xcd,0x75,0xc8,0x05,0x80,0x1a}}, ++ { ++ 16, ++ 0x608, ++ 0, ++ {0xd2,0x04,0xea,0x70,0x06,0x20,0x05,0x03,0x02,0x05,0x40,0xc2,0x05,0x90,0x7f,0xb9}}, ++ { ++ 16, ++ 0x618, ++ 0, ++ {0xf0,0x75,0xc8,0x01,0x02,0x05,0x40,0x12,0x3c,0x88,0x30,0x97,0x0a,0x90,0x7f,0xc8}}, ++ { ++ 16, ++ 0x628, ++ 0, ++ {0xe0,0x20,0xe1,0x03,0x12,0x06,0xa2,0x02,0x04,0xe8,0x75,0xc8,0x01,0x74,0x00,0x90}}, ++ { ++ 16, ++ 0x638, ++ 0, ++ {0x78,0x52,0xf0,0x74,0x7e,0x90,0x78,0x51,0xf0,0x74,0x78,0x90,0x78,0x4f,0xf0,0x74}}, ++ { ++ 16, ++ 0x648, ++ 0, ++ {0x58,0x90,0x78,0x50,0xf0,0x74,0x40,0x90,0x78,0x54,0xf0,0x74,0xff,0x90,0x78,0x55}}, ++ { ++ 16, ++ 0x658, ++ 0, ++ {0xf0,0xd2,0x05,0xc2,0x04,0x85,0x13,0xcc,0x85,0x12,0xcd,0x75,0xc8,0x05,0xd2,0x0a}}, ++ { ++ 16, ++ 0x668, ++ 0, ++ {0x90,0x78,0x55,0xe0,0x60,0xfa,0x74,0x40,0x90,0x7f,0xb9,0xf0,0x22,0x90,0x78,0x4f}}, ++ { ++ 16, ++ 0x678, ++ 0, ++ {0x74,0x78,0xf0,0x90,0x78,0x50,0x74,0x58,0xf0,0x90,0x78,0x51,0x74,0x7f,0xf0,0x90}}, ++ { ++ 16, ++ 0x688, ++ 0, ++ {0x78,0x52,0x74,0x68,0xf0,0x74,0x35,0x90,0x78,0x54,0xf0,0x90,0x78,0x55,0x74,0xff}}, ++ { ++ 16, ++ 0x698, ++ 0, ++ {0xf0,0xd2,0x0a,0x90,0x78,0x55,0xe0,0x60,0xfa,0x22,0x90,0x78,0x4f,0x74,0x7d,0xf0}}, ++ { ++ 16, ++ 0x6a8, ++ 0, ++ {0x90,0x78,0x50,0x74,0xc0,0xf0,0x90,0x78,0x51,0x74,0x78,0xf0,0x90,0x78,0x52,0x74}}, ++ { ++ 16, ++ 0x6b8, ++ 0, ++ {0x58,0xf0,0x90,0x7f,0xc9,0xe0,0x90,0x78,0x54,0xf0,0x25,0x0b,0xf5,0x0b,0xe4,0x35}}, ++ { ++ 16, ++ 0x6c8, ++ 0, ++ {0x0a,0xf5,0x0a,0x05,0x0c,0x90,0x78,0x55,0x74,0xff,0xf0,0x90,0x78,0x55,0xe0,0x60}}, ++ { ++ 8, ++ 0x6d8, ++ 0, ++ {0xfa,0x90,0x7f,0xc9,0xf0,0xd2,0x09,0x22}}, ++ { ++ 16, ++ 0x1900, ++ 0, ++ {0x12,0x01,0x00,0x01,0x02,0x00,0x00,0x40,0x10,0x11,0x0f,0x90,0x00,0x40,0x00,0x02}}, ++ { ++ 16, ++ 0x1910, ++ 0, ++ {0x03,0x01,0x09,0x02,0xe8,0x00,0x03,0x01,0x00,0x80,0xfa,0x09,0x04,0x00,0x00,0x01}}, ++ { ++ 16, ++ 0x1920, ++ 0, ++ {0x02,0x07,0x00,0x00,0x05,0x24,0x00,0x10,0x01,0x0c,0x24,0x0f,0x04,0x02,0x00,0x00}}, ++ { ++ 16, ++ 0x1930, ++ 0, ++ {0x00,0x00,0x00,0x00,0x00,0x07,0x05,0x84,0x03,0x20,0x00,0x01,0x09,0x04,0x01,0x00}}, ++ { ++ 16, ++ 0x1940, ++ 0, ++ {0x02,0x0a,0x00,0x00,0x00,0x07,0x05,0x04,0x02,0x40,0x00,0x01,0x07,0x05,0x02,0x02}}, ++ { ++ 16, ++ 0x1950, ++ 0, ++ {0x40,0x00,0x01,0x09,0x04,0x01,0x01,0x02,0x0a,0x00,0x00,0x00,0x07,0x05,0x04,0x02}}, ++ { ++ 16, ++ 0x1960, ++ 0, ++ {0x40,0x00,0x01,0x07,0x05,0x02,0x03,0x40,0x00,0x01,0x09,0x04,0x02,0x00,0x01,0x0a}}, ++ { ++ 16, ++ 0x1970, ++ 0, ++ {0x00,0x00,0x00,0x07,0x05,0x82,0x02,0x40,0x00,0x01,0x09,0x04,0x02,0x01,0x01,0x0a}}, ++ { ++ 16, ++ 0x1980, ++ 0, ++ {0x00,0x00,0x00,0x07,0x05,0x88,0x01,0x9f,0x00,0x01,0x09,0x04,0x02,0x02,0x01,0x0a}}, ++ { ++ 16, ++ 0x1990, ++ 0, ++ {0x00,0x00,0x00,0x07,0x05,0x88,0x01,0x09,0x01,0x01,0x09,0x04,0x02,0x03,0x01,0x0a}}, ++ { ++ 16, ++ 0x19a0, ++ 0, ++ {0x00,0x00,0x00,0x07,0x05,0x88,0x01,0xa8,0x01,0x01,0x09,0x04,0x02,0x04,0x01,0x0a}}, ++ { ++ 16, ++ 0x19b0, ++ 0, ++ {0x00,0x00,0x00,0x07,0x05,0x88,0x01,0x12,0x02,0x01,0x09,0x04,0x02,0x05,0x01,0x0a}}, ++ { ++ 16, ++ 0x19c0, ++ 0, ++ {0x00,0x00,0x00,0x07,0x05,0x88,0x01,0x7c,0x02,0x01,0x09,0x04,0x02,0x06,0x01,0x0a}}, ++ { ++ 16, ++ 0x19d0, ++ 0, ++ {0x00,0x00,0x00,0x07,0x05,0x88,0x01,0x1b,0x03,0x01,0x09,0x04,0x02,0x07,0x01,0x0a}}, ++ { ++ 16, ++ 0x19e0, ++ 0, ++ {0x00,0x00,0x00,0x07,0x05,0x88,0x01,0x85,0x03,0x01,0x09,0x04,0x02,0x08,0x01,0x0a}}, ++ { ++ 16, ++ 0x19f0, ++ 0, ++ {0x00,0x00,0x00,0x07,0x05,0x88,0x01,0xef,0x03,0x01,0x04,0x03,0x09,0x04,0x2a,0x03}}, ++ { ++ 16, ++ 0x1a00, ++ 0, ++ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, ++ { ++ 16, ++ 0x1a10, ++ 0, ++ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}, ++ { ++ 16, ++ 0x1a20, ++ 0, ++ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x03,0x41,0x00,0x44,0x00,0x53,0x00}}, ++ { ++ 16, ++ 0x1a30, ++ 0, ++ {0x4c,0x00,0x2d,0x00,0x55,0x00,0x53,0x00,0x42,0x00,0x20,0x00,0x4d,0x00,0x6f,0x00}}, ++ { ++ 16, ++ 0x1a40, ++ 0, ++ {0x64,0x00,0x65,0x00,0x6d,0x00,0x1e,0x03,0x30,0x00,0x30,0x00,0x36,0x00,0x30,0x00}}, ++ { ++ 16, ++ 0x1a50, ++ 0, ++ {0x46,0x00,0x39,0x00,0x30,0x00,0x32,0x00,0x30,0x00,0x33,0x00,0x30,0x00,0x34,0x00}}, ++ { ++ 16, ++ 0x1a60, ++ 0, ++ {0x30,0x00,0x36,0x00,0x1e,0x03,0x30,0x00,0x30,0x00,0x36,0x00,0x30,0x00,0x46,0x00}}, ++ { ++ 16, ++ 0x1a70, ++ 0, ++ {0x39,0x00,0x30,0x00,0x32,0x00,0x30,0x00,0x33,0x00,0x30,0x00,0x34,0x00,0x30,0x00}}, ++ { ++ 4, ++ 0x1a80, ++ 0, ++ {0x36,0x00,0x00,0x00}}, ++ { ++ 3, ++ 0x43, ++ 0, ++ {0x02,0x12,0x00}}, ++ { ++ 16, ++ 0x1200, ++ 0, ++ {0x02,0x11,0xd9,0x00,0x02,0x10,0xd1,0x00,0x02,0x14,0x1f,0x00,0x02,0x13,0xfb,0x00}}, ++ { ++ 16, ++ 0x1210, ++ 0, ++ {0x02,0x13,0x3e,0x00,0x02,0x11,0xfd,0x00,0x02,0x11,0xfe,0x00,0x02,0x11,0xff,0x00}}, ++ { ++ 16, ++ 0x1220, ++ 0, ++ {0x02,0x14,0xec,0x00,0x02,0x14,0xed,0x00,0x02,0x14,0xee,0x00,0x02,0x14,0xef,0x00}}, ++ { ++ 16, ++ 0x1230, ++ 0, ++ {0x02,0x14,0xf0,0x00,0x02,0x14,0xf1,0x00,0x02,0x14,0xf2,0x00,0x02,0x14,0xf3,0x00}}, ++ { ++ 16, ++ 0x1240, ++ 0, ++ {0x02,0x14,0xf4,0x00,0x02,0x14,0xf5,0x00,0x02,0x14,0xf6,0x00,0x02,0x14,0xf7,0x00}}, ++ { ++ 8, ++ 0x1250, ++ 0, ++ {0x02,0x14,0xf8,0x00,0x02,0x14,0xf9,0x00}}, ++ { ++ 16, ++ 0x1441, ++ 0, ++ {0x90,0x7f,0xd6,0xe0,0x44,0x80,0xf0,0x43,0x87,0x01,0x00,0x00,0x00,0x00,0x00,0x22}}, ++ { ++ 16, ++ 0x7e6, ++ 0, ++ {0x8e,0x72,0x8f,0x73,0xe5,0x73,0x15,0x73,0xae,0x72,0x70,0x02,0x15,0x72,0x4e,0x60}}, ++ { ++ 7, ++ 0x7f6, ++ 0, ++ {0x05,0x12,0x14,0x51,0x80,0xee,0x22}}, ++ { ++ 8, ++ 0x14e0, ++ 0, ++ {0xe4,0xf5,0x60,0xd2,0xe9,0xd2,0xaf,0x22}}, ++ { ++ 16, ++ 0x12d4, ++ 0, ++ {0x90,0x7f,0xa5,0xe0,0x20,0xe6,0xf9,0xc2,0xe9,0x90,0x7f,0xa5,0xe0,0x44,0x80,0xf0}}, ++ { ++ 16, ++ 0x12e4, ++ 0, ++ {0xef,0x25,0xe0,0x90,0x7f,0xa6,0xf0,0x90,0x7f,0xa5,0xe0,0x30,0xe0,0xf9,0x90,0x7f}}, ++ { ++ 16, ++ 0x12f4, ++ 0, ++ {0xa5,0xe0,0x44,0x40,0xf0,0x90,0x7f,0xa5,0xe0,0x20,0xe6,0xf9,0x90,0x7f,0xa5,0xe0}}, ++ { ++ 6, ++ 0x1304, ++ 0, ++ {0x30,0xe1,0xd6,0xd2,0xe9,0x22}}, ++ { ++ 16, ++ 0x1370, ++ 0, ++ {0xa9,0x07,0x90,0x7f,0xa5,0xe0,0x20,0xe6,0xf9,0xe5,0x60,0x70,0x23,0x90,0x7f,0xa5}}, ++ { ++ 16, ++ 0x1380, ++ 0, ++ {0xe0,0x44,0x80,0xf0,0xe9,0x25,0xe0,0x90,0x7f,0xa6,0xf0,0x8d,0x5b,0xaf,0x03,0xa9}}, ++ { ++ 16, ++ 0x1390, ++ 0, ++ {0x07,0x75,0x5c,0x01,0x8a,0x5d,0x89,0x5e,0xe4,0xf5,0x5f,0x75,0x60,0x01,0xd3,0x22}}, ++ { ++ 2, ++ 0x13a0, ++ 0, ++ {0xc3,0x22}}, ++ { ++ 16, ++ 0x130a, ++ 0, ++ {0xa9,0x07,0x90,0x7f,0xa5,0xe0,0x20,0xe6,0xf9,0xe5,0x60,0x70,0x25,0x90,0x7f,0xa5}}, ++ { ++ 16, ++ 0x131a, ++ 0, ++ {0xe0,0x44,0x80,0xf0,0xe9,0x25,0xe0,0x44,0x01,0x90,0x7f,0xa6,0xf0,0x8d,0x5b,0xaf}}, ++ { ++ 16, ++ 0x132a, ++ 0, ++ {0x03,0xa9,0x07,0x75,0x5c,0x01,0x8a,0x5d,0x89,0x5e,0xe4,0xf5,0x5f,0x75,0x60,0x03}}, ++ { ++ 4, ++ 0x133a, ++ 0, ++ {0xd3,0x22,0xc3,0x22}}, ++ { ++ 3, ++ 0x4b, ++ 0, ++ {0x02,0x06,0xe0}}, ++ { ++ 16, ++ 0x6e0, ++ 0, ++ {0xc0,0xe0,0xc0,0x83,0xc0,0x82,0xc0,0x85,0xc0,0x84,0xc0,0x86,0x75,0x86,0x00,0xc0}}, ++ { ++ 16, ++ 0x6f0, ++ 0, ++ {0xd0,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0xc0,0x06,0xc0,0x07,0x90,0x7f,0xa5}}, ++ { ++ 16, ++ 0x700, ++ 0, ++ {0xe0,0x30,0xe2,0x06,0x75,0x60,0x06,0x02,0x07,0xc8,0x90,0x7f,0xa5,0xe0,0x20,0xe1}}, ++ { ++ 16, ++ 0x710, ++ 0, ++ {0x0c,0xe5,0x60,0x64,0x02,0x60,0x06,0x75,0x60,0x07,0x02,0x07,0xc8,0xaf,0x60,0xef}}, ++ { ++ 16, ++ 0x720, ++ 0, ++ {0x24,0xfe,0x60,0x5f,0x14,0x60,0x36,0x24,0xfe,0x70,0x03,0x02,0x07,0xb9,0x24,0xfc}}, ++ { ++ 16, ++ 0x730, ++ 0, ++ {0x70,0x03,0x02,0x07,0xc5,0x24,0x08,0x60,0x03,0x02,0x07,0xc8,0xab,0x5c,0xaa,0x5d}}, ++ { ++ 16, ++ 0x740, ++ 0, ++ {0xa9,0x5e,0xaf,0x5f,0x05,0x5f,0x8f,0x82,0x75,0x83,0x00,0x12,0x0b,0x26,0x90,0x7f}}, ++ { ++ 16, ++ 0x750, ++ 0, ++ {0xa6,0xf0,0xe5,0x5f,0x65,0x5b,0x70,0x70,0x75,0x60,0x05,0x80,0x6b,0x90,0x7f,0xa6}}, ++ { ++ 16, ++ 0x760, ++ 0, ++ {0xe0,0xab,0x5c,0xaa,0x5d,0xa9,0x5e,0xae,0x5f,0x8e,0x82,0x75,0x83,0x00,0x12,0x0b}}, ++ { ++ 16, ++ 0x770, ++ 0, ++ {0x53,0x75,0x60,0x02,0xe5,0x5b,0x64,0x01,0x70,0x4e,0x90,0x7f,0xa5,0xe0,0x44,0x20}}, ++ { ++ 16, ++ 0x780, ++ 0, ++ {0xf0,0x80,0x45,0xe5,0x5b,0x24,0xfe,0xb5,0x5f,0x07,0x90,0x7f,0xa5,0xe0,0x44,0x20}}, ++ { ++ 16, ++ 0x790, ++ 0, ++ {0xf0,0xe5,0x5b,0x14,0xb5,0x5f,0x0a,0x90,0x7f,0xa5,0xe0,0x44,0x40,0xf0,0xe4,0xf5}}, ++ { ++ 16, ++ 0x7a0, ++ 0, ++ {0x60,0x90,0x7f,0xa6,0xe0,0xab,0x5c,0xaa,0x5d,0xa9,0x5e,0xae,0x5f,0x8e,0x82,0x75}}, ++ { ++ 16, ++ 0x7b0, ++ 0, ++ {0x83,0x00,0x12,0x0b,0x53,0x05,0x5f,0x80,0x0f,0x90,0x7f,0xa5,0xe0,0x44,0x40,0xf0}}, ++ { ++ 16, ++ 0x7c0, ++ 0, ++ {0xe4,0xf5,0x60,0x80,0x03,0xe4,0xf5,0x60,0x53,0x91,0xdf,0xd0,0x07,0xd0,0x06,0xd0}}, ++ { ++ 16, ++ 0x7d0, ++ 0, ++ {0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0xd0,0xd0,0xd0,0x86,0xd0,0x84,0xd0,0x85,0xd0}}, ++ { ++ 6, ++ 0x7e0, ++ 0, ++ {0x82,0xd0,0x83,0xd0,0xe0,0x32}}, ++ { ++ 2, ++ 0x13cf, ++ 0, ++ {0xa9,0x07}}, ++ { ++ 16, ++ 0x13d1, ++ 0, ++ {0xae,0x1a,0xaf,0x1b,0x8f,0x82,0x8e,0x83,0xa3,0xe0,0x64,0x03,0x70,0x17,0xad,0x01}}, ++ { ++ 16, ++ 0x13e1, ++ 0, ++ {0x19,0xed,0x70,0x01,0x22,0x8f,0x82,0x8e,0x83,0xe0,0x7c,0x00,0x2f,0xfd,0xec,0x3e}}, ++ { ++ 9, ++ 0x13f1, ++ 0, ++ {0xfe,0xaf,0x05,0x80,0xdf,0x7e,0x00,0x7f,0x00}}, ++ { ++ 1, ++ 0x13fa, ++ 0, ++ {0x22}}, ++ { ++ 2, ++ 0x1258, ++ 0, ++ {0xad,0x07}}, ++ { ++ 16, ++ 0x125a, ++ 0, ++ {0xe4,0xfc,0xae,0x18,0xaf,0x19,0x8f,0x82,0x8e,0x83,0xa3,0xe0,0x64,0x02,0x70,0x2a}}, ++ { ++ 16, ++ 0x126a, ++ 0, ++ {0xab,0x04,0x0c,0xeb,0xb5,0x05,0x01,0x22,0x8f,0x82,0x8e,0x83,0xa3,0xa3,0xe0,0xfa}}, ++ { ++ 16, ++ 0x127a, ++ 0, ++ {0xa3,0xe0,0x8a,0x74,0xf5,0x75,0x62,0x74,0xe5,0x74,0x62,0x75,0xe5,0x75,0x62,0x74}}, ++ { ++ 14, ++ 0x128a, ++ 0, ++ {0x2f,0xfb,0xe5,0x74,0x3e,0xfe,0xaf,0x03,0x80,0xcc,0x7e,0x00,0x7f,0x00}}, ++ { ++ 1, ++ 0x1298, ++ 0, ++ {0x22}}, ++ { ++ 16, ++ 0x1480, ++ 0, ++ {0x12,0x13,0x0a,0xe5,0x60,0x24,0xfa,0x60,0x0e,0x14,0x60,0x06,0x24,0x07,0x70,0xf3}}, ++ { ++ 12, ++ 0x1490, ++ 0, ++ {0xd3,0x22,0xe4,0xf5,0x60,0xd3,0x22,0xe4,0xf5,0x60,0xd3,0x22}}, ++ { ++ 16, ++ 0x149c, ++ 0, ++ {0x12,0x13,0x70,0xe5,0x60,0x24,0xfa,0x60,0x0e,0x14,0x60,0x06,0x24,0x07,0x70,0xf3}}, ++ { ++ 12, ++ 0x14ac, ++ 0, ++ {0xd3,0x22,0xe4,0xf5,0x60,0xd3,0x22,0xe4,0xf5,0x60,0xd3,0x22}}, ++ { ++ 16, ++ 0x1451, ++ 0, ++ {0x74,0x00,0xf5,0x86,0x90,0xfd,0xa5,0x7c,0x05,0xa3,0xe5,0x82,0x45,0x83,0x70,0xf9}}, ++ { ++ 1, ++ 0x1461, ++ 0, ++ {0x22}}, ++ { ++ 3, ++ 0x0, ++ 0, ++ {0x02,0x0f,0xba}}, ++ { ++ 12, ++ 0xfba, ++ 0, ++ {0x78,0x7f,0xe4,0xf6,0xd8,0xfd,0x75,0x81,0x80,0x02,0x10,0x01}}, ++ { ++ 16, ++ 0xb26, ++ 0, ++ {0xbb,0x01,0x0c,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe0,0x22,0x50}}, ++ { ++ 16, ++ 0xb36, ++ 0, ++ {0x06,0xe9,0x25,0x82,0xf8,0xe6,0x22,0xbb,0xfe,0x06,0xe9,0x25,0x82,0xf8,0xe2,0x22}}, ++ { ++ 13, ++ 0xb46, ++ 0, ++ {0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe4,0x93,0x22}}, ++ { ++ 16, ++ 0xb53, ++ 0, ++ {0xf8,0xbb,0x01,0x0d,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0}}, ++ { ++ 16, ++ 0xb63, ++ 0, ++ {0x22,0x50,0x06,0xe9,0x25,0x82,0xc8,0xf6,0x22,0xbb,0xfe,0x05,0xe9,0x25,0x82,0xc8}}, ++ { ++ 2, ++ 0xb73, ++ 0, ++ {0xf2,0x22}}, ++ { ++ 16, ++ 0xb75, ++ 0, ++ {0xbc,0x00,0x0b,0xbe,0x00,0x29,0xef,0x8d,0xf0,0x84,0xff,0xad,0xf0,0x22,0xe4,0xcc}}, ++ { ++ 16, ++ 0xb85, ++ 0, ++ {0xf8,0x75,0xf0,0x08,0xef,0x2f,0xff,0xee,0x33,0xfe,0xec,0x33,0xfc,0xee,0x9d,0xec}}, ++ { ++ 16, ++ 0xb95, ++ 0, ++ {0x98,0x40,0x05,0xfc,0xee,0x9d,0xfe,0x0f,0xd5,0xf0,0xe9,0xe4,0xce,0xfd,0x22,0xed}}, ++ { ++ 16, ++ 0xba5, ++ 0, ++ {0xf8,0xf5,0xf0,0xee,0x84,0x20,0xd2,0x1c,0xfe,0xad,0xf0,0x75,0xf0,0x08,0xef,0x2f}}, ++ { ++ 16, ++ 0xbb5, ++ 0, ++ {0xff,0xed,0x33,0xfd,0x40,0x07,0x98,0x50,0x06,0xd5,0xf0,0xf2,0x22,0xc3,0x98,0xfd}}, ++ { ++ 5, ++ 0xbc5, ++ 0, ++ {0x0f,0xd5,0xf0,0xea,0x22}}, ++ { ++ 16, ++ 0xbca, ++ 0, ++ {0xbb,0x01,0x0a,0x89,0x82,0x8a,0x83,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x06,0xf7}}, ++ { ++ 15, ++ 0xbda, ++ 0, ++ {0x09,0xa7,0xf0,0x19,0x22,0xbb,0xfe,0x06,0xf3,0xe5,0xf0,0x09,0xf3,0x19,0x22}}, ++ { ++ 16, ++ 0xbe9, ++ 0, ++ {0xeb,0x9f,0xf5,0xf0,0xea,0x9e,0x42,0xf0,0xe9,0x9d,0x42,0xf0,0xe8,0x9c,0x45,0xf0}}, ++ { ++ 1, ++ 0xbf9, ++ 0, ++ {0x22}}, ++ { ++ 16, ++ 0xbfa, ++ 0, ++ {0xd0,0x83,0xd0,0x82,0xf8,0xe4,0x93,0x70,0x12,0x74,0x01,0x93,0x70,0x0d,0xa3,0xa3}}, ++ { ++ 16, ++ 0xc0a, ++ 0, ++ {0x93,0xf8,0x74,0x01,0x93,0xf5,0x82,0x88,0x83,0xe4,0x73,0x74,0x02,0x93,0x68,0x60}}, ++ { ++ 6, ++ 0xc1a, ++ 0, ++ {0xef,0xa3,0xa3,0xa3,0x80,0xdf}}, ++ { ++ 16, ++ 0xfc6, ++ 0, ++ {0x02,0x0c,0x20,0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x03,0xf6,0x80,0x01,0xf2}}, ++ { ++ 16, ++ 0xfd6, ++ 0, ++ {0x08,0xdf,0xf4,0x80,0x29,0xe4,0x93,0xa3,0xf8,0x54,0x07,0x24,0x0c,0xc8,0xc3,0x33}}, ++ { ++ 16, ++ 0xfe6, ++ 0, ++ {0xc4,0x54,0x0f,0x44,0x20,0xc8,0x83,0x40,0x04,0xf4,0x56,0x80,0x01,0x46,0xf6,0xdf}}, ++ { ++ 16, ++ 0xff6, ++ 0, ++ {0xe4,0x80,0x0b,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x90,0x11,0x96,0xe4,0x7e}}, ++ { ++ 16, ++ 0x1006, ++ 0, ++ {0x01,0x93,0x60,0xbc,0xa3,0xff,0x54,0x3f,0x30,0xe5,0x09,0x54,0x1f,0xfe,0xe4,0x93}}, ++ { ++ 16, ++ 0x1016, ++ 0, ++ {0xa3,0x60,0x01,0x0e,0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3}}, ++ { ++ 16, ++ 0x1026, ++ 0, ++ {0xfa,0xe4,0x93,0xa3,0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca}}, ++ { ++ 16, ++ 0x1036, ++ 0, ++ {0xf0,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe}}, ++ { ++ 1, ++ 0x11d8, ++ 0, ++ {0x00}}, ++ { ++ 0, ++ 0x0, ++ 1, ++ {0}} ++}; ++#endif /* __EU_FIRMWARE_H__ */ +diff -urN x/drivers/usb/misc/eagle-usb/eu_main.c y/drivers/usb/misc/eagle-usb/eu_main.c +--- x/drivers/usb/misc/eagle-usb/eu_main.c 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/eu_main.c 2004-08-30 18:57:39.000000000 +1000 +@@ -0,0 +1,1936 @@ ++ ++/* ++ * ++ * Copyright (c) 2003, Frederick Ros (sl33p3r@free.fr) ++ * Forked from ADI Linux driver from Analog Devices Inc., ++ * User space interface rewritten by C.Casteyde (casteyde.christian@free.fr) ++ * Multi-modem support added by Renaud Guerin (rguerin@freebox.fr) ++ * Other stuff : Frederick Ros (sl33p3r@free.fr) ++ * ++ * eagle-usb.c ++ * ++ * ---------------------------------------------------------------------------- ++ * ++ * This file is part of the eagle-usb driver package. ++ * ++ * "eagle-usb driver package" is free software; you can redistribute it ++ * and/or modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of the License, ++ * or (at your option) any later version. ++ * ++ * "eagle-usb driver package" is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with "eagle-usb driver package"; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ * ++ * $Id: eu_main.c,v 1.15 2004/08/26 20:06:34 sleeper Exp $ ++ */ ++ ++#include "Adiutil.h" ++#include ++#include ++#include ++#include ++#include ++#include ++#include "eagle-usb.h" ++#include "macros.h" ++#include "Dsp.h" ++#include "eu_msg.h" ++#include "Pipes.h" ++#include "eu_utils.h" ++#include "eu_sm.h" ++#include "Oam.h" ++#include "Mpoa.h" ++#include "Me.h" ++#include "Uni.h" ++#include "debug.h" ++#include "eu_eth.h" ++#include "eu_boot_sm.h" ++ ++/* ------------------------------- Private Macros ------------------------------- */ ++ ++#define CASE_PREFIRM EAGLE_I_PID_PREFIRM: \ ++ case MILLER_A_PID_PREFIRM: \ ++ case MILLER_B_PID_PREFIRM: \ ++ case HEINEKEN_A_PID_PREFIRM: \ ++ case HEINEKEN_B_PID_PREFIRM: \ ++ case EAGLE_IIC_PID_PREFIRM: \ ++ case EAGLE_II_PID_PREFIRM ++ ++ ++#define CASE_POSTFIRM EAGLE_I_PID_PSTFIRM: \ ++ case MILLER_A_PID_PSTFIRM: \ ++ case MILLER_B_PID_PSTFIRM: \ ++ case HEINEKEN_A_PID_PSTFIRM: \ ++ case HEINEKEN_B_PID_PSTFIRM: \ ++ case EAGLE_II_PID_PSTFIRM: \ ++ case EAGLE_IIC_PID_PSTFIRM ++ ++#define ISPREFIRM(c) ( EAGLE_I_PID_PREFIRM == (c) || \ ++ MILLER_A_PID_PREFIRM == (c) || MILLER_B_PID_PREFIRM == (c) || \ ++ HEINEKEN_A_PID_PREFIRM == (c) || HEINEKEN_B_PID_PREFIRM == (c) || \ ++ EAGLE_II_PID_PREFIRM == (c) || EAGLE_IIC_PID_PREFIRM == (c) \ ++ ) ++ ++#define ISPOSTFIRM(c) ( EAGLE_I_PID_PSTFIRM == (c) || \ ++ MILLER_A_PID_PSTFIRM == (c) || MILLER_B_PID_PSTFIRM == (c) || \ ++ HEINEKEN_A_PID_PSTFIRM == (c) || HEINEKEN_B_PID_PSTFIRM == (c) || \ ++ EAGLE_II_PID_PSTFIRM == (c) || EAGLE_IIC_PID_PSTFIRM == (c) \ ++ ) ++ ++ ++/* ++ * Hardcoded endpoint addresses ++ */ ++#define EP_BULK_IDMA_OUT 0x04 ++#define EP_BULK_DATA_OUT 0x02 ++#define EP_BULK_DATA_IN 0x82 ++#define EP_ISOC_DATA_IN 0x88 ++#define EP_INT_IN 0x84 ++ ++#define USB_INTF_IN 0x02 ++#define FASTEST_ISO_INTF 0x08 ++ ++/* ++ * Interrupts ++ */ ++#define EU_INT_LOADSWAPPAGE 0x01 ++#define EU_INT_INCOMINGCMV 0x02 ++ ++ ++/* ----------------------- Private Function Declarations ------------------------ */ ++ ++/* ++ * USB related ++ */ ++#ifdef LINUX_2_4 ++static void *eu_probe(struct usb_device *usb, unsigned int ifnum, const struct usb_device_id *id); ++static void eu_disconnect(struct usb_device *usb, void *ptr); ++static int eu_user(struct usb_device *dev, unsigned int code, void *buf); ++#elif defined (LINUX_2_6) ++static int eu_probe ( struct usb_interface *intf, const struct usb_device_id *id); ++static void eu_disconnect(struct usb_interface *intf); ++static int eu_user(struct usb_interface *intf, unsigned int code, void *buf); ++#endif ++ ++static USB_COMPLETION_PROTO (eu_irq,urb,regs); ++ ++static int eu_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data); ++ ++/* ++ * Ethernet device related ++ */ ++static eu_instance_t *eu_init_prefirm ( struct usb_device *usb ); ++#ifdef LINUX_2_6 ++static eu_instance_t * eu_init_postfirm ( struct usb_device *usb, struct usb_interface *intf ); ++#else ++static eu_instance_t * eu_init_postfirm ( struct usb_device *usb ); ++#endif ++static void eu_disconnect_postfirm ( eu_instance_t *ins , struct usb_device *usb ); ++static void eu_process_rcv ( unsigned long data ); ++static int eu_check_options ( const eu_options_t opt ); ++ ++/* ----------------------------- Private Variables ------------------------------ */ ++ ++ ++/* ++ * List of supported VID/PID ++ */ ++static const struct usb_device_id eu_ids[] = ++{ ++ { USB_DEVICE (EAGLE_VID, EAGLE_I_PID_PREFIRM) }, ++ { USB_DEVICE (EAGLE_VID, EAGLE_I_PID_PSTFIRM) }, ++ { USB_DEVICE (EAGLE_VID, EAGLE_II_PID_PREFIRM) }, ++ { USB_DEVICE (EAGLE_VID, EAGLE_II_PID_PSTFIRM) }, ++ { USB_DEVICE (EAGLE_VID, EAGLE_IIC_PID_PREFIRM) }, ++ { USB_DEVICE (EAGLE_VID, EAGLE_IIC_PID_PSTFIRM) }, ++ { USB_DEVICE (USR_VID, MILLER_A_PID_PREFIRM) }, ++ { USB_DEVICE (USR_VID, MILLER_A_PID_PSTFIRM) }, ++ { USB_DEVICE (USR_VID, MILLER_B_PID_PREFIRM) }, ++ { USB_DEVICE (USR_VID, MILLER_B_PID_PSTFIRM) }, ++ { USB_DEVICE (USR_VID, HEINEKEN_A_PID_PREFIRM) }, ++ { USB_DEVICE (USR_VID, HEINEKEN_A_PID_PSTFIRM) }, ++ { USB_DEVICE (USR_VID, HEINEKEN_B_PID_PREFIRM) }, ++ { USB_DEVICE (USR_VID, HEINEKEN_B_PID_PSTFIRM) }, ++ { } ++}; ++ ++/* ++ * USB driver descriptor ++ */ ++static struct usb_driver eu_driver = ++{ ++#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,19) ++ .owner = THIS_MODULE, ++#endif ++ .name = "eagle-usb", ++ .id_table = eu_ids, ++ .probe = eu_probe, ++ .disconnect = eu_disconnect, ++ .ioctl = eu_user ++}; ++ ++/* ++ * Linked list of modem eu_instance_t structs ++ */ ++LIST_HEAD(modem_list); ++ ++ ++/* ++ * Our /proc dir entry ++ */ ++struct proc_dir_entry* eu_procdir; ++ ++ ++#define DEFAULT_OPTN0 0x80020066 ++#define DEFAULT_OPTN2 0x23700000 ++#define DEFAULT_OPTN3 0x00000000 ++#define DEFAULT_OPTN4 0x00000000 ++#define DEFAULT_OPTN5 0x00000000 ++#define DEFAULT_OPTN6 0x00000000 ++#define DEFAULT_OPTN7 0x02CD8044 ++#define DEFAULT_OPTN15 0x00000000 ++#define DEFAULT_VPI 0x00000008 ++#define DEFAULT_VCI 0x00000023 ++#define DEFAULT_ENCAPS MPOA_MODE_PPPOA_VC ++#define DEFAULT_LINETYPE 0x00000001 ++#define DEFAULT_POLLFREQ 0x0000000A ++ ++/* ++ * Default driver options ++ */ ++static const eu_options_t default_options = ++{ ++ { "OPTN0", DEFAULT_OPTN0 }, ++ { "OPTN2", DEFAULT_OPTN2 }, ++ { "OPTN3", DEFAULT_OPTN3 }, ++ { "OPTN4", DEFAULT_OPTN4 }, ++ { "OPTN5", DEFAULT_OPTN5 }, ++ { "OPTN6", DEFAULT_OPTN6 }, ++ { "OPTN7", DEFAULT_OPTN7 }, ++ { "OPTN15", DEFAULT_OPTN15 }, ++ { "VPI", DEFAULT_VPI }, ++ { "VCI", DEFAULT_VCI }, ++ { "Encapsulation", DEFAULT_ENCAPS }, ++ { "Linetype", DEFAULT_LINETYPE }, ++ { "RatePollFreq", DEFAULT_POLLFREQ }, ++}; ++ ++/* ++ * User supplied name for ethernet interface ++ */ ++static char *if_name = NULL; ++ ++/* ++ * User supplied debug level ++ */ ++unsigned int module_dbg_mask = 0x0; ++ ++ ++/* -------------------------------- Module Stuff -------------------------------- */ ++ ++MODULE_AUTHOR ("Anoosh Naderi /Frederick Ros (sl33p3r@free.fr)"); ++MODULE_DESCRIPTION ("Eagle USB ADSL Modem driver"); ++MODULE_DEVICE_TABLE (usb, eu_ids); ++MODULE_LICENSE("GPL"); ++MODULE_PARM (if_name,"s"); ++MODULE_PARM_DESC (if_name,"Exported ethernet interface name"); ++MODULE_PARM (module_dbg_mask,"i"); ++MODULE_PARM_DESC (module_dbg_mask,"Module Debug mask"); ++ ++EXPORT_NO_SYMBOLS; ++ ++ ++ ++ ++/* ----------------------- INITIALIZATION / DESTRUCTION ------------------------ */ ++ ++ ++ ++/** ++ * eu_init - Initialize the module. ++ * Generates CRC table ++ * Creates /proc/driver/eagle-usb directory ++ * Register to USB subsystem ++ * ++ */ ++static int __init eu_init (void) ++{ ++ int result = 0; ++ ++ eu_enters (DBG_INIT); ++ ++ ++ eu_report ("driver V"EAGLEUSBVERSION" loaded\n"); ++ ++ eu_crc_generate(); ++ ++ eu_procdir = proc_mkdir("driver/eagle-usb",NULL); ++ ++ if ( eu_procdir ) ++ { ++ eu_procdir->owner = THIS_MODULE; ++ } ++ else ++ { ++ eu_report ("could not create /proc/driver/eagle-usb/\n"); ++ result = -ENOMEM; ++ } ++ ++ ++ usb_register(&eu_driver); ++ ++ ++ eu_leaves (DBG_INIT); ++ ++ return 0; ++} ++ ++module_init (eu_init); ++ ++ ++/** ++ * eu_exit - Finalize module ++ * ++ * Deregister with USB subsystem ++ * Remove /proc/drivers/eagle-usb directory ++ * ++ */ ++static void __exit eu_exit (void) ++{ ++ eu_enters (DBG_INIT); ++ ++ /* ++ * This calls automatically the eu_disconnect method if necessary: ++ */ ++ usb_deregister (&eu_driver); ++ ++ eu_report ("driver unloaded\n"); ++ remove_proc_entry("driver/eagle-usb",NULL); ++ ++ eu_leaves (DBG_INIT); ++ ++} ++ ++module_exit (eu_exit); ++ ++ ++/** ++ * eu_probe - Ask driver to probe this device ++ * ++ */ ++#ifdef LINUX_2_4 ++static void *eu_probe ( ++ struct usb_device *usb, ++ unsigned int ifnum, ++ const struct usb_device_id *id ++ ) ++#elif defined(LINUX_2_6) ++static int eu_probe ( ++ struct usb_interface *intf, ++ const struct usb_device_id *id ++ ) ++#endif ++ ++{ ++ void *ins = NULL; ++#ifdef LINUX_2_6 ++ struct usb_device *usb = interface_to_usbdev (intf); ++#endif ++ uint32_t pid = usb->descriptor.idProduct; ++ ++ ++ eu_enters (DBG_INIT); ++ ++ eu_dbg (DBG_INIT,"vid (%#X) pid (%#X) \n", ++ usb->descriptor.idVendor, usb->descriptor.idProduct); ++ ++ /* ++ * This driver knows only pre and postfirmware devices. ++ */ ++ if ( !ISPREFIRM(pid) && !ISPOSTFIRM(pid) ) ++ { ++ eu_dbg (DBG_INIT," Not a supported modem\n"); ++ goto byebye; ++ } ++ ++ switch ( pid ) ++ { ++ case CASE_PREFIRM: ++ ++ ins = eu_init_prefirm ( usb ); ++ break; ++ ++ case CASE_POSTFIRM: ++#ifdef LINUX_2_6 ++ ins = eu_init_postfirm ( usb, intf ); ++#else ++ ins = eu_init_postfirm ( usb ); ++#endif ++ break; ++ } ++ ++ eu_leaves (DBG_INIT); ++ ++ byebye: ++#ifdef LINUX_2_6 ++ if (ins) ++ { ++ ++ usb_set_intfdata (intf, ins); ++ ++ return (0); ++ } ++ else ++ { ++ return -ENODEV; ++ } ++#else ++ return (ins); ++#endif ++} ++ ++ ++ ++/* ++ * eu_init_prefirm - Initialize pre-firmware device ++ * ++ * @usb - USB device to init. ++ */ ++static eu_instance_t *eu_init_prefirm ( struct usb_device *usb ) ++{ ++ eu_instance_t *ins = NULL; ++ int ret; ++ uint32_t pid = usb->descriptor.idProduct; ++ ++ eu_enters (DBG_INIT); ++ ++ /* ++ * Create a new pre-firmware device: ++ */ ++ ins = GET_KBUFFER (sizeof(eu_instance_t)); ++ if ( !ins ) ++ { ++ eu_err ("Not enough memory to get new driver structure..\n"); ++ goto byebye; ++ } ++ ++ eu_report ("New pre-firmware modem detected\n"); ++ ++ /* ++ * Reinitialize the modem structure: ++ */ ++ memset (ins, 0, sizeof(eu_instance_t)); ++ ins->usbdev = usb; ++ ++ EU_CLEAR_FLAG (ins, EU_MSG_INITIALIZED); ++ EU_CLEAR_FLAG (ins, EU_UNPLUG); ++ ++ ++ eu_report ("Uploading firmware..\n"); ++ ++ ret = eu_load_firmware ( ins, pid ); ++ if ( ret < 0 ) ++ { ++ eu_err ("Can't upload firmware to modem...\n"); ++ FREE_KBUFFER (ins); ++ ins = NULL; ++ goto byebye; ++ } ++ ++ eu_report ("Binding eu_instance_t to USB %03d/%03d\n", ++ usb->bus->busnum, usb->devnum); ++ ++ list_add (&ins->list,&modem_list); ++ ++ byebye: ++ eu_leaves ( DBG_INIT); ++ ++ return(ins); ++ ++} ++ ++/** ++ * eu_init_postfirm - Initialize post firmware device ++ * ++ * @usb - USB device to init ++ */ ++#ifdef LINUX_2_6 ++static eu_instance_t * eu_init_postfirm ( struct usb_device *usb, struct usb_interface *intf ) ++#else ++static eu_instance_t * eu_init_postfirm ( struct usb_device *usb ) ++#endif ++{ ++ int i; ++ eu_instance_t *ins = NULL; ++ char path[32]; ++ struct proc_dir_entry* procfile; ++ int ret = 0; ++ unsigned int nb_frames; ++ int tmp; ++ ++ ++ eu_enters (DBG_INIT); ++ ++ /* ++ * Create a new post-firmware device: ++ */ ++ ins = GET_KBUFFER (sizeof (eu_instance_t)); ++ ++ if ( !ins ) ++ { ++ eu_err ("eu_init_postfirm: Not enough memory !\n"); ++ goto byebye; ++ } ++ ++ /* ++ * Initialize our instance ++ */ ++ memset ( ins, 0, sizeof(eu_instance_t) ); ++ ins->usbdev = usb; ++ ++ EU_CLEAR_FLAG ( ins, EU_MSG_INITIALIZED); ++ EU_CLEAR_FLAG ( ins, EU_UNPLUG); ++ ++ init_waitqueue_head (&ins->sync_q); ++ ins->lock = SPIN_LOCK_UNLOCKED; ++ ++ /* ++ * Add our new device's list hook to the modem_list ++ */ ++ list_add ( &ins->list,&modem_list ); ++ ++ eu_report ("New USB ADSL device detected, waiting for DSP code...\n"); ++#ifdef LINUX_2_6 ++ eu_report ("Interface %d accepted.\n",intf->altsetting[0].desc.bInterfaceNumber); ++#endif ++ ++#ifdef USEBULK ++ EU_CLEAR_FLAG (ins, EU_LOW_RATE); ++#else ++ EU_SET_FLAG (ins, EU_LOW_RATE); ++#endif ++ ++ /* ++ * Use constants for endpoint addresses - It saves us from parsing through ++ * descriptors .. ++ */ ++ ins->pipe_bulk_idma_out = usb_sndbulkpipe(usb, EP_BULK_IDMA_OUT); ++ ins->pipe_bulk_data_out = usb_sndbulkpipe(usb, EP_BULK_DATA_OUT); ++ ins->pipe_bulk_data_in = usb_rcvbulkpipe(usb, EP_BULK_DATA_IN); ++ ins->pipe_iso_data_in = usb_rcvisocpipe(usb, EP_ISOC_DATA_IN); ++ ins->pipe_int_in = usb_rcvintpipe(usb, EP_INT_IN); ++ ++ /* ++ * Make sure we can get all the memory we need ++ */ ++ ins->intr_data = GET_KBUFFER (sizeof (eu_cdc_t)); ++ ++ if ( !ins->intr_data ) ++ { ++ eu_err ("Can't allocate interrupt buffer\n"); ++ goto free_instance; ++ } ++ ++ ins->segmentation_buffer = GET_KBUFFER(OUTGOING_DATA_SIZE); ++ ++ if ( !ins->segmentation_buffer ) ++ { ++ eu_err ("Can't allocate segmentation buffer\n"); ++ goto free_int_buff; ++ } ++ ++ INIT_LIST_HEAD ( &ins->comp_read_q ); ++ ins->comp_read_q_lock = SPIN_LOCK_UNLOCKED; ++ ++#ifdef USEBULK ++ nb_frames = 0; ++#else ++ nb_frames = FRAMES_PER_ISO_URB; ++#endif /* USEBULK */ ++ ++ /* ++ * Get a lookaside cache ++ */ ++ ins->rb_cache = kmem_cache_create ( "eagle-usb", ++ sizeof(eu_rb_t), ++ 0,0, NULL,NULL); ++ ++ if ( !ins->rb_cache ) ++ { ++ eu_err ("eu_init_postfirm : Can't get lookaside cache.\n"); ++ goto free_seg_buff; ++ } ++ ++ for ( i=0; i < INCOMING_Q_SIZE; i++ ) ++ { ++ ins->read_urb[i] = USB_ALLOC_URB ( nb_frames, GFP_ATOMIC ); ++ ++ if ( !ins->read_urb[i] ) ++ { ++ eu_err ("eu_init_postfirm : Can't allocate URB \n"); ++ goto free_urbs; ++ } ++ ++ ins->read_urb[i]->transfer_buffer = NULL; ++ ++ } ++ ++ ++ ins->pOAMCell = GET_KBUFFER(128); ++ if (ins->pOAMCell == 0 ) ++ { ++ eu_err ("eu_init_postfirm : Can't allocate memory\n"); ++ goto free_urbs; ++ } ++ ++ ins->mru = 0; ++ ++ /* ++ * Initialize the CTRL URB queue ++ */ ++ ret = alloc_queued_urb_ctrl ( ins, CTRL_URB_Q_SIZE ); ++ ++ if (ret != 0) ++ { ++ eu_err ("eu_init_postfirm : alloc_queued_urb_ctrl out of memory\n"); ++ goto free_oam_cell; ++ } ++ ++ INIT_LIST_HEAD(&ins->ctrl_urb_ipg_q); ++ ins->ctrl_q_lock = SPIN_LOCK_UNLOCKED; ++ ins->ctrl_urb_failed= FALSE; ++ ++ /* ++ * Initialize needed kernel timers. ++ * WatchdogTimer is the "management entity", responsible for initiating a regular ++ * status check of the modem ++ */ ++ init_timer(&ins->AdiModemSm.timerSM); ++ ins->AdiModemSm.timerSM.function = WatchdogTimer; ++ ins->AdiModemSm.timerSM.data = (unsigned long) ins; ++ ++ /* ++ * As UHCI does not allow to queue control urbs, we make our own queueing ++ */ ++ init_timer(&ins->ctrl_urb_q_timer); ++ ins->ctrl_urb_q_timer.function = ctrl_urb_q_watcher; ++ ins->ctrl_urb_q_timer.data = (unsigned long) ins; ++ ++ init_timer (&ins->ctrl_urb_retry); ++ ins->ctrl_urb_retry.function = ctrl_urb_retry_send; ++ ins->ctrl_urb_retry.data = (unsigned long) ins; ++ ins->ctrl_urb_failed = NULL; ++ ++ ++ /* ++ * Get interrupt urb ++ */ ++ ins->urb_int = USB_ALLOC_URB ( 0, GFP_ATOMIC ); ++ ++ if ( !ins->urb_int ) ++ { ++ eu_err ("eu_init_postfirm : Can't allocate INT URB \n"); ++ goto free_oam_cell; ++ } ++ ++ ++ /* ++ * Get write urb ++ */ ++ ins->urb_write = USB_ALLOC_URB ( 0, GFP_ATOMIC ); ++ ++ if ( !ins->urb_write ) ++ { ++ eu_err ("eu_init_postfirm : Can't allocate WRITE URB \n"); ++ goto free_urb_int; ++ } ++ ++ /* ++ * Get oam_write urb ++ */ ++ ins->urb_oam_write = USB_ALLOC_URB ( 0, GFP_ATOMIC ); ++ ++ if ( !ins->urb_oam_write ) ++ { ++ eu_err ("eu_init_postfirm : Can't allocate OAM WRITE URB \n"); ++ goto free_urb_write; ++ } ++ ++ ++ /* ++ * Other init stuff ++ */ ++ ins->AdiModemSm.HeartbeatCounter = 0; ++ ins->AdiModemSm.CurrentAdiState = STATE_JUST_PLUGGED_IN; ++ ++ init_timer(&ins->OAMTimer); ++ ins->OAMTimer.function = OAMTimerFunction; ++ ins->OAMTimer.data = (unsigned long)ins; ++ ++ ++ /* ++ * Interface 1 is for outbound traffic ++ */ ++ tmp = USB_DRIVER_CLAIM_INTERFACE(&eu_driver, GET_INTF_PTR(usb,1), ins); ++ if ( tmp != 0 ) ++ { ++ eu_report ("Failed to claim interface 1 (%d)\n",-tmp); ++ goto free_oam_timer; ++ } ++ ++ ++ /* ++ * Interface 2 is for inbound traffic ++ */ ++ tmp = USB_DRIVER_CLAIM_INTERFACE(&eu_driver, GET_INTF_PTR(usb,2), ins); ++ if ( tmp != 0 ) ++ { ++ eu_report ("Failed to claim interface 2 (%d)\n",-tmp); ++ goto release_intf_1; ++ } ++ ++#ifndef USEBULK ++ ++ /* ++ * Set alternate interface to 8, which is ISO transport ++ * with the max. packet size ( about 1007 bytes) ++ */ ++ if (usb_set_interface(usb, USB_INTF_IN, FASTEST_ISO_INTF) < 0) ++ { ++ eu_err ("usb_set_interface failed on iso alt 8\n"); ++ } ++#endif /* USEBULK */ ++ ++ ++ /* ++ * Setup our /proc interface ++ */ ++ snprintf ( path,32,"%03d-%03d",ins->usbdev->bus->busnum, ins->usbdev->devnum); ++ ++ procfile=create_proc_read_entry(path,0, eu_procdir, eu_read_proc, ins); ++ ++ if (procfile) ++ { ++ procfile->owner=THIS_MODULE; ++ eu_report ("created proc entry at : /proc/driver/eagle-usb/%s\n", ++ path); ++ } ++ else ++ { ++ eu_err ("failed to create proc entry at : /proc/driver/%s !\n", ++ path); ++ } ++ ++ /* ++ * Get MAC address ++ */ ++ eu_get_mac_addr ( ins ); ++ ++ ++ /* ++ * Initialize wait queue ++ */ ++ init_waitqueue_head (&ins->thr_wait); ++ ++ if ( if_name ) ++ { ++ strncpy ( ins->if_name, if_name, IFNAMSIZ-1); ++ ins->if_name[IFNAMSIZ-1] = '\0'; ++ } ++ ++ /* ++ * Initialize tasklets ++ */ ++ tasklet_init ( &ins->rcv_complete_tasklet, ++ eu_process_rcv, ++ (unsigned long) ins ); ++#ifdef LINUX_2_6 ++ /* ++ * And work ++ */ ++ INIT_WORK (&ins->create_eth,eu_eth_create, ins); ++#endif ++ ++ /* ++ * And boot SM ++ */ ++#ifdef LINUX_2_6 ++ INIT_WORK (&ins->boot_sm, eu_boot_sm, ins); ++#elif defined(LINUX_2_4) ++ INIT_TQUEUE (&ins->boot_sm, eu_boot_sm, ins); ++#endif ++ ++ /* ++ * And boot state ++ */ ++ ins->boot_state = PRE_BOOT; ++ ++ ++ /* ++ * We're successfull !!!! ++ */ ++ goto byebye; ++ ++ release_intf_1: ++ usb_driver_release_interface(&eu_driver, GET_INTF_PTR(usb,1)); ++ ++ free_oam_timer: ++ if ( timer_pending ( &ins->OAMTimer ) ) ++ { ++ del_timer ( &ins->OAMTimer ); ++ } ++ ++ free_urb_write: ++ usb_free_urb ( ins->urb_write ); ++ ins->urb_write = NULL; ++ ++ free_urb_int: ++ usb_free_urb ( ins->urb_int ); ++ ins->urb_int = NULL; ++ ++ free_oam_cell: ++ FREE_KBUFFER (ins->pOAMCell ); ++ ++ free_urbs: ++ ++ for ( i=0; i < INCOMING_Q_SIZE; i++ ) ++ { ++ if ( ins->read_urb[i] ) { ++ usb_free_urb ( ins->read_urb[i] ); ++ ins->read_urb[i] = NULL; ++ } ++ else ++ { ++ break; ++ } ++ } ++ ++ kmem_cache_destroy ( ins->rb_cache ); ++ ++ free_seg_buff: ++ FREE_KBUFFER ( ins->segmentation_buffer ); ++ ++ free_int_buff: ++ FREE_KBUFFER ( ins->intr_data ); ++ ++ free_instance: ++ FREE_KBUFFER (ins); ++ ++ byebye: ++ eu_leaves ( DBG_INIT); ++ return (ins); ++ ++} ++ ++ ++/** ++ * eu_disconnect - Disconnect an USB device from the system ++ * ++ * @usb - USB Device to disconnect ++ * @ptr - User Data ( pointer to associated instance ) ++ * ++ */ ++#ifdef LINUX_2_4 ++static void eu_disconnect ( struct usb_device *usb, void *ptr ) ++#elif defined(LINUX_2_6) ++static void eu_disconnect ( struct usb_interface *intf ) ++#endif ++{ ++#ifdef LINUX_2_4 ++ eu_instance_t *ins = (eu_instance_t *)ptr; ++#elif defined (LINUX_2_6) ++ eu_instance_t *ins = usb_get_intfdata (intf); ++ struct usb_device *usb = interface_to_usbdev (intf); ++#endif ++ ++ uint32_t pid = usb->descriptor.idProduct; ++ ++ eu_enters (DBG_INIT); ++ ++ /* ++ * We can't do anything if we don't have a valid eu_instance_t pointer ++ */ ++ if (ins == NULL) ++ { ++ eu_err ("eu_disconnect : No device.\n"); ++ goto dis_done; ++ } ++ ++ /* ++ * Do nothing if you also have no usbdev associated ++ */ ++ if (ins->usbdev == NULL ) ++ { ++ eu_dbg (DBG_INIT,"No usb dev associated.\n"); ++ goto dis_done; ++ } ++ ++ ++ EU_SET_FLAG (ins, EU_UNPLUG); ++ ++ switch (pid) ++ { ++ case CASE_PREFIRM: ++ ++ list_del(&ins->list); ++ ++ FREE_KBUFFER(ins); ++ ++ eu_report ("Pre-firmware modem removed\n"); ++ break; ++ ++ case CASE_POSTFIRM: ++ ++ ins->usbdev = NULL; ++ ++#ifdef LINUX_2_6 ++ usb_set_intfdata (intf, NULL); ++#endif ++ eu_disconnect_postfirm (ins,usb); ++ break; ++ } ++ ++ ++dis_done: ++ eu_leaves (DBG_INIT); ++} ++ ++ ++/** ++ * eu_disconnect_postfirm - Perform destruction of a postfirmware device ++ * ++ * @ins - Instance to destroy ++ * ++ */ ++static void eu_disconnect_postfirm ( eu_instance_t *ins , struct usb_device *usb ) ++{ ++ int i; ++ char path[32]; ++ ++ ++ /* ++ * If timers are currently running, delete them: ++ */ ++ if ( timer_pending (&ins->AdiModemSm.timerSM) ) ++ { ++ del_timer ( &ins->AdiModemSm.timerSM ); ++ } ++ ++ if ( timer_pending (&ins->ctrl_urb_q_timer) ) ++ { ++ del_timer ( &ins->ctrl_urb_q_timer ); ++ } ++ ++ if ( timer_pending (&ins->ctrl_urb_retry) ) ++ { ++ del_timer ( &ins->ctrl_urb_retry ); ++ } ++ ++ /* ++ * Flush all pending task ... ++ */ ++ EU_FLUSH (eu_>boot_sm); ++ ++ /* ++ * Unlink pending interrupt URBs ++ */ ++ if ( EU_TEST_FLAG ( ins, EU_HAS_INT ) ) ++ { ++ ins->urb_int->transfer_flags &= ~URB_ASYNC_UNLINK; ++ usb_unlink_urb(ins->urb_int); ++ usb_free_urb (ins->urb_int); ++ } ++ ++ /* ++ * Free the DSP code: ++ */ ++ ++ ++ /* ++ * FIXME : don't duplicate DSP code for every modem ? ++ */ ++ FreeDspData ( &ins->MainPage, &ins->pSwapPages, &ins->SwapPageCount ); ++ ++ if ( timer_pending ( &ins->OAMTimer ) ) ++ { ++ del_timer ( &ins->OAMTimer ); ++ } ++ ++ ++ /* ++ * Remove our network interface from the kernel: ++ */ ++ ++ if ( ins->eth ) ++ { ++ /* ++ * This will call the eu_close method: ++ */ ++ unregister_netdev ( ins->eth ); ++ kfree ( ins->eth ); ++ ins->eth = NULL; ++ } ++ ++ EU_CLEAR_FLAG (ins, EU_ETH_REGISTERED); ++ ++ ++ /* ++ * Free memory we alloced ++ */ ++ FREE_KBUFFER ( ins->intr_data ); ++ ++ for ( i=0; iread_urb[i] ) && ++ ( ins->read_urb[i]->transfer_buffer ) ) ++ { ++ kmem_cache_free ( ins->rb_cache, ++ GET_RBUF (ins->read_urb[i]) ); ++ } ++ ++ if ( ins->read_urb[i] ) ++ { ++ ins->read_urb[i]->transfer_flags &= ~URB_ASYNC_UNLINK; ++ usb_unlink_urb ( ins->read_urb[i] ); ++ usb_free_urb ( ins->read_urb[i] ); ++ ins->read_urb[i] = NULL; ++ } ++ } ++ ++ kmem_cache_destroy ( ins->rb_cache ); ++ ++ ++ tasklet_kill ( &ins->rcv_complete_tasklet); ++ ++ ++ FREE_KBUFFER ( ins->pOAMCell ); ++ ++ unlink_ipg_ctrl_urb ( ins ); ++ free_queued_urb_ctrl (&ins->ctrl_urb_free_q); ++ free_queued_urb_ctrl (&ins->ctrl_urb_ipg_q); ++ ++ /* ++ * Free write urb: it has been unlinked in eu_eth_close ++ */ ++ ins->urb_write->transfer_flags &= ~URB_ASYNC_UNLINK; ++ usb_unlink_urb ( ins->urb_write ); ++ usb_free_urb ( ins->urb_write ); ++ ++ /* ++ * Free urb_oam_write ++ */ ++ ins->urb_oam_write->transfer_flags &= ~URB_ASYNC_UNLINK; ++ usb_unlink_urb(ins->urb_oam_write); ++ usb_free_urb ( ins->urb_oam_write ); ++ ++ ++ /* ++ * Tell usb that we no longer claim these interfaces as our property ++ */ ++ ++#if 0 ++ /* ++ * Release interrupt interface ++ */ ++ usb_driver_release_interface ( &eu_driver, GET_INTF_PTR (usb,0) ); ++ ++ /* ++ * Release outbound interface ++ */ ++ usb_driver_release_interface ( &eu_driver, GET_INTF_PTR (usb,1) ); ++ ++ /* ++ * Release inbound interface ++ */ ++ usb_driver_release_interface ( &eu_driver, GET_INTF_PTR (usb,2) ); ++#endif ++ ++#if 0 ++ if ( ins->pDriverCMVs ) ++ { ++ FREE_VBUFFER ( ins->pDriverCMVs ); ++ } ++#endif ++ ++ list_del ( &ins->list ); ++ ++ snprintf ( path,32,"%03d-%03d",usb->bus->busnum, usb->devnum ); ++ remove_proc_entry ( path, eu_procdir ); ++ ++ FREE_KBUFFER ( ins ); ++ ++ eu_report ("ADSL device removed\n"); ++} ++ ++ ++/*******************************************************************************/ ++/* eu_irq */ ++/*******************************************************************************/ ++static USB_COMPLETION_PROTO (eu_irq,urb,regs) ++{ ++ eu_instance_t *ins; ++ ++ eu_enters (DBG_INTS); ++ ++ /* ++ * Instance is in the URB context. ++ */ ++ ins = (eu_instance_t *)urb->context; ++ ++ if ( NULL == ins ) ++ { ++ eu_err ("eu_irq : No device.\n"); ++ goto irq_done; ++ } ++ ++ if ( !EU_TEST_FLAG(ins, EU_HAS_INT) ) ++ { ++ eu_err ("eu_irq : Callback on unregistered interrupt handler!\n"); ++ goto irq_done; ++ } ++ ++ if ( ++ ( urb->status == -ENOENT ) || ++ ( urb->status == -ECONNRESET ) || ++ ( urb->status == -ESHUTDOWN ) ++ ) ++ { ++ /* ++ * User cancelled this URB : do nothing, and don't reset status to 0, ++ * or the URB will be re-used ++ */ ++ eu_report ("eu_irq : URB canceled by user.\n"); ++ EU_CLEAR_FLAG (ins, EU_HAS_INT); ++ ++ goto irq_done; ++ } ++ ++ /* ++ * Lets check the status first, to make sure this was succesfull ++ */ ++ if ( urb->status < 0 ) ++ { ++ eu_err ("eu_irq : URB status indicates error (%d)\n", ++ urb->status); ++ urb->status = 0; ++ goto resubmit; ++ } ++ ++ /* ++ * All is well, we can process the data! ++ */ ++ if ( ins->intr_data->bRequestType == 0x08 ) /* device-to-host interrupt */ ++ { ++ eu_devint_t *pintr; ++ ++ pintr = (eu_devint_t *) (&(ins->intr_data->data[0])); ++ ++ switch ( cpu_to_le16 (pintr->intr) ) ++ { ++ case EU_INT_LOADSWAPPAGE: ++ { ++ ins->swap_data = cpu_to_le16 (pintr->intr_info.swap_data); ++ ++ eu_dbg (DBG_INTS,"interrupt = EU_INT_LOADSWAPPAGE\n"); ++ ++ if ( ins->AdiModemSm.CurrentAdiState != STATE_HARD_RESET_INITIATE ) ++ { ++ ins->boot_state = UPLOAD_P; ++ EU_SCHEDULE ( &ins->boot_sm ) ; ++ } ++ } ++ break; ++ ++ case EU_INT_INCOMINGCMV: ++ { ++ eu_dbg (DBG_INTS,"interrupt = EU_INT_INCOMINGCMV\n"); ++ ++ ProcessIncomingCmv ( ins, pintr->intr_info.cmv_data ); ++ } ++ break; ++ ++ default: ++ eu_dbg (DBG_INTS,"interrupt = unsupported(%d)\n", pintr->intr); ++ ++ break; ++ } ++ } ++ ++ resubmit: ++ ++#ifdef LINUX_2_6 ++ { ++ int ret; ++ ++ ret = USB_SUBMIT_URB ( urb, GFP_ATOMIC ); ++ if ( ret ) ++ { ++ eu_err ("eu_irq: URB submission failure (%d)\n",ret); ++ } ++ } ++ ++#endif ++ ++ irq_done: ++ eu_leaves (DBG_INTS); ++ ++} ++ ++ ++/** ++ * find_hardware - Look for the given hardware in instance list ++ * ++ */ ++static eu_instance_t *find_hardware ( struct usb_device *dev ) ++{ ++ struct list_head *ptr; ++ eu_instance_t *ins = NULL; ++ ++ for ( ptr = modem_list.next; ptr != &modem_list; ptr = ptr->next ) ++ { ++ eu_instance_t *entry; ++ entry=list_entry (ptr, eu_instance_t, list); ++ if ( entry->usbdev == dev ) ++ { ++ ins=entry; ++ break; ++ } ++ } ++ ++ return ins; ++} ++ ++ ++/** ++ * eu_user - ioctl handler for ioctl emited on the USB device file. Ioctls emited ++ * on the network device will be treated by eu_eth_ioctl ++ */ ++#ifdef LINUX_2_4 ++static int eu_user ( struct usb_device *dev, unsigned int code, void *buf ) ++#elif defined (LINUX_2_6) ++static int eu_user ( struct usb_interface *intf, unsigned int code, void *buf ) ++#endif ++{ ++#ifdef LINUX_2_6 ++ struct usb_device *dev = interface_to_usbdev (intf); ++#endif ++ eu_instance_t *ins; ++ int retval = -ENOTTY; ++ uint32_t pid = dev->descriptor.idProduct; ++ ++ /* ++ * USB automatically transfers user ioctl structure in kernel ++ * address space (the size is already encoded in the ioctl code): ++ */ ++ struct eu_ioctl_info *pIOCTLinfo = (struct eu_ioctl_info *) buf; ++ ++ MODULE_USER_GET; ++ ++ ++ if ( !(ins = find_hardware(dev)) ) ++ { ++ eu_report ("Could not find eu_instance_t for USB device %03d/%03d\n", ++ dev->bus->busnum, dev->devnum); ++ MODULE_USER_RELEASE; ++ ++ return -ENOTTY; ++ } ++ ++ /* ++ * Set/Get debug flags works for pre/post firmwares. ++ */ ++ if ( code == EU_IO_SETDBG ) ++ { ++ if ( NULL == pIOCTLinfo ) ++ { ++ eu_err ("EU_IO_SETDBG : No data\n"); ++ retval = -EINVAL; ++ goto byebye; ++ } ++ ++ module_dbg_mask = pIOCTLinfo->idma_start; ++ eu_report ("Debug mask set to 0x%x\n",module_dbg_mask); ++ retval = 0; ++ goto byebye; ++ } ++ ++ if ( code == EU_IO_GETDBG ) ++ { ++ if ( NULL == pIOCTLinfo ) ++ { ++ eu_err ("EU_IO_GETDBG : No data\n"); ++ retval = -EINVAL; ++ goto byebye; ++ } ++ ++ pIOCTLinfo->idma_start = module_dbg_mask; ++ retval = 0; ++ goto byebye; ++ } ++ ++ /* Check this ioctl if for one of our devices: */ ++ switch (pid) ++ { ++ case CASE_PREFIRM: ++ eu_err ("In pre-firmware mode only get/set debug ioctl is permitted.\n"); ++ retval = -EINVAL; ++ break; ++ case CASE_POSTFIRM: ++ switch (code) ++ { ++#if 0 ++ case EU_IO_CMVS: ++ retval = -ERESTARTSYS; ++ if ( !spin_trylock ( &ins->net_lock ) ) ++ { ++ eu_err ("EU_IO_CMVS : Can't lock\n"); ++ break; ++ } ++ ++ if ( ins->flags & EU_OPEN ) ++ { ++ retval = -EBUSY; ++ eu_err ("EU_IO_CMVS : Eth device already open.\n"); ++ goto end_set_cmvs; ++ } ++ ++ ++ if (NULL == pIOCTLinfo) ++ { ++ eu_err ("EU_IO_CMVS : No data.\n"); ++ retval = -EFAULT; ++ goto end_set_cmvs; ++ } ++ ++ if (pIOCTLinfo->buffer == NULL ) ++ { ++ eu_err ("EU_IO_CMVS: Null input buffer\n"); ++ retval = -EINVAL; ++ goto end_set_cmvs; ++ } ++ ++ if ( pIOCTLinfo->buffer_size == 0 ) ++ { ++ eu_err ("EU_IO_CMVS: Invalid Buffersize\n"); ++ retval = -EINVAL; ++ goto end_set_cmvs; ++ } ++ ++ /* Get a buffer for CMVs */ ++ eu_dbg (DBG_INIT,"Allocating %d bytes for CMVs\n",pIOCTLinfo->buffer_size); ++ ++ ins->pDriverCMVs = GET_VBUFFER (pIOCTLinfo->buffer_size); ++ if ( ins->pDriverCMVs == NULL ) ++ { ++ eu_err ("EU_IO_CMVS: Not enough memory to get %d bytes\n", ++ pIOCTLinfo->buffer_size); ++ retval = -ENOMEM; ++ goto end_set_cmvs; ++ } ++ ++ ++ if (copy_from_user(ins->pDriverCMVs, pIOCTLinfo->buffer, pIOCTLinfo->buffer_size)) ++ { ++ retval = -EFAULT; ++ FREE_VBUFFER (ins->pDriverCMVs); ++ eu_err ("EU_IO_CMVS : copy from user failed.\n"); ++ goto end_set_cmvs; ++ } ++ ++ ++ eu_report ("ioctl EU_IO_CMVS received and treated.\n"); ++ retval = 0; ++ ++ end_set_cmvs: ++ spin_unlock ( &ins->net_lock); ++ ++ break; ++#endif ++ ++ case EU_IO_OPTIONS: /* Set driver options */ ++ /* ++ * Option cannot be set while network interface is up ++ */ ++ ++ ++#if 0 ++ if ( ins->pDriverCMVs == NULL ) ++ { ++ /* User as not yet sent EU_IO_CMVS */ ++ eu_err ("EU_IO_OPTIONS: CMVs not yet sent.\n"); ++ retval = -ERESTARTSYS; ++ goto end_set_options; ++ } ++#endif ++ ++ if (!( EU_TEST_FLAG (ins, EU_OPEN ) ) ) ++ { ++ eu_options_t opt; ++ ++ memcpy(&opt, &default_options, sizeof(eu_options_t)); ++ ++ if (NULL == pIOCTLinfo) ++ { ++ eu_err ("EU_IO_OPTIONS : No data.\n"); ++ retval = -EFAULT; ++ break; ++ } ++ ++ /* Check the option array size: */ ++ if (sizeof(opt) != pIOCTLinfo->buffer_size) ++ { ++ eu_err ("EU_IO_OPTIONS : Invalid Data size\n"); ++ retval = -EINVAL; ++ break; ++ } ++ ++ if (copy_from_user(&opt, pIOCTLinfo->buffer, sizeof(opt))) ++ { ++ retval = -EFAULT; ++ eu_err ("EU_IO_OPTIONS : copy from user failed.\n"); ++ break; ++ } ++ ++ ++ /* Options retrieved, check them: */ ++ if ( eu_check_options ( opt ) ) ++ { ++ /* OK, initialize Mpoa and Msg: */ ++ eu_report ("ioctl EU_IO_OPTIONS received\n"); ++ ++ /* ++ * Initialize the message handling ++ */ ++ if ( !spin_trylock ( &ins->lock ) ) ++ { ++ eu_err ("EU_IO_OPTIONS : Can't lock\n"); ++ retval = -ERESTARTSYS; ++ break; ++ } ++ ++ eu_msg_initialize ( ins, opt ); ++ MpoaInitialize(ins, opt); ++ ++ EU_SET_FLAG (ins, EU_MSG_INITIALIZED); ++ ++ spin_unlock ( &ins->lock ); ++ ++ retval = 0; ++ } ++ } ++ else ++ { ++ retval = -EBUSY; ++ eu_err ("EU_IO_OPTIONS : Eth device already open.\n"); ++ } ++ ++ ++ break; ++ ++ case EU_IO_DSP: ++ /* ++ * Load DSP code ++ */ ++ ++ if ( !EU_TEST_FLAG (ins, EU_MSG_INITIALIZED) ) ++ { ++ eu_err ("Message handling not initialized." ++ " Please send options.\n"); ++ retval = -EINVAL; ++ break; ++ } ++ ++ if ( !EU_TEST_FLAG( ins, EU_OPEN ) ) ++ { ++ uint8_t *pBuf = NULL; ++ IDMAPage MainPage; ++ IDMAPage *pSwapPages; ++ uint32_t SwapPageCount; ++ ++ if (NULL == pIOCTLinfo) ++ { ++ eu_err ("EU_IO_DSP : No data.\n"); ++ retval = -EFAULT; ++ break; ++ } ++ ++ if (pIOCTLinfo->idma_start >= pIOCTLinfo->buffer_size) ++ { ++ eu_err ("EU_IO_DSP : Invalid Data Size\n"); ++ retval = -EFAULT; ++ break; ++ } ++ ++ pBuf = GET_VBUFFER(pIOCTLinfo->buffer_size); ++ ++ if (NULL == pBuf) ++ { ++ eu_err ("EU_IO_DSP : No memory.\n"); ++ retval = -ENOMEM; ++ break; ++ } ++ ++ if (copy_from_user(pBuf, pIOCTLinfo->buffer, pIOCTLinfo->buffer_size)) ++ { ++ eu_err ("EU_IO_DSP : copy from user failed.\n"); ++ retval = -EFAULT; ++ goto free_adsl_dsp; ++ } ++ ++ /* ++ * Get our DSP code ready for IDMA booting ++ */ ++ eu_report ("ioctl EU_IO_DSP received\n"); ++ ++ ++ if ( EU_TEST_FLAG( ins, EU_DSP_IPG ) ) ++ { ++ retval = -ERESTARTSYS; ++ goto free_adsl_dsp; ++ } ++ ++ EU_SET_FLAG (ins, EU_DSP_IPG); ++ ++ retval = ProcessDSPCode ( ins, ++ pBuf, ++ pIOCTLinfo->idma_start, ++ pIOCTLinfo->buffer_size, ++ &MainPage, ++ &pSwapPages, ++ &SwapPageCount ++ ); ++ ++ if (retval != 0) ++ { ++ eu_err ("EU_IO_DSP : ProcessDSPCode failed (%d)\n", ++ retval); ++ FreeDspData ( &MainPage, &pSwapPages, &SwapPageCount ); ++ goto free_adsl_dsp; ++ } ++ ++ EU_SET_FLAG (ins, EU_DSP_LOADED); ++ ++ /* ++ * Flush all pending task ... ++ */ ++ EU_FLUSH (eu_>boot_sm); ++ ++ ++ /* ++ * Ok, we got our DSP code, replace the old DSP code by ++ * the new one: ++ */ ++ ++ FreeDspData ( &ins->MainPage, &ins->pSwapPages, &ins->SwapPageCount ); ++ ++ ins->MainPage.BlockCount = MainPage.BlockCount; ++ ins->MainPage.Blocks = MainPage.Blocks; ++ ins->pSwapPages = pSwapPages; ++ ins->SwapPageCount = SwapPageCount; ++ ++ ++ /* ++ * Load the DSP code if necessary: ++ */ ++ eu_report ("Loading DSP code to device...\n"); ++ ++ ++ if ( !EU_TEST_FLAG(ins, EU_HAS_INT) ) ++ { ++ /* ++ * Get the USB endpoint for IDMA uploading: ++ */ ++#ifdef LINUX_2_4 ++ struct usb_endpoint_descriptor *epint = ++ GET_INTF_PTR (dev,0)->altsetting[0].endpoint + 0; ++ uint8_t interval = epint->bInterval; ++#elif defined(LINUX_2_6) ++ uint8_t interval = ++ GET_INTF_PTR (dev,0)->altsetting[0].endpoint[0].desc.bInterval; ++#endif ++ /* ++ * Install the interrupt handler to send IDMA pages to the modem ++ * and handle further incoming data ++ */ ++ usb_fill_int_urb ( ins->urb_int, dev, ins->pipe_int_in, ins->intr_data, ++ sizeof(eu_cdc_t), eu_irq, ins, interval ); ++ ++ EU_SET_FLAG (ins, EU_HAS_INT); ++ ++ if ( USB_SUBMIT_URB ( ins->urb_int , GFP_KERNEL ) < 0 ) ++ { ++ eu_err ("Unable to submit interrupt URB!\n"); ++ retval = -EIO; ++ EU_CLEAR_FLAG (ins, EU_HAS_INT); ++ goto free_adsl_dsp; ++ } ++ ++ } ++ ++ EU_CLEAR_FLAG (ins, EU_DSP_IPG); ++ ++ /* ++ * Send the DSP code to the modem: ++ */ ++ ins->boot_state = PRE_BOOT; ++ if ( !EU_TEST_FLAG(ins,EU_HAS_INT) || boot_the_modem (ins) != 0) ++ { ++ eu_err ("Unable to load DSP code to device!\n"); ++ ++ goto free_adsl_dsp; ++ } ++ else ++ { ++ eu_report ("DSP code successfully loaded to device\n"); ++ } ++ ++ retval = 0; ++ ++ free_adsl_dsp: ++ FREE_VBUFFER(pBuf); ++ } ++ else ++ { ++ retval = -EBUSY; ++ eu_err ("EU_IO_DSP : Eth device already open\n"); ++ } ++ break; ++ ++ case EU_IO_GETITF: /* Get the network interface name */ ++ { ++ uint32_t length; ++ ++ if (NULL == pIOCTLinfo) ++ { ++ eu_err ("EU_IO_GETITF : No data.\n"); ++ retval = -EFAULT; ++ break; ++ } ++ ++ if ( !ins->eth ) ++ { ++ eu_err ("EU_IO_GETIF: eth not yet created !!\n"); ++ retval = -EFAULT; ++ break; ++ } ++ ++ length = strlen(ins->eth->name) + sizeof(char); ++ if ( NULL == pIOCTLinfo->buffer ) ++ { ++ /* Get the requested size */ ++ pIOCTLinfo->buffer_size = length; ++ retval = 0; ++ } ++ else ++ { ++ /* Get the interface name */ ++ if ( pIOCTLinfo->buffer_size < length ) ++ { ++ eu_err ("EU_IO_GETITF : Invalid Buffer size\n"); ++ retval = -EINVAL; ++ break; ++ } ++ ++ if ( copy_to_user ( pIOCTLinfo->buffer, ins->eth->name, length ) != 0 ) ++ { ++ eu_err ("EU_IO_GETITF : copy to user failed\n"); ++ retval = -EFAULT; ++ break; ++ } ++ retval = 0; ++ } ++ break; ++ } ++ break; ++ ++ case EU_IO_SYNC: /* Wait for modem "operational" state */ ++ if (wait_event_interruptible(ins->sync_q, ++ ((ins->AdiModemSm.CurrentAdiState & STATE_OPERATIONAL) == STATE_OPERATIONAL))) ++ retval = -EINTR; ++ else ++ retval = 0; ++ break; ++ ++ default: ++ /* Bad ioctl */ ++ break; ++ } ++ break; ++ default: ++ /* Bad device */ ++ break; ++ } ++ ++ byebye: ++ MODULE_USER_RELEASE; ++ return retval; ++} ++ ++/** ++ * eu_read_proc - /proc interface. ++ * ++ */ ++static int eu_read_proc ( char *page, ++ char **start, ++ off_t off, ++ int count, ++ int *eof, ++ void *data ++ ) ++{ ++ eu_instance_t *ins = (eu_instance_t *)data; ++ int size; ++ char *p = page; ++ /* ++ * If this output needs to be larger than 4K (PAGE_SIZE), we need to do this ++ * differently ++ */ ++ p += sprintf(p, "eagle-usb status display\n"); ++ p += sprintf(p, "-------------------------------------------------------------\n"); ++ p += sprintf(p, "Driver version %s\n",EAGLEUSBVERSION); ++ p += sprintf(p, "USB Bus : %03d\t USB Device : %03d\t Dbg mask: 0x%x\n", ++ ins->usbdev->bus->busnum, ins->usbdev->devnum, module_dbg_mask); ++ if (ins->eth->name) ++ { ++ p += sprintf(p, "Ethernet Interface : %s\n",ins->eth->name); ++ } ++ else ++ { ++ p += sprintf(p, "Ethernet Interface : none\n"); ++ } ++ p += sprintf(p, "MAC: %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n", ++ ins->mac[0],ins->mac[1],ins->mac[2],ins->mac[3],ins->mac[4], ++ ins->mac[5]); ++ ++ p += sprintf(p, "Tx Rate %10.10d Rx Rate %10.10d Crc %10.10d\n", ++ ins->AdiModemSm.UpRate / 1024, ++ ins->AdiModemSm.DownRate / 1024, ++ ins->Statistics[STAT_CELLS_LOST_CRC]); ++ p += sprintf(p, "FEC %10.10d Margin %10.10d Atten %10.10d dB\n", ++ ins->AdiModemSm.stats_Uncorr_Blks, ++ ins->AdiModemSm.stats_Cur_SNR & 0xFF, ++ (ins->AdiModemSm.stats_Cur_Atten & 0xFF)/2); ++ p += sprintf(p, "VID-CPE %10.10d VID-CO %10.10d HEC %10.10d\n", ++ ins->AdiModemSm.INFO14, ++ ins->AdiModemSm.INFO08, ++ ins->AdiModemSm.DIAG03); ++ ++ p += sprintf(p, "VPI %10.10d VCI %10.10d Delin ", ++ ins->Vc.vpi, ins->Vc.vci); ++ ++ /*Delineation is the only one where we print a string instead of a number*/ ++ if (ins->AdiModemSm.flags & 0x0C00) ++ p += sprintf(p, "ERROR\n"); ++ else ++ if (ins->AdiModemSm.flags & 0x0030) ++ p += sprintf(p, " LOSS\n"); ++ else ++ p += sprintf(p, " GOOD\n"); ++ p += sprintf(p, "Cells Rx %10.10d Cells Tx %10.10d\n", ++ ins->Statistics[STAT_CELLS_RX], ++ ins->Statistics[STAT_CELLS_TX]); ++ p += sprintf(p, "Pkts Rx %10.10d Pkts Tx %10.10d\n", ++ ins->Statistics[STAT_PAKTS_RX], ++ ins->Statistics[STAT_PAKTS_TX]); ++ p += sprintf(p, "OAM %10.10d Bad VPI %10.10d Bad CRC %10.10d\n", ++ ins->Statistics[STAT_CELLS_OAM_RCVD], ++ ins->Statistics[STAT_CELLS_LOST_VPIVCI], ++ ins->Statistics[STAT_CELLS_LOST_CRC] ++ ); ++ p += sprintf(p, "Oversiz. %10.10d\n\n", ++ ins->Statistics[STAT_CELLS_LOST_OTHER] ); ++ ++ switch (ins->AdiModemSm.CurrentAdiState) ++ { ++ case STATE_UNDEFINED: ++ p += sprintf(p, "Modem is unplugged from USB.\n"); ++ break; ++ case STATE_JUST_PLUGGED_IN: ++ p += sprintf(p, "Modem waiting for driver response.\n"); ++ p += sprintf (p,"Please send DSP (eaglectrl -d)\n"); ++ break; ++ case STATE_UNTRAIN: ++ case STATE_UNTRAIN_TX: ++ case STATE_UNTRAIN_RX: ++ p += sprintf(p, "Modem is initializing(UNTRAIN)\n"); ++ break; ++ case STATE_INITIALIZING: ++ case STATE_INITIALIZING_TX: ++ case STATE_INITIALIZING_RX: ++ p += sprintf(p, "Modem is initializing(INITIALIZING)\n"); ++ break; ++ case STATE_HARD_RESET_INITIATE: ++ case STATE_HARD_RESET_END: ++ case STATE_BOOT_WAIT: ++ case STATE_BOOT_STAGE_1: ++ case STATE_BOOT_STAGE_2: ++ case STATE_BOOT_STAGE_3: ++ p += sprintf(p, "Modem is booting\n"); ++ break; ++ case STATE_OPERATIONAL: ++ case STATE_OPERATIONAL_TX: ++ case STATE_OPERATIONAL_RX: ++ p += sprintf(p, "Modem is operational\n"); ++ break; ++ case STATE_STALLED_FOREVER: ++ p += sprintf(p, "Modem cannot boot. Unplug other devices and retry.\n"); ++ break; ++ default: ++ p += sprintf(p, "Unhandled state\n"); ++ eu_report ("eu_read_proc: unhandled state 0x%X\n", ins->AdiModemSm.CurrentAdiState); ++ break; ++ } ++ p += sprintf(p, "\n"); ++ /* ++ * Figure out how much of the page we used ++ */ ++ size = p - page; ++ size -= off; ++ ++ if (size < count) ++ { ++ *eof = 1; ++ if (size <= 0) ++ return 0; ++ } ++ else ++ size = count; ++ /* ++ * Fool caller into thinking we started where he told us to in the page ++ */ ++ *start = page + off; ++ return size; ++} ++ ++ ++/** ++ * eu_process_rcv - Process completed receive queue ++ * Called as a tasklet ++ * ++ */ ++static void eu_process_rcv ( unsigned long data ) ++{ ++ eu_instance_t *ins = (eu_instance_t *) data; ++ unsigned long flags; ++/* uint8_t *pbuf; */ ++ eu_rb_t *pbuf; ++#ifdef USEBULK ++ eu_bulk_rb_t *pbulk; ++#else ++ int i; ++ eu_iso_rb_t *piso; ++ eu_iso_frame_t *pf; ++#endif ++ int result; ++ int count = 0; ++ ++ eu_enters( DBG_READ ); ++ ++ ++ if ( ins == NULL ) ++ { ++ eu_err ("eu_process_rcv: Null instance !\n"); ++ return; ++ } ++ ++ ++ /* ++ * Treat all messages in the list ++ */ ++ while ( !list_empty ( &ins->comp_read_q ) ) ++ { ++ /* ++ * Remove head of the list ++ */ ++ spin_lock_irqsave (&ins->comp_read_q_lock, flags); ++ /* ++ * FIXME : we should use a list function ... ++ * if list field position change .. we must be able to find it again ... ++ * ++ */ ++ pbuf = list_entry (ins->comp_read_q.next, eu_rb_t, next); ++ list_del(ins->comp_read_q.next); ++ ++ spin_unlock_irqrestore (&ins->comp_read_q_lock, flags); ++ ++#ifdef USEBULK ++ ++ pbulk = (eu_bulk_rb_t *) pbuf; ++ ++ count ++; ++ ++ result = eu_uni_process_in_data ( ins, &pbulk->data[0], pbulk->length ); ++ if (result) ++ { ++ eu_dbg (DBG_READ,"Error %d from eu_uni_process_in_data\n", result); ++ } ++ ++#else ++ /* ++ * Now process each frame ++ */ ++ piso = (eu_iso_rb_t *) pbuf; ++ pf = &piso->frames[0]; ++ ++ for ( i=0 ; istatus == 0 ) ++ { ++ count ++; ++ ++ result = eu_uni_process_in_data ( ins, ++ &pf->data[0], ++ pf->length ++ ); ++ if ( result != 0 ) ++ { ++ eu_dbg (DBG_READ,"Error %d from eu_uni_process_in_data\n", ++ result); ++ } ++ } ++ ++ pf ++; ++ } ++#endif /* USEBULK */ ++ ++ /* ++ * And free the transfer buffer ++ */ ++ kmem_cache_free ( ins->rb_cache, pbuf ); ++ ++ } ++ eu_dbg( DBG_READ ," %d frames processed.\n",count); ++ ++ eu_leaves ( DBG_READ ); ++ ++} ++ ++ ++/* ------------------------------------ Misc ------------------------------------ */ ++ ++ ++/** ++ * eu_check_options - Check given options are accepted ++ */ ++static int eu_check_options ( const eu_options_t opt ) ++{ ++ int result = 1; ++ if (opt[CFG_ENCAPS].value != MPOA_MODE_BRIDGED_ETH_LLC && ++ opt[CFG_ENCAPS].value != MPOA_MODE_BRIDGED_ETH_VC && ++ opt[CFG_ENCAPS].value != MPOA_MODE_ROUTED_IP_LLC && ++ opt[CFG_ENCAPS].value != MPOA_MODE_ROUTED_IP_VC && ++ opt[CFG_ENCAPS].value != MPOA_MODE_PPPOA_LLC && ++ opt[CFG_ENCAPS].value != MPOA_MODE_PPPOA_VC) ++ result = 0; ++ return result; ++} ++ +diff -urN x/drivers/usb/misc/eagle-usb/eu_msg.c y/drivers/usb/misc/eagle-usb/eu_msg.c +--- x/drivers/usb/misc/eagle-usb/eu_msg.c 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/eu_msg.c 2004-08-30 18:57:39.000000000 +1000 +@@ -0,0 +1,879 @@ ++/* ++ * ++ * Copyright (c) 2003, Frederick Ros (sl33p3r@free.fr) ++ * ++ * eu_msg.c - Message Procol Subsystem. Writen based on Analogic Devices ++ * supplied code. ++ * ++ * This file is part of the eagle-usb driver package. ++ * ++ * eagle-usb driver package is free software; you can redistribute it ++ * and/or modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of the License, ++ * or (at your option) any later version. ++ * ++ * "eagle-usb driver package" is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with "ADI USB ADSL Driver for Linux"; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ * $Id: eu_msg.c,v 1.3 2004/08/29 19:28:41 sleeper Exp $ ++ */ ++ ++#include "Adiutil.h" ++#include "macros.h" ++#include "eu_msg.h" ++#include "eu_utils.h" ++#include "debug.h" ++ ++ ++ ++ ++/* -------------------------- Private Macros/Variables -------------------------- */ ++ ++#define CDC_REQ_SEND_ENCAPSULATED_CMD 0x00 ++#define CMD_SET_BLOCK 0x01 ++#define DSP_MP_TX_START 0x3FCE ++ ++#define SEARCHING 0x0 ++#define PASSED 0x1 ++#define FAILED 0x2 ++ ++#define NUM_CMVS 20 ++ ++ ++static const char symb_addresses[NUM_CMVS][4] = ++{ ++ {'A', 'D', 'P', 'T'}, ++ {'C', 'N', 'T', 'L'}, ++ {'C', 'O', 'D', 'E'}, ++ {'D', 'I', 'A', 'G'}, ++ {'D', 'O', 'P', 'T'}, ++ {'F', 'L', 'A', 'G'}, ++ {'I', 'N', 'F', 'O'}, ++ {'I', 'N', 'T', 'L'}, ++ {'O', 'P', 'T', 'N'}, ++ {'P', 'F', 'C', 'L'}, ++ {'P', 'F', 'R', 'X'}, ++ {'P', 'F', 'T', 'X'}, ++ {'P', 'S', 'D', 'M'}, ++ {'R', 'A', 'T', 'E'}, ++ {'R', 'X', 'D', 'A'}, ++ {'S', 'T', 'A', 'T'}, ++ {'T', 'E', 'S', 'T'}, ++ {'T', 'O', 'N', 'E'}, ++ {'T', 'X', 'D', 'A'}, ++ {'U', 'O', 'P', 'T'} ++}; ++ ++ ++ ++#define PREAMBLE 0x535C ++#define RECEIVER_MODEM 0x0000 ++#define SENDER_HOST 0x0010 ++#define SUBTYPE_MEM_REQWRITE 0x0100 ++#define SUBTYPE_MEM_REQREAD 0x0000 ++#define TYPE_MEMACCESS 0x1000 ++ ++#define WRITE_TO_MODEM (RECEIVER_MODEM + SENDER_HOST + SUBTYPE_MEM_REQWRITE + TYPE_MEMACCESS) ++#define READ_FRM_MODEM (RECEIVER_MODEM + SENDER_HOST + SUBTYPE_MEM_REQREAD + TYPE_MEMACCESS) ++ ++/* for MsgSeq_SoftReset */ ++static eu_cmv_msg_t MsgCNTL0_RSET = { PREAMBLE, WRITE_TO_MODEM, 0xCDEF, 'C','N','T','L', 0, 0 }; ++ ++/* for MsgSeq_EnaFR */ ++static eu_cmv_msg_t MsgOPTN0EnaFR = { PREAMBLE, WRITE_TO_MODEM, 0x1111, 'O','P','T','N', 0, 0x82800044 }; ++ ++/* for MsgSeq_Retrainer */ ++static eu_cmv_msg_t MsgCNTL0_RSVD = { PREAMBLE, WRITE_TO_MODEM, 0xEEEE, 'C','N','T','L', 0, 1 }; ++static eu_cmv_msg_t MsgCNTL0_INIT = { PREAMBLE, WRITE_TO_MODEM, 0xEEEE, 'C','N','T','L', 0, 2 }; ++static eu_cmv_msg_t MsgINFO8a = { PREAMBLE, READ_FRM_MODEM, 0xEEEE, 'I','N','F','O', 8, 0 }; ++static eu_cmv_msg_t MsgINFO10 = { PREAMBLE, READ_FRM_MODEM, 0xEEEE, 'I','N','F','O',10, 0 }; ++static eu_cmv_msg_t MsgOPTN0 = { PREAMBLE, WRITE_TO_MODEM, 0x1111, 'O','P','T','N', 0, 0x80020066 }; ++static eu_cmv_msg_t MsgOPTN2 = { PREAMBLE, WRITE_TO_MODEM, 0x2222, 'O','P','T','N', 2, 0 }; ++static eu_cmv_msg_t MsgOPTN4 = { PREAMBLE, WRITE_TO_MODEM, 0x3333, 'O','P','T','N', 4, 0 }; ++static eu_cmv_msg_t MsgOPTN7 = { PREAMBLE, WRITE_TO_MODEM, 0x2222, 'O','P','T','N', 7, 0 }; ++static eu_cmv_msg_t MsgOPTN3 = { PREAMBLE, WRITE_TO_MODEM, 0x2222, 'O','P','T','N', 3, 0 }; ++static eu_cmv_msg_t MsgOPTN5 = { PREAMBLE, WRITE_TO_MODEM, 0x2222, 'O','P','T','N', 5, 0 }; ++static eu_cmv_msg_t MsgOPTN6 = { PREAMBLE, WRITE_TO_MODEM, 0x2222, 'O','P','T','N', 6, 0 }; ++static eu_cmv_msg_t MsgOPTN15 = { PREAMBLE, WRITE_TO_MODEM, 0x2222, 'O','P','T','N',15, 0 }; ++static eu_cmv_msg_t MsgADPT2 = { PREAMBLE, WRITE_TO_MODEM, 0x1234, 'A','D','P','T', 2, 0 }; ++static eu_cmv_msg_t MsgINFO9 = { PREAMBLE, WRITE_TO_MODEM, 0x1234, 'I','N','F','O', 9, 0 }; ++static eu_cmv_msg_t MsgMASK8 = { PREAMBLE, WRITE_TO_MODEM, 0x1234, 'M','A','S','K', 8, 0 }; ++static eu_cmv_msg_t MsgMASK9 = { PREAMBLE, WRITE_TO_MODEM, 0x1234, 'M','A','S','K', 9, 0 }; ++static eu_cmv_msg_t MsgPSDM0 = { PREAMBLE, WRITE_TO_MODEM, 0x1234, 'P','S','D','M', 0, 0 }; ++static eu_cmv_msg_t MsgPFCL1 = { PREAMBLE, WRITE_TO_MODEM, 0x89AB, 'P','F','C','L', 1, 0 }; ++ ++/* for MsgSeq_OpStat */ ++static eu_cmv_msg_t MsgSTAT0a = { PREAMBLE, READ_FRM_MODEM, 0x0123, 'S','T','A','T', 0, 0 }; ++static eu_cmv_msg_t MsgDIAG2 = { PREAMBLE, READ_FRM_MODEM, 0x1111, 'D','I','A','G', 2, 0 }; ++static eu_cmv_msg_t MsgDIAG22 = { PREAMBLE, READ_FRM_MODEM, 0x2222, 'D','I','A','G',22, 0 }; ++static eu_cmv_msg_t MsgDIAG23 = { PREAMBLE, READ_FRM_MODEM, 0x3333, 'D','I','A','G',23, 0 }; ++static eu_cmv_msg_t MsgDIAG25 = { PREAMBLE, READ_FRM_MODEM, 0x4444, 'D','I','A','G',25, 0 }; ++static eu_cmv_msg_t MsgDIAG51 = { PREAMBLE, READ_FRM_MODEM, 0x5555, 'D','I','A','G',51, 0 }; ++static eu_cmv_msg_t MsgDIAG52 = { PREAMBLE, READ_FRM_MODEM, 0x6666, 'D','I','A','G',52, 0 }; ++static eu_cmv_msg_t MsgDIAG53 = { PREAMBLE, READ_FRM_MODEM, 0x7777, 'D','I','A','G',53, 0 }; ++static eu_cmv_msg_t MsgDIAG54 = { PREAMBLE, READ_FRM_MODEM, 0x8888, 'D','I','A','G',54, 0 }; ++static eu_cmv_msg_t MsgRATE0 = { PREAMBLE, READ_FRM_MODEM, 0x9999, 'R','A','T','E', 0, 0 }; ++static eu_cmv_msg_t MsgDIAG3 = { PREAMBLE, READ_FRM_MODEM, 0xAAAA, 'D','I','A','G', 3, 0 }; ++static eu_cmv_msg_t MsgDIAG47 = { PREAMBLE, READ_FRM_MODEM, 0xBBBB, 'D','I','A','G',47, 0 }; ++static eu_cmv_msg_t MsgDIAG49 = { PREAMBLE, READ_FRM_MODEM, 0xCCCC, 'D','I','A','G',49, 0 }; ++static eu_cmv_msg_t MsgINFOA = { PREAMBLE, READ_FRM_MODEM, 0xDDDD, 'I','N','F','O',10, 0 }; ++static eu_cmv_msg_t MsgPSDM1 = { PREAMBLE, READ_FRM_MODEM, 0xEEEE, 'P','S','D','M', 1, 0 }; ++static eu_cmv_msg_t MsgINFO8b = { PREAMBLE, READ_FRM_MODEM, 0xEEEE, 'I','N','F','O', 8, 0 }; ++static eu_cmv_msg_t MsgINFO14 = { PREAMBLE, READ_FRM_MODEM, 0xEEEE, 'I','N','F','O',14, 0 }; ++ ++/* for MsgSeq_Stat */ ++static eu_cmv_msg_t MsgSTAT0b = { PREAMBLE, READ_FRM_MODEM, 0x7654, 'S','T','A','T', 0, 0 }; ++ ++/* for MSgSeq_ModemEna */ ++/*FLASH_ACC + ENA_MODEMREBOOT_RQ + SENDER_HOST + RECEIVER_MODEM = 0x4110 */ ++static eu_cmv_msg_t MsgMODEMENA = { PREAMBLE, 0x4110, 0xDEAD, 'I','N','F','O', 0, 0 }; ++ ++static eu_cmv_msg_t lcl_MsgCNTL0_RSET; ++static eu_cmv_msg_t lcl_MsgOPTN0EnaFR; ++static eu_cmv_msg_t lcl_MsgCNTL0_RSVD; ++static eu_cmv_msg_t lcl_MsgCNTL0_INIT; ++static eu_cmv_msg_t lcl_MsgINFO8a; ++static eu_cmv_msg_t lcl_MsgINFO10; ++static eu_cmv_msg_t lcl_MsgOPTN0; ++static eu_cmv_msg_t lcl_MsgOPTN2; ++static eu_cmv_msg_t lcl_MsgOPTN4; ++static eu_cmv_msg_t lcl_MsgOPTN7; ++static eu_cmv_msg_t lcl_MsgOPTN3; ++static eu_cmv_msg_t lcl_MsgOPTN5; ++static eu_cmv_msg_t lcl_MsgOPTN6; ++static eu_cmv_msg_t lcl_MsgOPTN15; ++static eu_cmv_msg_t lcl_MsgADPT2; ++static eu_cmv_msg_t lcl_MsgINFO9; ++static eu_cmv_msg_t lcl_MsgMASK8; ++static eu_cmv_msg_t lcl_MsgMASK9; ++static eu_cmv_msg_t lcl_MsgPSDM0; ++static eu_cmv_msg_t lcl_MsgPFCL1; ++static eu_cmv_msg_t lcl_MsgSTAT0a; ++static eu_cmv_msg_t lcl_MsgDIAG2; ++static eu_cmv_msg_t lcl_MsgDIAG22; ++static eu_cmv_msg_t lcl_MsgDIAG23; ++static eu_cmv_msg_t lcl_MsgDIAG25; ++static eu_cmv_msg_t lcl_MsgDIAG51; ++static eu_cmv_msg_t lcl_MsgDIAG52; ++static eu_cmv_msg_t lcl_MsgDIAG53; ++static eu_cmv_msg_t lcl_MsgDIAG54; ++static eu_cmv_msg_t lcl_MsgRATE0; ++static eu_cmv_msg_t lcl_MsgDIAG3; ++static eu_cmv_msg_t lcl_MsgDIAG47; ++static eu_cmv_msg_t lcl_MsgDIAG49; ++static eu_cmv_msg_t lcl_MsgINFOA; ++static eu_cmv_msg_t lcl_MsgPSDM1; ++static eu_cmv_msg_t lcl_MsgINFO8b; ++static eu_cmv_msg_t lcl_MsgINFO14; ++static eu_cmv_msg_t lcl_MsgSTAT0b; ++static eu_cmv_msg_t lcl_MsgMODEMENA; ++ ++ ++static uint32_t MsgInitDone = FALSE; ++ ++ ++#define ADDMSG(Seq,Msg) \ ++ (Seq).MsgMax.Msgs[(Seq).MsgCount++] = &lcl_##Msg; \ ++ eu_build_msg ( &lcl_##Msg, &(Msg) ); ++ ++ ++#define ADDMSG_IFVAR_NOTZERO(Seq,Msg,Var) \ ++ if ( (Var) !=0) \ ++ { \ ++ (Msg).data = (Var); \ ++ ADDMSG(Seq,Msg); \ ++ } ++ ++#define ADDMSG_FROM_CONFIG(Seq,Msg,Var) \ ++ (Msg).data = (Var); \ ++ ADDMSG (Seq,Msg); ++ ++#define ADDMSG_FROM_TEXTFILE(Seq,Msg) \ ++ (Seq).MsgMax.Msgs[(Seq).MsgCount++] = &(Msg); \ ++ if ( !EU_TEST_FLAG(ins,EU_MSG_INITIALIZED) ) \ ++ { \ ++ eu_build_msg ( &(Msg), &(Msg) ); \ ++ } \ ++ ++ ++#define ___swahw32(x) \ ++({ \ ++ uint32_t __x = (x); \ ++ ((uint32_t)( \ ++ (((uint32_t)(__x) & (uint32_t)0x0000ffffUL) << 16) | \ ++ (((uint32_t)(__x) & (uint32_t)0xffff0000UL) >> 16) )); \ ++}) ++ ++ ++ ++ ++ ++/* ---------------------------- Private Declarations ---------------------------- */ ++ ++static void eu_write_dsp_msg ( ++ eu_instance_t *ins, ++ uint16_t addr, ++ uint16_t *data ++ ); ++ ++static uint32_t eu_check_symb_addr ( char *saddr ); ++static void eu_build_msg ( eu_cmv_msg_t *dest, eu_cmv_msg_t *src ); ++static void eu_get_cgf_values ( eu_instance_t *ins, const eu_options_t opt ); ++ ++/* ----------------------------- Exported Functions ----------------------------- */ ++ ++ ++ ++ ++/** ++ * eu_decode_msg - Decode messages coming from modem ++ * ++ * @msg - storage for decoded message ++ * @raw_msg - Raw message as sent by the modem ++ * ++ * returns a boolean ++ * ++ */ ++uint32_t eu_decode_msg ( eu_msg_t *msg, uint16_t raw_msg[8] ) ++{ ++ int retcode = TRUE; ++ uint16_t *pword = NULL; ++ uint16_t tmp = 0; ++ ++ pword = &raw_msg[0]; ++ ++ /* ++ * Get preamble first ++ */ ++ msg->preamble = cpu_to_le16 (*pword); ++ ++ /* ++ * And check it ++ */ ++ if ( msg->preamble != MSG_PREAMBLE ) ++ { ++ retcode = FALSE; ++ eu_err ("eu_decode_msg: Invalid preamble in message\n"); ++ goto byebye; ++ } ++ ++ ++ /* ++ * Get Function type ++ */ ++ pword ++; ++ ++ tmp = cpu_to_le16 (*pword); ++ ++ msg->type = ( tmp & MP_FUNCTION_TYPE_MASK ) >> MP_FUNCTION_TYPE_LSB; ++ ++ /* ++ * And check it ... ++ */ ++ switch ( msg->type ) ++ { ++ case MP_FUNCTION_TYPE_MEMACCESS: ++ case MP_FUNCTION_TYPE_FLASHACC: ++ case MP_FUNCTION_TYPE_ADSLDIRECTIVE: ++ case MP_FUNCTION_TYPE_MSGDECERR: ++ case MP_FUNCTION_TYPE_MSGACCERR: ++ case MP_FUNCTION_TYPE_FLASHACCERR: ++ /* ++ * OK : legal types ++ */ ++ break; ++ ++ default: ++ /* ++ * Illegal function type ++ */ ++ retcode = FALSE; ++ eu_err ("eu_decode_msg: Illegal function type: 0x%x\n",msg->type); ++ goto byebye; ++ break; ++ } ++ ++ /* ++ * Get function subtype ++ */ ++ ++ tmp = cpu_to_le16 ( *pword ); ++ ++ msg->subtype = ( tmp & MP_FUNCTION_SUBTYPE_MASK ) >> MP_FUNCTION_SUBTYPE_LSB; ++ ++ /* ++ * And check it ++ */ ++ switch ( msg->type ) ++ { ++ case MP_FUNCTION_TYPE_MEMACCESS: ++ if ( ( msg->subtype != SUBTYPE_MEMACCESS_REPLYREAD ) && ++ ( msg->subtype != SUBTYPE_MEMACCESS_REPLYWRITE ) ) ++ { ++ retcode = FALSE; ++ eu_err ("eu_decode_msg: Illegal function subtype: 0x%x (type=MEMACCESS)\n",msg->subtype); ++ goto byebye; ++ } ++ break; ++ ++ case MP_FUNCTION_TYPE_FLASHACC: ++ switch ( msg->subtype ) ++ { ++ case SUBTYPE_FLASHACC_ENKERNELREBOOTREPLY: ++ case SUBTYPE_FLASHACC_ENMODEMREBOOTREPLY: ++ case SUBTYPE_FLASHACC_DECOMPMODEMAPPLREPLY: ++ case SUBTYPE_FLASHACC_STREAMEDDATAWRREPLY: ++ case SUBTYPE_FLASHACC_STREAMEDDATAWRBLOCKREPLY: ++ case SUBTYPE_FLASHACC_READREPLY: ++ /* ++ * OK : legal subtypes ++ */ ++ break; ++ ++ default: ++ retcode = FALSE; ++ eu_err ("eu_decode_msg: Illegal function subtype: 0x%x (type=FLASHACC)\n",msg->subtype); ++ goto byebye; ++ break; ++ } ++ break; ++ ++ case MP_FUNCTION_TYPE_FLASHACCERR: ++ if ( ( msg->subtype != SUBTYPE_FLASHACCERR_DECOMPRESSERR ) && ++ ( msg->subtype != SUBTYPE_FLASHACCERR_READCOMPERR ) ) ++ { ++ retcode = FALSE; ++ eu_err ("eu_decode_msg: Illegal function subtype: 0x%x (type=FLASHACCERR)\n",msg->subtype); ++ goto byebye; ++ } ++ break; ++ ++ case MP_FUNCTION_TYPE_ADSLDIRECTIVE: ++ if ( ( msg->subtype == SUBTYPE_ADSLDIRECTIVE_KERNELREADY ) || ++ ( msg->subtype == SUBTYPE_ADSLDIRECTIVE_MODEMREADY ) || ++ ( msg->subtype == SUBTYPE_ADSLDIRECTIVE_MODEMCRCERROR ) ) ++ { ++ /* ++ * OK : legal subtypes ++ */ ++ break; ++ } ++ ++ retcode = FALSE; ++ eu_err ("eu_decode_msg: Illegal function subtype: 0x%x (type=ADSLDIRECTIVE)\n",msg->subtype); ++ goto byebye; ++ break; ++ ++ default: ++ retcode = FALSE; ++ eu_err ("eu_decode_msg: Illegal function type: 0x%x\n",msg->type); ++ goto byebye; ++ break; ++ } ++ ++ /* ++ * Get Function Sender ID ++ */ ++ tmp = cpu_to_le16 ( *pword ); ++ ++ msg->sender_id = ( tmp & MP_FUNCTION_SENDERID_MASK ) >> MP_FUNCTION_SENDERID_LSB; ++ ++ if ( msg->sender_id != SUBTYPE_ID_ADSL ) ++ { ++ retcode = FALSE; ++ eu_err ("eu_decode_msg: Illegal sender id: 0x%x\n",msg->sender_id); ++ goto byebye; ++ } ++ ++ /* ++ * Get receiver ID ++ */ ++ tmp = cpu_to_le16 ( *pword ); ++ ++ msg->receiver_id = ( tmp & MP_FUNCTION_RECEIVER_MASK ) >> MP_FUNCTION_RECEIVER_LSB; ++ ++ if ( msg->receiver_id != SUBTYPE_ID_ME ) ++ { ++ retcode = FALSE; ++ eu_err ("eu_decode_msg: Illegal receiver id: 0x%x\n",msg->receiver_id); ++ goto byebye; ++ } ++ ++ if ( msg->type == MP_FUNCTION_TYPE_ADSLDIRECTIVE ) ++ { ++ msg->index = 0; ++ msg->offset_addr = 0; ++ msg->data = 0xDEADBEEF; ++ retcode = TRUE; ++ goto byebye; ++ } ++ ++ /* ++ * Get index ++ */ ++ pword ++; ++ ++ msg->index = cpu_to_le16 ( *pword ); ++ ++ /* ++ * Get Symbolic address ++ */ ++ pword ++; ++ ++ tmp = cpu_to_le16 ( *pword ); /* Addr High */ ++ msg->saddr[0] = (unsigned char) ( (unsigned short) ( tmp &0xFF00) >> 8); ++ msg->saddr[1] = (unsigned char) ( (unsigned short) ( tmp &0x00FF)); ++ ++ pword ++; ++ tmp = cpu_to_le16 ( *pword ); /* Addr Low */ ++ msg->saddr[2] = (unsigned char) ( (unsigned short) ( tmp &0xFF00) >> 8); ++ msg->saddr[3] = (unsigned char) ( (unsigned short) ( tmp &0x00FF)); ++ ++ if ( !eu_check_symb_addr ( (char *) &(msg->saddr[0])) ) ++ { ++ retcode = FALSE; ++ eu_err ("eu_decode_msg: Illegal symbolic address\n"); ++ goto byebye; ++ } ++ ++ /* ++ * Get Offset ++ */ ++ pword++; ++ msg->offset_addr = *pword; ++ ++ /* ++ * And data ++ */ ++ pword ++; ++ tmp = cpu_to_le16 ( *pword ); /* Addr High */ ++ ++ pword++; /* Addr Low */ ++ msg->data = tmp * 0x10000 + cpu_to_le16 ( *pword ); ++ ++ ++ byebye: ++ return (retcode); ++ ++} ++ ++ ++/** ++ * eu_send_msg - Send given message ( message subsystem must have been initialized) ++ * ++ */ ++void eu_send_msg ( eu_instance_t *ins, uint16_t *packet ) ++{ ++ eu_enters (DBG_MSG); ++ ++ ++ /* ++ * if no message pending, its safe to send another one ++ */ ++ if ( ins->AdiModemSm.OutboundPending == FALSE ) ++ { ++ /* ++ * Set the flag because the send is pending ++ */ ++ ins->AdiModemSm.OutboundPending = TRUE; ++ ++ eu_write_dsp_msg ( ins, DSP_MP_TX_START, (uint16_t *) packet ); ++ ++ } ++ else ++ { ++ eu_dbg (DBG_MSG,"TxPending = TRUE, cannot send new message!\n"); ++ ++ } ++ eu_leaves (DBG_MSG); ++} ++ ++ ++ ++/** ++ * eu_msg_initialize - Initialize Message subsystem. Pre-encodes all necessary ++ * messages, and store them in a global structure. ++ * ++ */ ++void eu_msg_initialize ( eu_instance_t *ins, const eu_options_t opt ) ++{ ++ AdiMSM *pSm = &(ins->AdiModemSm); ++ ++ ++ eu_enters (DBG_MSG); ++ ++ ++ eu_get_cgf_values ( ins, opt ); ++ ++#if 0 ++ if ((pSm->LineType == 10) && ++ (ins->pDriverCMVs[0].data!=0xF9F9F9F9)) /*Read from CMV text file*/ ++ { ++ int i = 0; ++ ++ ++ pSm->MsgSeq_Retrainer.MsgCount = 0; ++ ++ while (TRUE) ++ { ++ if (ins->pDriverCMVs[i].data == 0xF9F9F9F9) ++ { ++ break; ++ } ++ ADDMSG_FROM_TEXTFILE( pSm->MsgSeq_Retrainer, ins->pDriverCMVs[i]); ++ ++ i++; ++ } ++ } ++ else ++ { ++#endif /* 0 */ ++ ++ /* ++ * Read from configuration file ++ * Get our Retrainer message sequence initialized ++ */ ++ pSm->MsgSeq_Retrainer.MsgCount = 0; ++ ADDMSG(pSm->MsgSeq_Retrainer, MsgCNTL0_RSVD); /*CNTL0 1 - to have enough time ++ * sending retrain CMVs*/ ++ ++ ADDMSG_IFVAR_NOTZERO(pSm->MsgSeq_Retrainer, MsgINFO8a,pSm->INFO8); ++ ++ ADDMSG(pSm->MsgSeq_Retrainer, MsgINFO10); ++ ++ if (pSm->OPTN0 != 0xF9F8F7F6) ++ { ++ ADDMSG_FROM_CONFIG(pSm->MsgSeq_Retrainer, MsgOPTN0, pSm->OPTN0); ++ } ++ ++ if (pSm->OPTN2 != 0xF9F8F7F6) ++ { ++ ADDMSG_FROM_CONFIG(pSm->MsgSeq_Retrainer, MsgOPTN2, pSm->OPTN2); ++ } ++ ++ if (pSm->OPTN4 != 0xF9F8F7F6) ++ { ++ ADDMSG_FROM_CONFIG(pSm->MsgSeq_Retrainer, MsgOPTN4, pSm->OPTN4); ++ } ++ ++ if (pSm->OPTN7 != 0xF9F8F7F6) ++ { ++ ADDMSG_FROM_CONFIG(pSm->MsgSeq_Retrainer, MsgOPTN7, pSm->OPTN7); ++ } ++ ++ /* ++ * The ADI code checks the ISDN var AND the OPTN3 var, but if OPTN3 ++ * is only set for ISDN - there's no need for the ISDN var ++ */ ++ if (pSm->OPTN3 != 0xF9F8F7F6) ++ { ++ ADDMSG_FROM_CONFIG(pSm->MsgSeq_Retrainer, MsgOPTN3, pSm->OPTN3); ++ } ++ ++ if (pSm->OPTN5 != 0xF9F8F7F6) ++ { ++ ADDMSG_FROM_CONFIG(pSm->MsgSeq_Retrainer, MsgOPTN5, pSm->OPTN5); ++ } ++ ++ if (pSm->OPTN6 != 0xF9F8F7F6) ++ { ++ ADDMSG_FROM_CONFIG(pSm->MsgSeq_Retrainer, MsgOPTN6, pSm->OPTN6); ++ } ++ ++ if (pSm->OPTN15 != 0xF9F8F7F6) ++ { ++ ADDMSG_IFVAR_NOTZERO(pSm->MsgSeq_Retrainer, MsgOPTN15,pSm->OPTN15); ++ } ++ ++ ADDMSG_IFVAR_NOTZERO(pSm->MsgSeq_Retrainer, MsgADPT2, pSm->ADPT2); ++ ADDMSG_IFVAR_NOTZERO(pSm->MsgSeq_Retrainer, MsgINFO9, pSm->INFO9); ++ ADDMSG_IFVAR_NOTZERO(pSm->MsgSeq_Retrainer, MsgMASK8, pSm->MASK8); ++ ADDMSG_IFVAR_NOTZERO(pSm->MsgSeq_Retrainer, MsgMASK9, pSm->MASK9); ++ ADDMSG_IFVAR_NOTZERO(pSm->MsgSeq_Retrainer, MsgPSDM0, pSm->PSDM0); ++ ++ if (pSm->LineType == 0) ++ { ++ /* ++ * G.Lite ++ */ ++ ADDMSG_IFVAR_NOTZERO(pSm->MsgSeq_Retrainer, MsgPFCL1, pSm->PFCL1); ++ } ++ ++ ++ /* ++ * To tell modem it can go ahead to R_ACT_REQUEST state ++ */ ++ ADDMSG(pSm->MsgSeq_Retrainer, MsgCNTL0_INIT); ++#if 0 ++ } ++#endif ++ ++ /* ++ * Get our SoftReset message sequence initialized ++ */ ++ pSm->MsgSeq_SoftReset.MsgCount = 0; ++ ADDMSG( pSm->MsgSeq_SoftReset, MsgCNTL0_RSET); ++ ++ /* ++ * Get our Stat message sequence initialized ++ */ ++ pSm->MsgSeq_Stat.MsgCount = 0; ++ ADDMSG( pSm->MsgSeq_Stat, MsgSTAT0b); ++ ++ /* ++ * Get our OpStat message sequence initialized ++ */ ++ pSm->MsgSeq_OpStat.MsgCount = 0; ++ ADDMSG( pSm->MsgSeq_OpStat, MsgSTAT0a); ++ ADDMSG( pSm->MsgSeq_OpStat, MsgDIAG2); ++ ADDMSG( pSm->MsgSeq_OpStat, MsgDIAG22); ++ ADDMSG( pSm->MsgSeq_OpStat, MsgDIAG23); ++ ADDMSG( pSm->MsgSeq_OpStat, MsgDIAG25); ++ ADDMSG( pSm->MsgSeq_OpStat, MsgDIAG51); ++ ADDMSG( pSm->MsgSeq_OpStat, MsgDIAG52); ++ ADDMSG( pSm->MsgSeq_OpStat, MsgDIAG53); ++ ADDMSG( pSm->MsgSeq_OpStat, MsgDIAG54); ++ ADDMSG( pSm->MsgSeq_OpStat, MsgRATE0); ++ ADDMSG( pSm->MsgSeq_OpStat, MsgDIAG3); ++ ADDMSG( pSm->MsgSeq_OpStat, MsgDIAG47); ++ ADDMSG( pSm->MsgSeq_OpStat, MsgDIAG49); ++ ADDMSG( pSm->MsgSeq_OpStat, MsgINFOA); ++ ADDMSG( pSm->MsgSeq_OpStat, MsgPSDM1); ++ ADDMSG( pSm->MsgSeq_OpStat, MsgINFO8b); ++ ADDMSG( pSm->MsgSeq_OpStat, MsgINFO14); ++ ADDMSG( pSm->MsgSeq_OpStat, MsgSTAT0b); ++ ++ /* ++ * Get our ModemEna message sequence initialized ++ */ ++ pSm->MsgSeq_ModemEna.MsgCount = 0; ++ ADDMSG( pSm->MsgSeq_ModemEna, MsgMODEMENA); ++ ++ /* ++ * Set Enable Fast Retrain options ++ */ ++ pSm->MsgSeq_EnaFR.MsgCount = 0; ++ ADDMSG( pSm->MsgSeq_EnaFR, MsgOPTN0EnaFR); ++ ++ /* ++ * Init our message pending flags ++ */ ++ pSm->InboundAsyncPending = FALSE; ++ pSm->InboundSyncPending = FALSE; ++ pSm->OutboundPending = FALSE; ++ ++ MsgInitDone = TRUE; ++ ++ ++ ++ eu_leaves (DBG_MSG); ++ ++} ++ ++/* ----------------------------- Private Functions ------------------------------ */ ++ ++ ++/** ++ * eu_get_cgf_values - Prepares options for state machine. ++ * ++ */ ++static void eu_get_cgf_values ( eu_instance_t *ins, const eu_options_t opt ) ++{ ++ AdiMSM *pSm = &(ins->AdiModemSm); ++ ++ eu_enters (DBG_MSG); ++ ++ ++ /* ++ * Initialize defaults ++ */ ++ pSm->ADPT0 = 0; ++ pSm->ADPT1 = 0; ++ pSm->ADPT2 = 0; ++ pSm->INFO9 = 0; ++ pSm->CNTL0 = 0; ++ pSm->OPTN0 = 0; ++ pSm->OPTN2 = 0; ++ pSm->OPTN4 = 0; ++ pSm->OPTN7 = 0; ++ pSm->OPTN3 = 0; ++ pSm->OPTN5 = 0; ++ pSm->OPTN6 = 0; ++ pSm->PFCL1 = 0; ++ pSm->MASK8 = 0; ++ pSm->MASK9 = 0; ++ pSm->INFO8 = 0; ++ pSm->PSDM0 = 0; ++ pSm->FLAG0 = 0; ++ ++ /* ++ * Get the option values from the hardware struct ++ */ ++ pSm->OPTN0 = opt[CFG_OPT_0].value; ++ pSm->OPTN2 = opt[CFG_OPT_2].value; ++ pSm->OPTN3 = opt[CFG_OPT_3].value; ++ pSm->OPTN4 = opt[CFG_OPT_4].value; ++ pSm->OPTN5 = opt[CFG_OPT_5].value; ++ pSm->OPTN6 = opt[CFG_OPT_6].value; ++ pSm->OPTN7 = opt[CFG_OPT_7].value; ++ pSm->OPTN15 = opt[CFG_OPT_15].value; ++ pSm->LineType = opt[CFG_LINE].value; ++ ++ eu_leaves (DBG_MSG); ++ ++} ++ ++/** ++ * eu_build_msg - Build a message to architecture indep form. ++ * ++ */ ++static void eu_build_msg ( eu_cmv_msg_t *dst, eu_cmv_msg_t *src ) ++{ ++ dst->preamble = cpu_to_le16 ( src->preamble ); ++ dst->function = cpu_to_le16 ( src->function ); ++ dst->idx = cpu_to_le16 ( src->idx ); ++ dst->offset = cpu_to_le16 ( src->offset ); ++ ++ dst->saddr_hihi = src->saddr_hilo; ++ dst->saddr_hilo = src->saddr_hihi; ++ dst->saddr_lohi = src->saddr_lolo; ++ dst->saddr_lolo = src->saddr_lohi; ++ ++ dst->data = ___swahw32 (cpu_to_le32 (src->data)); ++ ++} ++ ++ ++ ++/** ++ * eu_write_dsp_msg - Write to DSP. ++ * ++ */ ++static void eu_write_dsp_msg ( ++ eu_instance_t *ins, ++ uint16_t addr, ++ uint16_t *data ++ ) ++{ ++ struct urb *urb; ++ devrequest *pdr; ++ uint8_t *xfer_buff = NULL; ++ ++ xfer_buff = GET_KBUFFER ( ( CMV_DATA_WORDS*2 ) + sizeof(devrequest) ); ++ ++ if ( !xfer_buff ) ++ { ++ eu_err ("eu_write_dsp_msg: cannot allocate 0x%x bytes\n", ++ CMV_DATA_WORDS*2 + sizeof(devrequest) ); ++ goto byebye; ++ } ++ ++ memcpy ( xfer_buff, data, CMV_DATA_WORDS*2 ); ++ pdr = (devrequest *) ( xfer_buff + CMV_DATA_WORDS*2 ); ++ ++ /* ++ * Get an URB and prepare it for submission ++ */ ++ urb = USB_ALLOC_URB ( 0 , GFP_ATOMIC ); ++ ++ FILL_USB_CTRL_REQUEST ( pdr, ++ USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, ++ CDC_REQ_SEND_ENCAPSULATED_CMD, ++ CMD_SET_BLOCK, (addr | 0x4000), CMV_DATA_WORDS*2 ); ++ ++ usb_fill_control_urb ( urb, ++ ins->usbdev, ++ usb_sndctrlpipe(ins->usbdev,0), ++ (uint8_t *) pdr, ++ xfer_buff, ++ CMV_DATA_WORDS * 2, ++ ctrl_urb_completion, ++ NULL ); ++ ++ queue_ctrl_urb ( ins, urb ); ++ ++ byebye: ++ return ; ++} ++ ++ ++/** ++ * eu_check_symb_addr - Check presence of given symbolic address ++ * ++ */ ++static uint32_t eu_check_symb_addr ( char *saddr ) ++{ ++ uint32_t ret_code = FALSE; ++ uint32_t search_code = SEARCHING; ++ uint32_t cmv = 0; ++ uint32_t letter; ++ ++ /* ++ * search the reference array for a match ++ */ ++ while ( ( cmv < NUM_CMVS ) && ( search_code == SEARCHING ) ) ++ { ++ /* ++ * try to match the CMV to the current reference array CMV ++ */ ++ letter = 0; ++ while ( ( letter < 4 ) && ++ ( saddr[letter] == symb_addresses[cmv][letter] ) ) ++ { ++ letter++; ++ } ++ ++ switch ( letter ) ++ { ++ case 0: ++ { ++ /* ++ * no match on first char - check that first char of CMV being ++ * checked is not before the first char of this entry in ++ * the alphabet, if it is we can stop looking as entries in the ++ * reference array are in ascending order ++ */ ++ if ( saddr[0] < symb_addresses[cmv][0] ) ++ { ++ /* ++ * give up looking, already too far into alphabet ++ */ ++ search_code = FAILED; ++ ret_code = FALSE; ++ } ++ else ++ { ++ /* ++ * not too far yet, keep looking ++ */ ++ } ++ } ++ break; ++ ++ case 4: ++ { ++ /* ++ * found a match ++ */ ++ search_code = PASSED; ++ ret_code = TRUE; ++ } ++ break; ++ ++ default: ++ /* ++ * partial match, keep looking ++ */ ++ break; ++ } ++ cmv++; ++ } ++ ++ return (ret_code); ++} +diff -urN x/drivers/usb/misc/eagle-usb/eu_msg.h y/drivers/usb/misc/eagle-usb/eu_msg.h +--- x/drivers/usb/misc/eagle-usb/eu_msg.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/eu_msg.h 2004-02-07 09:01:34.000000000 +1100 +@@ -0,0 +1,138 @@ ++/* ++ * ++ * Copyright (c) 2003, Frederick Ros (sl33p3r@free.fr) ++ * ++ * eu_msg.h - Message protocol subsystem functions ++ * ++ * ++ * This file is part of the eagle-usb driver package. ++ * ++ * eagle-usb driver package is free software; you can redistribute it ++ * and/or modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of the License, ++ * or (at your option) any later version. ++ * ++ * "eagle-usb driver package" is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with "ADI USB ADSL Driver for Linux"; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ * $Id: eu_msg.h,v 1.1 2004/02/06 22:01:34 sleeper Exp $ ++ */ ++ ++ ++#ifndef __EU_MSG_H__ ++#define __EU_MSG_H__ ++ ++#include "eagle-usb.h" ++ ++/* ---------------------------- Exported Macros ---------------------------- */ ++ ++/* ++ * Message preamble ++ */ ++#define MSG_PREAMBLE 0x535C ++ ++/* ++ * Bit pattern to access various function subfields ++ */ ++#define MP_FUNCTION_TYPE_MASK 0xf000 ++#define MP_FUNCTION_SUBTYPE_MASK 0x0f00 ++#define MP_FUNCTION_SENDERID_MASK 0x00f0 ++#define MP_FUNCTION_RECEIVER_MASK 0x000f ++ ++#define MP_FUNCTION_TYPE_LSB 0xc ++#define MP_FUNCTION_SUBTYPE_LSB 0x8 ++#define MP_FUNCTION_SENDERID_LSB 0x4 ++#define MP_FUNCTION_RECEIVER_LSB 0x0 ++ ++/* ++ * Function types ++ */ ++#define MP_FUNCTION_TYPE_WAITING_4_REPLY 0 ++#define MP_FUNCTION_TYPE_MEMACCESS 0x1 ++#define MP_FUNCTION_TYPE_MSGDECERR 0x2 ++#define MP_FUNCTION_TYPE_MSGACCERR 0x3 ++#define MP_FUNCTION_TYPE_FLASHACC 0x4 ++#define MP_FUNCTION_TYPE_FLASHACCERR 0x5 ++#define MP_FUNCTION_TYPE_MEDIRECTIVE 0x6 ++#define MP_FUNCTION_TYPE_ADSLDIRECTIVE 0x7 ++ ++/* ++ * Functions sub-types ++ */ ++#define SUBTYPE_MEMACCESS_REQREAD 0x0 ++#define SUBTYPE_MEMACCESS_REQWRITE 0x1 ++#define SUBTYPE_MEMACCESS_REPLYREAD 0x2 ++#define SUBTYPE_MEMACCESS_REPLYWRITE 0x3 ++ ++#define SUBTYPE_MEMACCESSERROR_UNKNOWNADDR 0x1 ++#define SUBTYPE_MEMACCESSERROR_DATANOTRDY 0x2 ++#define SUBTYPE_MEMACCESSERROR_ILLEGALREAD 0x3 ++#define SUBTYPE_MEMACCESSERROR_ILLEGALWRITE 0x4 ++#define SUBTYPE_MEMACCESSERROR_DATANOTAVAIL 0x5 ++ ++#define SUBTYPE_MSGDECERR_LENGTHERROR 0x1 ++#define SUBTYPE_MSGDECERR_PREAMBLEERROR 0x2 ++#define SUBTYPE_MSGDECERR_UNKNOWNTYPE 0x3 ++#define SUBTYPE_MSGDECERR_CRCERROR 0x4 ++ ++#define SUBTYPE_FLASHACC_ENKERNELREBOOTREQ 0x0 ++#define SUBTYPE_FLASHACC_ENMODEMREBOOTREQ 0x1 ++#define SUBTYPE_FLASHACC_DECOMPMODEMAPPLREQ 0x2 ++#define SUBTYPE_FLASHACC_STREAMEDDATAWRREQ 0x3 ++#define SUBTYPE_FLASHACC_STREAMEDDATAWRBLOCK 0x4 ++#define SUBTYPE_FLASHACC_READREQ 0x5 ++#define SUBTYPE_FLASHACC_CALCMODEMCRCREQ 0x7 ++#define SUBTYPE_FLASHACC_ENKERNELREBOOTREPLY 0x8 ++#define SUBTYPE_FLASHACC_ENMODEMREBOOTREPLY 0x9 ++#define SUBTYPE_FLASHACC_DECOMPMODEMAPPLREPLY 0xa ++#define SUBTYPE_FLASHACC_STREAMEDDATAWRREPLY 0xb ++#define SUBTYPE_FLASHACC_STREAMEDDATAWRBLOCKREPLY 0xc ++#define SUBTYPE_FLASHACC_READREPLY 0xd ++#define SUBTYPE_FLASHACC_CALCMODEMCRCREPLY 0xf ++ ++#define SUBTYPE_FLASHACCERR_READCOMPERR 0x0 ++#define SUBTYPE_FLASHACCERR_DECOMPRESSERR 0x1 ++ ++#define SUBTYPE_MEDIRECTIVE_REBOOT 0x0 ++ ++#define SUBTYPE_ADSLDIRECTIVE_KERNELREADY 0x0 ++#define SUBTYPE_ADSLDIRECTIVE_MODEMREADY 0x1 ++#define SUBTYPE_ADSLDIRECTIVE_MODEMCRCERROR 0x2 ++ ++/* ++ * Sender / Receiver ID ++ */ ++#define SUBTYPE_ID_ADSL 0x0 ++#define SUBTYPE_ID_ME 0x1 ++ ++ ++/* ++ * eu_msg_t decode function return values ++ */ ++ ++#define MP_DECODE_OK 0x00000000 ++#define MP_DECODE_ERROR 0x00000001 ++#define MP_DECODE_PREAMBLE_ERROR 0x00000002 ++#define MP_DECODE_TYPE_ERROR 0x00000004 ++#define MP_DECODE_SUBTYPE_ERROR 0x00000008 ++#define MP_DECODE_SENDERID_ERROR 0x00000010 ++#define MP_DECODE_RECEIVERID_ERROR 0x00000020 ++#define MP_DECODE_SYMB_ADDR 0x00000040 ++ ++ ++ ++ ++/* -------------------------- Exported Functions --------------------------- */ ++ ++ ++uint32_t eu_decode_msg ( eu_msg_t *msg, uint16_t raw_msg[8] ); ++ ++ ++ ++#endif /* __EU_MSG_H__ */ +diff -urN x/drivers/usb/misc/eagle-usb/eu_sm.h y/drivers/usb/misc/eagle-usb/eu_sm.h +--- x/drivers/usb/misc/eagle-usb/eu_sm.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/eu_sm.h 2004-02-07 09:01:34.000000000 +1100 +@@ -0,0 +1,144 @@ ++/* ++ * ++ * Copyright (c) 2003, Frederick Ros (sl33p3r@free.fr) ++ * ++ * eu_sm.h - State Machine handling functions/structures ++ * ++ * ++ * This file is part of the eagle-usb driver package. ++ * ++ * eagle-usb driver package is free software; you can redistribute it ++ * and/or modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of the License, ++ * or (at your option) any later version. ++ * ++ * "eagle-usb driver package" is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with "ADI USB ADSL Driver for Linux"; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ * $Id: eu_sm.h,v 1.1 2004/02/06 22:01:34 sleeper Exp $ ++ */ ++ ++#ifndef __EU_SM_H__ ++#define __EU_SM_H__ ++ ++#include "eu_types.h" ++ ++/* ++ * Events accepted by modem state machine - bitmask type ++ */ ++ ++#define EVENT_NONE 0 ++#define EVENT_TIMER_TICK 0x0001 ++#define EVENT_RX_SYNC 0x0002 ++#define EVENT_RX_SYNC_ERROR 0x0003 ++#define EVENT_RX_ASYNC 0x0004 ++#define EVENT_RX_ASYNC_ERROR 0x0005 ++#define EVENT_HARD_RESET 0x0008 ++ ++#define EVENT_SOFT_RESET 0x000F ++ ++/* ++ * Modem state machine possible states for members ++ */ ++ ++#define STATE_UNDEFINED 0x0000 ++#define STATE_BOOT_STAGE_1 0x0001 ++#define STATE_BOOT_STAGE_2 0x0002 ++#define STATE_BOOT_STAGE_3 0x0003 ++#define STATE_STALLED_FOREVER 0xFFFF ++ ++/* ---- Startup/Reboot related states ----*/ ++ ++#define STATE_HARD_RESET_INITIATE 0x8000 /* reset modem */ ++#define STATE_HARD_RESET_END 0x8001 ++#define STATE_BOOT_WAIT 0x8002 ++#define STATE_JUST_PLUGGED_IN 0x8003 ++ ++#define STATE_KERNEL 0x4000 /* user controls the CMVs */ ++#define STATE_KERNEL_TX 0x4001 ++#define STATE_KERNEL_RX 0x4002 ++ ++#define STATE_UNTRAIN 0x2000 /* sends CMVs to train */ ++#define STATE_UNTRAIN_TX 0x2001 ++#define STATE_UNTRAIN_RX 0x2002 ++ ++#define STATE_TEST 0x1000 /* send out test tones */ ++#define STATE_TEST_TX 0x1001 ++#define STATE_TEST_RX 0x1002 ++ ++/* ---- User interface related states ----*/ ++ ++#define STATE_USER_CONTROL 0x0800 /* user controls all */ ++#define STATE_USER_CONTROL_TX 0x0801 ++#define STATE_USER_CONTROL_RX 0x0802 ++ ++/* #define STATE_IDMABOOT 0x0400 */ ++ ++#define STATE_EN_FASTTRAIN 0x0100 /* send fast retrain enable */ ++#define STATE_EN_FASTTRAIN_TX 0x0101 ++#define STATE_EN_FASTTRAIN_RX 0x0102 ++ ++/* ---- Functional states ----*/ ++ ++#define STATE_INITIALIZING 0x0080 /* read STAT CMV to find out if we are trained or not */ ++#define STATE_INITIALIZING_TX 0x0081 ++#define STATE_INITIALIZING_RX 0x0082 ++ ++#define STATE_OPERATIONAL 0x0040 /* read STAT, DIAG, ...etc to see if we stay in sync or not */ ++#define STATE_OPERATIONAL_TX 0x0041 ++#define STATE_OPERATIONAL_RX 0x0042 ++ ++#define STATE_FAST_RETRAIN 0x0020 /* read STAT only */ ++#define STATE_FAST_RETRAIN_TX 0x0021 ++#define STATE_FAST_RETRAIN_RX 0x0022 ++ ++/* ++ * Times for transition from state to state - for watchdog timer (msec) ++*/ ++ ++#define TRANS_TIME_2_BEGINRESET 50 /* time to begin reset */ ++#define TRANS_TIME_4_RESETINIT 5000 /* time for BootMachine completion */ ++#define TRANS_TIME_4_BOOTWAIT 8000 /* time to wait for MODEM_READY */ ++#define TRANS_TIME_BOOTWAIT_2_UNTRAIN 10 /* pause before UNTRAIN starts */ ++ ++#define TRANS_TIME_2_BOOT_STAGE_1 200 /* From beginning to Boot to Stage 1 */ ++#define TRANS_TIME_2_BOOT_STAGE_2 200 /* Stage 1 to Stage 2 */ ++#define TRANS_TIME_2_BOOT_STAGE_3 1000 /* Stage 2 to Stage 3 */ ++ ++#define TRANS_TIME_4_UNTRAIN 200 /* time for UNTRAIN CMV completion */ ++#define TRANS_TIME_B4_UNTRAIN 400 ++ ++#define TRANS_TIME_4_INITIALIZE 60000 /* time for STAT CMV completion */ ++#define TRANS_TIME_B4_INITIALIZE 5000 /* time to wait before INIT retry */ ++ ++#define TRANS_TIME_4_ENAFAST 50 /* time for ENAFAST completion */ ++#define TRANS_TIME_B4_ENAFAST 500 ++ ++#define TRANS_TIME_4_FASTRETRAIN 5000 /* time to wait for FASTRETRAIN */ ++#define TRANS_TIME_B4_FASTRETRAIN 500 /* pause before FASTRETRAIN starts */ ++ ++#define TRANS_TIME_4_OPERATIONAL 50 /* time for oper CMV completion */ ++#define TRANS_TIME_B4_OPERATIONAL 100 /* time before sending out 1st CMV */ ++ ++#define TRANS_TIME_4_OPSTAT 80 /* time for each next completion */ ++#define TRANS_TIME_B4_OPSTAT 2000 /* time to wait before 1st completes */ ++ ++#define TRANS_TIME_5MSEC_PAUSE 5 ++#define TRANS_TIME_50MSEC_PAUSE 50 ++ ++#define TRANS_TIME_HEARTBEAT 3000 /* timer heartbeat is 3 secs */ ++ ++#define TRANS_TIME_AFTER_PAGE_SWAP 750 /* requested pause after time swap */ ++ ++ ++ ++extern void ModemSM(UInt16 uEventCode, eu_instance_t *ins, void *pData); ++ ++ ++#endif /* __EU_SM_H__ */ +diff -urN x/drivers/usb/misc/eagle-usb/eu_types.h y/drivers/usb/misc/eagle-usb/eu_types.h +--- x/drivers/usb/misc/eagle-usb/eu_types.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/eu_types.h 2004-07-14 05:01:48.000000000 +1000 +@@ -0,0 +1,853 @@ ++/* ++ * ++ * Copyright (c) 2003, Frederick Ros (sl33p3r@free.fr) ++ * ++ * eu_types.h - Types Declarations. ++ * ++ * This file is part of the eagle-usb driver package. ++ * ++ * eagle-usb driver package is free software; you can redistribute it ++ * and/or modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of the License, ++ * or (at your option) any later version. ++ * ++ * "eagle-usb driver package" is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with "ADI USB ADSL Driver for Linux"; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ * $Id: eu_types.h,v 1.4 2004/07/13 19:01:48 sleeper Exp $ ++ */ ++#ifndef __EU_TYPES_H__ ++#define __EU_TYPES_H__ ++ ++#include ++#include ++#include ++ ++/** ++ * eu_ioctl_info - Used to exchange data between kernl and user space via ++ * ioctls ++ * ++ */ ++struct eu_ioctl_info ++{ ++ uint32_t idma_start; ++ uint32_t buffer_size; ++ uint8_t *buffer; ++}; ++ ++ ++/* ++ * ioctl commands ++ */ ++#define EU_IO_OPTIONS _IOW('U', 101, struct eu_ioctl_info) ++#define EU_IO_DSP _IOW('U', 102, struct eu_ioctl_info) ++#define EU_IO_GETITF _IOWR('U', 103, struct eu_ioctl_info) ++#define EU_IO_SYNC _IO('U', 104) ++#define EU_IO_GETDBG _IOWR('U', 105, struct eu_ioctl_info) ++#define EU_IO_SETDBG _IOWR('U', 106, struct eu_ioctl_info) ++#if 0 ++#define EU_IO_CMVS _IOW('U', 107, struct eu_ioctl_info) ++#endif ++ ++/* ++ * Options description structure ++ */ ++ ++#define MAX_OPTION_NAME_LENGTH 64 ++ ++typedef struct ++{ ++ char name[MAX_OPTION_NAME_LENGTH]; ++ uint32_t value; ++} eu_opt_t; ++ ++enum ++{ ++ CFG_OPT_0 = 0, ++ CFG_OPT_2, ++ CFG_OPT_3, ++ CFG_OPT_4, ++ CFG_OPT_5, ++ CFG_OPT_6, ++ CFG_OPT_7, ++ CFG_OPT_15, ++ CFG_VPI, ++ CFG_VCI, ++ CFG_ENCAPS, ++ CFG_LINE, ++ CFG_RATE_POLL_FREQ, ++ CFG_OPT_COUNT ++}; ++ ++#define NUM_DRV_OPTIONS CFG_OPT_COUNT ++typedef eu_opt_t eu_options_t[NUM_DRV_OPTIONS]; ++ ++#ifdef __KERNEL__ ++ ++#define TRANSMIT_TIMEOUT (HZ*5) /* 5 seconds */ ++ ++#define ETHERTYPE_IP 0x0008 ++#define ETHERTYPE_IPV6 0xdd86 ++#define ETHERTYPE_ARP 0x0608 ++ ++/* ++ * Custom ADI vendor control commands ++ */ ++#define EU_CMD_GET_BLOCK 0x00 ++#define EU_CMD_SET_BLOCK 0x01 ++#define EU_CMD_GET_STAT 0x02 ++#define EU_CMD_SET_MODE 0x03 ++#define EU_CMD_SET_2183_DATA 0x04 ++#define EU_CMD_GET_2183_DATA 0x05 ++#define EU_CMD_GET_STAT_VAR 0x06 ++#define EU_CMD_GET_INTERRUPT 0x07 ++#define EU_CMD_SET_FPGA_DATA 0x0E ++#define EU_CMD_SET_TIMEOUT 0x11 ++ ++/* ++ * Modes for EU_CMD_SET_MODE ++ */ ++#define MODE_LOOPBACK_OFF 0x02 ++#define MODE_LOOPBACK_ON 0x03 ++#define MODE_BOOTMODE_IDMA 0x06 ++#define MODE_START_RESET 0x07 ++#define MODE_END_RESET 0x08 ++ ++/* ++ * Mailbox addrs ++ */ ++#define DSP_MP_TX_MAILBOX 0x3FD6 ++#define DSP_MP_TX_START 0x3FCE ++#define DSP_MP_RX_MAILBOX 0x3FDF ++#define DSP_SWAP_MAILBOX 0x3FCD ++ ++/* ++ * Mailbox states ++ */ ++#define MAILBOX_EMPTY 0 ++#define MAILBOX_FULL 1 ++ ++/* ++ * Maximums ++ */ ++#define MAX_DSP_ALLOCS 128 ++ ++/* ++ * MPOA Encapsulations ++ */ ++#define MPOA_MODE_PPPOA_LLC 5 ++#define MPOA_MODE_PPPOA_VC 6 ++ ++ ++/** ++ * eu_cdc_t - Comm Device Class notification buffer ++ * ++ * @req: request as defined but USB standard ++ * @data: 20 bytes array used to pass data to the modem ++ * ++ * This is an extended version of the USB standard CDC, as ADI modem ++ * use this to pass data. ++ */ ++typedef struct ++{ ++ uint8_t bRequestType; ++ uint8_t bRequest; ++ uint16_t wValue; ++ uint16_t wIndex; ++ uint16_t wLength; ++ uint8_t data[20]; ++} eu_cdc_t __attribute__ ((packed)); ++ ++ ++/** ++ * eu_devint_t - returned by the modem on interrupt ++ */ ++#define CMV_DATA_WORDS 8 ++ ++typedef struct ++{ ++ uint16_t intr; ++ union ++ { ++ uint16_t swap_data; ++ uint16_t cmv_data[CMV_DATA_WORDS]; ++ } intr_info ; ++ uint16_t data_size; ++ ++} eu_devint_t; ++ ++ ++/** ++ * ISO Frame ++ * ++ * @status - Status of this received frame ++ * @length - Actual Data Buffer Length (how much data we received) ++ * @data - Received Data ++ */ ++#define FASTEST_ISO_RATE 1007 ++ ++typedef struct eu_iso_frame ++{ ++ int status; ++ int length; ++ char data[FASTEST_ISO_RATE]; ++} eu_iso_frame_t; ++ ++/** ++ * ISO Receive Buffer ++ * ++ * @next - To link buffers in completed receive list ++ * @frames - Frames for this receive buffer ++ * ++ */ ++#define FRAMES_PER_ISO_URB 16 ++typedef struct eu_iso_rb ++{ ++ struct list_head next; ++ eu_iso_frame_t frames[FRAMES_PER_ISO_URB]; ++} eu_iso_rb_t; ++ ++/************************************************************************************/ ++/* This will be the receiver buffer for incoming network data. We will queue */ ++/* up a bunch of reads with USB with these buffers, then process them into */ ++/* real ethernet packets as they come in. This enables us to support situations */ ++/* where the entire ethernet packet does not come in in one USBBulkRead. We */ ++/* do require that the data received into these buffers is an exact number */ ++/* of ATM cells */ ++/* LINUX NOTE : */ ++/* In kernel 2.4.7-10 (the stock kernel with RedHat 7.2), the usb-uhci module */ ++/* has a problem queuing multiple read bulk urbs). Therefore, we set this to one so */ ++/* we'll work with uhci or ohci. However, higher performance can be seen on ohci */ ++/* if you allow multiple read urbs. So, if you're on an ohci-based machine, */ ++/* set INCOMING_Q_SIZE to > 1 to achieve greater performance. */ ++/************************************************************************************/ ++/* FIXME */ ++#ifdef USEBULK ++#define INCOMING_Q_SIZE 1 ++#else ++/*We'll set it to 6 when we're dealing with ISOCHRONOUS data.*/ ++#define INCOMING_Q_SIZE 6 ++#endif ++ ++#define OUTGOING_Q_SIZE 64 ++#define OUTGOING_DATA_SIZE 1802 /* same logic as for INCOMING_DATA_SIZE */ ++ ++ ++/************************************************************************************/ ++/* Here's how I got this - Max ethernet = 1500 bytes + */ ++/* possible Ethernet FCS = 4 bytes + */ ++/* possible MPOA encapsulation = 10 bytes + */ ++/* CPCS PDU trailer = 8 bytes + */ ++/* at most 2 ATM payloads of pad = 96 bytes */ ++/* ---------- */ ++/* 1618 bytes */ ++/* Divided among ATM cells = 34 ATM cells * 53 bytes */ ++/* Grand total = 1802 */ ++/* NOTE NOTE NOTE NOTE */ ++/* This logic all makes sense IF the device received data in ATM cell sized chunks, */ ++/* however, it doesn't. The USB pipes receive 64bytes at a time, so we have */ ++/* to have space for a size that is the LCM of 64 and 53, which is 64*53 */ ++/************************************************************************************/ ++/* FIXME */ ++#define INCOMING_DATA_SIZE (64 * 53) ++ ++/** ++ * BULK Receive Buffer ++ * ++ * @next - To link buffers in completed receive list ++ * length - Received Data Length ++ * data - Received Data ++ */ ++typedef struct eu_bulk_rb ++{ ++ struct list_head next; ++ int length; ++ char data[INCOMING_DATA_SIZE]; ++} eu_bulk_rb_t; ++ ++/* ++ * To ease code ... ++ */ ++ ++#ifdef USEBULK ++typedef eu_bulk_rb_t eu_rb_t; ++#else ++typedef eu_iso_rb_t eu_rb_t; ++#endif /* USEBULK */ ++ ++ ++/* ++ * Queued Control Urb ++ */ ++#define CTRL_URB_Q_SIZE 16 ++ ++typedef struct ++{ ++ struct list_head list; ++ struct urb *urb; ++ void *dev; ++} queued_urb_t; ++ ++ ++/** ++ * eu_msg_t - Decoded modem messages ++ * ++ * @preamble Message preamble ++ * @type Function type ++ * @subtype Function Sub Type ++ * @sender_id ID of the Sender (unused) ++ * @receiver_id ID of the receiver (unused) ++ * @index message index (unused) ++ * @symb_addr Symbolic addr (unused) ++ * @offset_addr Offset (unused) ++ * @data Data from modem ++ * ++ * Field marked with (unused) tag are only used to check message is not ++ * corrupted ++ */ ++typedef struct ++{ ++ uint16_t preamble; ++ uint16_t type; ++ uint16_t subtype; ++ uint16_t sender_id; ++ uint16_t receiver_id; ++ uint16_t index; ++ uint8_t saddr[4]; ++ uint32_t offset_addr; ++ uint32_t data; ++} eu_msg_t; ++ ++typedef struct ++{ ++ uint16_t preamble; ++ uint16_t function; ++ uint16_t idx; ++ uint8_t saddr_hihi; ++ uint8_t saddr_hilo; ++ uint8_t saddr_lohi; ++ uint8_t saddr_lolo; ++ uint16_t offset; ++ uint32_t data; ++} eu_cmv_msg_t; ++ ++/* FIXME */ ++#define MAX_CMV_MESSAGES 20 ++ ++typedef struct ++{ ++ union ++ { ++ eu_cmv_msg_t *Msgs[ MAX_CMV_MESSAGES ]; ++ uint16_t *RawCmd[ MAX_CMV_MESSAGES ]; ++ } MsgMax; ++ uint32_t MsgCount; ++} MsgSequence; ++ ++ ++/* State machine control structure*/ ++/* FIXME */ ++typedef struct ++{ ++ /* state machine flags and options*/ ++ uint32_t ADPT0; ++ uint32_t ADPT1; ++ uint32_t ADPT2; ++ uint32_t INFO9; ++ uint32_t CNTL0; ++ uint32_t OPTN0; ++ uint32_t OPTN2; ++ uint32_t OPTN4; ++ uint32_t OPTN7; ++ uint32_t OPTN3; ++ uint32_t OPTN5; ++ uint32_t OPTN6; ++ uint32_t OPTN15; ++ uint32_t PFCL1; ++ uint32_t MASK8; ++ uint32_t MASK9; ++ ++ uint32_t INFO8; ++ uint32_t PSDM0; ++ uint32_t UNH; ++ uint32_t ISDN; ++ uint32_t FLAG0; ++ ++ /* OPERATIONAL values*/ ++ uint32_t sw_status; ++ uint32_t crc_status; ++ uint32_t flags; ++ ++ /* statistics*/ ++ uint32_t stats_ES_count; ++ uint32_t stats_Cur_Atten; ++ uint32_t stats_Cur_SNR; ++ uint32_t stats_Rx_Blks; ++ uint32_t stats_Tx_Blks; ++ uint32_t stats_Corr_Blks; ++ uint32_t stats_Uncorr_Blks; ++ ++ uint32_t stats_Rx_Blks_Delta; ++ uint32_t stats_Corr_Blks_Delta; ++ uint32_t stats_Uncorr_Blks_Delta; ++ ++ /* transfer rate*/ ++ uint32_t XferRate0; ++ uint32_t DownRate; ++ uint32_t UpRate; ++ uint32_t FwRxTimeout; ++ ++ /* miscell*/ ++ uint32_t DIAG03; ++ uint32_t DIAG47; ++ uint32_t DIAG49; ++ uint32_t INFO10; ++ uint32_t PSDM01; ++ uint32_t INFO08; ++ uint32_t INFO14; ++ ++ /* following counters work in single digits before reset is tridgerred*/ ++ uint8_t LOS_count; ++ uint8_t CRC_count; ++ ++ uint8_t Block_CRC90; ++ uint8_t Block_CRC97; ++ ++ uint32_t stats_Ne_Fast_Lod_Failure; ++ uint32_t stats_Ne_Fast_Hec_Failure; ++ ++ /* -------- status variables ------------------------*/ ++ uint8_t LineType; ++ ++ uint16_t ModemReplyExpected; ++ uint16_t CurrentAdiState; ++ uint16_t PrevAdiState; ++ ++ uint16_t MsgStage; ++ uint16_t ReTrain; ++ uint16_t RetryCount; ++ ++ uint32_t HeartbeatCounter; ++ ++ /* pre-composed messages used for fast retrain sequence*/ ++ MsgSequence MsgSeq_Retrainer; ++ MsgSequence MsgSeq_SoftReset; ++ MsgSequence MsgSeq_OpStat; ++ MsgSequence MsgSeq_Stat; ++ MsgSequence MsgSeq_ModemEna; ++ MsgSequence MsgSeq_EnaFR; ++ ++ struct timer_list timerSM; ++ ++ /* flags and handles*/ ++ uint32_t CurrentExpirationTime; ++ uint32_t SwapPageRequiredTime; ++ ++ uint32_t OutboundPending; ++ uint32_t InboundAsyncPending; ++ uint32_t InboundSyncPending; ++ ++ uint32_t watchBadBlocks; ++} AdiMSM; ++ ++/* ++ * Boot states: they are copied over the value of the modem internal states ++ */ ++typedef enum { ++ PRE_BOOT = 0, ++ STAGE_1 = 1, ++ STAGE_2 = 2, ++ STAGE_3 = 3, ++ REBOOT = 4, ++ UPLOAD_P = 5, ++ STATE_MAX ++} boot_state_t; ++ ++/* Represents a block of IDMA memory, either Program or Data Memory (PM or DM)*/ ++/* FIXME */ ++typedef struct ++{ ++ uint8_t *MemOffset; ++ uint32_t DSPAddr; ++ uint32_t DSPSize; ++ uint32_t DSPExtendedSize; ++} IDMABlock; ++ ++/* Represents a page of IDMA memory, either a Main page or a Swap page*/ ++/* FIXME */ ++typedef struct ++{ ++ uint32_t BlockCount; ++ uint32_t PageOffset; ++ IDMABlock *Blocks; ++} IDMAPage; ++ ++/** ++ * eu_sar_r_t - Sar Reassembly structure ++ * ++ * @skb - Pointer to the used skb ++ * @pdu_len_from_trailer - Length as reported by cell trailer ++ * @running_crc - CRC in the process to be calculated ++ * @cell_count - Number of prcessed cells for this frame. ++ */ ++typedef struct ++{ ++ struct sk_buff *skb; ++ uint32_t pdu_len_from_trailer; ++ uint32_t running_crc; ++ uint32_t cell_count; ++} eu_sar_r_t; ++ ++/** ++ * eu_sar_s_t - Sar Segmentation structure ++ * ++ * @out_buff - Buffer used to segemnt data ++ * @size - ++ * ++ */ ++typedef struct ++{ ++ uint8_t *out_buff; ++ uint32_t size; ++ uint8_t *cell_hdr; ++ uint32_t raw_pdu_length; ++ uint32_t padding_len; ++ uint32_t bytes_left_in_curr_cell; ++ uint32_t cell_count; ++ uint32_t running_crc; ++} eu_sar_s_t; ++ ++ ++/** ++ * eu_aal5_trailer_t - AAL5 Trailer ++ * ++ * @cpcs_uu - ++ * @cpi - ++ * @pdu_len - PDU Length for this frame ++ * @crc - CRC for this frame ++ * ++ */ ++ ++typedef struct ++{ ++ uint8_t cpcs_uu; ++ uint8_t cpi; ++ uint16_t pdu_len; ++ uint32_t crc; ++} ++eu_aal5_trailer_t; ++ ++ ++ ++/** ++ * eu_atm_vc_t - ATM Virtual Channel descriptor ++ * ++ * @reassembler - SAR Reassembler ++ * @vpi - Virtual Path Identifier ++ * @vci - Virtual Channel Identifier ++ * @vpi_vci - Agregated VPI/VCI ++ * @max_sdu_size - Maximum Data User Size ++ * @reassembly_ipg - uint32_t : Is a Reassembly I ProGress ? ++ * @encaps_size - Encapsulation size on segmentation ( RFC 2684 ) ++ * @encaps_hdr - Encapsulation Header ++ * @cell_hdr - Header of current cell ++ * @cpcs_uu - ++ * @cpi - ++ * ++ */ ++ ++#define ATM_CELL_HEADER_SIZE 5 ++ ++typedef struct ++{ ++ eu_sar_r_t reassembler; ++ eu_sar_s_t segmenter; ++ uint32_t vpi; ++ uint32_t vci; ++ uint32_t vpi_vci; ++ uint32_t max_sdu_size; ++ uint32_t reassembly_ipg; ++ uint32_t encaps_size; ++ uint8_t *encaps_hdr; ++ uint8_t cell_hdr[ATM_CELL_HEADER_SIZE]; ++ uint8_t cpcs_uu; ++ uint8_t cpi; ++} eu_atm_vc_t; ++ ++/* ++ * Encapsulation modes ++ */ ++#define MPOA_MODE_BRIDGED_ETH_LLC 1 ++#define MPOA_MODE_BRIDGED_ETH_VC 2 ++#define MPOA_MODE_ROUTED_IP_LLC 3 ++#define MPOA_MODE_ROUTED_IP_VC 4 ++ ++/** ++ * Instance flags ++ */ ++#define EU_OPEN 0 ++#define EU_WRITING 1 ++#define EU_HAS_INT 2 ++#define EU_READING 3 ++#define EU_MSG_INITIALIZED 4 ++#define EU_UNPLUG 5 ++#define EU_LOW_RATE 6 ++#define EU_DSP_IPG 7 ++#define EU_DSP_LOADED 8 ++#define EU_ETH_REGISTERED 9 /* Successfully registered */ ++#define EU_ETH_REGISTERING 10 /* Registration in progress */ ++ ++#define EU_SET_FLAG(i,f) set_bit((f), &(i)->flags) ++#define EU_CLEAR_FLAG(i,f) clear_bit((f),&(i)->flags) ++#define EU_TEST_FLAG(i,f) test_bit((f),&(i)->flags) ++ ++#define STAT_COUNT 0x0015 ++#define ATM_CELL_SIZE 53 ++ ++/* ---------------------------- Stats Counters ----------------------------- */ ++ ++/* ++ * Received ATM Cells ++ */ ++#define STAT_CELLS_RX 0x0000 ++/* ++ * Transmited ATM Cells ++ */ ++#define STAT_CELLS_TX 0x0001 ++ ++/* ++ * Number of cells drop because of CRC error ++ */ ++#define STAT_CELLS_LOST_CRC 0x0002 ++/* ++ * Stats Lost because of invalid VPI/VCI ++ */ ++#define STAT_CELLS_LOST_VPIVCI 0x0003 ++/* ++ * Number of cells lost because reassembly buffer is to short ++ */ ++#define STAT_CELLS_LOST_OTHER 0x0004 ++ ++/* ++ * Received Ethernet/IP Packets ++ */ ++#define STAT_PAKTS_RX 0x0005 ++/* ++ * Transmited Ethernet/IP Packets ++ */ ++#define STAT_PAKTS_TX 0x0006 ++/* ++ * Packets lost because over-sized ++ */ ++#define STAT_PAKTS_LOST_OSIZE 0x0007 ++/* ++ * Nb Packets droped after filter ++ */ ++#define STAT_PAKTS_FILTERED 0x0008 ++ ++#define STAT_ATMVCI 0x0009 ++#define STAT_ATMVPI 0x000A ++#define STAT_ATMHEC 0x000B ++#define STAT_ATMDELIN 0x000C ++ ++#define STAT_DSLMARGIN 0x000D ++#define STAT_DSLATTEN 0x000E ++#define STAT_DSLFEC 0x000F ++#define STAT_DSLVIDCPE 0x0010 ++#define STAT_DSLVIDCO 0x0011 ++#define STAT_DSLTXRATE 0x0012 ++#define STAT_DSLRXRATE 0x0013 ++/* ++ * Number of OAM cells received ++ */ ++#define STAT_CELLS_OAM_RCVD 0x0014 ++ ++ ++typedef struct eu_instance_s ++{ ++ ++ /* ++ * To protet acesses to this structure. ++ */ ++ spinlock_t lock; ++ ++ ++ /* ++ * To link all of our instances ++ */ ++ struct list_head list; ++ ++ /* ++ * Holds USB device information (dev, interfaces, pipes, etc.) ++ */ ++ struct usb_device *usbdev; ++ ++ /* ++ * URBs allocated for this device ++ */ ++ struct urb *urb_int; ++ struct urb *urb_write; ++ struct urb *urb_oam_write; ++ struct urb *read_urb[INCOMING_Q_SIZE]; /* Array of receive urbs */ ++ ++ ++ /* ++ * Device's endpoints ++ */ ++ uint32_t pipe_int_in; ++ uint32_t pipe_bulk_idma_out; ++ uint32_t pipe_bulk_data_out; ++ uint32_t pipe_bulk_data_in; ++ uint32_t pipe_iso_data_in; ++ ++ /* ++ * Data returned on interrupt by modem ++ */ ++ eu_cdc_t *intr_data; ++ ++ ++ /* ++ * Cache used to allocate read buffers ++ */ ++ kmem_cache_t *rb_cache; ++ ++ /* ++ * Maximum Receive Unit - depends on the encapsulation ++ */ ++ unsigned int mru; ++ ++ /* ++ * Size of the header to prepend in front of inbound data ++ */ ++ unsigned int eth_hdr; ++ ++ ++ /* ++ * To hold outbound data ++ */ ++ uint8_t *segmentation_buffer; ++ ++ ++ ++ /* ++ * Modem state machine info ++ */ ++ AdiMSM AdiModemSm; ++ wait_queue_head_t sync_q; ++ ++ ++ eu_cmv_msg_t *pDriverCMVs; ++ ++ /*DSP code info*/ ++ IDMAPage MainPage; ++ IDMAPage *pSwapPages; ++ uint32_t SwapPageCount; ++ ++ /*URB queues*/ ++ struct list_head ctrl_urb_free_q; /* Free queued_urb_t queue */ ++ struct list_head ctrl_urb_ipg_q; /* In-progress control urb queue */ ++ struct urb *ctrl_urb_failed; ++ spinlock_t ctrl_q_lock; ++ ++ ++ ++ /*Kernel timer(s)*/ ++ struct timer_list ctrl_urb_q_timer; ++ struct timer_list ctrl_urb_retry; ++ ++ ++ /* ++ * Tasklets ++ */ ++ struct tasklet_struct rcv_complete_tasklet; ++ ++#ifdef LINUX_2_6 ++ /* ++ * Work queue for eth creation ++ */ ++ struct work_struct create_eth; ++#endif ++ ++ /* ++ * Boot queue / task ++ */ ++#ifdef LINUX_2_6 ++ struct work_struct boot_sm; ++#elif defined(LINUX_2_4) ++ struct tq_struct boot_sm; ++#endif ++ ++ boot_state_t boot_state; ++ uint16_t swap_data; ++ ++ /* ++ * Wait Queue ++ */ ++ wait_queue_head_t thr_wait; ++ ++ /* ++ * Completed Read Queue: data to be treated by kernel ++ */ ++ struct list_head comp_read_q; ++ ++ /* ++ * Associated spinlock ++ */ ++ spinlock_t comp_read_q_lock; ++ ++ ++ ++ /* ++ * Misc data ++ */ ++ volatile unsigned long flags; ++ ++#ifdef DELAY_ISO_STARTUP ++ uint32_t IsReadPipeStarted; ++#endif ++ uint32_t MpoaMode; ++ uint8_t mac[ETH_ALEN]; ++ ++ /* ++ * Ethernet interface data ++ */ ++ uint32_t out_pkt_size; ++ struct net_device *eth; ++ struct net_device_stats LinuxStats; ++ char if_name[IFNAMSIZ]; ++ ++ /* ++ * Statistics ++ */ ++ uint32_t Statistics[STAT_COUNT]; ++ ++ /* ++ * ATM data ++ */ ++ eu_atm_vc_t Vc; ++ ++ /* ++ * State variables used for OAM stuff ++ */ ++ uint32_t OAMState_TimerOn; ++ uint32_t OAMState_SendingCC; ++ uint32_t OAMState_ReceiveCC; ++ uint32_t OAMState_AIS; ++ uint32_t OAMState_CCSink; ++ uint8_t OAMCell[ATM_CELL_SIZE*2]; ++ uint8_t *pOAMCell; ++ uint8_t OAMCellHeader[ATM_CELL_HEADER_SIZE*2]; ++ struct timer_list OAMTimer; ++ ++} eu_instance_t; ++ ++ ++#endif /* __KERNEL__ */ ++ ++#endif /* __EU_TYPES_H__ */ +diff -urN x/drivers/usb/misc/eagle-usb/eu_utils.c y/drivers/usb/misc/eagle-usb/eu_utils.c +--- x/drivers/usb/misc/eagle-usb/eu_utils.c 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/eu_utils.c 2004-06-05 04:56:19.000000000 +1000 +@@ -0,0 +1,848 @@ ++/* ++ * ++ * Copyright (c) 2003, Frederick Ros (sl33p3r@free.fr) ++ * ++ * eu_utils.c - Various utils functions ++ * ++ * ++ * This file is part of the eagle-usb driver package. ++ * ++ * eagle-usb driver package is free software; you can redistribute it ++ * and/or modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of the License, ++ * or (at your option) any later version. ++ * ++ * "eagle-usb driver package" is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with "ADI USB ADSL Driver for Linux"; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ * $Id: eu_utils.c,v 1.4 2004/06/04 18:56:19 sleeper Exp $ ++ */ ++ ++#include "Adiutil.h" ++#include "eagle-usb.h" ++#include "eu_utils.h" ++#include "macros.h" ++#include "debug.h" ++#include "eu_firmware.h" ++ ++ ++/* ----------------------- Private Macros/Variables ------------------------ */ ++ ++/* ++ * Firmware loading ++ */ ++#define LOAD_INTERNAL 0xA0 ++#define F8051_USBCS 0x7f92 ++#define F8051_RETRY_COUNT 3 ++ ++#define CDC_REQ_SEND_ENCAPSULATED_CMD 0 ++#define POLYNOMIAL 0x04c11db7L ++ ++static uint32_t crc_table[256]; ++ ++#define MAC_ADDRESS_INDEX 4 ++ ++ ++/* ---------------------------- Private Declarations ---------------------------- */ ++ ++static queued_urb_t *get_queued_urb(struct list_head *q); ++static void rm_queued_urb(struct urb *urb); ++static int eu_send_modem_cmd ( ++ eu_instance_t *ins, ++ uint16_t addr, ++ uint16_t count, ++ uint8_t *buff ++ ); ++static uint8_t htoi ( uint8_t h ); ++ ++ ++/* ----------------------------- Exported Functions ----------------------------- */ ++ ++ ++/** ++ * eu_load_firmware - Load firmware into pre-firmware devices. ++ * ++ */ ++int eu_load_firmware ( eu_instance_t *ins, uint32_t pid ) ++{ ++ int ret= 0; ++ uint8_t value; ++ uint32_t i = 0; ++ eu_hex_record_t *pfirm; ++ ++ eu_enters (DBG_UTILS); ++ ++ value = 1; ++ ++ /* ++ * Send reset ++ */ ++ ret = eu_send_modem_cmd ( ins, F8051_USBCS, sizeof(value), &value ); ++ ++ if ( ret < 0 ) ++ { ++ eu_err ("eu_send_modem_cmd reset failure with error %d\n",ret); ++ goto byebye; ++ } ++ ++ if ( IS_EAGLE_I (pid) ) ++ { ++ pfirm = &eu_eagle_I_firmware[0]; ++ } ++ else ++ { ++ pfirm = &eu_eagle_II_firmware[0]; ++ } ++ ++ i = 0; ++ ++ while ( pfirm->type == 0 ) ++ { ++ ret = eu_send_modem_cmd (ins, ++ pfirm->address, ++ pfirm->length, ++ pfirm->data ); ++ if ( ret < 0 ) ++ { ++ eu_err ("eu_send_modem_cmd of download data failed (%d)\n",ret); ++ goto byebye; ++ } ++ pfirm ++; ++ } ++ ++ /* ++ * De-assert reset ++ */ ++ value = 0; ++ ret = eu_send_modem_cmd ( ins, F8051_USBCS, 1, &value ); ++ if ( ret < 0 ) ++ { ++ eu_err ("eu_send_modem_cmd de-reset failure (%d)\n",ret); ++ goto byebye; ++ } ++ ++ ++ byebye: ++ eu_leaves (DBG_UTILS); ++ return (ret); ++} ++ ++ ++ ++ ++/** ++ * eu_cmd_to_modem - Send command to modem ++ * ++ */ ++int eu_cmd_to_modem ( ++ eu_instance_t *ins, ++ uint32_t cmd, ++ uint32_t idx, ++ uint32_t count, ++ uint8_t *data ++ ) ++{ ++ /*get space for data and request struct*/ ++ struct urb *urb; ++ devrequest *pdr; ++ uint8_t *xfer_buff= NULL; ++ int ret = 0; ++ ++ /*xfer_buff = GET_KBUFFER (count+sizeof(devrequest));*/ ++ xfer_buff = kmalloc(count+sizeof(devrequest), GFP_ATOMIC); ++ ++ ++ if ( !xfer_buff ) ++ { ++ eu_err ("eu_cmd_to_modem: Cannot allocate 0x%x bytes\n",count+sizeof(devrequest)); ++ ret = -ENOMEM; ++ goto byebye; ++ } ++ ++ if ( count != 0 ) ++ { ++ memcpy ( xfer_buff, data, count ); ++ } ++ ++ pdr = (devrequest *)( xfer_buff + CMV_DATA_WORDS*2 ); ++ ++ /* ++ * Get an URB and prepare it for submission ++ */ ++ urb = USB_ALLOC_URB ( 0, GFP_ATOMIC ); ++ ++ FILL_USB_CTRL_REQUEST ( pdr, ++ USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, ++ CDC_REQ_SEND_ENCAPSULATED_CMD, ++ cmd, idx, count ); ++ ++ usb_fill_control_urb ( urb, ++ ins->usbdev, ++ usb_sndctrlpipe(ins->usbdev,0), ++ (uint8_t *) pdr, ++ xfer_buff, ++ count, ++ ctrl_urb_completion, ++ NULL); ++ ++ queue_ctrl_urb(ins, urb); ++ ++ byebye: ++ return ret; ++} ++ ++/* ++ * Allocates the number (count) of queued_urb_t and ++ * put them in the free queue ++ * ++ * Return: ++ * 0 : OK ++ * -ENOMEM : Not enough memory. No data has been allocated ++ */ ++int alloc_queued_urb_ctrl ( eu_instance_t *ins, unsigned int count ) ++{ ++ unsigned int i; ++ queued_urb_t *pu; ++ int retcode = 0; ++ ++ /* ++ * Initialize the free control urb queue ++ */ ++ INIT_LIST_HEAD( &ins->ctrl_urb_free_q ); ++ ++ for (i=0; i< count; i++ ) ++ { ++ pu = (queued_urb_t *) GET_KBUFFER (sizeof(queued_urb_t)); ++ if (pu == NULL ) ++ { ++ retcode = -ENOMEM; ++ eu_err ( "Not enough memory to init. free urb q.\n"); ++ goto byebye; ++ } ++ ++ memset ( pu, 0, sizeof(queued_urb_t) ); ++ ++ /* ++ * And add it to the list ++ */ ++ list_add ( &pu->list, &ins->ctrl_urb_free_q ); ++ } ++ ++ byebye: ++ if ( retcode != 0 ) ++ { ++ /* ++ * We have to free previously allocated queued_urb_t ++ */ ++ free_queued_urb_ctrl ( &ins->ctrl_urb_free_q ); ++ } ++ else ++ { ++ eu_dbg(DBG_UTILS,"%d queued_urb_t allocated.\n",count); ++ } ++ ++ return (retcode); ++} ++ ++/* ++ * Free all previously allocated queued_urb_t ++ * ++ */ ++ ++void free_queued_urb_ctrl ( struct list_head *q ) ++{ ++ queued_urb_t *pu; ++ ++ while ( !list_empty (q) ) ++ { ++ pu = list_entry (q->next, queued_urb_t, list ); ++ list_del (&pu->list); ++ FREE_KBUFFER(pu); ++ } ++ ++} ++ ++ ++/* ++ * This watcher is used only to rescue the modem, from an unacknowledged ++ * Control Urb. ++ * ++ */ ++void ctrl_urb_q_watcher ( unsigned long ptr ) ++{ ++ eu_instance_t *ins = (eu_instance_t *)ptr; ++ queued_urb_t *qu; ++ unsigned long flags; ++ ++ ++ eu_enters (DBG_UTILS); ++ ++ ++ spin_lock_irqsave (&ins->ctrl_q_lock, flags); ++ ++ qu = list_entry ( ins->ctrl_urb_ipg_q.next, queued_urb_t, list); ++ ++ /* We need to delete the head of the list, ++ * and submit the next one if there's one. ++ * ???? Should we also CANCEL the pending URB ???? ++ * To do this the simplest approach is to call ctrl_urb_completion ++ */ ++ ++ if ( (list_empty ( &ins->ctrl_urb_ipg_q ) ) || ++ ( qu == NULL ) ) ++ { ++ eu_err ("Ctrl Urb Watcher expires but not entry in ipg queue\n"); ++ return; ++ } ++ ++ eu_err ("Ctrl Urb Watcher expired. About to remove URB %p\n", ++ qu->urb ); ++ ++ rm_queued_urb ( qu->urb ); ++ ++ ++ spin_unlock_irqrestore (&ins->ctrl_q_lock,flags); ++ ++ eu_leaves (DBG_UTILS); ++ ++} ++ ++ ++ ++/** ++ * Retry to send urb ++ */ ++void ctrl_urb_retry_send ( unsigned long ptr ) ++{ ++ eu_instance_t *ins = (eu_instance_t *)ptr; ++ unsigned long flags; ++ queued_urb_t *qu; ++ int ret; ++ ++ ++ eu_enters (DBG_UTILS); ++ eu_dbg(DBG_UTILS,"ctrl_urb_retry_send: WAKE UP !!\n"); ++ ++ ++ spin_lock_irqsave (&ins->ctrl_q_lock, flags); ++ ++ if ( ins->ctrl_urb_failed == NULL ) ++ { ++ eu_err ("ctrl_urb_retry_send expires but failed urb is NULL !\n"); ++ return; ++ } ++ ++ ++ qu = list_entry ( ins->ctrl_urb_ipg_q.next, queued_urb_t, list); ++ ++ if ( (list_empty ( &ins->ctrl_urb_ipg_q ) ) || ++ ( qu == NULL ) ) ++ { ++ eu_err ("ctrl_urb_retry_send expires but not entry in ipg queue\n"); ++ return; ++ } ++ ++ if ( qu->urb != ins->ctrl_urb_failed ) ++ { ++ eu_warn ("faulty urb not at beginning of list !\n"); ++ } ++ ++ ++ ret = USB_SUBMIT_URB ( ins->ctrl_urb_failed , GFP_ATOMIC ); ++ if ( ret != 0 ) ++ { ++ eu_err ("ADI: Failed to send faulty ctrl urb (%p) with err=%d\n", ++ ins->ctrl_urb_failed ,ret); ++ eu_err ("ADI: retry in 100ms\n"); ++ ++ /* ++ * Schedule retry send in 100 ms ++ */ ++ ins->ctrl_urb_retry.expires = jiffies + MSEC_TO_JIFFIES (100); ++ add_timer ( &ins->ctrl_urb_retry ); ++ } ++ else ++ { ++ ins->ctrl_urb_failed = NULL; ++ ++ if ( !timer_pending ( &ins->ctrl_urb_q_timer ) ) ++ { ++ /* ++ * For safety we also set a timer : if something weird happens, like ++ * lost urb acknowledgement, we will be able to submit other URBs ++ */ ++ ins->ctrl_urb_q_timer.expires = jiffies + MSEC_TO_JIFFIES(2000); ++ add_timer ( &ins->ctrl_urb_q_timer ); ++ } ++ } ++ ++ spin_unlock_irqrestore (&ins->ctrl_q_lock,flags); ++ ++ eu_leaves (DBG_UTILS); ++ ++ ++} ++ ++ ++ ++/** ++ * Unlink 1st control urb if it's pending ++ */ ++void unlink_ipg_ctrl_urb ( eu_instance_t *ins ) ++{ ++ queued_urb_t *qhead; ++ unsigned long flags; ++ ++ /* ++ * Take lock ++ */ ++ spin_lock_irqsave (&ins->ctrl_q_lock, flags); ++ ++ if ( !list_empty ( &ins->ctrl_urb_ipg_q ) ) { ++ ++ /* ++ * We have to unlink it ++ */ ++ qhead = list_entry ( ins->ctrl_urb_ipg_q.next, queued_urb_t, list); ++ ++ qhead->urb->transfer_flags &= ~URB_ASYNC_UNLINK; ++ usb_unlink_urb(qhead->urb); ++ } ++ ++ spin_unlock_irqrestore (&ins->ctrl_q_lock, flags); ++} ++ ++/* ++ * Completion handler for Control Urbs ++ * Remove the head of the ipgt list, and eventually submit a new ++ * control urb to the modem ++ * ++ */ ++USB_COMPLETION_PROTO (ctrl_urb_completion,urb,regs) ++{ ++ queued_urb_t *pq; ++ eu_instance_t *ins; ++ unsigned long flags; ++ ++ eu_enters (DBG_UTILS); ++ ++ if ( ++ ( urb->status == -ENOENT ) || ++ ( urb->status == -ECONNRESET ) || ++ ( urb->status == -ESHUTDOWN ) ++ ) ++ { ++ eu_report (" Control Urb unlinked.\n"); ++ goto byebye; ++ } ++ ++ pq = urb->context; ++ ins = (eu_instance_t *)(pq->dev); ++ ++ spin_lock_irqsave (&ins->ctrl_q_lock, flags); ++ rm_queued_urb (urb ); ++ spin_unlock_irqrestore (&ins->ctrl_q_lock,flags); ++ ++ byebye: ++ eu_leaves (DBG_UTILS); ++} ++ ++/* ++ * Put the given urb in the in-progress control queue, ++ * and eventually send it to the modem ++ * ++ */ ++void queue_ctrl_urb(eu_instance_t *ins, struct urb *urb) ++{ ++ int ret; ++ unsigned int list_was_empty; ++ queued_urb_t *pq; ++ unsigned long flags; ++ ++ ++ eu_enters (DBG_UTILS); ++ ++ eu_dbg(DBG_UTILS,"queue_ctrl_urb (%p)\n", urb); ++ ++ /* ++ * Lock spinlock ++ */ ++ spin_lock_irqsave (&ins->ctrl_q_lock, flags); ++ ++ /* ++ * Look at the status of the list ++ */ ++ list_was_empty = list_empty ( &ins->ctrl_urb_ipg_q ); ++ ++ /* ++ * Get a free queued_urb_t ++ */ ++ pq = get_queued_urb ( &ins->ctrl_urb_free_q ); ++ ++ if ( pq == NULL ) ++ { ++ /* ++ * Too bad : no more free queued_urb_t ++ */ ++ eu_err ("Can't get free queued_urb_t !\n"); ++ goto byebye; ++ } ++ ++ pq->urb = urb; ++ pq->dev = ins; ++ urb->context = pq; /* usefull in the complete handler ! */ ++ ++ /* ++ * Enqueue Control Urb ++ */ ++ list_add_tail ( &pq->list, &ins->ctrl_urb_ipg_q); ++ ++ /* ++ * Now, if the list was empty before we introduce our urb, we can safely ++ * send it to the modem. ++ */ ++ if ( list_was_empty ) ++ { ++ eu_dbg(DBG_UTILS,"Submit urb %p immediately\n", urb); ++ ret = USB_SUBMIT_URB ( urb, GFP_ATOMIC ); ++ if ( ret != 0 ) ++ { ++ eu_err ("Failed to send ctrl urb (%p) with err=%d\n", ++ urb,ret); ++ eu_err ("retry in 100ms\n"); ++ ++ /* ++ * Schedule retry send in 200 ms ++ */ ++ ins->ctrl_urb_failed = urb; ++ ins->ctrl_urb_retry.expires = jiffies + MSEC_TO_JIFFIES (100); ++ add_timer ( &ins->ctrl_urb_retry ); ++ ++ } ++ else ++ { ++ ins->ctrl_urb_failed = NULL; ++ ++ /* ++ * For safety we also set a timer : if something weird happens, like ++ * lost urb acknowledgement, we will be able to submit other URBs ++ */ ++ ins->ctrl_urb_q_timer.expires = jiffies + MSEC_TO_JIFFIES(2000); ++ add_timer ( &ins->ctrl_urb_q_timer ); ++ } ++ ++ } ++ ++ byebye: ++ spin_unlock_irqrestore (&ins->ctrl_q_lock, flags); ++ ++ eu_leaves (DBG_UTILS); ++ ++ return; ++} ++ ++/** ++ * eu_crc_generate - Generates a table of CRC remainders for all possible bytes ++ * ++ * NOTE - must be called prior to eu_crc_calculate ++ * ++ */ ++ ++void eu_crc_generate ( void ) ++{ ++ uint32_t i; ++ uint8_t j; ++ uint32_t crc_accum; ++ ++ for ( i = 0; i < 256; i++ ) ++ { ++ crc_accum = ( (uint32_t) i << 24 ); ++ for ( j = 0; j < 8; j++ ) ++ { ++ if ( crc_accum & 0x80000000L ) ++ { ++ crc_accum = ( crc_accum << 1 ) ^ POLYNOMIAL; ++ } ++ else ++ { ++ crc_accum = ( crc_accum << 1 ); ++ } ++ } ++ crc_table[i] = crc_accum; ++ } ++ return; ++} ++ ++/** ++ * eu_crc_calculate - Compute the CRC of len bytes in the given cell payload, using ++ * the previous partial crc value. ++ * ++ * NOTE - eu_crc_generate should be called prior to this function ++ * ++ */ ++uint32_t eu_crc_calculate ( uint8_t *cell, uint32_t len, uint32_t crc ) ++{ ++ uint32_t i, j; ++ uint32_t new_crc; ++ ++ eu_enters (DBG_CRC); ++ eu_dbg (DBG_CRC,"cell=%p, len=%x, crc=%x\n", ++ cell, len, crc); ++ ++ new_crc = crc; ++ ++ for ( j = 0; j < len; j++ ) ++ { ++ i = ( (int32_t) ( new_crc >> 24) ^ cell[j]) & 0xff; ++ new_crc = ( new_crc << 8 ) ^ crc_table[i]; ++ } ++ ++ eu_dbg (DBG_CRC,"new_crc=0x%x\n",new_crc); ++ ++ eu_leaves (DBG_CRC); ++ ++ return( new_crc); ++} ++ ++ ++/** ++ * eu_get_mac_addr - Get MAC address from USB firmware, and stores it in ins->mac in ++ * numeric ++ * ++ */ ++void eu_get_mac_addr ( eu_instance_t *ins ) ++{ ++ int maclen, i; ++ uint8_t macbuf[ETH_ALEN*2+1]; ++ ++ maclen = usb_string(ins->usbdev, MAC_ADDRESS_INDEX, macbuf, ETH_ALEN*2+1); ++ ++ /* ++ * Make sure we got a string of the right length ++ */ ++ if ( maclen != ETH_ALEN*2 ) ++ { ++ eu_dbg(DBG_UTILS,"eu_get_mac_addr: invalid length %x.\n", maclen); ++ return; ++ } ++ ++ /* ++ * Convert the string into a numeric format ++ * (each string byte is a nibble in the result) ++ */ ++ for ( i=0; imac[i] = (htoi(macbuf[i*2])<<4) + (htoi(macbuf[i*2+1])); ++ } ++} ++ ++ ++/* ----------------------------- Private Functions ------------------------------ */ ++ ++ ++/** ++ * eu_send_modem_cmd - Send a command to the modem (firmware loading) ++ * ++ */ ++static int eu_send_modem_cmd ( ++ eu_instance_t *ins, ++ uint16_t addr, ++ uint16_t count, ++ uint8_t *buff ++ ) ++{ ++ int ret = -ENOMEM; ++ uint8_t *xfer_buff = NULL; ++ ++ xfer_buff = GET_KBUFFER (count); ++ ++ if ( xfer_buff ) ++ { ++ memcpy ( xfer_buff, buff, count ); ++ ret = usb_control_msg ( ins->usbdev, ++ usb_sndctrlpipe( ins->usbdev, 0 ), ++ LOAD_INTERNAL, ++ USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, ++ addr, 0, xfer_buff, count, 300); ++ FREE_KBUFFER(xfer_buff); ++ } ++ ++ return (ret); ++} ++ ++ ++/* ++ * Remove the first urb of the ipg queue, and if the queue is not empty, send ++ * the first URB. ++ * Also deals with the Control Urb Queue watcher timer ( stop it or modify it) ++ * ++ * This function is called by ctrl_urb_completion and ctrl_urb_q_watcher ++ * ++ */ ++static void rm_queued_urb(struct urb *urb) ++{ ++ queued_urb_t *qu,*qhead; ++ eu_instance_t *ins; ++ ++ /* ++ * Check if we're able to find queued_urb_t related to this urb ++ */ ++ qu = urb->context; ++ ++ if ( qu == NULL ) ++ { ++ eu_err ("URB (%p) has not context.\n",urb); ++ goto free_urb_and_quit; ++ } ++ ++ /* ++ * Get back hardware ++ */ ++ ins = (eu_instance_t *) qu->dev; ++ if ( !ins ) ++ { ++ eu_err ("URB %p not associated to Hdw\n",urb); ++ goto free_urb_and_quit; ++ } ++ ++ if ( list_empty ( &ins->ctrl_urb_ipg_q ) ) ++ { ++ eu_err ("URB %p not present in list !\n",urb); ++ goto free_urb_and_quit; ++ } ++ ++ /* ++ * Check that URB is at the head of the list ++ */ ++ qhead = list_entry ( ins->ctrl_urb_ipg_q.next, queued_urb_t, list); ++ ++ if ( qhead->urb != urb ) ++ { ++ eu_err ("Head of IPG queue(%p) is not equal to URB %p\n", ++ qhead->urb,urb); ++ } ++ /* ++ * Remove this queued_urb_t entry and put it in the ++ * free queued_urb_t queue ++ */ ++ list_del ( &qu->list ); ++ list_add_tail ( &qu->list, &ins->ctrl_urb_free_q); ++ ++ ++ /* ++ * Check if there's another pending URB ++ */ ++ if ( list_empty ( &ins->ctrl_urb_ipg_q ) ) ++ { ++ /* The only pending URB has been acknowledged, and ++ * nothing is pending : we can stop the running timer ++ */ ++ eu_dbg(DBG_UTILS,"rm_queued_urb: Stopping timer\n"); ++ del_timer ( &ins->ctrl_urb_q_timer ); ++ } ++ else ++ { ++ int ret; ++ ++ /* ++ * Send the 1st entry of the list ++ */ ++ qhead = list_entry ( ins->ctrl_urb_ipg_q.next, queued_urb_t, list); ++ ++ eu_dbg(DBG_UTILS,"rm_queued_urb: Submitting urb %p\n",qhead->urb); ++ ++ ++ ret = USB_SUBMIT_URB ( qhead->urb , GFP_ATOMIC ); ++ if ( ret != 0 ) ++ { ++ eu_err ("Failed to send pending ctrl urb (%p) with err=%d\n", ++ qhead->urb,ret); ++ eu_err ("Retrying in 100 ms\n"); ++ ++ /* ++ * Schedule retry send in 200 ms ++ */ ++ ins->ctrl_urb_failed = urb; ++ ins->ctrl_urb_retry.expires = jiffies + MSEC_TO_JIFFIES (100); ++ add_timer ( &ins->ctrl_urb_retry ); ++ } ++ else ++ { ++ /* ++ * Set the timer to expire in 2s : just to be sure nothing is lost ++ */ ++ mod_timer ( &ins->ctrl_urb_q_timer, jiffies + MSEC_TO_JIFFIES(2000) ); ++ } ++ } ++ ++ free_urb_and_quit: ++ /* ++ * Now free transfer buffer and URB ++ */ ++ FREE_KBUFFER(urb->transfer_buffer); ++ usb_free_urb(urb); ++} ++ ++/* ++ * Return the next queued_urb_t from the list, and delete it ++ */ ++ ++static queued_urb_t *get_queued_urb(struct list_head *q) ++{ ++ queued_urb_t *pu; ++ ++ ++ /* ++ * Check first for an empty list ++ */ ++ if (list_empty(q)) ++ { ++ pu = NULL; ++ } ++ else ++ { ++ ++ pu = list_entry (q->next, queued_urb_t, list ); ++ list_del(q->next); ++ } ++ ++ return (pu); ++} ++ ++/** ++ * htoi - Converts hex to integer. ++ * ++ */ ++static uint8_t htoi ( uint8_t h ) ++{ ++ uint8_t d; ++ ++ if ( isxdigit (h) ) ++ { ++ /* ++ * This is an hexa-digit ++ */ ++ d = isdigit (h) ? h - '0' : toupper (h) -'A'+ 10 ; ++ } ++ else ++ { ++ d = 0; ++ } ++ ++ return (d); ++} ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff -urN x/drivers/usb/misc/eagle-usb/eu_utils.h y/drivers/usb/misc/eagle-usb/eu_utils.h +--- x/drivers/usb/misc/eagle-usb/eu_utils.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/eu_utils.h 2004-06-05 04:56:19.000000000 +1000 +@@ -0,0 +1,53 @@ ++/* ++ * ++ * Copyright (c) 2003, Frederick Ros (sl33p3r@free.fr) ++ * ++ * eu_utils.h - Various utils functions ++ * ++ * ++ * This file is part of the eagle-usb driver package. ++ * ++ * eagle-usb driver package is free software; you can redistribute it ++ * and/or modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of the License, ++ * or (at your option) any later version. ++ * ++ * "eagle-usb driver package" is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with "ADI USB ADSL Driver for Linux"; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ * $Id: eu_utils.h,v 1.2 2004/06/04 18:56:19 sleeper Exp $ ++ */ ++ ++ ++#ifndef __EU_UTIL_H__ ++#define __EU_UTIL_H__ ++#include "macros.h" ++ ++int eu_load_firmware ( eu_instance_t *ins, uint32_t pid ); ++ ++int eu_cmd_to_modem ( ++ eu_instance_t *ins, ++ uint32_t cmd, ++ uint32_t idx, ++ uint32_t count, ++ uint8_t *data ++ ); ++int alloc_queued_urb_ctrl ( eu_instance_t *ins, unsigned int count ); ++void free_queued_urb_ctrl ( struct list_head *q ); ++void ctrl_urb_q_watcher ( unsigned long ptr ); ++void unlink_ipg_ctrl_urb ( eu_instance_t *ins ); ++USB_COMPLETION_PROTO (ctrl_urb_completion,urb,regs); ++void ctrl_urb_retry_send ( unsigned long ptr ); ++void queue_ctrl_urb(eu_instance_t *ins, struct urb *urb); ++void eu_crc_generate ( void ); ++uint32_t eu_crc_calculate ( uint8_t *cell, uint32_t len, uint32_t crc ); ++void eu_get_mac_addr ( eu_instance_t *ins ); ++ ++ ++#endif /* __EU_UTIL_H__ */ +diff -urN x/drivers/usb/misc/eagle-usb/macros.h y/drivers/usb/misc/eagle-usb/macros.h +--- x/drivers/usb/misc/eagle-usb/macros.h 1970-01-01 10:00:00.000000000 +1000 ++++ y/drivers/usb/misc/eagle-usb/macros.h 2004-07-14 05:01:48.000000000 +1000 +@@ -0,0 +1,178 @@ ++/* ++ * ++ * Copyright (c) 2004, Frederick Ros (sl33p3r@free.fr) ++ * ++ * macros.h ++ * ++ * ++ * This file is part of the eagle-usb driver package. ++ * ++ * eagle-usb driver package is free software; you can redistribute it ++ * and/or modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation; either version 2 of the License, ++ * or (at your option) any later version. ++ * ++ * "eagle-usb driver package" is distributed in the hope that it will be ++ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with "ADI USB ADSL Driver for Linux"; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ * $Id: macros.h,v 1.3 2004/07/13 19:01:48 sleeper Exp $ ++ */ ++ ++ ++#ifndef MACROS_H ++#define MACROS_H ++ ++/* ++ * Compatibility macros (USB changed in kernel 2.4.20) ++ */ ++#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,19) ++ ++typedef struct usb_ctrlrequest devrequest; ++#define FILL_USB_CTRL_REQUEST(p, t, r, v, i, l) \ ++ { \ ++ p->bRequestType = t; \ ++ p->bRequest = r; \ ++ p->wValue = cpu_to_le16 ((UInt16) v); \ ++ p->wIndex = cpu_to_le16 ((UInt16) i); \ ++ p->wLength = cpu_to_le16 ((UInt16) l); \ ++ } ++ ++#else ++#define FILL_USB_CTRL_REQUEST(p, t, r, v, i, l) \ ++ { \ ++ p->requesttype = t; \ ++ p->request = r; \ ++ p->value = cpu_to_le16 ((UInt16)v); \ ++ p->index = cpu_to_le16 ((UInt16)i); \ ++ p->length = cpu_to_le16 ((UInt16)l); \ ++ } ++ ++#endif ++ ++#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) ++/* ++ * Linux 2.6 introduces kmalloc flags ++ */ ++#define USB_SUBMIT_URB(u,f) usb_submit_urb((u),(f)) ++#define USB_ALLOC_URB(u,f) usb_alloc_urb((u),(f)) ++ ++#define GET_INTF_PTR(u,n) ((u)->actconfig->interface[(n)]) ++ ++#define USB_QUEUE_BULK 0 ++ ++ ++#define FILL_BULK_URB(u,d,p,tb,bl,c,ctx) \ ++ usb_fill_bulk_urb ((u),(d),(p),(tb),(bl),(c),(ctx)) ++/* ++ * Module reference is now obsolete ++ */ ++#define MODULE_USER_GET ++#define MODULE_USER_RELEASE ++ ++/* ++ * Get Configuration value for config #n ++ */ ++#define GET_CONFIG_VALUE(d,n) (d)->config[n].desc.bConfigurationValue ++ ++ ++#define USB_COMPLETION_PROTO(f,u,r) void f ( struct urb *u, struct pt_regs *r ) ++ ++#define USB_DRIVER_CLAIM_INTERFACE(d,i,p) \ ++ usb_driver_claim_interface((d), (i), (p)) ++ ++#define EU_SCHEDULE(w) schedule_work ( w ) ++#define EU_FLUSH(w) flush_scheduled_work() ++#else ++ ++/* ++ * K E R N E L 2.4 ++ * ++ */ ++ ++ ++#define USB_SUBMIT_URB(u,f) usb_submit_urb(u) ++#define USB_ALLOC_URB(u,f) usb_alloc_urb((u)) ++ ++#define GET_INTF_PTR(u,n) (&((u)->actconfig->interface[(n)])) ++ ++#define URB_ASYNC_UNLINK USB_ASYNC_UNLINK ++#define URB_ISO_ASAP USB_ISO_ASAP ++ ++#define MODULE_USER_GET MOD_INC_USE_COUNT ++#define MODULE_USER_RELEASE MOD_DEC_USE_COUNT ++ ++/* ++ * Get Configuration value for config #n ++ */ ++#define GET_CONFIG_VALUE(d,n) (d)->config[n].bConfigurationValue ++ ++#define USB_COMPLETION_PROTO(f,u,r) void f ( struct urb *u ) ++ ++#define USB_DRIVER_CLAIM_INTERFACE(d,i,p) \ ++ ( usb_driver_claim_interface((d), (i), (p)) , 0) ++ ++#define EU_SCHEDULE(w) schedule_task ( w ) ++#define EU_FLUSH(w) flush_scheduled_tasks() ++ ++#endif ++ ++#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,6) ++/* ++ * wait_ms disappear from 2.6.7 in favor of msleep ++ */ ++static __inline__ void wait_ms(unsigned int ms) ++{ ++ if(!in_interrupt()) { ++ msleep (ms); ++ } ++ else ++ { ++ mdelay (ms); ++ } ++} ++ ++#endif ++ ++#define GET_KBUFFER(_memsize_) kmalloc((_memsize_), in_interrupt() ? GFP_ATOMIC : GFP_KERNEL) ++#define FREE_KBUFFER(_ptr_) \ ++ if (_ptr_) \ ++ { \ ++ kfree(_ptr_); \ ++ (_ptr_) = NULL; \ ++ } ++ ++#define GET_VBUFFER(_memsize_) vmalloc(_memsize_) ++#define FREE_VBUFFER(_ptr_) \ ++ if (_ptr_) \ ++ { \ ++ vfree(_ptr_); \ ++ (_ptr_) = NULL; \ ++ } ++ ++/* ++ * Quasi-function to obtain current status of SM ++ */ ++#define GetOpStatusSM(_ADAPTER_) ((_ADAPTER_->CurrentAdiState&STATE_OPERATIONAL)!=0) ++ ++/* ++ * Macro for cancelling the StateMachine timer ++ */ ++#define CancelTimerSM(_ADAPTER_) SetTimerInterval(_ADAPTER_,0) ++ ++/* ++ * Quasi-function to signal beginning of SM reset ++ * actual processing would happen later, on next refresh ++ */ ++#define ResetModemSM(_ADAPTER_) if(_ADAPTER_->CurrentAdiState!=STATE_STALLED_FOREVER) \ ++ { (_ADAPTER_->CurrentAdiState=STATE_HARD_RESET_INITIATE); } ++ ++#define MSEC_TO_JIFFIES(_msec_) ((HZ*_msec_)/1000) ++ ++#endif /* MACROS_H */ ++ --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/evms-bd-claim.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/evms-bd-claim.dpatch @@ -0,0 +1,98 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Revert bd_claim change. +## DP: Patch author: unknown +## DP: Upstream status: unknown + +. $(dirname $0)/DPATCH + +@DPATCH@ +bd-claim + +A patch was merged between 2.6.0-test3 and -test4 that breaks EVMS on many +systems by not allowing Device-Mapper to activate DM devices on top of disks +that also contain mounted partitions. + +There are three solutions to this problem. + +1. Switch to using EVMS for *all* your volumes and partitions. This is, of + course, the preferred solution, but also requires some extra work on your + part to convert to mounting your root filesystem using an EVMS volume. + +2. Tell EVMS to exclude any disks that contain partitions that you are going + to mount through the kernel-provided-partitions. You can do this by adding + an entry to the "exclude" line in your /etc/evms.conf file. + +3. Apply this patch, which will revert the change that disallows EVMS to use + the disk at the same time the kernel-partitions are. + + cd /usr/src/linux-2.6.3/ + patch -p1 < bd_claim.patch + + + +=============================================================================== +Current devices can be 'claimed' by filesystems (when mounting) or +md/raid (when being included in an array) or 'raw' or .... +This stop concurrent access by these systems. + +However it is still possible for one system to claim the whole device +and a second system to claim one partition, which is not good. + +With this patch, when a partition is claimed, the whole device is +claimed for partitioning. So you cannot have a partition and the +whole devices claimed at the same time (except if the whole device +is claimed for partitioning). + +--- diff/fs/block_dev.c 2004-05-27 13:36:29.000000000 -0500 ++++ source/fs/block_dev.c 2004-05-27 14:01:54.000000000 -0500 +@@ -433,34 +433,12 @@ + + int bd_claim(struct block_device *bdev, void *holder) + { +- int res; ++ int res = -EBUSY; + spin_lock(&bdev_lock); +- +- /* first decide result */ +- if (bdev->bd_holder == holder) +- res = 0; /* already a holder */ +- else if (bdev->bd_holder != NULL) +- res = -EBUSY; /* held by someone else */ +- else if (bdev->bd_contains == bdev) +- res = 0; /* is a whole device which isn't held */ +- +- else if (bdev->bd_contains->bd_holder == bd_claim) +- res = 0; /* is a partition of a device that is being partitioned */ +- else if (bdev->bd_contains->bd_holder != NULL) +- res = -EBUSY; /* is a partition of a held device */ +- else +- res = 0; /* is a partition of an un-held device */ +- +- /* now impose change */ +- if (res==0) { +- /* note that for a whole device bd_holders +- * will be incremented twice, and bd_holder will +- * be set to bd_claim before being set to holder +- */ +- bdev->bd_contains->bd_holders ++; +- bdev->bd_contains->bd_holder = bd_claim; +- bdev->bd_holders++; ++ if (!bdev->bd_holder || bdev->bd_holder == holder) { + bdev->bd_holder = holder; ++ bdev->bd_holders++; ++ res = 0; + } + spin_unlock(&bdev_lock); + return res; +@@ -471,8 +449,6 @@ + void bd_release(struct block_device *bdev) + { + spin_lock(&bdev_lock); +- if (!--bdev->bd_contains->bd_holders) +- bdev->bd_contains->bd_holder = NULL; + if (!--bdev->bd_holders) + bdev->bd_holder = NULL; + spin_unlock(&bdev_lock); --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/exec-aout.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/exec-aout.dpatch @@ -0,0 +1,74 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Check for overlapping vma's in setup_arg_pages. +## DP: Patch author: Chris Wright +## DP: Upstream status: backport + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN x/fs/binfmt_aout.c y/fs/binfmt_aout.c +--- x/fs/binfmt_aout.c 2004-08-24 17:16:09.000000000 +1000 ++++ y/fs/binfmt_aout.c 2004-11-13 09:25:28.000000000 +1100 +@@ -43,13 +43,18 @@ + .min_coredump = PAGE_SIZE + }; + +-static void set_brk(unsigned long start, unsigned long end) ++#define BAD_ADDR(x) ((unsigned long)(x) >= TASK_SIZE) ++ ++static int set_brk(unsigned long start, unsigned long end) + { + start = PAGE_ALIGN(start); + end = PAGE_ALIGN(end); +- if (end <= start) +- return; +- do_brk(start, end - start); ++ if (end > start) { ++ unsigned long addr = do_brk(start, end - start); ++ if (BAD_ADDR(addr)) ++ return addr; ++ } ++ return 0; + } + + /* +@@ -413,7 +418,11 @@ + beyond_if: + set_binfmt(&aout_format); + +- set_brk(current->mm->start_brk, current->mm->brk); ++ retval = set_brk(current->mm->start_brk, current->mm->brk); ++ if (retval < 0) { ++ send_sig(SIGKILL, current, 0); ++ return retval; ++ } + + retval = setup_arg_pages(bprm, EXSTACK_DEFAULT); + if (retval < 0) { +diff -urN x/fs/exec.c y/fs/exec.c +--- x/fs/exec.c 2004-08-24 17:16:54.000000000 +1000 ++++ y/fs/exec.c 2004-11-12 18:19:28.000000000 +1100 +@@ -412,6 +412,7 @@ + + down_write(&mm->mmap_sem); + { ++ struct vm_area_struct *vma; + mpnt->vm_mm = mm; + #ifdef CONFIG_STACK_GROWSUP + mpnt->vm_start = stack_base; +@@ -432,6 +433,12 @@ + mpnt->vm_flags = VM_STACK_FLAGS; + mpnt->vm_flags |= mm->def_flags; + mpnt->vm_page_prot = protection_map[mpnt->vm_flags & 0x7]; ++ vma = find_vma(mm, mpnt->vm_start); ++ if (vma) { ++ up_write(&mm->mmap_sem); ++ kmem_cache_free(vm_area_cachep, mpnt); ++ return -ENOMEM; ++ } + insert_vm_struct(mm, mpnt); + mm->total_vm = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT; + } --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/execve.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/execve.dpatch @@ -0,0 +1,81 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Fix bugs in ELF loader. +## DP: Patch author: Paul Starzetz +## DP: Upstream status: backport + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN x/fs/binfmt_elf.c y/fs/binfmt_elf.c +--- x/fs/binfmt_elf.c 2004-08-24 17:17:07.000000000 +1000 ++++ y/fs/binfmt_elf.c 2004-11-11 20:10:11.000000000 +1100 +@@ -334,9 +334,12 @@ + goto out; + + retval = kernel_read(interpreter,interp_elf_ex->e_phoff,(char *)elf_phdata,size); +- error = retval; +- if (retval < 0) ++ error = -EIO; ++ if (retval != size) { ++ if (retval < 0) ++ error = retval; + goto out_close; ++ } + + eppnt = elf_phdata; + for (i=0; ie_phnum; i++, eppnt++) { +@@ -523,8 +526,11 @@ + goto out; + + retval = kernel_read(bprm->file, elf_ex.e_phoff, (char *) elf_phdata, size); +- if (retval < 0) ++ if (retval != size) { ++ if (retval >= 0) ++ retval = -EIO; + goto out_free_ph; ++ } + + files = current->files; /* Refcounted so ok */ + retval = unshare_files(); +@@ -571,8 +577,11 @@ + retval = kernel_read(bprm->file, elf_ppnt->p_offset, + elf_interpreter, + elf_ppnt->p_filesz); +- if (retval < 0) ++ if (retval != elf_ppnt->p_filesz) { ++ if (retval >= 0) ++ retval = -EIO; + goto out_free_interp; ++ } + /* If the program interpreter is one of these two, + * then assume an iBCS2 image. Otherwise assume + * a native linux image. +@@ -607,8 +616,11 @@ + if (IS_ERR(interpreter)) + goto out_free_interp; + retval = kernel_read(interpreter, 0, bprm->buf, BINPRM_BUF_SIZE); +- if (retval < 0) ++ if (retval != BINPRM_BUF_SIZE) { ++ if (retval >= 0) ++ retval = -EIO; + goto out_free_dentry; ++ } + + /* Get the exec headers */ + interp_ex = *((struct exec *) bprm->buf); +@@ -765,8 +777,10 @@ + } + + error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt, elf_prot, elf_flags); +- if (BAD_ADDR(error)) +- continue; ++ if (BAD_ADDR(error)) { ++ send_sig(SIGKILL, current, 0); ++ goto out_free_dentry; ++ } + + if (!load_addr_set) { + load_addr_set = 1; --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/extraversion.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/extraversion.dpatch @@ -0,0 +1,23 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: read .extraversion if it exists in Makefile +## DP: Patch author: unknown +## DP: Upstream status: not submitted + +. $(dirname $0)/DPATCH + +@DPATCH@ +--- kernel-source-2.6.6/Makefile 2004-05-10 19:47:45.000000000 +1000 ++++ kernel-source-2.6.6-1/Makefile 2004-05-10 22:21:02.000000000 +1000 +@@ -151,6 +151,9 @@ + + export srctree objtree VPATH TOPDIR + ++ifeq ($(EXTRAVERSION),) ++EXTRAVERSION := $(shell [ ! -f .extraversion ] || cat .extraversion) ++endif + KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) + + # SUBARCH tells the usermode build what the underlying arch is. That is set --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/drivers-net-wireless-orinoco_CVE-2005-3180.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/drivers-net-wireless-orinoco_CVE-2005-3180.dpatch @@ -0,0 +1,37 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. + +. $(dirname $0)/DPATCH +diff -Naurd linux-source-2.6.8.1-2.6.8.1.ORIG/drivers/net/wireless/orinoco.c linux-source-2.6.8.1-2.6.8.1/drivers/net/wireless/orinoco.c +--- linux-source-2.6.8.1-2.6.8.1.ORIG/drivers/net/wireless/orinoco.c 2004-08-24 09:19:57.000000000 +0200 ++++ linux-source-2.6.8.1-2.6.8.1/drivers/net/wireless/orinoco.c 2005-11-16 08:23:28.000000000 +0100 +@@ -2358,9 +2358,14 @@ + return 0; + } + +- /* Length of the packet body */ +- /* FIXME: what if the skb is smaller than this? */ +- len = max_t(int,skb->len - ETH_HLEN, ETH_ZLEN - ETH_HLEN); ++ /* Check packet length, pad short packets, round up odd length */ ++ len = max_t(int, ALIGN(skb->len, 2), ETH_ZLEN); ++ if (skb->len < len) { ++ skb = skb_padto(skb, len); ++ if (skb == NULL) ++ goto fail; ++ } ++ len -= ETH_HLEN; + + eh = (struct ethhdr *)skb->data; + +@@ -2410,8 +2415,7 @@ + p = skb->data; + } + +- /* Round up for odd length packets */ +- err = hermes_bap_pwrite(hw, USER_BAP, p, RUP_EVEN(data_len), txfid, data_off); ++ err = hermes_bap_pwrite(hw, USER_BAP, p, data_len, txfid, data_off); + if (err) { + printk(KERN_ERR "%s: Error %d writing packet to BAP\n", + dev->name, err); --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/fix-ip-conntrack-ftp.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/fix-ip-conntrack-ftp.dpatch @@ -0,0 +1,22 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Fix memory leak in ip_conntrack_ftp +## DP: Patch author: Patrick McHardy +## DP: Upstream status: backport + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN x/net/ipv4/netfilter/ip_conntrack_ftp.c y/net/ipv4/netfilter/ip_conntrack_ftp.c +--- x/net/ipv4/netfilter/ip_conntrack_ftp.c 2004-08-24 17:20:06.000000000 +1000 ++++ y/net/ipv4/netfilter/ip_conntrack_ftp.c 2004-12-30 17:08:38.000000000 +1100 +@@ -375,6 +375,7 @@ + problem (DMZ machines opening holes to internal + networks, or the packet filter itself). */ + if (!loose) { ++ ip_conntrack_expect_put(exp); + ret = NF_ACCEPT; + goto out; + } --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/fix-ip-options-leak.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/fix-ip-options-leak.dpatch @@ -0,0 +1,40 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Do not leak IP options. +## DP: Patch author: David S. Miller +## DP: Upstream status: unknown + +. $(dirname $0)/DPATCH + +@DPATCH@ +# This is a BitKeeper generated diff -Nru style patch. +# +# ChangeSet +# 2004/12/08 12:39:15-08:00 davem@nuts.davemloft.net +# [IPV4]: Do not leak IP options. +# +# If the user makes ip_cmsg_send call ip_options_get +# multiple times, we leak kmalloced IP options data. +# +# Noticed by Georgi Guninski. +# +# Signed-off-by: David S. Miller +# +# net/ipv4/ip_options.c +# 2004/12/08 12:38:09-08:00 davem@nuts.davemloft.net +2 -0 +# [IPV4]: Do not leak IP options. +# +diff -Nru a/net/ipv4/ip_options.c b/net/ipv4/ip_options.c +--- a/net/ipv4/ip_options.c 2004-12-22 03:00:30 -08:00 ++++ b/net/ipv4/ip_options.c 2004-12-22 03:00:30 -08:00 +@@ -515,6 +515,8 @@ + kfree(opt); + return -EINVAL; + } ++ if (*optp) ++ kfree(*optp); + *optp = opt; + return 0; + } --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/net-ipv4-netfilter-ip-nat_CVE-2005-3275.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/net-ipv4-netfilter-ip-nat_CVE-2005-3275.dpatch @@ -0,0 +1,34 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -Naurd linux-source-2.6.8.1-2.6.8.1.ORIG/net/ipv4/netfilter/ip_nat_proto_tcp.c linux-source-2.6.8.1-2.6.8.1/net/ipv4/netfilter/ip_nat_proto_tcp.c +--- linux-source-2.6.8.1-2.6.8.1.ORIG/net/ipv4/netfilter/ip_nat_proto_tcp.c 2004-08-24 09:15:18.000000000 +0200 ++++ linux-source-2.6.8.1-2.6.8.1/net/ipv4/netfilter/ip_nat_proto_tcp.c 2005-11-16 13:11:26.000000000 +0100 +@@ -40,7 +40,8 @@ + enum ip_nat_manip_type maniptype, + const struct ip_conntrack *conntrack) + { +- static u_int16_t port, *portptr; ++ static u_int16_t port; ++ u_int16_t *portptr; + unsigned int range_size, min, i; + + if (maniptype == IP_NAT_MANIP_SRC) +diff -Naurd linux-source-2.6.8.1-2.6.8.1.ORIG/net/ipv4/netfilter/ip_nat_proto_udp.c linux-source-2.6.8.1-2.6.8.1/net/ipv4/netfilter/ip_nat_proto_udp.c +--- linux-source-2.6.8.1-2.6.8.1.ORIG/net/ipv4/netfilter/ip_nat_proto_udp.c 2004-08-24 09:16:05.000000000 +0200 ++++ linux-source-2.6.8.1-2.6.8.1/net/ipv4/netfilter/ip_nat_proto_udp.c 2005-11-16 13:11:26.000000000 +0100 +@@ -41,7 +41,8 @@ + enum ip_nat_manip_type maniptype, + const struct ip_conntrack *conntrack) + { +- static u_int16_t port, *portptr; ++ static u_int16_t port; ++ u_int16_t *portptr; + unsigned int range_size, min, i; + + if (maniptype == IP_NAT_MANIP_SRC) --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/fix-sn_console-for-config_smp.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/fix-sn_console-for-config_smp.dpatch @@ -0,0 +1,46 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: fix sn_console compilation for UP +## DP: Patch author: Jesse Barnes +## DP: Upstream status: submitted + +. $(dirname $0)/DPATCH + +@DPATCH@ + +From: Jesse Barnes + +I found that sn_console was missing an include and a fix if CONFIG_SMP=n. +This patch fixes up the two small problems I found. + +Signed-off-by: Jesse Barnes +Signed-off-by: Andrew Morton +--- + + 25-akpm/drivers/serial/sn_console.c | 3 +++ + 1 files changed, 3 insertions(+) + +diff -puN drivers/serial/sn_console.c~fix-sn_console-for-config_smp=n drivers/serial/sn_console.c +--- 25/drivers/serial/sn_console.c~fix-sn_console-for-config_smp=n 2004-08-15 15:40:38.161876312 -0700 ++++ 25-akpm/drivers/serial/sn_console.c 2004-08-15 15:40:38.165875704 -0700 +@@ -50,6 +50,7 @@ + #include + #include + ++#include + #include + #include + #include +@@ -1086,7 +1087,9 @@ sn_sal_console_write(struct console *co, + spin_unlock_irqrestore(&port->sc_port.lock, flags); + + puts_raw_fixed(port->sc_ops->sal_puts_raw, s, count); ++#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT) + } ++#endif + } + else { + /* Not yet registered with serial core - simple case */ +_ --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/fs-asfs.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/fs-asfs.dpatch @@ -0,0 +1,5026 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: add support for the Amiga SmartFilesystem (asfs), 1.0beta7 +## DP: Patch author: Marek Szyprowski +## DP: Upstream status: not submitted +## DP: Reference: http://home.elka.pw.edu.pl/~mszyprow/programy/asfs/ + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN linux-2.6.3/Documentation/filesystems/00-INDEX linux-2.6.3-asfs-1.0b7/Documentation/filesystems/00-INDEX +--- linux-2.6.3/Documentation/filesystems/00-INDEX 2004-03-22 17:34:00.000000000 +0100 ++++ linux-2.6.3-asfs-1.0b7/Documentation/filesystems/00-INDEX 2004-03-22 17:34:00.000000000 +0100 +@@ -6,6 +6,8 @@ + - info and mount options for the Acorn Advanced Disc Filing System. + affs.txt + - info and mount options for the Amiga Fast File System. ++asfs.txt ++ - info and mount options for the Amiga Smart File System. + bfs.txt + - info for the SCO UnixWare Boot Filesystem (BFS). + cifs.txt +diff -urN linux-2.6.3/Documentation/filesystems/asfs.txt linux-2.6.3-asfs-1.0b7/Documentation/filesystems/asfs.txt +--- linux-2.6.3/Documentation/filesystems/asfs.txt 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.3-asfs-1.0b7/Documentation/filesystems/asfs.txt 2004-06-17 00:47:17.000000000 +0200 +@@ -0,0 +1,150 @@ ++ ++Amiga SmartFileSystem, Linux implementation ++=========================================== ++ ++ASFS is a Amiga Smart FileSystem driver for Linux. It supports reading ++files and directories. From version 1.0 there is also an experimental ++(almost full) write support. Experimental means that it hasn't been ++tested enough yet, so use it with care. Symbolic links (in AmigaOS ++called soft links) are also supported read/write. Read notes below ++about symlinks support. ++ ++ ++Unsupported features of Amiga SFS ++================================ ++ ++ASFS currently does not support safe-delete feature of Amiga SFS ++filesystem. It simply deletes files instead of moving them to ++".recycled" directory. It also doesn't remove files from ".recycled" ++directory, when there is no space left on drive. ++ ++If there is no space left, you need to manually remove files from ++".recycled" directory. Also if you want to delete a file in a safe ++way, you need to move it to ".recycled" directory by hand. ++ ++Because of all of above, the amount of free space on disk does not ++include space used by all files from ".recycled" directory. ++ ++ ++Limitations ++=========== ++ ++There is no Amiga protection bits into Linux permission bits tranlation ++and vice versa. If you need this feature, mail me. ++ ++ASFS will always keep some amount of blocks free. This means that you ++cannot fill the drive completely. It is because Amiga SFS uses some ++special methods of writing data (called safe write), which needs some ++additional free space. ++ ++File systems with unfinished transactions (this happens when system crashed ++during writing data to disk on AmigaOS/MorphOS) will be mounted read-only ++to protect data. The only way to fix such filesystem is to mount it under ++AmigaOS or MorphOS. ++ ++Do not try to mount and write to filesystem with errors. Bad things will ++happen. ++ ++ ++Mount options for the ASFS ++========================== ++ ++setuid=uid ++ This sets the owner of all files and directories in the file ++ system to uid. ++ ++setgid=gid ++ Same as above, but for gid. ++ ++mode=mode ++ Sets the mode flags to the given (octal) value. Directories ++ will get an x permission if the corresponding r bit is set. ++ The default mode is 0644, which means that everybody are allowed ++ to read files, but only root can write to them. ++ (for directories this means also that search bits are set). ++ ++prefix=path ++ Path will be prefixed to every absolute path name of symbolic ++ links on an ASFS/AFFS partition. Default = "/". (See below.) ++ ++volume=name ++ When symbolic links with an absolute path are created ++ on an ASFS/AFFS partition, name will be prepended as the ++ volume name. Default = "" (empty string). (See below.) ++ ++lowercasevol ++ Translate all volume names in symlinks to lower case. ++ Disabled by default. (See below.) ++ ++Symbolic links ++============== ++ ++Although the Amiga and Linux file systems resemble each other, there ++are some, not always subtle, differences. One of them becomes apparent ++with symbolic links. While Linux has a file system with exactly one ++root directory, the Amiga has a separate root directory for each ++file system (for example, partition, floppy disk, ...). With the Amiga, ++these entities are called "volumes". They have symbolic names which ++can be used to access them. Thus, symbolic links can point to a ++different volume. ASFS turns the volume name into a directory name ++and prepends the prefix path (see prefix option) to it. When option ++"lowercasevol" is set, it also translates volume names to lower case. ++If the volume name is the same as a name given in "volume" option, ++it will be ignored and an absolute path will be created. ++ ++Example: ++You mount all your Amiga partitions under /amiga/ (where ++ is the name of the volume), and you give options ++`prefix="/amiga/",volume="Linux",lowercasevol' when mounting all your ++ASFS partitions. (They might be "User", "WB" and "Graphics", the mount ++points /amiga/user, /amiga/wb and /amiga/graphics). ++ ++A symbolic link referring to "USER:sc/include/dos/dos.h" will be ++translated to "/amiga/user/sc/include/dos/dos.h". ++A symbolic link referring to "Linux:etc/fstab" will be translated to ++"/etc/fstab". ++If you create a symlink referring to "/amiga/graphics/data/pict.jpg", ++it will be saved as "graphics:data/pict.jpg". ++If you create a symlink referring to "/boot/System.map", it will be ++saved as "Linux:boot/System.map". ++ ++ ++Other information ++================= ++ ++Supported block sizes are: 512, 1024, 2048 and 4096 bytes. Larger blocks ++speed up almost everything at the expense of wasted disk space. The speed ++gain above 4K seems not really worth the price, so you don't lose too ++much here, either. ++ ++This file system has been tested on Motorola PPC and 68k, as well as ++Intel x86 systems. I don't know, if it works on other Linux systems. ++ ++This filesystem is in BETA STAGE. This means that driver MIGHT corrupt ++or damage data on your disk. Remember! YOU USE IT ON YOUR OWN RISK! ++ ++I made almost all I could to minimalize this risk. On my systems several ++gigabytes has been succesfully copied from and to SFS disks. I would also ++appreciate any infomation if this filesystem works on your system or not. ++See next paragraph for my email. ++ ++Some parts of this documentation has been adapted from AFFS driver docs. ++ ++ ++Author, contact and copyright infos ++=================================== ++ ++ASFS has been written by Marek 'March' Szyprowski . ++Mail me if you have any suggestions or found a bug. ++ ++Copyright (C) 2003,2004 Marek 'March' Szyprowski ++ ++Thanks to Marcin Kurek (Morgoth/Dreamolers-CAPS) for help and parts ++of original amiga version of SmartFilesystem source code. ++ ++SmartFilesystem is copyrighted (C) 2003,2004 by: John Hendrikx, ++Ralph Schmidt, Emmanuel Lesueur, David Gerber and Marcin Kurek ++ ++The ASFS driver is realased under the terms of of the GNU General ++Public License. See source code for more details. ++ +diff -urN linux-2.6.3/fs/asfs/adminspace.c linux-2.6.3-asfs-1.0b7/fs/asfs/adminspace.c +--- linux-2.6.3/fs/asfs/adminspace.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.3-asfs-1.0b7/fs/asfs/adminspace.c 2004-06-13 21:03:49.000000000 +0200 +@@ -0,0 +1,446 @@ ++/* ++ * ++ * Amiga Smart File System, Linux implementation ++ * version: 1.0beta7 ++ * ++ * This file contains some parts of the original amiga version of ++ * SmartFilesystem source code. ++ * ++ * SmartFilesystem is copyrighted (C) 2003 by: John Hendrikx, ++ * Ralph Schmidt, Emmanuel Lesueur, David Gerber, and Marcin Kurek ++ * ++ * Adapted and modified by Marek 'March' Szyprowski ++ * ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include "asfs_fs.h" ++#include "bitfuncs.h" ++ ++#include ++ ++#ifdef CONFIG_ASFS_RW ++ ++static int setfreeblocks(struct super_block *sb, u32 freeblocks) ++{ ++ struct buffer_head *bh; ++ if ((bh = asfs_breadcheck(sb, ASFS_SB(sb)->rootobjectcontainer, ASFS_OBJECTCONTAINER_ID))) { ++ struct fsRootInfo *ri = (struct fsRootInfo *) ((u8 *) bh->b_data + sb->s_blocksize - sizeof(struct fsRootInfo)); ++ ASFS_SB(sb)->freeblocks = freeblocks; ++ ri->freeblocks = cpu_to_be32(freeblocks); ++ asfs_bstore(sb, bh); ++ asfs_brelse(bh); ++ return 0; ++ } ++ return -EIO; ++} ++ ++static inline int enoughspace(struct super_block *sb, u32 blocks) ++{ ++ if (ASFS_SB(sb)->freeblocks - ASFS_ALWAYSFREE < blocks) ++ return FALSE; ++ ++ return TRUE; ++} ++ ++ /* Determines the amount of free blocks starting from block /block/. ++ If there are no blocks found or if there was an error -1 is returned, ++ otherwise this function will count the number of free blocks until ++ an allocated block is encountered or until maxneeded has been ++ exceeded. */ ++ ++static int availablespace(struct super_block *sb, u32 block, u32 maxneeded) ++{ ++ struct buffer_head *bh = NULL; ++ struct fsBitmap *b; ++ u32 longs = ASFS_SB(sb)->blocks_inbitmap >> 5; ++ u32 maxbitmapblock = ASFS_SB(sb)->bitmapbase + ASFS_SB(sb)->blocks_bitmap; ++ int blocksfound = 0; ++ u32 bitstart; ++ int bitend; ++ u32 nextblock = ASFS_SB(sb)->bitmapbase + block / ASFS_SB(sb)->blocks_inbitmap; ++ ++ bitstart = block % ASFS_SB(sb)->blocks_inbitmap; ++ ++ while (nextblock < maxbitmapblock && (bh = asfs_breadcheck(sb, nextblock++, ASFS_BITMAP_ID))) { ++ b = (void *) bh->b_data; ++ ++ if ((bitend = bmffz(b->bitmap, longs, bitstart)) >= 0) { ++ blocksfound += bitend - bitstart; ++ asfs_brelse(bh); ++ return blocksfound; ++ } ++ blocksfound += ASFS_SB(sb)->blocks_inbitmap - bitstart; ++ if (blocksfound >= maxneeded) { ++ asfs_brelse(bh); ++ return blocksfound; ++ } ++ bitstart = 0; ++ asfs_brelse(bh); ++ } ++ ++ if (bh == NULL) ++ return (-1); ++ ++ return (blocksfound); ++} ++ ++int asfs_findspace(struct super_block *sb, u32 maxneeded, u32 start, u32 end, u32 * returned_block, u32 * returned_blocks) ++{ ++ struct buffer_head *bh; ++ u32 longs = ASFS_SB(sb)->blocks_inbitmap >> 5; ++ u32 space = 0; ++ u32 block; ++ u32 bitmapblock = ASFS_SB(sb)->bitmapbase + start / ASFS_SB(sb)->blocks_inbitmap; ++ u32 breakpoint; ++ int bitstart, bitend; ++ int reads; ++ ++ if (enoughspace(sb, maxneeded) == FALSE) { ++ *returned_block = 0; ++ *returned_blocks = 0; ++ return -ENOSPC; ++ } ++ ++ if (start >= ASFS_SB(sb)->totalblocks) ++ start -= ASFS_SB(sb)->totalblocks; ++ ++ if (end == 0) ++ end = ASFS_SB(sb)->totalblocks; ++ ++ reads = ((end - 1) / ASFS_SB(sb)->blocks_inbitmap) + 1 - start / ASFS_SB(sb)->blocks_inbitmap; ++ ++ if (start >= end) ++ reads += (ASFS_SB(sb)->totalblocks - 1) / ASFS_SB(sb)->blocks_inbitmap + 1; ++ ++ breakpoint = (start < end ? end : ASFS_SB(sb)->totalblocks); ++ ++ *returned_block = 0; ++ *returned_blocks = 0; ++ ++ bitend = start % ASFS_SB(sb)->blocks_inbitmap; ++ block = start - bitend; ++ ++ while ((bh = asfs_breadcheck(sb, bitmapblock++, ASFS_BITMAP_ID))) { ++ struct fsBitmap *b = (void *) bh->b_data; ++ u32 localbreakpoint = breakpoint - block; ++ ++ if (localbreakpoint > ASFS_SB(sb)->blocks_inbitmap) ++ localbreakpoint = ASFS_SB(sb)->blocks_inbitmap; ++ ++ /* At this point space contains the amount of free blocks at ++ the end of the previous bitmap block. If there are no ++ free blocks at the start of this bitmap block, space will ++ be set to zero, since in that case the space isn't adjacent. */ ++ ++ while ((bitstart = bmffo(b->bitmap, longs, bitend)) < ASFS_SB(sb)->blocks_inbitmap) { ++ /* found the start of an empty space, now find out how large it is */ ++ ++ if (bitstart >= localbreakpoint) ++ break; ++ ++ if (bitstart != 0) ++ space = 0; ++ ++ bitend = bmffz(b->bitmap, longs, bitstart); ++ ++ if (bitend > localbreakpoint) ++ bitend = localbreakpoint; ++ ++ space += bitend - bitstart; ++ ++ if (*returned_blocks < space) { ++ *returned_block = block + bitend - space; ++ if (space >= maxneeded) { ++ *returned_blocks = maxneeded; ++ asfs_brelse(bh); ++ return 0; ++ } ++ *returned_blocks = space; ++ } ++ ++ if (bitend >= localbreakpoint) ++ break; ++ } ++ ++ if (--reads == 0) ++ break; ++ ++ /* no (more) empty spaces found in this block */ ++ ++ if (bitend != ASFS_SB(sb)->blocks_inbitmap) ++ space = 0; ++ ++ bitend = 0; ++ block += ASFS_SB(sb)->blocks_inbitmap; ++ ++ if (block >= ASFS_SB(sb)->totalblocks) { ++ block = 0; ++ space = 0; ++ breakpoint = end; ++ bitmapblock = ASFS_SB(sb)->bitmapbase; ++ } ++ asfs_brelse(bh); ++ } ++ ++ if (bh == NULL) ++ return -EIO; ++ ++ asfs_brelse(bh); ++ ++ if (*returned_blocks == 0) ++ return -ENOSPC; ++ else ++ return 0; ++} ++ ++int asfs_markspace(struct super_block *sb, u32 block, u32 blocks) ++{ ++ int errorcode; ++ ++ asfs_debug("markspace: Marking %d blocks from block %d\n", blocks, block); ++ ++ if ((availablespace(sb, block, blocks)) < blocks) { ++ printk("ASFS: Attempted to mark %d blocks from block %d, but some of them were already full!\n", blocks, block); ++ return -EIO; ++ } ++ ++ if ((errorcode = setfreeblocks(sb, ASFS_SB(sb)->freeblocks - blocks)) == 0) { ++ struct buffer_head *bh; ++ u32 skipblocks = block / ASFS_SB(sb)->blocks_inbitmap; ++ u32 longs = (sb->s_blocksize - sizeof(struct fsBitmap)) >> 2; ++ u32 bitmapblock; ++ ++ block -= skipblocks * ASFS_SB(sb)->blocks_inbitmap; ++ bitmapblock = ASFS_SB(sb)->bitmapbase + skipblocks; ++ ++ while (blocks > 0) { ++ if ((bh = asfs_breadcheck(sb, bitmapblock++, ASFS_BITMAP_ID))) { ++ struct fsBitmap *b = (void *) bh->b_data; ++ ++ blocks -= bmclr(b->bitmap, longs, block, blocks); ++ block = 0; ++ ++ asfs_bstore(sb, bh); ++ asfs_brelse(bh); ++ } else ++ return -EIO; ++ } ++ } ++ ++ return (errorcode); ++} ++ ++ /* This function checks the bitmap and tries to locate at least /blocksneeded/ ++ adjacent unused blocks. If found it sets returned_block to the start block ++ and returns no error. If not found, ERROR_DISK_IS_FULL is returned and ++ returned_block is set to zero. Any other errors are returned as well. */ ++ ++static inline int internalfindspace(struct super_block *sb, u32 blocksneeded, u32 startblock, u32 endblock, u32 * returned_block) ++{ ++ u32 blocks; ++ int errorcode; ++ ++ if ((errorcode = asfs_findspace(sb, blocksneeded, startblock, endblock, returned_block, &blocks)) == 0) ++ if (blocks != blocksneeded) ++ return -ENOSPC; ++ ++ return errorcode; ++} ++ ++static int findandmarkspace(struct super_block *sb, u32 blocksneeded, u32 * returned_block) ++{ ++ int errorcode; ++ ++ if (enoughspace(sb, blocksneeded) != FALSE) { ++ if ((errorcode = internalfindspace(sb, blocksneeded, 0, ASFS_SB(sb)->totalblocks, returned_block)) == 0) ++ errorcode = asfs_markspace(sb, *returned_block, blocksneeded); ++ } else ++ errorcode = -ENOSPC; ++ ++ return (errorcode); ++} ++ ++/* ************************** */ ++ ++int asfs_freespace(struct super_block *sb, u32 block, u32 blocks) ++{ ++ int errorcode; ++ ++ asfs_debug("freespace: Freeing %d blocks from block %d\n", blocks, block); ++ ++ if ((errorcode = setfreeblocks(sb, ASFS_SB(sb)->freeblocks + blocks)) == 0) { ++ struct buffer_head *bh; ++ u32 skipblocks = block / ASFS_SB(sb)->blocks_inbitmap; ++ u32 longs = (sb->s_blocksize - sizeof(struct fsBitmap)) >> 2; ++ u32 bitmapblock; ++ ++ block -= skipblocks * ASFS_SB(sb)->blocks_inbitmap; ++ bitmapblock = ASFS_SB(sb)->bitmapbase + skipblocks; ++ ++ while (blocks > 0) { ++ if ((bh = asfs_breadcheck(sb, bitmapblock++, ASFS_BITMAP_ID))) { ++ struct fsBitmap *b = (void *) bh->b_data; ++ ++ blocks -= bmset(b->bitmap, longs, block, blocks); ++ block = 0; ++ ++ asfs_bstore(sb, bh); ++ asfs_brelse(bh); ++ } else ++ return -EIO; ++ } ++ } ++ ++ return (errorcode); ++} ++ ++/*************** admin space containers ****************/ ++ ++int asfs_allocadminspace(struct super_block *sb, u32 *returned_block) ++{ ++ struct buffer_head *bh; ++ u32 adminspaceblock = ASFS_SB(sb)->adminspacecontainer; ++ int errorcode = -EIO; ++ ++ asfs_debug("allocadminspace: allocating new block\n"); ++ ++ while ((bh = asfs_breadcheck(sb, adminspaceblock, ASFS_ADMINSPACECONTAINER_ID))) { ++ struct fsAdminSpaceContainer *asc1 = (void *) bh->b_data; ++ struct fsAdminSpace *as1 = asc1->adminspace; ++ int adminspaces1 = (sb->s_blocksize - sizeof(struct fsAdminSpaceContainer)) / sizeof(struct fsAdminSpace); ++ ++ while (adminspaces1-- > 0) { ++ s16 bitoffset; ++ ++ if (as1->space != 0 && (bitoffset = bfffz(be32_to_cpu(as1->bits), 0)) >= 0) { ++ u32 emptyadminblock = be32_to_cpu(as1->space) + bitoffset; ++ as1->bits |= cpu_to_be32(1 << (31 - bitoffset)); ++ asfs_bstore(sb, bh); ++ *returned_block = emptyadminblock; ++ asfs_brelse(bh); ++ asfs_debug("allocadminspace: found block %d\n", *returned_block); ++ return 0; ++ } ++ as1++; ++ } ++ ++ adminspaceblock = be32_to_cpu(asc1->next); ++ asfs_brelse(bh); ++ ++ if (adminspaceblock == 0) { ++ u32 startblock; ++ ++ asfs_debug("allocadminspace: allocating new adminspace area\n"); ++ ++ /* If we get here it means current adminspace areas are all filled. ++ We would now need to find a new area and create a fsAdminSpace ++ structure in one of the AdminSpaceContainer blocks. If these ++ don't have any room left for new adminspace areas a new ++ AdminSpaceContainer would have to be created first which is ++ placed as the first block in the newly found admin area. */ ++ ++ adminspaceblock = ASFS_SB(sb)->adminspacecontainer; ++ ++ if ((errorcode = findandmarkspace(sb, 32, &startblock))) ++ return errorcode; ++ ++ while ((bh = asfs_breadcheck(sb, adminspaceblock, ASFS_ADMINSPACECONTAINER_ID))) { ++ struct fsAdminSpaceContainer *asc2 = (void *) bh->b_data; ++ struct fsAdminSpace *as2 = asc2->adminspace; ++ int adminspaces2 = (sb->s_blocksize - sizeof(struct fsAdminSpaceContainer)) / sizeof(struct fsAdminSpace); ++ ++ while (adminspaces2-- > 0 && as2->space != 0) ++ as2++; ++ ++ if (adminspaces2 >= 0) { /* Found a unused AdminSpace in this AdminSpaceContainer! */ ++ as2->space = cpu_to_be32(startblock); ++ as2->bits = 0; ++ asfs_bstore(sb, bh); ++ asfs_brelse(bh); ++ break; ++ } ++ ++ if (asc2->next == 0) { ++ /* Oh-oh... we marked our new adminspace area in use, but we couldn't ++ find space to store a fsAdminSpace structure in the existing ++ fsAdminSpaceContainer blocks. This means we need to create and ++ link a new fsAdminSpaceContainer as the first block in our newly ++ marked adminspace. */ ++ ++ asc2->next = cpu_to_be32(startblock); ++ asfs_bstore(sb, bh); ++ asfs_brelse(bh); ++ ++ /* Now preparing new AdminSpaceContainer */ ++ ++ if ((bh = asfs_getzeroblk(sb, startblock)) == NULL) ++ return -EIO; ++ ++ asc2 = (void *) bh->b_data; ++ asc2->bheader.id = cpu_to_be32(ASFS_ADMINSPACECONTAINER_ID); ++ asc2->bheader.ownblock = cpu_to_be32(startblock); ++ asc2->previous = cpu_to_be32(adminspaceblock); ++ asc2->adminspace[0].space = cpu_to_be32(startblock); ++ asc2->adminspace[0].bits = cpu_to_be32(0x80000000); ++ asc2->bits = 32; ++ ++ asfs_bstore(sb, bh); ++ asfs_brelse(bh); ++ ++ adminspaceblock = startblock; ++ break; /* Breaks through to outer loop! */ ++ } ++ adminspaceblock = be32_to_cpu(asc2->next); ++ asfs_brelse(bh); ++ } ++ } ++ } ++ return errorcode; ++} ++ ++int asfs_freeadminspace(struct super_block *sb, u32 block) ++{ ++ struct buffer_head *bh; ++ u32 adminspaceblock = ASFS_SB(sb)->adminspacecontainer; ++ ++ asfs_debug("freeadminspace: Entry -- freeing block %d\n", block); ++ ++ while ((bh = asfs_breadcheck(sb, adminspaceblock, ASFS_ADMINSPACECONTAINER_ID))) { ++ struct fsAdminSpaceContainer *asc = (void *) bh->b_data; ++ struct fsAdminSpace *as = asc->adminspace; ++ int adminspaces = (sb->s_blocksize - sizeof(struct fsAdminSpaceContainer)) / sizeof(struct fsAdminSpace); ++ ++ while (adminspaces-- > 0) { ++ if (block >= be32_to_cpu(as->space) && block < be32_to_cpu(as->space) + 32) { ++ s16 bitoffset = block - be32_to_cpu(as->space); ++ asfs_debug("freeadminspace: Block to be freed is located in AdminSpaceContainer block at %d\n", adminspaceblock); ++ as->bits &= cpu_to_be32(~(1 << (31 - bitoffset))); ++ asfs_bstore(sb, bh); ++ asfs_brelse(bh); ++ return 0; ++ } ++ as++; ++ } ++ ++ if ((adminspaceblock = be32_to_cpu(asc->next)) == 0) ++ break; ++ ++ asfs_brelse(bh); ++ } ++ ++ if (bh != NULL) { ++ asfs_brelse(bh); ++ printk("ASFS: Unable to free an administration block. The block cannot be found."); ++ return -ENOENT; ++ } ++ ++ return -EIO; ++} ++ ++#endif +diff -urN linux-2.6.3/fs/asfs/asfs_fs.h linux-2.6.3-asfs-1.0b7/fs/asfs/asfs_fs.h +--- linux-2.6.3/fs/asfs/asfs_fs.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.3-asfs-1.0b7/fs/asfs/asfs_fs.h 2004-06-10 19:28:16.000000000 +0200 +@@ -0,0 +1,227 @@ ++#ifndef __LINUX_ASFS_FS_H ++#define __LINUX_ASFS_FS_H ++ ++#include ++#include ++#include ++#include ++#include ++ ++#define asfs_debug(fmt,arg...) /* no debug at all */ ++//#define asfs_debug(fmt,arg...) printk(fmt,##arg) /* general debug infos */ ++ ++#if !defined (__BIG_ENDIAN) && !defined (__LITTLE_ENDIAN) ++#error Endianes must be known for ASFS to work. Sorry. ++#endif ++ ++#define ASFS_DEFAULT_UID 0 ++#define ASFS_DEFAULT_GID 0 ++#define ASFS_DEFAULT_MODE 0644 /* default permission bits for files, dirs have same permission, but with "x" set */ ++ ++/* Extent structure located in RAM (e.g. inside inode structure), ++ currently used to store last used extent */ ++ ++struct inramExtent { ++ u32 startblock; /* Block from begginig of the file */ ++ u32 key; ++ u32 next; ++ u16 blocks; ++}; ++ ++/* inode in-kernel data */ ++ ++struct asfs_inode_info { ++ u32 firstblock; ++ u32 hashtable; ++ int modified; ++ loff_t mmu_private; ++ struct inramExtent ext_cache; ++ struct inode vfs_inode; ++}; ++ ++/* short cut to get to the asfs specific inode data */ ++static inline struct asfs_inode_info *ASFS_I(struct inode *inode) ++{ ++ return list_entry(inode, struct asfs_inode_info, vfs_inode); ++} ++ ++/* Amiga SFS superblock in-core data */ ++ ++struct asfs_sb_info { ++ u32 totalblocks; ++ u32 rootobjectcontainer; ++ u32 extentbnoderoot; ++ u32 objectnoderoot; ++ ++ u32 adminspacecontainer; ++ u32 bitmapbase; ++ u32 freeblocks; ++ u32 blocks_inbitmap; ++ u32 blocks_bitmap; ++ u32 block_rovingblockptr; ++ ++ uid_t uid; ++ gid_t gid; ++ umode_t mode; ++ u16 flags; ++ char *prefix; ++ char *root_volume; /* Volume prefix for absolute symlinks. */ ++}; ++ ++/* short cut to get to the asfs specific sb data */ ++static inline struct asfs_sb_info *ASFS_SB(struct super_block *sb) ++{ ++ return sb->s_fs_info; ++} ++ ++/* io inline code */ ++ ++u32 asfs_calcchecksum(void *block, u32 blocksize); ++ ++static inline int ++asfs_check_block(struct fsBlockHeader *block, u32 blocksize, u32 n, u32 id) ++{ ++ if (asfs_calcchecksum(block, blocksize) == ++ be32_to_cpu(((struct fsBlockHeader *) block)->checksum) && ++ n == be32_to_cpu(((struct fsBlockHeader *) block)->ownblock) && ++ id == be32_to_cpu(((struct fsBlockHeader *) block)->id)) ++ return TRUE; ++ return FALSE; ++} ++ ++/* get fs structure from block and do some checks... */ ++static inline struct buffer_head * ++asfs_breadcheck(struct super_block *sb, u32 n, u32 type) ++{ ++ struct buffer_head *bh; ++ if ((bh = sb_bread(sb, n))) { ++ if (asfs_check_block ((void *)bh->b_data, sb->s_blocksize, n, type)) { ++ return bh; /* all okay */ ++ } ++ brelse(bh); ++ } ++ return NULL; /* error */ ++} ++ ++static inline struct buffer_head * ++asfs_getzeroblk(struct super_block *sb, int block) ++{ ++ struct buffer_head *bh; ++ bh = sb_getblk(sb, block); ++ lock_buffer(bh); ++ memset(bh->b_data, 0, sb->s_blocksize); ++ set_buffer_uptodate(bh); ++ unlock_buffer(bh); ++ return bh; ++} ++ ++static inline void ++asfs_bstore(struct super_block *sb, struct buffer_head *bh) ++{ ++ ((struct fsBlockHeader *) (bh->b_data))->checksum = ++ cpu_to_be32(asfs_calcchecksum(bh->b_data, sb->s_blocksize)); ++ mark_buffer_dirty(bh); ++} ++ ++static inline void asfs_brelse(struct buffer_head *bh) ++{ ++ brelse(bh); ++} ++ ++static inline void dec_count(struct inode *inode) ++{ ++ inode->i_nlink--; ++ mark_inode_dirty(inode); ++} ++ ++/* all prototypes */ ++ ++/* adminspace.c */ ++int asfs_allocadminspace(struct super_block *sb, u32 * block); ++int asfs_freeadminspace(struct super_block *sb, u32 block); ++int asfs_markspace(struct super_block *sb, u32 block, u32 blocks); ++int asfs_freespace(struct super_block *sb, u32 block, u32 blocks); ++int asfs_findspace(struct super_block *sb, u32 maxneeded, u32 start, u32 end, ++ u32 * returned_block, u32 * returned_blocks); ++ ++/* dir.c */ ++int asfs_readdir(struct file *filp, void *dirent, filldir_t filldir); ++struct dentry *asfs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd); ++ ++/* extents.c */ ++int asfs_getextent(struct super_block *sb, u32 key, struct buffer_head **ret_bh, ++ struct fsExtentBNode **ret_ebn); ++int asfs_deletebnode(struct super_block *sb, struct buffer_head *cb, u32 key); ++int asfs_deleteextents(struct super_block *sb, u32 key); ++int asfs_addblocks(struct super_block *sb, u16 blocks, u32 newspace, ++ u32 objectnode, u32 * io_lastextentbnode); ++ ++/* file.c */ ++int asfs_readpage(struct file *file, struct page *page); ++sector_t asfs_bmap(struct address_space *mapping, sector_t block); ++int asfs_writepage(struct page *page, struct writeback_control *wbc); ++int asfs_prepare_write(struct file *file, struct page *page, unsigned from, ++ unsigned to); ++void asfs_truncate(struct inode *inode); ++int asfs_file_open(struct inode *inode, struct file *filp); ++int asfs_file_release(struct inode *inode, struct file *filp); ++ ++/* inode.c */ ++struct inode *asfs_get_root_inode(struct super_block *sb); ++void asfs_read_locked_inode(struct inode *inode, void *arg); ++int asfs_create(struct inode *dir, struct dentry *dentry, int mode, struct nameidata *nd); ++int asfs_mkdir(struct inode *dir, struct dentry *dentry, int mode); ++int asfs_symlink(struct inode *dir, struct dentry *dentry, const char *symname); ++int asfs_rmdir(struct inode *dir, struct dentry *dentry); ++int asfs_unlink(struct inode *dir, struct dentry *dentry); ++int asfs_rename(struct inode *old_dir, struct dentry *old_dentry, ++ struct inode *new_dir, struct dentry *new_dentry); ++int asfs_notify_change(struct dentry *dentry, struct iattr *attr); ++ ++/* namei */ ++u8 asfs_lowerchar(u8 c); ++int asfs_namecmp(u8 *s, u8 *ct, int casesensitive); ++u16 asfs_hash(u8 *name, int casesensitive); ++ ++/* nodes */ ++int asfs_getnode(struct super_block *sb, u32 nodeno, ++ struct buffer_head **ret_bh, struct fsObjectNode **ret_node); ++int asfs_createnode(struct super_block *sb, struct buffer_head **returned_cb, ++ struct fsNode **returned_node, u32 * returned_nodeno); ++int asfs_deletenode(struct super_block *sb, u32 objectnode); ++ ++/* objects */ ++struct fsObject *asfs_nextobject(struct fsObject *obj); ++struct fsObject *asfs_find_obj_by_name(struct super_block *sb, ++ struct fsObjectContainer *objcont, u8 * name); ++int asfs_readobject(struct super_block *sb, u32 objectnode, ++ struct buffer_head **cb, struct fsObject **returned_object); ++int asfs_createobject(struct super_block *sb, struct buffer_head **io_cb, ++ struct fsObject **io_o, struct fsObject *src_o, ++ u8 * objname, int force); ++int asfs_deleteobject(struct super_block *sb, struct buffer_head *cb, ++ struct fsObject *o); ++int asfs_renameobject(struct super_block *sb, struct buffer_head *cb1, ++ struct fsObject *o1, struct buffer_head *cbparent, ++ struct fsObject *oparent, u8 * newname); ++ ++int asfs_addblockstofile(struct super_block *sb, struct buffer_head *objcb, ++ struct fsObject *o, u32 blocks, u32 * newspace, ++ u32 * addedblocks); ++int asfs_truncateblocksinfile(struct super_block *sb, struct buffer_head *bh, ++ struct fsObject *o, u32 newsize); ++ ++/* super.c */ ++struct super_block *asfs_read_super(struct super_block *sb, void *data, ++ int silent); ++void asfs_put_super(struct super_block *sb); ++int asfs_statfs(struct super_block *sb, struct kstatfs *buf); ++int asfs_remount(struct super_block *sb, int *flags, char *data); ++struct inode *asfs_alloc_inode(struct super_block *sb); ++void asfs_destroy_inode(struct inode *inode); ++ ++/* symlink.c */ ++int asfs_symlink_readpage(struct file *file, struct page *page); ++int asfs_write_symlink(struct inode *symfile, const char *symname); ++ ++#endif +diff -urN linux-2.6.3/fs/asfs/bitfuncs.c linux-2.6.3-asfs-1.0b7/fs/asfs/bitfuncs.c +--- linux-2.6.3/fs/asfs/bitfuncs.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.3-asfs-1.0b7/fs/asfs/bitfuncs.c 2004-06-14 17:38:04.000000000 +0200 +@@ -0,0 +1,171 @@ ++/* ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License ++ * as published by the Free Software Foundation; either version ++ * 2 of the License, or (at your option) any later version. ++ * ++ */ ++ ++#include ++#include ++#include "bitfuncs.h" ++ ++/* Bitmap (bm) functions: ++ These functions perform bit-operations on regions of memory which ++ are a multiple of 4 bytes in length. Bitmap is in bigendian byte order. ++*/ ++ ++/* This function finds the first set bit in a region of memory starting ++ with /bitoffset/. The region of memory is /longs/ longs long. It ++ returns the bitoffset of the first set bit it finds. */ ++ ++int bmffo(u32 *bitmap, int longs, int bitoffset) ++{ ++ u32 *scan = bitmap; ++ int longoffset, bit; ++ ++ longoffset = bitoffset >> 5; ++ longs -= longoffset; ++ scan += longoffset; ++ ++ bitoffset = bitoffset & 0x1F; ++ ++ if (bitoffset != 0) { ++ if ((bit = bfffo(be32_to_cpu(*scan), bitoffset)) >= 0) { ++ return (bit + ((scan - bitmap) << 5)); ++ } ++ scan++; ++ longs--; ++ } ++ ++ while (longs-- > 0) { ++ if (*scan++ != 0) { ++ return (bfffo(be32_to_cpu(*--scan), 0) + ((scan - bitmap) << 5)); ++ } ++ } ++ ++ return (-1); ++} ++ ++/* This function finds the first unset bit in a region of memory starting ++ with /bitoffset/. The region of memory is /longs/ longs long. It ++ returns the bitoffset of the first unset bit it finds. */ ++ ++int bmffz(u32 *bitmap, int longs, int bitoffset) ++{ ++ u32 *scan = bitmap; ++ int longoffset, bit; ++ ++ longoffset = bitoffset >> 5; ++ longs -= longoffset; ++ scan += longoffset; ++ ++ bitoffset = bitoffset & 0x1F; ++ ++ if (bitoffset != 0) { ++ if ((bit = bfffz(be32_to_cpu(*scan), bitoffset)) >= 0) { ++ return (bit + ((scan - bitmap) << 5)); ++ } ++ scan++; ++ longs--; ++ } ++ ++ while (longs-- > 0) { ++ if (*scan++ != 0xFFFFFFFF) { ++ return (bfffz(be32_to_cpu(*--scan), 0) + ((scan - bitmap) << 5)); ++ } ++ } ++ ++ return (-1); ++} ++ ++/* This function clears /bits/ bits in a region of memory starting ++ with /bitoffset/. The region of memory is /longs/ longs long. If ++ the region of memory is too small to clear /bits/ bits then this ++ function exits after having cleared all bits till the end of the ++ memory region. In any case it returns the number of bits which ++ were actually cleared. */ ++ ++int bmclr(u32 *bitmap, int longs, int bitoffset, int bits) ++{ ++ u32 *scan = bitmap; ++ int longoffset; ++ int orgbits = bits; ++ ++ longoffset = bitoffset >> 5; ++ longs -= longoffset; ++ scan += longoffset; ++ ++ bitoffset = bitoffset & 0x1F; ++ ++ if (bitoffset != 0) { ++ if (bits < 32) { ++ *scan = cpu_to_be32(bfclr(be32_to_cpu(*scan), bitoffset, bits)); ++ } else { ++ *scan = cpu_to_be32(bfclr(be32_to_cpu(*scan), bitoffset, 32)); ++ } ++ scan++; ++ longs--; ++ bits -= 32 - bitoffset; ++ } ++ ++ while (bits > 0 && longs-- > 0) { ++ if (bits > 31) { ++ *scan++ = 0; ++ } else { ++ *scan = cpu_to_be32(bfclr(be32_to_cpu(*scan), 0, bits)); ++ } ++ bits -= 32; ++ } ++ ++ if (bits <= 0) { ++ return (orgbits); ++ } ++ return (orgbits - bits); ++} ++ ++/* This function sets /bits/ bits in a region of memory starting ++ with /bitoffset/. The region of memory is /longs/ longs long. If ++ the region of memory is too small to set /bits/ bits then this ++ function exits after having set all bits till the end of the ++ memory region. In any case it returns the number of bits which ++ were actually set. */ ++ ++int bmset(u32 *bitmap, int longs, int bitoffset, int bits) ++{ ++ u32 *scan = bitmap; ++ int longoffset; ++ int orgbits = bits; ++ ++ longoffset = bitoffset >> 5; ++ longs -= longoffset; ++ scan += longoffset; ++ ++ bitoffset = bitoffset & 0x1F; ++ ++ if (bitoffset != 0) { ++ if (bits < 32) { ++ *scan = cpu_to_be32(bfset(be32_to_cpu(*scan), bitoffset, bits)); ++ } else { ++ *scan = cpu_to_be32(bfset(be32_to_cpu(*scan), bitoffset, 32)); ++ } ++ scan++; ++ longs--; ++ bits -= 32 - bitoffset; ++ } ++ ++ while (bits > 0 && longs-- > 0) { ++ if (bits > 31) { ++ *scan++ = 0xFFFFFFFF; ++ } else { ++ *scan = cpu_to_be32(bfset(be32_to_cpu(*scan), 0, bits)); ++ } ++ bits -= 32; ++ } ++ ++ if (bits <= 0) { ++ return (orgbits); ++ } ++ return (orgbits - bits); ++} +diff -urN linux-2.6.3/fs/asfs/bitfuncs.h linux-2.6.3-asfs-1.0b7/fs/asfs/bitfuncs.h +--- linux-2.6.3/fs/asfs/bitfuncs.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.3-asfs-1.0b7/fs/asfs/bitfuncs.h 2004-06-10 18:57:14.000000000 +0200 +@@ -0,0 +1,58 @@ ++/* ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License ++ * as published by the Free Software Foundation; either version ++ * 2 of the License, or (at your option) any later version. ++ * ++ */ ++ ++#ifndef __BITFUNCS_H ++#define __BITFUNCS_H ++ ++#include ++#include ++ ++#include ++ ++/* Finds first set bit in /data/ starting at /bitoffset/. This function ++ considers the MSB to be the first bit. */ ++static inline int bfffo(u32 data, int bitoffset) ++{ ++ u32 mask = 0xffffffff >> bitoffset; ++ data &= mask; ++ return data == 0 ? -1 : 32-fls(data); ++} ++ ++/* Finds first zero bit in /data/ starting at /bitoffset/. This function ++ considers the MSB to be the first bit. */ ++static inline int bfffz(u32 data, int bitoffset) ++{ ++ return bfffo(~data, bitoffset); ++} ++ ++/* Sets /bits/ bits starting from /bitoffset/ in /data/. ++ /bits/ must be between 1 and 32. */ ++static inline u32 bfset(u32 data, int bitoffset, int bits) ++{ ++ u32 mask = ~((1 << (32 - bits)) - 1); ++ mask >>= bitoffset; ++ return data | mask; ++} ++ ++/* Clears /bits/ bits starting from /bitoffset/ in /data/. ++ /bits/ must be between 1 and 32. */ ++static inline u32 bfclr(u32 data, int bitoffset, int bits) ++{ ++ u32 mask = ~((1 << (32 - bits)) - 1); ++ mask >>= bitoffset; ++ return data & ~mask; ++} ++ ++/* bm??? functions assumes that in-memory bitmap is in bigendian byte order */ ++int bmffo(u32 *, int, int); ++int bmffz(u32 *, int, int); ++int bmclr(u32 *, int, int, int); ++int bmset(u32 *, int, int, int); ++ ++#endif +diff -urN linux-2.6.3/fs/asfs/Changes linux-2.6.3-asfs-1.0b7/fs/asfs/Changes +--- linux-2.6.3/fs/asfs/Changes 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.3-asfs-1.0b7/fs/asfs/Changes 2004-06-25 22:44:01.646070896 +0200 +@@ -0,0 +1,101 @@ ++ ++Amiga Smart File System, Linux implementation ++ ++Please direct bug reports to: marek@amiga.pl ++ ++History: ++ ++v1.0beta7 (25.06.2004) ++- small changes in documentation ++- code clean up: bitfuncs.c, super.c, inode.c, *.h, Makefile, added ++ asfs_ prefix to function names, made some functions static ++ (big thanks to Christoph Hellwig for advice!) ++- fixed minor bugs (inode leak in super.c, not-realesed buffer during ++ object renaming in inode.c) ++- now files/dirs are created with global ownership/permission bits ++ ++v1.0beta6 (04.06.2004) ++- fixed: ASFS_SB(sb)->flags was always zero in 2.6.x code ++ ++v1.0beta5 (07.05.2004) ++- finally fixed a problem with file size attrib. not being written ++ to disk ++- fixed some problems with GCC 3.x and debug enabled ++ ++v1.0beta4 (12.04.2004) ++- removed dummy asfs_notify_change (this fixes major bug introduced ++ in 1.0beta3 - file size wasn't written to disk) until it will ++ be implemented completely ++ ++v1.0beta3 (22.03.2004) - still beta ++- updated for 2.6.x kernels VFS changes ++- code clean-up ++- added dummy asfs_notify_change (chmod now returns no errors) ++- added symlinks write support ++- fixed: ASFS_SB(sb)->flags was always zero ++ ++v1.0beta2 (11.01.2004) - special version for Pegasos][ kernel ++- separated read and write functions, can be compiled also ++ as read-only fs ++ ++v1.0beta1 (02.12.2003) - first public beta with write support ++- added dentry hashing/comparing routines ++- code clean-up ++ ++v1.0aplha4 (30.11.2003) - preparing for first public beta ++- fixed some problems with renaming/moving files ++- fixed two major bugs, which didn't occur when fs was mounted ++ on loopback device (newly allocated blocks were not written to ++ disk and state bits were not set correctly on newly mapped file ++ blocks) ++- fixed many small bugs in io code (some buffers were not freed) ++- added/modified sb locks in asfs_lookup and asfs_getblock ++- fixed serious bug in file block allocation routines ++ ++v1.0aplha3 (23.11.2003) ++- added (hopefully) all byteswap code, should now work again on ++ little-endian systems (also with write support!) ++- updated documentation ++ ++v1.0alpha2 (13.11.2003) ++- now alocates file blocks in chunks during one request ++- fixed some dead-locks, other fixes ++ ++v1.0alpha (02.11.2003) - first working version with full write support ++- too much to list it here ;) ++ ++... (working on write support) ++ ++v0.7 (12.10.2003) - internal realase ++- added asfs_breadcheck, modified asfs_get_node, asfs_search_BTree, ++ no more from_be32/16 macros, other... ++- code splitted into several files ++ ++v0.6 (04.09.2003) - final read-only version ++- added support for HashTables, directory scaning should be ++ MUCH faster now ++- added checking of block IDs before reading any data from block ++ ++v0.5 (19.07.2003) ++- added simple but effective extent cache - real speed-up ++ in reading large files ++- added read support for symlinks - based on AFFS symlinks ++ ++v0.4 (10.07.2003) ++- third code clean-up (thanks to Roman Zippel for advice) ++- now uses generic readpage and readinode routines ++ ++v0.3beta (17.06.2003) ++- second code clean-up ++ ++v0.2beta2 (15.06.2003) ++- fixed yet another stupid bug - driver can't read root block on little-endian systems ++v0.2beta (15.06.2003) ++- fixed stupid bug - now files have 'file' flag (S_IFREG) set... ++- added mount options to set uid, gid and mode of files and dirs ++- made hidden files & dirs really hidden (= not listed in directories) ++- code clean-up ++ ++v0.1beta (11.06.2003) ++- after many kernel crashes, finally got it! ++- first working read-only filesystem driver +diff -urN linux-2.6.3/fs/asfs/dir.c linux-2.6.3-asfs-1.0b7/fs/asfs/dir.c +--- linux-2.6.3/fs/asfs/dir.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.3-asfs-1.0b7/fs/asfs/dir.c 2004-06-17 00:44:35.000000000 +0200 +@@ -0,0 +1,217 @@ ++/* ++ * ++ * Amiga Smart File System, Linux implementation ++ * version: 1.0beta7 ++ * ++ * Copyright (C) 2003,2004 Marek 'March' Szyprowski ++ * ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License ++ * as published by the Free Software Foundation; either version ++ * 2 of the License, or (at your option) any later version. ++ * ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include "asfs_fs.h" ++ ++#include ++ ++extern struct dentry_operations asfs_dentry_operations; ++ ++int asfs_readdir(struct file *filp, void *dirent, filldir_t filldir) ++{ ++ struct inode *dir = filp->f_dentry->d_inode; ++ struct super_block *sb = dir->i_sb; ++ unsigned long f_pos; ++ int stored = 0; ++ ++ struct buffer_head *bh; ++ struct fsObjectContainer *objcont; ++ struct fsObject *obj; ++ u32 block; ++ int startnode; ++ int add; ++ ++ asfs_debug("asfs_readdir:\n"); ++ ++ if (filp->f_pos == ASFS_SB(sb)->totalblocks) ++ return stored; ++ ++ f_pos = filp->f_pos; ++ ++ if (f_pos == 0) { ++ filp->private_data = (void *)0; ++ if (filldir(dirent, ".", 1, f_pos, dir->i_ino, DT_DIR) < 0) ++ return 0; ++ filp->f_pos = f_pos = 1; ++ stored++; ++ } ++ if (f_pos == 1) { ++ if (filldir(dirent, "..", 2, f_pos, parent_ino(filp->f_dentry), DT_DIR) < 0) ++ return stored; ++ filp->f_pos = f_pos = 2; ++ stored++; ++ } ++ ++ if (ASFS_I(dir)->firstblock == 0) { /* empty directory */ ++ filp->f_pos = ASFS_SB(sb)->totalblocks; ++ ASFS_I(dir)->modified = 0; ++ return stored; ++ } ++ ++ if (f_pos == 2) { /* reading directory from its beginning */ ++ block = ASFS_I(dir)->firstblock; ++ add = 1; ++ startnode = 0; ++ } else { ++ startnode = (int)filp->private_data; ++ add = 0; ++ if (ASFS_I(dir)->modified == 0) ++ block = f_pos; ++ else ++ block = ASFS_I(dir)->firstblock; ++ } ++ ++ do { ++ if (!(bh = asfs_breadcheck(sb, block, ASFS_OBJECTCONTAINER_ID))) ++ return stored; ++ objcont = (struct fsObjectContainer *) bh->b_data; ++ obj = &(objcont->object[0]); ++ ++ while (be32_to_cpu(obj->objectnode) > 0 && ++ ((char *)obj - (char *)objcont) + sizeof(struct fsObject) + 2 < sb->s_blocksize) { ++ ++ if (!add && be32_to_cpu(obj->objectnode) == startnode) ++ add++; ++ ++ if (add && !(obj->bits & OTYPE_HIDDEN)) { ++ unsigned int type; ++ asfs_debug("ASFS: DirFilling: entry #%d \"%s\" (node %u offset %u), type %x\n", \ ++ stored, obj->name, be32_to_cpu(obj->objectnode), block, obj->bits); ++ filp->f_pos = block; ++ ++ if (obj->bits & OTYPE_DIR) ++ type = DT_DIR; ++ else if (obj->bits & OTYPE_LINK && !(obj->bits & OTYPE_HARDLINK)) ++ type = DT_LNK; ++ else ++ type = DT_REG; ++ ++ if (filldir(dirent, obj->name, strlen(obj->name), block, be32_to_cpu(obj->objectnode), type) < 0) { ++ filp->private_data = (void *)be32_to_cpu(obj->objectnode); ++ ASFS_I(dir)->modified = 0; ++ asfs_debug("ASFS: DirFilling: to be continued...\n"); ++ asfs_brelse(bh); ++ return stored; ++ } ++ stored++; ++ } ++ obj = asfs_nextobject(obj); ++ } ++ block = be32_to_cpu(objcont->next); ++ asfs_brelse(bh); ++ ++ } while (block != 0); ++ ++ filp->f_pos = ASFS_SB(sb)->totalblocks; ++ ASFS_I(dir)->modified = 0; ++ ++ return stored; ++} ++ ++struct dentry *asfs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd) ++{ ++ int res = -EACCES; /* placeholder for "no data here" */ ++ struct inode *inode; ++ struct super_block *sb = dir->i_sb; ++ u8 *name = (u8 *) dentry->d_name.name; ++ struct buffer_head *bh; ++ struct fsObject *obj; ++ ++ asfs_debug("asfs_lookup: (searching \"%s\"...) ", name); ++ ++ lock_super(sb); ++ ++ if (ASFS_I(dir)->hashtable != 0) { /* hashtable block is available, quick search */ ++ struct fsObjectNode *node_p; ++ struct buffer_head *node_bh; ++ u32 node; ++ u16 hash16; ++ ++ asfs_debug("(quick search) "); ++ ++ if (!(bh = asfs_breadcheck(sb, ASFS_I(dir)->hashtable, ASFS_HASHTABLE_ID))) { ++ unlock_super(sb); ++ return ERR_PTR(res); ++ } ++ hash16 = asfs_hash(name, ASFS_SB(sb)->flags & ASFS_ROOTBITS_CASESENSITIVE); ++ node = be32_to_cpu(((struct fsHashTable *) bh->b_data)->hashentry[HASHCHAIN(hash16)]); ++ asfs_brelse(bh); ++ ++ while (node != 0) { ++ if (asfs_getnode(sb, node, &node_bh, &node_p) != 0) ++ goto not_found; ++ if (be16_to_cpu(node_p->hash16) == hash16) { ++ if (!(bh = asfs_breadcheck(sb, be32_to_cpu(node_p->node.data), ASFS_OBJECTCONTAINER_ID))) { ++ asfs_brelse(node_bh); ++ unlock_super(sb); ++ return ERR_PTR(res); ++ } ++ if ((obj = asfs_find_obj_by_name(sb, (struct fsObjectContainer *) bh->b_data, name)) != NULL) { ++ asfs_brelse(node_bh); ++ goto found_inode; ++ } ++ asfs_brelse(bh); ++ } ++ node = be32_to_cpu(node_p->next); ++ asfs_brelse(node_bh); ++ } ++ } else { /* hashtable not available, long search */ ++ struct fsObjectContainer *objcont; ++ u32 block; ++ ++ asfs_debug("(long search) "); ++ ++ block = ASFS_I(dir)->firstblock; ++ while (block != 0) { ++ if (!(bh = asfs_breadcheck(sb, block, ASFS_OBJECTCONTAINER_ID))) { ++ unlock_super(sb); ++ return ERR_PTR(res); ++ } ++ objcont = (struct fsObjectContainer *) bh->b_data; ++ if ((obj = asfs_find_obj_by_name(sb, objcont, name)) != NULL) ++ goto found_inode; ++ block = be32_to_cpu(objcont->next); ++ asfs_brelse(bh); ++ } ++ } ++ ++not_found: ++ unlock_super(sb); ++ inode = NULL; ++ asfs_debug("object not found.\n"); ++ if (0) { ++found_inode: ++ unlock_super(sb); ++ if (!(inode = iget_locked(sb, be32_to_cpu(obj->objectnode)))) { ++ asfs_debug("ASFS: Strange - no inode allocated.\n"); ++ return ERR_PTR(res); ++ } ++ if (inode->i_state & I_NEW) { ++ asfs_read_locked_inode(inode, obj); ++ unlock_new_inode(inode); ++ } ++ asfs_brelse(bh); ++ } ++ res = 0; ++ dentry->d_op = &asfs_dentry_operations; ++ d_add(dentry, inode); ++ return ERR_PTR(res); ++} +diff -urN linux-2.6.3/fs/asfs/extents.c linux-2.6.3-asfs-1.0b7/fs/asfs/extents.c +--- linux-2.6.3/fs/asfs/extents.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.3-asfs-1.0b7/fs/asfs/extents.c 2004-06-10 17:56:26.000000000 +0200 +@@ -0,0 +1,586 @@ ++/* ++ * ++ * Amiga Smart File System, Linux implementation ++ * version: 1.0beta7 ++ * ++ * This file contains some parts of the original amiga version of ++ * SmartFilesystem source code. ++ * ++ * SmartFilesystem is copyrighted (C) 2003 by: John Hendrikx, ++ * Ralph Schmidt, Emmanuel Lesueur, David Gerber and Marcin Kurek ++ * ++ * Adapted and modified by Marek 'March' Szyprowski ++ * ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include "asfs_fs.h" ++ ++#include ++ ++ /* This function looks for the BNode equal to the key. If no ++ exact match is available then the BNode which is slightly ++ lower than key will be returned. If no such BNode exists ++ either, then the first BNode in this block is returned. ++ ++ This function will return the first BNode even if there ++ are no BNode's at all in this block (this can only happen ++ for the Root of the tree). Be sure to check if the Root ++ is not empty before calling this function. */ ++ ++static struct BNode *searchforbnode(u32 key, struct BTreeContainer *tc) ++{ ++ struct BNode *tn; ++ s16 n = be16_to_cpu(tc->nodecount) - 1; ++ ++ tn = (struct BNode *) ((u8 *) tc->bnode + n * tc->nodesize); ++ for (;;) { ++ if (n <= 0 || key >= be32_to_cpu(tn->key)) ++ return tn; ++ ++ tn = (struct BNode *) ((u8 *) tn - tc->nodesize); ++ n--; ++ } ++} ++ ++/* This function finds the BNode with the given key. If no exact match can be ++ found then this function will return either the next or previous closest ++ match (don't rely on this). ++ ++ If there were no BNode's at all, then *returned_bh will be NULL. */ ++ ++static int findbnode(struct super_block *sb, u32 key, struct buffer_head **returned_bh, struct BNode **returned_bnode) ++{ ++ u32 rootblock = ASFS_SB(sb)->extentbnoderoot; ++ ++ asfs_debug("findbnode: Looking for BNode with key %d\n", key); ++ ++ while ((*returned_bh = asfs_breadcheck(sb, rootblock, ASFS_BNODECONTAINER_ID))) { ++ struct fsBNodeContainer *bnc = (void *) (*returned_bh)->b_data; ++ struct BTreeContainer *btc = &bnc->btc; ++ ++ if (btc->nodecount == 0) { ++ *returned_bnode = NULL; ++ break; ++ } ++ ++ *returned_bnode = searchforbnode(key, btc); ++ if (btc->isleaf == TRUE) ++ break; ++ ++ rootblock = be32_to_cpu((*returned_bnode)->data); ++ asfs_brelse(*returned_bh); ++ } ++ ++ if (*returned_bh == NULL) ++ return -EIO; ++ ++ return 0; ++} ++ ++int asfs_getextent(struct super_block *sb, u32 key, struct buffer_head **ret_bh, struct fsExtentBNode **ret_ebn) ++{ ++ int result; ++ if ((result = findbnode(sb, key, ret_bh, (struct BNode **)ret_ebn)) == 0) ++ if (be32_to_cpu((*ret_ebn)->key) != key) { ++ brelse(*ret_bh); ++ *ret_bh = NULL; ++ return -ENOENT; ++ } ++ ++ return result; ++} ++ ++#ifdef CONFIG_ASFS_RW ++ ++ /* This routine inserts a node sorted into a BTreeContainer. It does ++ this by starting at the end, and moving the nodes one by one to ++ a higher slot until the empty slot has the correct position for ++ this key. Donot use this function on completely filled ++ BTreeContainers! */ ++ ++static struct BNode *insertbnode(u32 key, struct BTreeContainer *btc) ++{ ++ struct BNode *bn; ++ bn = (struct BNode *) ((u8 *) btc->bnode + btc->nodesize * (be16_to_cpu(btc->nodecount) - 1)); ++ ++ for (;;) { ++ if (bn < btc->bnode || key > be32_to_cpu(bn->key)) { ++ bn = (struct BNode *) ((u8 *) bn + btc->nodesize); ++ bn->key = cpu_to_be32(key); ++ btc->nodecount = cpu_to_be16(be16_to_cpu(btc->nodecount) + 1); ++ break; ++ } else ++ memmove((u8 *)bn + btc->nodesize, bn, btc->nodesize); ++ ++ bn = (struct BNode *) ((u8 *) bn - btc->nodesize); ++ } ++ ++ return bn; ++} ++ ++static int getparentbtreecontainer(struct super_block *sb, struct buffer_head *bh, struct buffer_head **parent_bh) ++{ ++ u32 rootblock = ASFS_SB(sb)->extentbnoderoot; ++ u32 childkey = be32_to_cpu(((struct fsBNodeContainer *) bh->b_data)->btc.bnode[0].key); ++ u32 childblock = be32_to_cpu(((struct fsBNodeContainer *) bh->b_data)->bheader.ownblock); ++ ++ asfs_debug("getparentbtreecontainer: Getting parent of block %d\n", childblock); ++ ++ /* This function gets the BTreeContainer parent of the passed in buffer_head. If ++ there is no parent this function sets dest_cont io_bh to NULL */ ++ ++ if (rootblock != childblock) { ++ while ((*parent_bh = asfs_breadcheck(sb, rootblock, ASFS_BNODECONTAINER_ID))) { ++ struct fsBNodeContainer *bnc = (void *) (*parent_bh)->b_data; ++ struct BTreeContainer *btc = &bnc->btc; ++ struct BNode *bn; ++ s16 n = be16_to_cpu(btc->nodecount); ++ ++ if (btc->isleaf == TRUE) { ++ asfs_brelse(*parent_bh); ++ break; ++ } ++ ++ while (n-- > 0) ++ if (be32_to_cpu(btc->bnode[n].data) == childblock) ++ return 0; /* Found parent!! */ ++ ++ bn = searchforbnode(childkey, btc); /* This searchforbnode() doesn't have to get EXACT key matches. */ ++ rootblock = be32_to_cpu(bn->data); ++ asfs_brelse(*parent_bh); ++ } ++ if (*parent_bh == NULL) ++ return -EIO; ++ } ++ ++ *parent_bh = NULL; ++ return 0; ++} ++ ++/* Spits a btreecontainer. It realses passed in bh! */ ++ ++static int splitbtreecontainer(struct super_block *sb, struct buffer_head *bh) ++{ ++ struct buffer_head *bhparent; ++ struct BNode *bn; ++ int errorcode; ++ ++ asfs_debug("splitbtreecontainer: splitting block %u\n", be32_to_cpu(((struct fsBlockHeader *) bh->b_data)->ownblock)); ++ ++ if ((errorcode = getparentbtreecontainer(sb, bh, &bhparent)) == 0) { ++ if (bhparent == NULL) { ++ u32 newbcontblock; ++ u32 bcontblock; ++ /* We need to create Root tree-container - adding new level to extent tree */ ++ ++ asfs_debug("splitbtreecontainer: creating root tree-container.\n"); ++ ++ bhparent = bh; ++ if ((errorcode = asfs_allocadminspace(sb, &newbcontblock)) == 0 && (bh = asfs_getzeroblk(sb, newbcontblock))) { ++ struct fsBNodeContainer *bnc = (void *) bh->b_data; ++ struct fsBNodeContainer *bncparent = (void *) bhparent->b_data; ++ struct BTreeContainer *btcparent = &bncparent->btc; ++ ++ bcontblock = be32_to_cpu(bncparent->bheader.ownblock); ++ memcpy(bh->b_data, bhparent->b_data, sb->s_blocksize); ++ bnc->bheader.ownblock = cpu_to_be32(newbcontblock); ++ asfs_bstore(sb, bh); ++ ++ memset(bhparent->b_data, '\0', sb->s_blocksize); /* Not strictly needed, but makes things more clear. */ ++ bncparent->bheader.id = cpu_to_be32(ASFS_BNODECONTAINER_ID); ++ bncparent->bheader.ownblock = cpu_to_be32(bcontblock); ++ btcparent->isleaf = FALSE; ++ btcparent->nodesize = sizeof(struct BNode); ++ btcparent->nodecount = 0; ++ ++ bn = insertbnode(0, btcparent); ++ bn->data = cpu_to_be32(newbcontblock); ++ ++ asfs_bstore(sb, bhparent); ++ } ++ if (bh == NULL) ++ errorcode = -EIO; ++ } ++ ++ if (errorcode == 0) { ++ struct fsBNodeContainer *bncparent = (void *) bhparent->b_data; ++ struct BTreeContainer *btcparent = &bncparent->btc; ++ int branches1 = (sb->s_blocksize - sizeof(struct fsBNodeContainer)) / btcparent->nodesize; ++ ++ if (be16_to_cpu(btcparent->nodecount) == branches1) { ++ /* We need to split the parent tree-container first! */ ++ if ((errorcode = splitbtreecontainer(sb, bhparent)) == 0) { ++ /* bhparent might have changed after the split and has been released */ ++ if ((errorcode = getparentbtreecontainer(sb, bh, &bhparent)) == 0) { ++ bncparent = (void *) bhparent->b_data; ++ btcparent = &bncparent->btc; ++ } ++ } ++ } ++ ++ if (errorcode == 0) { ++ u32 newbcontblock; ++ struct buffer_head *bhnew; ++ ++ /* We can split this container and add it to the parent ++ because the parent has enough room. */ ++ ++ if ((errorcode = asfs_allocadminspace(sb, &newbcontblock)) == 0 && (bhnew = asfs_getzeroblk(sb, newbcontblock))) { ++ struct fsBNodeContainer *bncnew = (void *) bhnew->b_data; ++ struct BTreeContainer *btcnew = &bncnew->btc; ++ struct fsBNodeContainer *bnc = (void *) bh->b_data; ++ struct BTreeContainer *btc = &bnc->btc; ++ int branches2 = (sb->s_blocksize - sizeof(struct fsBNodeContainer)) / btc->nodesize; ++ u32 newkey; ++ ++ bncnew->bheader.id = cpu_to_be32(ASFS_BNODECONTAINER_ID); ++ bncnew->bheader.ownblock = cpu_to_be32(newbcontblock); ++ ++ btcnew->isleaf = btc->isleaf; ++ btcnew->nodesize = btc->nodesize; ++ ++ btcnew->nodecount = cpu_to_be16(branches2 - branches2 / 2); ++ ++ memcpy(btcnew->bnode, (u8 *) btc->bnode + branches2 / 2 * btc->nodesize, (branches2 - branches2 / 2) * btc->nodesize); ++ newkey = be32_to_cpu(btcnew->bnode[0].key); ++ ++ asfs_bstore(sb, bhnew); ++ asfs_brelse(bhnew); ++ ++ btc->nodecount = cpu_to_be16(branches2 / 2); ++ asfs_bstore(sb, bh); ++ ++ bn = insertbnode(newkey, btcparent); ++ bn->data = cpu_to_be32(newbcontblock); ++ asfs_bstore(sb, bhparent); ++ } ++ } ++ } ++ asfs_brelse(bhparent); ++ } ++ asfs_brelse(bh); ++ ++ return errorcode; ++} ++ ++/* Returns created extentbnode - returned_bh need to saved and realesed in caller funkction! */ ++ ++int createextentbnode(struct super_block *sb, u32 key, struct buffer_head **returned_bh, struct BNode **returned_bnode) ++{ ++ int errorcode; ++ ++ asfs_debug("createbnode: Creating BNode with key %d\n", key); ++ ++ while ((errorcode = findbnode(sb, key, returned_bh, returned_bnode)) == 0) { ++ struct fsBNodeContainer *bnc = (void *) (*returned_bh)->b_data; ++ struct BTreeContainer *btc = &bnc->btc; ++ int extbranches = (sb->s_blocksize - sizeof(struct fsBNodeContainer)) / btc->nodesize; ++ ++ asfs_debug("createbnode: findbnode found block %d\n", be32_to_cpu(((struct fsBlockHeader *) (*returned_bh)->b_data)->ownblock)); ++ ++ if (be16_to_cpu(btc->nodecount) < extbranches) { ++ /* Simply insert new node in this BTreeContainer */ ++ asfs_debug("createbnode: Simple insert\n"); ++ *returned_bnode = insertbnode(key, btc); ++ break; ++ } else if ((errorcode = splitbtreecontainer(sb, *returned_bh)) != 0) ++ break; ++ ++ /* Loop and try insert it the normal way again :-) */ ++ } ++ ++ return (errorcode); ++} ++ ++ ++/* This routine removes a node from a BTreeContainer indentified ++ by its key. If no such key exists this routine does nothing. ++ It correctly handles empty BTreeContainers. */ ++ ++static void removebnode(u32 key, struct BTreeContainer *btc) ++{ ++ struct BNode *bn = btc->bnode; ++ int n = 0; ++ ++ asfs_debug("removebnode: key %d\n", key); ++ ++ while (n < be16_to_cpu(btc->nodecount)) { ++ if (be32_to_cpu(bn->key) == key) { ++ btc->nodecount = cpu_to_be16(be16_to_cpu(btc->nodecount) - 1); ++ memmove(bn, (u8 *) bn + btc->nodesize, (be16_to_cpu(btc->nodecount) - n) * btc->nodesize); ++ break; ++ } ++ bn = (struct BNode *) ((u8 *) bn + btc->nodesize); ++ n++; ++ } ++} ++ ++int asfs_deletebnode(struct super_block *sb, struct buffer_head *bh, u32 key) ++{ ++ struct fsBNodeContainer *bnc1 = (void *) bh->b_data; ++ struct BTreeContainer *btc = &bnc1->btc; ++ u16 branches = (sb->s_blocksize - sizeof(struct fsBNodeContainer)) / btc->nodesize; ++ int errorcode = 0; ++ ++ /* Deletes specified internal node. */ ++ ++ removebnode(key, btc); ++ asfs_bstore(sb, bh); ++ ++ /* Now checks if the container still contains enough nodes, ++ and takes action accordingly. */ ++ ++ asfs_debug("deletebnode: branches = %d, btc->nodecount = %d\n", branches, be16_to_cpu(btc->nodecount)); ++ ++ if (be16_to_cpu(btc->nodecount) < (branches + 1) / 2) { ++ struct buffer_head *bhparent; ++ struct buffer_head *bhsec; ++ ++ /* nodecount has become to low. We need to merge this Container ++ with a neighbouring Container, or we need to steal a few nodes ++ from a neighbouring Container. */ ++ ++ /* We get the parent of the container here, so we can find out what ++ containers neighbour the container which currently hasn't got enough nodes. */ ++ ++ if ((errorcode = getparentbtreecontainer(sb, bh, &bhparent)) == 0) { ++ if (bhparent != NULL) { ++ struct fsBNodeContainer *bncparent = (void *) bhparent->b_data; ++ struct BTreeContainer *btcparent = &bncparent->btc; ++ s16 n; ++ ++ asfs_debug("deletebnode: get parent returned block %d.\n", be32_to_cpu(((struct fsBlockHeader *) bhparent->b_data)->ownblock)); ++ ++ for (n = 0; n < be16_to_cpu(btcparent->nodecount); n++) ++ if (btcparent->bnode[n].data == bnc1->bheader.ownblock) ++ break; ++ /* n is now the offset of our own bnode. */ ++ ++ if (n < be16_to_cpu(btcparent->nodecount) - 1) { /* Check if we have a next neighbour. */ ++ asfs_debug("deletebnode: using next container - merging blocks %d and %d\n", be32_to_cpu(bnc1->bheader.ownblock), be32_to_cpu(btcparent->bnode[n+1].data)); ++ ++ if ((bhsec = asfs_breadcheck(sb, be32_to_cpu(btcparent->bnode[n + 1].data), ASFS_BNODECONTAINER_ID))) { ++ struct fsBNodeContainer *bnc_next = (void *) bhsec->b_data; ++ struct BTreeContainer *btc_next = &bnc_next->btc; ++ ++ if (be16_to_cpu(btc_next->nodecount) + be16_to_cpu(btc->nodecount) > branches) { /* Check if we need to steal nodes. */ ++ s16 nodestosteal = (be16_to_cpu(btc_next->nodecount) + be16_to_cpu(btc->nodecount)) / 2 - be16_to_cpu(btc->nodecount); ++ ++ /* Merging them is not possible. Steal a few nodes then. */ ++ memcpy((u8 *) btc->bnode + be16_to_cpu(btc->nodecount) * btc->nodesize, btc_next->bnode, nodestosteal * btc->nodesize); ++ btc->nodecount = cpu_to_be16(be16_to_cpu(btc->nodecount) + nodestosteal); ++ asfs_bstore(sb, bh); ++ ++ memcpy(btc_next->bnode, (u8 *) btc_next->bnode + btc_next->nodesize * nodestosteal, ++ btc->nodesize * (be16_to_cpu(btc_next->nodecount) - nodestosteal)); ++ btc_next->nodecount = cpu_to_be16(be16_to_cpu(btc_next->nodecount) - nodestosteal); ++ asfs_bstore(sb, bhsec); ++ ++ btcparent->bnode[n + 1].key = btc_next->bnode[0].key; ++ asfs_bstore(sb, bhparent); ++ } else { /* Merging is possible. */ ++ memcpy((u8 *) btc->bnode + btc->nodesize * be16_to_cpu(btc->nodecount), btc_next->bnode, btc->nodesize * be16_to_cpu(btc_next->nodecount)); ++ btc->nodecount = cpu_to_be16(be16_to_cpu(btc->nodecount) + be16_to_cpu(btc_next->nodecount)); ++ asfs_bstore(sb, bh); ++ ++ if ((errorcode = asfs_freeadminspace(sb, be32_to_cpu(((struct fsBlockHeader *) bhsec->b_data)->ownblock))) == 0) ++ errorcode = asfs_deletebnode(sb, bhparent, be32_to_cpu(btcparent->bnode[n + 1].key)); ++ } ++ asfs_brelse(bhsec); ++ } ++ } else if (n > 0) { /* Check if we have a previous neighbour. */ ++ asfs_debug("deletebnode: using prev container.\n"); ++ ++ if ((bhsec = asfs_breadcheck(sb, be32_to_cpu(btcparent->bnode[n - 1].data), ASFS_BNODECONTAINER_ID)) == 0) { ++ struct fsBNodeContainer *bnc2 = (void *) bhsec->b_data; ++ struct BTreeContainer *btc2 = &bnc2->btc; ++ ++ if (be16_to_cpu(btc2->nodecount) + be16_to_cpu(btc->nodecount) > branches) { ++ /* Merging them is not possible. Steal a few nodes then. */ ++ s16 nodestosteal = (be16_to_cpu(btc2->nodecount) + be16_to_cpu(btc->nodecount)) / 2 - be16_to_cpu(btc->nodecount); ++ ++ memmove((u8 *) btc->bnode + nodestosteal * btc->nodesize, btc->bnode, be16_to_cpu(btc->nodecount) * btc->nodesize); ++ btc->nodecount = cpu_to_be16(be16_to_cpu(btc->nodecount) + nodestosteal); ++ memcpy(btc->bnode, (u8 *) btc2->bnode + (be16_to_cpu(btc2->nodecount) - nodestosteal) * btc2->nodesize, nodestosteal * btc->nodesize); ++ ++ asfs_bstore(sb, bh); ++ ++ btc2->nodecount = cpu_to_be16(be16_to_cpu(btc2->nodecount) - nodestosteal); ++ asfs_bstore(sb, bhsec); ++ ++ btcparent->bnode[n].key = btc->bnode[0].key; ++ asfs_bstore(sb, bhparent); ++ } else { /* Merging is possible. */ ++ memcpy((u8 *) btc2->bnode + be16_to_cpu(btc2->nodecount) * btc2->nodesize, btc->bnode, be16_to_cpu(btc->nodecount) * btc->nodesize); ++ btc2->nodecount = cpu_to_be16(be16_to_cpu(btc2->nodecount) + be16_to_cpu(btc->nodecount)); ++ asfs_bstore(sb, bhsec); ++ ++ if ((errorcode = asfs_freeadminspace(sb, be32_to_cpu(((struct fsBlockHeader *) bhsec->b_data)->ownblock))) == 0) ++ errorcode = asfs_deletebnode(sb, bhparent, be32_to_cpu(btcparent->bnode[n].key)); ++ } ++ asfs_brelse(bhsec); ++ } ++ } ++ /* else ++ { ++ // Never happens, except for root and then we don't care. ++ } */ ++ } else if (btc->nodecount == 1) { ++ /* No parent, so must be root. */ ++ ++ asfs_debug("deletebnode: no parent so must be root\n"); ++ ++ if (btc->isleaf == FALSE) { ++ struct fsBNodeContainer *bnc3 = (void *) bh->b_data; ++ ++ /* The current root has only 1 node. We now copy the data of this node into the ++ root and promote that data to be the new root. The rootblock number stays the ++ same that way. */ ++ ++ if ((bhsec = asfs_breadcheck(sb, be32_to_cpu(btc->bnode[0].data), ASFS_BNODECONTAINER_ID))) { ++ u32 blockno = be32_to_cpu(((struct fsBlockHeader *) bh->b_data)->ownblock); ++ memcpy(bh->b_data, bhsec->b_data, sb->s_blocksize); ++ bnc3->bheader.ownblock = cpu_to_be32(blockno); ++ ++ asfs_bstore(sb, bh); ++ errorcode = asfs_freeadminspace(sb, be32_to_cpu(((struct fsBlockHeader *) bhsec->b_data)->ownblock)); ++ asfs_brelse(bhsec); ++ } else ++ errorcode = -EIO; ++ } ++ /* If not, then root contains leafs. */ ++ } ++ ++ asfs_debug("deletebnode: almost done\n"); ++ /* otherwise, it must be the root, and the root is allowed ++ to contain less than the minimum amount of nodes. */ ++ ++ } ++ if (bhparent != NULL) ++ asfs_brelse(bhparent); ++ } ++ ++ return errorcode; ++} ++ ++ /* Deletes an fsExtentBNode structure by key and any fsExtentBNodes linked to it. ++ This function DOES NOT fix the next pointer in a possible fsExtentBNode which ++ might have been pointing to the first BNode we are deleting. Make sure you check ++ this yourself, if needed. ++ ++ If key is zero, than this function does nothing. */ ++ ++int asfs_deleteextents(struct super_block *sb, u32 key) ++{ ++ struct buffer_head *bh; ++ struct fsExtentBNode *ebn; ++ int errorcode = 0; ++ ++ asfs_debug("deleteextents: Entry -- deleting extents from key %d\n", key); ++ ++ while (key != 0 && (errorcode = findbnode(sb, key, &bh, (struct BNode **) &ebn)) == 0) { ++ /* node to be deleted located. */ ++ key = be32_to_cpu(ebn->next); ++ if ((errorcode = asfs_freespace(sb, be32_to_cpu(ebn->key), be16_to_cpu(ebn->blocks))) != 0) ++ break; ++ ++ if ((errorcode = asfs_deletebnode(sb, bh, be32_to_cpu(ebn->key))) != 0) ++ break; ++ ++ asfs_brelse(bh); ++ } ++ ++ return (errorcode); ++} ++ ++ /* This function adds /blocks/ blocks starting at block /newspace/ to a file ++ identified by /objectnode/ and /lastextentbnode/. /io_lastextentbnode/ can ++ be zero if there is no ExtentBNode chain attached to this file yet. ++ /blocks/ ranges from 1 to 8192. To be able to extend Extents which are ++ almost full, it is wise to make this value no higher than 8192 blocks. ++ /io_lastextentbnode/ will contain the new lastextentbnode value when this ++ function completes. ++ If there was no chain yet, then this function will create a new one. */ ++ ++int asfs_addblocks(struct super_block *sb, u16 blocks, u32 newspace, u32 objectnode, u32 *io_lastextentbnode) ++{ ++ struct buffer_head *bh; ++ struct fsExtentBNode *ebn; ++ int errorcode = 0; ++ ++ if (*io_lastextentbnode != 0) { ++ /* There was already a ExtentBNode chain for this file. Extending it. */ ++ ++ asfs_debug(" addblocks: Extending existing ExtentBNode chain.\n"); ++ ++ if ((errorcode = asfs_getextent(sb, *io_lastextentbnode, &bh, &ebn)) == 0) { ++ if (be32_to_cpu(ebn->key) + be16_to_cpu(ebn->blocks) == newspace && be16_to_cpu(ebn->blocks) + blocks < 65536) { ++ /* It is possible to extent the last ExtentBNode! */ ++ asfs_debug(" addblocks: Extending last ExtentBNode.\n"); ++ ++ ebn->blocks = cpu_to_be16(be16_to_cpu(ebn->blocks) + blocks); ++ ++ asfs_bstore(sb, bh); ++ asfs_brelse(bh); ++ } else { ++ /* It isn't possible to extent the last ExtentBNode so we create ++ a new one and link it to the last ExtentBNode. */ ++ ++ ebn->next = cpu_to_be32(newspace); ++ asfs_bstore(sb, bh); ++ asfs_brelse(bh); ++ ++ if ((errorcode = createextentbnode(sb, newspace, &bh, (struct BNode **) &ebn)) == 0) { ++ asfs_debug(" addblocks: Created new ExtentBNode.\n"); ++ ++ ebn->key = cpu_to_be32(newspace); ++ ebn->prev = cpu_to_be32(*io_lastextentbnode); ++ ebn->next = 0; ++ ebn->blocks = cpu_to_be16(blocks); ++ ++ *io_lastextentbnode = newspace; ++ ++ asfs_bstore(sb, bh); ++ asfs_brelse(bh); ++ ++ ASFS_SB(sb)->block_rovingblockptr = newspace + blocks; ++ ++ /* to be changed in the future */ ++/* if (ASFS_SB(sb)->block_rovingblockptr >= ASFS_SB(sb)->totalblocks) ++ ASFS_SB(sb)->block_rovingblockptr = 0;*/ ++ } ++ } ++ } ++ } else { ++ /* There is no ExtentBNode chain yet for this file. Attaching one! */ ++ if ((errorcode = createextentbnode(sb, newspace, &bh, (struct BNode **) &ebn)) == 0) { ++ asfs_debug(" addblocks: Created new ExtentBNode chain.\n"); ++ ++ ebn->key = cpu_to_be32(newspace); ++ ebn->prev = cpu_to_be32(objectnode + 0x80000000); ++ ebn->next = 0; ++ ebn->blocks = cpu_to_be16(blocks); ++ ++ *io_lastextentbnode = newspace; ++ ++ asfs_bstore(sb, bh); ++ asfs_brelse(bh); ++ ++ ASFS_SB(sb)->block_rovingblockptr = newspace + blocks; ++ ++/* if (ASFS_SB(sb)->block_rovingblockptr >= ASFS_SB(sb)->totalblocks) ++ ASFS_SB(sb)->block_rovingblockptr = 0;*/ ++ } ++ } ++ ++ asfs_debug(" addblocks: done.\n"); ++ ++ return errorcode; ++} ++#endif +diff -urN linux-2.6.3/fs/asfs/file.c linux-2.6.3-asfs-1.0b7/fs/asfs/file.c +--- linux-2.6.3/fs/asfs/file.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.3-asfs-1.0b7/fs/asfs/file.c 2004-06-10 01:42:01.000000000 +0200 +@@ -0,0 +1,251 @@ ++/* ++ * ++ * Amiga Smart File System, Linux implementation ++ * version: 1.0beta7 ++ * ++ * Copyright (C) 2003,2004 Marek 'March' Szyprowski ++ * ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License ++ * as published by the Free Software Foundation; either version ++ * 2 of the License, or (at your option) any later version. ++ * ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "asfs_fs.h" ++ ++#include ++ ++static int ++asfs_get_block(struct inode *inode, sector_t block, struct buffer_head *bh_result, int create) ++{ ++ struct buffer_head *ebn_bh; ++ struct fsExtentBNode extent, *ebn_p; ++ u32 filedata; ++ unsigned long pos; ++ struct super_block *sb = inode->i_sb; ++#ifdef CONFIG_ASFS_RW ++ int error; ++ struct buffer_head *bh; ++ struct fsObject *obj; ++#endif ++ ++ asfs_debug("ASFS: get_block(%lu, %ld, %d)\n", inode->i_ino, block, create); ++ ++ if (block < 0) { ++ printk(KERN_ERR "ASFS: asfsget_block: requested block (%ld) < 0!\n", block); ++ return -EIO; ++ } else if (block >= inode->i_blocks && !create) { ++ printk(KERN_ERR "ASFS: asfsget_block: strange block request %ld!\n", block); ++ return -EIO; ++ } ++ ++ if (create) ++#ifdef CONFIG_ASFS_RW ++ ASFS_I(inode)->modified = TRUE; ++#else ++ return -EROFS; ++#endif ++ ++ if (block < inode->i_blocks) ++ create = 0; ++ ++ lock_super(sb); ++ ++#ifdef CONFIG_ASFS_RW ++ if (create) { ++ int blockstoadd; ++ u32 newspace, addedblocks; ++ ++ blockstoadd = block - inode->i_blocks + 1; ++ ++ if (blockstoadd < ASFS_BLOCKCHUNKS) ++ blockstoadd = ASFS_BLOCKCHUNKS; ++ ++ asfs_debug("ASFS get_block: Trying to add %d blocks to file\n", blockstoadd); ++ ++ if ((error = asfs_readobject(sb, inode->i_ino, &bh, &obj)) != 0) { ++ unlock_super(sb); ++ return error; ++ } ++ ++ if ((error = asfs_addblockstofile(sb, bh, obj, blockstoadd, &newspace, &addedblocks)) != 0) { ++ asfs_brelse(bh); ++ unlock_super(sb); ++ return error; ++ } ++ ASFS_I(inode)->mmu_private += addedblocks * sb->s_blocksize; ++ inode->i_blocks += addedblocks; ++ ASFS_I(inode)->ext_cache.key = 0; ++ ASFS_I(inode)->firstblock = be32_to_cpu(obj->object.file.data); ++ asfs_brelse(bh); ++ } ++#endif ++ ++ if (ASFS_I(inode)->ext_cache.key > 0 && ASFS_I(inode)->ext_cache.startblock <= block) { ++ extent.key = ASFS_I(inode)->ext_cache.key; ++ extent.next = ASFS_I(inode)->ext_cache.next; ++ extent.blocks = ASFS_I(inode)->ext_cache.blocks; ++ pos = ASFS_I(inode)->ext_cache.startblock; ++ } else { ++ if (asfs_getextent(inode->i_sb, ASFS_I(inode)->firstblock, &ebn_bh, &ebn_p) != 0) { ++ unlock_super(sb); ++ return -EIO; ++ } ++ extent.key = be32_to_cpu(ebn_p->key); ++ extent.next = be32_to_cpu(ebn_p->next); ++ extent.blocks = be16_to_cpu(ebn_p->blocks); ++ pos = 0; ++ asfs_brelse(ebn_bh); ++ } ++ ebn_p = &extent; ++ filedata = ebn_p->next; ++ ++ while (pos + ebn_p->blocks <= block && ebn_p->next != 0 && pos < inode->i_blocks) { ++ pos += ebn_p->blocks; ++ if (asfs_getextent(inode->i_sb, filedata, &ebn_bh, &ebn_p) != 0) { ++ unlock_super(sb); ++ return -EIO; ++ } ++ extent.key = be32_to_cpu(ebn_p->key); ++ extent.next = be32_to_cpu(ebn_p->next); ++ extent.blocks = be16_to_cpu(ebn_p->blocks); ++ ebn_p = &extent; ++ filedata = ebn_p->next; ++ asfs_brelse(ebn_bh); ++ } ++ ++ unlock_super(sb); ++ ++ map_bh(bh_result, inode->i_sb, (sector_t) (ebn_p->key + block - pos)); ++ ++ if (create) ++ set_buffer_new(bh_result); ++ ++ asfs_debug("ASFS: get_block - mapped block %lu\n", ebn_p->key + block - pos); ++ ++ ASFS_I(inode)->ext_cache.startblock = pos; ++ ASFS_I(inode)->ext_cache.key = ebn_p->key; ++ ASFS_I(inode)->ext_cache.next = ebn_p->next; ++ ASFS_I(inode)->ext_cache.blocks = ebn_p->blocks; ++ ++ return 0; ++} ++ ++int asfs_readpage(struct file *file, struct page *page) ++{ ++ asfs_debug("ASFS: %s\n", __FUNCTION__); ++ return block_read_full_page(page, asfs_get_block); ++} ++ ++sector_t asfs_bmap(struct address_space *mapping, sector_t block) ++{ ++ asfs_debug("ASFS: %s\n", __FUNCTION__); ++ return generic_block_bmap(mapping,block,asfs_get_block); ++} ++ ++#ifdef CONFIG_ASFS_RW ++ ++int asfs_writepage(struct page *page, struct writeback_control *wbc) ++{ ++ asfs_debug("ASFS: %s\n", __FUNCTION__); ++ return block_write_full_page(page, asfs_get_block, wbc); ++} ++ ++int asfs_prepare_write(struct file *file, struct page *page, unsigned from, unsigned to) ++{ ++ asfs_debug("ASFS: %s\n", __FUNCTION__); ++ return cont_prepare_write(page, from, to, asfs_get_block, &ASFS_I(page->mapping->host)->mmu_private); ++} ++ ++void asfs_truncate(struct inode *inode) ++{ ++ struct super_block *sb = inode->i_sb; ++ struct buffer_head *bh; ++ struct fsObject *obj; ++ ++ asfs_debug("AFFS: truncate(inode=%d, oldsize=%u, newsize=%u)\n", ++ (u32)inode->i_ino, (u32)ASFS_I(inode)->mmu_private, (u32)inode->i_size); ++ ++ if (inode->i_size > ASFS_I(inode)->mmu_private) { ++ printk("ASFS: enlarging file is not supported yet\n"); ++ return; ++ } ++ ++ lock_super(sb); ++ ++ if ((asfs_readobject(sb, inode->i_ino, &bh, &obj)) != 0) { ++ unlock_super(sb); ++ return; ++ } ++ ++ if (asfs_truncateblocksinfile(sb, bh, obj, inode->i_size) != 0) { ++ asfs_brelse(bh); ++ unlock_super(sb); ++ return; ++ } ++ ++ obj->object.file.size = cpu_to_be32(inode->i_size); ++ ASFS_I(inode)->mmu_private = inode->i_size; ++ ASFS_I(inode)->modified = TRUE; ++ inode->i_blocks = (be32_to_cpu(obj->object.file.size) + sb->s_blocksize - 1) >> sb->s_blocksize_bits; ++ asfs_bstore(sb, bh); ++ asfs_brelse(bh); ++ ++ unlock_super(sb); ++} ++ ++int asfs_file_open(struct inode *inode, struct file *filp) ++{ ++ if (atomic_read(&filp->f_count) != 1) ++ return 0; ++ asfs_debug("ASFS: file open (node %d)\n", (int)inode->i_ino); ++ return 0; ++} ++ ++int asfs_file_release(struct inode *inode, struct file *filp) ++{ ++ int error = 0; ++ ++ asfs_debug("ASFS: file release (node %d oc %d)\n", (int)inode->i_ino, atomic_read(&filp->f_count)); ++ ++ if (atomic_read(&filp->f_count) != 0) ++ return 0; ++ ++ if (ASFS_I(inode)->modified == TRUE) { ++ struct buffer_head *bh; ++ struct fsObject *obj; ++ lock_super(inode->i_sb); ++ ++ if ((error = asfs_readobject(inode->i_sb, inode->i_ino, &bh, &obj)) != 0) { ++ unlock_super(inode->i_sb); ++ return error; ++ } ++ ++ obj->datemodified = cpu_to_be32(inode->i_mtime.tv_sec - (365*8+2)*24*60*60); ++ if (inode->i_mode & S_IFREG) { ++ error = asfs_truncateblocksinfile(inode->i_sb, bh, obj, (u32)inode->i_size); ++ obj->object.file.size = cpu_to_be32(inode->i_size); ++ ASFS_I(inode)->mmu_private = inode->i_size; ++ inode->i_blocks = (be32_to_cpu(obj->object.file.size) + inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits; ++ } ++ asfs_bstore(inode->i_sb, bh); ++ ++ unlock_super(inode->i_sb); ++ ++ asfs_brelse(bh); ++ } ++ ASFS_I(inode)->modified = FALSE; ++ ++ return error; ++} ++ ++#endif +diff -urN linux-2.6.3/fs/asfs/inode.c linux-2.6.3-asfs-1.0b7/fs/asfs/inode.c +--- linux-2.6.3/fs/asfs/inode.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.3-asfs-1.0b7/fs/asfs/inode.c 2004-06-17 00:39:10.000000000 +0200 +@@ -0,0 +1,414 @@ ++/* ++ * ++ * Amiga Smart File System, Linux implementation ++ * version: 1.0beta7 ++ * ++ * Copyright (C) 2003,2004 Marek 'March' Szyprowski ++ * ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License ++ * as published by the Free Software Foundation; either version ++ * 2 of the License, or (at your option) any later version. ++ * ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "asfs_fs.h" ++ ++#include ++ ++/* Mapping from our types to the kernel */ ++ ++static struct address_space_operations asfs_aops = { ++ .readpage = asfs_readpage, ++ .sync_page = block_sync_page, ++ .bmap = asfs_bmap, ++#ifdef CONFIG_ASFS_RW ++ .writepage = asfs_writepage, ++ .prepare_write = asfs_prepare_write, ++ .commit_write = generic_commit_write, ++#endif ++}; ++ ++static struct file_operations asfs_file_operations = { ++ .llseek = generic_file_llseek, ++ .read = generic_file_read, ++ .mmap = generic_file_mmap, ++#ifdef CONFIG_ASFS_RW ++ .write = generic_file_write, ++ .open = asfs_file_open, ++ .release = asfs_file_release, ++ .fsync = file_fsync, ++#endif ++}; ++ ++static struct file_operations asfs_dir_operations = { ++ .read = generic_read_dir, ++ .readdir = asfs_readdir, ++}; ++ ++static struct inode_operations asfs_dir_inode_operations = { ++ .lookup = asfs_lookup, ++#ifdef CONFIG_ASFS_RW ++ .create = asfs_create, ++ .unlink = asfs_unlink, ++ .symlink = asfs_symlink, ++ .mkdir = asfs_mkdir, ++ .rmdir = asfs_rmdir, ++ .rename = asfs_rename, ++/* .setattr = asfs_notify_change,*/ ++#endif ++}; ++ ++static struct inode_operations asfs_file_inode_operations = { ++#ifdef CONFIG_ASFS_RW ++ .truncate = asfs_truncate, ++/* .setattr = asfs_notify_change,*/ ++#endif ++}; ++ ++static struct address_space_operations asfs_symlink_aops = { ++ .readpage = asfs_symlink_readpage, ++}; ++ ++static struct inode_operations asfs_symlink_inode_operations = { ++ .readlink = page_readlink, ++ .follow_link = page_follow_link, ++#ifdef CONFIG_ASFS_RW ++/* .setattr = asfs_notify_change,*/ ++#endif ++}; ++ ++void asfs_read_locked_inode(struct inode *inode, void *arg) ++{ ++ struct super_block *sb = inode->i_sb; ++ struct fsObject *obj = arg; ++ ++ inode->i_mode = ASFS_SB(sb)->mode; ++ inode->i_mtime.tv_sec = inode->i_atime.tv_sec = inode->i_ctime.tv_sec = be32_to_cpu(obj->datemodified) + (365*8+2)*24*60*60; ++ /* Linux: seconds since 01-01-1970, AmigaSFS: seconds since 01-01-1978 */ ++ inode->i_mtime.tv_nsec = inode->i_ctime.tv_nsec = inode->i_atime.tv_nsec = 0; ++ inode->i_uid = ASFS_SB(sb)->uid; ++ inode->i_gid = ASFS_SB(sb)->gid; ++ ++ asfs_debug("asfs_read_inode2: Setting-up node %lu... ", inode->i_ino); ++ ++ if (obj->bits & OTYPE_DIR) { ++ asfs_debug("dir (FirstdirBlock: %u, HashTable %u)\n", \ ++ be32_to_cpu(obj->object.dir.firstdirblock), be32_to_cpu(obj->object.dir.hashtable)); ++ ++ inode->i_size = 0; ++ inode->i_op = &asfs_dir_inode_operations; ++ inode->i_fop = &asfs_dir_operations; ++ inode->i_mode |= S_IFDIR | ((inode->i_mode & 0400) ? 0100 : 0) | ++ ((inode->i_mode & 0040) ? 0010 : 0) | ((inode->i_mode & 0004) ? 0001 : 0); ++ ASFS_I(inode)->firstblock = be32_to_cpu(obj->object.dir.firstdirblock); ++ ASFS_I(inode)->hashtable = be32_to_cpu(obj->object.dir.hashtable); ++ ASFS_I(inode)->modified = 0; ++ } else if (obj->bits & OTYPE_LINK && !(obj->bits & OTYPE_HARDLINK)) { ++ asfs_debug("symlink\n"); ++ inode->i_size = 0; ++ inode->i_op = &asfs_symlink_inode_operations; ++ inode->i_mapping->a_ops = &asfs_symlink_aops; ++ inode->i_mode |= S_IFLNK | S_IRWXUGO; ++ ASFS_I(inode)->firstblock = be32_to_cpu(obj->object.file.data); ++ } else { ++ asfs_debug("file (Size: %u, FirstBlock: %u)\n", be32_to_cpu(obj->object.file.size), be32_to_cpu(obj->object.file.data)); ++ inode->i_size = be32_to_cpu(obj->object.file.size); ++ inode->i_blocks = (be32_to_cpu(obj->object.file.size) + sb->s_blocksize - 1) >> sb->s_blocksize_bits; ++ inode->i_op = &asfs_file_inode_operations; ++ inode->i_fop = &asfs_file_operations; ++ inode->i_mapping->a_ops = &asfs_aops; ++ inode->i_mode |= S_IFREG; ++ ASFS_I(inode)->firstblock = be32_to_cpu(obj->object.file.data); ++ ASFS_I(inode)->ext_cache.startblock = 0; ++ ASFS_I(inode)->ext_cache.key = 0; ++ ASFS_I(inode)->mmu_private = inode->i_size; ++ } ++ return; ++} ++ ++struct inode *asfs_get_root_inode(struct super_block *sb) ++{ ++ struct inode *result = NULL; ++ struct fsObject *obj; ++ struct buffer_head *bh; ++ ++ asfs_debug("asfs_get_root_inode\n"); ++ ++ if ((bh = asfs_breadcheck(sb, ASFS_SB(sb)->rootobjectcontainer, ASFS_OBJECTCONTAINER_ID))) { ++ obj = &(((struct fsObjectContainer *)bh->b_data)->object[0]); ++ if (be32_to_cpu(obj->objectnode) > 0) ++ result = iget_locked(sb, be32_to_cpu(obj->objectnode)); ++ ++ if (result != NULL && result->i_state & I_NEW) { ++ asfs_read_locked_inode(result, obj); ++ unlock_new_inode(result); ++ } ++ asfs_brelse(bh); ++ } ++ return result; ++} ++ ++#ifdef CONFIG_ASFS_RW ++ ++static void asfs_sync_dir_inode(struct inode *dir, struct fsObject *obj) ++{ ++ ASFS_I(dir)->firstblock = be32_to_cpu(obj->object.dir.firstdirblock); ++ ASFS_I(dir)->modified = 1; ++ dir->i_mtime = dir->i_atime = dir->i_ctime = CURRENT_TIME; ++ obj->datemodified = cpu_to_be32(dir->i_mtime.tv_sec - (365*8+2)*24*60*60); ++} ++ ++enum { it_file, it_dir, it_link }; ++ ++static int asfs_create_object(struct inode *dir, struct dentry *dentry, int mode, int type, const char *symname) ++{ ++ int error; ++ struct super_block *sb = dir->i_sb; ++ struct inode *inode; ++ struct buffer_head *bh, *dir_bh; ++ struct fsObject obj_data, *dir_obj, *obj; ++ u8 *name = (u8 *) dentry->d_name.name; ++ ++ asfs_debug("asfs_create_obj %s in dir node %d\n", name, (int)dir->i_ino); ++ ++ sb = dir->i_sb; ++ inode = new_inode(sb); ++ if (!inode) ++ return -ENOMEM; ++ ++ memset(&obj_data, 0, sizeof(struct fsObject)); ++ ++ obj_data.protection = cpu_to_be32(FIBF_READ|FIBF_WRITE|FIBF_EXECUTE|FIBF_DELETE); ++ obj_data.datemodified = cpu_to_be32(inode->i_mtime.tv_sec - (365*8+2)*24*60*60); ++ switch (type) { ++ case it_dir: ++ obj_data.bits = OTYPE_DIR; ++ break; ++ case it_link: ++ obj_data.bits = OTYPE_LINK; ++ break; ++ default: ++ break; ++ } ++ ++ lock_super(sb); ++ ++ if ((error = asfs_readobject(sb, dir->i_ino, &dir_bh, &dir_obj)) != 0) { ++ dec_count(inode); ++ unlock_super(sb); ++ return error; ++ } ++ ++ bh = dir_bh; ++ obj = dir_obj; ++ ++ if ((error = asfs_createobject(sb, &bh, &obj, &obj_data, name, FALSE)) != 0) { ++ asfs_brelse(dir_bh); ++ dec_count(inode); ++ unlock_super(sb); ++ return error; ++ } ++ ++ inode->i_ino = be32_to_cpu(obj->objectnode); ++ inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; ++ inode->i_size = inode->i_blocks = inode->i_blksize = 0; ++ inode->i_uid = dir->i_uid; ++ inode->i_gid = dir->i_gid; ++ inode->i_mode = mode | ASFS_SB(sb)->mode; ++ ++ switch (type) { ++ case it_dir: ++ inode->i_mode |= S_IFDIR; ++ inode->i_op = &asfs_dir_inode_operations; ++ inode->i_fop = &asfs_dir_operations; ++ ASFS_I(inode)->firstblock = be32_to_cpu(obj->object.dir.firstdirblock); ++ ASFS_I(inode)->hashtable = be32_to_cpu(obj->object.dir.hashtable); ++ ASFS_I(inode)->modified = 0; ++ break; ++ case it_file: ++ inode->i_mode |= S_IFREG; ++ inode->i_op = &asfs_file_inode_operations; ++ inode->i_fop = &asfs_file_operations; ++ inode->i_mapping->a_ops = &asfs_aops; ++ ASFS_I(inode)->firstblock = be32_to_cpu(obj->object.file.data); ++ ASFS_I(inode)->ext_cache.startblock = 0; ++ ASFS_I(inode)->ext_cache.key = 0; ++ ASFS_I(inode)->mmu_private = inode->i_size; ++ break; ++ case it_link: ++ inode->i_mode = S_IFLNK | S_IRWXUGO; ++ inode->i_op = &page_symlink_inode_operations; ++ inode->i_mapping->a_ops = &asfs_symlink_aops; ++ ASFS_I(inode)->firstblock = be32_to_cpu(obj->object.file.data); ++ error = asfs_write_symlink(inode, symname); ++ break; ++ default: ++ break; ++ } ++ ++ asfs_bstore(sb, bh); ++ insert_inode_hash(inode); ++ mark_inode_dirty(inode); ++ d_instantiate(dentry, inode); ++ asfs_sync_dir_inode(dir, dir_obj); ++ asfs_bstore(sb, dir_bh); ++ ++ unlock_super(sb); ++ asfs_brelse(bh); ++ asfs_brelse(dir_bh); ++ ++ return error; ++} ++ ++int asfs_create(struct inode *dir, struct dentry *dentry, int mode, struct nameidata *nd) ++{ ++ return asfs_create_object(dir, dentry, mode, it_file, NULL); ++} ++ ++int asfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) ++{ ++ return asfs_create_object(dir, dentry, mode, it_dir, NULL); ++} ++ ++int asfs_symlink(struct inode *dir, struct dentry *dentry, const char *symname) ++{ ++ return asfs_create_object(dir, dentry, 0, it_link, symname); ++} ++ ++int asfs_rmdir(struct inode *dir, struct dentry *dentry) ++{ ++ asfs_debug("ASFS: %s\n", __FUNCTION__); ++ ++ if (ASFS_I(dentry->d_inode)->firstblock != 0) ++ return -ENOTEMPTY; ++ ++ return asfs_unlink(dir, dentry); ++} ++ ++int asfs_unlink(struct inode *dir, struct dentry *dentry) ++{ ++ struct inode *inode = dentry->d_inode; ++ int error; ++ struct super_block *sb = dir->i_sb; ++ struct buffer_head *bh, *dir_bh; ++ struct fsObject *dir_obj, *obj; ++ ++ asfs_debug("ASFS: %s\n", __FUNCTION__); ++ ++ lock_super(sb); ++ ++ if ((error = asfs_readobject(sb, inode->i_ino, &bh, &obj)) != 0) { ++ unlock_super(sb); ++ return error; ++ } ++ if ((error = asfs_deleteobject(sb, bh, obj)) != 0) { ++ asfs_brelse(bh); ++ unlock_super(sb); ++ return error; ++ } ++ asfs_brelse(bh); ++ ++ /* directory data could change after removing the object */ ++ if ((error = asfs_readobject(sb, dir->i_ino, &dir_bh, &dir_obj)) != 0) { ++ unlock_super(sb); ++ return error; ++ } ++ ++ asfs_sync_dir_inode(dir, dir_obj); ++ asfs_bstore(sb, dir_bh); ++ ++ dec_count(inode); ++ unlock_super(sb); ++ asfs_brelse(dir_bh); ++ ++ return 0; ++} ++ ++int asfs_rename(struct inode *old_dir, struct dentry *old_dentry, struct inode *new_dir, struct dentry *new_dentry) ++{ ++ struct super_block *sb = old_dir->i_sb; ++ struct buffer_head *src_bh, *old_bh, *new_bh; ++ int error; ++ struct fsObject *src_obj, *old_obj, *new_obj; ++ ++ asfs_debug("ASFS: rename (old=%u,\"%*s\" to new=%u,\"%*s\")\n", ++ (u32)old_dir->i_ino, (int)old_dentry->d_name.len, old_dentry->d_name.name, ++ (u32)new_dir->i_ino, (int)new_dentry->d_name.len, new_dentry->d_name.name); ++ ++ /* Unlink destination if it already exists */ ++ if (new_dentry->d_inode) ++ if ((error = asfs_unlink(new_dir, new_dentry)) != 0) ++ return error; ++ ++ lock_super(sb); ++ ++ if ((error = asfs_readobject(sb, old_dentry->d_inode->i_ino, &src_bh, &src_obj)) != 0) { ++ unlock_super(sb); ++ return error; ++ } ++ if ((error = asfs_readobject(sb, new_dir->i_ino, &new_bh, &new_obj)) != 0) { ++ asfs_brelse(src_bh); ++ unlock_super(sb); ++ return error; ++ } ++ ++ if ((error = asfs_renameobject(sb, src_bh, src_obj, new_bh, new_obj, (u8 *) new_dentry->d_name.name)) != 0) { ++ asfs_brelse(src_bh); ++ asfs_brelse(new_bh); ++ unlock_super(sb); ++ return error; ++ } ++ asfs_brelse(src_bh); ++ asfs_brelse(new_bh); ++ ++ if ((error = asfs_readobject(sb, old_dir->i_ino, &old_bh, &old_obj)) != 0) { ++ unlock_super(sb); ++ return error; ++ } ++ if ((error = asfs_readobject(sb, new_dir->i_ino, &new_bh, &new_obj)) != 0) { ++ asfs_brelse(old_bh); ++ unlock_super(sb); ++ return error; ++ } ++ ++ asfs_sync_dir_inode(old_dir, old_obj); ++ asfs_sync_dir_inode(new_dir, new_obj); ++ ++ asfs_bstore(sb, new_bh); ++ asfs_bstore(sb, old_bh); ++ ++ unlock_super(sb); ++ asfs_brelse(old_bh); ++ asfs_brelse(new_bh); ++ ++ mark_inode_dirty(old_dir); ++ mark_inode_dirty(new_dir); ++ ++ return 0; ++} ++ ++/* ++int asfs_notify_change(struct dentry *dentry, struct iattr *attr) ++{ ++ struct inode *inode = dentry->d_inode; ++ int error = 0; ++ ++ asfs_debug("ASFS: notify_change(%lu,0x%x)\n",inode->i_ino,attr->ia_valid); ++ ++ error = inode_change_ok(inode,attr); ++ ++ return error; ++} ++*/ ++#endif +diff -urN linux-2.6.3/fs/asfs/Makefile linux-2.6.3-asfs-1.0b7/fs/asfs/Makefile +--- linux-2.6.3/fs/asfs/Makefile 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.3-asfs-1.0b7/fs/asfs/Makefile 2004-06-09 21:23:40.000000000 +0200 +@@ -0,0 +1,8 @@ ++# ++# Makefile for the linux asfs filesystem routines. ++# ++ ++obj-$(CONFIG_ASFS_FS) += asfs.o ++ ++asfs-y += dir.o extents.o file.o inode.o namei.o nodes.o objects.o super.o symlink.o ++asfs-$(CONFIG_ASFS_RW) += adminspace.o bitfuncs.o +diff -urN linux-2.6.3/fs/asfs/namei.c linux-2.6.3-asfs-1.0b7/fs/asfs/namei.c +--- linux-2.6.3/fs/asfs/namei.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.3-asfs-1.0b7/fs/asfs/namei.c 2004-06-10 01:41:51.000000000 +0200 +@@ -0,0 +1,155 @@ ++/* ++ * ++ * Amiga Smart File System, Linux implementation ++ * version: 1.0beta7 ++ * ++ * Copyright (C) 2003,2004 Marek 'March' Szyprowski ++ * ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License ++ * as published by the Free Software Foundation; either version ++ * 2 of the License, or (at your option) any later version. ++ * ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "asfs_fs.h" ++ ++static inline u8 asfs_upperchar(u8 c) ++{ ++ if ((c >= 224 && c <= 254 && c != 247) || (c >= 'a' && c <= 'z')) ++ c -= 32; ++ return (c); ++} ++ ++u8 asfs_lowerchar(u8 c) ++{ ++ if ((c >= 192 && c <= 222 && c != 215) || (c >= 'A' && c <= 'Z')) ++ c += 32; ++ return (c); ++} ++ ++/* Check if the name is valid for a asfs object. */ ++ ++static inline int asfs_check_name(const u8 *name, int len) ++{ ++ int i; ++ ++ if (len > ASFS_MAXFN) ++ return -ENAMETOOLONG; ++ ++ for (i = 0; i < len; i++) ++ if (name[i] < ' ' || name[i] == ':' || (name[i] > 0x7e && name[i] < 0xa0)) ++ return -EINVAL; ++ ++ return 0; ++} ++ ++/* Note: the dentry argument is the parent dentry. */ ++ ++static int asfs_hash_dentry(struct dentry *dentry, struct qstr *qstr) ++{ ++ struct super_block *sb = dentry->d_inode->i_sb; ++ const u8 *name = qstr->name; ++ unsigned long hash; ++ int i; ++ ++ i = asfs_check_name(qstr->name,qstr->len); ++ if (i) ++ return i; ++ ++ hash = init_name_hash(); ++ ++ if (ASFS_SB(sb)->flags & ASFS_ROOTBITS_CASESENSITIVE) ++ for (i=qstr->len; i > 0; name++, i--) ++ hash = partial_name_hash(*name, hash); ++ else ++ for (i=qstr->len; i > 0; name++, i--) ++ hash = partial_name_hash(asfs_upperchar(*name), hash); ++ ++ qstr->hash = end_name_hash(hash); ++ ++ return 0; ++} ++ ++static int asfs_compare_dentry(struct dentry *dentry, struct qstr *a, struct qstr *b) ++{ ++ struct super_block *sb = dentry->d_inode->i_sb; ++ const u8 *aname = a->name; ++ const u8 *bname = b->name; ++ int len; ++ ++ /* 'a' is the qstr of an already existing dentry, so the name ++ * must be valid. 'b' must be validated first. ++ */ ++ ++ if (asfs_check_name(b->name,b->len)) ++ return 1; ++ ++ if (a->len != b->len) ++ return 1; ++ ++ if (ASFS_SB(sb)->flags & ASFS_ROOTBITS_CASESENSITIVE) { ++ for (len=a->len; len > 0; len--) ++ if (*aname++ != *bname++) ++ return 1; ++ } else { ++ for (len=a->len; len > 0; len--) ++ if (asfs_upperchar(*aname++) != asfs_upperchar(*bname++)) ++ return 1; ++ } ++ ++ return 0; ++} ++ ++struct dentry_operations asfs_dentry_operations = { ++ d_hash: asfs_hash_dentry, ++ d_compare: asfs_compare_dentry, ++}; ++ ++int asfs_namecmp(u8 *s, u8 *ct, int casesensitive) ++{ ++ if (casesensitive) { ++ while (*s == *ct && *ct != '\0' && *ct != '/') { ++ s++; ++ ct++; ++ } ++ } else { ++ while (asfs_upperchar(*s) == asfs_upperchar(*ct) && *ct != '\0' ++ && *ct != '/') { ++ s++; ++ ct++; ++ } ++ } ++ return (*s == '\0' && (*ct == '\0' || *ct == '/')) ? 0 : *ct - *s; ++} ++ ++u16 asfs_hash(u8 *name, int casesensitive) ++{ ++ u16 hashval = 0; ++ while (name[hashval] != 0 && name[hashval] != '/') ++ hashval++; ++ if (casesensitive) { ++ u8 c = *name; ++ while (c != 0 && c != '/') { ++ hashval = hashval * 13 + c; ++ c = *++name; ++ } ++ } else { ++ u8 c = *name; ++ while (c != 0 && c != '/') { ++ hashval = hashval * 13 + asfs_upperchar(c); ++ c = *++name; ++ } ++ } ++ return hashval; ++} ++ +diff -urN linux-2.6.3/fs/asfs/nodes.c linux-2.6.3-asfs-1.0b7/fs/asfs/nodes.c +--- linux-2.6.3/fs/asfs/nodes.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.3-asfs-1.0b7/fs/asfs/nodes.c 2004-06-10 01:41:46.000000000 +0200 +@@ -0,0 +1,455 @@ ++/* ++ * ++ * Amiga Smart File System, Linux implementation ++ * version: 1.0beta7 ++ * ++ * This file contains some parts of the original amiga version of ++ * SmartFilesystem source code. ++ * ++ * SmartFilesystem is copyrighted (C) 2003 by: John Hendrikx, ++ * Ralph Schmidt, Emmanuel Lesueur, David Gerber and Marcin Kurek ++ * ++ * Adapted and modified by Marek 'March' Szyprowski ++ * ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include "asfs_fs.h" ++ ++#include ++ ++/* Finds a specific node by number. */ ++int asfs_getnode(struct super_block *sb, u32 nodeno, struct buffer_head **ret_bh, struct fsObjectNode **ret_node) ++{ ++ struct buffer_head *bh; ++ struct fsNodeContainer *nodecont; ++ u32 nodeindex = ASFS_SB(sb)->objectnoderoot; ++ ++ while ((bh = asfs_breadcheck(sb, nodeindex, ASFS_NODECONTAINER_ID))) { ++ nodecont = (struct fsNodeContainer *) bh->b_data; ++ ++ if (be32_to_cpu(nodecont->nodes) == 1) { ++ *ret_node = (struct fsObjectNode *) ((u8 *) nodecont->node + NODE_STRUCT_SIZE * (nodeno - be32_to_cpu(nodecont->nodenumber))); ++ *ret_bh = bh; ++ return 0; ++ } else { ++ u16 containerentry = (nodeno - be32_to_cpu(nodecont->nodenumber)) / be32_to_cpu(nodecont->nodes); ++ nodeindex = be32_to_cpu(nodecont->node[containerentry]) >> (sb->s_blocksize_bits - ASFS_BLCKFACCURACY); ++ } ++ asfs_brelse(bh); ++ } ++ if (bh == NULL) ++ return -EIO; ++ return -ENOENT; ++} ++ ++#ifdef CONFIG_ASFS_RW ++ ++ /* Looks for the parent of the passed-in buffer_head (fsNodeContainer) ++ starting from the root. It returns an error if any error occured. ++ If error is 0 and io_bh is NULL as well, then there was no parent (ie, ++ you asked parent of the root). Otherwise io_bh should contain the ++ parent of the passed-in NodeContainer. */ ++ ++static int parentnodecontainer(struct super_block *sb, struct buffer_head **io_bh) ++{ ++ u32 noderoot = ASFS_SB(sb)->objectnoderoot; ++ u32 childblock = be32_to_cpu(((struct fsBlockHeader *) (*io_bh)->b_data)->ownblock); ++ u32 nodenumber = be32_to_cpu(((struct fsNodeContainer *) (*io_bh)->b_data)->nodenumber); ++ int errorcode = 0; ++ ++ if (noderoot == childblock) { ++ *io_bh = NULL; ++ return 0; ++ } ++ ++ while ((*io_bh = asfs_breadcheck(sb, noderoot, ASFS_NODECONTAINER_ID))) { ++ struct fsNodeContainer *nc = (void *) (*io_bh)->b_data; ++ ++ if (be32_to_cpu(nc->nodes) == 1) { ++ /* We've descended the tree to a leaf NodeContainer, something ++ which should never happen if the passed-in io_bh had ++ contained a valid fsNodeContainer. */ ++ printk("ASFS: Failed to locate the parent NodeContainer - node tree is corrupted!\n"); ++ *io_bh = NULL; ++ return -EIO; ++ } else { ++ u16 containerentry = (nodenumber - be32_to_cpu(nc->nodenumber)) / be32_to_cpu(nc->nodes); ++ noderoot = be32_to_cpu(nc->node[containerentry]) >> (sb->s_blocksize_bits - ASFS_BLCKFACCURACY); ++ } ++ ++ if (noderoot == childblock) ++ break; ++ ++ asfs_brelse(*io_bh); ++ } ++ ++ if (*io_bh == NULL) ++ return -EIO; ++ ++ return errorcode; ++} ++ ++ ++static int isfull(struct super_block *sb, struct fsNodeContainer *nc) ++{ ++ u32 *p = nc->node; ++ s16 n = NODECONT_BLOCK_COUNT; ++ ++ while (--n >= 0) { ++ if (*p == 0 || (be32_to_cpu(*p) & 0x00000001) == 0) { ++ break; ++ } ++ p++; ++ } ++ ++ return n < 0; ++} ++ ++static int markparentfull(struct super_block *sb, struct buffer_head *bh) ++{ ++ u32 nodenumber = be32_to_cpu(((struct fsNodeContainer *) (bh->b_data))->nodenumber); ++ int errorcode; ++ ++ if ((errorcode = parentnodecontainer(sb, &bh)) == 0 && bh != 0) { ++ struct fsNodeContainer *nc = (void *) bh->b_data; ++ u16 containerentry = (nodenumber - be32_to_cpu(nc->nodenumber)) / be32_to_cpu(nc->nodes); ++ ++ nc->node[containerentry] = cpu_to_be32(be32_to_cpu(nc->node[containerentry]) | 0x00000001); ++ ++ asfs_bstore(sb, bh); ++ ++ if (isfull(sb, nc)) { /* This container now is full as well! Mark the next higher up container too then! */ ++ return markparentfull(sb, bh); ++ } ++ asfs_brelse(bh); ++ } ++ ++ return errorcode; ++} ++ ++static int addnewnodelevel(struct super_block *sb, u16 nodesize) ++{ ++ struct buffer_head *bh; ++ u32 noderoot = ASFS_SB(sb)->objectnoderoot; ++ int errorcode; ++ ++ /* Adds a new level to the Node tree. */ ++ ++ asfs_debug("addnewnodelevel: Entry\n"); ++ ++ if ((bh = asfs_breadcheck(sb, noderoot, ASFS_NODECONTAINER_ID))) { ++ struct buffer_head *newbh; ++ u32 newblock; ++ ++ if ((errorcode = asfs_allocadminspace(sb, &newblock)) == 0 && (newbh = asfs_getzeroblk(sb, newblock))) { ++ struct fsNodeContainer *nc = (void *) bh->b_data; ++ struct fsNodeContainer *newnc = (void *) newbh->b_data; ++ ++ /* The newly allocated block will become a copy of the current root. */ ++ ++ newnc->bheader.id = cpu_to_be32(ASFS_NODECONTAINER_ID); ++ newnc->bheader.ownblock = cpu_to_be32(newblock); ++ newnc->nodenumber = nc->nodenumber; ++ newnc->nodes = nc->nodes; ++ memcpy(newnc->node, nc->node, sb->s_blocksize - sizeof(struct fsNodeContainer)); ++ ++ asfs_bstore(sb, newbh); ++ asfs_brelse(newbh); ++ ++ /* The current root will now be transformed into a new root. */ ++ ++ if (be32_to_cpu(nc->nodes) == 1) ++ nc->nodes = cpu_to_be32((sb->s_blocksize - sizeof(struct fsNodeContainer)) / nodesize); ++ else ++ nc->nodes = cpu_to_be32(be32_to_cpu(nc->nodes) * NODECONT_BLOCK_COUNT); ++ ++ nc->node[0] = cpu_to_be32((newblock << (sb->s_blocksize_bits - ASFS_BLCKFACCURACY)) + 1); /* Tree is full from that point! */ ++ memset(&nc->node[1], 0, sb->s_blocksize - sizeof(struct fsNodeContainer) - 4); ++ ++ asfs_bstore(sb, bh); ++ } ++ asfs_brelse(bh); ++ } else ++ errorcode = -EIO; ++ ++ return errorcode; ++} ++ ++static int createnodecontainer(struct super_block *sb, u32 nodenumber, u32 nodes, u32 * returned_block) ++{ ++ struct buffer_head *bh; ++ int errorcode; ++ u32 newblock; ++ ++ asfs_debug("createnodecontainer: nodenumber = %u, nodes = %u\n", nodenumber, nodes); ++ ++ if ((errorcode = asfs_allocadminspace(sb, &newblock)) == 0 && (bh = asfs_getzeroblk(sb, newblock))) { ++ struct fsNodeContainer *nc = (void *) bh->b_data; ++ ++ nc->bheader.id = cpu_to_be32(ASFS_NODECONTAINER_ID); ++ nc->bheader.ownblock = cpu_to_be32(newblock); ++ ++ nc->nodenumber = cpu_to_be32(nodenumber); ++ nc->nodes = cpu_to_be32(nodes); ++ ++ asfs_bstore(sb, bh); ++ asfs_brelse(bh); ++ *returned_block = newblock; ++ } ++ ++ return errorcode; ++} ++ ++ /* This function creates a new fsNode structure in a fsNodeContainer. If needed ++ it will create a new fsNodeContainers and a new fsNodeIndexContainer. */ ++ ++int asfs_createnode(struct super_block *sb, struct buffer_head **returned_bh, struct fsNode **returned_node, u32 * returned_nodeno) ++{ ++ u16 nodecount = (sb->s_blocksize - sizeof(struct fsNodeContainer)) / NODE_STRUCT_SIZE; ++ u32 noderoot = ASFS_SB(sb)->objectnoderoot; ++ u32 nodeindex = noderoot; ++ int errorcode = 0; ++ ++ while ((*returned_bh = asfs_breadcheck(sb, nodeindex, ASFS_NODECONTAINER_ID))) { ++ struct fsNodeContainer *nc = (void *) (*returned_bh)->b_data; ++ ++ if (be32_to_cpu(nc->nodes) == 1) { /* Is it a leaf-container? */ ++ struct fsNode *n; ++ s16 i = nodecount; ++ ++ n = (struct fsNode *) nc->node; ++ ++ while (i-- > 0) { ++ if (n->data == 0) ++ break; ++ ++ n = (struct fsNode *) ((u8 *) n + NODE_STRUCT_SIZE); ++ } ++ ++ if (i >= 0) { ++ /* Found an empty fsNode structure! */ ++ *returned_node = n; ++ *returned_nodeno = be32_to_cpu(nc->nodenumber) + ((u8 *) n - (u8 *) nc->node) / NODE_STRUCT_SIZE; ++ ++ asfs_debug("createnode: Created Node %d\n", *returned_nodeno); ++ ++ /* Below we continue to look through the NodeContainer block. We skip the entry ++ we found to be unused, and see if there are any more unused entries. If we ++ do not find any more unused entries then this container is now full. */ ++ ++ n = (struct fsNode *) ((u8 *) n + NODE_STRUCT_SIZE); ++ ++ while (i-- > 0) { ++ if (n->data == 0) ++ break; ++ ++ n = (struct fsNode *) ((u8 *) n + NODE_STRUCT_SIZE); ++ } ++ ++ if (i < 0) { ++ /* No more empty fsNode structures in this block. Mark parent full. */ ++ errorcode = markparentfull(sb, *returned_bh); ++ } ++ ++ return errorcode; ++ } else { ++ /* What happened now is that we found a leaf-container which was ++ completely filled. In practice this should only happen when there ++ is only a single NodeContainer (only this container), or when there ++ was an error in one of the full-bits in a higher level container. */ ++ ++ if (noderoot != nodeindex) { ++ /*** Hmmm... it looks like there was a damaged full-bit or something. ++ In this case we'd probably better call markcontainerfull. */ ++ ++ printk("ASFS: Couldn't find empty Node in NodeContainer while NodeIndexContainer indicated there should be one!\n"); ++ ++ errorcode = -ENOSPC; ++ break; ++ } else { ++ /* Container is completely filled. */ ++ ++ if ((errorcode = addnewnodelevel(sb, NODE_STRUCT_SIZE)) != 0) ++ return errorcode; ++ ++ nodeindex = noderoot; ++ } ++ } ++ } else { /* This isn't a leaf container */ ++ u32 *p = nc->node; ++ s16 i = NODECONT_BLOCK_COUNT; ++ ++ /* We've read a normal container */ ++ ++ while (i-- > 0) { ++ if (*p != 0 && (be32_to_cpu(*p) & 0x00000001) == 0) ++ break; ++ ++ p++; ++ } ++ ++ if (i >= 0) { ++ /* Found a not completely filled Container */ ++ ++ nodeindex = be32_to_cpu(*p) >> (sb->s_blocksize_bits - ASFS_BLCKFACCURACY); ++ } else { ++ /* Everything in the NodeIndexContainer was completely filled. There possibly ++ are some unused pointers in this block however. */ ++ ++ asfs_debug("createnode: NodeContainer at block has no empty Nodes.\n"); ++ ++ p = nc->node; ++ i = NODECONT_BLOCK_COUNT; ++ ++ while (i-- > 0) { ++ if (*p == 0) ++ break; ++ ++ p++; ++ } ++ ++ if (i >= 0) { ++ u32 newblock; ++ u32 nodes; ++ ++ /* Found an unused Container pointer */ ++ ++ if (be32_to_cpu(nc->nodes) == (sb->s_blocksize - sizeof(struct fsNodeContainer)) / NODE_STRUCT_SIZE) { ++ nodes = 1; ++ } else { ++ nodes = be32_to_cpu(nc->nodes) / NODECONT_BLOCK_COUNT; ++ } ++ ++ if ((errorcode = createnodecontainer(sb, be32_to_cpu(nc->nodenumber) + (p - nc->node) * be32_to_cpu(nc->nodes), nodes, &newblock)) != 0) { ++ break; ++ } ++ ++ *p = cpu_to_be32(newblock << (sb->s_blocksize_bits - ASFS_BLCKFACCURACY)); ++ ++ asfs_bstore(sb, *returned_bh); ++ } else { ++ /* Container is completely filled. This must be the top-level NodeIndex container ++ as otherwise the full-bit would have been wrong! */ ++ ++ if ((errorcode = addnewnodelevel(sb, NODE_STRUCT_SIZE)) != 0) ++ break; ++ ++ nodeindex = noderoot; ++ } ++ } ++ } ++ asfs_brelse(*returned_bh); ++ } ++ ++ if (*returned_bh == NULL) ++ return -EIO; ++ ++ return (errorcode); ++} ++ ++static int markparentempty(struct super_block *sb, struct buffer_head *bh) ++{ ++ u32 nodenumber = be32_to_cpu(((struct fsNodeContainer *) bh->b_data)->nodenumber); ++ int errorcode; ++ ++ if ((errorcode = parentnodecontainer(sb, &bh)) == 0 && bh != 0) { ++ struct fsNodeContainer *nc = (void *) bh->b_data; ++ int wasfull; ++ u16 containerentry = (nodenumber - be32_to_cpu(nc->nodenumber)) / be32_to_cpu(nc->nodes); ++ ++ wasfull = isfull(sb, nc); ++ ++ nc->node[containerentry] = cpu_to_be32(be32_to_cpu(nc->node[containerentry]) & ~0x00000001); ++ ++ asfs_bstore(sb, bh); ++ ++ if (wasfull) { ++ /* This container was completely full before! Mark the next higher up container too then! */ ++ return markparentempty(sb, bh); ++ } ++ asfs_brelse(bh); ++ } ++ ++ return errorcode; ++} ++ ++static int freecontainer(struct super_block *sb, struct buffer_head *bh) ++{ ++ u32 nodenumber = be32_to_cpu(((struct fsNodeContainer *) bh->b_data)->nodenumber); ++ int errorcode; ++ ++ if ((errorcode = parentnodecontainer(sb, &bh)) == 0 && bh != NULL) { /* This line also prevents the freeing of the noderoot. */ ++ struct fsNodeContainer *nc = (void *) bh->b_data; ++ u16 containerindex = (nodenumber - be32_to_cpu(nc->nodenumber)) / be32_to_cpu(nc->nodes); ++ ++ if ((errorcode = asfs_freeadminspace(sb, be32_to_cpu(nc->node[containerindex]) >> (sb->s_blocksize_bits - ASFS_BLCKFACCURACY))) == 0) { ++ u32 *p = nc->node; ++ s16 n = NODECONT_BLOCK_COUNT; ++ ++ nc->node[containerindex] = 0; ++ asfs_bstore(sb, bh); ++ ++ while (n-- > 0) ++ if (*p++ != 0) ++ break; ++ ++ if (n < 0) { /* This container is now completely empty! Free this NodeIndexContainer too then! */ ++ return freecontainer(sb, bh); ++ } ++ } ++ asfs_brelse(bh); ++ } ++ ++ return errorcode; ++} ++ ++static int internaldeletenode(struct super_block *sb, struct buffer_head *bh, struct fsNode *n) ++{ ++ struct fsNodeContainer *nc = (void *) bh->b_data; ++ u16 nodecount = (sb->s_blocksize - sizeof(struct fsNodeContainer)) / NODE_STRUCT_SIZE; ++ s16 i = nodecount; ++ s16 empty = 0; ++ int errorcode = 0; ++ ++ n->data = 0; ++ n = (struct fsNode *) nc->node; ++ ++ while (i-- > 0) { ++ if (n->data == 0) ++ empty++; ++ ++ n = (struct fsNode *) ((u8 *) n + NODE_STRUCT_SIZE); ++ } ++ ++ asfs_bstore(sb, bh); ++ ++ if (empty == 1) /* NodeContainer was completely full before, so we need to mark it empty now. */ ++ errorcode = markparentempty(sb, bh); ++ else if (empty == nodecount) /* NodeContainer is now completely empty! Free it! */ ++ errorcode = freecontainer(sb, bh); ++ ++ return (errorcode); ++} ++ ++int asfs_deletenode(struct super_block *sb, u32 objectnode) ++{ ++ struct buffer_head *bh; ++ struct fsObjectNode *on; ++ int errorcode; ++ ++ asfs_debug("deletenode: Deleting Node %d\n", objectnode); ++ ++ if ((errorcode = asfs_getnode(sb, objectnode, &bh, &on)) == 0) ++ errorcode = internaldeletenode(sb, bh, (struct fsNode *) on); ++ ++ asfs_brelse(bh); ++ return (errorcode); ++} ++ ++#endif +diff -urN linux-2.6.3/fs/asfs/objects.c linux-2.6.3-asfs-1.0b7/fs/asfs/objects.c +--- linux-2.6.3/fs/asfs/objects.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.3-asfs-1.0b7/fs/asfs/objects.c 2004-06-10 17:16:10.000000000 +0200 +@@ -0,0 +1,765 @@ ++/* ++ * ++ * Amiga Smart File System, Linux implementation ++ * version: 1.0beta7 ++ * ++ * This file contains some parts of the original amiga version of ++ * SmartFilesystem source code. ++ * ++ * SmartFilesystem is copyrighted (C) 2003 by: John Hendrikx, ++ * Ralph Schmidt, Emmanuel Lesueur, David Gerber, and Marcin Kurek ++ * ++ * Adapted and modified by Marek 'March' Szyprowski ++ * ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include "asfs_fs.h" ++ ++#include ++ ++struct fsObject *asfs_nextobject(struct fsObject *obj) ++{ ++ int i; ++ u8 *p = obj->name; ++ ++ for (i = 2; i > 0; p++) ++ if (*p == '\0') ++ i--; ++ if ((p - (u8 *) obj) & 0x01) ++ p++; ++ ++ return ((struct fsObject *) p); ++} ++ ++struct fsObject *asfs_find_obj_by_name(struct super_block *sb, struct fsObjectContainer *objcont, u8 * name) ++{ ++ struct fsObject *obj; ++ ++ obj = &(objcont->object[0]); ++ while (be32_to_cpu(obj->objectnode) > 0 && ((char *) obj - (char *) objcont) + sizeof(struct fsObject) + 2 < sb->s_blocksize) { ++ if (asfs_namecmp(obj->name, name, ASFS_SB(sb)->flags & ASFS_ROOTBITS_CASESENSITIVE) == 0) { ++ asfs_debug("Object found! Node %u, Name %s, Type %x, inCont %u\n", be32_to_cpu(obj->objectnode), obj->name, obj->bits, be32_to_cpu(objcont->bheader.ownblock)); ++ return obj; ++ } ++ obj = asfs_nextobject(obj); ++ } ++ return NULL; ++} ++ ++#ifdef CONFIG_ASFS_RW ++ ++struct fsObject *find_obj_by_node(struct super_block *sb, struct fsObjectContainer *objcont, u32 objnode) ++{ ++ struct fsObject *obj; ++ ++ obj = &(objcont->object[0]); ++ while (be32_to_cpu(obj->objectnode) > 0 && ((char *) obj - (char *) objcont) + sizeof(struct fsObject) + 2 < sb->s_blocksize) { ++ if (be32_to_cpu(obj->objectnode) == objnode) { ++ return obj; ++ } ++ obj = asfs_nextobject(obj); ++ } ++ return NULL; ++} ++ ++int asfs_readobject(struct super_block *sb, u32 objectnode, struct buffer_head **bh, struct fsObject **returned_object) ++{ ++ struct fsObjectNode *on; ++ int errorcode; ++ u32 contblock; ++ ++ asfs_debug("Seaching object - node %d\n", objectnode); ++ ++ if ((errorcode = asfs_getnode(sb, objectnode, bh, &on)) != 0) ++ return errorcode; ++ contblock = be32_to_cpu(on->node.data); ++ asfs_brelse(*bh); ++ ++ if (contblock > 0 && (*bh = asfs_breadcheck(sb, contblock, ASFS_OBJECTCONTAINER_ID))) { ++ *returned_object = find_obj_by_node(sb, (void *) (*bh)->b_data, objectnode); ++ if (*returned_object == NULL) { ++ brelse(*bh); ++ *bh = NULL; ++ return -ENOENT; ++ } ++ return 0; ++ } else ++ return -EIO; ++} ++ ++static int removeobjectcontainer(struct super_block *sb, struct buffer_head *bh) ++{ ++ struct fsObjectContainer *oc = (void *) bh->b_data; ++ int errorcode; ++ struct buffer_head *block; ++ ++ asfs_debug("removeobjectcontainer: block %u\n", be32_to_cpu(oc->bheader.ownblock)); ++ ++ if (oc->next != 0 && oc->next != oc->bheader.ownblock) { ++ struct fsObjectContainer *next_oc; ++ ++ if ((block = asfs_breadcheck(sb, be32_to_cpu(oc->next), ASFS_OBJECTCONTAINER_ID)) == NULL) ++ return -EIO; ++ ++ next_oc = (void *) block->b_data; ++ next_oc->previous = oc->previous; ++ ++ asfs_bstore(sb, block); ++ asfs_brelse(block); ++ } ++ ++ if (oc->previous != 0 && oc->previous != oc->bheader.ownblock) { ++ struct fsObjectContainer *previous_oc; ++ ++ if ((block = asfs_breadcheck(sb, be32_to_cpu(oc->previous), ASFS_OBJECTCONTAINER_ID)) == NULL) ++ return -EIO; ++ ++ previous_oc = (void *) block->b_data; ++ previous_oc->next = oc->next; ++ ++ asfs_bstore(sb, block); ++ asfs_brelse(block); ++ } else { ++ struct fsObject *parent_o; ++ ++ if ((errorcode = asfs_readobject(sb, be32_to_cpu(oc->parent), &block, &parent_o)) != 0) ++ return (errorcode); ++ ++ parent_o->object.dir.firstdirblock = oc->next; ++ ++ asfs_bstore(sb, block); ++ asfs_brelse(block); ++ } ++ ++ if ((errorcode = asfs_freeadminspace(sb, be32_to_cpu(oc->bheader.ownblock))) != 0) ++ return (errorcode); ++ ++ return (0); ++} ++ ++static int setrecycledinfodiff(struct super_block *sb, s32 deletedfiles, s32 deletedblocks) ++{ ++ struct buffer_head *bh; ++ ++ if ((bh = asfs_breadcheck(sb, ASFS_SB(sb)->rootobjectcontainer, ASFS_OBJECTCONTAINER_ID))) { ++ struct fsRootInfo *ri = (struct fsRootInfo *) ((u8 *) bh->b_data + sb->s_blocksize - sizeof(struct fsRootInfo)); ++ ++ ri->deletedfiles = cpu_to_be32(be32_to_cpu(ri->deletedfiles) + deletedfiles); ++ ri->deletedblocks = cpu_to_be32(be32_to_cpu(ri->deletedblocks) + deletedblocks); ++ ++ asfs_bstore(sb, bh); ++ asfs_brelse(bh); ++ } else ++ return -EIO; ++ return 0; ++} ++ ++ /* This function removes the fsObject structure passed in from the passed ++ buffer_head. If the ObjectContainer becomes completely empty it will be ++ delinked from the ObjectContainer chain and marked free for reuse. ++ This function doesn't delink the object from the hashchain! */ ++ ++static int simpleremoveobject(struct super_block *sb, struct buffer_head *bh, struct fsObject *o) ++{ ++ struct fsObjectContainer *oc = (void *) bh->b_data; ++ int errorcode = 0; ++ ++ asfs_debug("simpleremoveobject:\n"); ++ ++ if (be32_to_cpu(oc->parent) == ASFS_RECYCLEDNODE) { ++ /* This object is removed from the Recycled directory. */ ++ if ((errorcode = setrecycledinfodiff(sb, -1, -((be32_to_cpu(o->object.file.size) + sb->s_blocksize - 1) >> sb->s_blocksize_bits))) != 0) ++ return errorcode; ++ } ++ ++ if ((asfs_nextobject(oc->object))->name[0] == '\0') ++ errorcode = removeobjectcontainer(sb, bh); ++ else { ++ struct fsObject *nexto; ++ int objlen; ++ ++ nexto = asfs_nextobject(o); ++ objlen = (u8 *) nexto - (u8 *) o; ++ ++ memmove(o, nexto, sb->s_blocksize - ((u8 *) nexto - (u8 *) oc)); ++ memset((u8 *) oc + sb->s_blocksize - objlen, 0, objlen); ++ ++ asfs_bstore(sb, bh); ++ } ++ return errorcode; ++} ++ ++/* This function delinks the passed in ObjectNode from its hash-chain. Handy when deleting ++ the object, or when renaming/moving it. */ ++ ++static int dehashobjectquick(struct super_block *sb, u32 objectnode, u8 *name, u32 parentobjectnode) ++{ ++ struct fsObject *o; ++ int errorcode; ++ struct buffer_head *block; ++ ++ asfs_debug("dehashobject: Delinking object %d (=ObjectNode) from hashchain. Parentnode = %d\n", objectnode, parentobjectnode); ++ ++ if ((errorcode = asfs_readobject(sb, parentobjectnode, &block, &o)) == 0 && o->object.dir.hashtable != 0) { ++ u32 hashtable = be32_to_cpu(o->object.dir.hashtable); ++ asfs_brelse(block); ++ ++ if ((block = asfs_breadcheck(sb, hashtable, ASFS_HASHTABLE_ID))) { ++ struct buffer_head *node_bh; ++ struct fsObjectNode *onptr, on; ++ struct fsHashTable *ht = (void *) block->b_data; ++ u32 nexthash; ++ ++ if ((errorcode = asfs_getnode(sb, objectnode, &node_bh, &onptr)) == 0) { ++ u16 hashchain; ++ ++ asfs_debug("dehashobject: Read HashTable block of parent object of object to be delinked\n"); ++ ++ hashchain = HASHCHAIN(asfs_hash(name, ASFS_SB(sb)->flags & ASFS_ROOTBITS_CASESENSITIVE)); ++ nexthash = be32_to_cpu(ht->hashentry[hashchain]); ++ ++ if (nexthash == objectnode) { ++ /* The hashtable directly points to the fsObject to be delinked. We simply ++ modify the Hashtable to point to the new nexthash entry. */ ++ ++ asfs_debug("dehashobject: The hashtable points directly to the to be delinked object\n"); ++ ++ ht->hashentry[hashchain] = onptr->next; ++ asfs_bstore(sb, block); ++ } else { ++ struct fsObjectNode *onsearch = 0; ++ ++ on = *onptr; ++ ++ asfs_debug("dehashobject: Walking through hashchain\n"); ++ ++ while (nexthash != 0 && nexthash != objectnode) { ++ asfs_brelse(node_bh); ++ if ((errorcode = asfs_getnode(sb, nexthash, &node_bh, &onsearch)) != 0) ++ break; ++ nexthash = be32_to_cpu(onsearch->next); ++ } ++ ++ if (errorcode == 0) { ++ if (nexthash != 0) { ++ /* Previous fsObjectNode found in hash chain. Modify the fsObjectNode to 'skip' the ++ ObjectNode which is being delinked from the hash chain. */ ++ ++ onsearch->next = on.next; ++ asfs_bstore(sb, node_bh); ++ } else { ++ printk("ASFS: Hashchain of object %d is corrupt or incorrectly linked.", objectnode); ++ ++ /*** This is strange. We have been looking for the fsObjectNode which is located before the ++ passed in fsObjectNode in the hash-chain. However, we never found the ++ fsObjectNode reffered to in the hash-chain! Has to be somekind ++ of internal error... */ ++ ++ errorcode = -ENOENT; ++ } ++ } ++ } ++ asfs_brelse(node_bh); ++ } ++ asfs_brelse(block); ++ } ++ } ++ return errorcode; ++} ++ ++ ++ /* This function removes an object from any directory. It takes care ++ of delinking the object from the hashchain and also frees the ++ objectnode number. */ ++ ++static int removeobject(struct super_block *sb, struct buffer_head *bh, struct fsObject *o) ++{ ++ struct fsObjectContainer *oc = (void *) bh->b_data; ++ int errorcode; ++ ++ asfs_debug("removeobject\n"); ++ ++ if ((errorcode = dehashobjectquick(sb, be32_to_cpu(o->objectnode), o->name, be32_to_cpu(oc->parent))) == 0) { ++ u32 objectnode = be32_to_cpu(o->objectnode); ++ ++ if ((errorcode = simpleremoveobject(sb, bh, o)) == 0) ++ errorcode = asfs_deletenode(sb, objectnode); ++ } ++ ++ return (errorcode); ++} ++ ++ /* This function deletes the specified object. */ ++int asfs_deleteobject(struct super_block *sb, struct buffer_head *bh, struct fsObject *o) ++{ ++ int errorcode = 0; ++ ++ asfs_debug("deleteobject: Entry -- deleting object %d (%s)\n", be32_to_cpu(o->objectnode), o->name); ++ ++ if ((o->bits & OTYPE_DIR) == 0 || o->object.dir.firstdirblock == 0) { ++ u8 bits = o->bits; ++ u32 hashblckno = be32_to_cpu(o->object.dir.hashtable); ++ u32 extentbnode = be32_to_cpu(o->object.file.data); ++ ++ if ((errorcode = removeobject(sb, bh, o)) == 0) { ++ if ((bits & OTYPE_LINK) != 0) { ++ asfs_debug("deleteobject: Object is soft link!\n"); ++ errorcode = asfs_freeadminspace(sb, extentbnode); ++ } else if ((bits & OTYPE_DIR) != 0) { ++ asfs_debug("deleteobject: Object is a directory!\n"); ++ errorcode = asfs_freeadminspace(sb, hashblckno); ++ } else { ++ asfs_debug("deleteobject: Object is a file\n"); ++ if (extentbnode != 0) ++ errorcode = asfs_deleteextents(sb, extentbnode); ++ } ++ } ++ } ++ ++ return (errorcode); ++} ++ ++ /* This function takes a HashBlock pointer, an ObjectNode and an ObjectName. ++ If there is a hashblock, then this function will correctly link the object ++ into the hashchain. If there isn't a hashblock (=0) then this function ++ does nothing. */ ++ ++static int hashobject(struct super_block *sb, u32 hashblock, struct fsObjectNode *on, u32 nodeno, u8 *objectname) ++{ ++ struct buffer_head *hash_bh; ++ ++ asfs_debug("hashobject, using hashblock %d\n", hashblock); ++ if (hashblock == 0) ++ return 0; ++ ++ if ((hash_bh = asfs_breadcheck(sb, hashblock, ASFS_HASHTABLE_ID))) { ++ struct fsHashTable *ht = (void *) hash_bh->b_data; ++ u32 nexthash; ++ u16 hashvalue, hashchain; ++ ++ hashvalue = asfs_hash(objectname, ASFS_SB(sb)->flags & ASFS_ROOTBITS_CASESENSITIVE); ++ hashchain = HASHCHAIN(hashvalue); ++ nexthash = be32_to_cpu(ht->hashentry[hashchain]); ++ ++ ht->hashentry[hashchain] = cpu_to_be32(nodeno); ++ ++ asfs_bstore(sb, hash_bh); ++ asfs_brelse(hash_bh); ++ ++ on->next = cpu_to_be32(nexthash); ++ on->hash16 = cpu_to_be16(hashvalue); ++ } else ++ return -EIO; ++ ++ return 0; ++} ++ ++ /* This function returns a pointer to the first unused byte in ++ an ObjectContainer. */ ++ ++static u8 *emptyspaceinobjectcontainer(struct super_block *sb, struct fsObjectContainer *oc) ++{ ++ struct fsObject *o = oc->object; ++ u8 *endadr; ++ ++ endadr = (u8 *) oc + sb->s_blocksize - sizeof(struct fsObject) - 2; ++ ++ while ((u8 *) o < endadr && o->name[0] != 0) ++ o = asfs_nextobject(o); ++ ++ return (u8 *) o; ++} ++ ++ /* This function will look in the directory indicated by io_o ++ for an ObjectContainer block which contains bytesneeded free ++ bytes. If none is found then this function simply creates a ++ new ObjectContainer and adds that to the indicated directory. */ ++ ++static int findobjectspace(struct super_block *sb, struct buffer_head **io_bh, struct fsObject **io_o, u32 bytesneeded) ++{ ++ struct buffer_head *bhparent = *io_bh; ++ struct fsObject *oparent = *io_o; ++ struct buffer_head *bh; ++ u32 nextblock = be32_to_cpu(oparent->object.dir.firstdirblock); ++ int errorcode = 0; ++ ++ asfs_debug("findobjectspace: Looking for %u bytes in directory with ObjectNode number %d (in block %d)\n", bytesneeded, be32_to_cpu((*io_o)->objectnode), ++ be32_to_cpu(((struct fsBlockHeader *) (*io_bh)->b_data)->ownblock)); ++ ++ while (nextblock != 0 && (bh = asfs_breadcheck(sb, nextblock, ASFS_OBJECTCONTAINER_ID))) { ++ struct fsObjectContainer *oc = (void *) bh->b_data; ++ u8 *emptyspace; ++ ++ /* We need to find out how much free space this ObjectContainer has */ ++ ++ emptyspace = emptyspaceinobjectcontainer(sb, oc); ++ ++ if ((u8 *) oc + sb->s_blocksize - emptyspace >= bytesneeded) { ++ /* We found enough space in one of the ObjectContainer blocks!! ++ We return a struct fsObject *. */ ++ *io_bh = bh; ++ *io_o = (struct fsObject *) emptyspace; ++ break; ++ } ++ nextblock = be32_to_cpu(oc->next); ++ asfs_brelse(bh); ++ } ++ ++ if (nextblock == 0) { ++ u32 newcontblock; ++ /* If we get here, we traversed the *entire* directory (ough!) and found no empty ++ space large enough for our entry. We allocate new space and add it to this ++ directory. */ ++ ++ if ((errorcode = asfs_allocadminspace(sb, &newcontblock)) == 0 && (bh = asfs_getzeroblk(sb, newcontblock))) { ++ struct fsObjectContainer *oc = (void *) bh->b_data; ++ struct buffer_head *bhnext; ++ ++ asfs_debug("findobjectspace: No room was found, allocated new block at %u\n", newcontblock); ++ ++ /* Allocated new block. We will now link it to the START of the directory chain ++ so the new free space can be found quickly when more entries need to be added. */ ++ ++ oc->bheader.id = cpu_to_be32(ASFS_OBJECTCONTAINER_ID); ++ oc->bheader.ownblock = cpu_to_be32(newcontblock); ++ oc->parent = oparent->objectnode; ++ oc->next = oparent->object.dir.firstdirblock; ++ oc->previous = 0; ++ ++ oparent->object.dir.firstdirblock = cpu_to_be32(newcontblock); ++ ++ asfs_bstore(sb, bhparent); ++ ++ if (oc->next != 0 && (bhnext = asfs_breadcheck(sb, be32_to_cpu(oc->next), ASFS_OBJECTCONTAINER_ID))) { ++ struct fsObjectContainer *ocnext = (void *) bhnext->b_data; ++ ocnext->previous = cpu_to_be32(newcontblock); ++ asfs_bstore(sb, bhnext); ++ asfs_brelse(bhnext); ++ } ++ ++ *io_bh = bh; ++ *io_o = oc->object; ++ } ++ } ++ ++ asfs_debug("findobjectspace: new object will be in container block %u\n", be32_to_cpu(((struct fsBlockHeader *) (*io_bh)->b_data)->ownblock)); ++ ++ return (errorcode); ++} ++ ++/* io_bh & io_o refer to the direct parent of the new object. Objectname is the ++ name of the new object (name only). Does not realese io_bh !!! */ ++ ++int asfs_createobject(struct super_block *sb, struct buffer_head **io_bh, struct fsObject **io_o, struct fsObject *src_o, u8 *objectname, int force) ++{ ++ int errorcode; ++ u32 object_size; ++ u32 hashblock = be32_to_cpu((*io_o)->object.dir.hashtable); ++ ++ asfs_debug("createobject: Creating object '%s' in dir '%s'.\n", objectname, (*io_o)->name); ++ ++ if (!force && ASFS_SB(sb)->freeblocks < ASFS_ALWAYSFREE) ++ return -ENOSPC; ++ ++ if (!force && be32_to_cpu((*io_o)->objectnode) == ASFS_RECYCLEDNODE) ++ return -EINVAL; ++ ++ object_size = sizeof(struct fsObject) + strlen(objectname) + 2; ++ ++ if ((errorcode = findobjectspace(sb, io_bh, io_o, object_size)) == 0) { ++ struct fsObject *o2 = *io_o; ++ u8 *name = o2->name; ++ u8 *objname = objectname; ++ struct buffer_head *node_bh; ++ struct fsObjectNode *on; ++ u32 nodeno; ++ ++ **io_o = *src_o; /* Copying whole object data... */ ++ ++ while (*objname != 0) /* Copying name */ ++ *name++ = *objname++; ++ ++ *name++ = 0; ++ *name = 0; /* zero byte for comment */ ++ ++ if (o2->objectnode != 0) /* ObjectNode reuse or creation */ ++ errorcode = asfs_getnode(sb, o2->objectnode, &node_bh, &on); ++ else { ++ if ((errorcode = asfs_createnode(sb, &node_bh, (struct fsNode **) &on, &nodeno)) == 0) { ++ on->hash16 = cpu_to_be16(asfs_hash(o2->name, ASFS_SB(sb)->flags & ASFS_ROOTBITS_CASESENSITIVE)); ++ o2->objectnode = cpu_to_be32(nodeno); ++ } ++ asfs_debug("createnode returned with errorcode: %d\n", errorcode); ++ } ++ ++ if (errorcode == 0) { /* in io_bh there is a container with created object */ ++ on->node.data = ((struct fsBlockHeader *) (*io_bh)->b_data)->ownblock; ++ if ((errorcode = hashobject(sb, hashblock, on, be32_to_cpu(o2->objectnode), objectname)) == 0) { ++ asfs_bstore(sb, node_bh); ++ asfs_brelse(node_bh); ++ } else ++ errorcode = -EIO; ++ } ++ ++ if (errorcode == 0) { /* HashBlock reuse or creation:*/ ++ ++ if ((o2->bits & OTYPE_DIR) != 0 && o2->object.dir.hashtable == 0) { ++ struct buffer_head *hashbh; ++ u32 hashblock; ++ ++ asfs_debug("creating Hashblock\n"); ++ ++ if ((errorcode = asfs_allocadminspace(sb, &hashblock)) == 0 && (hashbh = asfs_getzeroblk(sb, hashblock))) { ++ struct fsHashTable *ht = (void *) hashbh->b_data; ++ ++ o2->object.dir.hashtable = cpu_to_be32(hashblock); ++ ++ ht->bheader.id = cpu_to_be32(ASFS_HASHTABLE_ID); ++ ht->bheader.ownblock = cpu_to_be32(hashblock); ++ ht->parent = o2->objectnode; ++ ++ asfs_bstore(sb, hashbh); ++ asfs_brelse(hashbh); ++ } ++ } ++ } ++ ++ if (errorcode == 0) { /* SoftLink creation: */ ++ if ((o2->bits & (OTYPE_LINK | OTYPE_HARDLINK)) == OTYPE_LINK && o2->object.file.data == 0) { ++ struct buffer_head *bh2; ++ u32 slinkblock; ++ ++ if ((errorcode = asfs_allocadminspace(sb, &slinkblock)) == 0 && (bh2 = asfs_getzeroblk(sb, slinkblock))) { ++ struct fsSoftLink *sl = (void *) bh2->b_data; ++ o2->object.file.data = cpu_to_be32(slinkblock); ++ sl->bheader.id = cpu_to_be32(ASFS_SOFTLINK_ID); ++ sl->bheader.ownblock = cpu_to_be32(slinkblock); ++ sl->parent = o2->objectnode; ++ sl->next = 0; ++ sl->previous = 0; ++ asfs_bstore(sb, bh2); ++ asfs_brelse(bh2); ++ } ++ } ++ } ++ } ++ asfs_debug("createobject: done.\n"); ++ ++ return (errorcode); ++} ++ ++ /* This function extends the file object 'o' with a number of blocks ++ (hopefully, if any blocks has been found!). Only new Extents will ++ be created -- the size of the file will not be altered, and changing ++ it is left up to the caller. If the file did not have any blocks ++ yet, then the o->object.file.data will be set to the first (new) ++ ExtentBNode. It returns the number of added blocks through ++ addedblocks pointer */ ++ ++int asfs_addblockstofile(struct super_block *sb, struct buffer_head *objbh, struct fsObject *o, u32 blocks, u32 * newspace, u32 * addedblocks) ++{ ++ u32 lastextentbnode; ++ int errorcode = 0; ++ struct fsExtentBNode *ebnp; ++ struct buffer_head *block = NULL; ++ ++ ++ asfs_debug("extendblocksinfile: Trying to increasing number of blocks by %d.\n", blocks); ++ ++ lastextentbnode = be32_to_cpu(o->object.file.data); ++ ++ if (lastextentbnode != 0) { ++ while (lastextentbnode != 0 && errorcode == 0) { ++ if (block != NULL) ++ asfs_brelse(block); ++ errorcode = asfs_getextent(sb, lastextentbnode, &block, &ebnp); ++ lastextentbnode = be32_to_cpu(ebnp->next); ++ } ++ lastextentbnode = be32_to_cpu(ebnp->key); ++ } ++ ++ if (errorcode == 0) { ++ u32 searchstart; ++ ++ u32 found_block; ++ u32 found_blocks; ++ ++ *addedblocks = 0; ++ *newspace = 0; ++ ++ if (lastextentbnode != 0) ++ searchstart = be32_to_cpu(ebnp->key) + be16_to_cpu(ebnp->blocks); ++ else ++ searchstart = 0; //ASFS_SB(sb)->block_rovingblockptr; ++ ++ if ((errorcode = asfs_findspace(sb, blocks, searchstart, searchstart, &found_block, &found_blocks)) != 0) { ++ asfs_brelse(block); ++ asfs_debug("extendblocksinfile: findspace returned %s\n", errorcode == -ENOSPC ? "ENOSPC" : "error"); ++ return errorcode; ++ } ++ ++ blocks = found_blocks; ++ errorcode = asfs_markspace(sb, found_block, found_blocks); ++ *addedblocks = found_blocks; ++ *newspace = found_block; ++ ++ asfs_debug("extendblocksinfile: block = %u, lastextentbnode = %u, extentblocks = %d\n", found_block, lastextentbnode, blocks); ++ ++ if ((errorcode = asfs_addblocks(sb, blocks, found_block, be32_to_cpu(o->objectnode), &lastextentbnode)) != 0) { ++ asfs_debug("extendblocksinfile: addblocks returned errorcode %d\n", errorcode); ++ return errorcode; ++ } ++ ++ if (o->object.file.data == 0) ++ o->object.file.data = cpu_to_be32(lastextentbnode); ++ } ++ ++ if (block) ++ asfs_brelse(block); ++ asfs_bstore(sb, objbh); ++ ++ asfs_debug("addblockstofile: done. added %d blocks\n", *addedblocks); ++ ++ return errorcode; ++} ++ ++ /* The Object indicated by bh1 & o1, gets renamed to newname and placed ++ in the directory indicated by bhparent & oparent. */ ++ ++int asfs_renameobject(struct super_block *sb, struct buffer_head *bh1, struct fsObject *o1, struct buffer_head *bhparent, struct fsObject *oparent, u8 * newname) ++{ ++ struct fsObject object; ++ u32 oldparentnode = be32_to_cpu(((struct fsObjectContainer *) bh1->b_data)->parent); ++ u8 oldname[107]; ++ int errorcode; ++ ++ asfs_debug("renameobject: Renaming '%s' to '%s' in dir '%s'\n", o1->name, newname, oparent->name); ++ ++ object = *o1; ++ strcpy(oldname, o1->name); ++ ++ if ((errorcode = dehashobjectquick(sb, be32_to_cpu(o1->objectnode), o1->name, oldparentnode)) == 0) { ++ u32 parentobjectnode = be32_to_cpu(oparent->objectnode); ++ ++ if ((errorcode = simpleremoveobject(sb, bh1, o1)) == 0) { ++ struct buffer_head *bh2 = bhparent; ++ struct fsObject *o2; ++ ++ /* oparent might changed after simpleremoveobject */ ++ oparent = o2 = find_obj_by_node(sb, (struct fsObjectContainer *) bhparent->b_data, parentobjectnode); ++ ++ /* In goes the Parent bh & o, out comes the New object's bh & o :-) */ ++ if ((errorcode = asfs_createobject(sb, &bh2, &o2, &object, newname, TRUE)) == 0) { ++ asfs_bstore(sb, bh2); ++ if (be32_to_cpu(oparent->objectnode) == ASFS_RECYCLEDNODE) { ++ asfs_debug("renameobject: Updating recycled dir info\n"); ++ if ((errorcode = setrecycledinfodiff(sb, 1, (be32_to_cpu(o2->object.file.size) + sb->s_blocksize - 1) >> sb->s_blocksize_bits)) != 0) { ++ brelse(bh2); ++ return errorcode; ++ } ++ } ++ brelse(bh2); ++ asfs_debug("renameobject: Succesfully created & stored new object.\n"); ++ } else { /* recreate object in old place, maybe this will not fail, but who knows... */ ++ asfs_debug("renameobject: Creating new object failed. Trying to recreate it in source directory.\n"); ++ if (asfs_readobject(sb, oldparentnode, &bh1, &o1) == 0) { ++ struct buffer_head *bh2 = bh1; ++ if (asfs_createobject(sb, &bh2, &o1, &object, oldname, TRUE) == 0) { ++ asfs_bstore(sb, bh2); ++ if (oldparentnode == ASFS_RECYCLEDNODE) { ++ asfs_debug("renameobject: Updating recycled dir info\n"); ++ setrecycledinfodiff(sb, 1, (be32_to_cpu(o1->object.file.size) + sb->s_blocksize - 1) >> sb->s_blocksize_bits); ++ } ++ brelse(bh2); ++ } ++ brelse(bh1); ++ } ++ } ++ } ++ } ++ return errorcode; ++} ++ ++ /* Truncates the specified file to /newsize/ bytes */ ++ ++int asfs_truncateblocksinfile(struct super_block *sb, struct buffer_head *bh, struct fsObject *o, u32 newsize) ++{ ++ struct buffer_head *ebh; ++ struct fsExtentBNode *ebn; ++ int errorcode; ++ u32 pos = 0; ++ u32 newblocks = (newsize + sb->s_blocksize - 1) >> sb->s_blocksize_bits; ++ u32 filedata = be32_to_cpu(o->object.file.data); ++ u32 eprev, ekey; ++ u16 eblocks; ++ ++ asfs_debug("trucateblocksinfile: newsize %u\n", newsize); ++ ++ if (filedata == 0) ++ return 0; ++ ++ for (;;) { ++ if ((errorcode = asfs_getextent(sb, filedata, &ebh, &ebn)) != 0) ++ return errorcode; ++ if (pos + be16_to_cpu(ebn->blocks) >= newblocks) ++ break; ++ pos += be16_to_cpu(ebn->blocks); ++ if ((filedata = be32_to_cpu(ebn->next)) == 0) ++ break; ++ asfs_brelse(ebh); ++ }; ++ ++ eblocks = newblocks - pos; ++ ekey = be32_to_cpu(ebn->key); ++ eprev = be32_to_cpu(ebn->prev); ++ ++ if (be16_to_cpu(ebn->blocks) < eblocks) { ++ printk("ASFS: Extent chain is too short or damaged!\n"); ++ asfs_brelse(ebh); ++ return -ENOENT; ++ } ++ if (be16_to_cpu(ebn->blocks) - eblocks > 0 && (errorcode = asfs_freespace(sb, be32_to_cpu(ebn->key) + eblocks, be16_to_cpu(ebn->blocks) - eblocks)) != 0) { ++ asfs_brelse(ebh); ++ return errorcode; ++ } ++ if (be32_to_cpu(ebn->next) > 0 && (errorcode = asfs_deleteextents(sb, be32_to_cpu(ebn->next))) != 0) { ++ asfs_brelse(ebh); ++ return errorcode; ++ } ++ ebn->blocks = cpu_to_be16(eblocks); ++ ebn->next = 0; ++ asfs_bstore(sb, ebh); ++ ++ if (eblocks == 0) { ++ if (eprev & MSB_MASK) { ++ o->object.file.data = 0; ++ asfs_bstore(sb, bh); ++ } else { ++ struct buffer_head *ebhp; ++ struct fsExtentBNode *ebnp; ++ ++ if ((errorcode = asfs_getextent(sb, eprev & !MSB_MASK, &ebhp, &ebnp)) != 0) { ++ asfs_brelse(ebh); ++ return errorcode; ++ } ++ ++ ebnp->next = 0; ++ asfs_bstore(sb, ebhp); ++ asfs_brelse(ebhp); ++ } ++ if ((errorcode = asfs_deletebnode(sb, ebh, ekey)) != 0) { ++ asfs_brelse(ebh); ++ return errorcode; ++ } ++ } ++ asfs_brelse(ebh); ++ ++ return 0; ++} ++#endif +diff -urN linux-2.6.3/fs/asfs/super.c linux-2.6.3-asfs-1.0b7/fs/asfs/super.c +--- linux-2.6.3/fs/asfs/super.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.3-asfs-1.0b7/fs/asfs/super.c 2004-06-25 22:44:25.119502392 +0200 +@@ -0,0 +1,437 @@ ++/* ++ * ++ * Amiga Smart File System, Linux implementation ++ * ++ * version: 1.0beta7 for 2.6.x kernel ++ * ++ * Copyright (C) 2003,2004 Marek 'March' Szyprowski ++ * ++ * ++ * Thanks to Marcin Kurek (Morgoth/Dreamolers-CAPS) for help and parts ++ * of original amiga version of SmartFilesystem source code. ++ * ++ * SmartFilesystem is copyrighted (C) 2003 by: John Hendrikx, ++ * Ralph Schmidt, Emmanuel Lesueur, David Gerber and Marcin Kurek ++ * ++ * ++ * ASFS is based on the Amiga FFS filesystem for Linux ++ * Copyright (C) 1993 Ray Burr ++ * Copyright (C) 1996 Hans-Joachim Widmaier ++ * ++ * Earlier versions were based on the Linux implementation of ++ * the ROMFS file system ++ * Copyright (C) 1997-1999 Janos Farkas ++ * ++ * ASFS used some parts of the smbfs filesystem: ++ * Copyright (C) 1995, 1996 by Paal-Kr. Engstad and Volker Lendecke ++ * Copyright (C) 1997 by Volker Lendecke ++ * ++ * and parts of the Minix filesystem additionally ++ * Copyright (C) 1991, 1992 Linus Torvalds ++ * Copyright (C) 1996 Gertjan van Wingerde ++ * ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License ++ * as published by the Free Software Foundation; either version ++ * 2 of the License, or (at your option) any later version. ++ * ++ */ ++ ++/* todo: ++ * - remove bugs ++ * - add missing features (maybe safe-delete, other...) ++ * - create other fs tools like mkfs.asfs and fsck.asfs, some data-recovery tools ++ */ ++ ++#define ASFS_VERSION "1.0beta7 (25.06.2004)" ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "asfs_fs.h" ++ ++#include ++#include ++ ++u32 asfs_calcchecksum(void *block, u32 blocksize) ++{ ++ u32 *data = block, checksum = 1; ++ while (blocksize > 0) { ++ checksum += be32_to_cpu(*data++); ++ blocksize -= 4; ++ } ++ checksum -= be32_to_cpu(((struct fsBlockHeader *)block)->checksum); ++ return -checksum; ++} ++ ++static struct super_operations asfs_ops = { ++ .alloc_inode = asfs_alloc_inode, ++ .destroy_inode = asfs_destroy_inode, ++ .put_super = asfs_put_super, ++ .statfs = asfs_statfs, ++#ifdef CONFIG_ASFS_RW ++ .remount_fs = asfs_remount, ++#endif ++}; ++ ++extern struct dentry_operations asfs_dentry_operations; ++ ++enum { ++ Opt_mode, Opt_setgid, Opt_setuid, Opt_prefix, Opt_volume, ++ Opt_lcvol, Opt_ignore, Opt_err, ++}; ++ ++static match_table_t tokens = { ++ {Opt_mode, "mode=%o"}, ++ {Opt_setgid, "setgid=%u"}, ++ {Opt_setuid, "setuid=%u"}, ++ {Opt_prefix, "prefix=%s"}, ++ {Opt_volume, "volume=%s"}, ++ {Opt_lcvol, "lowercasevol"}, ++ {Opt_ignore, "grpquota"}, ++ {Opt_ignore, "noquota"}, ++ {Opt_ignore, "quota"}, ++ {Opt_ignore, "usrquota"}, ++ {Opt_err, NULL}, ++}; ++ ++static int asfs_parse_options(char *options, struct super_block *sb) ++{ ++ char *p; ++ substring_t args[MAX_OPT_ARGS]; ++ ++ if (!options) ++ return 1; ++ while ((p = strsep(&options, ",")) != NULL) { ++ int token, option; ++ if (!*p) ++ continue; ++ token = match_token(p, tokens, args); ++ ++ switch (token) { ++ case Opt_mode: ++ if (match_octal(&args[0], &option)) ++ goto no_arg; ++ ASFS_SB(sb)->mode = option & 0777; ++ break; ++ case Opt_setgid: ++ if (match_int(&args[0], &option)) ++ goto no_arg; ++ ASFS_SB(sb)->gid = option; ++ break; ++ case Opt_setuid: ++ if (match_int(&args[0], &option)) ++ goto no_arg; ++ ASFS_SB(sb)->uid = option; ++ break; ++ case Opt_prefix: ++ if (ASFS_SB(sb)->prefix) { ++ kfree(ASFS_SB(sb)->prefix); ++ ASFS_SB(sb)->prefix = NULL; ++ } ++ ASFS_SB(sb)->prefix = match_strdup(&args[0]); ++ if (! ASFS_SB(sb)->prefix) ++ return 0; ++ break; ++ case Opt_volume: ++ if (ASFS_SB(sb)->root_volume) { ++ kfree(ASFS_SB(sb)->root_volume); ++ ASFS_SB(sb)->root_volume = NULL; ++ } ++ ASFS_SB(sb)->root_volume = match_strdup(&args[0]); ++ if (! ASFS_SB(sb)->root_volume) ++ return 0; ++ break; ++ case Opt_lcvol: ++ ASFS_SB(sb)->flags |= ASFS_VOL_LOWERCASE; ++ break; ++ case Opt_ignore: ++ /* Silently ignore the quota options */ ++ break; ++ default: ++no_arg: ++ printk("ASFS: Unrecognized mount option \"%s\" " ++ "or missing value\n", p); ++ return 0; ++ } ++ } ++ return 1; ++} ++ ++static int asfs_fill_super(struct super_block *sb, void *data, int silent) ++{ ++ struct asfs_sb_info *sbi; ++ struct buffer_head *bh; ++ struct fsRootBlock *rootblock; ++ struct inode *rootinode; ++ ++ sbi = kmalloc(sizeof(struct asfs_sb_info), GFP_KERNEL); ++ if (!sbi) ++ return -ENOMEM; ++ sb->s_fs_info = sbi; ++ ++ /* Fill in defaults */ ++ ASFS_SB(sb)->uid = ASFS_DEFAULT_UID; ++ ASFS_SB(sb)->gid = ASFS_DEFAULT_GID; ++ ASFS_SB(sb)->mode = ASFS_DEFAULT_MODE; ++ ASFS_SB(sb)->prefix = NULL; ++ ASFS_SB(sb)->root_volume = NULL; ++ ASFS_SB(sb)->flags = 0; ++ ++ if (!asfs_parse_options(data, sb)) { ++ printk(KERN_ERR "ASFS: Error parsing options\n"); ++ return -EINVAL; ++ } ++ ++ if (!sb_set_blocksize(sb, 512)) ++ return -EINVAL; ++ sb->s_maxbytes = ASFS_MAXFILESIZE; ++ ++ bh = sb_bread(sb, 0); ++ if (!bh) { ++ printk(KERN_ERR "ASFS: unable to read superblock\n"); ++ return -EINVAL; ++ } ++ ++ rootblock = (struct fsRootBlock *)bh->b_data; ++ ++ if (be32_to_cpu(rootblock->bheader.id) == ASFS_ROOTID && ++ be16_to_cpu(rootblock->version) == ASFS_STRUCTURE_VERISON) { ++ ++ sb->s_blocksize = be32_to_cpu(rootblock->blocksize); ++ ASFS_SB(sb)->totalblocks = be32_to_cpu(rootblock->totalblocks); ++ ASFS_SB(sb)->rootobjectcontainer = be32_to_cpu(rootblock->rootobjectcontainer); ++ ASFS_SB(sb)->extentbnoderoot = be32_to_cpu(rootblock->extentbnoderoot); ++ ASFS_SB(sb)->objectnoderoot = be32_to_cpu(rootblock->objectnoderoot); ++ ASFS_SB(sb)->flags |= 0xff & rootblock->bits; ++ ASFS_SB(sb)->adminspacecontainer = be32_to_cpu(rootblock->adminspacecontainer); ++ ASFS_SB(sb)->bitmapbase = be32_to_cpu(rootblock->bitmapbase); ++ ASFS_SB(sb)->blocks_inbitmap = (sb->s_blocksize - sizeof(struct fsBitmap))<<3; /* must be a multiple of 32 !! */ ++ ASFS_SB(sb)->blocks_bitmap = (ASFS_SB(sb)->totalblocks + ASFS_SB(sb)->blocks_inbitmap - 1) / ASFS_SB(sb)->blocks_inbitmap; ++ ASFS_SB(sb)->block_rovingblockptr = 0; ++ asfs_brelse(bh); ++ ++ if (!sb_set_blocksize(sb, sb->s_blocksize)) { ++ printk(KERN_ERR "ASFS: Found Amiga SFS RootBlock on dev %s, but blocksize %ld is not supported!\n", \ ++ sb->s_id, sb->s_blocksize); ++ return -EINVAL; ++ } ++ ++ bh = sb_bread(sb, 0); ++ if (!bh) { ++ printk(KERN_ERR "ASFS: unable to read superblock\n"); ++ goto out; ++ } ++ rootblock = (struct fsRootBlock *)bh->b_data; ++ ++ if (asfs_check_block((void *)rootblock, sb->s_blocksize, 0, ASFS_ROOTID)) { ++#ifdef CONFIG_ASFS_RW ++ struct buffer_head *tmpbh; ++ if ((tmpbh = asfs_breadcheck(sb, ASFS_SB(sb)->rootobjectcontainer, ASFS_OBJECTCONTAINER_ID))) { ++ struct fsRootInfo *ri = (struct fsRootInfo *)((u8 *)tmpbh->b_data + sb->s_blocksize - sizeof(struct fsRootInfo)); ++ ASFS_SB(sb)->freeblocks = be32_to_cpu(ri->freeblocks); ++ asfs_brelse(tmpbh); ++ } else ++ ASFS_SB(sb)->freeblocks = 0; ++ ++ if ((tmpbh = asfs_breadcheck(sb, ASFS_SB(sb)->rootobjectcontainer+2, ASFS_TRANSACTIONFAILURE_ID))) { ++ printk(KERN_NOTICE "VFS: Found Amiga SFS RootBlock on dev %s, but it has unfinished transaction. Mounting read-only.\n", sb->s_id); ++ ASFS_SB(sb)->flags |= ASFS_READONLY; ++ asfs_brelse(tmpbh); ++ } ++ ++ if ((tmpbh = asfs_breadcheck(sb, ASFS_SB(sb)->totalblocks-1, ASFS_ROOTID)) == NULL) { ++ printk(KERN_NOTICE "VFS: Found Amiga SFS RootBlock on dev %s, but there is no second RootBlock! Mounting read-only.\n", sb->s_id); ++ ASFS_SB(sb)->flags |= ASFS_READONLY; ++ asfs_brelse(tmpbh); ++ } ++ if (!(ASFS_SB(sb)->flags & ASFS_READONLY)) ++ printk(KERN_NOTICE "VFS: Found Amiga SFS RootBlock on dev %s.\n", sb->s_id); ++#else ++ ASFS_SB(sb)->freeblocks = 0; ++ ASFS_SB(sb)->flags |= ASFS_READONLY; ++ printk(KERN_NOTICE "VFS: Found Amiga SFS RootBlock on dev %s.\n", sb->s_id); ++#endif ++ } else { ++ if (!silent) ++ printk(KERN_ERR "VFS: Found Amiga SFS RootBlock on dev %s, but it has checksum error!\n", \ ++ sb->s_id); ++ goto out; ++ } ++ } else { ++ if (!silent) ++ printk(KERN_ERR "VFS: Can't find a valid Amiga SFS filesystem on dev %s.\n", \ ++ sb->s_id); ++ goto out; ++ } ++ ++ asfs_brelse(bh); ++ ++ sb->s_magic = ASFS_MAGIC; ++ sb->s_flags |= MS_NODEV | MS_NOSUID; ++ if (ASFS_SB(sb)->flags & ASFS_READONLY) ++ sb->s_flags |= MS_RDONLY; ++ sb->s_op = &asfs_ops; ++ ++ if ((rootinode = asfs_get_root_inode(sb))) { ++ if ((sb->s_root = d_alloc_root(rootinode))) { ++ sb->s_root->d_op = &asfs_dentry_operations; ++ return 0; ++ } ++ iput(rootinode); ++ } ++ return -EINVAL; ++ ++out: ++ asfs_brelse(bh); ++ return -EINVAL; ++ ++} ++ ++#ifdef CONFIG_ASFS_RW ++int asfs_remount(struct super_block *sb, int *flags, char *data) ++{ ++ asfs_debug("ASFS: remount (flags=0x%x, opts=\"%s\")\n",*flags,data); ++ ++ if (!asfs_parse_options(data,sb)) ++ return -EINVAL; ++ ++ if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) ++ return 0; ++ ++ if (*flags & MS_RDONLY) { ++ sb->s_flags |= MS_RDONLY; ++ } else if (!(ASFS_SB(sb)->flags & ASFS_READONLY)) { ++ sb->s_flags &= ~MS_RDONLY; ++ } else { ++ printk("VFS: Can't remount Amiga SFS on dev %s read/write because of errors.", sb->s_id); ++ return -EINVAL; ++ } ++ return 0; ++} ++#endif ++ ++void asfs_put_super(struct super_block *sb) ++{ ++ struct asfs_sb_info *sbi = ASFS_SB(sb); ++ ++ if (ASFS_SB(sb)->prefix) ++ kfree(ASFS_SB(sb)->prefix); ++ if (ASFS_SB(sb)->root_volume) ++ kfree(ASFS_SB(sb)->root_volume); ++ ++ kfree(sbi); ++ sb->s_fs_info = NULL; ++ return; ++} ++ ++/* That's simple too. */ ++int asfs_statfs(struct super_block *sb, struct kstatfs *buf) ++{ ++ buf->f_type = ASFS_MAGIC; ++ buf->f_bsize = sb->s_blocksize; ++ buf->f_bfree = buf->f_bavail = ASFS_SB(sb)->freeblocks; ++ buf->f_blocks = ASFS_SB(sb)->totalblocks; ++ buf->f_namelen = ASFS_MAXFN; ++ return 0; ++} ++ ++/* --- new in 2.6.x --- */ ++static kmem_cache_t * asfs_inode_cachep; ++ ++struct inode *asfs_alloc_inode(struct super_block *sb) ++{ ++ struct asfs_inode_info *ei; ++ ei = (struct asfs_inode_info *)kmem_cache_alloc(asfs_inode_cachep, SLAB_KERNEL); ++ if (!ei) ++ return NULL; ++ return &ei->vfs_inode; ++} ++ ++void asfs_destroy_inode(struct inode *inode) ++{ ++ kmem_cache_free(asfs_inode_cachep, ASFS_I(inode)); ++} ++ ++static void init_once(void * foo, kmem_cache_t * cachep, unsigned long flags) ++{ ++ struct asfs_inode_info *ei = (struct asfs_inode_info *) foo; ++ ++ if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) == ++ SLAB_CTOR_CONSTRUCTOR) { ++ inode_init_once(&ei->vfs_inode); ++ } ++} ++ ++static int init_inodecache(void) ++{ ++ asfs_inode_cachep = kmem_cache_create("asfs_inode_cache", ++ sizeof(struct asfs_inode_info), ++ 0, SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT, ++ init_once, NULL); ++ if (asfs_inode_cachep == NULL) ++ return -ENOMEM; ++ return 0; ++} ++ ++static void destroy_inodecache(void) ++{ ++ if (kmem_cache_destroy(asfs_inode_cachep)) ++ printk(KERN_INFO "asfs_inode_cache: not all structures were freed\n"); ++} ++ ++static struct super_block *asfs_get_sb(struct file_system_type *fs_type, ++ int flags, const char *dev_name, void *data) ++{ ++ return get_sb_bdev(fs_type, flags, dev_name, data, asfs_fill_super); ++} ++ ++static struct file_system_type asfs_fs_type = { ++ .owner = THIS_MODULE, ++ .name = "asfs", ++ .get_sb = asfs_get_sb, ++ .kill_sb = kill_block_super, ++ .fs_flags = FS_REQUIRES_DEV, ++}; ++ ++static int __init init_asfs_fs(void) ++{ ++ int err = init_inodecache(); ++ if (err) ++ goto out1; ++ err = register_filesystem(&asfs_fs_type); ++ if (err) ++ goto out; ++ return 0; ++out: ++ destroy_inodecache(); ++out1: ++ return err; ++} ++ ++static void __exit exit_asfs_fs(void) ++{ ++ unregister_filesystem(&asfs_fs_type); ++ destroy_inodecache(); ++} ++ ++/* Yes, works even as a module... :) */ ++ ++#ifdef CONFIG_ASFS_RW ++MODULE_DESCRIPTION("Amiga Smart File System (read/write) support for Linux kernel 2.6.x v" ASFS_VERSION); ++#else ++MODULE_DESCRIPTION("Amiga Smart File System (read-only) support for Linux kernel 2.6.x v" ASFS_VERSION); ++#endif ++MODULE_LICENSE("GPL"); ++MODULE_AUTHOR("Marek Szyprowski "); ++ ++module_init(init_asfs_fs) ++module_exit(exit_asfs_fs) +diff -urN linux-2.6.3/fs/asfs/symlink.c linux-2.6.3-asfs-1.0b7/fs/asfs/symlink.c +--- linux-2.6.3/fs/asfs/symlink.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.3-asfs-1.0b7/fs/asfs/symlink.c 2004-06-10 01:41:24.000000000 +0200 +@@ -0,0 +1,165 @@ ++/* ++ * ++ * Amiga Smart File System, Linux implementation ++ * version: 1.0beta7 ++ * ++ * Copyright (C) 2003,2004 Marek 'March' Szyprowski ++ * ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License ++ * as published by the Free Software Foundation; either version ++ * 2 of the License, or (at your option) any later version. ++ * ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "asfs_fs.h" ++ ++#include ++#include ++ ++int asfs_symlink_readpage(struct file *file, struct page *page) ++{ ++ struct buffer_head *bh; ++ struct fsSoftLink *slinkcont; ++ struct inode *inode = page->mapping->host; ++ struct super_block *sb = inode->i_sb; ++ char *link = kmap(page); ++ int i = 0, j = 0; ++ char c, lc = 0, *prefix, *lf, *p; ++ ++ if (!(bh = asfs_breadcheck(sb, ASFS_I(inode)->firstblock, ASFS_SOFTLINK_ID))) { ++ SetPageError(page); ++ kunmap(page); ++ unlock_page(page); ++ return -EIO; ++ } ++ slinkcont = (struct fsSoftLink *) bh->b_data; ++ ++ lf = slinkcont->string; ++ prefix = ASFS_SB(sb)->prefix ? ASFS_SB(sb)->prefix : "/"; ++ ++ if ((p = strchr(lf,':'))) { /* Handle assign or volume name */ ++ if (ASFS_SB(sb)->root_volume && ++ strncmp(lf, ASFS_SB(sb)->root_volume, strlen(ASFS_SB(sb)->root_volume)) == 0) { ++ /* global root volume name found */ ++ link[i++] = '/'; ++ lf = p+1; ++ } else { ++ /* adding volume prefix */ ++ while (i < 1023 && (c = prefix[i])) ++ link[i++] = c; ++ if (ASFS_SB(sb)->flags & ASFS_VOL_LOWERCASE) { ++ while (i < 1023 && lf[j] != ':') ++ link[i++] = asfs_lowerchar(lf[j++]); ++ } else { ++ while (i < 1023 && lf[j] != ':') ++ link[i++] = lf[j++]; ++ } ++ if (i < 1023) ++ link[i++] = '/'; ++ j++; ++ } ++ lc = '/'; ++ } ++ ++ while (i < 1023 && (c = lf[j])) { ++ if (c == '/' && lc == '/' && i < 1020) { /* parent dir */ ++ link[i++] = '.'; ++ link[i++] = '.'; ++ } ++ link[i++] = c; ++ lc = c; ++ j++; ++ } ++ link[i] = '\0'; ++ SetPageUptodate(page); ++ kunmap(page); ++ unlock_page(page); ++ asfs_brelse(bh); ++ return 0; ++} ++ ++#ifdef CONFIG_ASFS_RW ++ ++int asfs_write_symlink(struct inode *symfile, const char *symname) ++{ ++ struct super_block *sb = symfile->i_sb; ++ struct buffer_head *bh; ++ struct fsSoftLink *slinkcont; ++ char *p, c, lc; ++ int i, maxlen, pflen; ++ ++ asfs_debug("asfs_write_symlink %s to node %d\n", symname, (int)symfile->i_ino); ++ ++ if (!(bh = asfs_breadcheck(sb, ASFS_I(symfile)->firstblock, ASFS_SOFTLINK_ID))) { ++ unlock_super(sb); ++ return -EIO; ++ } ++ slinkcont = (struct fsSoftLink *) bh->b_data; ++ ++ /* translating symlink target path */ ++ ++ maxlen = sb->s_blocksize - sizeof(struct fsSoftLink) - 2; ++ i = 0; ++ p = slinkcont->string; ++ lc = '/'; ++ ++ if (*symname == '/') { ++ while (*symname == '/') ++ symname++; ++ if (ASFS_SB(sb)->prefix && ++ strncmp(symname-1, ASFS_SB(sb)->prefix, (pflen = strlen(ASFS_SB(sb)->prefix))) == 0) { ++ /* found volume prefix, ommiting it */ ++ symname += pflen; ++ while ((c = *symname++) != '/' && c != '\0') { ++ *p++ = c; ++ i++; ++ } ++ *p++ = ':'; ++ } else if (ASFS_SB(sb)->root_volume) { /* adding root volume name */ ++ while (ASFS_SB(sb)->root_volume[i]) ++ *p++ = ASFS_SB(sb)->root_volume[i++]; ++ *p++ = ':'; ++ } else { /* do nothing */ ++ *p++ = '/'; ++ } ++ i++; ++ } ++ ++ while (i < maxlen && (c = *symname++)) { ++ if (c == '.' && lc == '/' && *symname == '.' && symname[1] == '/') { ++ *p++ = '/'; ++ i++; ++ symname += 2; ++ lc = '/'; ++ } else if (c == '.' && lc == '/' && *symname == '/') { ++ symname++; ++ lc = '/'; ++ } else { ++ *p++ = c; ++ lc = c; ++ i++; ++ } ++ if (lc == '/') ++ while (*symname == '/') ++ symname++; ++ } ++ *p = 0; ++ ++ asfs_bstore(sb, bh); ++ asfs_brelse(bh); ++ ++ unlock_super(sb); ++ ++ return 0; ++} ++ ++#endif +diff -urN linux-2.6.3/fs/Kconfig linux-2.6.3-asfs-1.0b7/fs/Kconfig +--- linux-2.6.3/fs/Kconfig 2004-03-22 17:34:00.000000000 +0100 ++++ linux-2.6.3-asfs-1.0b7/fs/Kconfig 2004-06-17 00:31:43.000000000 +0200 +@@ -963,6 +963,37 @@ + To compile this file system support as a module, choose M here: the + module will be called affs. If unsure, say N. + ++config ASFS_FS ++ tristate "Amiga SFS file system support (EXPERIMENTAL)" ++ depends on EXPERIMENTAL ++ help ++ ++ The Amiga Smart FileSystem (SFS) is the file system used on hard ++ disks by Amiga(tm) and MorphOS(tm) systems. Say Y if you want ++ to be able to read files from an Amiga SFS partition on your hard ++ drive. ++ ++ For more information read ++ ++ To compile this file system support as a module, choose M here: the ++ module will be called asfs. ++ ++ If unsure, say N. ++ ++config ASFS_RW ++ bool "Amiga SFS write support (DANGEROUS)" ++ depends on ASFS_FS ++ help ++ ++ If you say Y here, you will be able to write to ASFS file ++ systems as well as read from them. The read-write support in ASFS ++ is in beta stage. This means that useing it to write files to SFS ++ partitions is DANGEROUS and COULD corrupt the filesystem. ++ ++ For more information read ++ ++ If unsure, say N. ++ + config HFS_FS + tristate "Apple Macintosh file system support (EXPERIMENTAL)" + depends on EXPERIMENTAL +diff -urN linux-2.6.3/fs/Makefile linux-2.6.3-asfs-1.0b7/fs/Makefile +--- linux-2.6.3/fs/Makefile 2004-03-22 17:34:00.000000000 +0100 ++++ linux-2.6.3-asfs-1.0b7/fs/Makefile 2004-03-22 18:22:00.000000000 +0100 +@@ -80,6 +80,7 @@ + obj-$(CONFIG_JFFS_FS) += jffs/ + obj-$(CONFIG_JFFS2_FS) += jffs2/ + obj-$(CONFIG_AFFS_FS) += affs/ ++obj-$(CONFIG_ASFS_FS) += asfs/ + obj-$(CONFIG_ROMFS_FS) += romfs/ + obj-$(CONFIG_QNX4FS_FS) += qnx4/ + obj-$(CONFIG_AUTOFS_FS) += autofs/ +diff -urN linux-2.6.3/include/linux/amigasfs.h linux-2.6.3-asfs-1.0b7/include/linux/amigasfs.h +--- linux-2.6.3/include/linux/amigasfs.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.3-asfs-1.0b7/include/linux/amigasfs.h 2004-06-10 19:24:37.000000000 +0200 +@@ -0,0 +1,276 @@ ++#ifndef __LINUX_AMIGASFS_H ++#define __LINUX_AMIGASFS_H ++ ++#include ++ ++/* some helper macros... */ ++#define ASFS_MAKE_ID(a,b,c,d) (((a)&0xff)<<24|((b)&0xff)<<16|((c)&0xff)<<8|((d)&0xff)) ++ ++/* Amiga SFS block IDs */ ++#define ASFS_ROOTID ASFS_MAKE_ID('S','F','S','\0') ++#define ASFS_OBJECTCONTAINER_ID ASFS_MAKE_ID('O','B','J','C') ++#define ASFS_BNODECONTAINER_ID ASFS_MAKE_ID('B','N','D','C') ++#define ASFS_NODECONTAINER_ID ASFS_MAKE_ID('N','D','C',' ') ++#define ASFS_HASHTABLE_ID ASFS_MAKE_ID('H','T','A','B') ++#define ASFS_SOFTLINK_ID ASFS_MAKE_ID('S','L','N','K') ++#define ASFS_ADMINSPACECONTAINER_ID ASFS_MAKE_ID('A','D','M','C') ++#define ASFS_BITMAP_ID ASFS_MAKE_ID('B','T','M','P') ++#define ASFS_TRANSACTIONFAILURE_ID ASFS_MAKE_ID('T','R','F','A') ++ ++/* Amiga SFS defines and magic values */ ++ ++#define ASFS_MAGIC 0xa0ff ++#define ASFS_MAXFN (105u) ++#define ASFS_MAXFILESIZE 0x8FFFFFFE ++ ++#define ASFS_STRUCTURE_VERISON (3) ++#define ASFS_BLCKFACCURACY (5) ++ ++#define ASFS_ROOTBITS_CASESENSITIVE (128) ++#define ASFS_READONLY (512) ++#define ASFS_VOL_LOWERCASE (1024) ++ ++#define ASFS_ROOTNODE (1) ++#define ASFS_RECYCLEDNODE (2) ++ ++#define OTYPE_HIDDEN (1) ++#define OTYPE_HARDLINK (32) ++#define OTYPE_LINK (64) ++#define OTYPE_DIR (128) ++ ++#define MSB_MASK (1ul << 31) ++ ++#define NODE_STRUCT_SIZE (10) /* (sizeof(struct fsObjectNode)) */ ++#define NODECONT_BLOCK_COUNT ((sb->s_blocksize - sizeof(struct fsNodeContainer)) / sizeof(u32)) ++ ++#define ASFS_ALWAYSFREE (16) /* keep this amount of blocks free */ ++ ++#define ASFS_BLOCKCHUNKS (16) /* try to allocate this number of blocks in one request */ ++ ++#ifndef TRUE ++#define TRUE 1 ++#endif ++#ifndef FALSE ++#define FALSE 0 ++#endif ++ ++/* amigados protection bits */ ++ ++#define FIBB_SCRIPT 6 /* program is a script (execute) file */ ++#define FIBB_PURE 5 /* program is reentrant and rexecutable */ ++#define FIBB_ARCHIVE 4 /* cleared whenever file is changed */ ++#define FIBB_READ 3 /* ignored by old filesystem */ ++#define FIBB_WRITE 2 /* ignored by old filesystem */ ++#define FIBB_EXECUTE 1 /* ignored by system, used by Shell */ ++#define FIBB_DELETE 0 /* prevent file from being deleted */ ++ ++#define FIBF_SCRIPT (1<s_blocksize) - sizeof(struct fsHashTable))>>2)) ++ ++/* Each block has its own header with checksum and id, its called fsBlockHeader */ ++ ++struct fsBlockHeader { ++ u32 id; /* 4 character id string of this block */ ++ u32 checksum; /* The checksum */ ++ u32 ownblock; /* The blocknumber of the block this block is stored at */ ++}; ++ ++/* On-disk "super block", called fsRootBlock */ ++ ++struct fsRootBlock { ++ struct fsBlockHeader bheader; ++ ++ u16 version; /* Version number of the filesystem block structure */ ++ u16 sequencenumber; /* The Root with the highest sequencenumber is valid */ ++ ++ u32 datecreated; /* Creation date (when first formatted). Cannot be changed. */ ++ u8 bits; /* various settings, see defines below. */ ++ u8 pad1; ++ u16 pad2; ++ ++ u32 reserved1[2]; ++ ++ u32 firstbyteh; /* The first byte of our partition from the start of the */ ++ u32 firstbyte; /* disk. firstbyteh = upper 32 bits, firstbyte = lower 32 bits. */ ++ ++ u32 lastbyteh; /* The last byte of our partition, excluding this one. */ ++ u32 lastbyte; ++ ++ u32 totalblocks; /* size of this partition in blocks */ ++ u32 blocksize; /* blocksize used */ ++ ++ u32 reserved2[2]; ++ u32 reserved3[8]; ++ ++ u32 bitmapbase; /* location of the bitmap */ ++ u32 adminspacecontainer; /* location of first adminspace container */ ++ u32 rootobjectcontainer; /* location of the root objectcontainer */ ++ u32 extentbnoderoot; /* location of the root of the extentbnode B-tree */ ++ u32 objectnoderoot; /* location of the root of the objectnode tree */ ++ ++ u32 reserved4[3]; ++}; ++ ++/* On disk inode, called fsObject */ ++ ++struct fsObject { ++ u16 owneruid; ++ u16 ownergid; ++ u32 objectnode; ++ u32 protection; ++ ++ union { ++ struct { ++ u32 data; ++ u32 size; ++ } file; ++ ++ struct { ++ u32 hashtable; /* for directories & root, 0 means no hashblock */ ++ u32 firstdirblock; ++ } dir; ++ } object; ++ ++ u32 datemodified; ++ u8 bits; ++ ++ u8 name[0]; ++ u8 comment[0]; ++}; ++ ++/* On disk block containging a number of fsObjects */ ++ ++struct fsObjectContainer { ++ struct fsBlockHeader bheader; ++ ++ u32 parent; ++ u32 next; ++ u32 previous; /* 0 for the first block in the directory chain */ ++ ++ struct fsObject object[0]; ++}; ++ ++/* BTree structures, used to collect file data position on disk */ ++ ++struct fsExtentBNode { ++ u32 key; /* data! */ ++ u32 next; ++ u32 prev; ++ u16 blocks; /* The size in blocks of the region this Extent controls */ ++}; ++ ++struct BNode { ++ u32 key; ++ u32 data; ++}; ++ ++struct BTreeContainer { ++ u16 nodecount; ++ u8 isleaf; ++ u8 nodesize; /* Must be a multiple of 2 */ ++ ++ struct BNode bnode[0]; ++}; ++ ++/* On disk block with BTreeContainer */ ++ ++struct fsBNodeContainer { ++ struct fsBlockHeader bheader; ++ struct BTreeContainer btc; ++}; ++ ++/* On disk block with soft link data */ ++ ++struct fsSoftLink { ++ struct fsBlockHeader bheader; ++ u32 parent; ++ u32 next; ++ u32 previous; ++ u8 string[0]; ++}; ++ ++/* On disk block with hashtable data */ ++ ++struct fsHashTable { ++ struct fsBlockHeader bheader; ++ u32 parent; ++ u32 hashentry[0]; ++}; ++ ++/* On disk block with node index and some helper structures */ ++ ++struct fsNodeContainer { ++ struct fsBlockHeader bheader; ++ u32 nodenumber; ++ u32 nodes; ++ u32 node[0]; ++}; ++ ++struct fsNode { ++ u32 data; ++}; ++ ++struct fsObjectNode { ++ struct fsNode node; ++ u32 next; ++ u16 hash16; ++} __attribute__ ((packed)); ++ ++/* Some adminspace and bitmap block structures */ ++ ++struct fsAdminSpace { ++ u32 space; ++ u32 bits; ++/* Set bits are used blocks, bit 31 is the first block in the AdminSpace. */ ++}; ++ ++struct fsAdminSpaceContainer { ++ struct fsBlockHeader bheader; ++ ++ u32 next; ++ u32 previous; ++ ++ u8 bits; ++ u8 pad1; ++ u16 pad2; ++ ++ struct fsAdminSpace adminspace[0]; ++}; ++ ++struct fsBitmap { ++ struct fsBlockHeader bheader; ++ ++ u32 bitmap[0]; ++ ++/* Bits are 1 if the block is free, and 0 if full. ++ Bitmap must consist of an integral number of longwords. */ ++}; ++ ++/* The fsRootInfo structure has all kinds of information about the format ++ of the disk. */ ++ ++struct fsRootInfo { ++ u32 deletedblocks; /* Amount in blocks which deleted files consume. */ ++ u32 deletedfiles; /* Number of deleted files in recycled. */ ++ u32 freeblocks; /* Cached number of free blocks on disk. */ ++ ++ u32 datecreated; ++ ++ u32 lastallocatedblock; /* Block which was most recently allocated */ ++ u32 lastallocatedadminspace; /* AdminSpaceContainer which most recently was used to allocate a block */ ++ u32 lastallocatedextentnode; /* ExtentNode which was most recently created */ ++ u32 lastallocatedobjectnode; /* ObjectNode which was most recently created */ ++ ++ u32 rovingpointer; ++}; ++ ++#endif --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/ia64-generic-no-smp-1-to-2.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/ia64-generic-no-smp-1-to-2.dpatch @@ -0,0 +1,210 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: fix CONFIG_IA64_GENERIC compilation for UP (rev 2) +## DP: Patch author: Jesse Barnes +## DP: Upstream status: submitted + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN kernel-source-2.6.8.defconfig/arch/ia64/kernel/acpi.c kernel-source-2.6.8.newupfix.defconfig/arch/ia64/kernel/acpi.c +--- kernel-source-2.6.8.defconfig/arch/ia64/kernel/acpi.c 2004-08-13 23:36:58.000000000 -0600 ++++ kernel-source-2.6.8.newupfix.defconfig/arch/ia64/kernel/acpi.c 2004-08-15 15:49:38.000000000 -0600 +@@ -618,9 +618,11 @@ + if (smp_boot_data.cpu_phys_id[cpu] != hard_smp_processor_id()) + node_cpuid[i++].phys_id = smp_boot_data.cpu_phys_id[cpu]; + } +- build_cpu_to_node_map(); + # endif + #endif ++#ifdef CONFIG_ACPI_NUMA ++ build_cpu_to_node_map(); ++#endif + /* Make boot-up look pretty */ + printk(KERN_INFO "%d CPUs available, %d CPUs total\n", available_cpus, total_cpus); + return 0; +diff -urN kernel-source-2.6.8.defconfig/arch/ia64/kernel/cyclone.c kernel-source-2.6.8.newupfix.defconfig/arch/ia64/kernel/cyclone.c +--- kernel-source-2.6.8.defconfig/arch/ia64/kernel/cyclone.c 2004-08-14 13:07:37.000000000 -0600 ++++ kernel-source-2.6.8.newupfix.defconfig/arch/ia64/kernel/cyclone.c 2004-08-15 15:49:31.000000000 -0600 +@@ -1,8 +1,6 @@ +-#include + #include + #include + #include +-#include + + /* IBM Summit (EXA) Cyclone counter code*/ + #define CYCLONE_CBAR_ADDR 0xFEB00CD0 +diff -urN kernel-source-2.6.8.defconfig/arch/ia64/kernel/numa.c kernel-source-2.6.8.newupfix.defconfig/arch/ia64/kernel/numa.c +--- kernel-source-2.6.8.defconfig/arch/ia64/kernel/numa.c 2004-08-14 13:07:37.000000000 -0600 ++++ kernel-source-2.6.8.newupfix.defconfig/arch/ia64/kernel/numa.c 2004-08-15 15:49:38.000000000 -0600 +@@ -1,46 +1,57 @@ ++/* ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ * ++ * ia64 kernel NUMA specific stuff ++ * ++ * Copyright (C) 2002 Erich Focht ++ * Copyright (C) 2004 Silicon Graphics, Inc. ++ * Jesse Barnes ++ */ + #include + #include + #include + #include + #include + +-#ifdef CONFIG_NUMA +- +-/* on which node is each logical CPU (one cacheline even for 64 CPUs) */ + u8 cpu_to_node_map[NR_CPUS] __cacheline_aligned; + EXPORT_SYMBOL(cpu_to_node_map); +-/* which logical CPUs are on which nodes */ ++ + cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned; + +-/* +- * Build cpu to node mapping and initialize the per node cpu masks. ++/** ++ * build_cpu_to_node_map - setup cpu to node and node to cpumask arrays ++ * ++ * Build cpu to node mapping and initialize the per node cpu masks using ++ * info from the node_cpuid array handed to us by ACPI. + */ +-void __init +-build_cpu_to_node_map (void) ++void __init build_cpu_to_node_map(void) + { + int cpu, i, node; + +- for(node=0; node= 0) ? node : 0; + if (node >= 0) + cpu_set(cpu, node_to_cpu_mask[node]); + } + } +- +-#endif /* CONFIG_NUMA */ +diff -urN kernel-source-2.6.8.defconfig/arch/ia64/kernel/setup.c kernel-source-2.6.8.newupfix.defconfig/arch/ia64/kernel/setup.c +--- kernel-source-2.6.8.defconfig/arch/ia64/kernel/setup.c 2004-08-13 23:36:17.000000000 -0600 ++++ kernel-source-2.6.8.newupfix.defconfig/arch/ia64/kernel/setup.c 2004-08-15 15:49:38.000000000 -0600 +@@ -317,11 +317,9 @@ + machvec_init(acpi_get_sysname()); + #endif + +-#ifdef CONFIG_SMP + /* If we register an early console, allow CPU 0 to printk */ + if (!early_console_setup()) + cpu_set(smp_processor_id(), cpu_online_map); +-#endif + + #ifdef CONFIG_ACPI_BOOT + /* Initialize the ACPI boot-time table parser */ +diff -urN kernel-source-2.6.8.defconfig/arch/ia64/mm/discontig.c kernel-source-2.6.8.newupfix.defconfig/arch/ia64/mm/discontig.c +--- kernel-source-2.6.8.defconfig/arch/ia64/mm/discontig.c 2004-08-14 13:07:37.000000000 -0600 ++++ kernel-source-2.6.8.newupfix.defconfig/arch/ia64/mm/discontig.c 2004-08-15 15:49:38.000000000 -0600 +@@ -398,8 +398,8 @@ + */ + static void __init initialize_pernode_data(void) + { +- int cpu, node; + pg_data_t *pgdat_list[NR_NODES]; ++ int cpu, node; + + for (node = 0; node < numnodes; node++) + pgdat_list[node] = mem_data[node].pgdat; +@@ -409,12 +409,22 @@ + memcpy(mem_data[node].node_data->pg_data_ptrs, pgdat_list, + sizeof(pgdat_list)); + } +- ++#ifdef CONFIG_SMP + /* Set the node_data pointer for each per-cpu struct */ + for (cpu = 0; cpu < NR_CPUS; cpu++) { + node = node_cpuid[cpu].nid; + per_cpu(cpu_info, cpu).node_data = mem_data[node].node_data; + } ++#else ++ { ++ struct cpuinfo_ia64 *cpu0_cpu_info; ++ cpu = 0; ++ node = node_cpuid[cpu].nid; ++ cpu0_cpu_info = (struct cpuinfo_ia64 *)(__phys_per_cpu_start + ++ ((char *)&per_cpu__cpu_info - __per_cpu_start)); ++ cpu0_cpu_info->node_data = mem_data[node].node_data; ++ } ++#endif /* CONFIG_SMP */ + } + + /** +@@ -489,12 +499,11 @@ + { + int cpu; + +- if (smp_processor_id() == 0) { +- for (cpu = 0; cpu < NR_CPUS; cpu++) { +- per_cpu(local_per_cpu_offset, cpu) = +- __per_cpu_offset[cpu]; +- } +- } ++ if (smp_processor_id() != 0) ++ return __per_cpu_start + __per_cpu_offset[smp_processor_id()]; ++ ++ for (cpu = 0; cpu < NR_CPUS; cpu++) ++ per_cpu(local_per_cpu_offset, cpu) = __per_cpu_offset[cpu]; + + return __per_cpu_start + __per_cpu_offset[smp_processor_id()]; + } +diff -urN kernel-source-2.6.8.defconfig/drivers/serial/sn_console.c kernel-source-2.6.8.newupfix.defconfig/drivers/serial/sn_console.c +--- kernel-source-2.6.8.defconfig/drivers/serial/sn_console.c 2004-08-14 13:07:37.000000000 -0600 ++++ kernel-source-2.6.8.newupfix.defconfig/drivers/serial/sn_console.c 2004-08-15 15:49:31.000000000 -0600 +@@ -50,7 +50,6 @@ + #include + #include + +-#include + #include + #include + #include +@@ -1086,9 +1085,7 @@ + spin_unlock_irqrestore(&port->sc_port.lock, flags); + + puts_raw_fixed(port->sc_ops->sal_puts_raw, s, count); +-#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT) + } +-#endif + } + else { + /* Not yet registered with serial core - simple case */ --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/ia64-generic-no-smp.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/ia64-generic-no-smp.dpatch @@ -0,0 +1,265 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: fix CONFIG_IA64_GENERIC compilation for UP +## DP: Patch author: Jesse Barnes +## DP: Upstream status: submitted + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -Nru a/arch/ia64/kernel/Makefile b/arch/ia64/kernel/Makefile +--- a/arch/ia64/kernel/Makefile 2004-08-12 18:28:06 -07:00 ++++ b/arch/ia64/kernel/Makefile 2004-08-12 18:28:06 -07:00 +@@ -15,6 +15,7 @@ + obj-$(CONFIG_IOSAPIC) += iosapic.o + obj-$(CONFIG_MODULES) += module.o + obj-$(CONFIG_SMP) += smp.o smpboot.o ++obj-$(CONFIG_NUMA) += numa.o + obj-$(CONFIG_PERFMON) += perfmon_default_smpl.o + obj-$(CONFIG_IA64_CYCLONE) += cyclone.o + +diff -Nru a/arch/ia64/kernel/cyclone.c b/arch/ia64/kernel/cyclone.c +--- a/arch/ia64/kernel/cyclone.c 2004-08-12 18:28:06 -07:00 ++++ b/arch/ia64/kernel/cyclone.c 2004-08-12 18:28:06 -07:00 +@@ -1,6 +1,8 @@ ++#include + #include + #include + #include ++#include + + /* IBM Summit (EXA) Cyclone counter code*/ + #define CYCLONE_CBAR_ADDR 0xFEB00CD0 +diff -Nru a/arch/ia64/kernel/numa.c b/arch/ia64/kernel/numa.c +--- /dev/null Wed Dec 31 16:00:00 196900 ++++ b/arch/ia64/kernel/numa.c 2004-08-12 18:28:06 -07:00 +@@ -0,0 +1,46 @@ ++#include ++#include ++#include ++#include ++#include ++ ++#ifdef CONFIG_NUMA ++ ++/* on which node is each logical CPU (one cacheline even for 64 CPUs) */ ++u8 cpu_to_node_map[NR_CPUS] __cacheline_aligned; ++EXPORT_SYMBOL(cpu_to_node_map); ++/* which logical CPUs are on which nodes */ ++cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned; ++ ++/* ++ * Build cpu to node mapping and initialize the per node cpu masks. ++ */ ++void __init ++build_cpu_to_node_map (void) ++{ ++ int cpu, i, node; ++ ++ for(node=0; node= 0) ? node : 0; ++ if (node >= 0) ++ cpu_set(cpu, node_to_cpu_mask[node]); ++ } ++} ++ ++#endif /* CONFIG_NUMA */ +diff -Nru a/arch/ia64/kernel/smpboot.c b/arch/ia64/kernel/smpboot.c +--- a/arch/ia64/kernel/smpboot.c 2004-08-12 18:28:06 -07:00 ++++ b/arch/ia64/kernel/smpboot.c 2004-08-12 18:28:06 -07:00 +@@ -491,47 +491,6 @@ + } + } + +-#ifdef CONFIG_NUMA +- +-/* on which node is each logical CPU (one cacheline even for 64 CPUs) */ +-u8 cpu_to_node_map[NR_CPUS] __cacheline_aligned; +-EXPORT_SYMBOL(cpu_to_node_map); +-/* which logical CPUs are on which nodes */ +-cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned; +- +-/* +- * Build cpu to node mapping and initialize the per node cpu masks. +- */ +-void __init +-build_cpu_to_node_map (void) +-{ +- int cpu, i, node; +- +- for(node=0; node= 0) ? node : 0; +- if (node >= 0) +- cpu_set(cpu, node_to_cpu_mask[node]); +- } +-} +- +-#endif /* CONFIG_NUMA */ +- + /* + * Cycle through the APs sending Wakeup IPIs to boot each. + */ +diff -Nru a/arch/ia64/mm/discontig.c b/arch/ia64/mm/discontig.c +--- a/arch/ia64/mm/discontig.c 2004-08-12 18:28:06 -07:00 ++++ b/arch/ia64/mm/discontig.c 2004-08-12 18:28:06 -07:00 +@@ -225,6 +225,33 @@ + } + + /** ++ * per_cpu_node_setup - setup per-cpu areas on each node ++ * @cpu_data: per-cpu area on this node ++ * @node: node to setup ++ * ++ * Copy the static per-cpu data into the region we just set aside and then ++ * setup __per_cpu_offset for each CPU on this node. Return a pointer to ++ * the end of the area. ++ */ ++static void *per_cpu_node_setup(void *cpu_data, int node) ++{ ++#ifdef CONFIG_SMP ++ int cpu; ++ ++ for (cpu = 0; cpu < NR_CPUS; cpu++) { ++ if (node == node_cpuid[cpu].nid) { ++ memcpy(__va(cpu_data), __phys_per_cpu_start, ++ __per_cpu_end - __per_cpu_start); ++ __per_cpu_offset[cpu] = (char*)__va(cpu_data) - ++ __per_cpu_start; ++ cpu_data += PERCPU_PAGE_SIZE; ++ } ++ } ++#endif ++ return cpu_data; ++} ++ ++/** + * find_pernode_space - allocate memory for memory map and per-node structures + * @start: physical start of range + * @len: length of range +@@ -255,7 +282,7 @@ + static int __init find_pernode_space(unsigned long start, unsigned long len, + int node) + { +- unsigned long epfn, cpu, cpus; ++ unsigned long epfn, cpus; + unsigned long pernodesize = 0, pernode, pages, mapsize; + void *cpu_data; + struct bootmem_data *bdp = &mem_data[node].bootmem_data; +@@ -305,20 +332,7 @@ + mem_data[node].pgdat->bdata = bdp; + pernode += L1_CACHE_ALIGN(sizeof(pg_data_t)); + +- /* +- * Copy the static per-cpu data into the region we +- * just set aside and then setup __per_cpu_offset +- * for each CPU on this node. +- */ +- for (cpu = 0; cpu < NR_CPUS; cpu++) { +- if (node == node_cpuid[cpu].nid) { +- memcpy(__va(cpu_data), __phys_per_cpu_start, +- __per_cpu_end - __per_cpu_start); +- __per_cpu_offset[cpu] = (char*)__va(cpu_data) - +- __per_cpu_start; +- cpu_data += PERCPU_PAGE_SIZE; +- } +- } ++ cpu_data = per_cpu_node_setup(cpu_data, node); + } + + return 0; +@@ -464,6 +478,7 @@ + find_initrd(); + } + ++#ifdef CONFIG_SMP + /** + * per_cpu_init - setup per-cpu variables + * +@@ -483,6 +498,7 @@ + + return __per_cpu_start + __per_cpu_offset[smp_processor_id()]; + } ++#endif /* CONFIG_SMP */ + + /** + * show_mem - give short summary of memory stats +diff -Nru a/drivers/serial/sn_console.c b/drivers/serial/sn_console.c +--- a/drivers/serial/sn_console.c 2004-08-12 18:28:06 -07:00 ++++ b/drivers/serial/sn_console.c 2004-08-12 18:28:06 -07:00 +@@ -50,6 +50,7 @@ + #include + #include + ++#include + #include + #include + #include +@@ -1085,7 +1086,9 @@ + spin_unlock_irqrestore(&port->sc_port.lock, flags); + + puts_raw_fixed(port->sc_ops->sal_puts_raw, s, count); ++#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT) + } ++#endif + } + else { + /* Not yet registered with serial core - simple case */ +diff -Nru a/include/asm-ia64/smp.h b/include/asm-ia64/smp.h +--- a/include/asm-ia64/smp.h 2004-08-12 18:28:06 -07:00 ++++ b/include/asm-ia64/smp.h 2004-08-12 18:28:06 -07:00 +@@ -126,6 +126,7 @@ + #else + + #define cpu_logical_id(cpuid) 0 ++#define cpu_physical_id(i) ((ia64_getreg(_IA64_REG_CR_LID) >> 16) & 0xffff) + + #endif /* CONFIG_SMP */ + #endif /* _ASM_IA64_SMP_H */ +diff -Nru a/include/asm-ia64/sn/sn_cpuid.h b/include/asm-ia64/sn/sn_cpuid.h +--- a/include/asm-ia64/sn/sn_cpuid.h 2004-08-12 18:28:06 -07:00 ++++ b/include/asm-ia64/sn/sn_cpuid.h 2004-08-12 18:28:06 -07:00 +@@ -83,10 +83,6 @@ + * + */ + +-#ifndef CONFIG_SMP +-#define cpu_physical_id(cpuid) ((ia64_getreg(_IA64_REG_CR_LID) >> 16) & 0xffff) +-#endif +- + /* + * macros for some of these exist in sn/addrs.h & sn/arch.h, etc. However, + * trying #include these files here causes circular dependencies. --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/ia64_cyclone_nosmp.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/ia64_cyclone_nosmp.dpatch @@ -0,0 +1,34 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: fix cyclone build on IA64 for UP +## DP: Patch author: Jesse Barnes +## DP: Upstream status: submitted + +. $(dirname $0)/DPATCH + +@DPATCH@ + +fix ia64 cyclone build errors + +Signed-off-by: Randy Dunlap + +diffstat:= + arch/ia64/kernel/cyclone.c | 3 +++ + 1 files changed, 3 insertions(+) + +diff -Naurp ./arch/ia64/kernel/cyclone.c~ia64_no_smp ./arch/ia64/kernel/cyclone.c +--- ./arch/ia64/kernel/cyclone.c~ia64_no_smp Mon Aug 16 14:13:52 2004 ++++ ./arch/ia64/kernel/cyclone.c Mon Aug 16 14:06:26 2004 +@@ -1,7 +1,10 @@ ++#include + #include + #include + #include + ++#include ++ + /* IBM Summit (EXA) Cyclone counter code*/ + #define CYCLONE_CBAR_ADDR 0xFEB00CD0 + #define CYCLONE_PMCC_OFFSET 0x51A0 --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/ieee80211-1.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/ieee80211-1.dpatch @@ -0,0 +1,1099 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Updated IEEE80211 layer from ipw2200. +## DP: Patch author: Intel Corporation +## DP: Upstream status: unknown + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN x/drivers/net/wireless/ieee80211/ieee80211.h y/drivers/net/wireless/ieee80211/ieee80211.h +--- x/drivers/net/wireless/ieee80211/ieee80211.h 2004-09-07 21:12:41.000000000 +1000 ++++ y/drivers/net/wireless/ieee80211/ieee80211.h 2004-09-04 03:47:53.000000000 +1000 +@@ -1,6 +1,9 @@ + /* +- * Original code based on Host AP (software wireless LAN access point) driver +- * for Intersil Prism2/2.5/3. ++ * Merged with mainline ieee80211.h in Aug 2004. Original ieee802_11 ++ * remains copyright by the original authors ++ * ++ * Portions of the merged code are based on Host AP (software wireless ++ * LAN access point) driver for Intersil Prism2/2.5/3. + * + * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen + * +@@ -8,7 +11,6 @@ + * + * Adaption to a generic IEEE 802.11 stack by James Ketrenos + * +- * + * Copyright (c) 2004, Intel Corporation + * + * This program is free software; you can redistribute it and/or modify +@@ -18,9 +20,139 @@ + */ + #ifndef IEEE80211_H + #define IEEE80211_H ++#include /* ETH_ALEN */ ++ ++#define IEEE80211_DATA_LEN 2304 ++/* Maximum size for the MA-UNITDATA primitive, 802.11 standard section ++ 6.2.1.1.2. ++ ++ The figure in section 7.1.2 suggests a body size of up to 2312 ++ bytes is allowed, which is a bit confusing, I suspect this ++ represents the 2304 bytes of real data, plus a possible 8 bytes of ++ WEP IV and ICV. (this interpretation suggested by Ramiro Barreiro) */ ++ ++ ++#define IEEE80211_HLEN 30 ++#define IEEE80211_FRAME_LEN (IEEE80211_DATA_LEN + IEEE80211_HLEN) ++ ++struct ieee80211_hdr { ++ u16 frame_ctl; ++ u16 duration_id; ++ u8 addr1[ETH_ALEN]; ++ u8 addr2[ETH_ALEN]; ++ u8 addr3[ETH_ALEN]; ++ u16 seq_ctl; ++ u8 addr4[ETH_ALEN]; ++} __attribute__ ((packed)); ++ ++/* Frame control field constants */ ++#define IEEE80211_FCTL_VERS 0x0002 ++#define IEEE80211_FCTL_FTYPE 0x000c ++#define IEEE80211_FCTL_STYPE 0x00f0 ++#define IEEE80211_FCTL_TODS 0x0100 ++#define IEEE80211_FCTL_FROMDS 0x0200 ++#define IEEE80211_FCTL_MOREFRAGS 0x0400 ++#define IEEE80211_FCTL_RETRY 0x0800 ++#define IEEE80211_FCTL_PM 0x1000 ++#define IEEE80211_FCTL_MOREDATA 0x2000 ++#define IEEE80211_FCTL_WEP 0x4000 ++#define IEEE80211_FCTL_ORDER 0x8000 ++ ++#define IEEE80211_FTYPE_MGMT 0x0000 ++#define IEEE80211_FTYPE_CTL 0x0004 ++#define IEEE80211_FTYPE_DATA 0x0008 ++ ++/* management */ ++#define IEEE80211_STYPE_ASSOC_REQ 0x0000 ++#define IEEE80211_STYPE_ASSOC_RESP 0x0010 ++#define IEEE80211_STYPE_REASSOC_REQ 0x0020 ++#define IEEE80211_STYPE_REASSOC_RESP 0x0030 ++#define IEEE80211_STYPE_PROBE_REQ 0x0040 ++#define IEEE80211_STYPE_PROBE_RESP 0x0050 ++#define IEEE80211_STYPE_BEACON 0x0080 ++#define IEEE80211_STYPE_ATIM 0x0090 ++#define IEEE80211_STYPE_DISASSOC 0x00A0 ++#define IEEE80211_STYPE_AUTH 0x00B0 ++#define IEEE80211_STYPE_DEAUTH 0x00C0 ++ ++/* control */ ++#define IEEE80211_STYPE_PSPOLL 0x00A0 ++#define IEEE80211_STYPE_RTS 0x00B0 ++#define IEEE80211_STYPE_CTS 0x00C0 ++#define IEEE80211_STYPE_ACK 0x00D0 ++#define IEEE80211_STYPE_CFEND 0x00E0 ++#define IEEE80211_STYPE_CFENDACK 0x00F0 ++ ++/* data */ ++#define IEEE80211_STYPE_DATA 0x0000 ++#define IEEE80211_STYPE_DATA_CFACK 0x0010 ++#define IEEE80211_STYPE_DATA_CFPOLL 0x0020 ++#define IEEE80211_STYPE_DATA_CFACKPOLL 0x0030 ++#define IEEE80211_STYPE_NULLFUNC 0x0040 ++#define IEEE80211_STYPE_CFACK 0x0050 ++#define IEEE80211_STYPE_CFPOLL 0x0060 ++#define IEEE80211_STYPE_CFACKPOLL 0x0070 ++ ++#define IEEE80211_SCTL_FRAG 0x000F ++#define IEEE80211_SCTL_SEQ 0xFFF0 ++ ++ ++/* debug macros */ ++ ++#ifdef CONFIG_IEEE80211_DEBUG ++extern u32 ieee80211_debug_level; ++#define IEEE80211_DEBUG(level, fmt, args...) \ ++do { if (ieee80211_debug_level & (level)) \ ++ printk(KERN_DEBUG "ieee80211: %c %s " fmt, \ ++ in_interrupt() ? 'I' : 'U', __FUNCTION__, ## args); } while (0) ++#else ++#define IEEE80211_DEBUG(level, fmt, args...) do {} while (0); ++#endif /* CONFIG_IEEE80211_DEBUG */ ++ ++/* ++ * To use the debug system; ++ * ++ * If you are defining a new debug classification, simply add it to the #define ++ * list here in the form of: ++ * ++ * #define IEEE80211_DL_xxxx VALUE ++ * ++ * shifting value to the left one bit from the previous entry. xxxx should be ++ * the name of the classification (for example, WEP) ++ * ++ * You then need to either add a IEEE80211_xxxx_DEBUG() macro definition for your ++ * classification, or use IEEE80211_DEBUG(IEEE80211_DL_xxxx, ...) whenever you want ++ * to send output to that classification. ++ * ++ * To add your debug level to the list of levels seen when you perform ++ * ++ * % cat /proc/net/ipw/debug_level ++ * ++ * you simply need to add your entry to the ipw_debug_levels array. ++ * ++ * If you do not see debug_level in /proc/net/ipw then you do not have ++ * CONFIG_IEEE80211_DEBUG defined in your kernel configuration ++ * ++ */ ++ ++#define IEEE80211_DL_INFO BIT(0) ++#define IEEE80211_DL_WX BIT(1) ++#define IEEE80211_DL_SCAN BIT(2) ++#define IEEE80211_DL_STATE BIT(3) ++#define IEEE80211_DL_MGMT BIT(4) ++ ++#define IEEE80211_ERROR(f, a...) printk(KERN_ERR "ieee80211: " f, ## a) ++#define IEEE80211_WARNING(f, a...) printk(KERN_WARNING "ieee80211: " f, ## a) ++#define IEEE80211_DEBUG_INFO(f, a...) IEEE80211_DEBUG(IEEE80211_DL_INFO, f, ## a) ++ ++#define IEEE80211_DEBUG_WX(f, a...) IEEE80211_DEBUG(IEEE80211_DL_WX, f, ## a) ++#define IEEE80211_DEBUG_SCAN(f, a...) IEEE80211_DEBUG(IEEE80211_DL_SCAN, f, ## a) ++#define IEEE80211_DEBUG_STATE(f, a...) IEEE80211_DEBUG(IEEE80211_DL_STATE, f, ## a) ++#define IEEE80211_DEBUG_MGMT(f, a...) IEEE80211_DEBUG(IEEE80211_DL_MGMT, f, ## a) + + #include + #include ++#include /* ARPHRD_ETHER */ + + #ifndef WIRELESS_SPY + #define WIRELESS_SPY // enable iwspy support +@@ -45,8 +177,6 @@ + + /* IEEE 802.11 defines */ + +-#include "ieee802_11.h" +- + #define P80211_OUI_LEN 3 + + struct ieee80211_snap_hdr { +@@ -60,11 +190,11 @@ + + #define SNAP_SIZE sizeof(struct ieee80211_snap_hdr) + +-#define WLAN_FC_GET_TYPE(fc) ((fc) & IEEE802_11_FCTL_FTYPE) +-#define WLAN_FC_GET_STYPE(fc) ((fc) & IEEE802_11_FCTL_STYPE) ++#define WLAN_FC_GET_TYPE(fc) ((fc) & IEEE80211_FCTL_FTYPE) ++#define WLAN_FC_GET_STYPE(fc) ((fc) & IEEE80211_FCTL_STYPE) + +-#define WLAN_GET_SEQ_FRAG(seq) ((seq) & IEEE802_11_SCTL_FRAG) +-#define WLAN_GET_SEQ_SEQ(seq) ((seq) & IEEE802_11_SCTL_SEQ) ++#define WLAN_GET_SEQ_FRAG(seq) ((seq) & IEEE80211_SCTL_FRAG) ++#define WLAN_GET_SEQ_SEQ(seq) ((seq) & IEEE80211_SCTL_SEQ) + + /* Authentication algorithms */ + #define WLAN_AUTH_OPEN 0 +@@ -127,16 +257,6 @@ + #define IEEE80211_DATA_HDR4_LEN 30 + + +-struct ieee80211_hdr { +- u16 frame_control; +- u16 duration_id; +- u8 addr1[6]; +- u8 addr2[6]; +- u8 addr3[6]; +- u16 seq_ctrl; +- u8 addr4[6]; +-} __attribute__ ((packed)); +- + /* NOTE: This data is for statistical purposes; not all hardware provides this + * information for frames received. Not setting these will not cause + * any adverse affects. */ +@@ -239,7 +359,7 @@ + */ + + struct ieee80211_header_data { +- u16 frame_control; ++ u16 frame_ctl; + u16 duration_id; + u8 addr1[6]; + u8 addr2[6]; +@@ -345,17 +465,11 @@ + /* SWEEP TABLE ENTRIES NUMBER*/ + #define MAX_SWEEP_TAB_ENTRIES 42 + #define MAX_SWEEP_TAB_ENTRIES_PER_PACKET 7 +-#define MAX_RATES_LENGTH ((u8)8) ++#define MAX_RATES_LENGTH ((u8)12) + #define MAX_BEACON_COUNT 128 + + #define CRC_LENGTH 4U + +-#define SSID_11B_RATE_1MB 0x0001 +-#define SSID_11B_RATE_2MB 0x0002 +-#define SSID_11B_RATE_5MB 0x0004 +-#define SSID_11B_RATE_11MB 0x0008 +-#define SSID_11B_RATE_22MB 0x0010 +- + struct ieee80211_beacon { + u8 bssid[ETH_ALEN]; + u8 ssid_len; +@@ -373,6 +487,18 @@ + struct list_head list; + }; + ++enum ieee80211_state { ++ IEEE80211_UNINITIALIZED = 0, ++ IEEE80211_INITIALIZED, ++ IEEE80211_ASSOCIATING, ++ IEEE80211_ASSOCIATED, ++ IEEE80211_AUTHENTICATING, ++ IEEE80211_AUTHENTICATED, ++ IEEE80211_SHUTDOWN ++}; ++ ++#define DEFAULT_MAX_SCAN_AGE 5 ++#define DEFAULT_FTS 2342 + + struct ieee80211_device { + struct net_device *dev; +@@ -382,6 +508,13 @@ + struct ieee80211_stats ieee_stats; + void *priv; + ++ /* Probe / Beacon management */ ++ struct list_head beacon_free_list; ++ struct list_head beacon_list; ++ struct ieee80211_beacon *beacons; ++ int scans; ++ int scan_age; ++ + int iw_mode; /* operating mode (IW_MODE_*) */ + + spinlock_t lock; +@@ -423,6 +556,9 @@ + /* Callback vtable */ + struct ieee80211_helper_functions *func; + ++ enum ieee80211_state state; ++ ++ + }; + + +@@ -431,14 +567,14 @@ + int hdrlen = 24; + + switch (WLAN_FC_GET_TYPE(fc)) { +- case IEEE802_11_FTYPE_DATA: +- if ((fc & IEEE802_11_FCTL_FROMDS) && (fc & IEEE802_11_FCTL_TODS)) ++ case IEEE80211_FTYPE_DATA: ++ if ((fc & IEEE80211_FCTL_FROMDS) && (fc & IEEE80211_FCTL_TODS)) + hdrlen = 30; /* Addr4 */ + break; +- case IEEE802_11_FTYPE_CTL: ++ case IEEE80211_FTYPE_CTL: + switch (WLAN_FC_GET_STYPE(fc)) { +- case IEEE802_11_STYPE_CTS: +- case IEEE802_11_STYPE_ACK: ++ case IEEE80211_STYPE_CTS: ++ case IEEE80211_STYPE_ACK: + hdrlen = 10; + break; + default: +@@ -451,6 +587,8 @@ + return hdrlen; + } + ++ ++ + /* ieee80211.c */ + extern struct ieee80211_device * ieee80211_alloc(struct net_device *dev, + void *priv); +@@ -477,8 +615,14 @@ + /* ieee80211_rx.c */ + extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, + struct ieee80211_rx_stats *rx_stats); ++extern void ieee80211_rx_mgt(struct ieee80211_device *ieee, ++ struct ieee80211_hdr *header, ++ struct ieee80211_rx_stats *stats); + + /* iee80211_wx.c */ ++extern int ieee80211_wx_get_scan(struct ieee80211_device *ieee, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *key); + extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, + struct iw_request_info *info, + union iwreq_data *wrqu, char *key); +@@ -486,4 +630,14 @@ + struct iw_request_info *info, + union iwreq_data *wrqu, char *key); + ++ ++extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee) ++{ ++ ieee->scans++; ++} ++ ++extern inline int ieee80211_get_scans(struct ieee80211_device *ieee) ++{ ++ return ieee->scans; ++} + #endif /* IEEE80211_H */ +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_crypt_ccmp.c y/drivers/net/wireless/ieee80211/ieee80211_crypt_ccmp.c +--- x/drivers/net/wireless/ieee80211/ieee80211_crypt_ccmp.c 2004-09-07 21:12:41.000000000 +1000 ++++ y/drivers/net/wireless/ieee80211/ieee80211_crypt_ccmp.c 2004-09-04 03:47:53.000000000 +1000 +@@ -157,10 +157,10 @@ + int a4_included, qc_included; + u8 aad[2 * AES_BLOCK_LEN]; + +- fc = le16_to_cpu(hdr->frame_control); +- a4_included = ((fc & (IEEE802_11_FCTL_TODS | IEEE802_11_FCTL_FROMDS)) == +- (IEEE802_11_FCTL_TODS | IEEE802_11_FCTL_FROMDS)); +- qc_included = ((WLAN_FC_GET_TYPE(fc) == IEEE802_11_FTYPE_DATA) && ++ fc = le16_to_cpu(hdr->frame_ctl); ++ a4_included = ((fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) == ++ (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)); ++ qc_included = ((WLAN_FC_GET_TYPE(fc) == IEEE80211_FTYPE_DATA) && + (WLAN_FC_GET_STYPE(fc) & 0x08)); + aad_len = 22; + if (a4_included) +@@ -198,7 +198,7 @@ + aad[2] = pos[0] & 0x8f; + aad[3] = pos[1] & 0xc7; + memcpy(aad + 4, hdr->addr1, 3 * ETH_ALEN); +- pos = (u8 *) &hdr->seq_ctrl; ++ pos = (u8 *) &hdr->seq_ctl; + aad[22] = pos[0] & 0x0f; + aad[23] = 0; /* all bits masked */ + memset(aad + 24, 0, 8); +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_crypt_tkip.c y/drivers/net/wireless/ieee80211/ieee80211_crypt_tkip.c +--- x/drivers/net/wireless/ieee80211/ieee80211_crypt_tkip.c 2004-09-07 21:12:41.000000000 +1000 ++++ y/drivers/net/wireless/ieee80211/ieee80211_crypt_tkip.c 2004-09-04 03:47:53.000000000 +1000 +@@ -481,17 +481,17 @@ + struct ieee80211_hdr *hdr11; + + hdr11 = (struct ieee80211_hdr *) skb->data; +- switch (le16_to_cpu(hdr11->frame_control) & +- (IEEE802_11_FCTL_FROMDS | IEEE802_11_FCTL_TODS)) { +- case IEEE802_11_FCTL_TODS: ++ switch (le16_to_cpu(hdr11->frame_ctl) & ++ (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) { ++ case IEEE80211_FCTL_TODS: + memcpy(hdr, hdr11->addr3, ETH_ALEN); /* DA */ + memcpy(hdr + ETH_ALEN, hdr11->addr2, ETH_ALEN); /* SA */ + break; +- case IEEE802_11_FCTL_FROMDS: ++ case IEEE80211_FCTL_FROMDS: + memcpy(hdr, hdr11->addr1, ETH_ALEN); /* DA */ + memcpy(hdr + ETH_ALEN, hdr11->addr3, ETH_ALEN); /* SA */ + break; +- case IEEE802_11_FCTL_FROMDS | IEEE802_11_FCTL_TODS: ++ case IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS: + memcpy(hdr, hdr11->addr3, ETH_ALEN); /* DA */ + memcpy(hdr + ETH_ALEN, hdr11->addr4, ETH_ALEN); /* SA */ + break; +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_module.c y/drivers/net/wireless/ieee80211/ieee80211_module.c +--- x/drivers/net/wireless/ieee80211/ieee80211_module.c 2004-09-07 21:12:41.000000000 +1000 ++++ y/drivers/net/wireless/ieee80211/ieee80211_module.c 2004-09-04 03:47:53.000000000 +1000 +@@ -51,7 +51,6 @@ + #include + #include + +-#include "ieee802_11.h" + #include "ieee80211.h" + + #define MODULE_NAME "ieee80211" +@@ -60,20 +59,73 @@ + MODULE_AUTHOR("Copyright (C) 2004 Intel Corporation "); + MODULE_LICENSE("GPL"); + ++#ifdef CONFIG_IEEE80211_DEBUG ++u32 ieee80211_debug_level = 0; ++#endif ++ ++static inline int ieee80211_beacons_allocate(struct ieee80211_device *ieee) ++{ ++ if (ieee->beacons) ++ return 0; ++ ++ ieee->beacons = (struct ieee80211_beacon *)kmalloc( ++ MAX_BEACON_COUNT * sizeof(struct ieee80211_beacon), ++ GFP_KERNEL); ++ if (!ieee->beacons) { ++ printk(KERN_WARNING "%s: Out of memory allocating beacons\n", ++ ieee->dev->name); ++ return -ENOMEM; ++ } ++ ++ memset(ieee->beacons, 0, ++ MAX_BEACON_COUNT * sizeof(struct ieee80211_beacon)); ++ ++ return 0; ++} ++ ++static inline void ieee80211_beacons_free(struct ieee80211_device *ieee) ++{ ++ if (!ieee->beacons) ++ return; ++ kfree(ieee->beacons); ++ ieee->beacons = NULL; ++} ++ ++static inline void ieee80211_beacons_initialize(struct ieee80211_device *ieee) ++{ ++ int i; ++ ++ INIT_LIST_HEAD(&ieee->beacon_free_list); ++ INIT_LIST_HEAD(&ieee->beacon_list); ++ for (i = 0; i < MAX_BEACON_COUNT; i++) ++ list_add_tail(&ieee->beacons[i].list, &ieee->beacon_free_list); ++} ++ + struct ieee80211_device *ieee80211_alloc(struct net_device *dev, + void *priv) + { + struct ieee80211_device *ieee = kmalloc( + sizeof(struct ieee80211_device), GFP_KERNEL); ++ int err; + if (ieee == NULL) + return NULL; + memset(ieee, 0, sizeof(*ieee)); + ieee->dev = dev; + ieee->priv = priv; + ++ err = ieee80211_beacons_allocate(ieee); ++ if (err) { ++ IEEE80211_ERROR("Unable to allocate beacon storage\n"); ++ goto error; ++ } ++ ieee80211_beacons_initialize(ieee); ++ ++ /* Default fragmentation threshold is maximum payload size */ ++ ieee->fts = DEFAULT_FTS; ++ ieee->scan_age = DEFAULT_MAX_SCAN_AGE; + ieee->open_wep = 1; + +-#ifndef CONFIG_IEEE80211_NOWEP ++#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) + /* Default to enabling full open WEP with host based encrypt/decrypt */ + ieee->host_encrypt = 1; + ieee->host_decrypt = 1; +@@ -84,17 +136,19 @@ + ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler; + #endif + +- /* Default fragmentation threshold is maximum payload size */ +- ieee->fts = 2342; +- + spin_lock_init(&ieee->lock); + + return ieee; ++ ++ error: ++ if (ieee) ++ kfree(ieee); ++ return NULL; + } + + void ieee80211_free(struct ieee80211_device *ieee) + { +-#ifndef CONFIG_IEEE80211_NOWEP ++#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) + int i; + + del_timer_sync(&ieee->crypt_deinit_timer); +@@ -110,6 +164,7 @@ + } + } + #endif ++ ieee80211_beacons_free(ieee); + kfree(ieee); + } + +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_rx.c y/drivers/net/wireless/ieee80211/ieee80211_rx.c +--- x/drivers/net/wireless/ieee80211/ieee80211_rx.c 2004-09-07 21:12:41.000000000 +1000 ++++ y/drivers/net/wireless/ieee80211/ieee80211_rx.c 2004-09-04 03:47:53.000000000 +1000 +@@ -42,7 +42,7 @@ + struct ieee80211_rx_stats *rx_stats) + { + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; +- u16 fc = le16_to_cpu(hdr->frame_control); ++ u16 fc = le16_to_cpu(hdr->frame_ctl); + + skb->dev = ieee->dev; + skb->mac.raw = skb->data; +@@ -93,7 +93,7 @@ + unsigned int frag, seq; + struct ieee80211_frag_entry *entry; + +- sc = le16_to_cpu(hdr->seq_ctrl); ++ sc = le16_to_cpu(hdr->seq_ctl); + frag = WLAN_GET_SEQ_FRAG(sc); + seq = WLAN_GET_SEQ_SEQ(sc); + +@@ -144,7 +144,7 @@ + unsigned int seq; + struct ieee80211_frag_entry *entry; + +- sc = le16_to_cpu(hdr->seq_ctrl); ++ sc = le16_to_cpu(hdr->seq_ctl); + seq = WLAN_GET_SEQ_SEQ(sc); + + entry = ieee80211_frag_cache_find(ieee, seq, -1, hdr->addr2, +@@ -243,16 +243,16 @@ + return 0; + + hdr = (struct ieee80211_hdr *) skb->data; +- fc = le16_to_cpu(hdr->frame_control); ++ fc = le16_to_cpu(hdr->frame_ctl); + + /* check that the frame is unicast frame to us */ +- if ((fc & (IEEE802_11_FCTL_TODS | IEEE802_11_FCTL_FROMDS)) == +- IEEE802_11_FCTL_TODS && ++ if ((fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) == ++ IEEE80211_FCTL_TODS && + memcmp(hdr->addr1, dev->dev_addr, ETH_ALEN) == 0 && + memcmp(hdr->addr3, dev->dev_addr, ETH_ALEN) == 0) { + /* ToDS frame with own addr BSSID and DA */ +- } else if ((fc & (IEEE802_11_FCTL_TODS | IEEE802_11_FCTL_FROMDS)) == +- IEEE802_11_FCTL_FROMDS && ++ } else if ((fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) == ++ IEEE80211_FCTL_FROMDS && + memcmp(hdr->addr1, dev->dev_addr, ETH_ALEN) == 0) { + /* FromDS frame with own addr as DA */ + } else +@@ -282,7 +282,7 @@ + return 0; + + hdr = (struct ieee80211_hdr *) skb->data; +- hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_control)); ++ hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + + #ifdef NOT_YET + if (ieee->tkip_countermeasures && +@@ -326,7 +326,7 @@ + return 0; + + hdr = (struct ieee80211_hdr *) skb->data; +- hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_control)); ++ hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + + atomic_inc(&crypt->refcnt); + res = crypt->ops->decrypt_msdu(skb, keyidx, hdrlen, crypt->priv); +@@ -381,10 +381,10 @@ + goto rx_dropped; + } + +- fc = le16_to_cpu(hdr->frame_control); ++ fc = le16_to_cpu(hdr->frame_ctl); + type = WLAN_FC_GET_TYPE(fc); + stype = WLAN_FC_GET_STYPE(fc); +- sc = le16_to_cpu(hdr->seq_ctrl); ++ sc = le16_to_cpu(hdr->seq_ctl); + frag = WLAN_GET_SEQ_FRAG(sc); + hdrlen = ieee80211_get_hdrlen(fc); + +@@ -443,7 +443,7 @@ + crypt->ops->decrypt_mpdu == NULL)) + crypt = NULL; + +- if (!crypt && (fc & IEEE802_11_FCTL_WEP)) { ++ if (!crypt && (fc & IEEE80211_FCTL_WEP)) { + #if 0 + /* This seems to be triggered by some (multicast?) + * frames from other than current BSS, so just drop the +@@ -462,7 +462,7 @@ + #ifdef NOT_YET + if (type != WLAN_FC_TYPE_DATA) { + if (type == WLAN_FC_TYPE_MGMT && stype == WLAN_FC_STYPE_AUTH && +- fc & IEEE802_11_FCTL_WEP && ieee->host_decrypt && ++ fc & IEEE80211_FCTL_WEP && ieee->host_decrypt && + (keyidx = hostap_rx_frame_decrypt(ieee, skb, crypt)) < 0) + { + printk(KERN_DEBUG "%s: failed to decrypt mgmt::auth " +@@ -484,16 +484,16 @@ + if (skb->len < IEEE80211_DATA_HDR3_LEN) + goto rx_dropped; + +- switch (fc & (IEEE802_11_FCTL_FROMDS | IEEE802_11_FCTL_TODS)) { +- case IEEE802_11_FCTL_FROMDS: ++ switch (fc & (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) { ++ case IEEE80211_FCTL_FROMDS: + memcpy(dst, hdr->addr1, ETH_ALEN); + memcpy(src, hdr->addr3, ETH_ALEN); + break; +- case IEEE802_11_FCTL_TODS: ++ case IEEE80211_FCTL_TODS: + memcpy(dst, hdr->addr3, ETH_ALEN); + memcpy(src, hdr->addr2, ETH_ALEN); + break; +- case IEEE802_11_FCTL_FROMDS | IEEE802_11_FCTL_TODS: ++ case IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS: + if (skb->len < IEEE80211_DATA_HDR4_LEN) + goto rx_dropped; + memcpy(dst, hdr->addr3, ETH_ALEN); +@@ -514,7 +514,7 @@ + } + + if (ieee->iw_mode == IW_MODE_MASTER && !wds && +- (fc & (IEEE802_11_FCTL_TODS | IEEE802_11_FCTL_FROMDS)) == IEEE802_11_FCTL_FROMDS && ++ (fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) == IEEE80211_FCTL_FROMDS && + ieee->stadev && + memcmp(hdr->addr2, ieee->assoc_ap_addr, ETH_ALEN) == 0) { + /* Frame from BSSID of the AP for which we are a client */ +@@ -548,11 +548,11 @@ + + /* Nullfunc frames may have PS-bit set, so they must be passed to + * hostap_handle_sta_rx() before being dropped here. */ +- if (stype != IEEE802_11_STYPE_DATA && +- stype != IEEE802_11_STYPE_DATA_CFACK && +- stype != IEEE802_11_STYPE_DATA_CFPOLL && +- stype != IEEE802_11_STYPE_DATA_CFACKPOLL) { +- if (stype != IEEE802_11_STYPE_NULLFUNC) ++ if (stype != IEEE80211_STYPE_DATA && ++ stype != IEEE80211_STYPE_DATA_CFACK && ++ stype != IEEE80211_STYPE_DATA_CFPOLL && ++ stype != IEEE80211_STYPE_DATA_CFACKPOLL) { ++ if (stype != IEEE80211_STYPE_NULLFUNC) + printk(KERN_DEBUG "%s: RX: dropped data frame " + "with no data (type=0x%02x, subtype=0x%02x, len=%d)\n", + dev->name, type, stype, skb->len); +@@ -562,7 +562,7 @@ + /* skb: hdr + (possibly fragmented, possibly encrypted) payload */ + + #ifndef CONFIG_IEEE80211_NOWEP +- if (ieee->host_decrypt && (fc & IEEE802_11_FCTL_WEP) && ++ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && + (keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0) + goto rx_dropped; + #endif +@@ -570,15 +570,15 @@ + + /* skb: hdr + (possibly fragmented) plaintext payload */ + // PR: FIXME: hostap has additional conditions in the "if" below: +- // ieee->host_decrypt && (fc & IEEE802_11_FCTL_WEP) && +- if ((frag != 0 || (fc & IEEE802_11_FCTL_MOREFRAGS))) { ++ // ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && ++ if ((frag != 0 || (fc & IEEE80211_FCTL_MOREFRAGS))) { + int flen; + struct sk_buff *frag_skb = ieee80211_frag_cache_get(ieee, hdr); + if (!frag_skb) { + printk(KERN_DEBUG "%s: Rx cannot get skb from " + "fragment cache (morefrag=%d seq=%u frag=%u)\n", + dev->name, +- (fc & IEEE802_11_FCTL_MOREFRAGS) != 0, ++ (fc & IEEE80211_FCTL_MOREFRAGS) != 0, + WLAN_GET_SEQ_SEQ(sc), frag); + goto rx_dropped; + } +@@ -608,7 +608,7 @@ + dev_kfree_skb_any(skb); + skb = NULL; + +- if (fc & IEEE802_11_FCTL_MOREFRAGS) { ++ if (fc & IEEE80211_FCTL_MOREFRAGS) { + /* more fragments expected - leave the skb in fragment + * cache for now; it will be delivered to upper layers + * after all fragments have been received */ +@@ -625,12 +625,12 @@ + /* skb: hdr + (possible reassembled) full MSDU payload; possibly still + * encrypted/authenticated */ + #ifndef CONFIG_IEEE80211_NOWEP +- if (ieee->host_decrypt && (fc & IEEE802_11_FCTL_WEP) && ++ if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && + ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt)) + goto rx_dropped; + + hdr = (struct ieee80211_hdr *) skb->data; +- if (crypt && !(fc & IEEE802_11_FCTL_WEP) && !ieee->open_wep) { ++ if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep) { + if (/*ieee->ieee_802_1x &&*/ + ieee80211_is_eapol_frame(ieee, skb)) { + /* pass unencrypted EAPOL frames even if encryption is +@@ -645,7 +645,7 @@ + } + } + +- if (/*ieee->drop_unencrypted*/ crypt && !(fc & IEEE802_11_FCTL_WEP) && !ieee->open_wep && ++ if (/*ieee->drop_unencrypted*/ crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep && + !ieee80211_is_eapol_frame(ieee, skb)) { + if (net_ratelimit()) { + printk(KERN_DEBUG "%s: dropped unencrypted RX data " +@@ -708,8 +708,8 @@ + } + + #ifdef NOT_YET +- if (wds && ((fc & (IEEE802_11_FCTL_TODS | IEEE802_11_FCTL_FROMDS)) == +- IEEE802_11_FCTL_TODS) && ++ if (wds && ((fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) == ++ IEEE80211_FCTL_TODS) && + skb->len >= ETH_HLEN + ETH_ALEN) { + /* Non-standard frame: get addr4 from its bogus location after + * the payload */ +@@ -777,4 +777,203 @@ + return 0; + } + ++ ++ ++static inline void ieee80211_beacon_add( ++ struct ieee80211_device *ieee, ++ struct ieee80211_probe_response *new_beacon, ++ struct ieee80211_rx_stats *stats) ++{ ++ struct list_head *element; ++ struct ieee80211_beacon *beacon; ++ struct ieee80211_info_element *info_element; ++ ++ element = ieee->beacon_free_list.next; ++ ++ beacon = list_entry(element, struct ieee80211_beacon, list); ++ ++ /* Pull out fixed field data */ ++ memcpy(beacon->bssid, new_beacon->header.addr3, ETH_ALEN); ++ beacon->capability = new_beacon->capability; ++ beacon->last_scanned = ieee->scans; ++ beacon->time_stamp[0] = new_beacon->time_stamp[0]; ++ beacon->time_stamp[1] = new_beacon->time_stamp[1]; ++ beacon->beacon_interval = new_beacon->beacon_interval; ++ beacon->listen_interval = 0x0A; /* Where to pull this? new_beacon->listen_interval;*/ ++/* ++ if ((ieee->long_preamble == 0) && ++ !(beacon->capability & WLAN_CAPABILITY_SHORT_PREAMBLE)) { ++ printk(KERN_INFO "%s: Beacon received from AP (" MACSTR ") " ++ "that has preable length conflict.\n", ++ ieee->ndev->name, MAC2STR(beacon->bssid)); ++ } ++*/ ++ /* First info element is the SSID */ ++ info_element = &new_beacon->info_element; ++ if (info_element->id != MFIE_TYPE_SSID) { ++ IEEE80211_DEBUG(IPW_DL_INFO | IPW_DL_SCAN, ++ "invalid MFIE type for SSID: %d\n", ++ info_element->id); ++ return; ++ } ++ beacon->ssid_len = min(info_element->len, (u8)IW_ESSID_MAX_SIZE); ++ memcpy(beacon->ssid, info_element->data, beacon->ssid_len); ++ if (beacon->ssid_len < IW_ESSID_MAX_SIZE) ++ memset(beacon->ssid + beacon->ssid_len, 0, ++ IW_ESSID_MAX_SIZE - beacon->ssid_len); ++ ++ /* Second info element is the RATES */ ++ info_element = (struct ieee80211_info_element *) ++ &info_element->data[info_element->len]; ++ if (info_element->id != MFIE_TYPE_RATES) { ++ IEEE80211_DEBUG(IPW_DL_INFO | IPW_DL_SCAN, ++ "invalid MFIE type for RATES: %d\n", ++ info_element->id); ++ return; ++ } ++ beacon->rates_len = min(info_element->len, MAX_RATES_LENGTH); ++ memcpy(beacon->rates, info_element->data, beacon->rates_len); ++ ++ /* Third info element is either FH or DS, based on BSS capability */ ++ info_element = (struct ieee80211_info_element *) ++ &info_element->data[info_element->len]; ++ if (beacon->capability & WLAN_CAPABILITY_BSS) { ++ /* BSS - Direct Sequence */ ++ if (info_element->id != MFIE_TYPE_DS_SET) { ++ IEEE80211_DEBUG( ++ IPW_DL_INFO | IPW_DL_SCAN, ++ ": invalid MFIE type for DIRECT SEQUENCE: " ++ "%d\n", ++ info_element->id); ++ return; ++ } ++ ++ beacon->channel = info_element->data[0]; ++ } else if (beacon->capability & WLAN_CAPABILITY_IBSS) { ++ /* IBSS - Frequency Hop */ ++#ifdef NOT_YET ++ if (info_element->id != MFIE_TYPE_FH_SET) { ++ IEEE80211_DEBUG(IPW_DL_INFO | IPW_DL_SCAN, ++ "invalid MFIE type for FREQ HOP: %d\n", ++ info_element->id); ++ return; ++ } ++#endif ++ } else { ++ /* Invalid ESS/IBSS capability! */ ++ IEEE80211_DEBUG(IPW_DL_INFO | IPW_DL_SCAN, ++ "invalid ESS/IBSS capability (both 0).\n"); ++ return; ++ } ++ ++ /* For now, we ignore the optional CF and IBSS parameter sets */ ++ ++ list_del(element); ++ ++ IEEE80211_DEBUG_SCAN("adding '%s' to beacon list.\n", beacon->ssid); ++ memcpy(&beacon->stats, stats, sizeof(beacon->stats)); ++ ++ list_add_tail(&beacon->list, &ieee->beacon_list); ++} ++ ++static inline void ieee80211_process_probe_response( ++ struct ieee80211_device *ieee, ++ struct ieee80211_probe_response *new_beacon, ++ struct ieee80211_rx_stats *stats) ++{ ++ struct ieee80211_info_element *ssid_info; ++ struct ieee80211_beacon *beacon; ++ u8 ssid_len; ++ ++ IEEE80211_DEBUG_SCAN( ++ "\n" ++ "Time Stamp 1 : %08X\n" ++ "Time Stamp 2 : %08X\n" ++ "Beacon Interval : %04X\n" ++ "Capabilities : %c%c%c%c-%c%c%c%c\n", ++ new_beacon->time_stamp[0], ++ new_beacon->time_stamp[1], ++ new_beacon->beacon_interval, ++ (new_beacon->capability & BIT(7)) ? '1' : '0', ++ (new_beacon->capability & BIT(6)) ? '1' : '0', ++ (new_beacon->capability & BIT(5)) ? '1' : '0', ++ (new_beacon->capability & BIT(4)) ? '1' : '0', ++ (new_beacon->capability & BIT(3)) ? '1' : '0', ++ (new_beacon->capability & BIT(2)) ? '1' : '0', ++ (new_beacon->capability & BIT(1)) ? '1' : '0', ++ (new_beacon->capability & BIT(0)) ? '1' : '0'); ++ ++ ssid_info = &new_beacon->info_element; ++ if (ssid_info->id != MFIE_TYPE_SSID) { ++ IEEE80211_DEBUG(IPW_DL_INFO | IPW_DL_SCAN, ++ "invalid MFIE type for SSID: %d\n", ++ ssid_info->id); ++ return; ++ } ++ ++ /* Search for this entry in the list and nuke it if it is ++ * already there */ ++ ssid_len = min(ssid_info->len, (u8)IW_ESSID_MAX_SIZE); ++ list_for_each_entry(beacon, &ieee->beacon_list, list) { ++ if (!memcmp(beacon->bssid, new_beacon->header.addr3, ++ ETH_ALEN)) { ++ list_del(&beacon->list); ++ list_add_tail(&beacon->list, &ieee->beacon_free_list); ++ break; ++ } ++ } ++ ++ if (list_empty(&ieee->beacon_free_list)) { ++ IEEE80211_DEBUG_INFO("TODO: Expire oldest beacon to add new.\n"); ++ IEEE80211_WARNING("%s: Beacon free list is empty.\n", ++ ieee->dev->name); ++ } else ++ ieee80211_beacon_add(ieee, new_beacon, stats); ++ ++ IEEE80211_DEBUG_SCAN("exit\n"); ++} ++ ++void ieee80211_rx_mgt(struct ieee80211_device *ieee, ++ struct ieee80211_hdr *header, ++ struct ieee80211_rx_stats *stats) ++{ ++ switch (WLAN_FC_GET_STYPE(header->frame_ctl)) { ++ case IEEE80211_STYPE_ASSOC_RESP: ++ IEEE80211_DEBUG_MGMT("received ASSOCIATION RESPONSE (%d)\n", ++ WLAN_FC_GET_STYPE(header->frame_ctl)); ++ break; ++ ++ case IEEE80211_STYPE_REASSOC_RESP: ++ IEEE80211_DEBUG_MGMT("received REASSOCIATION RESPONSE (%d)\n", ++ WLAN_FC_GET_STYPE(header->frame_ctl)); ++ break; ++ ++ case IEEE80211_STYPE_PROBE_RESP: ++ IEEE80211_DEBUG_MGMT("received PROBE RESPONSE (%d)\n", ++ WLAN_FC_GET_STYPE(header->frame_ctl)); ++ IEEE80211_DEBUG_SCAN("Probe response\n"); ++ ieee80211_process_probe_response( ++ ieee, (struct ieee80211_probe_response *)header, stats); ++ break; ++ ++ case IEEE80211_STYPE_BEACON: ++ IEEE80211_DEBUG_MGMT("received BEACON (%d)\n", ++ WLAN_FC_GET_STYPE(header->frame_ctl)); ++ IEEE80211_DEBUG_SCAN("Beacon\n"); ++ ieee80211_process_probe_response( ++ ieee, (struct ieee80211_probe_response *)header, stats); ++ break; ++ ++ default: ++ IEEE80211_DEBUG_MGMT("received UNKNOWN (%d)\n", ++ WLAN_FC_GET_STYPE(header->frame_ctl)); ++ IEEE80211_WARNING("%s: Unknown management packet: %d\n", ++ ieee->dev->name, ++ WLAN_FC_GET_STYPE(header->frame_ctl)); ++ break; ++ } ++} ++ ++ ++EXPORT_SYMBOL(ieee80211_rx_mgt); + EXPORT_SYMBOL(ieee80211_rx); +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_tx.c y/drivers/net/wireless/ieee80211/ieee80211_tx.c +--- x/drivers/net/wireless/ieee80211/ieee80211_tx.c 2004-09-07 21:12:41.000000000 +1000 ++++ y/drivers/net/wireless/ieee80211/ieee80211_tx.c 2004-09-04 03:47:53.000000000 +1000 +@@ -296,7 +296,7 @@ + if (last_payload_size) + nr_frags++; + else +- last_payload_size = size; ++ last_payload_size = payload_size; + + /* When we allocate the TXB we allocate enough space for the reserve + * and full fragment size (payload_size doesn't include prefix and +@@ -323,7 +323,7 @@ + printk(KERN_DEBUG "%s: TODO -- implement 802.11 " + "header construction...\n", ieee->dev->name); + +- fc = le16_to_cpu(header->frame_control); ++ fc = le16_to_cpu(header->frame_ctl); + hdr_len = ieee80211_get_hdrlen(fc); + } else + hdr_len = 0; +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_wx.c y/drivers/net/wireless/ieee80211/ieee80211_wx.c +--- x/drivers/net/wireless/ieee80211/ieee80211_wx.c 2004-09-07 21:12:41.000000000 +1000 ++++ y/drivers/net/wireless/ieee80211/ieee80211_wx.c 2004-09-04 03:47:53.000000000 +1000 +@@ -36,12 +36,116 @@ + + #include "ieee80211.h" + ++static inline char *ieee80211_translate_scan(char *start, char *stop, ++ struct ieee80211_beacon *beacon) ++{ ++ struct iw_event iwe; ++ int i; ++ ++ /* First entry *MUST* be the AP MAC address */ ++ iwe.cmd = SIOCGIWAP; ++ iwe.u.ap_addr.sa_family = ARPHRD_ETHER; ++ memcpy(iwe.u.ap_addr.sa_data, beacon->bssid, ETH_ALEN); ++ start = iwe_stream_add_event(start, stop, &iwe, IW_EV_ADDR_LEN); ++ ++ /* Remaining entries will be displayed in the order we provide them */ ++ ++ /* Add the ESSID */ ++ iwe.u.data.length = beacon->ssid_len; ++ if (iwe.u.data.length > 32) ++ iwe.u.data.length = 32; ++ iwe.cmd = SIOCGIWESSID; ++ iwe.u.data.flags = 1; ++ start = iwe_stream_add_point(start, stop, &iwe, beacon->ssid); ++ ++ /* Add mode */ ++ iwe.cmd = SIOCGIWMODE; ++ if (beacon->capability & ++ (WLAN_CAPABILITY_BSS | WLAN_CAPABILITY_IBSS)) { ++ if (beacon->capability & WLAN_CAPABILITY_BSS) ++ iwe.u.mode = IW_MODE_MASTER; ++ else ++ iwe.u.mode = IW_MODE_ADHOC; ++ ++ start = iwe_stream_add_event(start, stop, &iwe, ++ IW_EV_UINT_LEN); ++ } ++ ++ /* Add frequency */ ++ iwe.cmd = SIOCGIWFREQ; ++ iwe.u.freq.m = beacon->channel; ++ iwe.u.freq.e = 0; ++ start = iwe_stream_add_event(start, stop, &iwe, IW_EV_FREQ_LEN); ++ ++ /* Add rates */ ++ iwe.cmd = SIOCGIWRATE; ++ iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0; ++ for (i = 0; i < beacon->rates_len; i++) { ++ iwe.u.bitrate.value = (beacon->rates[i] & 0x7F) * 500000; ++ start = iwe_stream_add_event(start, stop, &iwe, ++ IW_EV_PARAM_LEN); ++ } ++ ++ /* Add quality statistics */ ++ /* TODO: Fix these values... */ ++ iwe.cmd = IWEVQUAL; ++ iwe.u.qual.qual = beacon->stats.rssi; ++ iwe.u.qual.level = beacon->stats.signal; ++ iwe.u.qual.noise = beacon->stats.noise; ++ iwe.u.qual.updated = 7; ++ ++ start = iwe_stream_add_event(start, stop, &iwe, IW_EV_QUAL_LEN); ++ ++ /* Add encryption capability */ ++ iwe.cmd = SIOCGIWENCODE; ++ if (beacon->capability & WLAN_CAPABILITY_PRIVACY) ++ iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY; ++ else ++ iwe.u.data.flags = IW_ENCODE_DISABLED; ++ iwe.u.data.length = 0; ++ start = iwe_stream_add_point(start, stop, &iwe, beacon->ssid); ++ ++ return start; ++} ++ ++int ieee80211_wx_get_scan(struct ieee80211_device *ieee, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *extra) ++{ ++ struct ieee80211_beacon *beacon; ++ unsigned long flags; ++ ++ char *ev = extra; ++ char *stop = ev + IW_SCAN_MAX_DATA; ++ int i = 0; ++ ++ IEEE80211_DEBUG_WX("Getting scan\n"); ++ ++ spin_lock_irqsave(&ieee->lock, flags); ++ ++ list_for_each_entry(beacon, &ieee->beacon_list, list) { ++ i++; ++ if (ieee->scan_age == 0 || ++ beacon->last_scanned + ieee->scan_age >= ieee->scans) ++ ev = ieee80211_translate_scan(ev, stop, beacon); ++ } ++ ++ spin_unlock_irqrestore(&ieee->lock, flags); ++ ++ wrqu->data.length = ev - extra; ++ wrqu->data.flags = 0; ++ ++ IEEE80211_DEBUG_WX("exit: %d beacons returned.\n", i); ++ ++ return 0; ++} ++ + int ieee80211_wx_set_encode(struct ieee80211_device *ieee, + struct iw_request_info *info, + union iwreq_data *wrqu, char *keybuf) + { + struct iw_point *erq = &(wrqu->encoding); +-#ifdef CONFIG_IEEE80211_NOWEP ++#if !defined(CONFIG_IEEE80211_CRYPT) && !defined(CONFIG_IEEE80211_CRYPT_MODULE) + if (erq->flags & IW_ENCODE_DISABLED) + return 0; + return -EOPNOTSUPP; +@@ -173,7 +277,7 @@ + union iwreq_data *wrqu, char *key) + { + struct iw_point *erq = &(wrqu->encoding); +-#ifdef CONFIG_IEEE80211_NOWEP ++#if !defined(CONFIG_IEEE80211_CRYPT) && !defined(CONFIG_IEEE80211_CRYPT_MODULE) + erq->length = 0; + erq->flags = IW_ENCODE_DISABLED; + return 0; +@@ -221,5 +325,6 @@ + #endif + } + ++EXPORT_SYMBOL(ieee80211_wx_get_scan); + EXPORT_SYMBOL(ieee80211_wx_set_encode); + EXPORT_SYMBOL(ieee80211_wx_get_encode); --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/ieee80211-2.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/ieee80211-2.dpatch @@ -0,0 +1,291 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Updated IEEE80211 layer from ipw2200 0.8. +## DP: Patch author: Intel Corporation +## DP: Upstream status: unknown + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN x/drivers/net/wireless/ieee80211/ieee80211.h y/drivers/net/wireless/ieee80211/ieee80211.h +--- x/drivers/net/wireless/ieee80211/ieee80211.h 2004-09-25 10:43:51.000000000 +1000 ++++ y/drivers/net/wireless/ieee80211/ieee80211.h 2004-09-27 19:45:23.000000000 +1000 +@@ -266,6 +266,8 @@ + u8 signal; + u8 noise; + u16 rate; /* in 100 kbps */ ++ u8 received_channel; ++ u8 control; + }; + + /* IEEE 802.11 requires that STA supports concurrent reception of at least +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_crypt.h y/drivers/net/wireless/ieee80211/ieee80211_crypt.h +--- x/drivers/net/wireless/ieee80211/ieee80211_crypt.h 2004-09-25 10:43:51.000000000 +1000 ++++ y/drivers/net/wireless/ieee80211/ieee80211_crypt.h 2004-09-27 19:46:55.000000000 +1000 +@@ -23,7 +23,7 @@ + #ifndef IEEE80211_CRYPT_H + #define IEEE80211_CRYPT_H + +-#ifndef CONFIG_IEEE80211_NOWEP ++#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) + #include + + struct ieee80211_crypto_ops { +@@ -91,6 +91,6 @@ + atomic_t refcnt; + }; + +-#endif /* CONFIG_IEEE80211_NOWEP */ ++#endif /* CONFIG_IEEE80211_CRYPT || CONFIG_IEEE80211_CRYPT_MODULE */ + + #endif +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_rx.c y/drivers/net/wireless/ieee80211/ieee80211_rx.c +--- x/drivers/net/wireless/ieee80211/ieee80211_rx.c 2004-09-25 10:43:51.000000000 +1000 ++++ y/drivers/net/wireless/ieee80211/ieee80211_rx.c 2004-09-27 19:45:23.000000000 +1000 +@@ -229,7 +229,7 @@ + { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 }; + /* No encapsulation header if EtherType < 0x600 (=length) */ + +-#ifndef CONFIG_IEEE80211_NOWEP ++#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) + /* Called by ieee80211_rx_frame_decrypt */ + static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee, + struct sk_buff *skb) +@@ -340,7 +340,7 @@ + + return 0; + } +-#endif /* CONFIG_IEEE80211_NOWEP */ ++#endif /* CONFIG_IEEE80211_CRYPT || CONFIG_IEEE80211_CRYPT_MODULE */ + + + /* All received frames are sent to this function. @skb contains the frame in +@@ -367,10 +367,10 @@ + #endif + u8 dst[ETH_ALEN]; + u8 src[ETH_ALEN]; +-#ifndef CONFIG_IEEE80211_NOWEP ++#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) + struct ieee80211_crypt_data *crypt = NULL; + int keyidx = 0; +-#endif /* CONFIG_IEEE80211_NOWEP */ ++#endif + + hdr = (struct ieee80211_hdr *)skb->data; + stats = &ieee->stats; +@@ -416,7 +416,7 @@ + } + #endif + +-#ifndef CONFIG_IEEE80211_NOWEP ++#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) + if (ieee->host_decrypt) { + int idx = 0; + if (skb->len >= hdrlen + 3) +@@ -457,7 +457,7 @@ + goto rx_dropped; + } + } +-#endif /* CONFIG_IEEE80211_NOWEP */ ++#endif /* CONFIG_IEEE80211_CRYPT || CONFIG_IEEE80211_CRYPT_MODULE */ + + #ifdef NOT_YET + if (type != WLAN_FC_TYPE_DATA) { +@@ -561,7 +561,7 @@ + + /* skb: hdr + (possibly fragmented, possibly encrypted) payload */ + +-#ifndef CONFIG_IEEE80211_NOWEP ++#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) + if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && + (keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0) + goto rx_dropped; +@@ -624,7 +624,7 @@ + + /* skb: hdr + (possible reassembled) full MSDU payload; possibly still + * encrypted/authenticated */ +-#ifndef CONFIG_IEEE80211_NOWEP ++#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) + if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && + ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt)) + goto rx_dropped; +@@ -654,7 +654,7 @@ + } + goto rx_dropped; + } +-#endif /* CONFIG_IEEE80211_NOWEP */ ++#endif /* CONFIG_IEEE80211_CRYPT || CONFIG_IEEE80211_CRYPT_MODULE */ + + /* skb: hdr + (possible reassembled) full plaintext payload */ + +@@ -812,8 +812,8 @@ + info_element = &new_beacon->info_element; + if (info_element->id != MFIE_TYPE_SSID) { + IEEE80211_DEBUG(IPW_DL_INFO | IPW_DL_SCAN, +- "invalid MFIE type for SSID: %d\n", +- info_element->id); ++ "invalid MFIE type for SSID: %d\n", ++ info_element->id); + return; + } + beacon->ssid_len = min(info_element->len, (u8)IW_ESSID_MAX_SIZE); +@@ -827,8 +827,8 @@ + &info_element->data[info_element->len]; + if (info_element->id != MFIE_TYPE_RATES) { + IEEE80211_DEBUG(IPW_DL_INFO | IPW_DL_SCAN, +- "invalid MFIE type for RATES: %d\n", +- info_element->id); ++ "invalid MFIE type for RATES: %d\n", ++ info_element->id); + return; + } + beacon->rates_len = min(info_element->len, MAX_RATES_LENGTH); +@@ -839,30 +839,35 @@ + &info_element->data[info_element->len]; + if (beacon->capability & WLAN_CAPABILITY_BSS) { + /* BSS - Direct Sequence */ +- if (info_element->id != MFIE_TYPE_DS_SET) { +- IEEE80211_DEBUG( +- IPW_DL_INFO | IPW_DL_SCAN, +- ": invalid MFIE type for DIRECT SEQUENCE: " +- "%d\n", +- info_element->id); +- return; +- } ++ if ( stats->control != 0 ) { ++ if (info_element->id != MFIE_TYPE_DS_SET) { ++ IEEE80211_DEBUG( ++ IPW_DL_INFO | IPW_DL_SCAN, ++ ": invalid MFIE type for DIRECT SEQUENCE: " ++ "%d\n", ++ info_element->id); ++ return; ++ } + +- beacon->channel = info_element->data[0]; ++ beacon->channel = info_element->data[0]; ++ } else { ++ /* for A band (No DS info) */ ++ beacon->channel = stats->received_channel; ++ } + } else if (beacon->capability & WLAN_CAPABILITY_IBSS) { + /* IBSS - Frequency Hop */ + #ifdef NOT_YET + if (info_element->id != MFIE_TYPE_FH_SET) { + IEEE80211_DEBUG(IPW_DL_INFO | IPW_DL_SCAN, +- "invalid MFIE type for FREQ HOP: %d\n", +- info_element->id); ++ "invalid MFIE type for FREQ HOP: %d\n", ++ info_element->id); + return; + } + #endif + } else { + /* Invalid ESS/IBSS capability! */ + IEEE80211_DEBUG(IPW_DL_INFO | IPW_DL_SCAN, +- "invalid ESS/IBSS capability (both 0).\n"); ++ "invalid ESS/IBSS capability (both 0).\n"); + return; + } + +@@ -892,6 +897,7 @@ + "Beacon Interval : %04X\n" + "Capabilities : %c%c%c%c-%c%c%c%c\n", + new_beacon->time_stamp[0], ++ + new_beacon->time_stamp[1], + new_beacon->beacon_interval, + (new_beacon->capability & BIT(7)) ? '1' : '0', +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_tx.c y/drivers/net/wireless/ieee80211/ieee80211_tx.c +--- x/drivers/net/wireless/ieee80211/ieee80211_tx.c 2004-09-25 10:43:51.000000000 +1000 ++++ y/drivers/net/wireless/ieee80211/ieee80211_tx.c 2004-09-27 19:45:23.000000000 +1000 +@@ -155,7 +155,7 @@ + return SNAP_SIZE + sizeof(u16); + } + +-#ifndef CONFIG_IEEE80211_NOWEP ++#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) + static inline int ieee80211_encrypt_fragment( + struct ieee80211_device *ieee, + struct sk_buff *frag, +@@ -255,7 +255,7 @@ + struct sk_buff *skb_frag; + struct ieee80211_hdr *header; + +-#ifndef CONFIG_IEEE80211_NOWEP ++#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) + struct ieee80211_crypt_data* crypt; + #endif + +@@ -269,13 +269,13 @@ + + ether_type = ntohs(((struct ethhdr *)skb->data)->h_proto); + +-#ifndef CONFIG_IEEE80211_NOWEP ++#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) + crypt = ieee->crypt[ieee->tx_keyidx]; + encrypt = (ieee->host_encrypt && ether_type != ETH_P_PAE && + crypt && crypt->ops); + #else + encrypt = 0; +-#endif /* CONFIG_IEEE80211_NOWEP */ ++#endif + + /* Advance the SKB to the start of the payload */ + skb_pull(skb, sizeof(struct ethhdr)); +@@ -287,9 +287,11 @@ + + /* Determine amount of data per fragment */ + payload_size = ieee->fts; ++#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) + if (encrypt) + payload_size -= crypt->ops->extra_prefix_len + + crypt->ops->extra_postfix_len; ++#endif + + nr_frags = size / payload_size; + last_payload_size = size % payload_size; +@@ -313,8 +315,10 @@ + for (i = 0; i < nr_frags; i++) { + skb_frag = txb->fragments[i]; + ++#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) + if (encrypt) + skb_reserve(skb_frag, crypt->ops->extra_prefix_len); ++#endif + + if (!ieee->tx_payload_only) { + header = (struct ieee80211_hdr *) +@@ -343,13 +347,15 @@ + /* Advance the SKB... */ + skb_pull(skb, size); + +-#ifndef CONFIG_IEEE80211_NOWEP ++#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) + /* Encryption routine will move the header forward in order + * to insert the IV between the header and the payload */ + if (encrypt) + ieee80211_encrypt_fragment(ieee, skb_frag, hdr_len); + #endif + } ++ stats->tx_packets++; ++ stats->tx_bytes += skb->len; + + /* We are now done with the SKB provided to us */ + dev_kfree_skb_any(skb); +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_wx.c y/drivers/net/wireless/ieee80211/ieee80211_wx.c +--- x/drivers/net/wireless/ieee80211/ieee80211_wx.c 2004-09-25 10:43:51.000000000 +1000 ++++ y/drivers/net/wireless/ieee80211/ieee80211_wx.c 2004-09-27 19:45:23.000000000 +1000 +@@ -89,8 +89,8 @@ + /* Add quality statistics */ + /* TODO: Fix these values... */ + iwe.cmd = IWEVQUAL; +- iwe.u.qual.qual = beacon->stats.rssi; +- iwe.u.qual.level = beacon->stats.signal; ++ iwe.u.qual.qual = beacon->stats.signal; ++ iwe.u.qual.level = beacon->stats.rssi; + iwe.u.qual.noise = beacon->stats.noise; + iwe.u.qual.updated = 7; + --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/ieee80211-3.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/ieee80211-3.dpatch @@ -0,0 +1,1620 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Updated IEEE80211 layer from ipw2200 0.10. +## DP: Patch author: Intel Corporation +## DP: Upstream status: unknown + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN x/drivers/net/wireless/Kconfig y/drivers/net/wireless/Kconfig +--- x/drivers/net/wireless/Kconfig 2004-09-30 20:53:28.000000000 +1000 ++++ y/drivers/net/wireless/Kconfig 2004-09-30 20:54:32.000000000 +1000 +@@ -138,22 +138,46 @@ + depends on NET_RADIO && (ISA || PCI || PPC_PMAC || PCMCIA) + + config IEEE80211 +- tristate ++ tristate "Generic IEEE 802.11 Networking Stack" + depends on NET_RADIO +- default n + + config IEEE80211_CRYPT +- tristate ++ tristate "IEEE 802.11 encryption" + depends on IEEE80211 + select CRYPTO + select CRYPTO_ARC4 + select CRC32 +- default n ++ ---help--- ++ Software implementation of IEEE 802.11 encryption. This module ++ adds WEP support, and the baseline capabilities required for WPA. + +-config IEEE80211_CRYPT_WEP +- tristate ++ This can be compiled as a modules and it will be called ++ "ieee80211_crypt.ko". ++ ++config IEEE80211_WPA ++ bool "IEEE 802.11 WPA" + depends on IEEE80211_CRYPT +- default n ++ ---help--- ++ Software implementation of IEEE 802.11 WPA. You will need ++ to select the WPA algorithms you wish to use. ++ ++config IEEE80211_CRYPT_CCMP ++ tristate "IEEE 802.11 CCMP encryption" ++ depends on IEEE80211_WPA && IEEE80211_CRYPT ++ ---help--- ++ Software implementation of IEEE 802.11 CCMP encryption. ++ ++ This can be compiled as a modules and it will be called ++ "ieee80211_crypt_ccmp.ko". ++ ++config IEEE80211_CRYPT_TKIP ++ tristate "IEEE 802.11 TKIP encryption" ++ depends on IEEE80211_WPA && IEEE80211_CRYPT ++ ---help--- ++ Software implementation of IEEE 802.11 TKIP encryption. ++ ++ This can be compiled as a modules and it will be called ++ "ieee80211_crypt_tkip.ko". + + config IPW2100 + tristate "Intel PRO/Wireless 2100 802.11b" +diff -urN x/drivers/net/wireless/ieee80211/Makefile y/drivers/net/wireless/ieee80211/Makefile +--- x/drivers/net/wireless/ieee80211/Makefile 2004-09-30 20:53:28.000000000 +1000 ++++ y/drivers/net/wireless/ieee80211/Makefile 2004-09-30 20:53:37.000000000 +1000 +@@ -6,9 +6,9 @@ + + obj-$(CONFIG_IEEE80211) += ieee80211.o + obj-$(CONFIG_IEEE80211_CRYPT) += ieee80211_crypt.o +-obj-$(CONFIG_IEEE80211_CRYPT_WEP) += ieee80211_crypt_wep.o +-obj-$(CONFIG_IEEE80211_CRYPT_WPA) += ieee80211_crypt_ccmp.o +-obj-$(CONFIG_IEEE80211_CRYPT_WPA) += ieee80211_crypt_tkip.o ++obj-$(CONFIG_IEEE80211_CRYPT) += ieee80211_crypt_wep.o ++obj-$(CONFIG_IEEE80211_CRYPT_CCMP) += ieee80211_crypt_ccmp.o ++obj-$(CONFIG_IEEE80211_CRYPT_TKIP) += ieee80211_crypt_tkip.o + + # We have to add drivers/net/wireless until ieee802_11.h is in the default + # include path +diff -urN x/drivers/net/wireless/ieee80211/ieee80211.h y/drivers/net/wireless/ieee80211/ieee80211.h +--- x/drivers/net/wireless/ieee80211/ieee80211.h 2004-09-30 20:53:28.000000000 +1000 ++++ y/drivers/net/wireless/ieee80211/ieee80211.h 2004-09-30 20:53:37.000000000 +1000 +@@ -257,6 +257,75 @@ + #define IEEE80211_DATA_HDR4_LEN 30 + + ++#define IEEE80211_STATMASK_SIGNAL BIT(0) ++#define IEEE80211_STATMASK_RSSI BIT(1) ++#define IEEE80211_STATMASK_NOISE BIT(2) ++#define IEEE80211_STATMASK_RATE BIT(3) ++#define IEEE80211_STATMASK_WEMASK 0x7 ++ ++ ++#define IEEE80211_CCK_MODULATION 0 ++#define IEEE80211_OFDM_MODULATION 1 ++#define IEEE80211_MIXED_MODULATION 2 ++ ++#define IEEE80211_24GHZ_BAND 0 ++#define IEEE80211_52GHZ_BAND 1 ++#define IEEE80211_MIXED_BAND 2 ++ ++#define IEEE80211_CCK_RATE_1MB 0x02 ++#define IEEE80211_CCK_RATE_2MB 0x04 ++#define IEEE80211_CCK_RATE_5MB 0x0B ++#define IEEE80211_CCK_RATE_11MB 0x16 ++#define IEEE80211_OFDM_RATE_6MB 0x0C ++#define IEEE80211_OFDM_RATE_9MB 0x12 ++#define IEEE80211_OFDM_RATE_12MB 0x18 ++#define IEEE80211_OFDM_RATE_18MB 0x24 ++#define IEEE80211_OFDM_RATE_24MB 0x30 ++#define IEEE80211_OFDM_RATE_36MB 0x48 ++#define IEEE80211_OFDM_RATE_48MB 0x60 ++#define IEEE80211_OFDM_RATE_54MB 0x6C ++#define IEEE80211_BASIC_RATE_MASK 0x80 ++ ++#define IEEE80211_CCK_RATE_1MB_MASK BIT(0) ++#define IEEE80211_CCK_RATE_2MB_MASK BIT(1) ++#define IEEE80211_CCK_RATE_5MB_MASK BIT(2) ++#define IEEE80211_CCK_RATE_11MB_MASK BIT(3) ++#define IEEE80211_OFDM_RATE_6MB_MASK BIT(4) ++#define IEEE80211_OFDM_RATE_9MB_MASK BIT(5) ++#define IEEE80211_OFDM_RATE_12MB_MASK BIT(6) ++#define IEEE80211_OFDM_RATE_18MB_MASK BIT(7) ++#define IEEE80211_OFDM_RATE_24MB_MASK BIT(8) ++#define IEEE80211_OFDM_RATE_36MB_MASK BIT(9) ++#define IEEE80211_OFDM_RATE_48MB_MASK BIT(10) ++#define IEEE80211_OFDM_RATE_54MB_MASK BIT(11) ++ ++#define IEEE80211_CCK_RATES_MASK 0x0000000F ++#define IEEE80211_CCK_BASIC_RATES_MASK (IEEE80211_CCK_RATE_1MB_MASK | \ ++ IEEE80211_CCK_RATE_2MB_MASK) ++#define IEEE80211_CCK_DEFAULT_RATES_MASK (IEEE80211_CCK_BASIC_RATES_MASK | \ ++ IEEE80211_CCK_RATE_5MB_MASK | \ ++ IEEE80211_CCK_RATE_11MB_MASK) ++ ++#define IEEE80211_OFDM_RATES_MASK 0x00000FF0 ++#define IEEE80211_OFDM_BASIC_RATES_MASK (IEEE80211_OFDM_RATE_6MB_MASK | \ ++ IEEE80211_OFDM_RATE_12MB_MASK | \ ++ IEEE80211_OFDM_RATE_24MB_MASK) ++#define IEEE80211_OFDM_DEFAULT_RATES_MASK (IEEE80211_OFDM_BASIC_RATES_MASK | \ ++ IEEE80211_OFDM_RATE_9MB_MASK | \ ++ IEEE80211_OFDM_RATE_18MB_MASK | \ ++ IEEE80211_OFDM_RATE_36MB_MASK | \ ++ IEEE80211_OFDM_RATE_48MB_MASK | \ ++ IEEE80211_OFDM_RATE_54MB_MASK) ++#define IEEE80211_DEFAULT_RATES_MASK (IEEE80211_OFDM_DEFAULT_RATES_MASK | \ ++ IEEE80211_CCK_DEFAULT_RATES_MASK) ++ ++#define IEEE80211_NUM_OFDM_RATES 8 ++#define IEEE80211_NUM_CCK_RATES 4 ++#define IEEE80211_OFDM_SHIFT_MASK_A 4 ++ ++ ++ ++ + /* NOTE: This data is for statistical purposes; not all hardware provides this + * information for frames received. Not setting these will not cause + * any adverse affects. */ +@@ -268,6 +337,9 @@ + u16 rate; /* in 100 kbps */ + u8 received_channel; + u8 control; ++ u8 mask; ++ u8 freq; ++ u16 len; + }; + + /* IEEE 802.11 requires that STA supports concurrent reception of at least +@@ -380,6 +452,9 @@ + #define MFIE_TYPE_TIM 5 + #define MFIE_TYPE_IBSS_SET 6 + #define MFIE_TYPE_CHALLENGE 16 ++#define MFIE_TYPE_RSN 48 ++#define MFIE_TYPE_RATES_EX 50 ++#define MFIE_TYPE_GENERIC 221 + + struct ieee80211_info_element_hdr { + u8 id; +@@ -467,12 +542,22 @@ + /* SWEEP TABLE ENTRIES NUMBER*/ + #define MAX_SWEEP_TAB_ENTRIES 42 + #define MAX_SWEEP_TAB_ENTRIES_PER_PACKET 7 ++/* MAX_RATES_LENGTH needs to be 12. The spec says 8, and many APs ++ * only use 8, and then use extended rates for the remaining supported ++ * rates. Other APs, however, stick all of their supported rates on the ++ * main rates information element... */ + #define MAX_RATES_LENGTH ((u8)12) +-#define MAX_BEACON_COUNT 128 ++#define MAX_RATES_EX_LENGTH ((u8)16) ++#define MAX_NETWORK_COUNT 128 + + #define CRC_LENGTH 4U + +-struct ieee80211_beacon { ++#define MAX_WPA_IE_LEN 64 ++ ++#define NETWORK_EMPTY_ESSID BIT(0) ++#define NETWORK_HAS_OFDM BIT(1) ++ ++struct ieee80211_network { + u8 bssid[ETH_ALEN]; + u8 ssid_len; + struct ieee80211_rx_stats stats; +@@ -480,12 +565,24 @@ + u8 channel; + u8 rates[MAX_RATES_LENGTH]; + u8 rates_len; ++ u8 rates_ex[MAX_RATES_EX_LENGTH]; ++ u8 rates_ex_len; + u32 last_scanned; ++ u8 mode; ++ u8 flags; ++ u32 last_associate; + /* Ensure null-terminated for any debug msgs */ + u8 ssid[IW_ESSID_MAX_SIZE + 1]; + u32 time_stamp[2]; + u16 beacon_interval; + u16 listen_interval; ++ u16 atim_window; ++#ifdef CONFIG_IEEE80211_WPA ++ u8 wpa_ie[MAX_WPA_IE_LEN]; ++ size_t wpa_ie_len; ++ u8 rsn_ie[MAX_WPA_IE_LEN]; ++ size_t rsn_ie_len; ++#endif /* CONFIG_IEEE80211_WPA */ + struct list_head list; + }; + +@@ -502,6 +599,18 @@ + #define DEFAULT_MAX_SCAN_AGE 5 + #define DEFAULT_FTS 2342 + ++extern inline int is_multicast_ether_addr(const u8 *addr) ++{ ++ return ((addr[0] != 0xff) && (0x01 & addr[0])); ++} ++ ++extern inline int is_broadcast_ether_addr(const u8 *addr) ++{ ++ return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ ++ (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); ++} ++ ++ + struct ieee80211_device { + struct net_device *dev; + +@@ -511,9 +620,9 @@ + void *priv; + + /* Probe / Beacon management */ +- struct list_head beacon_free_list; +- struct list_head beacon_list; +- struct ieee80211_beacon *beacons; ++ struct list_head network_free_list; ++ struct list_head network_list; ++ struct ieee80211_network *networks; + int scans; + int scan_age; + +@@ -539,6 +648,17 @@ + + int ieee_802_1x; /* is IEEE 802.1X used */ + ++#ifdef CONFIG_IEEE80211_WPA ++ /* WPA data */ ++ int wpa_enabled; ++ int drop_unencrypted; ++ int tkip_countermeasures; ++ int privacy_invoked; ++ int pass_unencrypted_eapol; ++ size_t wpa_ie_len; ++ u8 *wpa_ie; ++#endif /* CONFIG_IEEE80211_WPA */ ++ + struct list_head crypt_deinit_list; + struct ieee80211_crypt_data *crypt[WEP_KEYS]; + int tx_keyidx; /* default TX key index (crypt[tx_keyidx]) */ +@@ -560,9 +680,58 @@ + + enum ieee80211_state state; + +- ++ int mode; /* A, B, G */ ++ int modulation; /* CCK, OFDM */ ++ int freq_band; /* 2.4Ghz, 5.2Ghz, Mixed */ ++ int abg_ture; /* ABG flag */ + }; + ++#define IEEE_A 0 ++#define IEEE_B 1 ++#define IEEE_G 2 ++#define IEEE_MASK (BIT(IEEE_A) | BIT(IEEE_B) | BIT(IEEE_G)) ++ ++extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len) ++{ ++ /* Single white space is for Linksys APs */ ++ if (essid_len == 1 && essid[0] == ' ') ++ return 1; ++ ++ /* Otherwise, if the entire essid is 0, we assume it is hidden */ ++ while (essid_len) { ++ essid_len--; ++ if (essid[essid_len] != '\0') ++ return 0; ++ } ++ ++ return 1; ++} ++ ++ ++extern inline int ieee80211_check_mode(struct ieee80211_device *ieee, int mode) ++{ ++ int rc = 0; ++ switch(mode) { ++ case IEEE_A: ++ if (ieee->modulation == IEEE80211_CCK_MODULATION || ++ ieee->freq_band == IEEE80211_24GHZ_BAND) ++ rc = 1; ++ break; ++ case IEEE_B: ++ if (ieee->modulation == IEEE80211_OFDM_MODULATION || ++ ieee->freq_band == IEEE80211_52GHZ_BAND) ++ rc = 1; ++ break; ++ case IEEE_G: ++ if (ieee->modulation == IEEE80211_CCK_MODULATION || ++ ieee->freq_band == IEEE80211_52GHZ_BAND) ++ rc = 1; ++ break; ++ default: ++ rc = 1; ++ } ++ return rc; ++} + + extern inline int ieee80211_get_hdrlen(u16 fc) + { +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_crypt.c y/drivers/net/wireless/ieee80211/ieee80211_crypt.c +--- x/drivers/net/wireless/ieee80211/ieee80211_crypt.c 2004-09-30 20:53:28.000000000 +1000 ++++ y/drivers/net/wireless/ieee80211/ieee80211_crypt.c 2004-09-30 20:53:37.000000000 +1000 +@@ -53,8 +53,10 @@ + + list_del(ptr); + +- if (entry->ops) ++ if (entry->ops) { + entry->ops->deinit(entry->priv); ++ module_put(entry->ops->owner); ++ } + kfree(entry); + } + } +@@ -109,7 +111,7 @@ + if (hcrypt == NULL) + return -1; + +- alg = (struct ieee80211_crypto_alg *) kmalloc(sizeof(*alg), GFP_KERNEL); ++ alg = kmalloc(sizeof(*alg), GFP_KERNEL); + if (alg == NULL) + return -ENOMEM; + +@@ -198,13 +200,14 @@ + .set_key = NULL, + .get_key = NULL, + .extra_prefix_len = 0, +- .extra_postfix_len = 0 ++ .extra_postfix_len = 0, ++ .owner = THIS_MODULE, + }; + + + static int __init ieee80211_crypto_init(void) + { +- hcrypt = (struct ieee80211_crypto *) kmalloc(sizeof(*hcrypt), GFP_KERNEL); ++ hcrypt = kmalloc(sizeof(*hcrypt), GFP_KERNEL); + if (hcrypt == NULL) + return -ENOMEM; + +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_crypt.h y/drivers/net/wireless/ieee80211/ieee80211_crypt.h +--- x/drivers/net/wireless/ieee80211/ieee80211_crypt.h 2004-09-30 20:53:28.000000000 +1000 ++++ y/drivers/net/wireless/ieee80211/ieee80211_crypt.h 2004-09-30 20:53:37.000000000 +1000 +@@ -23,11 +23,17 @@ + #ifndef IEEE80211_CRYPT_H + #define IEEE80211_CRYPT_H + +-#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) ++#ifdef CONFIG_IEEE80211_CRYPT_MODULE ++#ifndef CONFIG_IEEE80211_CRYPT ++#define CONFIG_IEEE80211_CRYPT ++#endif ++#endif ++ ++#ifdef CONFIG_IEEE80211_CRYPT + #include + + struct ieee80211_crypto_ops { +- char *name; ++ const char *name; + + /* init new crypto context (e.g., allocate private data space, + * select IV, etc.); returns NULL on failure or pointer to allocated +@@ -65,6 +71,8 @@ + * the result must start at the beginning of the buffer and correct + * length must be returned */ + int extra_prefix_len, extra_postfix_len; ++ ++ struct module *owner; + }; + + struct ieee80211_crypt_data { +@@ -91,6 +99,6 @@ + atomic_t refcnt; + }; + +-#endif /* CONFIG_IEEE80211_CRYPT || CONFIG_IEEE80211_CRYPT_MODULE */ ++#endif /* CONFIG_IEEE80211_CRYPT */ + + #endif +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_crypt_ccmp.c y/drivers/net/wireless/ieee80211/ieee80211_crypt_ccmp.c +--- x/drivers/net/wireless/ieee80211/ieee80211_crypt_ccmp.c 2004-09-30 20:53:28.000000000 +1000 ++++ y/drivers/net/wireless/ieee80211/ieee80211_crypt_ccmp.c 2004-09-30 20:53:37.000000000 +1000 +@@ -86,14 +86,8 @@ + { + struct ieee80211_ccmp_data *priv; + +-#ifdef NEW_MODULE_CODE +- if (!try_module_get(THIS_MODULE)) +- return NULL; +-#else +- MOD_INC_USE_COUNT; +-#endif ++ priv = kmalloc(sizeof(*priv), GFP_ATOMIC); + +- priv = (struct ieee80211_ccmp_data *) kmalloc(sizeof(*priv), GFP_ATOMIC); + if (priv == NULL) { + goto fail; + } +@@ -115,11 +109,7 @@ + crypto_free_tfm(priv->tfm); + kfree(priv); + } +-#ifdef NEW_MODULE_CODE +- module_put(THIS_MODULE); +-#else +- MOD_DEC_USE_COUNT; +-#endif ++ + return NULL; + } + +@@ -130,11 +120,6 @@ + if (_priv && _priv->tfm) + crypto_free_tfm(_priv->tfm); + kfree(priv); +-#ifdef NEW_MODULE_CODE +- module_put(THIS_MODULE); +-#else +- MOD_DEC_USE_COUNT; +-#endif + } + + +@@ -473,7 +458,8 @@ + .get_key = ieee80211_ccmp_get_key, + .print_stats = ieee80211_ccmp_print_stats, + .extra_prefix_len = CCMP_HDR_LEN, +- .extra_postfix_len = CCMP_MIC_LEN ++ .extra_postfix_len = CCMP_MIC_LEN, ++ .owner = THIS_MODULE, + }; + + +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_crypt_tkip.c y/drivers/net/wireless/ieee80211/ieee80211_crypt_tkip.c +--- x/drivers/net/wireless/ieee80211/ieee80211_crypt_tkip.c 2004-09-30 20:53:28.000000000 +1000 ++++ y/drivers/net/wireless/ieee80211/ieee80211_crypt_tkip.c 2004-09-30 20:53:37.000000000 +1000 +@@ -73,14 +73,8 @@ + { + struct ieee80211_tkip_data *priv; + +-#ifdef NEW_MODULE_CODE +- if (!try_module_get(THIS_MODULE)) +- return NULL; +-#else +- MOD_INC_USE_COUNT; +-#endif ++ priv = kmalloc(sizeof(*priv), GFP_ATOMIC); + +- priv = (struct ieee80211_tkip_data *) kmalloc(sizeof(*priv), GFP_ATOMIC); + if (priv == NULL) + goto fail; + memset(priv, 0, sizeof(*priv)); +@@ -110,11 +104,7 @@ + crypto_free_tfm(priv->tfm_arc4); + kfree(priv); + } +-#ifdef NEW_MODULE_CODE +- module_put(THIS_MODULE); +-#else +- MOD_DEC_USE_COUNT; +-#endif ++ + return NULL; + } + +@@ -127,11 +117,6 @@ + if (_priv && _priv->tfm_arc4) + crypto_free_tfm(_priv->tfm_arc4); + kfree(priv); +-#ifdef NEW_MODULE_CODE +- module_put(THIS_MODULE); +-#else +- MOD_DEC_USE_COUNT; +-#endif + } + + +@@ -688,8 +673,9 @@ + .set_key = ieee80211_tkip_set_key, + .get_key = ieee80211_tkip_get_key, + .print_stats = ieee80211_tkip_print_stats, +- .extra_prefix_len = 4 + 4 /* IV + ExtIV */, +- .extra_postfix_len = 8 + 4 /* MIC + ICV */ ++ .extra_prefix_len = 4 + 4, /* IV + ExtIV */ ++ .extra_postfix_len = 8 + 4, /* MIC + ICV */ ++ .owner = THIS_MODULE, + }; + + +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_crypt_wep.c y/drivers/net/wireless/ieee80211/ieee80211_crypt_wep.c +--- x/drivers/net/wireless/ieee80211/ieee80211_crypt_wep.c 2004-09-30 20:53:28.000000000 +1000 ++++ y/drivers/net/wireless/ieee80211/ieee80211_crypt_wep.c 2004-09-30 20:53:37.000000000 +1000 +@@ -50,7 +50,7 @@ + { + struct prism2_wep_data *priv; + +- priv = (struct prism2_wep_data *) kmalloc(sizeof(*priv), GFP_ATOMIC); ++ priv = kmalloc(sizeof(*priv), GFP_ATOMIC); + if (priv == NULL) + goto fail; + memset(priv, 0, sizeof(*priv)); +@@ -256,8 +256,9 @@ + .set_key = prism2_wep_set_key, + .get_key = prism2_wep_get_key, + .print_stats = prism2_wep_print_stats, +- .extra_prefix_len = 4 /* IV */, +- .extra_postfix_len = 4 /* ICV */ ++ .extra_prefix_len = 4, /* IV */ ++ .extra_postfix_len = 4, /* ICV */ ++ .owner = THIS_MODULE, + }; + + +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_module.c y/drivers/net/wireless/ieee80211/ieee80211_module.c +--- x/drivers/net/wireless/ieee80211/ieee80211_module.c 2004-09-30 20:53:28.000000000 +1000 ++++ y/drivers/net/wireless/ieee80211/ieee80211_module.c 2004-09-30 20:53:37.000000000 +1000 +@@ -53,8 +53,6 @@ + + #include "ieee80211.h" + +-#define MODULE_NAME "ieee80211" +- + MODULE_DESCRIPTION("802.11 data/management/control stack"); + MODULE_AUTHOR("Copyright (C) 2004 Intel Corporation "); + MODULE_LICENSE("GPL"); +@@ -63,42 +61,42 @@ + u32 ieee80211_debug_level = 0; + #endif + +-static inline int ieee80211_beacons_allocate(struct ieee80211_device *ieee) ++static inline int ieee80211_networks_allocate(struct ieee80211_device *ieee) + { +- if (ieee->beacons) ++ if (ieee->networks) + return 0; + +- ieee->beacons = (struct ieee80211_beacon *)kmalloc( +- MAX_BEACON_COUNT * sizeof(struct ieee80211_beacon), ++ ieee->networks = kmalloc( ++ MAX_NETWORK_COUNT * sizeof(struct ieee80211_network), + GFP_KERNEL); +- if (!ieee->beacons) { ++ if (!ieee->networks) { + printk(KERN_WARNING "%s: Out of memory allocating beacons\n", + ieee->dev->name); + return -ENOMEM; + } + +- memset(ieee->beacons, 0, +- MAX_BEACON_COUNT * sizeof(struct ieee80211_beacon)); ++ memset(ieee->networks, 0, ++ MAX_NETWORK_COUNT * sizeof(struct ieee80211_network)); + + return 0; + } + +-static inline void ieee80211_beacons_free(struct ieee80211_device *ieee) ++static inline void ieee80211_networks_free(struct ieee80211_device *ieee) + { +- if (!ieee->beacons) ++ if (!ieee->networks) + return; +- kfree(ieee->beacons); +- ieee->beacons = NULL; ++ kfree(ieee->networks); ++ ieee->networks = NULL; + } + +-static inline void ieee80211_beacons_initialize(struct ieee80211_device *ieee) ++static inline void ieee80211_networks_initialize(struct ieee80211_device *ieee) + { + int i; + +- INIT_LIST_HEAD(&ieee->beacon_free_list); +- INIT_LIST_HEAD(&ieee->beacon_list); +- for (i = 0; i < MAX_BEACON_COUNT; i++) +- list_add_tail(&ieee->beacons[i].list, &ieee->beacon_free_list); ++ INIT_LIST_HEAD(&ieee->network_free_list); ++ INIT_LIST_HEAD(&ieee->network_list); ++ for (i = 0; i < MAX_NETWORK_COUNT; i++) ++ list_add_tail(&ieee->networks[i].list, &ieee->network_free_list); + } + + struct ieee80211_device *ieee80211_alloc(struct net_device *dev, +@@ -113,19 +111,19 @@ + ieee->dev = dev; + ieee->priv = priv; + +- err = ieee80211_beacons_allocate(ieee); ++ err = ieee80211_networks_allocate(ieee); + if (err) { + IEEE80211_ERROR("Unable to allocate beacon storage\n"); + goto error; + } +- ieee80211_beacons_initialize(ieee); ++ ieee80211_networks_initialize(ieee); + + /* Default fragmentation threshold is maximum payload size */ + ieee->fts = DEFAULT_FTS; + ieee->scan_age = DEFAULT_MAX_SCAN_AGE; + ieee->open_wep = 1; + +-#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) ++#ifdef CONFIG_IEEE80211_CRYPT + /* Default to enabling full open WEP with host based encrypt/decrypt */ + ieee->host_encrypt = 1; + ieee->host_decrypt = 1; +@@ -148,7 +146,7 @@ + + void ieee80211_free(struct ieee80211_device *ieee) + { +-#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) ++#ifdef CONFIG_IEEE80211_CRYPT + int i; + + del_timer_sync(&ieee->crypt_deinit_timer); +@@ -157,14 +155,16 @@ + for (i = 0; i < WEP_KEYS; i++) { + struct ieee80211_crypt_data *crypt = ieee->crypt[i]; + if (crypt) { +- if (crypt->ops) ++ if (crypt->ops) { + crypt->ops->deinit(crypt->priv); ++ module_put(crypt->ops->owner); ++ } + kfree(crypt); + ieee->crypt[i] = NULL; + } + } + #endif +- ieee80211_beacons_free(ieee); ++ ieee80211_networks_free(ieee); + kfree(ieee); + } + +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_rx.c y/drivers/net/wireless/ieee80211/ieee80211_rx.c +--- x/drivers/net/wireless/ieee80211/ieee80211_rx.c 2004-09-30 20:53:28.000000000 +1000 ++++ y/drivers/net/wireless/ieee80211/ieee80211_rx.c 2004-09-30 20:53:37.000000000 +1000 +@@ -229,7 +229,7 @@ + { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 }; + /* No encapsulation header if EtherType < 0x600 (=length) */ + +-#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) ++#ifdef CONFIG_IEEE80211_CRYPT + /* Called by ieee80211_rx_frame_decrypt */ + static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee, + struct sk_buff *skb) +@@ -284,7 +284,7 @@ + hdr = (struct ieee80211_hdr *) skb->data; + hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); + +-#ifdef NOT_YET ++#ifdef CONFIG_IEEE80211_WPA + if (ieee->tkip_countermeasures && + strcmp(crypt->ops->name, "TKIP") == 0) { + if (net_ratelimit()) { +@@ -340,7 +340,7 @@ + + return 0; + } +-#endif /* CONFIG_IEEE80211_CRYPT || CONFIG_IEEE80211_CRYPT_MODULE */ ++#endif /* CONFIG_IEEE80211_CRYPT */ + + + /* All received frames are sent to this function. @skb contains the frame in +@@ -367,7 +367,7 @@ + #endif + u8 dst[ETH_ALEN]; + u8 src[ETH_ALEN]; +-#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) ++#ifdef CONFIG_IEEE80211_CRYPT + struct ieee80211_crypt_data *crypt = NULL; + int keyidx = 0; + #endif +@@ -416,7 +416,7 @@ + } + #endif + +-#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) ++#ifdef CONFIG_IEEE80211_CRYPT + if (ieee->host_decrypt) { + int idx = 0; + if (skb->len >= hdrlen + 3) +@@ -457,7 +457,7 @@ + goto rx_dropped; + } + } +-#endif /* CONFIG_IEEE80211_CRYPT || CONFIG_IEEE80211_CRYPT_MODULE */ ++#endif /* CONFIG_IEEE80211_CRYPT */ + + #ifdef NOT_YET + if (type != WLAN_FC_TYPE_DATA) { +@@ -561,7 +561,7 @@ + + /* skb: hdr + (possibly fragmented, possibly encrypted) payload */ + +-#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) ++#ifdef CONFIG_IEEE80211_CRYPT + if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && + (keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0) + goto rx_dropped; +@@ -624,7 +624,7 @@ + + /* skb: hdr + (possible reassembled) full MSDU payload; possibly still + * encrypted/authenticated */ +-#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) ++#ifdef CONFIG_IEEE80211_CRYPT + if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) && + ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt)) + goto rx_dropped; +@@ -654,7 +654,7 @@ + } + goto rx_dropped; + } +-#endif /* CONFIG_IEEE80211_CRYPT || CONFIG_IEEE80211_CRYPT_MODULE */ ++#endif /* CONFIG_IEEE80211_CRYPT */ + + /* skb: hdr + (possible reassembled) full plaintext payload */ + +@@ -777,108 +777,222 @@ + return 0; + } + ++#define MGMT_FRAME_FIXED_PART_LENGTH 0x24 ++ ++static int ieee80211_filter_network( ++ struct ieee80211_device *ieee, ++ struct ieee80211_network *network, ++ struct ieee80211_rx_stats *stats) ++{ ++ // TODO check valid channel ++ if (ieee->abg_ture == 1) ++ return 0; ++ ++ switch (stats->freq) { ++ case IEEE80211_52GHZ_BAND: ++ if (ieee->freq_band == IEEE80211_24GHZ_BAND) ++ return 1; ++ break; ++ case IEEE80211_24GHZ_BAND: ++ default: ++ if (ieee->freq_band == IEEE80211_52GHZ_BAND) ++ return 1; ++ if (ieee->modulation == IEEE80211_CCK_MODULATION) { ++ if (network->flags & NETWORK_HAS_OFDM) ++ return 1; ++ } else if (ieee->modulation == IEEE80211_OFDM_MODULATION) { ++ if (!(network->flags & NETWORK_HAS_OFDM)) ++ return 1; ++ } ++ break; ++ } ++ ++ return 0; ++} ++ ++static inline int ieee80211_is_ofdm_rate(u8 rate) ++{ ++ switch (rate & ~IEEE80211_BASIC_RATE_MASK) { ++ case IEEE80211_OFDM_RATE_6MB: ++ case IEEE80211_OFDM_RATE_9MB: ++ case IEEE80211_OFDM_RATE_12MB: ++ case IEEE80211_OFDM_RATE_18MB: ++ case IEEE80211_OFDM_RATE_24MB: ++ case IEEE80211_OFDM_RATE_36MB: ++ case IEEE80211_OFDM_RATE_48MB: ++ case IEEE80211_OFDM_RATE_54MB: ++ return 1; ++ } ++ return 0; ++} + + +-static inline void ieee80211_beacon_add( ++static inline void ieee80211_network_add( + struct ieee80211_device *ieee, + struct ieee80211_probe_response *new_beacon, + struct ieee80211_rx_stats *stats) + { + struct list_head *element; +- struct ieee80211_beacon *beacon; ++ struct ieee80211_network *network; + struct ieee80211_info_element *info_element; ++ u16 left; ++ u8 i; + +- element = ieee->beacon_free_list.next; ++ element = ieee->network_free_list.next; + +- beacon = list_entry(element, struct ieee80211_beacon, list); ++ network = list_entry(element, struct ieee80211_network, list); ++ ++ if (stats->freq == IEEE80211_52GHZ_BAND) { ++ /* for A band (No DS info) */ ++ network->channel = stats->received_channel; ++ } + + /* Pull out fixed field data */ +- memcpy(beacon->bssid, new_beacon->header.addr3, ETH_ALEN); +- beacon->capability = new_beacon->capability; +- beacon->last_scanned = ieee->scans; +- beacon->time_stamp[0] = new_beacon->time_stamp[0]; +- beacon->time_stamp[1] = new_beacon->time_stamp[1]; +- beacon->beacon_interval = new_beacon->beacon_interval; +- beacon->listen_interval = 0x0A; /* Where to pull this? new_beacon->listen_interval;*/ +-/* +- if ((ieee->long_preamble == 0) && +- !(beacon->capability & WLAN_CAPABILITY_SHORT_PREAMBLE)) { +- printk(KERN_INFO "%s: Beacon received from AP (" MACSTR ") " +- "that has preable length conflict.\n", +- ieee->ndev->name, MAC2STR(beacon->bssid)); +- } +-*/ +- /* First info element is the SSID */ +- info_element = &new_beacon->info_element; +- if (info_element->id != MFIE_TYPE_SSID) { +- IEEE80211_DEBUG(IPW_DL_INFO | IPW_DL_SCAN, +- "invalid MFIE type for SSID: %d\n", +- info_element->id); +- return; +- } +- beacon->ssid_len = min(info_element->len, (u8)IW_ESSID_MAX_SIZE); +- memcpy(beacon->ssid, info_element->data, beacon->ssid_len); +- if (beacon->ssid_len < IW_ESSID_MAX_SIZE) +- memset(beacon->ssid + beacon->ssid_len, 0, +- IW_ESSID_MAX_SIZE - beacon->ssid_len); +- +- /* Second info element is the RATES */ +- info_element = (struct ieee80211_info_element *) +- &info_element->data[info_element->len]; +- if (info_element->id != MFIE_TYPE_RATES) { +- IEEE80211_DEBUG(IPW_DL_INFO | IPW_DL_SCAN, +- "invalid MFIE type for RATES: %d\n", +- info_element->id); +- return; +- } +- beacon->rates_len = min(info_element->len, MAX_RATES_LENGTH); +- memcpy(beacon->rates, info_element->data, beacon->rates_len); ++ memcpy(network->bssid, new_beacon->header.addr3, ETH_ALEN); ++ network->capability = new_beacon->capability; ++ network->last_scanned = ieee->scans; ++ network->time_stamp[0] = new_beacon->time_stamp[0]; ++ network->time_stamp[1] = new_beacon->time_stamp[1]; ++ network->beacon_interval = new_beacon->beacon_interval; ++ network->listen_interval = 0x0A; /* Where to pull this? new_beacon->listen_interval;*/ ++ network->flags = 0; ++ network->rates_len = network->rates_ex_len = 0; ++ network->last_associate = 0; ++ ++#ifdef CONFIG_IEEE80211_WPA ++ network->wpa_ie_len = 0; ++ network->rsn_ie_len = 0; ++#endif /* CONFIG_IEEE80211_WPA */ ++ ++ info_element = &new_beacon->info_element; ++ left = stats->len - ((void *)info_element - (void *)new_beacon); ++ while (left >= sizeof(struct ieee80211_info_element_hdr)) { ++ if (sizeof(struct ieee80211_info_element_hdr) + info_element->len > left) { ++ IEEE80211_DEBUG_SCAN("SCAN: parse failed: info_element->len + 2 > left : info_element->len+2=%d left=%d.\n", ++ info_element->len + sizeof(struct ieee80211_info_element), ++ left); ++ return; ++ } ++ ++ switch (info_element->id) { ++ case MFIE_TYPE_SSID: ++ network->ssid_len = min(info_element->len, (u8)IW_ESSID_MAX_SIZE); ++ memcpy(network->ssid, info_element->data, network->ssid_len); ++ if (network->ssid_len < IW_ESSID_MAX_SIZE) ++ memset(network->ssid + network->ssid_len, 0, ++ IW_ESSID_MAX_SIZE - network->ssid_len); ++ ++ IEEE80211_DEBUG_SCAN("MFIE_TYPE_SSID: '%s' len=%d.\n", network->ssid, network->ssid_len); ++ break; + +- /* Third info element is either FH or DS, based on BSS capability */ +- info_element = (struct ieee80211_info_element *) +- &info_element->data[info_element->len]; +- if (beacon->capability & WLAN_CAPABILITY_BSS) { +- /* BSS - Direct Sequence */ +- if ( stats->control != 0 ) { +- if (info_element->id != MFIE_TYPE_DS_SET) { +- IEEE80211_DEBUG( +- IPW_DL_INFO | IPW_DL_SCAN, +- ": invalid MFIE type for DIRECT SEQUENCE: " +- "%d\n", +- info_element->id); +- return; ++ case MFIE_TYPE_RATES: ++ network->rates_len = min(info_element->len, MAX_RATES_LENGTH); ++ for (i = 0; i < network->rates_len; i++) { ++ network->rates[i] = info_element->data[i]; ++ if (!(network->flags & NETWORK_HAS_OFDM)) ++ network->flags |= ieee80211_is_ofdm_rate(info_element->data[i]) ? NETWORK_HAS_OFDM : 0; + } +- +- beacon->channel = info_element->data[0]; +- } else { +- /* for A band (No DS info) */ +- beacon->channel = stats->received_channel; +- } +- } else if (beacon->capability & WLAN_CAPABILITY_IBSS) { +- /* IBSS - Frequency Hop */ +-#ifdef NOT_YET +- if (info_element->id != MFIE_TYPE_FH_SET) { +- IEEE80211_DEBUG(IPW_DL_INFO | IPW_DL_SCAN, +- "invalid MFIE type for FREQ HOP: %d\n", +- info_element->id); +- return; +- } ++ break; ++ ++ case MFIE_TYPE_RATES_EX: ++ network->rates_ex_len = min(info_element->len, MAX_RATES_EX_LENGTH); ++ for (i = 0; i < network->rates_ex_len; i++) { ++ network->rates_ex[i] = info_element->data[i]; ++ if (!(network->flags & NETWORK_HAS_OFDM)) ++ network->flags |= ieee80211_is_ofdm_rate(info_element->data[i]) ? NETWORK_HAS_OFDM : 0; ++ } ++ break; ++ ++ case MFIE_TYPE_DS_SET: ++ IEEE80211_DEBUG_SCAN("MFIE_TYPE_DS_SET: %d\n", ++ info_element->data[0]); ++ if (stats->freq == IEEE80211_24GHZ_BAND) ++ network->channel = info_element->data[0]; ++ break; ++ ++ case MFIE_TYPE_FH_SET: ++ IEEE80211_DEBUG_SCAN("MFIE_TYPE_FH_SET: ignored\n"); ++ break; ++ ++ case MFIE_TYPE_CF_SET: ++ IEEE80211_DEBUG_SCAN("MFIE_TYPE_CF_SET: ignored\n"); ++ break; ++ ++ case MFIE_TYPE_TIM: ++ IEEE80211_DEBUG_SCAN("MFIE_TYPE_TIM: ignored\n"); ++ break; ++ ++ case MFIE_TYPE_IBSS_SET: ++ IEEE80211_DEBUG_SCAN("MFIE_TYPE_IBSS_SET: ignored\n"); ++ break; ++ ++ case MFIE_TYPE_CHALLENGE: ++ IEEE80211_DEBUG_SCAN("MFIE_TYPE_CHALLENGE: ignored\n"); ++ break; ++ ++#ifdef CONFIG_IEEE80211_WPA ++ case MFIE_TYPE_GENERIC: ++ IEEE80211_DEBUG_SCAN("MFIE_TYPE_GENERIC: %d bytes\n", ++ info_element->len); ++ if (info_element->len >= 4 && ++ info_element->data[0] == 0x00 && ++ info_element->data[1] == 0x50 && ++ info_element->data[2] == 0xf2 && ++ info_element->data[3] == 0x01) { ++ network->wpa_ie_len = min(info_element->len + 2, ++ MAX_WPA_IE_LEN); ++ memcpy(network->wpa_ie, info_element, ++ network->wpa_ie_len); ++ } ++ break; ++ ++ case MFIE_TYPE_RSN: ++ IEEE80211_DEBUG_SCAN("MFIE_TYPE_RSN: %d bytes\n", ++ info_element->len); ++ network->rsn_ie_len = min(info_element->len + 2, ++ MAX_WPA_IE_LEN); ++ memcpy(network->rsn_ie, info_element, ++ network->rsn_ie_len); ++ break; + #endif +- } else { +- /* Invalid ESS/IBSS capability! */ +- IEEE80211_DEBUG(IPW_DL_INFO | IPW_DL_SCAN, +- "invalid ESS/IBSS capability (both 0).\n"); +- return; ++ ++ default: ++ IEEE80211_DEBUG_SCAN("unsupported IE %d\n", ++ info_element->id); ++ break; ++ } ++ ++ left -= sizeof(struct ieee80211_info_element_hdr) + ++ info_element->len; ++ info_element = (struct ieee80211_info_element *) ++ &info_element->data[info_element->len]; ++ } ++ ++ if (stats->freq == IEEE80211_52GHZ_BAND) ++ network->mode = IEEE_A; ++ else { ++ if (network->flags & NETWORK_HAS_OFDM) ++ network->mode = IEEE_G; ++ else ++ network->mode = IEEE_B; + } ++ ++ if (ieee80211_is_empty_essid(network->ssid, network->ssid_len)) ++ network->flags |= NETWORK_EMPTY_ESSID; + +- /* For now, we ignore the optional CF and IBSS parameter sets */ ++ if (ieee80211_filter_network(ieee, network, stats)) { ++ IEEE80211_DEBUG_SCAN("filtered out '%s' network.\n", ++ escape_essid(network->ssid, ++ network->ssid_len)); ++ return; ++ } + + list_del(element); + +- IEEE80211_DEBUG_SCAN("adding '%s' to beacon list.\n", beacon->ssid); +- memcpy(&beacon->stats, stats, sizeof(beacon->stats)); ++ IEEE80211_DEBUG_SCAN("adding '%s' to network list.\n", network->ssid); ++ memcpy(&network->stats, stats, sizeof(network->stats)); + +- list_add_tail(&beacon->list, &ieee->beacon_list); ++ list_add_tail(&network->list, &ieee->network_list); + } + + static inline void ieee80211_process_probe_response( +@@ -887,8 +1001,8 @@ + struct ieee80211_rx_stats *stats) + { + struct ieee80211_info_element *ssid_info; +- struct ieee80211_beacon *beacon; +- u8 ssid_len; ++ struct ieee80211_network *network; ++ u8 ssid_len, empty_essid; + + IEEE80211_DEBUG_SCAN( + "\n" +@@ -897,7 +1011,6 @@ + "Beacon Interval : %04X\n" + "Capabilities : %c%c%c%c-%c%c%c%c\n", + new_beacon->time_stamp[0], +- + new_beacon->time_stamp[1], + new_beacon->beacon_interval, + (new_beacon->capability & BIT(7)) ? '1' : '0', +@@ -918,23 +1031,25 @@ + } + + /* Search for this entry in the list and nuke it if it is +- * already there */ ++ * already there. ++ */ + ssid_len = min(ssid_info->len, (u8)IW_ESSID_MAX_SIZE); +- list_for_each_entry(beacon, &ieee->beacon_list, list) { +- if (!memcmp(beacon->bssid, new_beacon->header.addr3, ++ empty_essid = ieee80211_is_empty_essid(ssid_info->data, ssid_len); ++ list_for_each_entry(network, &ieee->network_list, list) { ++ if (!memcmp(network->bssid, new_beacon->header.addr3, + ETH_ALEN)) { +- list_del(&beacon->list); +- list_add_tail(&beacon->list, &ieee->beacon_free_list); ++ list_del(&network->list); ++ list_add_tail(&network->list, &ieee->network_free_list); + break; + } + } + +- if (list_empty(&ieee->beacon_free_list)) { +- IEEE80211_DEBUG_INFO("TODO: Expire oldest beacon to add new.\n"); +- IEEE80211_WARNING("%s: Beacon free list is empty.\n", ++ if (list_empty(&ieee->network_free_list)) { ++ IEEE80211_DEBUG_INFO("TODO: Expire oldest network to add new.\n"); ++ IEEE80211_WARNING("%s: Network free list is empty.\n", + ieee->dev->name); + } else +- ieee80211_beacon_add(ieee, new_beacon, stats); ++ ieee80211_network_add(ieee, new_beacon, stats); + + IEEE80211_DEBUG_SCAN("exit\n"); + } +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_tx.c y/drivers/net/wireless/ieee80211/ieee80211_tx.c +--- x/drivers/net/wireless/ieee80211/ieee80211_tx.c 2004-09-30 20:53:28.000000000 +1000 ++++ y/drivers/net/wireless/ieee80211/ieee80211_tx.c 2004-09-30 20:53:37.000000000 +1000 +@@ -155,7 +155,7 @@ + return SNAP_SIZE + sizeof(u16); + } + +-#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) ++#ifdef CONFIG_IEEE80211_CRYPT + static inline int ieee80211_encrypt_fragment( + struct ieee80211_device *ieee, + struct sk_buff *frag, +@@ -163,20 +163,20 @@ + { + struct ieee80211_crypt_data* crypt = ieee->crypt[ieee->tx_keyidx]; + int res; ++#ifdef CONFIG_IEEE80211_WPA ++ struct ieee80211_hdr *header; + +-#ifdef NOT_YET + if (ieee->tkip_countermeasures && + crypt && crypt->ops && strcmp(crypt->ops->name, "TKIP") == 0) { +- hdr = (struct ieee80211_hdr *) skb->data; ++ header = (struct ieee80211_hdr *) frag->data; + if (net_ratelimit()) { + printk(KERN_DEBUG "%s: TKIP countermeasures: dropped " + "TX packet to " MACSTR "\n", +- ieee->dev->name, MAC2STR(hdr->addr1)); ++ ieee->dev->name, MAC2STR(header->addr1)); + } +- return NULL; ++ return -1; + } + #endif +- + /* To encrypt, frame format is: + * IV (4 bytes), clear payload (including SNAP), ICV (4 bytes) */ + +@@ -202,6 +202,7 @@ + } + #endif + ++ + void ieee80211_txb_free(struct ieee80211_txb *txb) { + int i; + if (unlikely(!txb)) +@@ -216,7 +217,7 @@ + int gfp_mask) { + struct ieee80211_txb *txb; + int i; +- txb = (struct ieee80211_txb *)kmalloc( ++ txb = kmalloc( + sizeof(struct ieee80211_txb) + (sizeof(u8*) * nr_frags), + gfp_mask); + if (!txb) +@@ -253,9 +254,10 @@ + int ether_type, encrypt; + int size, fc, hdr_len; + struct sk_buff *skb_frag; +- struct ieee80211_hdr *header; ++ struct ieee80211_hdr header; ++ u8 addr1[ETH_ALEN], addr2[ETH_ALEN]; + +-#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) ++#ifdef CONFIG_IEEE80211_CRYPT + struct ieee80211_crypt_data* crypt; + #endif + +@@ -269,10 +271,29 @@ + + ether_type = ntohs(((struct ethhdr *)skb->data)->h_proto); + +-#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) ++#ifdef CONFIG_IEEE80211_CRYPT + crypt = ieee->crypt[ieee->tx_keyidx]; +- encrypt = (ieee->host_encrypt && ether_type != ETH_P_PAE && +- crypt && crypt->ops); ++ encrypt = (ieee->host_encrypt && crypt && crypt->ops); ++#ifdef CONFIG_IEEE80211_WPA ++ if (encrypt && ether_type == ETH_P_PAE && ieee->pass_unencrypted_eapol) ++ encrypt = 0; ++ ++ /* Save source and destination addresses */ ++ if (encrypt){ ++ memcpy(&addr1, skb->data, ETH_ALEN); ++ memcpy(&addr2, skb->data+ETH_ALEN, ETH_ALEN); ++ } else if (ieee->drop_unencrypted && ether_type != ETH_P_PAE){ ++ if (net_ratelimit()) { ++ printk(KERN_DEBUG "%s: dropped unencrypted TX data " ++ "frame (drop_unencrypted=1)\n", ++ ieee->dev->name); ++ } ++ stats->tx_dropped++; ++ goto tx_dropped; ++ } ++ ++#endif /* CONFIG_IEEE80211_WPA */ ++ + #else + encrypt = 0; + #endif +@@ -287,7 +308,7 @@ + + /* Determine amount of data per fragment */ + payload_size = ieee->fts; +-#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) ++#ifdef CONFIG_IEEE80211_CRYPT + if (encrypt) + payload_size -= crypt->ops->extra_prefix_len + + crypt->ops->extra_postfix_len; +@@ -315,20 +336,36 @@ + for (i = 0; i < nr_frags; i++) { + skb_frag = txb->fragments[i]; + +-#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) ++#ifdef CONFIG_IEEE80211_CRYPT + if (encrypt) + skb_reserve(skb_frag, crypt->ops->extra_prefix_len); + #endif + +- if (!ieee->tx_payload_only) { +- header = (struct ieee80211_hdr *) +- skb_put(skb_frag, sizeof(struct ieee80211_hdr)); +- +- printk(KERN_DEBUG "%s: TODO -- implement 802.11 " +- "header construction...\n", ieee->dev->name); +- +- fc = le16_to_cpu(header->frame_ctl); +- hdr_len = ieee80211_get_hdrlen(fc); ++ if ((!ieee->tx_payload_only) || encrypt) { ++ ++ memset(&header, 0, sizeof (struct ieee80211_hdr)); ++ ++ fc = IEEE80211_FTYPE_DATA | ++ IEEE80211_STYPE_DATA | ++ IEEE80211_FCTL_WEP; ++ ++ if (ieee->iw_mode == IW_MODE_INFRA) { ++ fc |= IEEE80211_FCTL_TODS; ++ /* To DS: Addr1 = BSSID, Addr2 = SA, ++ Addr3 = DA */ ++ memcpy(&header.addr1, ieee->bssid, ETH_ALEN); ++ memcpy(&header.addr2, &addr2, ETH_ALEN); ++ memcpy(&header.addr3, &addr1, ETH_ALEN); ++ } else if (ieee->iw_mode == IW_MODE_ADHOC) { ++ /* not From/To DS: Addr1 = DA, Addr2 = SA, ++ Addr3 = BSSID */ ++ memcpy(&header.addr1, addr1, ETH_ALEN); ++ memcpy(&header.addr2, addr2, ETH_ALEN); ++ memcpy(&header.addr3, ieee->bssid, ETH_ALEN); ++ } ++ header.frame_ctl=cpu_to_le16(fc); ++ hdr_len = ieee80211_get_hdrlen(fc); ++ memcpy(skb_put(skb_frag, hdr_len), &header, hdr_len); + } else + hdr_len = 0; + +@@ -347,15 +384,17 @@ + /* Advance the SKB... */ + skb_pull(skb, size); + +-#if defined(CONFIG_IEEE80211_CRYPT) || defined(CONFIG_IEEE80211_CRYPT_MODULE) ++#ifdef CONFIG_IEEE80211_CRYPT + /* Encryption routine will move the header forward in order + * to insert the IV between the header and the payload */ +- if (encrypt) ++ if (encrypt) { + ieee80211_encrypt_fragment(ieee, skb_frag, hdr_len); ++ skb_pull(skb_frag, hdr_len); ++ } + #endif + } + stats->tx_packets++; +- stats->tx_bytes += skb->len; ++ stats->tx_bytes += txb->payload_size; + + /* We are now done with the SKB provided to us */ + dev_kfree_skb_any(skb); +@@ -366,8 +405,13 @@ + + failed: + stats->tx_errors++; ++ ++#ifdef CONFIG_IEEE80211_WPA ++ tx_dropped: + spin_unlock_irqrestore(&ieee->lock, flags); ++#endif + return NULL; ++ + } + + EXPORT_SYMBOL(ieee80211_skb_to_txb); +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_wx.c y/drivers/net/wireless/ieee80211/ieee80211_wx.c +--- x/drivers/net/wireless/ieee80211/ieee80211_wx.c 2004-09-30 20:53:28.000000000 +1000 ++++ y/drivers/net/wireless/ieee80211/ieee80211_wx.c 2004-09-30 20:53:37.000000000 +1000 +@@ -35,34 +35,71 @@ + #include + + #include "ieee80211.h" ++static const char ieee80211_modes[] = { ++ 'a', 'b', 'g', '?' ++}; + +-static inline char *ieee80211_translate_scan(char *start, char *stop, +- struct ieee80211_beacon *beacon) ++#if 0 ++static u32 ieee80211_frequency(u8 channel, u8 mode) + { ++ if (mode == IEEE_A) { ++ if (channel >= 8 && channel <= 161) ++ return 5000000 + 5000 * channel; ++ ++ if (channel >= 240 && channel <= 252) ++ return 4960000 + 5000 * (channel - 240); ++ } ++ ++ if (channel == 14) ++ return 2484000; ++ ++ if (channel >= 1 && channel <= 13) ++ return 2407000 + 5000 * channel; ++ ++ return 0; ++} ++#endif ++ ++#define MAX_CUSTOM_LEN 64 ++static inline char *ipw2100_translate_scan(struct ieee80211_device *ieee, ++ char *start, char *stop, ++ struct ieee80211_network *network) ++{ ++ char custom[MAX_CUSTOM_LEN]; ++ char *p; + struct iw_event iwe; +- int i; ++ int i, j; ++ u8 max_rate, rate; + + /* First entry *MUST* be the AP MAC address */ + iwe.cmd = SIOCGIWAP; + iwe.u.ap_addr.sa_family = ARPHRD_ETHER; +- memcpy(iwe.u.ap_addr.sa_data, beacon->bssid, ETH_ALEN); ++ memcpy(iwe.u.ap_addr.sa_data, network->bssid, ETH_ALEN); + start = iwe_stream_add_event(start, stop, &iwe, IW_EV_ADDR_LEN); + + /* Remaining entries will be displayed in the order we provide them */ + + /* Add the ESSID */ +- iwe.u.data.length = beacon->ssid_len; +- if (iwe.u.data.length > 32) +- iwe.u.data.length = 32; + iwe.cmd = SIOCGIWESSID; + iwe.u.data.flags = 1; +- start = iwe_stream_add_point(start, stop, &iwe, beacon->ssid); ++ if (network->flags & NETWORK_EMPTY_ESSID) { ++ iwe.u.data.length = sizeof(""); ++ start = iwe_stream_add_point(start, stop, &iwe, ""); ++ } else { ++ iwe.u.data.length = min(network->ssid_len, (u8)32); ++ start = iwe_stream_add_point(start, stop, &iwe, network->ssid); ++ } + ++ /* Add the protocol name */ ++ iwe.cmd = SIOCGIWNAME; ++ snprintf(iwe.u.name, IFNAMSIZ, "ieee 802.11%c", ieee80211_modes[network->mode]); ++ start = iwe_stream_add_event(start, stop, &iwe, IW_EV_CHAR_LEN); ++ + /* Add mode */ + iwe.cmd = SIOCGIWMODE; +- if (beacon->capability & ++ if (network->capability & + (WLAN_CAPABILITY_BSS | WLAN_CAPABILITY_IBSS)) { +- if (beacon->capability & WLAN_CAPABILITY_BSS) ++ if (network->capability & WLAN_CAPABILITY_BSS) + iwe.u.mode = IW_MODE_MASTER; + else + iwe.u.mode = IW_MODE_ADHOC; +@@ -71,40 +108,124 @@ + IW_EV_UINT_LEN); + } + +- /* Add frequency */ ++ /* Add frequency/channel */ + iwe.cmd = SIOCGIWFREQ; +- iwe.u.freq.m = beacon->channel; ++/* iwe.u.freq.m = ieee80211_frequency(network->channel, network->mode); ++ iwe.u.freq.e = 3; */ ++ iwe.u.freq.m = network->channel; + iwe.u.freq.e = 0; ++ iwe.u.freq.i = 0; + start = iwe_stream_add_event(start, stop, &iwe, IW_EV_FREQ_LEN); + +- /* Add rates */ ++ /* Add basic and extended rates */ ++ max_rate = 0; ++ p = custom; ++ p += snprintf(p, MAX_CUSTOM_LEN - (p - custom), " Rates (Mb/s): "); ++ for (i = 0, j = 0; i < network->rates_len; ) { ++ if (j < network->rates_ex_len && ++ ((network->rates_ex[j] & 0x7F) < ++ (network->rates[i] & 0x7F))) ++ rate = network->rates_ex[j++] & 0x7F; ++ else ++ rate = network->rates[i++] & 0x7F; ++ if (rate > max_rate) ++ max_rate = rate; ++ p += snprintf(p, MAX_CUSTOM_LEN - (p - custom), ++ "%d%s ", rate >> 1, (rate & 1) ? ".5" : ""); ++ } ++ for (; j < network->rates_ex_len; j++) { ++ rate = network->rates_ex[j] & 0x7F; ++ p += snprintf(p, MAX_CUSTOM_LEN - (p - custom), ++ "%d%s ", rate >> 1, (rate & 1) ? ".5" : ""); ++ if (rate > max_rate) ++ max_rate = rate; ++ } ++ + iwe.cmd = SIOCGIWRATE; + iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0; +- for (i = 0; i < beacon->rates_len; i++) { +- iwe.u.bitrate.value = (beacon->rates[i] & 0x7F) * 500000; +- start = iwe_stream_add_event(start, stop, &iwe, +- IW_EV_PARAM_LEN); +- } ++ iwe.u.bitrate.value = max_rate * 500000; ++ start = iwe_stream_add_event(start, stop, &iwe, ++ IW_EV_PARAM_LEN); ++ ++ iwe.cmd = IWEVCUSTOM; ++ iwe.u.data.length = p - custom; ++ if (iwe.u.data.length) ++ start = iwe_stream_add_point(start, stop, &iwe, custom); + ++#if 0 + /* Add quality statistics */ + /* TODO: Fix these values... */ + iwe.cmd = IWEVQUAL; +- iwe.u.qual.qual = beacon->stats.signal; +- iwe.u.qual.level = beacon->stats.rssi; +- iwe.u.qual.noise = beacon->stats.noise; +- iwe.u.qual.updated = 7; ++ iwe.u.qual.qual = network->stats.signal; ++ iwe.u.qual.level = network->stats.rssi; ++ iwe.u.qual.noise = network->stats.noise; ++ iwe.u.qual.updated = network->stats.mask & IEEE80211_STATMASK_WEMASK; + + start = iwe_stream_add_event(start, stop, &iwe, IW_EV_QUAL_LEN); ++#endif ++ iwe.cmd = IWEVCUSTOM; ++ p = custom; ++ ++ if (network->stats.mask & IEEE80211_STATMASK_RSSI) ++ p += snprintf(p, MAX_CUSTOM_LEN - (p - custom), ++ " RSSI: %-4d dBm ", ++ (s8)network->stats.rssi); ++ ++ if (network->stats.mask & IEEE80211_STATMASK_NOISE) ++ p += snprintf(p, MAX_CUSTOM_LEN - (p - custom), ++ " Noise: %-4d dBm ", ++ (s8)network->stats.noise); ++ ++ if (network->stats.mask & IEEE80211_STATMASK_SIGNAL) ++ p += snprintf(p, MAX_CUSTOM_LEN - (p - custom), ++ " Signal: %-4d dBm ", ++ (s8)network->stats.signal); ++ ++ iwe.u.data.length = p - custom; ++ if (iwe.u.data.length) ++ start = iwe_stream_add_point(start, stop, &iwe, custom); + + /* Add encryption capability */ + iwe.cmd = SIOCGIWENCODE; +- if (beacon->capability & WLAN_CAPABILITY_PRIVACY) ++ if (network->capability & WLAN_CAPABILITY_PRIVACY) + iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY; + else + iwe.u.data.flags = IW_ENCODE_DISABLED; + iwe.u.data.length = 0; +- start = iwe_stream_add_point(start, stop, &iwe, beacon->ssid); ++ start = iwe_stream_add_point(start, stop, &iwe, network->ssid); ++ ++#ifdef CONFIG_IEEE80211_WPA ++ if (ieee->wpa_enabled && network->wpa_ie_len){ ++ char buf[MAX_WPA_IE_LEN * 2 + 30]; ++ ++ u8 *p = buf; ++ p += sprintf(p, "wpa_ie="); ++ for (i = 0; i < network->wpa_ie_len; i++) { ++ p += sprintf(p, "%02x", network->wpa_ie[i]); ++ } ++ ++ memset(&iwe, 0, sizeof(iwe)); ++ iwe.cmd = IWEVCUSTOM; ++ iwe.u.data.length = strlen(buf); ++ start = iwe_stream_add_point(start, stop, &iwe, buf); ++ } + ++ if (ieee->wpa_enabled && network->rsn_ie_len){ ++ char buf[MAX_WPA_IE_LEN * 2 + 30]; ++ ++ u8 *p = buf; ++ p += sprintf(p, "rsn_ie="); ++ for (i = 0; i < network->rsn_ie_len; i++) { ++ p += sprintf(p, "%02x", network->rsn_ie[i]); ++ } ++ ++ memset(&iwe, 0, sizeof(iwe)); ++ iwe.cmd = IWEVCUSTOM; ++ iwe.u.data.length = strlen(buf); ++ start = iwe_stream_add_point(start, stop, &iwe, buf); ++ } ++ ++#endif /* CONFIG_IEEE80211_WPA */ + return start; + } + +@@ -112,7 +233,7 @@ + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) + { +- struct ieee80211_beacon *beacon; ++ struct ieee80211_network *network; + unsigned long flags; + + char *ev = extra; +@@ -123,11 +244,11 @@ + + spin_lock_irqsave(&ieee->lock, flags); + +- list_for_each_entry(beacon, &ieee->beacon_list, list) { ++ list_for_each_entry(network, &ieee->network_list, list) { + i++; + if (ieee->scan_age == 0 || +- beacon->last_scanned + ieee->scan_age >= ieee->scans) +- ev = ieee80211_translate_scan(ev, stop, beacon); ++ network->last_scanned + ieee->scan_age >= ieee->scans) ++ ev = ipw2100_translate_scan(ieee, ev, stop, network); + } + + spin_unlock_irqrestore(&ieee->lock, flags); +@@ -135,7 +256,7 @@ + wrqu->data.length = ev - extra; + wrqu->data.flags = 0; + +- IEEE80211_DEBUG_WX("exit: %d beacons returned.\n", i); ++ IEEE80211_DEBUG_WX("exit: %d networks returned.\n", i); + + return 0; + } +@@ -145,7 +266,7 @@ + union iwreq_data *wrqu, char *keybuf) + { + struct iw_point *erq = &(wrqu->encoding); +-#if !defined(CONFIG_IEEE80211_CRYPT) && !defined(CONFIG_IEEE80211_CRYPT_MODULE) ++#ifndef CONFIG_IEEE80211_CRYPT + if (erq->flags & IW_ENCODE_DISABLED) + return 0; + return -EOPNOTSUPP; +@@ -193,8 +314,8 @@ + struct ieee80211_crypt_data *new_crypt; + + /* take WEP into use */ +- new_crypt = (struct ieee80211_crypt_data *) +- kmalloc(sizeof(struct ieee80211_crypt_data), GFP_KERNEL); ++ new_crypt = kmalloc(sizeof(struct ieee80211_crypt_data), ++ GFP_KERNEL); + if (new_crypt == NULL) + return -ENOMEM; + memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); +@@ -203,8 +324,10 @@ + request_module("ieee80211_crypt_wep"); + new_crypt->ops = ieee80211_get_crypto_ops("WEP"); + } +- if (new_crypt->ops) ++ ++ if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) + new_crypt->priv = new_crypt->ops->init(key); ++ + if (!new_crypt->ops || !new_crypt->priv) { + kfree(new_crypt); + new_crypt = NULL; +@@ -273,11 +396,13 @@ + } + + int ieee80211_wx_get_encode(struct ieee80211_device *ieee, +- struct iw_request_info *info, +- union iwreq_data *wrqu, char *key) ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *key) + { + struct iw_point *erq = &(wrqu->encoding); +-#if !defined(CONFIG_IEEE80211_CRYPT) && !defined(CONFIG_IEEE80211_CRYPT_MODULE) ++#ifndef CONFIG_IEEE80211_CRYPT ++ printk(KERN_WARNING "%s: Encryption requested but not enabled in " ++ "build.\n", ieee->dev->name); + erq->length = 0; + erq->flags = IW_ENCODE_DISABLED; + return 0; --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/ieee80211-4.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/ieee80211-4.dpatch @@ -0,0 +1,246 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Updated IEEE80211 layer from ipw2200 0.11. +## DP: Patch author: Intel Corporation +## DP: Upstream status: unknown + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN x/drivers/net/wireless/Kconfig y/drivers/net/wireless/Kconfig +--- x/drivers/net/wireless/Kconfig 2004-09-30 21:01:44.000000000 +1000 ++++ y/drivers/net/wireless/Kconfig 2004-10-04 11:08:23.000000000 +1000 +@@ -141,6 +141,32 @@ + tristate "Generic IEEE 802.11 Networking Stack" + depends on NET_RADIO + ++config IEEE80211_DEBUG ++ bool "Enable full debugging output" ++ depends on IEEE80211 ++ ---help--- ++ This option will enable debug tracing output for the ++ ieee80211 network stack. ++ ++ This will result in the kernel module being ~70k larger. You ++ can control which debug output is sent to the kernel log by ++ setting the value in ++ ++ /proc/net/ieee80211/debug_level ++ ++ For example: ++ ++ % echo 0x00000FFO > /sys/bus/pci/drivers/ipw2200/debug_level ++ ++ For a list of values you can assign to debug_level, simply perform: ++ ++ % . idvals ++ ++ From within drivers/net/wireless/ipw2200 ++ ++ If you are not trying to debug or develop the IPW2200 driver, you ++ most likely want to say N here. ++ + config IEEE80211_CRYPT + tristate "IEEE 802.11 encryption" + depends on IEEE80211 +diff -urN x/drivers/net/wireless/ieee80211/ieee80211.h y/drivers/net/wireless/ieee80211/ieee80211.h +--- x/drivers/net/wireless/ieee80211/ieee80211.h 2004-09-30 20:53:37.000000000 +1000 ++++ y/drivers/net/wireless/ieee80211/ieee80211.h 2004-10-04 11:02:13.000000000 +1000 +@@ -264,13 +264,11 @@ + #define IEEE80211_STATMASK_WEMASK 0x7 + + +-#define IEEE80211_CCK_MODULATION 0 +-#define IEEE80211_OFDM_MODULATION 1 +-#define IEEE80211_MIXED_MODULATION 2 +- +-#define IEEE80211_24GHZ_BAND 0 +-#define IEEE80211_52GHZ_BAND 1 +-#define IEEE80211_MIXED_BAND 2 ++#define IEEE80211_CCK_MODULATION BIT(0) ++#define IEEE80211_OFDM_MODULATION BIT(1) ++ ++#define IEEE80211_24GHZ_BAND BIT(0) ++#define IEEE80211_52GHZ_BAND BIT(1) + + #define IEEE80211_CCK_RATE_1MB 0x02 + #define IEEE80211_CCK_RATE_2MB 0x04 +@@ -708,27 +706,27 @@ + } + + +-extern inline int ieee80211_check_mode(struct ieee80211_device *ieee, int mode) ++extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode) + { +- int rc = 0; ++ int rc = 1; + switch(mode) { + case IEEE_A: +- if (ieee->modulation == IEEE80211_CCK_MODULATION || +- ieee->freq_band == IEEE80211_24GHZ_BAND) +- rc = 1; ++ if (!(ieee->modulation & IEEE80211_OFDM_MODULATION) || ++ !(ieee->freq_band & IEEE80211_52GHZ_BAND)) ++ rc = 0; + break; ++ + case IEEE_B: +- if (ieee->modulation == IEEE80211_OFDM_MODULATION || +- ieee->freq_band == IEEE80211_52GHZ_BAND) +- rc = 1; ++ if (!(ieee->modulation & IEEE80211_CCK_MODULATION) || ++ !(ieee->freq_band & IEEE80211_24GHZ_BAND)) ++ rc = 0; + break; ++ + case IEEE_G: +- if (ieee->modulation == IEEE80211_CCK_MODULATION || +- ieee->freq_band == IEEE80211_52GHZ_BAND) +- rc = 1; ++ if (!(ieee->modulation & IEEE80211_OFDM_MODULATION) || ++ !(ieee->freq_band & IEEE80211_24GHZ_BAND)) ++ rc = 0; + break; +- default: +- rc = 1; + } + return rc; + } +@@ -811,4 +809,22 @@ + { + return ieee->scans; + } ++ ++static inline const char *escape_essid(const char *essid, u8 essid_len) { ++ static char escaped[IW_ESSID_MAX_SIZE * 2 + 1]; ++ const char *s = essid; ++ char *d = escaped; ++ essid_len = min(essid_len, (u8)IW_ESSID_MAX_SIZE); ++ while (essid_len--) { ++ if (*s == '\0') { ++ *d++ = '\\'; ++ *d++ = '0'; ++ s++; ++ } else { ++ *d++ = *s++; ++ } ++ } ++ *d = '\0'; ++ return escaped; ++} + #endif /* IEEE80211_H */ +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_module.c y/drivers/net/wireless/ieee80211/ieee80211_module.c +--- x/drivers/net/wireless/ieee80211/ieee80211_module.c 2004-09-30 20:53:37.000000000 +1000 ++++ y/drivers/net/wireless/ieee80211/ieee80211_module.c 2004-10-04 11:02:13.000000000 +1000 +@@ -57,9 +57,7 @@ + MODULE_AUTHOR("Copyright (C) 2004 Intel Corporation "); + MODULE_LICENSE("GPL"); + +-#ifdef CONFIG_IEEE80211_DEBUG +-u32 ieee80211_debug_level = 0; +-#endif ++#define DRV_NAME "ieee80211" + + static inline int ieee80211_networks_allocate(struct ieee80211_device *ieee) + { +@@ -168,5 +166,86 @@ + kfree(ieee); + } + ++#ifdef CONFIG_IEEE80211_DEBUG ++ ++static int debug = 0; ++u32 ieee80211_debug_level = 0; ++struct proc_dir_entry *ieee80211_proc = NULL; ++ ++static int show_debug_level(char *page, char **start, off_t offset, ++ int count, int *eof, void *data) ++{ ++ return snprintf(page, count, "0x%08X\n", ieee80211_debug_level); ++} ++ ++static int store_debug_level(struct file *file, const char *buffer, ++ unsigned long count, void *data) ++{ ++ char buf[] = "0x00000000"; ++ unsigned long len = min(sizeof(buf) - 1, (u32)count); ++ char *p = (char *)buf; ++ unsigned long val; ++ ++ if (copy_from_user(buf, buffer, len)) ++ return count; ++ buf[len] = 0; ++ if (p[1] == 'x' || p[1] == 'X' || p[0] == 'x' || p[0] == 'X') { ++ p++; ++ if (p[0] == 'x' || p[0] == 'X') ++ p++; ++ val = simple_strtoul(p, &p, 16); ++ } else ++ val = simple_strtoul(p, &p, 10); ++ if (p == buf) ++ printk(KERN_INFO DRV_NAME ++ ": %s is not in hex or decimal form.\n", buf); ++ else ++ ieee80211_debug_level = val; ++ ++ return strnlen(buf, count); ++} ++ ++static int __init ieee80211_init(void) ++{ ++ struct proc_dir_entry *e; ++ ++ ieee80211_debug_level = debug; ++ ieee80211_proc = create_proc_entry(DRV_NAME, S_IFDIR, proc_net); ++ if (ieee80211_proc == NULL) { ++ IEEE80211_ERROR("Unable to create " DRV_NAME ++ " proc directory\n"); ++ return -EIO; ++ } ++ e = create_proc_entry("debug_level", S_IFREG | S_IRUGO | S_IWUSR, ++ ieee80211_proc); ++ if (!e) { ++ remove_proc_entry(DRV_NAME, proc_net); ++ ieee80211_proc = NULL; ++ return -EIO; ++ } ++ e->read_proc = show_debug_level; ++ e->write_proc = store_debug_level; ++ e->data = NULL; ++ ++ return 0; ++} ++ ++static void __exit ieee80211_exit(void) ++{ ++ if (ieee80211_proc) { ++ remove_proc_entry("debug_level", ieee80211_proc); ++ remove_proc_entry(DRV_NAME, proc_net); ++ ieee80211_proc = NULL; ++ } ++} ++ ++module_param(debug, int, 0444); ++MODULE_PARM_DESC(debug, "debug output mask"); ++ ++ ++module_exit(ieee80211_exit); ++module_init(ieee80211_init); ++#endif ++ + EXPORT_SYMBOL(ieee80211_alloc); + EXPORT_SYMBOL(ieee80211_free); +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_rx.c y/drivers/net/wireless/ieee80211/ieee80211_rx.c +--- x/drivers/net/wireless/ieee80211/ieee80211_rx.c 2004-09-30 20:53:37.000000000 +1000 ++++ y/drivers/net/wireless/ieee80211/ieee80211_rx.c 2004-10-04 11:02:13.000000000 +1000 +@@ -1024,7 +1024,7 @@ + + ssid_info = &new_beacon->info_element; + if (ssid_info->id != MFIE_TYPE_SSID) { +- IEEE80211_DEBUG(IPW_DL_INFO | IPW_DL_SCAN, ++ IEEE80211_DEBUG(IEEE80211_DL_INFO | IEEE80211_DL_SCAN, + "invalid MFIE type for SSID: %d\n", + ssid_info->id); + return; --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/ieee80211.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/ieee80211.dpatch @@ -0,0 +1,3922 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Generic IEEE80211 layer from ipw2100. +## DP: Patch author: Intel Corporation +## DP: Upstream status: unknown + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN x/drivers/net/wireless/Kconfig u/drivers/net/wireless/Kconfig +--- x/drivers/net/wireless/Kconfig 2004-08-28 11:29:38.000000000 +1000 ++++ u/drivers/net/wireless/Kconfig 2004-08-28 11:29:52.000000000 +1000 +@@ -137,6 +137,24 @@ + comment "Wireless 802.11b ISA/PCI cards support" + depends on NET_RADIO && (ISA || PCI || PPC_PMAC || PCMCIA) + ++config IEEE80211 ++ tristate ++ depends on NET_RADIO ++ default n ++ ++config IEEE80211_CRYPT ++ tristate ++ depends on IEEE80211 ++ select CRYPTO ++ select CRYPTO_ARC4 ++ select CRC32 ++ default n ++ ++config IEEE80211_CRYPT_WEP ++ tristate ++ depends on IEEE80211_CRYPT ++ default n ++ + config AIRO + tristate "Cisco/Aironet 34X/35X/4500/4800 ISA and PCI cards" + depends on NET_RADIO && ISA && (PCI || BROKEN) +diff -urN x/drivers/net/wireless/Makefile u/drivers/net/wireless/Makefile +--- x/drivers/net/wireless/Makefile 2004-08-28 11:29:38.000000000 +1000 ++++ u/drivers/net/wireless/Makefile 2004-08-28 11:29:47.000000000 +1000 +@@ -1,6 +1,7 @@ + # + # Makefile for the Linux Wireless network device drivers. + # ++obj-$(CONFIG_IEEE80211) += ieee80211/ + + obj-$(CONFIG_STRIP) += strip.o + obj-$(CONFIG_ARLAN) += arlan.o +diff -urN x/drivers/net/wireless/ieee80211/Makefile u/drivers/net/wireless/ieee80211/Makefile +--- x/drivers/net/wireless/ieee80211/Makefile 1970-01-01 10:00:00.000000000 +1000 ++++ u/drivers/net/wireless/ieee80211/Makefile 2004-08-28 11:29:47.000000000 +1000 +@@ -0,0 +1,15 @@ ++ieee80211-objs := \ ++ ieee80211_module.o \ ++ ieee80211_tx.o \ ++ ieee80211_rx.o \ ++ ieee80211_wx.o ++ ++obj-$(CONFIG_IEEE80211) += ieee80211.o ++obj-$(CONFIG_IEEE80211_CRYPT) += ieee80211_crypt.o ++obj-$(CONFIG_IEEE80211_CRYPT_WEP) += ieee80211_crypt_wep.o ++obj-$(CONFIG_IEEE80211_CRYPT_WPA) += ieee80211_crypt_ccmp.o ++obj-$(CONFIG_IEEE80211_CRYPT_WPA) += ieee80211_crypt_tkip.o ++ ++# We have to add drivers/net/wireless until ieee802_11.h is in the default ++# include path ++EXTRA_CFLAGS += -I$(TOPDIR)/drivers/net/wireless +diff -urN x/drivers/net/wireless/ieee80211/ieee80211.h u/drivers/net/wireless/ieee80211/ieee80211.h +--- x/drivers/net/wireless/ieee80211/ieee80211.h 1970-01-01 10:00:00.000000000 +1000 ++++ u/drivers/net/wireless/ieee80211/ieee80211.h 2004-08-28 11:29:47.000000000 +1000 +@@ -0,0 +1,489 @@ ++/* ++ * Original code based on Host AP (software wireless LAN access point) driver ++ * for Intersil Prism2/2.5/3. ++ * ++ * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen ++ * ++ * Copyright (c) 2002-2003, Jouni Malinen ++ * ++ * Adaption to a generic IEEE 802.11 stack by James Ketrenos ++ * ++ * ++ * Copyright (c) 2004, Intel Corporation ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. See README and COPYING for ++ * more details. ++ */ ++#ifndef IEEE80211_H ++#define IEEE80211_H ++ ++#include ++#include ++ ++#ifndef WIRELESS_SPY ++#define WIRELESS_SPY // enable iwspy support ++#endif ++#include // new driver API ++ ++#define BIT(x) (1 << (x)) ++ ++#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5] ++#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x" ++ ++ ++#ifndef ETH_P_PAE ++#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */ ++#endif /* ETH_P_PAE */ ++ ++#define ETH_P_PREAUTH 0x88C7 /* IEEE 802.11i pre-authentication */ ++ ++#ifndef ETH_P_80211_RAW ++#define ETH_P_80211_RAW (ETH_P_ECONET + 1) ++#endif ++ ++/* IEEE 802.11 defines */ ++ ++#include "ieee802_11.h" ++ ++#define P80211_OUI_LEN 3 ++ ++struct ieee80211_snap_hdr { ++ ++ u8 dsap; /* always 0xAA */ ++ u8 ssap; /* always 0xAA */ ++ u8 ctrl; /* always 0x03 */ ++ u8 oui[P80211_OUI_LEN]; /* organizational universal id */ ++ ++} __attribute__ ((packed)); ++ ++#define SNAP_SIZE sizeof(struct ieee80211_snap_hdr) ++ ++#define WLAN_FC_GET_TYPE(fc) ((fc) & IEEE802_11_FCTL_FTYPE) ++#define WLAN_FC_GET_STYPE(fc) ((fc) & IEEE802_11_FCTL_STYPE) ++ ++#define WLAN_GET_SEQ_FRAG(seq) ((seq) & IEEE802_11_SCTL_FRAG) ++#define WLAN_GET_SEQ_SEQ(seq) ((seq) & IEEE802_11_SCTL_SEQ) ++ ++/* Authentication algorithms */ ++#define WLAN_AUTH_OPEN 0 ++#define WLAN_AUTH_SHARED_KEY 1 ++ ++#define WLAN_AUTH_CHALLENGE_LEN 128 ++ ++#define WLAN_CAPABILITY_BSS BIT(0) ++#define WLAN_CAPABILITY_IBSS BIT(1) ++#define WLAN_CAPABILITY_CF_POLLABLE BIT(2) ++#define WLAN_CAPABILITY_CF_POLL_REQUEST BIT(3) ++#define WLAN_CAPABILITY_PRIVACY BIT(4) ++#define WLAN_CAPABILITY_SHORT_PREAMBLE BIT(5) ++#define WLAN_CAPABILITY_PBCC BIT(6) ++#define WLAN_CAPABILITY_CHANNEL_AGILITY BIT(7) ++ ++/* Status codes */ ++#define WLAN_STATUS_SUCCESS 0 ++#define WLAN_STATUS_UNSPECIFIED_FAILURE 1 ++#define WLAN_STATUS_CAPS_UNSUPPORTED 10 ++#define WLAN_STATUS_REASSOC_NO_ASSOC 11 ++#define WLAN_STATUS_ASSOC_DENIED_UNSPEC 12 ++#define WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG 13 ++#define WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION 14 ++#define WLAN_STATUS_CHALLENGE_FAIL 15 ++#define WLAN_STATUS_AUTH_TIMEOUT 16 ++#define WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA 17 ++#define WLAN_STATUS_ASSOC_DENIED_RATES 18 ++/* 802.11b */ ++#define WLAN_STATUS_ASSOC_DENIED_NOSHORT 19 ++#define WLAN_STATUS_ASSOC_DENIED_NOPBCC 20 ++#define WLAN_STATUS_ASSOC_DENIED_NOAGILITY 21 ++ ++/* Reason codes */ ++#define WLAN_REASON_UNSPECIFIED 1 ++#define WLAN_REASON_PREV_AUTH_NOT_VALID 2 ++#define WLAN_REASON_DEAUTH_LEAVING 3 ++#define WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY 4 ++#define WLAN_REASON_DISASSOC_AP_BUSY 5 ++#define WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA 6 ++#define WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA 7 ++#define WLAN_REASON_DISASSOC_STA_HAS_LEFT 8 ++#define WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH 9 ++ ++ ++/* Information Element IDs */ ++#define WLAN_EID_SSID 0 ++#define WLAN_EID_SUPP_RATES 1 ++#define WLAN_EID_FH_PARAMS 2 ++#define WLAN_EID_DS_PARAMS 3 ++#define WLAN_EID_CF_PARAMS 4 ++#define WLAN_EID_TIM 5 ++#define WLAN_EID_IBSS_PARAMS 6 ++#define WLAN_EID_CHALLENGE 16 ++#define WLAN_EID_RSN 48 ++#define WLAN_EID_GENERIC 221 ++ ++#define IEEE80211_MGMT_HDR_LEN 24 ++#define IEEE80211_DATA_HDR3_LEN 24 ++#define IEEE80211_DATA_HDR4_LEN 30 ++ ++ ++struct ieee80211_hdr { ++ u16 frame_control; ++ u16 duration_id; ++ u8 addr1[6]; ++ u8 addr2[6]; ++ u8 addr3[6]; ++ u16 seq_ctrl; ++ u8 addr4[6]; ++} __attribute__ ((packed)); ++ ++/* NOTE: This data is for statistical purposes; not all hardware provides this ++ * information for frames received. Not setting these will not cause ++ * any adverse affects. */ ++struct ieee80211_rx_stats { ++ u32 mac_time; ++ u8 rssi; ++ u8 signal; ++ u8 noise; ++ u16 rate; /* in 100 kbps */ ++}; ++ ++/* IEEE 802.11 requires that STA supports concurrent reception of at least ++ * three fragmented frames. This define can be increased to support more ++ * concurrent frames, but it should be noted that each entry can consume about ++ * 2 kB of RAM and increasing cache size will slow down frame reassembly. */ ++#define IEEE80211_FRAG_CACHE_LEN 4 ++ ++struct ieee80211_frag_entry { ++ unsigned long first_frag_time; ++ unsigned int seq; ++ unsigned int last_frag; ++ struct sk_buff *skb; ++ u8 src_addr[ETH_ALEN]; ++ u8 dst_addr[ETH_ALEN]; ++}; ++ ++struct ieee80211_stats { ++ unsigned int tx_unicast_frames; ++ unsigned int tx_multicast_frames; ++ unsigned int tx_fragments; ++ unsigned int tx_unicast_octets; ++ unsigned int tx_multicast_octets; ++ unsigned int tx_deferred_transmissions; ++ unsigned int tx_single_retry_frames; ++ unsigned int tx_multiple_retry_frames; ++ unsigned int tx_retry_limit_exceeded; ++ unsigned int tx_discards; ++ unsigned int rx_unicast_frames; ++ unsigned int rx_multicast_frames; ++ unsigned int rx_fragments; ++ unsigned int rx_unicast_octets; ++ unsigned int rx_multicast_octets; ++ unsigned int rx_fcs_errors; ++ unsigned int rx_discards_no_buffer; ++ unsigned int tx_discards_wrong_sa; ++ unsigned int rx_discards_wep_undecryptable; ++ unsigned int rx_message_in_msg_fragments; ++ unsigned int rx_message_in_bad_msg_fragments; ++}; ++ ++struct ieee80211_device; ++ ++#include "ieee80211_crypt.h" ++ ++#define SEC_KEY_1 BIT(0) ++#define SEC_KEY_2 BIT(1) ++#define SEC_KEY_3 BIT(2) ++#define SEC_KEY_4 BIT(3) ++#define SEC_ACTIVE_KEY BIT(4) ++#define SEC_AUTH_MODE BIT(5) ++#define SEC_UNICAST_GROUP BIT(6) ++#define SEC_LEVEL BIT(7) ++#define SEC_ENABLED BIT(8) ++ ++#define SEC_LEVEL_0 0 /* None */ ++#define SEC_LEVEL_1 1 /* WEP 40 and 104 bit */ ++#define SEC_LEVEL_2 2 /* Level 1 + TKIP */ ++#define SEC_LEVEL_2_CKIP 3 /* Level 1 + CKIP */ ++#define SEC_LEVEL_3 4 /* Level 2 + CCMP */ ++ ++#define WEP_KEYS 4 ++#define WEP_KEY_LEN 13 ++ ++struct ieee80211_security { ++ u16 active_key:1, ++ enabled:1, ++ auth_mode:2, ++ auth_algo:4, ++ unicast_uses_group:1; ++ u8 key_sizes[WEP_KEYS]; ++ u8 keys[WEP_KEYS][WEP_KEY_LEN]; ++ u8 level; ++ u16 flags; ++} __attribute__ ((packed)); ++ ++ ++/* ++ ++ 802.11 data frame from AP ++ ++ ,-------------------------------------------------------------------. ++Bytes | 2 | 2 | 6 | 6 | 6 | 2 | 0..2312 | 4 | ++ |------|------|---------|---------|---------|------|---------|------| ++Desc. | ctrl | dura | DA/RA | TA | SA | Sequ | frame | fcs | ++ | | tion | (BSSID) | | | ence | data | | ++ `-------------------------------------------------------------------' ++ ++Total: 28-2340 bytes ++ ++*/ ++ ++struct ieee80211_header_data { ++ u16 frame_control; ++ u16 duration_id; ++ u8 addr1[6]; ++ u8 addr2[6]; ++ u8 addr3[6]; ++ u16 seq_ctrl; ++}; ++ ++#define BEACON_PROBE_SSID_ID_POSITION 12 ++ ++/* Management Frame Information Element Types */ ++#define MFIE_TYPE_SSID 0 ++#define MFIE_TYPE_RATES 1 ++#define MFIE_TYPE_FH_SET 2 ++#define MFIE_TYPE_DS_SET 3 ++#define MFIE_TYPE_CF_SET 4 ++#define MFIE_TYPE_TIM 5 ++#define MFIE_TYPE_IBSS_SET 6 ++#define MFIE_TYPE_CHALLENGE 16 ++ ++struct ieee80211_info_element_hdr { ++ u8 id; ++ u8 len; ++} __attribute__ ((packed)); ++ ++struct ieee80211_info_element { ++ u8 id; ++ u8 len; ++ u8 data[0]; ++} __attribute__ ((packed)); ++ ++/* ++ * These are the data types that can make up management packets ++ * ++ u16 auth_algorithm; ++ u16 auth_sequence; ++ u16 beacon_interval; ++ u16 capability; ++ u8 current_ap[ETH_ALEN]; ++ u16 listen_interval; ++ struct { ++ u16 association_id:14, reserved:2; ++ } __attribute__ ((packed)); ++ u32 time_stamp[2]; ++ u16 reason; ++ u16 status; ++*/ ++ ++struct ieee80211_authentication { ++ struct ieee80211_header_data header; ++ u16 algorithm; ++ u16 transaction; ++ u16 status; ++ struct ieee80211_info_element info_element; ++} __attribute__ ((packed)); ++ ++ ++struct ieee80211_probe_response { ++ struct ieee80211_header_data header; ++ u32 time_stamp[2]; ++ u16 beacon_interval; ++ u16 capability; ++ struct ieee80211_info_element info_element; ++} __attribute__ ((packed)); ++ ++struct ieee80211_assoc_request_frame { ++ u16 capability; ++ u16 listen_interval; ++ u8 current_ap[ETH_ALEN]; ++ struct ieee80211_info_element info_element; ++} __attribute__ ((packed)); ++ ++struct ieee80211_helper_functions { ++ void (*set_security)(struct ieee80211_device *ieee, ++ struct ieee80211_security *sec); ++ ++ /* these functions are defined in hardware model specific files ++ * (hostap_{cs,plx,pci}.c */ ++ int (*card_present)(struct ieee80211_device *ieee); ++ void (*cor_sreset)(struct ieee80211_device *ieee); ++ int (*dev_open)(struct ieee80211_device *ieee); ++ int (*dev_close)(struct ieee80211_device *ieee); ++ void (*genesis_reset)(struct ieee80211_device *ieee, int hcr); ++ ++ ++ /* Turn on unencrypted packet filtering at the HW level */ ++ void (*set_unencrypted_filter)(struct ieee80211_device *ieee, int flag); ++ ++ /* the following functions are from hostap_hw.c, but they may have some ++ * hardware model specific code */ ++ ++ int (*hw_enable)(struct net_device *dev, int initial); ++ int (*hw_config)(struct net_device *dev, int initial); ++ void (*hw_reset)(struct net_device *dev); ++ void (*hw_shutdown)(struct net_device *dev, int no_disable); ++ int (*reset_port)(struct net_device *dev); ++ int (*tx)(struct sk_buff *skb, struct net_device *dev); ++ void (*schedule_reset)(struct ieee80211_device *ieee); ++ int (*tx_80211)(struct sk_buff *skb, struct net_device *dev); ++}; ++ ++ ++ ++/* SWEEP TABLE ENTRIES NUMBER*/ ++#define MAX_SWEEP_TAB_ENTRIES 42 ++#define MAX_SWEEP_TAB_ENTRIES_PER_PACKET 7 ++#define MAX_RATES_LENGTH ((u8)8) ++#define MAX_BEACON_COUNT 128 ++ ++#define CRC_LENGTH 4U ++ ++#define SSID_11B_RATE_1MB 0x0001 ++#define SSID_11B_RATE_2MB 0x0002 ++#define SSID_11B_RATE_5MB 0x0004 ++#define SSID_11B_RATE_11MB 0x0008 ++#define SSID_11B_RATE_22MB 0x0010 ++ ++struct ieee80211_beacon { ++ u8 bssid[ETH_ALEN]; ++ u8 ssid_len; ++ struct ieee80211_rx_stats stats; ++ u16 capability; ++ u8 channel; ++ u8 rates[MAX_RATES_LENGTH]; ++ u8 rates_len; ++ u32 last_scanned; ++ /* Ensure null-terminated for any debug msgs */ ++ u8 ssid[IW_ESSID_MAX_SIZE + 1]; ++ u32 time_stamp[2]; ++ u16 beacon_interval; ++ u16 listen_interval; ++ struct list_head list; ++}; ++ ++ ++struct ieee80211_device { ++ struct net_device *dev; ++ ++ /* Bookkeeping structures */ ++ struct net_device_stats stats; ++ struct ieee80211_stats ieee_stats; ++ void *priv; ++ ++ int iw_mode; /* operating mode (IW_MODE_*) */ ++ ++ spinlock_t lock; ++ ++ int tx_payload_only; /* set to 1 if HW only expects the Tx SKB ++ * to contain the payload (vs. a fully configured ++ * 802.11 header for a data frame) */ ++ int tx_headroom; /* Set to size of any additional room needed at front ++ * of allocated Tx SKBs */ ++ ++ /* WEP and other encryption related settings at the device level */ ++ int open_wep; /* Set to 1 to allow unencrypted frames */ ++ ++ int reset_on_keychange; /* Set to 1 if the HW needs to be reset on ++ * WEP key changes */ ++ ++ /* If the host performs {en,de}cryption, then set to 1 */ ++ int host_encrypt; ++ int host_decrypt; ++ ++ int ieee_802_1x; /* is IEEE 802.1X used */ ++ ++ struct list_head crypt_deinit_list; ++ struct ieee80211_crypt_data *crypt[WEP_KEYS]; ++ int tx_keyidx; /* default TX key index (crypt[tx_keyidx]) */ ++ struct timer_list crypt_deinit_timer; ++ ++ int bcrx_sta_key; /* use individual keys to override default keys even ++ * with RX of broad/multicast frames */ ++ ++ /* Fragmentation structures */ ++ struct ieee80211_frag_entry frag_cache[IEEE80211_FRAG_CACHE_LEN]; ++ unsigned int frag_next_idx; ++ u16 fts; /* Fragmentation Threshold */ ++ ++ /* Association info */ ++ u8 bssid[ETH_ALEN]; ++ ++ /* Callback vtable */ ++ struct ieee80211_helper_functions *func; ++ ++}; ++ ++ ++extern inline int ieee80211_get_hdrlen(u16 fc) ++{ ++ int hdrlen = 24; ++ ++ switch (WLAN_FC_GET_TYPE(fc)) { ++ case IEEE802_11_FTYPE_DATA: ++ if ((fc & IEEE802_11_FCTL_FROMDS) && (fc & IEEE802_11_FCTL_TODS)) ++ hdrlen = 30; /* Addr4 */ ++ break; ++ case IEEE802_11_FTYPE_CTL: ++ switch (WLAN_FC_GET_STYPE(fc)) { ++ case IEEE802_11_STYPE_CTS: ++ case IEEE802_11_STYPE_ACK: ++ hdrlen = 10; ++ break; ++ default: ++ hdrlen = 16; ++ break; ++ } ++ break; ++ } ++ ++ return hdrlen; ++} ++ ++/* ieee80211.c */ ++extern struct ieee80211_device * ieee80211_alloc(struct net_device *dev, ++ void *priv); ++extern void ieee80211_free(struct ieee80211_device *ieee); ++ ++extern int ieee80211_set_encryption(struct ieee80211_device *ieee); ++ ++/* ieee80211_tx.c */ ++ ++struct ieee80211_txb { ++ u8 nr_frags; ++ u8 encrypted; ++ u16 reserved; ++ u16 frag_size; ++ u16 payload_size; ++ struct sk_buff *fragments[0]; ++}; ++ ++extern struct ieee80211_txb *ieee80211_skb_to_txb(struct ieee80211_device *ieee, ++ struct sk_buff *skb); ++extern void ieee80211_txb_free(struct ieee80211_txb *); ++ ++ ++/* ieee80211_rx.c */ ++extern int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, ++ struct ieee80211_rx_stats *rx_stats); ++ ++/* iee80211_wx.c */ ++extern int ieee80211_wx_set_encode(struct ieee80211_device *ieee, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *key); ++extern int ieee80211_wx_get_encode(struct ieee80211_device *ieee, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *key); ++ ++#endif /* IEEE80211_H */ +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_crypt.c u/drivers/net/wireless/ieee80211/ieee80211_crypt.c +--- x/drivers/net/wireless/ieee80211/ieee80211_crypt.c 1970-01-01 10:00:00.000000000 +1000 ++++ u/drivers/net/wireless/ieee80211/ieee80211_crypt.c 2004-08-28 11:29:47.000000000 +1000 +@@ -0,0 +1,250 @@ ++/* ++ * Host AP crypto routines ++ * ++ * Copyright (c) 2002-2003, Jouni Malinen ++ * Portions Copyright (C) 2004, Intel Corporation ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. See README and COPYING for ++ * more details. ++ * ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "ieee80211.h" ++ ++MODULE_AUTHOR("Jouni Malinen"); ++MODULE_DESCRIPTION("HostAP crypto"); ++MODULE_LICENSE("GPL"); ++ ++struct ieee80211_crypto_alg { ++ struct list_head list; ++ struct ieee80211_crypto_ops *ops; ++}; ++ ++ ++struct ieee80211_crypto { ++ struct list_head algs; ++ spinlock_t lock; ++}; ++ ++static struct ieee80211_crypto *hcrypt; ++ ++void ieee80211_crypt_deinit_entries(struct ieee80211_device *ieee, ++ int force) ++{ ++ struct list_head *ptr, *n; ++ struct ieee80211_crypt_data *entry; ++ ++ for (ptr = ieee->crypt_deinit_list.next, n = ptr->next; ++ ptr != &ieee->crypt_deinit_list; ptr = n, n = ptr->next) { ++ entry = list_entry(ptr, struct ieee80211_crypt_data, list); ++ ++ if (atomic_read(&entry->refcnt) != 0 && !force) ++ continue; ++ ++ list_del(ptr); ++ ++ if (entry->ops) ++ entry->ops->deinit(entry->priv); ++ kfree(entry); ++ } ++} ++ ++void ieee80211_crypt_deinit_handler(unsigned long data) ++{ ++ struct ieee80211_device *ieee = (struct ieee80211_device *)data; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ieee->lock, flags); ++ ieee80211_crypt_deinit_entries(ieee, 0); ++ if (!list_empty(&ieee->crypt_deinit_list)) { ++ printk(KERN_DEBUG "%s: entries remaining in delayed crypt " ++ "deletion list\n", ieee->dev->name); ++ ieee->crypt_deinit_timer.expires = jiffies + HZ; ++ add_timer(&ieee->crypt_deinit_timer); ++ } ++ spin_unlock_irqrestore(&ieee->lock, flags); ++ ++} ++ ++void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, ++ struct ieee80211_crypt_data **crypt) ++{ ++ struct ieee80211_crypt_data *tmp; ++ unsigned long flags; ++ ++ if (*crypt == NULL) ++ return; ++ ++ tmp = *crypt; ++ *crypt = NULL; ++ ++ /* must not run ops->deinit() while there may be pending encrypt or ++ * decrypt operations. Use a list of delayed deinits to avoid needing ++ * locking. */ ++ ++ spin_lock_irqsave(&ieee->lock, flags); ++ list_add(&tmp->list, &ieee->crypt_deinit_list); ++ if (!timer_pending(&ieee->crypt_deinit_timer)) { ++ ieee->crypt_deinit_timer.expires = jiffies + HZ; ++ add_timer(&ieee->crypt_deinit_timer); ++ } ++ spin_unlock_irqrestore(&ieee->lock, flags); ++} ++ ++int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops) ++{ ++ unsigned long flags; ++ struct ieee80211_crypto_alg *alg; ++ ++ if (hcrypt == NULL) ++ return -1; ++ ++ alg = (struct ieee80211_crypto_alg *) kmalloc(sizeof(*alg), GFP_KERNEL); ++ if (alg == NULL) ++ return -ENOMEM; ++ ++ memset(alg, 0, sizeof(*alg)); ++ alg->ops = ops; ++ ++ spin_lock_irqsave(&hcrypt->lock, flags); ++ list_add(&alg->list, &hcrypt->algs); ++ spin_unlock_irqrestore(&hcrypt->lock, flags); ++ ++ printk(KERN_DEBUG "ieee80211_crypt: registered algorithm '%s'\n", ++ ops->name); ++ ++ return 0; ++} ++ ++int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops) ++{ ++ unsigned long flags; ++ struct list_head *ptr; ++ struct ieee80211_crypto_alg *del_alg = NULL; ++ ++ if (hcrypt == NULL) ++ return -1; ++ ++ spin_lock_irqsave(&hcrypt->lock, flags); ++ for (ptr = hcrypt->algs.next; ptr != &hcrypt->algs; ptr = ptr->next) { ++ struct ieee80211_crypto_alg *alg = ++ (struct ieee80211_crypto_alg *) ptr; ++ if (alg->ops == ops) { ++ list_del(&alg->list); ++ del_alg = alg; ++ break; ++ } ++ } ++ spin_unlock_irqrestore(&hcrypt->lock, flags); ++ ++ if (del_alg) { ++ printk(KERN_DEBUG "ieee80211_crypt: unregistered algorithm " ++ "'%s'\n", ops->name); ++ kfree(del_alg); ++ } ++ ++ return del_alg ? 0 : -1; ++} ++ ++ ++struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name) ++{ ++ unsigned long flags; ++ struct list_head *ptr; ++ struct ieee80211_crypto_alg *found_alg = NULL; ++ ++ if (hcrypt == NULL) ++ return NULL; ++ ++ spin_lock_irqsave(&hcrypt->lock, flags); ++ for (ptr = hcrypt->algs.next; ptr != &hcrypt->algs; ptr = ptr->next) { ++ struct ieee80211_crypto_alg *alg = ++ (struct ieee80211_crypto_alg *) ptr; ++ if (strcmp(alg->ops->name, name) == 0) { ++ found_alg = alg; ++ break; ++ } ++ } ++ spin_unlock_irqrestore(&hcrypt->lock, flags); ++ ++ if (found_alg) ++ return found_alg->ops; ++ else ++ return NULL; ++} ++ ++ ++static void * ieee80211_crypt_null_init(int keyidx) { return (void *) 1; } ++static void ieee80211_crypt_null_deinit(void *priv) {} ++ ++static struct ieee80211_crypto_ops ieee80211_crypt_null = { ++ .name = "NULL", ++ .init = ieee80211_crypt_null_init, ++ .deinit = ieee80211_crypt_null_deinit, ++ .encrypt_mpdu = NULL, ++ .decrypt_mpdu = NULL, ++ .encrypt_msdu = NULL, ++ .decrypt_msdu = NULL, ++ .set_key = NULL, ++ .get_key = NULL, ++ .extra_prefix_len = 0, ++ .extra_postfix_len = 0 ++}; ++ ++ ++static int __init ieee80211_crypto_init(void) ++{ ++ hcrypt = (struct ieee80211_crypto *) kmalloc(sizeof(*hcrypt), GFP_KERNEL); ++ if (hcrypt == NULL) ++ return -ENOMEM; ++ ++ memset(hcrypt, 0, sizeof(*hcrypt)); ++ INIT_LIST_HEAD(&hcrypt->algs); ++ spin_lock_init(&hcrypt->lock); ++ ++ (void) ieee80211_register_crypto_ops(&ieee80211_crypt_null); ++ ++ return 0; ++} ++ ++ ++static void __exit ieee80211_crypto_deinit(void) ++{ ++ struct list_head *ptr, *n; ++ ++ if (hcrypt == NULL) ++ return; ++ ++ for (ptr = hcrypt->algs.next, n = ptr->next; ptr != &hcrypt->algs; ++ ptr = n, n = ptr->next) { ++ struct ieee80211_crypto_alg *alg = ++ (struct ieee80211_crypto_alg *) ptr; ++ list_del(ptr); ++ printk(KERN_DEBUG "ieee80211_crypt: unregistered algorithm " ++ "'%s' (deinit)\n", alg->ops->name); ++ kfree(alg); ++ } ++ ++ kfree(hcrypt); ++} ++ ++EXPORT_SYMBOL(ieee80211_crypt_deinit_entries); ++EXPORT_SYMBOL(ieee80211_crypt_deinit_handler); ++EXPORT_SYMBOL(ieee80211_crypt_delayed_deinit); ++ ++EXPORT_SYMBOL(ieee80211_register_crypto_ops); ++EXPORT_SYMBOL(ieee80211_unregister_crypto_ops); ++EXPORT_SYMBOL(ieee80211_get_crypto_ops); ++ ++module_init(ieee80211_crypto_init); ++module_exit(ieee80211_crypto_deinit); +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_crypt.h u/drivers/net/wireless/ieee80211/ieee80211_crypt.h +--- x/drivers/net/wireless/ieee80211/ieee80211_crypt.h 1970-01-01 10:00:00.000000000 +1000 ++++ u/drivers/net/wireless/ieee80211/ieee80211_crypt.h 2004-08-28 11:29:47.000000000 +1000 +@@ -0,0 +1,96 @@ ++/* ++ * Original code based on Host AP (software wireless LAN access point) driver ++ * for Intersil Prism2/2.5/3. ++ * ++ * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen ++ * ++ * Copyright (c) 2002-2003, Jouni Malinen ++ * ++ * Adaption to a generic IEEE 802.11 stack by James Ketrenos ++ * ++ * ++ * Copyright (c) 2004, Intel Corporation ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. See README and COPYING for ++ * more details. ++ */ ++ ++/* ++ * This file defines the interface to the ieee80211 crypto module. ++ */ ++#ifndef IEEE80211_CRYPT_H ++#define IEEE80211_CRYPT_H ++ ++#ifndef CONFIG_IEEE80211_NOWEP ++#include ++ ++struct ieee80211_crypto_ops { ++ char *name; ++ ++ /* init new crypto context (e.g., allocate private data space, ++ * select IV, etc.); returns NULL on failure or pointer to allocated ++ * private data on success */ ++ void * (*init)(int keyidx); ++ ++ /* deinitialize crypto context and free allocated private data */ ++ void (*deinit)(void *priv); ++ ++ /* encrypt/decrypt return < 0 on error or >= 0 on success. The return ++ * value from decrypt_mpdu is passed as the keyidx value for ++ * decrypt_msdu. skb must have enough head and tail room for the ++ * encryption; if not, error will be returned; these functions are ++ * called for all MPDUs (i.e., fragments). ++ */ ++ int (*encrypt_mpdu)(struct sk_buff *skb, int hdr_len, void *priv); ++ int (*decrypt_mpdu)(struct sk_buff *skb, int hdr_len, void *priv); ++ ++ /* These functions are called for full MSDUs, i.e. full frames. ++ * These can be NULL if full MSDU operations are not needed. */ ++ int (*encrypt_msdu)(struct sk_buff *skb, int hdr_len, void *priv); ++ int (*decrypt_msdu)(struct sk_buff *skb, int keyidx, int hdr_len, ++ void *priv); ++ ++ int (*set_key)(void *key, int len, u8 *seq, void *priv); ++ int (*get_key)(void *key, int len, u8 *seq, void *priv); ++ ++ /* procfs handler for printing out key information and possible ++ * statistics */ ++ char * (*print_stats)(char *p, void *priv); ++ ++ /* maximum number of bytes added by encryption; encrypt buf is ++ * allocated with extra_prefix_len bytes, copy of in_buf, and ++ * extra_postfix_len; encrypt need not use all this space, but ++ * the result must start at the beginning of the buffer and correct ++ * length must be returned */ ++ int extra_prefix_len, extra_postfix_len; ++}; ++ ++struct ieee80211_crypt_data { ++ struct list_head list; /* delayed deletion list */ ++ struct ieee80211_crypto_ops *ops; ++ void *priv; ++ atomic_t refcnt; ++}; ++ ++int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops); ++int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops); ++struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name); ++void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int); ++void ieee80211_crypt_deinit_handler(unsigned long); ++void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee, ++ struct ieee80211_crypt_data **crypt); ++ ++#else ++ ++struct ieee80211_crypt_data { ++ struct list_head list; /* delayed deletion list */ ++ void *ops; ++ void *priv; ++ atomic_t refcnt; ++}; ++ ++#endif /* CONFIG_IEEE80211_NOWEP */ ++ ++#endif +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_crypt_ccmp.c u/drivers/net/wireless/ieee80211/ieee80211_crypt_ccmp.c +--- x/drivers/net/wireless/ieee80211/ieee80211_crypt_ccmp.c 1970-01-01 10:00:00.000000000 +1000 ++++ u/drivers/net/wireless/ieee80211/ieee80211_crypt_ccmp.c 2004-08-28 11:29:47.000000000 +1000 +@@ -0,0 +1,496 @@ ++/* ++ * Host AP crypt: host-based CCMP encryption implementation for Host AP driver ++ * ++ * Copyright (c) 2003-2004, Jouni Malinen ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. See README and COPYING for ++ * more details. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "ieee80211.h" ++ ++#ifndef CONFIG_CRYPTO ++#error CONFIG_CRYPTO is required to build this module. ++#endif ++ ++#include ++#include ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,47)) ++#define NEW_MODULE_CODE ++#endif ++ ++MODULE_AUTHOR("Jouni Malinen"); ++MODULE_DESCRIPTION("Host AP crypt: CCMP"); ++MODULE_LICENSE("GPL"); ++ ++#define AES_BLOCK_LEN 16 ++#define CCMP_HDR_LEN 8 ++#define CCMP_MIC_LEN 8 ++#define CCMP_TK_LEN 16 ++#define CCMP_PN_LEN 6 ++ ++struct ieee80211_ccmp_data { ++ u8 key[CCMP_TK_LEN]; ++ int key_set; ++ ++ u8 tx_pn[CCMP_PN_LEN]; ++ u8 rx_pn[CCMP_PN_LEN]; ++ ++ u32 dot11RSNAStatsCCMPFormatErrors; ++ u32 dot11RSNAStatsCCMPReplays; ++ u32 dot11RSNAStatsCCMPDecryptErrors; ++ ++ int key_idx; ++ ++ struct crypto_tfm *tfm; ++ ++ /* scratch buffers for virt_to_page() (crypto API) */ ++ u8 tx_b0[AES_BLOCK_LEN], tx_b[AES_BLOCK_LEN], ++ tx_e[AES_BLOCK_LEN], tx_s0[AES_BLOCK_LEN]; ++ u8 rx_b0[AES_BLOCK_LEN], rx_b[AES_BLOCK_LEN], rx_a[AES_BLOCK_LEN]; ++}; ++ ++void ieee80211_ccmp_aes_encrypt(struct crypto_tfm *tfm, ++ const u8 pt[16], u8 ct[16]) ++{ ++ struct scatterlist src, dst; ++ ++ src.page = virt_to_page(pt); ++ src.offset = offset_in_page(pt); ++ src.length = AES_BLOCK_LEN; ++ ++ dst.page = virt_to_page(ct); ++ dst.offset = offset_in_page(ct); ++ dst.length = AES_BLOCK_LEN; ++ ++ crypto_cipher_encrypt(tfm, &dst, &src, AES_BLOCK_LEN); ++} ++ ++static void * ieee80211_ccmp_init(int key_idx) ++{ ++ struct ieee80211_ccmp_data *priv; ++ ++#ifdef NEW_MODULE_CODE ++ if (!try_module_get(THIS_MODULE)) ++ return NULL; ++#else ++ MOD_INC_USE_COUNT; ++#endif ++ ++ priv = (struct ieee80211_ccmp_data *) kmalloc(sizeof(*priv), GFP_ATOMIC); ++ if (priv == NULL) { ++ goto fail; ++ } ++ memset(priv, 0, sizeof(*priv)); ++ priv->key_idx = key_idx; ++ ++ priv->tfm = crypto_alloc_tfm("aes", 0); ++ if (priv->tfm == NULL) { ++ printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate " ++ "crypto API aes\n"); ++ goto fail; ++ } ++ ++ return priv; ++ ++fail: ++ if (priv) { ++ if (priv->tfm) ++ crypto_free_tfm(priv->tfm); ++ kfree(priv); ++ } ++#ifdef NEW_MODULE_CODE ++ module_put(THIS_MODULE); ++#else ++ MOD_DEC_USE_COUNT; ++#endif ++ return NULL; ++} ++ ++ ++static void ieee80211_ccmp_deinit(void *priv) ++{ ++ struct ieee80211_ccmp_data *_priv = priv; ++ if (_priv && _priv->tfm) ++ crypto_free_tfm(_priv->tfm); ++ kfree(priv); ++#ifdef NEW_MODULE_CODE ++ module_put(THIS_MODULE); ++#else ++ MOD_DEC_USE_COUNT; ++#endif ++} ++ ++ ++static inline void xor_block(u8 *b, u8 *a, size_t len) ++{ ++ int i; ++ for (i = 0; i < len; i++) ++ b[i] ^= a[i]; ++} ++ ++ ++static void ccmp_init_blocks(struct crypto_tfm *tfm, ++ struct ieee80211_hdr *hdr, ++ u8 *pn, size_t dlen, u8 *b0, u8 *auth, ++ u8 *s0) ++{ ++ u8 *pos, qc = 0; ++ size_t aad_len; ++ u16 fc; ++ int a4_included, qc_included; ++ u8 aad[2 * AES_BLOCK_LEN]; ++ ++ fc = le16_to_cpu(hdr->frame_control); ++ a4_included = ((fc & (IEEE802_11_FCTL_TODS | IEEE802_11_FCTL_FROMDS)) == ++ (IEEE802_11_FCTL_TODS | IEEE802_11_FCTL_FROMDS)); ++ qc_included = ((WLAN_FC_GET_TYPE(fc) == IEEE802_11_FTYPE_DATA) && ++ (WLAN_FC_GET_STYPE(fc) & 0x08)); ++ aad_len = 22; ++ if (a4_included) ++ aad_len += 6; ++ if (qc_included) { ++ pos = (u8 *) &hdr->addr4; ++ if (a4_included) ++ pos += 6; ++ qc = *pos & 0x0f; ++ aad_len += 2; ++ } ++ ++ /* CCM Initial Block: ++ * Flag (Include authentication header, M=3 (8-octet MIC), ++ * L=1 (2-octet Dlen)) ++ * Nonce: 0x00 | A2 | PN ++ * Dlen */ ++ b0[0] = 0x59; ++ b0[1] = qc; ++ memcpy(b0 + 2, hdr->addr2, ETH_ALEN); ++ memcpy(b0 + 8, pn, CCMP_PN_LEN); ++ b0[14] = (dlen >> 8) & 0xff; ++ b0[15] = dlen & 0xff; ++ ++ /* AAD: ++ * FC with bits 4..6 and 11..13 masked to zero; 14 is always one ++ * A1 | A2 | A3 ++ * SC with bits 4..15 (seq#) masked to zero ++ * A4 (if present) ++ * QC (if present) ++ */ ++ pos = (u8 *) hdr; ++ aad[0] = 0; /* aad_len >> 8 */ ++ aad[1] = aad_len & 0xff; ++ aad[2] = pos[0] & 0x8f; ++ aad[3] = pos[1] & 0xc7; ++ memcpy(aad + 4, hdr->addr1, 3 * ETH_ALEN); ++ pos = (u8 *) &hdr->seq_ctrl; ++ aad[22] = pos[0] & 0x0f; ++ aad[23] = 0; /* all bits masked */ ++ memset(aad + 24, 0, 8); ++ if (a4_included) ++ memcpy(aad + 24, hdr->addr4, ETH_ALEN); ++ if (qc_included) { ++ aad[a4_included ? 30 : 24] = qc; ++ /* rest of QC masked */ ++ } ++ ++ /* Start with the first block and AAD */ ++ ieee80211_ccmp_aes_encrypt(tfm, b0, auth); ++ xor_block(auth, aad, AES_BLOCK_LEN); ++ ieee80211_ccmp_aes_encrypt(tfm, auth, auth); ++ xor_block(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN); ++ ieee80211_ccmp_aes_encrypt(tfm, auth, auth); ++ b0[0] &= 0x07; ++ b0[14] = b0[15] = 0; ++ ieee80211_ccmp_aes_encrypt(tfm, b0, s0); ++} ++ ++ ++static int ieee80211_ccmp_encrypt(struct sk_buff *skb, int hdr_len, void *priv) ++{ ++ struct ieee80211_ccmp_data *key = priv; ++ int data_len, i, blocks, last, len; ++ u8 *pos, *mic; ++ struct ieee80211_hdr *hdr; ++ u8 *b0 = key->tx_b0; ++ u8 *b = key->tx_b; ++ u8 *e = key->tx_e; ++ u8 *s0 = key->tx_s0; ++ ++ if (skb_headroom(skb) < CCMP_HDR_LEN || ++ skb_tailroom(skb) < CCMP_MIC_LEN || ++ skb->len < hdr_len) ++ return -1; ++ ++ data_len = skb->len - hdr_len; ++ pos = skb_push(skb, CCMP_HDR_LEN); ++ memmove(pos, pos + CCMP_HDR_LEN, hdr_len); ++ pos += hdr_len; ++ mic = skb_put(skb, CCMP_MIC_LEN); ++ ++ i = CCMP_PN_LEN - 1; ++ while (i >= 0) { ++ key->tx_pn[i]++; ++ if (key->tx_pn[i] != 0) ++ break; ++ i--; ++ } ++ ++ *pos++ = key->tx_pn[5]; ++ *pos++ = key->tx_pn[4]; ++ *pos++ = 0; ++ *pos++ = (key->key_idx << 6) | (1 << 5) /* Ext IV included */; ++ *pos++ = key->tx_pn[3]; ++ *pos++ = key->tx_pn[2]; ++ *pos++ = key->tx_pn[1]; ++ *pos++ = key->tx_pn[0]; ++ ++ hdr = (struct ieee80211_hdr *) skb->data; ++ ccmp_init_blocks(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0); ++ ++ blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; ++ last = data_len % AES_BLOCK_LEN; ++ ++ for (i = 1; i <= blocks; i++) { ++ len = (i == blocks && last) ? last : AES_BLOCK_LEN; ++ /* Authentication */ ++ xor_block(b, pos, len); ++ ieee80211_ccmp_aes_encrypt(key->tfm, b, b); ++ /* Encryption, with counter */ ++ b0[14] = (i >> 8) & 0xff; ++ b0[15] = i & 0xff; ++ ieee80211_ccmp_aes_encrypt(key->tfm, b0, e); ++ xor_block(pos, e, len); ++ pos += len; ++ } ++ ++ for (i = 0; i < CCMP_MIC_LEN; i++) ++ mic[i] = b[i] ^ s0[i]; ++ ++ return 0; ++} ++ ++ ++static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv) ++{ ++ struct ieee80211_ccmp_data *key = priv; ++ u8 keyidx, *pos; ++ struct ieee80211_hdr *hdr; ++ u8 *b0 = key->rx_b0; ++ u8 *b = key->rx_b; ++ u8 *a = key->rx_a; ++ u8 pn[6]; ++ int i, blocks, last, len; ++ size_t data_len = skb->len - hdr_len - CCMP_HDR_LEN - CCMP_MIC_LEN; ++ u8 *mic = skb->data + skb->len - CCMP_MIC_LEN; ++ ++ if (skb->len < hdr_len + CCMP_HDR_LEN + CCMP_MIC_LEN) { ++ key->dot11RSNAStatsCCMPFormatErrors++; ++ return -1; ++ } ++ ++ hdr = (struct ieee80211_hdr *) skb->data; ++ pos = skb->data + hdr_len; ++ keyidx = pos[3]; ++ if (!(keyidx & (1 << 5))) { ++ if (net_ratelimit()) { ++ printk(KERN_DEBUG "CCMP: received packet without ExtIV" ++ " flag from " MACSTR "\n", MAC2STR(hdr->addr2)); ++ } ++ key->dot11RSNAStatsCCMPFormatErrors++; ++ return -2; ++ } ++ keyidx >>= 6; ++ if (key->key_idx != keyidx) { ++ printk(KERN_DEBUG "CCMP: RX tkey->key_idx=%d frame " ++ "keyidx=%d priv=%p\n", key->key_idx, keyidx, priv); ++ return -6; ++ } ++ if (!key->key_set) { ++ if (net_ratelimit()) { ++ printk(KERN_DEBUG "CCMP: received packet from " MACSTR ++ " with keyid=%d that does not have a configured" ++ " key\n", MAC2STR(hdr->addr2), keyidx); ++ } ++ return -3; ++ } ++ ++ pn[0] = pos[7]; ++ pn[1] = pos[6]; ++ pn[2] = pos[5]; ++ pn[3] = pos[4]; ++ pn[4] = pos[1]; ++ pn[5] = pos[0]; ++ pos += 8; ++ ++ if (memcmp(pn, key->rx_pn, CCMP_PN_LEN) <= 0) { ++ if (net_ratelimit()) { ++ printk(KERN_DEBUG "CCMP: replay detected: STA=" MACSTR ++ " previous PN %02x%02x%02x%02x%02x%02x " ++ "received PN %02x%02x%02x%02x%02x%02x\n", ++ MAC2STR(hdr->addr2), MAC2STR(key->rx_pn), ++ MAC2STR(pn)); ++ } ++ key->dot11RSNAStatsCCMPReplays++; ++ return -4; ++ } ++ ++ ccmp_init_blocks(key->tfm, hdr, pn, data_len, b0, a, b); ++ xor_block(mic, b, CCMP_MIC_LEN); ++ ++ blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; ++ last = data_len % AES_BLOCK_LEN; ++ ++ for (i = 1; i <= blocks; i++) { ++ len = (i == blocks && last) ? last : AES_BLOCK_LEN; ++ /* Decrypt, with counter */ ++ b0[14] = (i >> 8) & 0xff; ++ b0[15] = i & 0xff; ++ ieee80211_ccmp_aes_encrypt(key->tfm, b0, b); ++ xor_block(pos, b, len); ++ /* Authentication */ ++ xor_block(a, pos, len); ++ ieee80211_ccmp_aes_encrypt(key->tfm, a, a); ++ pos += len; ++ } ++ ++ if (memcmp(mic, a, CCMP_MIC_LEN) != 0) { ++ if (net_ratelimit()) { ++ printk(KERN_DEBUG "CCMP: decrypt failed: STA=" ++ MACSTR "\n", MAC2STR(hdr->addr2)); ++ } ++ key->dot11RSNAStatsCCMPDecryptErrors++; ++ return -5; ++ } ++ ++ memcpy(key->rx_pn, pn, CCMP_PN_LEN); ++ ++ /* Remove hdr and MIC */ ++ memmove(skb->data + CCMP_HDR_LEN, skb->data, hdr_len); ++ skb_pull(skb, CCMP_HDR_LEN); ++ skb_trim(skb, skb->len - CCMP_MIC_LEN); ++ ++ return keyidx; ++} ++ ++ ++static int ieee80211_ccmp_set_key(void *key, int len, u8 *seq, void *priv) ++{ ++ struct ieee80211_ccmp_data *data = priv; ++ int keyidx; ++ struct crypto_tfm *tfm = data->tfm; ++ ++ keyidx = data->key_idx; ++ memset(data, 0, sizeof(*data)); ++ data->key_idx = keyidx; ++ data->tfm = tfm; ++ if (len == CCMP_TK_LEN) { ++ memcpy(data->key, key, CCMP_TK_LEN); ++ data->key_set = 1; ++ if (seq) { ++ data->rx_pn[0] = seq[5]; ++ data->rx_pn[1] = seq[4]; ++ data->rx_pn[2] = seq[3]; ++ data->rx_pn[3] = seq[2]; ++ data->rx_pn[4] = seq[1]; ++ data->rx_pn[5] = seq[0]; ++ } ++ crypto_cipher_setkey(data->tfm, data->key, CCMP_TK_LEN); ++ } else if (len == 0) { ++ data->key_set = 0; ++ } else ++ return -1; ++ ++ return 0; ++} ++ ++ ++static int ieee80211_ccmp_get_key(void *key, int len, u8 *seq, void *priv) ++{ ++ struct ieee80211_ccmp_data *data = priv; ++ ++ if (len < CCMP_TK_LEN) ++ return -1; ++ ++ if (!data->key_set) ++ return 0; ++ memcpy(key, data->key, CCMP_TK_LEN); ++ ++ if (seq) { ++ seq[0] = data->tx_pn[5]; ++ seq[1] = data->tx_pn[4]; ++ seq[2] = data->tx_pn[3]; ++ seq[3] = data->tx_pn[2]; ++ seq[4] = data->tx_pn[1]; ++ seq[5] = data->tx_pn[0]; ++ } ++ ++ return CCMP_TK_LEN; ++} ++ ++ ++static char * ieee80211_ccmp_print_stats(char *p, void *priv) ++{ ++ struct ieee80211_ccmp_data *ccmp = priv; ++ p += sprintf(p, "key[%d] alg=CCMP key_set=%d " ++ "tx_pn=%02x%02x%02x%02x%02x%02x " ++ "rx_pn=%02x%02x%02x%02x%02x%02x " ++ "format_errors=%d replays=%d decrypt_errors=%d\n", ++ ccmp->key_idx, ccmp->key_set, ++ MAC2STR(ccmp->tx_pn), MAC2STR(ccmp->rx_pn), ++ ccmp->dot11RSNAStatsCCMPFormatErrors, ++ ccmp->dot11RSNAStatsCCMPReplays, ++ ccmp->dot11RSNAStatsCCMPDecryptErrors); ++ ++ return p; ++} ++ ++ ++static struct ieee80211_crypto_ops ieee80211_crypt_ccmp = { ++ .name = "CCMP", ++ .init = ieee80211_ccmp_init, ++ .deinit = ieee80211_ccmp_deinit, ++ .encrypt_mpdu = ieee80211_ccmp_encrypt, ++ .decrypt_mpdu = ieee80211_ccmp_decrypt, ++ .encrypt_msdu = NULL, ++ .decrypt_msdu = NULL, ++ .set_key = ieee80211_ccmp_set_key, ++ .get_key = ieee80211_ccmp_get_key, ++ .print_stats = ieee80211_ccmp_print_stats, ++ .extra_prefix_len = CCMP_HDR_LEN, ++ .extra_postfix_len = CCMP_MIC_LEN ++}; ++ ++ ++static int __init ieee80211_crypto_ccmp_init(void) ++{ ++ if (ieee80211_register_crypto_ops(&ieee80211_crypt_ccmp) < 0) ++ return -1; ++ ++ return 0; ++} ++ ++ ++static void __exit ieee80211_crypto_ccmp_exit(void) ++{ ++ ieee80211_unregister_crypto_ops(&ieee80211_crypt_ccmp); ++} ++ ++ ++module_init(ieee80211_crypto_ccmp_init); ++module_exit(ieee80211_crypto_ccmp_exit); +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_crypt_tkip.c u/drivers/net/wireless/ieee80211/ieee80211_crypt_tkip.c +--- x/drivers/net/wireless/ieee80211/ieee80211_crypt_tkip.c 1970-01-01 10:00:00.000000000 +1000 ++++ u/drivers/net/wireless/ieee80211/ieee80211_crypt_tkip.c 2004-08-28 11:29:47.000000000 +1000 +@@ -0,0 +1,712 @@ ++/* ++ * Host AP crypt: host-based TKIP encryption implementation for Host AP driver ++ * ++ * Copyright (c) 2003-2004, Jouni Malinen ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. See README and COPYING for ++ * more details. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "ieee80211.h" ++ ++#ifndef CONFIG_CRYPTO ++#error CONFIG_CRYPTO is required to build this module. ++#endif ++ ++#include ++#include ++#include ++ ++#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,47)) ++#define NEW_MODULE_CODE ++#endif ++ ++MODULE_AUTHOR("Jouni Malinen"); ++MODULE_DESCRIPTION("Host AP crypt: TKIP"); ++MODULE_LICENSE("GPL"); ++ ++struct ieee80211_tkip_data { ++#define TKIP_KEY_LEN 32 ++ u8 key[TKIP_KEY_LEN]; ++ int key_set; ++ ++ u32 tx_iv32; ++ u16 tx_iv16; ++ u16 tx_ttak[5]; ++ int tx_phase1_done; ++ ++ u32 rx_iv32; ++ u16 rx_iv16; ++ u16 rx_ttak[5]; ++ int rx_phase1_done; ++ u32 rx_iv32_new; ++ u16 rx_iv16_new; ++ ++ u32 dot11RSNAStatsTKIPReplays; ++ u32 dot11RSNAStatsTKIPICVErrors; ++ u32 dot11RSNAStatsTKIPLocalMICFailures; ++ ++ int key_idx; ++ ++ struct crypto_tfm *tfm_arc4; ++ struct crypto_tfm *tfm_michael; ++ ++ /* scratch buffers for virt_to_page() (crypto API) */ ++ u8 rx_hdr[16], tx_hdr[16]; ++}; ++ ++static void * ieee80211_tkip_init(int key_idx) ++{ ++ struct ieee80211_tkip_data *priv; ++ ++#ifdef NEW_MODULE_CODE ++ if (!try_module_get(THIS_MODULE)) ++ return NULL; ++#else ++ MOD_INC_USE_COUNT; ++#endif ++ ++ priv = (struct ieee80211_tkip_data *) kmalloc(sizeof(*priv), GFP_ATOMIC); ++ if (priv == NULL) ++ goto fail; ++ memset(priv, 0, sizeof(*priv)); ++ priv->key_idx = key_idx; ++ ++ priv->tfm_arc4 = crypto_alloc_tfm("arc4", 0); ++ if (priv->tfm_arc4 == NULL) { ++ printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " ++ "crypto API arc4\n"); ++ goto fail; ++ } ++ ++ priv->tfm_michael = crypto_alloc_tfm("michael_mic", 0); ++ if (priv->tfm_michael == NULL) { ++ printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate " ++ "crypto API michael_mic\n"); ++ goto fail; ++ } ++ ++ return priv; ++ ++fail: ++ if (priv) { ++ if (priv->tfm_michael) ++ crypto_free_tfm(priv->tfm_michael); ++ if (priv->tfm_arc4) ++ crypto_free_tfm(priv->tfm_arc4); ++ kfree(priv); ++ } ++#ifdef NEW_MODULE_CODE ++ module_put(THIS_MODULE); ++#else ++ MOD_DEC_USE_COUNT; ++#endif ++ return NULL; ++} ++ ++ ++static void ieee80211_tkip_deinit(void *priv) ++{ ++ struct ieee80211_tkip_data *_priv = priv; ++ if (_priv && _priv->tfm_michael) ++ crypto_free_tfm(_priv->tfm_michael); ++ if (_priv && _priv->tfm_arc4) ++ crypto_free_tfm(_priv->tfm_arc4); ++ kfree(priv); ++#ifdef NEW_MODULE_CODE ++ module_put(THIS_MODULE); ++#else ++ MOD_DEC_USE_COUNT; ++#endif ++} ++ ++ ++static inline u16 RotR1(u16 val) ++{ ++ return (val >> 1) | (val << 15); ++} ++ ++ ++static inline u8 Lo8(u16 val) ++{ ++ return val & 0xff; ++} ++ ++ ++static inline u8 Hi8(u16 val) ++{ ++ return val >> 8; ++} ++ ++ ++static inline u16 Lo16(u32 val) ++{ ++ return val & 0xffff; ++} ++ ++ ++static inline u16 Hi16(u32 val) ++{ ++ return val >> 16; ++} ++ ++ ++static inline u16 Mk16(u8 hi, u8 lo) ++{ ++ return lo | (((u16) hi) << 8); ++} ++ ++ ++static inline u16 Mk16_le(u16 *v) ++{ ++ return le16_to_cpu(*v); ++} ++ ++ ++static const u16 Sbox[256] = ++{ ++ 0xC6A5, 0xF884, 0xEE99, 0xF68D, 0xFF0D, 0xD6BD, 0xDEB1, 0x9154, ++ 0x6050, 0x0203, 0xCEA9, 0x567D, 0xE719, 0xB562, 0x4DE6, 0xEC9A, ++ 0x8F45, 0x1F9D, 0x8940, 0xFA87, 0xEF15, 0xB2EB, 0x8EC9, 0xFB0B, ++ 0x41EC, 0xB367, 0x5FFD, 0x45EA, 0x23BF, 0x53F7, 0xE496, 0x9B5B, ++ 0x75C2, 0xE11C, 0x3DAE, 0x4C6A, 0x6C5A, 0x7E41, 0xF502, 0x834F, ++ 0x685C, 0x51F4, 0xD134, 0xF908, 0xE293, 0xAB73, 0x6253, 0x2A3F, ++ 0x080C, 0x9552, 0x4665, 0x9D5E, 0x3028, 0x37A1, 0x0A0F, 0x2FB5, ++ 0x0E09, 0x2436, 0x1B9B, 0xDF3D, 0xCD26, 0x4E69, 0x7FCD, 0xEA9F, ++ 0x121B, 0x1D9E, 0x5874, 0x342E, 0x362D, 0xDCB2, 0xB4EE, 0x5BFB, ++ 0xA4F6, 0x764D, 0xB761, 0x7DCE, 0x527B, 0xDD3E, 0x5E71, 0x1397, ++ 0xA6F5, 0xB968, 0x0000, 0xC12C, 0x4060, 0xE31F, 0x79C8, 0xB6ED, ++ 0xD4BE, 0x8D46, 0x67D9, 0x724B, 0x94DE, 0x98D4, 0xB0E8, 0x854A, ++ 0xBB6B, 0xC52A, 0x4FE5, 0xED16, 0x86C5, 0x9AD7, 0x6655, 0x1194, ++ 0x8ACF, 0xE910, 0x0406, 0xFE81, 0xA0F0, 0x7844, 0x25BA, 0x4BE3, ++ 0xA2F3, 0x5DFE, 0x80C0, 0x058A, 0x3FAD, 0x21BC, 0x7048, 0xF104, ++ 0x63DF, 0x77C1, 0xAF75, 0x4263, 0x2030, 0xE51A, 0xFD0E, 0xBF6D, ++ 0x814C, 0x1814, 0x2635, 0xC32F, 0xBEE1, 0x35A2, 0x88CC, 0x2E39, ++ 0x9357, 0x55F2, 0xFC82, 0x7A47, 0xC8AC, 0xBAE7, 0x322B, 0xE695, ++ 0xC0A0, 0x1998, 0x9ED1, 0xA37F, 0x4466, 0x547E, 0x3BAB, 0x0B83, ++ 0x8CCA, 0xC729, 0x6BD3, 0x283C, 0xA779, 0xBCE2, 0x161D, 0xAD76, ++ 0xDB3B, 0x6456, 0x744E, 0x141E, 0x92DB, 0x0C0A, 0x486C, 0xB8E4, ++ 0x9F5D, 0xBD6E, 0x43EF, 0xC4A6, 0x39A8, 0x31A4, 0xD337, 0xF28B, ++ 0xD532, 0x8B43, 0x6E59, 0xDAB7, 0x018C, 0xB164, 0x9CD2, 0x49E0, ++ 0xD8B4, 0xACFA, 0xF307, 0xCF25, 0xCAAF, 0xF48E, 0x47E9, 0x1018, ++ 0x6FD5, 0xF088, 0x4A6F, 0x5C72, 0x3824, 0x57F1, 0x73C7, 0x9751, ++ 0xCB23, 0xA17C, 0xE89C, 0x3E21, 0x96DD, 0x61DC, 0x0D86, 0x0F85, ++ 0xE090, 0x7C42, 0x71C4, 0xCCAA, 0x90D8, 0x0605, 0xF701, 0x1C12, ++ 0xC2A3, 0x6A5F, 0xAEF9, 0x69D0, 0x1791, 0x9958, 0x3A27, 0x27B9, ++ 0xD938, 0xEB13, 0x2BB3, 0x2233, 0xD2BB, 0xA970, 0x0789, 0x33A7, ++ 0x2DB6, 0x3C22, 0x1592, 0xC920, 0x8749, 0xAAFF, 0x5078, 0xA57A, ++ 0x038F, 0x59F8, 0x0980, 0x1A17, 0x65DA, 0xD731, 0x84C6, 0xD0B8, ++ 0x82C3, 0x29B0, 0x5A77, 0x1E11, 0x7BCB, 0xA8FC, 0x6DD6, 0x2C3A, ++}; ++ ++ ++static inline u16 _S_(u16 v) ++{ ++ u16 t = Sbox[Hi8(v)]; ++ return Sbox[Lo8(v)] ^ ((t << 8) | (t >> 8)); ++} ++ ++ ++#define PHASE1_LOOP_COUNT 8 ++ ++static void tkip_mixing_phase1(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32) ++{ ++ int i, j; ++ ++ /* Initialize the 80-bit TTAK from TSC (IV32) and TA[0..5] */ ++ TTAK[0] = Lo16(IV32); ++ TTAK[1] = Hi16(IV32); ++ TTAK[2] = Mk16(TA[1], TA[0]); ++ TTAK[3] = Mk16(TA[3], TA[2]); ++ TTAK[4] = Mk16(TA[5], TA[4]); ++ ++ for (i = 0; i < PHASE1_LOOP_COUNT; i++) { ++ j = 2 * (i & 1); ++ TTAK[0] += _S_(TTAK[4] ^ Mk16(TK[1 + j], TK[0 + j])); ++ TTAK[1] += _S_(TTAK[0] ^ Mk16(TK[5 + j], TK[4 + j])); ++ TTAK[2] += _S_(TTAK[1] ^ Mk16(TK[9 + j], TK[8 + j])); ++ TTAK[3] += _S_(TTAK[2] ^ Mk16(TK[13 + j], TK[12 + j])); ++ TTAK[4] += _S_(TTAK[3] ^ Mk16(TK[1 + j], TK[0 + j])) + i; ++ } ++} ++ ++ ++static void tkip_mixing_phase2(u8 *WEPSeed, const u8 *TK, const u16 *TTAK, ++ u16 IV16) ++{ ++ /* Make temporary area overlap WEP seed so that the final copy can be ++ * avoided on little endian hosts. */ ++ u16 *PPK = (u16 *) &WEPSeed[4]; ++ ++ /* Step 1 - make copy of TTAK and bring in TSC */ ++ PPK[0] = TTAK[0]; ++ PPK[1] = TTAK[1]; ++ PPK[2] = TTAK[2]; ++ PPK[3] = TTAK[3]; ++ PPK[4] = TTAK[4]; ++ PPK[5] = TTAK[4] + IV16; ++ ++ /* Step 2 - 96-bit bijective mixing using S-box */ ++ PPK[0] += _S_(PPK[5] ^ Mk16_le((u16 *) &TK[0])); ++ PPK[1] += _S_(PPK[0] ^ Mk16_le((u16 *) &TK[2])); ++ PPK[2] += _S_(PPK[1] ^ Mk16_le((u16 *) &TK[4])); ++ PPK[3] += _S_(PPK[2] ^ Mk16_le((u16 *) &TK[6])); ++ PPK[4] += _S_(PPK[3] ^ Mk16_le((u16 *) &TK[8])); ++ PPK[5] += _S_(PPK[4] ^ Mk16_le((u16 *) &TK[10])); ++ ++ PPK[0] += RotR1(PPK[5] ^ Mk16_le((u16 *) &TK[12])); ++ PPK[1] += RotR1(PPK[0] ^ Mk16_le((u16 *) &TK[14])); ++ PPK[2] += RotR1(PPK[1]); ++ PPK[3] += RotR1(PPK[2]); ++ PPK[4] += RotR1(PPK[3]); ++ PPK[5] += RotR1(PPK[4]); ++ ++ /* Step 3 - bring in last of TK bits, assign 24-bit WEP IV value ++ * WEPSeed[0..2] is transmitted as WEP IV */ ++ WEPSeed[0] = Hi8(IV16); ++ WEPSeed[1] = (Hi8(IV16) | 0x20) & 0x7F; ++ WEPSeed[2] = Lo8(IV16); ++ WEPSeed[3] = Lo8((PPK[5] ^ Mk16_le((u16 *) &TK[0])) >> 1); ++ ++#ifdef __BIG_ENDIAN ++ { ++ int i; ++ for (i = 0; i < 6; i++) ++ PPK[i] = (PPK[i] << 8) | (PPK[i] >> 8); ++ } ++#endif ++} ++ ++static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv) ++{ ++ struct ieee80211_tkip_data *tkey = priv; ++ int len; ++ u8 rc4key[16], *pos, *icv; ++ struct ieee80211_hdr *hdr; ++ u32 crc; ++ struct scatterlist sg; ++ ++ if (skb_headroom(skb) < 8 || skb_tailroom(skb) < 4 || ++ skb->len < hdr_len) ++ return -1; ++ ++ hdr = (struct ieee80211_hdr *) skb->data; ++ if (!tkey->tx_phase1_done) { ++ tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2, ++ tkey->tx_iv32); ++ tkey->tx_phase1_done = 1; ++ } ++ tkip_mixing_phase2(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16); ++ ++ len = skb->len - hdr_len; ++ pos = skb_push(skb, 8); ++ memmove(pos, pos + 8, hdr_len); ++ pos += hdr_len; ++ icv = skb_put(skb, 4); ++ ++ *pos++ = rc4key[0]; ++ *pos++ = rc4key[1]; ++ *pos++ = rc4key[2]; ++ *pos++ = (tkey->key_idx << 6) | (1 << 5) /* Ext IV included */; ++ *pos++ = tkey->tx_iv32 & 0xff; ++ *pos++ = (tkey->tx_iv32 >> 8) & 0xff; ++ *pos++ = (tkey->tx_iv32 >> 16) & 0xff; ++ *pos++ = (tkey->tx_iv32 >> 24) & 0xff; ++ ++ crc = ~crc32_le(~0, pos, len); ++ icv[0] = crc; ++ icv[1] = crc >> 8; ++ icv[2] = crc >> 16; ++ icv[3] = crc >> 24; ++ ++ crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); ++ sg.page = virt_to_page(pos); ++ sg.offset = offset_in_page(pos); ++ sg.length = len + 4; ++ crypto_cipher_encrypt(tkey->tfm_arc4, &sg, &sg, len + 4); ++ ++ tkey->tx_iv16++; ++ if (tkey->tx_iv16 == 0) { ++ tkey->tx_phase1_done = 0; ++ tkey->tx_iv32++; ++ } ++ ++ return 0; ++} ++ ++static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) ++{ ++ struct ieee80211_tkip_data *tkey = priv; ++ u8 rc4key[16]; ++ u8 keyidx, *pos; ++ u32 iv32; ++ u16 iv16; ++ struct ieee80211_hdr *hdr; ++ u8 icv[4]; ++ u32 crc; ++ struct scatterlist sg; ++ int plen; ++ ++ if (skb->len < hdr_len + 8 + 4) ++ return -1; ++ ++ hdr = (struct ieee80211_hdr *) skb->data; ++ pos = skb->data + hdr_len; ++ keyidx = pos[3]; ++ if (!(keyidx & (1 << 5))) { ++ if (net_ratelimit()) { ++ printk(KERN_DEBUG "TKIP: received packet without ExtIV" ++ " flag from " MACSTR "\n", MAC2STR(hdr->addr2)); ++ } ++ return -2; ++ } ++ keyidx >>= 6; ++ if (tkey->key_idx != keyidx) { ++ printk(KERN_DEBUG "TKIP: RX tkey->key_idx=%d frame " ++ "keyidx=%d priv=%p\n", tkey->key_idx, keyidx, priv); ++ return -6; ++ } ++ if (!tkey->key_set) { ++ if (net_ratelimit()) { ++ printk(KERN_DEBUG "TKIP: received packet from " MACSTR ++ " with keyid=%d that does not have a configured" ++ " key\n", MAC2STR(hdr->addr2), keyidx); ++ } ++ return -3; ++ } ++ iv16 = (pos[0] << 8) | pos[2]; ++ iv32 = pos[4] | (pos[5] << 8) | (pos[6] << 16) | (pos[7] << 24); ++ pos += 8; ++ ++ if (iv32 < tkey->rx_iv32 || ++ (iv32 == tkey->rx_iv32 && iv16 <= tkey->rx_iv16)) { ++ if (net_ratelimit()) { ++ printk(KERN_DEBUG "TKIP: replay detected: STA=" MACSTR ++ " previous TSC %08x%04x received TSC " ++ "%08x%04x\n", MAC2STR(hdr->addr2), ++ tkey->rx_iv32, tkey->rx_iv16, iv32, iv16); ++ } ++ tkey->dot11RSNAStatsTKIPReplays++; ++ return -4; ++ } ++ ++ if (iv32 != tkey->rx_iv32 || !tkey->rx_phase1_done) { ++ tkip_mixing_phase1(tkey->rx_ttak, tkey->key, hdr->addr2, iv32); ++ tkey->rx_phase1_done = 1; ++ } ++ tkip_mixing_phase2(rc4key, tkey->key, tkey->rx_ttak, iv16); ++ ++ plen = skb->len - hdr_len - 12; ++ ++ crypto_cipher_setkey(tkey->tfm_arc4, rc4key, 16); ++ sg.page = virt_to_page(pos); ++ sg.offset = offset_in_page(pos); ++ sg.length = plen + 4; ++ crypto_cipher_decrypt(tkey->tfm_arc4, &sg, &sg, plen + 4); ++ ++ crc = ~crc32_le(~0, pos, plen); ++ icv[0] = crc; ++ icv[1] = crc >> 8; ++ icv[2] = crc >> 16; ++ icv[3] = crc >> 24; ++ if (memcmp(icv, pos + plen, 4) != 0) { ++ if (iv32 != tkey->rx_iv32) { ++ /* Previously cached Phase1 result was already lost, so ++ * it needs to be recalculated for the next packet. */ ++ tkey->rx_phase1_done = 0; ++ } ++ if (net_ratelimit()) { ++ printk(KERN_DEBUG "TKIP: ICV error detected: STA=" ++ MACSTR "\n", MAC2STR(hdr->addr2)); ++ } ++ tkey->dot11RSNAStatsTKIPICVErrors++; ++ return -5; ++ } ++ ++ /* Update real counters only after Michael MIC verification has ++ * completed */ ++ tkey->rx_iv32_new = iv32; ++ tkey->rx_iv16_new = iv16; ++ ++ /* Remove IV and ICV */ ++ memmove(skb->data + 8, skb->data, hdr_len); ++ skb_pull(skb, 8); ++ skb_trim(skb, skb->len - 4); ++ ++ return keyidx; ++} ++ ++ ++static int michael_mic(struct ieee80211_tkip_data *tkey, u8 *key, u8 *hdr, ++ u8 *data, size_t data_len, u8 *mic) ++{ ++ struct scatterlist sg[2]; ++ ++ if (tkey->tfm_michael == NULL) { ++ printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n"); ++ return -1; ++ } ++ sg[0].page = virt_to_page(hdr); ++ sg[0].offset = offset_in_page(hdr); ++ sg[0].length = 16; ++ ++ sg[1].page = virt_to_page(data); ++ sg[1].offset = offset_in_page(data); ++ sg[1].length = data_len; ++ ++ crypto_digest_init(tkey->tfm_michael); ++ crypto_digest_setkey(tkey->tfm_michael, key, 8); ++ crypto_digest_update(tkey->tfm_michael, sg, 2); ++ crypto_digest_final(tkey->tfm_michael, mic); ++ ++ return 0; ++} ++ ++static void michael_mic_hdr(struct sk_buff *skb, u8 *hdr) ++{ ++ struct ieee80211_hdr *hdr11; ++ ++ hdr11 = (struct ieee80211_hdr *) skb->data; ++ switch (le16_to_cpu(hdr11->frame_control) & ++ (IEEE802_11_FCTL_FROMDS | IEEE802_11_FCTL_TODS)) { ++ case IEEE802_11_FCTL_TODS: ++ memcpy(hdr, hdr11->addr3, ETH_ALEN); /* DA */ ++ memcpy(hdr + ETH_ALEN, hdr11->addr2, ETH_ALEN); /* SA */ ++ break; ++ case IEEE802_11_FCTL_FROMDS: ++ memcpy(hdr, hdr11->addr1, ETH_ALEN); /* DA */ ++ memcpy(hdr + ETH_ALEN, hdr11->addr3, ETH_ALEN); /* SA */ ++ break; ++ case IEEE802_11_FCTL_FROMDS | IEEE802_11_FCTL_TODS: ++ memcpy(hdr, hdr11->addr3, ETH_ALEN); /* DA */ ++ memcpy(hdr + ETH_ALEN, hdr11->addr4, ETH_ALEN); /* SA */ ++ break; ++ case 0: ++ memcpy(hdr, hdr11->addr1, ETH_ALEN); /* DA */ ++ memcpy(hdr + ETH_ALEN, hdr11->addr2, ETH_ALEN); /* SA */ ++ break; ++ } ++ ++ hdr[12] = 0; /* priority */ ++ hdr[13] = hdr[14] = hdr[15] = 0; /* reserved */ ++} ++ ++ ++static int ieee80211_michael_mic_add(struct sk_buff *skb, int hdr_len, void *priv) ++{ ++ struct ieee80211_tkip_data *tkey = priv; ++ u8 *pos; ++ ++ if (skb_tailroom(skb) < 8 || skb->len < hdr_len) { ++ printk(KERN_DEBUG "Invalid packet for Michael MIC add " ++ "(tailroom=%d hdr_len=%d skb->len=%d)\n", ++ skb_tailroom(skb), hdr_len, skb->len); ++ return -1; ++ } ++ ++ michael_mic_hdr(skb, tkey->tx_hdr); ++ pos = skb_put(skb, 8); ++ if (michael_mic(tkey, &tkey->key[16], tkey->tx_hdr, ++ skb->data + hdr_len, skb->len - 8 - hdr_len, pos)) ++ return -1; ++ ++ return 0; ++} ++ ++ ++#if WIRELESS_EXT >= 15 ++static void ieee80211_michael_mic_failure(struct net_device *dev, ++ struct ieee80211_hdr *hdr, ++ int keyidx) ++{ ++ union iwreq_data wrqu; ++ char buf[128]; ++ ++ /* TODO: needed parameters: count, keyid, key type, src address, TSC */ ++ sprintf(buf, "MLME-MICHAELMICFAILURE.indication(keyid=%d %scast addr=" ++ MACSTR ")", keyidx, hdr->addr1[0] & 0x01 ? "broad" : "uni", ++ MAC2STR(hdr->addr2)); ++ memset(&wrqu, 0, sizeof(wrqu)); ++ wrqu.data.length = strlen(buf); ++ wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf); ++} ++#else /* WIRELESS_EXT >= 15 */ ++static inline void ieee80211_michael_mic_failure(struct net_device *dev, ++ struct ieee80211_hdr *hdr, ++ int keyidx) ++{ ++} ++#endif /* WIRELESS_EXT >= 15 */ ++ ++ ++static int ieee80211_michael_mic_verify(struct sk_buff *skb, int keyidx, ++ int hdr_len, void *priv) ++{ ++ struct ieee80211_tkip_data *tkey = priv; ++ u8 mic[8]; ++ ++ if (!tkey->key_set) ++ return -1; ++ ++ michael_mic_hdr(skb, tkey->rx_hdr); ++ if (michael_mic(tkey, &tkey->key[24], tkey->rx_hdr, ++ skb->data + hdr_len, skb->len - 8 - hdr_len, mic)) ++ return -1; ++ if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) { ++ struct ieee80211_hdr *hdr; ++ hdr = (struct ieee80211_hdr *) skb->data; ++ printk(KERN_DEBUG "%s: Michael MIC verification failed for " ++ "MSDU from " MACSTR " keyidx=%d\n", ++ skb->dev ? skb->dev->name : "N/A", MAC2STR(hdr->addr2), ++ keyidx); ++ if (skb->dev) ++ ieee80211_michael_mic_failure(skb->dev, hdr, keyidx); ++ tkey->dot11RSNAStatsTKIPLocalMICFailures++; ++ return -1; ++ } ++ ++ /* Update TSC counters for RX now that the packet verification has ++ * completed. */ ++ tkey->rx_iv32 = tkey->rx_iv32_new; ++ tkey->rx_iv16 = tkey->rx_iv16_new; ++ ++ skb_trim(skb, skb->len - 8); ++ ++ return 0; ++} ++ ++ ++static int ieee80211_tkip_set_key(void *key, int len, u8 *seq, void *priv) ++{ ++ struct ieee80211_tkip_data *tkey = priv; ++ int keyidx; ++ struct crypto_tfm *tfm = tkey->tfm_michael; ++ struct crypto_tfm *tfm2 = tkey->tfm_arc4; ++ ++ keyidx = tkey->key_idx; ++ memset(tkey, 0, sizeof(*tkey)); ++ tkey->key_idx = keyidx; ++ tkey->tfm_michael = tfm; ++ tkey->tfm_arc4 = tfm2; ++ if (len == TKIP_KEY_LEN) { ++ memcpy(tkey->key, key, TKIP_KEY_LEN); ++ tkey->key_set = 1; ++ tkey->tx_iv16 = 1; /* TSC is initialized to 1 */ ++ if (seq) { ++ tkey->rx_iv32 = (seq[5] << 24) | (seq[4] << 16) | ++ (seq[3] << 8) | seq[2]; ++ tkey->rx_iv16 = (seq[1] << 8) | seq[0]; ++ } ++ } else if (len == 0) { ++ tkey->key_set = 0; ++ } else ++ return -1; ++ ++ return 0; ++} ++ ++ ++static int ieee80211_tkip_get_key(void *key, int len, u8 *seq, void *priv) ++{ ++ struct ieee80211_tkip_data *tkey = priv; ++ ++ if (len < TKIP_KEY_LEN) ++ return -1; ++ ++ if (!tkey->key_set) ++ return 0; ++ memcpy(key, tkey->key, TKIP_KEY_LEN); ++ ++ if (seq) { ++ /* Return the sequence number of the last transmitted frame. */ ++ u16 iv16 = tkey->tx_iv16; ++ u32 iv32 = tkey->tx_iv32; ++ if (iv16 == 0) ++ iv32--; ++ iv16--; ++ seq[0] = tkey->tx_iv16; ++ seq[1] = tkey->tx_iv16 >> 8; ++ seq[2] = tkey->tx_iv32; ++ seq[3] = tkey->tx_iv32 >> 8; ++ seq[4] = tkey->tx_iv32 >> 16; ++ seq[5] = tkey->tx_iv32 >> 24; ++ } ++ ++ return TKIP_KEY_LEN; ++} ++ ++ ++static char * ieee80211_tkip_print_stats(char *p, void *priv) ++{ ++ struct ieee80211_tkip_data *tkip = priv; ++ p += sprintf(p, "key[%d] alg=TKIP key_set=%d " ++ "tx_pn=%02x%02x%02x%02x%02x%02x " ++ "rx_pn=%02x%02x%02x%02x%02x%02x " ++ "replays=%d icv_errors=%d local_mic_failures=%d\n", ++ tkip->key_idx, tkip->key_set, ++ (tkip->tx_iv32 >> 24) & 0xff, ++ (tkip->tx_iv32 >> 16) & 0xff, ++ (tkip->tx_iv32 >> 8) & 0xff, ++ tkip->tx_iv32 & 0xff, ++ (tkip->tx_iv16 >> 8) & 0xff, ++ tkip->tx_iv16 & 0xff, ++ (tkip->rx_iv32 >> 24) & 0xff, ++ (tkip->rx_iv32 >> 16) & 0xff, ++ (tkip->rx_iv32 >> 8) & 0xff, ++ tkip->rx_iv32 & 0xff, ++ (tkip->rx_iv16 >> 8) & 0xff, ++ tkip->rx_iv16 & 0xff, ++ tkip->dot11RSNAStatsTKIPReplays, ++ tkip->dot11RSNAStatsTKIPICVErrors, ++ tkip->dot11RSNAStatsTKIPLocalMICFailures); ++ return p; ++} ++ ++ ++static struct ieee80211_crypto_ops ieee80211_crypt_tkip = { ++ .name = "TKIP", ++ .init = ieee80211_tkip_init, ++ .deinit = ieee80211_tkip_deinit, ++ .encrypt_mpdu = ieee80211_tkip_encrypt, ++ .decrypt_mpdu = ieee80211_tkip_decrypt, ++ .encrypt_msdu = ieee80211_michael_mic_add, ++ .decrypt_msdu = ieee80211_michael_mic_verify, ++ .set_key = ieee80211_tkip_set_key, ++ .get_key = ieee80211_tkip_get_key, ++ .print_stats = ieee80211_tkip_print_stats, ++ .extra_prefix_len = 4 + 4 /* IV + ExtIV */, ++ .extra_postfix_len = 8 + 4 /* MIC + ICV */ ++}; ++ ++ ++static int __init ieee80211_crypto_tkip_init(void) ++{ ++ if (ieee80211_register_crypto_ops(&ieee80211_crypt_tkip) < 0) ++ return -1; ++ ++ return 0; ++} ++ ++ ++static void __exit ieee80211_crypto_tkip_exit(void) ++{ ++ ieee80211_unregister_crypto_ops(&ieee80211_crypt_tkip); ++} ++ ++ ++module_init(ieee80211_crypto_tkip_init); ++module_exit(ieee80211_crypto_tkip_exit); +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_crypt_wep.c u/drivers/net/wireless/ieee80211/ieee80211_crypt_wep.c +--- x/drivers/net/wireless/ieee80211/ieee80211_crypt_wep.c 1970-01-01 10:00:00.000000000 +1000 ++++ u/drivers/net/wireless/ieee80211/ieee80211_crypt_wep.c 2004-08-28 11:29:47.000000000 +1000 +@@ -0,0 +1,280 @@ ++/* ++ * Host AP crypt: host-based WEP encryption implementation for Host AP driver ++ * ++ * Copyright (c) 2002-2004, Jouni Malinen ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. See README and COPYING for ++ * more details. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "ieee80211.h" ++ ++#ifndef CONFIG_CRYPTO ++#error CONFIG_CRYPTO is required to build this module. ++#endif ++#include ++#include ++#include ++ ++#ifndef offset_in_page ++#define offset_in_page(p) ((unsigned long)(p) & ~PAGE_MASK) ++#endif ++ ++MODULE_AUTHOR("Jouni Malinen"); ++MODULE_DESCRIPTION("Host AP crypt: WEP"); ++MODULE_LICENSE("GPL"); ++ ++ ++struct prism2_wep_data { ++ u32 iv; ++#define WEP_KEY_LEN 13 ++ u8 key[WEP_KEY_LEN + 1]; ++ u8 key_len; ++ u8 key_idx; ++ struct crypto_tfm *tfm; ++}; ++ ++ ++static void * prism2_wep_init(int keyidx) ++{ ++ struct prism2_wep_data *priv; ++ ++ priv = (struct prism2_wep_data *) kmalloc(sizeof(*priv), GFP_ATOMIC); ++ if (priv == NULL) ++ goto fail; ++ memset(priv, 0, sizeof(*priv)); ++ priv->key_idx = keyidx; ++ ++ priv->tfm = crypto_alloc_tfm("arc4", 0); ++ if (priv->tfm == NULL) { ++ printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate " ++ "crypto API arc4\n"); ++ goto fail; ++ } ++ ++ /* start WEP IV from a random value */ ++ get_random_bytes(&priv->iv, 4); ++ ++ return priv; ++ ++fail: ++ if (priv) { ++ if (priv->tfm) ++ crypto_free_tfm(priv->tfm); ++ kfree(priv); ++ } ++ return NULL; ++} ++ ++ ++static void prism2_wep_deinit(void *priv) ++{ ++ struct prism2_wep_data *_priv = priv; ++ if (_priv && _priv->tfm) ++ crypto_free_tfm(_priv->tfm); ++ kfree(priv); ++} ++ ++ ++/* Perform WEP encryption on given skb that has at least 4 bytes of headroom ++ * for IV and 4 bytes of tailroom for ICV. Both IV and ICV will be transmitted, ++ * so the payload length increases with 8 bytes. ++ * ++ * WEP frame payload: IV + TX key idx, RC4(data), ICV = RC4(CRC32(data)) ++ */ ++static int prism2_wep_encrypt(struct sk_buff *skb, int hdr_len, void *priv) ++{ ++ struct prism2_wep_data *wep = priv; ++ u32 crc, klen, len; ++ u8 key[WEP_KEY_LEN + 3]; ++ u8 *pos, *icv; ++ struct scatterlist sg; ++ ++ if (skb_headroom(skb) < 4 || skb_tailroom(skb) < 4 || ++ skb->len < hdr_len) ++ return -1; ++ ++ len = skb->len - hdr_len; ++ pos = skb_push(skb, 4); ++ memmove(pos, pos + 4, hdr_len); ++ pos += hdr_len; ++ ++ klen = 3 + wep->key_len; ++ ++ wep->iv++; ++ ++ /* Fluhrer, Mantin, and Shamir have reported weaknesses in the key ++ * scheduling algorithm of RC4. At least IVs (KeyByte + 3, 0xff, N) ++ * can be used to speedup attacks, so avoid using them. */ ++ if ((wep->iv & 0xff00) == 0xff00) { ++ u8 B = (wep->iv >> 16) & 0xff; ++ if (B >= 3 && B < klen) ++ wep->iv += 0x0100; ++ } ++ ++ /* Prepend 24-bit IV to RC4 key and TX frame */ ++ *pos++ = key[0] = (wep->iv >> 16) & 0xff; ++ *pos++ = key[1] = (wep->iv >> 8) & 0xff; ++ *pos++ = key[2] = wep->iv & 0xff; ++ *pos++ = wep->key_idx << 6; ++ ++ /* Copy rest of the WEP key (the secret part) */ ++ memcpy(key + 3, wep->key, wep->key_len); ++ ++ /* Append little-endian CRC32 and encrypt it to produce ICV */ ++ crc = ~crc32_le(~0, pos, len); ++ icv = skb_put(skb, 4); ++ icv[0] = crc; ++ icv[1] = crc >> 8; ++ icv[2] = crc >> 16; ++ icv[3] = crc >> 24; ++ ++ crypto_cipher_setkey(wep->tfm, key, klen); ++ sg.page = virt_to_page(pos); ++ sg.offset = offset_in_page(pos); ++ sg.length = len + 4; ++ crypto_cipher_encrypt(wep->tfm, &sg, &sg, len + 4); ++ ++ return 0; ++} ++ ++ ++/* Perform WEP decryption on given buffer. Buffer includes whole WEP part of ++ * the frame: IV (4 bytes), encrypted payload (including SNAP header), ++ * ICV (4 bytes). len includes both IV and ICV. ++ * ++ * Returns 0 if frame was decrypted successfully and ICV was correct and -1 on ++ * failure. If frame is OK, IV and ICV will be removed. ++ */ ++static int prism2_wep_decrypt(struct sk_buff *skb, int hdr_len, void *priv) ++{ ++ struct prism2_wep_data *wep = priv; ++ u32 crc, klen, plen; ++ u8 key[WEP_KEY_LEN + 3]; ++ u8 keyidx, *pos, icv[4]; ++ struct scatterlist sg; ++ ++ if (skb->len < hdr_len + 8) ++ return -1; ++ ++ pos = skb->data + hdr_len; ++ key[0] = *pos++; ++ key[1] = *pos++; ++ key[2] = *pos++; ++ keyidx = *pos++ >> 6; ++ if (keyidx != wep->key_idx) ++ return -1; ++ ++ klen = 3 + wep->key_len; ++ ++ /* Copy rest of the WEP key (the secret part) */ ++ memcpy(key + 3, wep->key, wep->key_len); ++ ++ /* Apply RC4 to data and compute CRC32 over decrypted data */ ++ plen = skb->len - hdr_len - 8; ++ ++ crypto_cipher_setkey(wep->tfm, key, klen); ++ sg.page = virt_to_page(pos); ++ sg.offset = offset_in_page(pos); ++ sg.length = plen + 4; ++ crypto_cipher_decrypt(wep->tfm, &sg, &sg, plen + 4); ++ ++ crc = ~crc32_le(~0, pos, plen); ++ icv[0] = crc; ++ icv[1] = crc >> 8; ++ icv[2] = crc >> 16; ++ icv[3] = crc >> 24; ++ if (memcmp(icv, pos + plen, 4) != 0) { ++ /* ICV mismatch - drop frame */ ++ return -2; ++ } ++ ++ /* Remove IV and ICV */ ++ memmove(skb->data + 4, skb->data, hdr_len); ++ skb_pull(skb, 4); ++ skb_trim(skb, skb->len - 4); ++ ++ return 0; ++} ++ ++ ++static int prism2_wep_set_key(void *key, int len, u8 *seq, void *priv) ++{ ++ struct prism2_wep_data *wep = priv; ++ ++ if (len < 0 || len > WEP_KEY_LEN) ++ return -1; ++ ++ memcpy(wep->key, key, len); ++ wep->key_len = len; ++ ++ return 0; ++} ++ ++ ++static int prism2_wep_get_key(void *key, int len, u8 *seq, void *priv) ++{ ++ struct prism2_wep_data *wep = priv; ++ ++ if (len < wep->key_len) ++ return -1; ++ ++ memcpy(key, wep->key, wep->key_len); ++ ++ return wep->key_len; ++} ++ ++ ++static char * prism2_wep_print_stats(char *p, void *priv) ++{ ++ struct prism2_wep_data *wep = priv; ++ p += sprintf(p, "key[%d] alg=WEP len=%d\n", ++ wep->key_idx, wep->key_len); ++ return p; ++} ++ ++ ++static struct ieee80211_crypto_ops ieee80211_crypt_wep = { ++ .name = "WEP", ++ .init = prism2_wep_init, ++ .deinit = prism2_wep_deinit, ++ .encrypt_mpdu = prism2_wep_encrypt, ++ .decrypt_mpdu = prism2_wep_decrypt, ++ .encrypt_msdu = NULL, ++ .decrypt_msdu = NULL, ++ .set_key = prism2_wep_set_key, ++ .get_key = prism2_wep_get_key, ++ .print_stats = prism2_wep_print_stats, ++ .extra_prefix_len = 4 /* IV */, ++ .extra_postfix_len = 4 /* ICV */ ++}; ++ ++ ++static int __init ieee80211_crypto_wep_init(void) ++{ ++ if (ieee80211_register_crypto_ops(&ieee80211_crypt_wep) < 0) ++ return -1; ++ ++ return 0; ++} ++ ++ ++static void __exit ieee80211_crypto_wep_exit(void) ++{ ++ ieee80211_unregister_crypto_ops(&ieee80211_crypt_wep); ++} ++ ++ ++module_init(ieee80211_crypto_wep_init); ++module_exit(ieee80211_crypto_wep_exit); +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_module.c u/drivers/net/wireless/ieee80211/ieee80211_module.c +--- x/drivers/net/wireless/ieee80211/ieee80211_module.c 1970-01-01 10:00:00.000000000 +1000 ++++ u/drivers/net/wireless/ieee80211/ieee80211_module.c 2004-08-28 11:29:47.000000000 +1000 +@@ -0,0 +1,117 @@ ++/******************************************************************************* ++ ++ Copyright(c) 2004 Intel Corporation. All rights reserved. ++ ++ Portions of this file are based on the WEP enablement code provided by the ++ Host AP project hostap-drivers v0.1.3 ++ Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen ++ ++ Copyright (c) 2002-2003, Jouni Malinen ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms of version 2 of the GNU General Public License as ++ published by the Free Software Foundation. ++ ++ This program is distributed in the hope that it will be useful, but WITHOUT ++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ more details. ++ ++ You should have received a copy of the GNU General Public License along with ++ this program; if not, write to the Free Software Foundation, Inc., 59 ++ Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++ The full GNU General Public License is included in this distribution in the ++ file called LICENSE. ++ ++ Contact Information: ++ James P. Ketrenos ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++*******************************************************************************/ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "ieee802_11.h" ++#include "ieee80211.h" ++ ++#define MODULE_NAME "ieee80211" ++ ++MODULE_DESCRIPTION("802.11 data/management/control stack"); ++MODULE_AUTHOR("Copyright (C) 2004 Intel Corporation "); ++MODULE_LICENSE("GPL"); ++ ++struct ieee80211_device *ieee80211_alloc(struct net_device *dev, ++ void *priv) ++{ ++ struct ieee80211_device *ieee = kmalloc( ++ sizeof(struct ieee80211_device), GFP_KERNEL); ++ if (ieee == NULL) ++ return NULL; ++ memset(ieee, 0, sizeof(*ieee)); ++ ieee->dev = dev; ++ ieee->priv = priv; ++ ++ ieee->open_wep = 1; ++ ++#ifndef CONFIG_IEEE80211_NOWEP ++ /* Default to enabling full open WEP with host based encrypt/decrypt */ ++ ieee->host_encrypt = 1; ++ ieee->host_decrypt = 1; ++ ++ INIT_LIST_HEAD(&ieee->crypt_deinit_list); ++ init_timer(&ieee->crypt_deinit_timer); ++ ieee->crypt_deinit_timer.data = (unsigned long)ieee; ++ ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler; ++#endif ++ ++ /* Default fragmentation threshold is maximum payload size */ ++ ieee->fts = 2342; ++ ++ spin_lock_init(&ieee->lock); ++ ++ return ieee; ++} ++ ++void ieee80211_free(struct ieee80211_device *ieee) ++{ ++#ifndef CONFIG_IEEE80211_NOWEP ++ int i; ++ ++ del_timer_sync(&ieee->crypt_deinit_timer); ++ ieee80211_crypt_deinit_entries(ieee, 1); ++ ++ for (i = 0; i < WEP_KEYS; i++) { ++ struct ieee80211_crypt_data *crypt = ieee->crypt[i]; ++ if (crypt) { ++ if (crypt->ops) ++ crypt->ops->deinit(crypt->priv); ++ kfree(crypt); ++ ieee->crypt[i] = NULL; ++ } ++ } ++#endif ++ kfree(ieee); ++} ++ ++EXPORT_SYMBOL(ieee80211_alloc); ++EXPORT_SYMBOL(ieee80211_free); +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_rx.c u/drivers/net/wireless/ieee80211/ieee80211_rx.c +--- x/drivers/net/wireless/ieee80211/ieee80211_rx.c 1970-01-01 10:00:00.000000000 +1000 ++++ u/drivers/net/wireless/ieee80211/ieee80211_rx.c 2004-08-28 11:29:47.000000000 +1000 +@@ -0,0 +1,780 @@ ++/* ++ * Original code based Host AP (software wireless LAN access point) driver ++ * for Intersil Prism2/2.5/3 - hostap.o module, common routines ++ * ++ * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen ++ * ++ * Copyright (c) 2002-2003, Jouni Malinen ++ * Copyright (c) 2004, Intel Corporation ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. See README and COPYING for ++ * more details. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "ieee80211.h" ++ ++static inline void ieee80211_monitor_rx(struct ieee80211_device *ieee, ++ struct sk_buff *skb, ++ struct ieee80211_rx_stats *rx_stats) ++{ ++ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; ++ u16 fc = le16_to_cpu(hdr->frame_control); ++ ++ skb->dev = ieee->dev; ++ skb->mac.raw = skb->data; ++ skb_pull(skb, ieee80211_get_hdrlen(fc)); ++ skb->pkt_type = PACKET_OTHERHOST; ++ skb->protocol = __constant_htons(ETH_P_80211_RAW); ++ memset(skb->cb, 0, sizeof(skb->cb)); ++ netif_rx(skb); ++} ++ ++ ++/* Called only as a tasklet (software IRQ) */ ++static struct ieee80211_frag_entry * ++ieee80211_frag_cache_find(struct ieee80211_device *ieee, unsigned int seq, ++ unsigned int frag, u8 *src, u8 *dst) ++{ ++ struct ieee80211_frag_entry *entry; ++ int i; ++ ++ for (i = 0; i < IEEE80211_FRAG_CACHE_LEN; i++) { ++ entry = &ieee->frag_cache[i]; ++ if (entry->skb != NULL && ++ time_after(jiffies, entry->first_frag_time + 2 * HZ)) { ++ printk(KERN_DEBUG "%s: expiring fragment cache entry " ++ "seq=%u last_frag=%u\n", ++ ieee->dev->name, entry->seq, entry->last_frag); ++ dev_kfree_skb_any(entry->skb); ++ entry->skb = NULL; ++ } ++ ++ if (entry->skb != NULL && entry->seq == seq && ++ (entry->last_frag + 1 == frag || frag == -1) && ++ memcmp(entry->src_addr, src, ETH_ALEN) == 0 && ++ memcmp(entry->dst_addr, dst, ETH_ALEN) == 0) ++ return entry; ++ } ++ ++ return NULL; ++} ++ ++/* Called only as a tasklet (software IRQ) */ ++static struct sk_buff * ++ieee80211_frag_cache_get(struct ieee80211_device *ieee, ++ struct ieee80211_hdr *hdr) ++{ ++ struct sk_buff *skb = NULL; ++ u16 sc; ++ unsigned int frag, seq; ++ struct ieee80211_frag_entry *entry; ++ ++ sc = le16_to_cpu(hdr->seq_ctrl); ++ frag = WLAN_GET_SEQ_FRAG(sc); ++ seq = WLAN_GET_SEQ_SEQ(sc); ++ ++ if (frag == 0) { ++ /* Reserve enough space to fit maximum frame length */ ++ skb = dev_alloc_skb(ieee->dev->mtu + ++ sizeof(struct ieee80211_hdr) + ++ 8 /* LLC */ + ++ 2 /* alignment */ + ++ 8 /* WEP */ + ETH_ALEN /* WDS */); ++ if (skb == NULL) ++ return NULL; ++ ++ entry = &ieee->frag_cache[ieee->frag_next_idx]; ++ ieee->frag_next_idx++; ++ if (ieee->frag_next_idx >= IEEE80211_FRAG_CACHE_LEN) ++ ieee->frag_next_idx = 0; ++ ++ if (entry->skb != NULL) ++ dev_kfree_skb_any(entry->skb); ++ ++ entry->first_frag_time = jiffies; ++ entry->seq = seq; ++ entry->last_frag = frag; ++ entry->skb = skb; ++ memcpy(entry->src_addr, hdr->addr2, ETH_ALEN); ++ memcpy(entry->dst_addr, hdr->addr1, ETH_ALEN); ++ } else { ++ /* received a fragment of a frame for which the head fragment ++ * should have already been received */ ++ entry = ieee80211_frag_cache_find(ieee, seq, frag, hdr->addr2, ++ hdr->addr1); ++ if (entry != NULL) { ++ entry->last_frag = frag; ++ skb = entry->skb; ++ } ++ } ++ ++ return skb; ++} ++ ++ ++/* Called only as a tasklet (software IRQ) */ ++static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee, ++ struct ieee80211_hdr *hdr) ++{ ++ u16 sc; ++ unsigned int seq; ++ struct ieee80211_frag_entry *entry; ++ ++ sc = le16_to_cpu(hdr->seq_ctrl); ++ seq = WLAN_GET_SEQ_SEQ(sc); ++ ++ entry = ieee80211_frag_cache_find(ieee, seq, -1, hdr->addr2, ++ hdr->addr1); ++ ++ if (entry == NULL) { ++ printk(KERN_DEBUG "%s: could not invalidate fragment cache " ++ "entry (seq=%u)\n", ++ ieee->dev->name, seq); ++ return -1; ++ } ++ ++ entry->skb = NULL; ++ return 0; ++} ++ ++ ++#ifdef NOT_YET ++/* ieee80211_rx_frame_mgtmt ++ * ++ * Responsible for handling management control frames ++ * ++ * Called by ieee80211_rx */ ++static inline int ++ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb, ++ struct ieee80211_rx_stats *rx_stats, u16 type, ++ u16 stype) ++{ ++ if (ieee->iw_mode == IW_MODE_MASTER) { ++ printk(KERN_DEBUG "%s: Master mode not yet suppported.\n", ++ ieee->dev->name); ++ return 0; ++/* ++ hostap_update_sta_ps(ieee, (struct hostap_ieee80211_hdr *) ++ skb->data);*/ ++ } ++ ++ if (ieee->hostapd && type == WLAN_FC_TYPE_MGMT) { ++ if (stype == WLAN_FC_STYPE_BEACON && ++ ieee->iw_mode == IW_MODE_MASTER) { ++ struct sk_buff *skb2; ++ /* Process beacon frames also in kernel driver to ++ * update STA(AP) table statistics */ ++ skb2 = skb_clone(skb, GFP_ATOMIC); ++ if (skb2) ++ hostap_rx(skb2->dev, skb2, rx_stats); ++ } ++ ++ /* send management frames to the user space daemon for ++ * processing */ ++ ieee->apdevstats.rx_packets++; ++ ieee->apdevstats.rx_bytes += skb->len; ++ prism2_rx_80211(ieee->apdev, skb, rx_stats, PRISM2_RX_MGMT); ++ return 0; ++ } ++ ++ if (ieee->iw_mode == IW_MODE_MASTER) { ++ if (type != WLAN_FC_TYPE_MGMT && type != WLAN_FC_TYPE_CTRL) { ++ printk(KERN_DEBUG "%s: unknown management frame " ++ "(type=0x%02x, stype=0x%02x) dropped\n", ++ skb->dev->name, type, stype); ++ return -1; ++ } ++ ++ hostap_rx(skb->dev, skb, rx_stats); ++ return 0; ++ } ++ ++ printk(KERN_DEBUG "%s: hostap_rx_frame_mgmt: management frame " ++ "received in non-Host AP mode\n", skb->dev->name); ++ return -1; ++} ++#endif ++ ++ ++/* See IEEE 802.1H for LLC/SNAP encapsulation/decapsulation */ ++/* Ethernet-II snap header (RFC1042 for most EtherTypes) */ ++static unsigned char rfc1042_header[] = ++{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 }; ++/* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */ ++static unsigned char bridge_tunnel_header[] = ++{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 }; ++/* No encapsulation header if EtherType < 0x600 (=length) */ ++ ++#ifndef CONFIG_IEEE80211_NOWEP ++/* Called by ieee80211_rx_frame_decrypt */ ++static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee, ++ struct sk_buff *skb) ++{ ++ struct net_device *dev = ieee->dev; ++ u16 fc, ethertype; ++ struct ieee80211_hdr *hdr; ++ u8 *pos; ++ ++ if (skb->len < 24) ++ return 0; ++ ++ hdr = (struct ieee80211_hdr *) skb->data; ++ fc = le16_to_cpu(hdr->frame_control); ++ ++ /* check that the frame is unicast frame to us */ ++ if ((fc & (IEEE802_11_FCTL_TODS | IEEE802_11_FCTL_FROMDS)) == ++ IEEE802_11_FCTL_TODS && ++ memcmp(hdr->addr1, dev->dev_addr, ETH_ALEN) == 0 && ++ memcmp(hdr->addr3, dev->dev_addr, ETH_ALEN) == 0) { ++ /* ToDS frame with own addr BSSID and DA */ ++ } else if ((fc & (IEEE802_11_FCTL_TODS | IEEE802_11_FCTL_FROMDS)) == ++ IEEE802_11_FCTL_FROMDS && ++ memcmp(hdr->addr1, dev->dev_addr, ETH_ALEN) == 0) { ++ /* FromDS frame with own addr as DA */ ++ } else ++ return 0; ++ ++ if (skb->len < 24 + 8) ++ return 0; ++ ++ /* check for port access entity Ethernet type */ ++ pos = skb->data + 24; ++ ethertype = (pos[6] << 8) | pos[7]; ++ if (ethertype == ETH_P_PAE) ++ return 1; ++ ++ return 0; ++} ++ ++/* Called only as a tasklet (software IRQ), by ieee80211_rx */ ++static inline int ++ieee80211_rx_frame_decrypt(struct ieee80211_device* ieee, struct sk_buff *skb, ++ struct ieee80211_crypt_data *crypt) ++{ ++ struct ieee80211_hdr *hdr; ++ int res, hdrlen; ++ ++ if (crypt == NULL || crypt->ops->decrypt_mpdu == NULL) ++ return 0; ++ ++ hdr = (struct ieee80211_hdr *) skb->data; ++ hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_control)); ++ ++#ifdef NOT_YET ++ if (ieee->tkip_countermeasures && ++ strcmp(crypt->ops->name, "TKIP") == 0) { ++ if (net_ratelimit()) { ++ printk(KERN_DEBUG "%s: TKIP countermeasures: dropped " ++ "received packet from " MACSTR "\n", ++ ieee->dev->name, MAC2STR(hdr->addr2)); ++ } ++ return -1; ++ } ++#endif ++ ++ atomic_inc(&crypt->refcnt); ++ res = crypt->ops->decrypt_mpdu(skb, hdrlen, crypt->priv); ++ atomic_dec(&crypt->refcnt); ++ if (res < 0) { ++ printk(KERN_DEBUG "%s: decryption failed (SA=" MACSTR ++ ") res=%d\n", ++ ieee->dev->name, MAC2STR(hdr->addr2), res); ++ if (res == -2) ++ printk(KERN_DEBUG "%s: WEP decryption failed ICV mismatch\n", ++ ieee->dev->name); ++ ieee->ieee_stats.rx_discards_wep_undecryptable++; ++ return -1; ++ } ++ ++ return res; ++} ++ ++ ++/* Called only as a tasklet (software IRQ), by ieee80211_rx */ ++static inline int ++ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device* ieee, struct sk_buff *skb, ++ int keyidx, struct ieee80211_crypt_data *crypt) ++{ ++ struct ieee80211_hdr *hdr; ++ int res, hdrlen; ++ ++ if (crypt == NULL || crypt->ops->decrypt_msdu == NULL) ++ return 0; ++ ++ hdr = (struct ieee80211_hdr *) skb->data; ++ hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_control)); ++ ++ atomic_inc(&crypt->refcnt); ++ res = crypt->ops->decrypt_msdu(skb, keyidx, hdrlen, crypt->priv); ++ atomic_dec(&crypt->refcnt); ++ if (res < 0) { ++ printk(KERN_DEBUG "%s: MSDU decryption/MIC verification failed" ++ " (SA=" MACSTR " keyidx=%d)\n", ++ ieee->dev->name, MAC2STR(hdr->addr2), keyidx); ++ return -1; ++ } ++ ++ return 0; ++} ++#endif /* CONFIG_IEEE80211_NOWEP */ ++ ++ ++/* All received frames are sent to this function. @skb contains the frame in ++ * IEEE 802.11 format, i.e., in the format it was sent over air. ++ * This function is called only as a tasklet (software IRQ). */ ++int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb, ++ struct ieee80211_rx_stats *rx_stats) ++{ ++ struct net_device *dev = ieee->dev; ++ struct ieee80211_hdr *hdr; ++ size_t hdrlen; ++ u16 fc, type, stype, sc; ++ struct net_device_stats *stats; ++ unsigned int frag; ++ u8 *payload; ++ u16 ethertype; ++#ifdef NOT_YET ++ struct net_device *wds = NULL; ++ struct sk_buff *skb2 = NULL; ++ struct net_device *wds = NULL; ++ int frame_authorized = 0; ++ int from_assoc_ap = 0; ++ void *sta = NULL; ++#endif ++ u8 dst[ETH_ALEN]; ++ u8 src[ETH_ALEN]; ++#ifndef CONFIG_IEEE80211_NOWEP ++ struct ieee80211_crypt_data *crypt = NULL; ++ int keyidx = 0; ++#endif /* CONFIG_IEEE80211_NOWEP */ ++ ++ hdr = (struct ieee80211_hdr *)skb->data; ++ stats = &ieee->stats; ++ ++ if (skb->len < 10) { ++ printk(KERN_INFO "%s: SKB length < 10\n", ++ dev->name); ++ goto rx_dropped; ++ } ++ ++ fc = le16_to_cpu(hdr->frame_control); ++ type = WLAN_FC_GET_TYPE(fc); ++ stype = WLAN_FC_GET_STYPE(fc); ++ sc = le16_to_cpu(hdr->seq_ctrl); ++ frag = WLAN_GET_SEQ_FRAG(sc); ++ hdrlen = ieee80211_get_hdrlen(fc); ++ ++#ifdef NOT_YET ++#if WIRELESS_EXT > 15 ++ /* Put this code here so that we avoid duplicating it in all ++ * Rx paths. - Jean II */ ++#ifdef IW_WIRELESS_SPY /* defined in iw_handler.h */ ++ /* If spy monitoring on */ ++ if (iface->spy_data.spy_number > 0) { ++ struct iw_quality wstats; ++ wstats.level = rx_stats->signal; ++ wstats.noise = rx_stats->noise; ++ wstats.updated = 6; /* No qual value */ ++ /* Update spy records */ ++ wireless_spy_update(dev, hdr->addr2, &wstats); ++ } ++#endif /* IW_WIRELESS_SPY */ ++#endif /* WIRELESS_EXT > 15 */ ++ hostap_update_rx_stats(local->ap, hdr, rx_stats); ++#endif ++ ++#if WIRELESS_EXT > 15 ++ if (ieee->iw_mode == IW_MODE_MONITOR) { ++ ieee80211_monitor_rx(ieee, skb, rx_stats); ++ stats->rx_packets++; ++ stats->rx_bytes += skb->len; ++ return 1; ++ } ++#endif ++ ++#ifndef CONFIG_IEEE80211_NOWEP ++ if (ieee->host_decrypt) { ++ int idx = 0; ++ if (skb->len >= hdrlen + 3) ++ idx = skb->data[hdrlen + 3] >> 6; ++ crypt = ieee->crypt[idx]; ++#ifdef NOT_YET ++ sta = NULL; ++ ++ /* Use station specific key to override default keys if the ++ * receiver address is a unicast address ("individual RA"). If ++ * bcrx_sta_key parameter is set, station specific key is used ++ * even with broad/multicast targets (this is against IEEE ++ * 802.11, but makes it easier to use different keys with ++ * stations that do not support WEP key mapping). */ ++ ++ if (!(hdr->addr1[0] & 0x01) || local->bcrx_sta_key) ++ (void) hostap_handle_sta_crypto(local, hdr, &crypt, ++ &sta); ++#endif ++ ++ /* allow NULL decrypt to indicate an station specific override ++ * for default encryption */ ++ if (crypt && (crypt->ops == NULL || ++ crypt->ops->decrypt_mpdu == NULL)) ++ crypt = NULL; ++ ++ if (!crypt && (fc & IEEE802_11_FCTL_WEP)) { ++#if 0 ++ /* This seems to be triggered by some (multicast?) ++ * frames from other than current BSS, so just drop the ++ * frames silently instead of filling system log with ++ * these reports. */ ++ printk(KERN_DEBUG "%s: WEP decryption failed (not set)" ++ " (SA=" MACSTR ")\n", ++ ieee->dev->name, MAC2STR(hdr->addr2)); ++#endif ++ ieee->ieee_stats.rx_discards_wep_undecryptable++; ++ goto rx_dropped; ++ } ++ } ++#endif /* CONFIG_IEEE80211_NOWEP */ ++ ++#ifdef NOT_YET ++ if (type != WLAN_FC_TYPE_DATA) { ++ if (type == WLAN_FC_TYPE_MGMT && stype == WLAN_FC_STYPE_AUTH && ++ fc & IEEE802_11_FCTL_WEP && ieee->host_decrypt && ++ (keyidx = hostap_rx_frame_decrypt(ieee, skb, crypt)) < 0) ++ { ++ printk(KERN_DEBUG "%s: failed to decrypt mgmt::auth " ++ "from " MACSTR "\n", dev->name, ++ MAC2STR(hdr->addr2)); ++ /* TODO: could inform hostapd about this so that it ++ * could send auth failure report */ ++ goto rx_dropped; ++ } ++ ++ if (ieee80211_rx_frame_mgmt(ieee, skb, rx_stats, type, stype)) ++ goto rx_dropped; ++ else ++ goto rx_exit; ++ } ++#endif ++ ++ /* Data frame - extract src/dst addresses */ ++ if (skb->len < IEEE80211_DATA_HDR3_LEN) ++ goto rx_dropped; ++ ++ switch (fc & (IEEE802_11_FCTL_FROMDS | IEEE802_11_FCTL_TODS)) { ++ case IEEE802_11_FCTL_FROMDS: ++ memcpy(dst, hdr->addr1, ETH_ALEN); ++ memcpy(src, hdr->addr3, ETH_ALEN); ++ break; ++ case IEEE802_11_FCTL_TODS: ++ memcpy(dst, hdr->addr3, ETH_ALEN); ++ memcpy(src, hdr->addr2, ETH_ALEN); ++ break; ++ case IEEE802_11_FCTL_FROMDS | IEEE802_11_FCTL_TODS: ++ if (skb->len < IEEE80211_DATA_HDR4_LEN) ++ goto rx_dropped; ++ memcpy(dst, hdr->addr3, ETH_ALEN); ++ memcpy(src, hdr->addr4, ETH_ALEN); ++ break; ++ case 0: ++ memcpy(dst, hdr->addr1, ETH_ALEN); ++ memcpy(src, hdr->addr2, ETH_ALEN); ++ break; ++ } ++ ++#ifdef NOT_YET ++ if (hostap_rx_frame_wds(ieee, hdr, fc, &wds)) ++ goto rx_dropped; ++ if (wds) { ++ skb->dev = dev = wds; ++ stats = hostap_get_stats(dev); ++ } ++ ++ if (ieee->iw_mode == IW_MODE_MASTER && !wds && ++ (fc & (IEEE802_11_FCTL_TODS | IEEE802_11_FCTL_FROMDS)) == IEEE802_11_FCTL_FROMDS && ++ ieee->stadev && ++ memcmp(hdr->addr2, ieee->assoc_ap_addr, ETH_ALEN) == 0) { ++ /* Frame from BSSID of the AP for which we are a client */ ++ skb->dev = dev = ieee->stadev; ++ stats = hostap_get_stats(dev); ++ from_assoc_ap = 1; ++ } ++#endif ++ ++ dev->last_rx = jiffies; ++ ++#ifdef NOT_YET ++ if ((ieee->iw_mode == IW_MODE_MASTER || ++ ieee->iw_mode == IW_MODE_REPEAT) && ++ !from_assoc_ap) { ++ switch (hostap_handle_sta_rx(ieee, dev, skb, rx_stats, ++ wds != NULL)) { ++ case AP_RX_CONTINUE_NOT_AUTHORIZED: ++ frame_authorized = 0; ++ break; ++ case AP_RX_CONTINUE: ++ frame_authorized = 1; ++ break; ++ case AP_RX_DROP: ++ goto rx_dropped; ++ case AP_RX_EXIT: ++ goto rx_exit; ++ } ++ } ++#endif ++ ++ /* Nullfunc frames may have PS-bit set, so they must be passed to ++ * hostap_handle_sta_rx() before being dropped here. */ ++ if (stype != IEEE802_11_STYPE_DATA && ++ stype != IEEE802_11_STYPE_DATA_CFACK && ++ stype != IEEE802_11_STYPE_DATA_CFPOLL && ++ stype != IEEE802_11_STYPE_DATA_CFACKPOLL) { ++ if (stype != IEEE802_11_STYPE_NULLFUNC) ++ printk(KERN_DEBUG "%s: RX: dropped data frame " ++ "with no data (type=0x%02x, subtype=0x%02x, len=%d)\n", ++ dev->name, type, stype, skb->len); ++ goto rx_dropped; ++ } ++ ++ /* skb: hdr + (possibly fragmented, possibly encrypted) payload */ ++ ++#ifndef CONFIG_IEEE80211_NOWEP ++ if (ieee->host_decrypt && (fc & IEEE802_11_FCTL_WEP) && ++ (keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0) ++ goto rx_dropped; ++#endif ++ hdr = (struct ieee80211_hdr *) skb->data; ++ ++ /* skb: hdr + (possibly fragmented) plaintext payload */ ++ // PR: FIXME: hostap has additional conditions in the "if" below: ++ // ieee->host_decrypt && (fc & IEEE802_11_FCTL_WEP) && ++ if ((frag != 0 || (fc & IEEE802_11_FCTL_MOREFRAGS))) { ++ int flen; ++ struct sk_buff *frag_skb = ieee80211_frag_cache_get(ieee, hdr); ++ if (!frag_skb) { ++ printk(KERN_DEBUG "%s: Rx cannot get skb from " ++ "fragment cache (morefrag=%d seq=%u frag=%u)\n", ++ dev->name, ++ (fc & IEEE802_11_FCTL_MOREFRAGS) != 0, ++ WLAN_GET_SEQ_SEQ(sc), frag); ++ goto rx_dropped; ++ } ++ ++ flen = skb->len; ++ if (frag != 0) ++ flen -= hdrlen; ++ ++ if (frag_skb->tail + flen > frag_skb->end) { ++ printk(KERN_WARNING "%s: host decrypted and " ++ "reassembled frame did not fit skb\n", ++ dev->name); ++ ieee80211_frag_cache_invalidate(ieee, hdr); ++ goto rx_dropped; ++ } ++ ++ if (frag == 0) { ++ /* copy first fragment (including full headers) into ++ * beginning of the fragment cache skb */ ++ memcpy(skb_put(frag_skb, flen), skb->data, flen); ++ } else { ++ /* append frame payload to the end of the fragment ++ * cache skb */ ++ memcpy(skb_put(frag_skb, flen), skb->data + hdrlen, ++ flen); ++ } ++ dev_kfree_skb_any(skb); ++ skb = NULL; ++ ++ if (fc & IEEE802_11_FCTL_MOREFRAGS) { ++ /* more fragments expected - leave the skb in fragment ++ * cache for now; it will be delivered to upper layers ++ * after all fragments have been received */ ++ goto rx_exit; ++ } ++ ++ /* this was the last fragment and the frame will be ++ * delivered, so remove skb from fragment cache */ ++ skb = frag_skb; ++ hdr = (struct ieee80211_hdr *) skb->data; ++ ieee80211_frag_cache_invalidate(ieee, hdr); ++ } ++ ++ /* skb: hdr + (possible reassembled) full MSDU payload; possibly still ++ * encrypted/authenticated */ ++#ifndef CONFIG_IEEE80211_NOWEP ++ if (ieee->host_decrypt && (fc & IEEE802_11_FCTL_WEP) && ++ ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt)) ++ goto rx_dropped; ++ ++ hdr = (struct ieee80211_hdr *) skb->data; ++ if (crypt && !(fc & IEEE802_11_FCTL_WEP) && !ieee->open_wep) { ++ if (/*ieee->ieee_802_1x &&*/ ++ ieee80211_is_eapol_frame(ieee, skb)) { ++ /* pass unencrypted EAPOL frames even if encryption is ++ * configured */ ++ printk(KERN_DEBUG "%s: RX: IEEE 802.1X - passing " ++ "unencrypted EAPOL frame\n", ieee->dev->name); ++ } else { ++ printk(KERN_DEBUG "%s: encryption configured, but RX " ++ "frame not encrypted (SA=" MACSTR ")\n", ++ ieee->dev->name, MAC2STR(hdr->addr2)); ++ goto rx_dropped; ++ } ++ } ++ ++ if (/*ieee->drop_unencrypted*/ crypt && !(fc & IEEE802_11_FCTL_WEP) && !ieee->open_wep && ++ !ieee80211_is_eapol_frame(ieee, skb)) { ++ if (net_ratelimit()) { ++ printk(KERN_DEBUG "%s: dropped unencrypted RX data " ++ "frame from " MACSTR " (drop_unencrypted=1)\n", ++ dev->name, MAC2STR(hdr->addr2)); ++ } ++ goto rx_dropped; ++ } ++#endif /* CONFIG_IEEE80211_NOWEP */ ++ ++ /* skb: hdr + (possible reassembled) full plaintext payload */ ++ ++ payload = skb->data + hdrlen; ++ ethertype = (payload[6] << 8) | payload[7]; ++ ++#ifdef NOT_YET ++ /* If IEEE 802.1X is used, check whether the port is authorized to send ++ * the received frame. */ ++ if (ieee->ieee_802_1x && ieee->iw_mode == IW_MODE_MASTER) { ++ if (ethertype == ETH_P_PAE) { ++ printk(KERN_DEBUG "%s: RX: IEEE 802.1X frame\n", ++ dev->name); ++ if (ieee->hostapd && ieee->apdev) { ++ /* Send IEEE 802.1X frames to the user ++ * space daemon for processing */ ++ prism2_rx_80211(ieee->apdev, skb, rx_stats, ++ PRISM2_RX_MGMT); ++ ieee->apdevstats.rx_packets++; ++ ieee->apdevstats.rx_bytes += skb->len; ++ goto rx_exit; ++ } ++ } else if (!frame_authorized) { ++ printk(KERN_DEBUG "%s: dropped frame from " ++ "unauthorized port (IEEE 802.1X): " ++ "ethertype=0x%04x\n", ++ dev->name, ethertype); ++ goto rx_dropped; ++ } ++ } ++#endif ++ ++ /* convert hdr + possible LLC headers into Ethernet header */ ++ if (skb->len - hdrlen >= 8 && ++ ((memcmp(payload, rfc1042_header, SNAP_SIZE) == 0 && ++ ethertype != ETH_P_AARP && ethertype != ETH_P_IPX) || ++ memcmp(payload, bridge_tunnel_header, SNAP_SIZE) == 0)) { ++ /* remove RFC1042 or Bridge-Tunnel encapsulation and ++ * replace EtherType */ ++ skb_pull(skb, hdrlen + SNAP_SIZE); ++ memcpy(skb_push(skb, ETH_ALEN), src, ETH_ALEN); ++ memcpy(skb_push(skb, ETH_ALEN), dst, ETH_ALEN); ++ } else { ++ u16 len; ++ /* Leave Ethernet header part of hdr and full payload */ ++ skb_pull(skb, hdrlen); ++ len = htons(skb->len); ++ memcpy(skb_push(skb, 2), &len, 2); ++ memcpy(skb_push(skb, ETH_ALEN), src, ETH_ALEN); ++ memcpy(skb_push(skb, ETH_ALEN), dst, ETH_ALEN); ++ } ++ ++#ifdef NOT_YET ++ if (wds && ((fc & (IEEE802_11_FCTL_TODS | IEEE802_11_FCTL_FROMDS)) == ++ IEEE802_11_FCTL_TODS) && ++ skb->len >= ETH_HLEN + ETH_ALEN) { ++ /* Non-standard frame: get addr4 from its bogus location after ++ * the payload */ ++ memcpy(skb->data + ETH_ALEN, ++ skb->data + skb->len - ETH_ALEN, ETH_ALEN); ++ skb_trim(skb, skb->len - ETH_ALEN); ++ } ++#endif ++ ++ stats->rx_packets++; ++ stats->rx_bytes += skb->len; ++ ++#ifdef NOT_YET ++ if (ieee->iw_mode == IW_MODE_MASTER && !wds && ++ ieee->ap->bridge_packets) { ++ if (dst[0] & 0x01) { ++ /* copy multicast frame both to the higher layers and ++ * to the wireless media */ ++ ieee->ap->bridged_multicast++; ++ skb2 = skb_clone(skb, GFP_ATOMIC); ++ if (skb2 == NULL) ++ printk(KERN_DEBUG "%s: skb_clone failed for " ++ "multicast frame\n", dev->name); ++ } else if (hostap_is_sta_assoc(ieee->ap, dst)) { ++ /* send frame directly to the associated STA using ++ * wireless media and not passing to higher layers */ ++ ieee->ap->bridged_unicast++; ++ skb2 = skb; ++ skb = NULL; ++ } ++ } ++ ++ if (skb2 != NULL) { ++ /* send to wireless media */ ++ skb2->protocol = __constant_htons(ETH_P_802_3); ++ skb2->mac.raw = skb2->nh.raw = skb2->data; ++ /* skb2->nh.raw = skb2->data + ETH_HLEN; */ ++ skb2->dev = dev; ++ dev_queue_xmit(skb2); ++ } ++ ++#endif ++ ++ if (skb) { ++ skb->protocol = eth_type_trans(skb, dev); ++ memset(skb->cb, 0, sizeof(skb->cb)); ++ skb->dev = dev; ++ skb->ip_summed = CHECKSUM_NONE; /* 802.11 crc not sufficient */ ++ netif_rx(skb); ++ } ++ ++ rx_exit: ++#ifdef NOT_YET ++ if (sta) ++ hostap_handle_sta_release(sta); ++#endif ++ return 1; ++ ++ rx_dropped: ++ stats->rx_dropped++; ++ ++ /* Returning 0 indicates to caller that we have not handled the SKB-- ++ * so it is still allocated and can be used again by underlying ++ * hardware as a DMA target */ ++ return 0; ++} ++ ++EXPORT_SYMBOL(ieee80211_rx); +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_tx.c u/drivers/net/wireless/ieee80211/ieee80211_tx.c +--- x/drivers/net/wireless/ieee80211/ieee80211_tx.c 1970-01-01 10:00:00.000000000 +1000 ++++ u/drivers/net/wireless/ieee80211/ieee80211_tx.c 2004-08-28 11:29:47.000000000 +1000 +@@ -0,0 +1,368 @@ ++/****************************************************************************** ++ ++ Copyright(c) 2003 - 2004 Intel Corporation. All rights reserved. ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms of version 2 of the GNU General Public License as ++ published by the Free Software Foundation. ++ ++ This program is distributed in the hope that it will be useful, but WITHOUT ++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ more details. ++ ++ You should have received a copy of the GNU General Public License along with ++ this program; if not, write to the Free Software Foundation, Inc., 59 ++ Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++ The full GNU General Public License is included in this distribution in the ++ file called LICENSE. ++ ++ Contact Information: ++ James P. Ketrenos ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++******************************************************************************/ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "ieee80211.h" ++ ++ ++/* ++ ++ ++802.11 Data Frame ++ ++ ,-------------------------------------------------------------------. ++Bytes | 2 | 2 | 6 | 6 | 6 | 2 | 0..2312 | 4 | ++ |------|------|---------|---------|---------|------|---------|------| ++Desc. | ctrl | dura | DA/RA | TA | SA | Sequ | Frame | fcs | ++ | | tion | (BSSID) | | | ence | data | | ++ `--------------------------------------------------| |------' ++Total: 28 non-data bytes `----.----' ++ | ++ .- 'Frame data' expands to <---------------------------' ++ | ++ V ++ ,---------------------------------------------------. ++Bytes | 1 | 1 | 1 | 3 | 2 | 0-2304 | ++ |------|------|---------|----------|------|---------| ++Desc. | SNAP | SNAP | Control |Eth Tunnel| Type | IP | ++ | DSAP | SSAP | | | | Packet | ++ | 0xAA | 0xAA |0x03 (UI)|0x00-00-F8| | | ++ `-----------------------------------------| | ++Total: 8 non-data bytes `----.----' ++ | ++ .- 'IP Packet' expands, if WEP enabled, to <--' ++ | ++ V ++ ,-----------------------. ++Bytes | 4 | 0-2296 | 4 | ++ |-----|-----------|-----| ++Desc. | IV | Encrypted | ICV | ++ | | IP Packet | | ++ `-----------------------' ++Total: 8 non-data bytes ++ ++ ++802.3 Ethernet Data Frame ++ ++ ,-----------------------------------------. ++Bytes | 6 | 6 | 2 | Variable | 4 | ++ |-------|-------|------|-----------|------| ++Desc. | Dest. | Source| Type | IP Packet | fcs | ++ | MAC | MAC | | | | ++ `-----------------------------------------' ++Total: 18 non-data bytes ++ ++In the event that fragmentation is required, the incoming payload is split into ++N parts of size ieee->fts. The first fragment contains the SNAP header and the ++remaining packets are just data. ++ ++If encryption is enabled, each fragment payload size is reduced by enough space ++to add the prefix and postfix (IV and ICV totalling 8 bytes in the case of WEP) ++So if you have 1500 bytes of payload with ieee->fts set to 500 without ++encryption it will take 3 frames. With WEP it will take 4 frames as the ++payload of each frame is reduced to 492 bytes. ++ ++* SKB visualization ++* ++* ,- skb->data ++* | ++* | ETHERNET HEADER ,-<-- PAYLOAD ++* | | 14 bytes from skb->data ++* | 2 bytes for Type --> ,T. | (sizeof ethhdr) ++* | | | | ++* |,-Dest.--. ,--Src.---. | | | ++* | 6 bytes| | 6 bytes | | | | ++* v | | | | | | ++* 0 | v 1 | v | v 2 ++* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 ++* ^ | ^ | ^ | ++* | | | | | | ++* | | | | `T' <---- 2 bytes for Type ++* | | | | ++* | | '---SNAP--' <-------- 6 bytes for SNAP ++* | | ++* `-IV--' <-------------------- 4 bytes for IV (WEP) ++* ++* SNAP HEADER ++* ++*/ ++ ++static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 }; ++static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 }; ++ ++static inline int ieee80211_put_snap(u8 *data, u16 h_proto) ++{ ++ struct ieee80211_snap_hdr *snap; ++ u8 *oui; ++ ++ snap = (struct ieee80211_snap_hdr *)data; ++ snap->dsap = 0xaa; ++ snap->ssap = 0xaa; ++ snap->ctrl = 0x03; ++ ++ if (h_proto == 0x8137 || h_proto == 0x80f3) ++ oui = P802_1H_OUI; ++ else ++ oui = RFC1042_OUI; ++ snap->oui[0] = oui[0]; ++ snap->oui[1] = oui[1]; ++ snap->oui[2] = oui[2]; ++ ++ *(u16 *)(data + SNAP_SIZE) = htons(h_proto); ++ ++ return SNAP_SIZE + sizeof(u16); ++} ++ ++#ifndef CONFIG_IEEE80211_NOWEP ++static inline int ieee80211_encrypt_fragment( ++ struct ieee80211_device *ieee, ++ struct sk_buff *frag, ++ int hdr_len) ++{ ++ struct ieee80211_crypt_data* crypt = ieee->crypt[ieee->tx_keyidx]; ++ int res; ++ ++#ifdef NOT_YET ++ if (ieee->tkip_countermeasures && ++ crypt && crypt->ops && strcmp(crypt->ops->name, "TKIP") == 0) { ++ hdr = (struct ieee80211_hdr *) skb->data; ++ if (net_ratelimit()) { ++ printk(KERN_DEBUG "%s: TKIP countermeasures: dropped " ++ "TX packet to " MACSTR "\n", ++ ieee->dev->name, MAC2STR(hdr->addr1)); ++ } ++ return NULL; ++ } ++#endif ++ ++ /* To encrypt, frame format is: ++ * IV (4 bytes), clear payload (including SNAP), ICV (4 bytes) */ ++ ++ // PR: FIXME: Copied from hostap. Check fragmentation/MSDU/MPDU encryption. ++ /* Host-based IEEE 802.11 fragmentation for TX is not yet supported, so ++ * call both MSDU and MPDU encryption functions from here. */ ++ atomic_inc(&crypt->refcnt); ++ res = 0; ++ if (crypt->ops->encrypt_msdu) ++ res = crypt->ops->encrypt_msdu(frag, hdr_len, crypt->priv); ++ if (res == 0 && crypt->ops->encrypt_mpdu) ++ res = crypt->ops->encrypt_mpdu(frag, hdr_len, crypt->priv); ++ ++ atomic_dec(&crypt->refcnt); ++ if (res < 0) { ++ printk(KERN_INFO "%s: Encryption failed: len=%d.\n", ++ ieee->dev->name, frag->len); ++ ieee->ieee_stats.tx_discards++; ++ return -1; ++ } ++ ++ return 0; ++} ++#endif ++ ++void ieee80211_txb_free(struct ieee80211_txb *txb) { ++ int i; ++ if (unlikely(!txb)) ++ return; ++ for (i = 0; i < txb->nr_frags; i++) ++ if (txb->fragments[i]) ++ dev_kfree_skb_any(txb->fragments[i]); ++ kfree(txb); ++} ++ ++struct ieee80211_txb *ieee80211_alloc_txb(int nr_frags, int txb_size, ++ int gfp_mask) { ++ struct ieee80211_txb *txb; ++ int i; ++ txb = (struct ieee80211_txb *)kmalloc( ++ sizeof(struct ieee80211_txb) + (sizeof(u8*) * nr_frags), ++ gfp_mask); ++ if (!txb) ++ return NULL; ++ ++ memset(txb, sizeof(struct ieee80211_txb), 0); ++ txb->nr_frags = nr_frags; ++ txb->frag_size = txb_size; ++ ++ for (i = 0; i < nr_frags; i++) { ++ txb->fragments[i] = dev_alloc_skb(txb_size); ++ if (unlikely(!txb->fragments[i])) { ++ i--; ++ break; ++ } ++ } ++ if (unlikely(i != nr_frags)) { ++ while (i >= 0) ++ dev_kfree_skb_any(txb->fragments[i--]); ++ kfree(txb); ++ return NULL; ++ } ++ return txb; ++} ++ ++/* SKBs are added to the ieee->tx_queue. */ ++struct ieee80211_txb *ieee80211_skb_to_txb(struct ieee80211_device *ieee, ++ struct sk_buff *skb) ++{ ++ struct ieee80211_txb *txb; ++ int i, payload_size, nr_frags, last_payload_size; ++ unsigned long flags; ++ struct net_device_stats *stats = &ieee->stats; ++ int ether_type, encrypt; ++ int size, fc, hdr_len; ++ struct sk_buff *skb_frag; ++ struct ieee80211_hdr *header; ++ ++#ifndef CONFIG_IEEE80211_NOWEP ++ struct ieee80211_crypt_data* crypt; ++#endif ++ ++ spin_lock_irqsave(&ieee->lock, flags); ++ ++ if (unlikely(skb->len < SNAP_SIZE + sizeof(u16))) { ++ printk(KERN_WARNING "%s: skb too small (%d).\n", ++ ieee->dev->name, skb->len); ++ goto failed; ++ } ++ ++ ether_type = ntohs(((struct ethhdr *)skb->data)->h_proto); ++ ++#ifndef CONFIG_IEEE80211_NOWEP ++ crypt = ieee->crypt[ieee->tx_keyidx]; ++ encrypt = (ieee->host_encrypt && ether_type != ETH_P_PAE && ++ crypt && crypt->ops); ++#else ++ encrypt = 0; ++#endif /* CONFIG_IEEE80211_NOWEP */ ++ ++ /* Advance the SKB to the start of the payload */ ++ skb_pull(skb, sizeof(struct ethhdr)); ++ ++ /* Determine total amount of storage required for TXB packets */ ++ size = skb->len + SNAP_SIZE + sizeof(u16); ++ if (!ieee->tx_payload_only) ++ size += sizeof(struct ieee80211_hdr); ++ ++ /* Determine amount of data per fragment */ ++ payload_size = ieee->fts; ++ if (encrypt) ++ payload_size -= crypt->ops->extra_prefix_len + ++ crypt->ops->extra_postfix_len; ++ ++ nr_frags = size / payload_size; ++ last_payload_size = size % payload_size; ++ if (last_payload_size) ++ nr_frags++; ++ else ++ last_payload_size = size; ++ ++ /* When we allocate the TXB we allocate enough space for the reserve ++ * and full fragment size (payload_size doesn't include prefix and ++ * postfix) */ ++ txb = ieee80211_alloc_txb(nr_frags, ieee->fts, GFP_ATOMIC); ++ if (unlikely(!txb)) { ++ printk(KERN_WARNING "%s: Could not allocate TXB\n", ++ ieee->dev->name); ++ goto failed; ++ } ++ txb->encrypted = encrypt; ++ txb->payload_size = size; ++ ++ for (i = 0; i < nr_frags; i++) { ++ skb_frag = txb->fragments[i]; ++ ++ if (encrypt) ++ skb_reserve(skb_frag, crypt->ops->extra_prefix_len); ++ ++ if (!ieee->tx_payload_only) { ++ header = (struct ieee80211_hdr *) ++ skb_put(skb_frag, sizeof(struct ieee80211_hdr)); ++ ++ printk(KERN_DEBUG "%s: TODO -- implement 802.11 " ++ "header construction...\n", ieee->dev->name); ++ ++ fc = le16_to_cpu(header->frame_control); ++ hdr_len = ieee80211_get_hdrlen(fc); ++ } else ++ hdr_len = 0; ++ ++ size = (i == nr_frags - 1) ? last_payload_size : payload_size; ++ ++ /* Put a SNAP header on the first fragment */ ++ if (i == 0) { ++ ieee80211_put_snap( ++ skb_put(skb_frag, SNAP_SIZE + sizeof(u16)), ++ ether_type); ++ size -= SNAP_SIZE + sizeof(u16); ++ } ++ ++ memcpy(skb_put(skb_frag, size), skb->data, size); ++ ++ /* Advance the SKB... */ ++ skb_pull(skb, size); ++ ++#ifndef CONFIG_IEEE80211_NOWEP ++ /* Encryption routine will move the header forward in order ++ * to insert the IV between the header and the payload */ ++ if (encrypt) ++ ieee80211_encrypt_fragment(ieee, skb_frag, hdr_len); ++#endif ++ } ++ ++ /* We are now done with the SKB provided to us */ ++ dev_kfree_skb_any(skb); ++ ++ spin_unlock_irqrestore(&ieee->lock, flags); ++ ++ return txb; ++ ++ failed: ++ stats->tx_errors++; ++ spin_unlock_irqrestore(&ieee->lock, flags); ++ return NULL; ++} ++ ++EXPORT_SYMBOL(ieee80211_skb_to_txb); ++EXPORT_SYMBOL(ieee80211_txb_free); +diff -urN x/drivers/net/wireless/ieee80211/ieee80211_wx.c u/drivers/net/wireless/ieee80211/ieee80211_wx.c +--- x/drivers/net/wireless/ieee80211/ieee80211_wx.c 1970-01-01 10:00:00.000000000 +1000 ++++ u/drivers/net/wireless/ieee80211/ieee80211_wx.c 2004-08-28 11:29:47.000000000 +1000 +@@ -0,0 +1,225 @@ ++/****************************************************************************** ++ ++ Copyright(c) 2004 Intel Corporation. All rights reserved. ++ ++ Portions of this file are based on the WEP enablement code provided by the ++ Host AP project hostap-drivers v0.1.3 ++ Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen ++ ++ Copyright (c) 2002-2003, Jouni Malinen ++ ++ This program is free software; you can redistribute it and/or modify it ++ under the terms of version 2 of the GNU General Public License as ++ published by the Free Software Foundation. ++ ++ This program is distributed in the hope that it will be useful, but WITHOUT ++ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ++ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for ++ more details. ++ ++ You should have received a copy of the GNU General Public License along with ++ this program; if not, write to the Free Software Foundation, Inc., 59 ++ Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++ The full GNU General Public License is included in this distribution in the ++ file called LICENSE. ++ ++ Contact Information: ++ James P. Ketrenos ++ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 ++ ++******************************************************************************/ ++#include ++#include ++#include ++#include ++ ++#include "ieee80211.h" ++ ++int ieee80211_wx_set_encode(struct ieee80211_device *ieee, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *keybuf) ++{ ++ struct iw_point *erq = &(wrqu->encoding); ++#ifdef CONFIG_IEEE80211_NOWEP ++ if (erq->flags & IW_ENCODE_DISABLED) ++ return 0; ++ return -EOPNOTSUPP; ++#else ++ struct net_device *dev = ieee->dev; ++ struct ieee80211_security sec = { ++ .flags = 0 ++ }; ++ int key; ++ struct ieee80211_crypt_data **crypt; ++ ++ key = erq->flags & IW_ENCODE_INDEX; ++ if (key) { ++ if (key > 4) ++ return -EINVAL; ++ else ++ key--; ++ if (key >= WEP_KEYS) ++ return -EINVAL; ++ } else ++ key = ieee->tx_keyidx; ++ ++ crypt = &ieee->crypt[key]; ++ ++ if (erq->flags & IW_ENCODE_DISABLED) { ++ if (*crypt) { ++ sec.enabled = 0; ++ sec.level = SEC_LEVEL_0; ++ sec.flags |= SEC_ENABLED | SEC_LEVEL; ++ ieee80211_crypt_delayed_deinit(ieee, crypt); ++ } ++ goto done; ++ } ++ ++ sec.enabled = 1; ++ sec.flags |= SEC_ENABLED; ++ ++ if (*crypt != NULL && (*crypt)->ops != NULL && ++ strcmp((*crypt)->ops->name, "WEP") != 0) { ++ /* changing to use WEP; deinit previously used algorithm */ ++ ieee80211_crypt_delayed_deinit(ieee, crypt); ++ } ++ ++ if (*crypt == NULL) { ++ struct ieee80211_crypt_data *new_crypt; ++ ++ /* take WEP into use */ ++ new_crypt = (struct ieee80211_crypt_data *) ++ kmalloc(sizeof(struct ieee80211_crypt_data), GFP_KERNEL); ++ if (new_crypt == NULL) ++ return -ENOMEM; ++ memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); ++ new_crypt->ops = ieee80211_get_crypto_ops("WEP"); ++ if (!new_crypt->ops) { ++ request_module("ieee80211_crypt_wep"); ++ new_crypt->ops = ieee80211_get_crypto_ops("WEP"); ++ } ++ if (new_crypt->ops) ++ new_crypt->priv = new_crypt->ops->init(key); ++ if (!new_crypt->ops || !new_crypt->priv) { ++ kfree(new_crypt); ++ new_crypt = NULL; ++ ++ printk(KERN_WARNING "%s: could not initialize WEP: " ++ "load module ieee80211_crypt_wep.o\n", ++ dev->name); ++ return -EOPNOTSUPP; ++ } ++ *crypt = new_crypt; ++ } ++ ++ if (erq->length > 0) { ++ int len = erq->length <= 5 ? 5 : 13; ++ int first = 1, j; ++ if (len > erq->length) ++ memset(keybuf + erq->length, 0, len - erq->length); ++ (*crypt)->ops->set_key(keybuf, len, NULL, (*crypt)->priv); ++ memcpy(sec.keys[key], keybuf, len); ++ sec.key_sizes[key] = len; ++ sec.flags |= (1 << key); ++ for (j = 0; j < WEP_KEYS; j++) { ++ if (j != key && ieee->crypt[j]) { ++ first = 0; ++ break; ++ } ++ } ++ if (first) ++ ieee->tx_keyidx = key; ++ sec.active_key = key; ++ sec.flags |= SEC_ACTIVE_KEY; ++ } else { ++ /* No key data - just set the default TX key index */ ++ ieee->tx_keyidx = key; ++ sec.active_key = key; ++ sec.flags |= SEC_ACTIVE_KEY; ++ } ++ ++ done: ++ ieee->open_wep = erq->flags & IW_ENCODE_OPEN; ++ sec.auth_mode = ieee->open_wep ? WLAN_AUTH_OPEN : WLAN_AUTH_SHARED_KEY; ++ sec.flags |= SEC_AUTH_MODE; ++ ++ /* For now we just support WEP, so only set that security level... ++ * TODO: When WPA is added this is one place that needs to change */ ++ sec.flags |= SEC_LEVEL; ++ sec.level = SEC_LEVEL_1; /* 40 and 104 bit WEP */ ++ ++ if (ieee->func && ieee->func->set_security) ++ ieee->func->set_security(ieee, &sec); ++ ++ /* Do not reset port if card is in Managed mode since resetting will ++ * generate new IEEE 802.11 authentication which may end up in looping ++ * with IEEE 802.1X. If your hardware requires a reset after WEP ++ * configuration (for example... Prism2), implement the reset_port in ++ * the callbacks structures used to initialize the 802.11 stack. */ ++ if (ieee->reset_on_keychange && ++ ieee->iw_mode != IW_MODE_INFRA && ++ ieee->func->reset_port && ++ ieee->func->reset_port(dev)) { ++ printk(KERN_DEBUG "%s: reset_port failed\n", dev->name); ++ return -EINVAL; ++ } ++ return 0; ++#endif ++} ++ ++int ieee80211_wx_get_encode(struct ieee80211_device *ieee, ++ struct iw_request_info *info, ++ union iwreq_data *wrqu, char *key) ++{ ++ struct iw_point *erq = &(wrqu->encoding); ++#ifdef CONFIG_IEEE80211_NOWEP ++ erq->length = 0; ++ erq->flags = IW_ENCODE_DISABLED; ++ return 0; ++#else ++ int i, len; ++ struct ieee80211_crypt_data *crypt; ++ ++ i = erq->flags & IW_ENCODE_INDEX; ++ if (i < 1 || i > 4) ++ i = ieee->tx_keyidx; ++ else ++ i--; ++ if (i < 0 || i >= WEP_KEYS) ++ return -EINVAL; ++ crypt = ieee->crypt[i]; ++ erq->flags = i + 1; ++ ++ if (crypt == NULL || crypt->ops == NULL) { ++ erq->length = 0; ++ erq->flags |= IW_ENCODE_DISABLED; ++ return 0; ++ } ++ ++ if (strcmp(crypt->ops->name, "WEP") != 0) { ++ /* only WEP is supported with wireless extensions, so just ++ * report that encryption is used */ ++ erq->length = 0; ++ erq->flags |= IW_ENCODE_ENABLED; ++ return 0; ++ } ++ ++ len = crypt->ops->get_key(key, WEP_KEY_LEN, NULL, crypt->priv); ++ erq->length = (len >= 0 ? len : 0); ++ ++ if (ieee->host_encrypt) ++ erq->flags |= IW_ENCODE_ENABLED; ++ else ++ erq->flags |= IW_ENCODE_DISABLED; ++ if (ieee->open_wep) ++ erq->flags |= IW_ENCODE_OPEN; ++ else ++ erq->flags |= IW_ENCODE_RESTRICTED; ++ ++ return 0; ++#endif ++} ++ ++EXPORT_SYMBOL(ieee80211_wx_set_encode); ++EXPORT_SYMBOL(ieee80211_wx_get_encode); --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/include-missing-includes.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/include-missing-includes.dpatch @@ -0,0 +1,82 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Include linux/spinlock.h for rwlock_t in include/net/ip6_fib.h +## DP: Description: Include linux/ipv6.h for inet6_sk in include/net/ip6_route.h +## DP: Description: Include linux/netdevice.h for MAX_ADDR_LEN in include/net/neighbour.h +## DP: Description: Added forward declaration for struct net_device in include/linux/skbuff.h +## DP: Patch author: unknown +## DP: Upstream status: submitted + +. $(dirname $0)/DPATCH + +@DPATCH@ + +diff -urN kernel-source-2.6.6/include/net/ip6_fib.h kernel-source-2.6.6-1/include/net/ip6_fib.h +--- kernel-source-2.6.6/include/net/ip6_fib.h 2004-03-11 13:55:37.000000000 +1100 ++++ kernel-source-2.6.6-1/include/net/ip6_fib.h 2003-06-20 21:49:07.000000000 +1000 +@@ -20,6 +20,7 @@ + #include + #include + #include ++#include + + struct rt6_info; + +diff -urN kernel-source-2.6.6/include/net/ip6_route.h kernel-source-2.6.6-1/include/net/ip6_route.h +--- kernel-source-2.6.6/include/net/ip6_route.h 2004-03-11 13:55:23.000000000 +1100 ++++ kernel-source-2.6.6-1/include/net/ip6_route.h 2004-03-12 22:03:08.000000000 +1100 +@@ -11,8 +11,10 @@ + + #include + #include ++#include + #include + #include ++#include + + struct pol_chain { + int type; +--- kernel-source-2.6.6/include/net/neighbour.h 2004-05-10 19:48:08.000000000 +1000 ++++ kernel-source-2.6.6-1/include/net/neighbour.h 2004-05-10 22:21:52.000000000 +1000 +@@ -45,6 +45,7 @@ + + #include + #include ++#include + + #include + #include +@@ -53,6 +54,8 @@ + #define NUD_VALID (NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE|NUD_PROBE|NUD_STALE|NUD_DELAY) + #define NUD_CONNECTED (NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE) + ++struct neighbour; ++ + struct neigh_parms + { + struct neigh_parms *next; +diff -urN kernel-source-2.6.6/include/linux/skbuff.h kernel-source-2.6.6-1/include/linux/skbuff.h +--- kernel-source-2.6.6/include/linux/skbuff.h 2004-05-10 19:48:08.000000000 +1000 ++++ kernel-source-2.6.6-1/include/linux/skbuff.h 2004-05-10 22:21:52.000000000 +1000 +@@ -88,6 +88,8 @@ + #define NET_CALLER(arg) __builtin_return_address(0) + #endif + ++struct net_device; ++ + #ifdef CONFIG_NETFILTER + struct nf_conntrack { + atomic_t use; +diff -urN kernel-source-2.6.6/include/linux/netlink.h kernel-source-2.6.6-1/include/linux/netlink.h +--- kernel-source-2.6.6/include/linux/netlink.h 2004-05-10 19:48:07.000000000 +1000 ++++ kernel-source-2.6.6-1/include/linux/netlink.h 2004-05-10 22:21:52.000000000 +1000 +@@ -93,6 +94,7 @@ + #ifdef __KERNEL__ + + #include ++#include + + struct netlink_skb_parms + { --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/ip6t-log-doff.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/ip6t-log-doff.dpatch @@ -0,0 +1,23 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Fix TCP header length check +## DP: Patch author: Olaf Kirch +## DP: Upstream status: unknown + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN x/net/ipv6/netfilter/ip6t_LOG.c y/net/ipv6/netfilter/ip6t_LOG.c +--- x/net/ipv6/netfilter/ip6t_LOG.c 2004-08-24 17:16:29.000000000 +1000 ++++ y/net/ipv6/netfilter/ip6t_LOG.c 2004-09-25 10:21:04.000000000 +1000 +@@ -192,7 +192,7 @@ + printk("URGP=%u ", ntohs(tcph->urg_ptr)); + + if ((info->logflags & IP6T_LOG_TCPOPT) +- && tcph->doff * 4 != sizeof(struct tcphdr)) { ++ && tcph->doff * 4 > sizeof(struct tcphdr)) { + unsigned int i; + + /* Max length: 127 "OPT (" 15*4*2chars ") " */ --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/ipsec-missing_wakeup.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/ipsec-missing_wakeup.dpatch @@ -0,0 +1,67 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Wake up km_waitq after policy changes in net/xfrm/xfrm_policy.c +## DP: Patch author: Herbert Xu +## DP: Upstream status: rejected +## +## /--- +## | Without this patch, the packet that caused this +## | ends up being dropped. +## | +## | Alexey is working on a better solution to this problem. +## | +## | Right now the semantics are horrible for packets that must +## | be resolved by the key manager. The solution is to make a packet +## | queue (much like that used for ARP resolution) that gets pushed out +## | when the key manager finishes resolving or the operation times out. +## | +## | I have no idea what is the current state of that work... +## \--- + +. $(dirname $0)/DPATCH + +@DPATCH@ +--- kernel-source-2.6.6/net/xfrm/xfrm_policy.c 2004-04-05 19:49:45.000000000 +1000 ++++ kernel-source-2.6.6-1/net/xfrm/xfrm_policy.c 2004-04-05 20:54:55.000000000 +1000 +@@ -361,6 +361,7 @@ + if (delpol) { + xfrm_policy_kill(delpol); + } ++ wake_up(&km_waitq); + return 0; + } + +@@ -383,6 +384,7 @@ + if (pol && delete) { + atomic_inc(&flow_cache_genid); + xfrm_policy_kill(pol); ++ wake_up(&km_waitq); + } + return pol; + } +@@ -405,6 +407,7 @@ + if (pol && delete) { + atomic_inc(&flow_cache_genid); + xfrm_policy_kill(pol); ++ wake_up(&km_waitq); + } + return pol; + } +@@ -427,6 +430,7 @@ + } + atomic_inc(&flow_cache_genid); + write_unlock_bh(&xfrm_policy_lock); ++ wake_up(&km_waitq); + } + + int xfrm_policy_walk(int (*func)(struct xfrm_policy *, int, int, void*), +@@ -555,6 +559,7 @@ + if (old_pol) { + xfrm_policy_kill(old_pol); + } ++ wake_up(&km_waitq); + return 0; + } + --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/ipw2100-1.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/ipw2100-1.dpatch @@ -0,0 +1,76 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: [ipw2100] Updates for new ieee80211 code. +## DP: Patch author: Herbert Xu +## DP: Upstream status: unknown + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN x/drivers/net/wireless/ipw2100/ipw2100.h y/drivers/net/wireless/ipw2100/ipw2100.h +--- x/drivers/net/wireless/ipw2100/ipw2100.h 2004-09-07 21:13:57.000000000 +1000 ++++ y/drivers/net/wireless/ipw2100/ipw2100.h 2004-09-07 20:48:31.000000000 +1000 +@@ -474,7 +474,6 @@ + while (0) + + #define IPW2100_ERROR_QUEUE 5 +-#define DEFAULT_MAX_SCAN_AGE 5LU + + /* Power management code: enable or disable? */ + enum { +diff -urN x/drivers/net/wireless/ipw2100/ipw2100_main.c y/drivers/net/wireless/ipw2100/ipw2100_main.c +--- x/drivers/net/wireless/ipw2100/ipw2100_main.c 2004-09-07 21:13:57.000000000 +1000 ++++ y/drivers/net/wireless/ipw2100/ipw2100_main.c 2004-09-07 20:53:45.000000000 +1000 +@@ -1989,7 +1989,7 @@ + { + char *msg = "UNKNOWN"; + +- switch (WLAN_FC_GET_STYPE(header->frame_control)) { ++ switch (WLAN_FC_GET_STYPE(header->frame_ctl)) { + case IEEE802_11_STYPE_ASSOC_RESP: + msg = "ASSOCIATION RESPONSE"; + break; +@@ -2017,12 +2017,12 @@ + default: + IPW2100_DEBUG_WARNING("%s: Unknown management packet: %d\n", + priv->ndev->name, +- WLAN_FC_GET_STYPE(header->frame_control)); ++ WLAN_FC_GET_STYPE(header->frame_ctl)); + break; + } + + IPW2100_DEBUG_RX("received %s(%d)\n", msg, +- WLAN_FC_GET_STYPE(header->frame_control)); ++ WLAN_FC_GET_STYPE(header->frame_ctl)); + } + + +@@ -2321,7 +2321,7 @@ + #ifdef CONFIG_IPW2100_PROMISC + return 0; + #else +- switch (WLAN_FC_GET_TYPE(u->rx_data.header.frame_control)) { ++ switch (WLAN_FC_GET_TYPE(u->rx_data.header.frame_ctl)) { + case IEEE802_11_FTYPE_MGMT: + case IEEE802_11_FTYPE_CTL: + return 0; +@@ -2432,7 +2432,7 @@ + #endif + if (frame_size < sizeof(u->rx_data.header)) + break; +- switch (WLAN_FC_GET_TYPE(u->rx_data.header.frame_control)) { ++ switch (WLAN_FC_GET_TYPE(u->rx_data.header.frame_ctl)) { + case IEEE802_11_FTYPE_MGMT: + isr_handle_mgt_packet(priv, &u->rx_data.header, + &sq->drv[i]); +@@ -4238,7 +4238,7 @@ + + len += snprintf(page, count, + "Scan entries will expire after %lu missed scans. " +- "(default is %lu, 0 = never expire)\n", ++ "(default is %u, 0 = never expire)\n", + priv->scan_age, DEFAULT_MAX_SCAN_AGE); + + *eof = 1; --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/ipw2100-2.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/ipw2100-2.dpatch @@ -0,0 +1,132 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: [ipw2100] Updates for ieee80211 from ipw2200 0.10. +## DP: Patch author: Herbert Xu +## DP: Upstream status: unknown + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN x/drivers/net/wireless/Kconfig y/drivers/net/wireless/Kconfig +--- x/drivers/net/wireless/Kconfig 2004-09-30 21:09:01.000000000 +1000 ++++ y/drivers/net/wireless/Kconfig 2004-09-30 21:01:44.000000000 +1000 +@@ -185,7 +185,6 @@ + select FW_LOADER + select IEEE80211 + select IEEE80211_CRYPT if !IPW2100_NOWEP +- select IEEE80211_CRYPT_WEP if !IPW2100_NOWEP + ---help--- + A driver for the Intel PRO/Wireless 2100 802.11b wireless network + adapter. +diff -urN x/drivers/net/wireless/ipw2100/ipw2100.h y/drivers/net/wireless/ipw2100/ipw2100.h +--- x/drivers/net/wireless/ipw2100/ipw2100.h 2004-09-25 10:43:51.000000000 +1000 ++++ y/drivers/net/wireless/ipw2100/ipw2100.h 2004-09-30 21:09:52.000000000 +1000 +@@ -573,7 +573,7 @@ + + struct list_head beacon_free_list; + struct list_head beacon_list; +- struct ieee80211_beacon *beacons; ++ struct ieee80211_network *beacons; + + struct statistic fw_pend_stat; + struct list_head fw_pend_list; +diff -urN x/drivers/net/wireless/ipw2100/ipw2100_main.c y/drivers/net/wireless/ipw2100/ipw2100_main.c +--- x/drivers/net/wireless/ipw2100/ipw2100_main.c 2004-09-30 21:09:01.000000000 +1000 ++++ y/drivers/net/wireless/ipw2100/ipw2100_main.c 2004-09-30 21:00:20.000000000 +1000 +@@ -967,10 +967,10 @@ + return 0; + + IPW2100_DEBUG_SCAN("Allocating %d beacon slots.\n", +- MAX_BEACON_COUNT); ++ MAX_NETWORK_COUNT); + +- priv->beacons = (struct ieee80211_beacon *)kmalloc( +- MAX_BEACON_COUNT * sizeof(struct ieee80211_beacon), ++ priv->beacons = (struct ieee80211_network *)kmalloc( ++ MAX_NETWORK_COUNT * sizeof(struct ieee80211_network), + GFP_KERNEL); + if (!priv->beacons) { + printk(KERN_WARNING DRV_NAME +@@ -979,7 +979,7 @@ + } + + memset(priv->beacons, 0, +- MAX_BEACON_COUNT * sizeof(struct ieee80211_beacon)); ++ MAX_NETWORK_COUNT * sizeof(struct ieee80211_network)); + + return 0; + } +@@ -998,7 +998,7 @@ + + INIT_LIST_HEAD(&priv->beacon_free_list); + INIT_LIST_HEAD(&priv->beacon_list); +- for (i = 0; i < MAX_BEACON_COUNT; i++) ++ for (i = 0; i < MAX_NETWORK_COUNT; i++) + list_add_tail(&priv->beacons[i].list, &priv->beacon_free_list); + } + +@@ -1835,12 +1835,12 @@ + s8 rssi) + { + struct list_head *element; +- struct ieee80211_beacon *beacon; ++ struct ieee80211_network *beacon; + struct ieee80211_info_element *info_element; + + element = priv->beacon_free_list.next; + +- beacon = list_entry(element, struct ieee80211_beacon, list); ++ beacon = list_entry(element, struct ieee80211_network, list); + + /* Pull out fixed field data */ + memcpy(beacon->bssid, new_beacon->header.addr3, ETH_ALEN); +@@ -1929,7 +1929,7 @@ + { + struct ieee80211_info_element *ssid_info; + struct list_head *element; +- struct ieee80211_beacon *beacon; ++ struct ieee80211_network *beacon; + u8 ssid_len; + + IPW2100_DEBUG_SCAN( +@@ -1964,7 +1964,7 @@ + for (element = priv->beacon_list.next; + element != &priv->beacon_list; + element = element->next) { +- beacon = list_entry(element, struct ieee80211_beacon, list); ++ beacon = list_entry(element, struct ieee80211_network, list); + if (!memcmp(beacon->bssid, new_beacon->header.addr3, + ETH_ALEN)) { + list_del(element); +diff -urN x/drivers/net/wireless/ipw2100/ipw2100_wx.c y/drivers/net/wireless/ipw2100/ipw2100_wx.c +--- x/drivers/net/wireless/ipw2100/ipw2100_wx.c 2004-09-25 10:43:51.000000000 +1000 ++++ y/drivers/net/wireless/ipw2100/ipw2100_wx.c 2004-09-30 21:13:10.000000000 +1000 +@@ -837,7 +837,7 @@ + * + */ + static inline char *ipw2100_translate_scan(char *start, char *stop, +- struct ieee80211_beacon *beacon) ++ struct ieee80211_network *beacon) + { + struct iw_event iwe; + int i; +@@ -916,7 +916,7 @@ + { + struct ipw2100_priv *priv = ipw2100_netdev(dev); + struct list_head *element; +- struct ieee80211_beacon *beacon; ++ struct ieee80211_network *beacon; + unsigned long flags; + + char *ev = extra; +@@ -930,7 +930,7 @@ + for (element = priv->beacon_list.next, i = 0; + element != &priv->beacon_list; + element = element->next, i++) { +- beacon = list_entry(element, struct ieee80211_beacon, list); ++ beacon = list_entry(element, struct ieee80211_network, list); + if (priv->scan_age == 0 || + beacon->last_scanned + priv->scan_age >= priv->scans) + ev = ipw2100_translate_scan(ev, stop, beacon); --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/ipw2100-legacy-fw.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/ipw2100-legacy-fw.dpatch @@ -0,0 +1,36 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Fix ipw2100 build problem on powerpc. +## DP: Patch author: Herbert Xu + #include + ++#ifdef CONFIG_IPW2100_LEGACY_FW_LOAD + #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,8) + #include + #define read sys_read +@@ -65,10 +66,13 @@ + #define open sys_open + #define close sys_close + #endif ++#endif + + #include + #include ++#ifdef CONFIG_IPW2100_LEGACY_FW_LOAD + #define __KERNEL_SYSCALLS__ ++#endif + #include + #include + #include --- linux-source-2.6.8.1-2.6.8.1.orig/debian/patches/ipw2100.dpatch +++ linux-source-2.6.8.1-2.6.8.1/debian/patches/ipw2100.dpatch @@ -0,0 +1,13030 @@ +#! /bin/sh -e +## .dpatch by +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: Intel PRO/Wireless 2100 802.11b Driver. +## DP: Patch author: Intel Corporation +## DP: Upstream status: unknown + +. $(dirname $0)/DPATCH + +@DPATCH@ +diff -urN u/Documentation/networking/README.ipw2100 y/Documentation/networking/README.ipw2100 +--- u/Documentation/networking/README.ipw2100 1970-01-01 10:00:00.000000000 +1000 ++++ y/Documentation/networking/README.ipw2100 2004-08-28 13:36:45.000000000 +1000 +@@ -0,0 +1,179 @@ ++ ++Intel PRO/Wireless 2100 802.11b Driver for Linux ++README.ipw2100 ++ ++August 18, 2004 ++ ++ ++Release 0.53 Current Features ++------------ ----- ----- ---- --- -- - ++ ++- IBSS and BSS modes ++- 802.11 fragmentation ++- WEP (shared key and open) ++- wireless extension support ++- 802.1x EAP via xsupplicant ++- Monitor/RFMon mode ++- transmit power control ++- long/short preamble support ++- power states support (ACPI) ++ ++TODO ++------------ ----- ----- ---- --- -- - ++- Fix bugs... The biggies: ++ C3 corruption ++ Fragmentation ++ ++ ++Command Line Parameters ++------------ ----- ----- ---- --- -- - ++ ++If the driver is built as a module, the following optional parameters are used ++by entering them on the command line with the modprobe command using this ++syntax: ++ ++ modprobe ipw2100 [

;2W?RSN>M__`=QU,9\P&X"O35>@?IGK%UT_!G=]UC_!72\=^9>XZT>+ +M*G.X`&7E4W0SY9/26CO)(P655NBA>^>KY`5\?EI>-='?G$8?O7^^H5+G9IJ6 +M*/4]K4'Z/;;R21L-3W:J1;)_'SS-/^"7Y[MHHPI="_?=#7.C5A;H/? +M9J@_"./,/_#N+=A<`>[K?)#$-_Q +M8#Z39W_4ER_/LY_RY2OS[->R2_WC_9*O_X0?_;.4X^V?-;&LKISNIE%W/]WW +M62/J(MQ1+]3_I+),-\F-N.Q=NN'!Q&/ +M/33T962#(WHDVTWSG@RN4!KT)W2+5Q(.SR.A+N+SP7Q]_K3^,[>M5!;_`_6( +M2FC3,ADCDXW[)')K\GO\^2!JYM]I^]OI]R*+=6G^=':'[PV?PO+`_!%]`3O. +M>IL@FYI=?CSX6]D+EY#0'[8IWM[BVY+S#Z*[Z2'$08?V_IA43_IDXI:,NR0< +M].+TM?/O6B6HA(P_6F\16,M"?X-22*>FY\[<))"I6LO#WO>2&.@/^)BI<^T/ +M>#\"/O6`3UXP'9[+JNY2WI&>/9-R)%Z']*R[;;[3JO9[9'>AW3L7MO#\+PMLL.W!+6^�-^+0[0Q7.=^SV +M+%')3NWPJ?-R[3N\.WSX!6B'=]U5&.CR:-90=O5%_S55[/_`0,])8J#K+F&@ +MRZ/CA\R^WTT-&$LE#/2",*8G1GU8/@8#G9"MBL181GZ=#;Q\1MY8G/8A\%]. +M$KS][\#/039C1I'3Y='3@XA3&I/R/"4AIX=A''\AC.*FRZ(FH)99X>A"SI]^ +MTV7D='GTPD`".=TR0J,_'?R?R.GO))'3#PR.(J>+8Y#3J9&>OA(Y_<5!LD<> +M_=7`9>3T]4GD=%DT,D*,]X7>E$K9DD1.?_W?(*?_)8F<_KLKD--_4T59`U#U +M+J#JWQ5<1DYG)>3T'*#E!'+Z!.4$Y7CMA`G:"6G*-()ZK&Y+XJ:K63SY@KCI +M61)N^IW#G/N6QFBD[^@/%Q*]V4T-MS15-*)6]@=T>E^&JJ+YY@S&I`VW-+>I +MU#VT^8#C&`GH`F;K>FJ61V<.FMTMS<=5QS-:-I5)"!V&\&.\0>(V$R4=ZVH) +M?WP48=T$-*$?3.!\/"S(HJM&L.=^EYS_\)OAIKC9;6WZ1P1'-[KOD]R?1'X' +ML^R_QU;?*HQC:V8=\C'&M6&:[Q=^Y/V#A*M^]T+$/C>[*YH1C8HT,]&GXYL< +M6A^%>(V\3H]42\)3]%X)8]U[%<:ZK&>F>W_S\=Q1G/6U5^&LKTGBK&=*]5PE +MX:R[QN"LFR6<]>^,+!409?W62EU=PN?M(;03"*;QV,=)%/`/!LSN)8NZF_#D +M5YF$7$;%1@BQD6I^7F7K\A7K3^BJ*G.=OVGZ&7#W=+;B$KYZH3A/Q)Z>(Z%7 +M$9$8EI#6Y3:Z!=*F2^"D +MWS3`\E;SO`:Y_K`W2T0>'>JW2"CI^4**F_=*R#JMZNT7-R$B`HYJ%I4G4]`UA=37BU"/F,_*'=)+`>X=U&%-#$[(.SO5[8,[? +M!Z8#]9RAKC$PAU0)?E*%V._P?(I)\(\?P?,QR.>4DC!6Z8S@A"%CLB<0C]V8 +M[(G\`:.[3WBY*2BAKFA9X,DAS:6V_5Q"[]ZT_J3N4P&?+JS$V=7LCOH5J8. +M<4KK7_G7ZE'7W%_X^VR9$CZ[J?]M_O(I[S/2Z6JJ..9.37+1'J%30F57`-<9 +MWY_`RXY&PH)7I6D/"8C'GK);PUI+:BRJ=F)4[ZZ74-G_T?^ZH&[(UG)/-Z,O"RH_8Q>8TP)91M30]<#Q[_3F!Y.V2?C:KQ:,64?`3M- +M3-F#B(IJL"N\"E'&91>3DPR7LJ_&B^+Q'CLW1&-^-0,3>C(##6DII`:$=AW5^H" +M'+LVLIVG!H*H+-!;(=(JI.RSZA;[!-+BJ%@>"@8K4W0Y@2,S/@BW7X''?BZR +M?5&9A,>N#*DD//9$Z]PL8;&OZ"MS;Q64NQ!C21X-]N7D[:<*_7%FF=VJ4^XU +M%0<#":3VF_LW2GCK'OL?U3(]DT!JOS&!U&Z1D-K7_0ND=D._\ZJ46DB9+GZL +M1@VI&O'':@HV(K6[[8H4!F.(MU<'H.XU,Y022COM#RC+)8SV!7R@+=M\R$9/ +MLL7I)U021KO]"MJR7:*MT/OSQV"SL_IX;.[P9=H8Q64G^[1VF3@&17WN)13U +MZ?2=,O;9]V=>0E`_)2&HR\/.8#'T2!G[^/O7.28Z7PLP>U,NH:>K]B"N#:*F +MJX&N7FZXMAIG#?F-B=Y>T._R$4Y0D1YGT!V8S',"<0>PGX0-Y;QSBA!LF@(\ +M!]<4;6JS(=.JMD\2Z"Y%>XH?9QX%RYBN"Z&NHPU +MOD_WX$G)GPG/5:HWZ=P_$Q#K_6>\S=UN2PU5N`WW:+RU]SB\3]ZSPWONGM>] +M%6ZYI<*IEW#@71(.O,OK\@G*DE-/.H@^R[UX4SC(FN1A]1ZYOKNQC.V[\(1C +M=UN[37F:+;>Z$2-^S5#BS7^[H(;Q&FH,S,@**_8\)A`_:H%7[4$T+3RCCOCP +MLNAW!E!R4T&+MT)NX0L[^%O<\AL]/J/O_DH\[W_8ER)7V^^=?]'W;>'^E$X2 +MR.DB\EU67:%>LS+'[=A$B^A)11$]4\;^_$+Z)I*WK_1CPCP +MS_@1__U#/^+"!YVW.3XE.W1']&W+$",H:%.%.TJR=M;>(CLC5%+#)/>^3>!_ +MI@HX1NMM57Q@%14KX7\#F>=HRSE.TDK:=%:BUKGFE[!,].<#V%*7VXF)%@_. +M$..1N96H<7K?RKKYL@+4LWZ'LLBYW6?S36)R[:_X)LES[3+_)/"O=PK-"M.$ +M<.OH&7,_GC%GFO",NPA;.X'G8Q,=YB/C +M6>O,=YK3!,7T%+<\G.;I\>3K?F1+/:/(?V=3BB=%E\%W.UL\@;P<>XNKRQUR +MX2T7I'</YDPZR8GQ@[*\SM@M=&MTA[YM'(P(J;<\'0@V;XD/TGQ9;REE6BL6$D$?^ +M+4+-+;8OW]:R[T>T1\4JY`74E'K&Z>6\O=+.VQMQT4MAIDW(S0=\Q-0?TOLT +MIG^<85BGEW`8+PSKE8`JD($X>$]Z1>_%2*\/;W;]&-*>B_S!H75;\=R_,]/] +M.M_5U@(K9*T33_;_WI'I"]KDX=]5YC2M:-IK8T):[TCLB^'$3M&G1U_B$?'84W%:#R;>=3311ZY(B?3!\7:JNZK]Y:']2U.+Z]\(1_-WEN64`GX>+.TK]Z +MVMV5<_K2SA)J<=W>*8M.'5*PC0LYMA1:BTXE1F,(D;%30D1_H!%YT<0AVZ4= +M$D0%94)BL]R8*>$OI(<1:S,U%%U?+VPG;4'<.:R0$*\'AQ!_]X>-B'FMDN2X +MV7'$8J,A]`')7-_2ZG(PK2V!;#T-,."JF1W;A._[Z^`H)G*NGGGV=IZ)/C#( +M[&G!U3BLEENYYR.$^T7$QAV)"(Y/CV;"*BP(J[!;%KZF>Z/IETTD7\?^VM;: +M24Z6L;.;:!Z=<60^R!=Y_,*S9'^.E4Q:7LJ_'NP*SEYXK6YVI77VBK9]MN(S +MS#Y25`1R]VX?*2H,7U]YQ#!O9J[W.$C<*,F[YB->)$B;^NL<`EF\O(EH=86. +M)>L#.JMN.L@_\RQ\0&XQ3AZ)_7;8*.&T++1HS".QYX<1]YD4W-6`]9\/:]^: +M,`OT?$LCON_:,(XC!2>+3A^2<60Z"<,JI0KD;6\Y2Q&W=J@+PI8-,OK>3;+H +MTL$K$=LG0*O0P8EQCC*TZ/[KBB7YR;QOW!^11D]'^*^QR2P +MWQ`#]X@R,>>B+'[1(>Z/K":)^(S;ZJ."__(2`%NT1`^Y@@CU@QP#;4I)?R:H]V' +M:`0?-)WT[;71,V'?!XTO"37EQVK)#'?XM\+%8$J;O#QHJWWWA474,,=+#+_R +M&M@I)0,NC3PKK257R\YI(;MU9;)HTR`UZRS/N\I=.IC3R3Y:]KQKC@MQ)=4] +MAYK)OG(VH"MK.=2L\01T:M?%IG+/C2"/;XF[7::V`X@%6?=]O*<%ZY0-\7*6 +MK]O//^Y`=WM3`H4:=_"T$N(@XM/MQ3W;Y5E(CX@1D_:SRA`YIZ3L.(LX4 +M3P27X$I%=]CSC(^6M\,:T.-9`"M`I>A?GZ'#%2VBHTT4M_/$P'A;O1>#`:BU +MN@[+*^M1KW^F&4I9UPQ^*>MQ%6N(^^"9K[N+OX$E[A*VNZD#1I9YT`QU6#WB +M=7BKM>YO3:UHTL[:LI"8'&%O]Q7-$WT^CI>(.TBS0QM`;7T,T[R!+= +M'<()ZP'/?OL"'^&XX(IEE73\VRJ&9PM52V!-*/3,(0NNB5BTY?EY+V +M$,.'7MR%R`@OY;LDE*);^0H?8Y*=H*CAV$M%3!N/O3,DP/M42:QTOG*%CTQ3 +MAN97$L-RKUI?T:AJ_#0B-TT.Q6.?#]V$Z)9-U-+2B+L+V#Z)-]R0?,,<@?95'? +MP!()Z5T6;1ZH%KM('CS=,\"+TEDF!O?J]B37UCCN<-7)O=@4%J8$@KP +M]X]!C;\WB1K_;-PGH<;/,R.N]BAJ_)F^RZCQ9?UO1YQ^Q./V29CQ&_G7ZMW` +M,Q;^$\3XJ'OMPL3NG"),FU$CP)M#',>(-/J-(19D6P&D)QIJ0=WT>IEAB;+= +MB7?EJ?WK4(9\*$%#?.48I/?%$D*GY@HT>8N[K3FK33=G<:XRB2E?XM:5[VYN +MR[T26;XZ;A)M$OXE%PKX=(72KF`A?A^W7$*5OR%>,>9=LWD*5+A";)N4R(D8 +MNCSQF#$NOX0K;_BGN/)&"5=^JH0I.HHE.A(KNP)3_KM]7)7!7=/,&$FH-*)M +M1MHID';?`@]0,Y5KFU/2.F:>]>]!CI@'Z?.(B0E/YKM64A'_3V;7`Y5.JCY+ +MB#*KN6O7?N^FIS?<4['\8_S.X[S-3#>Z\#L`E,[.8%;?WSPO\.M/S-X&;?^Y.!E +MW/H_#B9PZX\/CL6M[Q[\?XY;C_4A8W#KOX2Q@GN.#,B9N/-8$.[PT4+&&*U6 +M21CVC\6-[OF-'P,OGN^]C&2_,VZ2D.S+6*MY/DAM#8S#KZ_JBGC_\$\SZU_XI +M9OVO_TO,^LW_)6;]M_N?=>SR/+WPQT("M9ZVV][VJ:Q7X-9_7P!I1/R=F$`> +MOHQ;3Z-I`PG<^L?^`VY]Y\"_PJT_.'!1VK^@>_GDS"D+=TJS&;X2T=X./CN&KT:TGR]AUL__ +M%XCV-X]!M)\2*N\"83K'TAE^=/P +M)Q+=3X=W5PU?B6S/7D*V5TG(]O*PA&E_(AZ[Z5]BVL^Y`M->^2\P[9GH\_U( +MHX7_!--^]/O`Z'[_U9CV**L@'\/U"*Y%]JI&<>W_(N':GTWBVO\9U@L?0]G( +M+J,T4YG"+9VVMRT +MDA:EA-];>*YZT\KZE>N7TN9&,%N7RD7:_,XB_TK\*M72K+>W;!J.V>.GJJG! +MZ%ZB;`GV+#J]\`%==S#M>GEY=Z"L&58&JD"&>E,9&T#I!%9%EK!%VL]D8'[$ +MW4REH7SR<.R%$7%;U$"9CFV,%68D%[3=<2(-SSB'2\2RX^WY201Y]O_''U$<'H +M#@1OT?U$2"L_%L3;EG+H\YHD?^-\*M7-&6K4-W'=E^&G(0[O&8Y]?>0)_/[3 +MF/@^N"C\%(][CA=.FOT=BPPW,\:TL-/7K7KW5$!UM@=JP&)-F&A-'S&>#)O] +M-!G^1PA_XU0B'&H-S\&8 +M?3O5,A9@'D&X!:U!BY +M<'VS?^&M.6>;3^BR2IY=^8^VG]N"X0",`0-G7=6ETO8<#]:P.ECYI9XPK92; +MU&&CKML?\.,>(!,*,".Q)2/U?&!G0$E.;8B0/#K0&'R'[)6F4;:0E6;#2;`UHBRB,_=9`(+A=.D]ES5$[KP/J75!= +M94PQJX90KXL#Y\"MQSI$[H)2*[H/T*)\-,MR#$XAI,14]UJRIZK*J9/?B%Y!^#*",CKGJ:8%7# +M^UQ,80FL67!_DE,EY!3%">SV[D&RY^]0KH^OF-77A3#N6^N?5Z;UJ.NMY'TI!&GE==T_.VM!J6A\[PY-*: +M_L_23?`3`IXOVN$)Z';4!W2)T?`B\O9W\# +MO'SM`-G[$D^M#2&J..[^-4]=E$WQ'(=56F^3#/B@7-_;F*(\[F8\F7;J.B(< +MK4QQ[PC"J/$M4:9+YPA33\%JUUO9S$Q3AE.:GZU,F_G-EP&S( +M3"7&Q6\_74FX98$<5NVE>AU;X<7V31F\Z'_,08T)"4(;?D((;H71'M:R3O/+ +M?EJD"O^^0;WS^`YK;@)OO7\`]X`_&1"E.1KGCHL#D4T2QCV4$EMGIZ"SJ)L9 +MZ)M6)7ZKVYVQW'Y_Y3YG@L,2\54Q""M*2W]+98Y';=>Y)&S9T"&0&FCXIUX* +M;?O^0!.66MG0(WT!J_[\!V%IM1,N'KPQ[\LA#9U(ASOC33 +M;UA4YK&J,GI0#TXYRP>)<7J(#VI@C7=<%K05GJ@)CL1F#QE@/,SQ=G-N[[F& +MU=)*X9IPG;2V&5TQ:+U.X9@OH`RD'_-F^7#_UFK0VH]YC_MDT+_3!["7TP=0 +MH@.I2:(Q]%$,9(H4VJ+,AVWH@)&$,YHJ3)KG0Y_DK,39A!AREQZ"-6!^"&,1 +M,4^\-G2HF1C9D-N'I[10UKEI`%8VFXP-./=FP*K&!720%D;)Q")<_LY_'=`. +MWT_$CD9H_T9?0&R2@WR)>64EZ5[J%TYL+)367JJ05:)XMU3/>,P^1&AS!D9;/';[P"AW2/4)OF@!JYIF36%R[!,JLQ?I9NYORL\P7D^GY51G +M+EP;UE:R,TG1PC"9OB"4>VU6<(?-&!K5RD*(]&TB@"D=<-TB,\FSYZR$#Y+H'./-QV0M"^%(DH#976LN8I&_S:4T,#TNP@# +M4F:GVQ4LTUEU.K,1).D7(T9!Q@5AIOUEI,"!)4L-YPFU4XXWM=N4X40>-/HZ +MY)`3DKY^<`1R.=SDYW63+W!R.=;JU0IA." +MH^^[-T*X5(%,#S:2T#T1@GOZ7!/$*ENF/@?43$VWJHP6Q:AW9AJB2,EC+;1RPN(\UJL0G!:3^8WXB!IO*P>>["VMF6WS?X1G3N+#9 +M/*IK1BO)/^-`KM%*^Y!JT>*C)D48=3XI#>GFX=C/^SGV&I"6OMV'LL]-/26^ +M!WG*=EB8(D7X=7^\B(0U33>X5^&A1#CS'05)]PQ^?IH39BQ:34`X[QYVY +M*4V,%RE"Z,^$R]V:32"Y0MCK?GPN=SN:TYH/DDDY9T'>X,P!?ZM-$]+"FAAW +MY9#?5/2/CC7@6K+^R&I8PVC8FA+MT9#7:3G6X*D2MP[%XG%N9X)[Y_8=V`HQ +MI?-&H^?>OBZDP>I<]-]630J=LY`7BS`3D-`,+^K`J6C&]%I&>8AONZ +M^%W'G#R3N9(F]WD-B7-7'?F$6483YS`)IU)^SM^(BR45[:+Y&O#OYS.3+Q2>D +MYRD]LOP.0G*Z0`+FS"U^QJ0,=_D#JNZ)U()Z`C1#!TA*SG$BY'`6PAUKH-!V +MN-_>E)Q7Y/F?@-3\I^K-OH41E-(\PZ%_S+CI!#*$C2J27*95)@/ +MTXQ]8DV+T0OK/1OX2H='8 +MR-E(/*:*GXYHCWZW2EZ*.FPBC7ZQ(:+/LZ+7QCSS2W"4.S; +M\2+.MBK`WR/8&KARX^2AV#WQK?RVZH#T!80#.4D=&H$5NRFYES(2NVXD0S2R +M9C.%GM"$>_T*D#CN%`1?18-1VCL9B4T9,0-?4X1QM.%7G*'8R`BV:BJ4\Z?] +MR)'3AYV2C)`5JO`A&BKUC3-9<8RMQ#$V5UFN5"I39\^=.U>I))0S>Y-<)Q_K +M$1U2L.;DSLPUX>I%UIO+)#U3L,9:.4\XUD+Q+"JTM?7ZYS?ASJ\B__GFQ+QM +M;M`K4]*I`?5"K>\W2O-Q&.;R3N^;T.8+XF]$@(H-C!YWSU^3M![A-PL.YJ#A +MV-(!$ZQ\\?V=0W)V*#8SCISBF2$&:G=T)!'O;Z'1T6KDIPO6,CEKMM24*ECK +M+-(>C_T95@KF.+<0RWZ-U#;C0YA?<$C%=KJIN=-)Y*IP@V^48WJ]0[':$6RM +MNX>,S??8UL27MF.;TXWDS%N; +M*1>5M!YW>_$FC7$#+3.N)L:I[TX'.>785L6EN/1,>MFQS61:"N2K"AW;FK4P +MD(/ZML8!5WPWTN'/6&@EYN5O;J53Z4V_M)99@0MQX4OYG7F'<*]'<$\)OVN9 +MR>4]\H^29]/_@.UQM)!_M9Y&;^FC3#Z?HF'H/DL^63E;F6Z_GI45 +M;E%>[UR1\X1OE>]FYD;[7WTWRV^T7^N_67FC_2[GDF9%T83PX_[E_F*FR/ZN +MOUA>9)_<5*PLLC>Z'F]:WB3Y-DUJ1G\\/_2<*Z"B]E0'X?)6CE]*S3KCP,G, +M+6I-S19UVJXMZO30EBME7NPK[-<75:A[&?7B(%VM')2S2E[AG>_5`D74#2.] +M+AGT)M-AWW]^M*63VCOA_=?60UL2(..7I=IE>D&9Z@SH;&Z'L]7M<'6Y@Z[1W<1'R#[="?)R9?3("9VL +M[95%M^NZ*W%'RSGS]I;;?-F^8F:#M8"JN1E;7=;DW5K""# +MRV$%/,Z_G-5,8O+LE=:*MMMU6*Z*EJ7-XYOSF3IKI?5V]5G9[599\+@40@./ +M-)]HSF)NE4+>EBVVVH)MNHH`HW>0\3KNAK,[\6;42DBSTKI]>4KZ>=WV)4I3 +M]&14PMB]7VAQI+A3FO&.UW'H#5P)I3"5UGL$I\71=JOUK&)2^B2ESB[+6Z'4 +M.=5!N9)H8,RFR^U\4*$LUH!+.=W.V9$'1L;YE*W42DL)5UMSU2F:."_ +M)D6IMN]Q)9![:ZM:R-.^6E^*[AN5Q\D:[Y/>X[H=#R3VHW;:(>50[OD41=JJJQ-@Y!.^MR +M?5CE=O)1C3JX(N?*VBB5LZ42E_Z'VNQQ_JO:G'9ZD[=0QTGCX'3_=$'%@FQC +M4=\F!S-5$(E5%S#/7Z]GI;E]`'GL:_UY@I)+A7`]ZP7WLP,H<[!"%YFOF\H% +M5EE5,WIR4;.BN>(V1$%66/C;KJ\WL0864_]H8#RD1C_T\;'X/2-C$>'*O#ZO +MG'O>ZR:I#BM(,.:2@&Z`_=D#2U8M(0&=@8W'[AG1LSY?/+8V*3V,CF/\[JZ6 +M)=:JG4>U55J!T1Y6\ +MO(J6<1!+`;&^.<#PG%/[TA>0SZ?1:!3O1W<>O8:_OQ-QZQ7.\8XU3G-))ONT +M\VD7X:B9,W+=@R>U;,!\SLFY:EW.>F)0["9Z>3O#RG:)'GT]V:7DF=VT77U` +MZ5!4=II)M*+OZ=H+M +M.I.6/&?[]*122)1/"^7[D?,CYT>N*+Q/>RWP:8XP<>!EFI^FLG(V_<>/S<__ +MXRMO':S=-+]NM7S_P=6BT^6RZDC>02>TBRNJ[$KO5QY/%VM[ZYYTR?3ZNG.N +M.F>>4%?G6G.P[JDU=6OSUE#]P;7GU[98\];I5]>MFRP@[WRU#ZGI9WV3!`.K +M=^8*@9)4-YFF#DUA`[,_=7_A#!9NK@D['W$R8IKS4>:2/%*LD)/0]`]*WNJBZ7R5BKO?W09QRC-/2![35&7UI,4_(779"YBWAE^J@ +MCBR8Z=K2E2I?9<1L +MYU.N]UR*))HY\/\^Q$U'?/).:+,C4KOA?`%M]P3F9.N3[6U3'7;+>DK8'?9Q +M82I:K)K083>>>LUTRO8>5\WM.>S^F?VPLTQ4Y9/K9H58(IU'H_602T>EPK: +MG^H/U"5*&%E-HZ2OF95!*U4!9=D&L;5,_5XWM@F)?@925W\$^_P#:!]LCY&C +M*C:-G2"AOI^/'U:]X&9Z]-87H'QZ^PO.N1XR?76HV0-2\K22<`$;F#7-O5]U +M<"/3L],^%6J7:LT/G=^8XS2YCZMD/2^X#V[<"ZGFN)I<3ZZ]AEUY"07^%W&G +MA/B>*-6M@T1\?S7'W@DA/^\GQCN@)_/ZZD42?3*^3F0>G>.BCU17DO8<-RDD +M!=22`_&^$\<2[H[W0Q]I0D3?[V2^Y_?0]A?<9%^FG;23Z?90'AN8F>/^_OP' +MYK>I#FR4]9!][79EF!$AAI7!KWKB6E&E-VPD)F.8[,5RN^9?66[]Q@,V_+[+ +MM*M%9O]!X-),>]W&RG7ZC74;<];Y/9OFTW*_B^@/K+W=26;(PH5L`:O''EFG +M7U?`TKW9+"VG[8?"S-YR%XG.C9-\=M$U8I'HO7/61JR]6:K]J0$B?B'AW4^+ +MET/[E$/M"B4-W,7],U@R(Q+&L,D85HYANG@JGP;KP10W0A-=$"#?R +MDE\ZUU$;Z8=\^IW?B"3Z%/LW&PSRK,#1>.S"<#R&.G!3!TDT$\PO!TAT`MB3 +M!@/`[U*K].[@!F$#C3;TX9O%$;V;&C1U.^H4E_KO3R.FAA`I_$U=?_W<^A6.%94OVO)#]]2WD;6U +M<^OOJ2^M7;GL15M&>&[]UQ:NK+&X\;[@W`T'[!:@H8=MLG"FNXW +MR$*HJPEJO294+=7:%;Y?7%!)\MO(RAI!F+LAU7W0GNJ<)TQAD9/0$+IFLK.5 +ML]/M5>!:E2E.TDP!%P//ZIF:*US:F3)P`>VNU,T<[YSF?L)F"T]DL]SFRMUD +MW[+KA")G"I2L+&1:Z)J/O(=$;QOIDG0X)_C,U(5$G"7.=.>`5*<.N5;J1$X/ +M[90_W8DZG&>*.1J-,@O>=&"EVJ(14R27#%Q:BTPL!#>DL$QPM)'%RUY?/]?] +MI$UVVN1,V;#3/A/2%-3`VLDC-PPFFBH:ZW?O*BG61@&=ZG75R?5KNTUE5KJ)TB +M#M7DUZZNG5AIV'"M>XX]UUGBGE")I[=+G3G.#/%:]PNVM!,YSI/K=]K49\+U +M.X&&,S>D.\:[<^R9SE*H[Z'A5*B-90QUTP(C>[E>6"`ZYT(46B*^"++JUHJ'_2-B[46W]^_5Y;2EA=V4:6UZ@%-"Z]ATOOJ?5DN@P>YG`[ +M/#/M>C=GDIWARO5.J(-8.+GV37B"%J>'#[CR77C"Y`!PD9QAO/N&W.$9B0(S +MAP]XZ#/MML(PIJ=GKL738.4&H*4L=YL.RZ`^V9;[^L3=&8MUDQUM6O`%>5CC +MQI/T!I?&O<13Z\H&>ZGK@$LN&L1\UVIX2H,V>&\(\^\=8KY'IA\(9TAMF!%. +MKY(9H+9UU+"C+NT2/WASB'/'8\/#6R(D>FQH4V3D)9191)!=W@/S#IB+DQ/] +ME)AS$Y3W\R$]Y&D,/>DA107ARZ7/2I8^TY$UIOSI8\JO_A_EEUU1^ON&<&8F +M!-\O)LO0B7I1U\N-:1)'W3RDN53^.X=0X\E=(YTO85PYTM7EOOK0P>`STX,&3PD[TF;/*R!$9L13G6.$UV>Q!!7WG8X,'> +M?=*3Z3P(O3='*A4#DI?:R4NZ9%!N\!Y]]4Z%E'/1T.$["8PZ,ATD`8<>:F\) +MD\*?K#5M/`R44^A2BGJ79V/1QL7K3!OK-V:N4^=I4[!&[M$7E1^DD9FVK?K]*$U<>TQP_"2)#/D1?UG3AHHR%Y +MF;P<.4+BIO))W*DL48@R7QJ>/#8?M*G"EY]IF)GS:5@WZ0/<>SE2X)@(?'6V +M?K'34)7G@)%4*DN;I'N0U"WF*JEEF3V@N][TY5FSM`:[K[R-+%+)M=2G>96EVPG/R"/W=ZS +MC,[]<4Y/S6P#F9[FE+U-RWBGQ@G2--BDQ^%T$ZM:0I(BIZ'.O3E_6OO'<532 +M"XJZF?Y/Z2=FR?\]_<0,Z>@=U4L,S^<9;C=VJP +MLU?EZ^R="J9S5[CWN8YP[Y'.<*_1@GJIQ/,&76D*B6DUT\2X4W'N +M?F=G[R^Z'NDM6-W9*ST['^E5+ITK%JZ>)2J]WQ:I5R4FXD_]S_$#09$&U,GX +MQO\;2'>EB"]VU4!\TW^.W[%#I!T:\3DI_Z+_'+]SI\B`H9VIT*99Y^3$ +MFJ4B2\Z_%(__JM/[:N]S@5=[C^QZM?<7':_V/M_Y:F_TFPF]H[@>S2#%'XSJ +M!OL#Z@#C'KE`(*V2$`VV(>K\(F11KUQ<>`YU/G>2)RYH42=T,NQ[27UAJ!M9 +MCJHMN41<.<2]-QE7&WKPG"_YC.];_5^\I^JJ]Y3^F_=PR;A7ID]+^N&\C'S? +M10FY`_6#=9`%H_5]SY(H!^5LR??O=4 +M".^R7"X_Q,\]E'0SI*87W5>G5X,[7=O1>Q+&)0/OE6N++R`]RX">3R3],.[) +MFH[S"NFY^`-J[CBO`WM>\MWJ4.#"O"O>RT`Y=%P@J8<-RPXV:;EPG)`/1W6Z +M_2ZI)VY4/]P7YO^NOD3[^(5KL5Q:*F:1Q>=3(F9L&X51ZU_8+7XRV"[?K4GM&H8PT6285O!MUZ9VZHGV`#'.[ +MT$T>D?3J7=V6G5>T-?!PC5PL'C/.4(UIQZ6^3(R/`-#[,O#+$#MZQ^-8.*A; +M<.4XTT":N5>%)\=2+I_,6P=U8*4TVR\8I?(EZB@7'W\/^<6J6PBQS"<$VRYT +MA6R%\LWII(P5F))H9XR'\:4VQG>9,WIOEFA*!CR_I9>B+D+RBL3O,5P+[Y9Q +M+Y_GH:VQWXFY]<),L.5@$[#58*>!T8+)!J,#PX+AP.2#,8*9+L79=<&<3%,* +M=AF8N6"LVM8+\\!6`[U([X1^'Y^D#_Z*MAV*QS6C-)K@.2T7Y%`V'>2+;2V' +M]!SW!-`B]#?DAWK5,1T%6H\&AM7QOPY?S$ZN";"=\#T)/>X9O9RVY?SGP)M& +M\Y^>I`$CZE#4[I;HFUBQS1=+M(TZ)(D5ZHKZ(*W;+YQ`W?K)?%&O=-?WQNJ? +M_N.#8]U_>VBL^X7M8]WC6L>Z>_>/=7_GVV/=/WU@K+O]_K'N-_:-=6?<.]9] +MN&6L^ZZKXM]\E3[M]JOB__X[8]VW/#;6??=5X6]=55_A*K?IJOJ&=X]U?]X^ +MUGWTJO#A76/=W[VJ/(N+&?:[X?_TKO\%>_KWY? +M_;[Z??7[ZO?5[ZO?5[^O?O\O__"N=+.$!D8XU(_S[4X\-R%GXWIJ:+=03K:+ +MMBMV,[MIX4RVW#'GP%R>/,I$Z_LP5AY+#8K=\9EQO0SBM5O:9\H,Y)%2GLG# +MLQ:E!TH%K81Z/,$(V6#!7R +M#Y1]J3P4T.I-+2T[CZN&>@AW*$"B]T+H#_I(E(M/6;2<<]\LZ138](--).KL +MZVC&.R+C.6-+`B=>IF^3$)"G\N4L\==8U%Z\C1WP,%$#GKL',Z-/+[2U"81: +MU-:^.G23Z/5#H]C9F9#32(00TQ1"EOJXS8G3'X0\JB!,2ADAU>ONN.0)X9LV +MNS;?M8E;N\&U;I.D2P;#QWC";^DR;L&BJWQ'S^S)!+Q;UA(@^I86W./^_'-" +M<@6'.XLR7OR?I;%Y>3/-QU"\46,;:>Q0UPI,\8E2?F5?]R]TYG9;[&0\[[R3 +M8P/N48WZA"-%:6<*/#\&UWEG@>=CL)]VCT.=Y.9=ML].'N-H])YXXBS?Y_H4 +M1="MX(XYU9)6_OBEIZ!;+>47=.-I2<1X5+`U*6J]VIHOL*S,K/8ZO/'87^-= +MJL%3V9#C;7$#B[H#XK%#\<1)UH#^@)N[X($]:!>AX2&]\ONA-YWS*_"G6'(DK?;*YP5[DSX +MC_TUE$L8F@8&L37Y;@^3EM!@.,G0+MFC&@U;TQ)NFQ2.I=GGX?0:^S[7G,I] +M'HUUGZO<0?3MK9G;J2*!RIVX&^!I%&Q`,]S1^<-CV(+=(V0Z%W# +M-/J]D7CL=!+_6U>YPK]"N2*=F:8-I[+7")R%3,L.DZ*4\'B'/$];0HQ!GSR\ +MQQ[T$D[;Z%V@@Z>:)F+L#U/)S1@P!A/&NZS>!5I[0J\]T+H\``;O-"'M!\<3 +M@F=YI3O0T'87^0\$\Q&U\Z+C0T'KO,B3?#7TW'&5O)$ZU6RF6^U4%'S,/!CX +M0R"M\5T'X?#^$9YEK;#O)_MU0HZ$CQ[X_.19_EU!'CC+RP-:3@WV.P+CS#&\ +MS>^F.W1JIQ:>3]`V>#)+N`!$W\/C.&CQ=GM3#%FRUL"XO+/,*X%C#J9%FS^O +M16$XP;2VO-+2[6!:Y[52@VV[W,!L'V=H;3WF>+FU97L"-^)W"^6LW(#(OC1Z +M[K.GRI.;S#LF5BG?R"Q2B*+FN,9*PK$"F9PPTK_6Z +M(SP3)H6_:[A&7.>[]SH:?J4A4_RA;R<\O=R0)D9\C\%3=X-*W))S9/YK#;.W +M!:;>9%\W_Z:[WO?=K?Q6^I'Y3R^\!F)8O-F0ZEO@DPJN$N\XR`U=_**F7"J +MEY:,$^7P5`E/:C$5GG;"DTR\IIB&WX`GNX^6'K2]]X[Y12V++;KVDJY\4J`T +MS-,U"AR;@;JTHWGK,+;SDHV>P8]0;A/(U_CB?OEH*D( +M71]&#!"G2T5/$>Z]2#Z77Y3S+LW3KR0F=8A*VMT]\^.QQ^-XH^)41*\3?/A] +MG'!O1M0ZQCS9WFJ[^(ZL6`YO?"W"<`I[7\0-\15QU`I1/EQ=I>#$!M2M>\-P +M9;728&+3+7BNDATVL;?PV1;.P)71Z(1AAN.\I7K^MCG\C,"5*,AHHQ:K0`=<1*=[ZZ@J3P09W)>&^G_(1TRDZJ>_$B^9XY-Y>S +M^6L[D6IMVXBA@M(6H4PL8<>C@>RX"V61!^!>;$4;P#Z3YS +M0>+\-N(@?*%*8!X@]@'>TT,\!'7RG/[H_9U1'6U-R;O.,"TRU^7\G6_R(08" +MEG9WY'F6@=+?GRS]C@CEE':?3Y[S/L^4$G=7L,/6^8YL!O;%5N@+)?0%/12/ +MW3R"?;%IZ"_\U2V+)P._-72F2LD:63WTC-:L-"B@=ZJ'L*VPI?BA-ZOU;+V? +MV8-CMV+HK45X([94K[Z-[-4'#GGE>T@^Q;L$>@)YN89>!-GYE*.U]C-#J[/$X'`EYH]$F55#E_4WF8_D>&%TZN>M?%SW(^^\ +ME02D`UJ":.M?GESN-;^X"\:>]^@C55:@5E*XUJLTZ%F-96W@89Y&?SX8!SIU +M-G0TB`U +M$,Y\9$FEVKO<3XK49VZM,NBRMHW34?,SX--JBYU>YN>]R_SF%QFS=T&EL)AO +M:UKJ,)C;"`WL1KV8(:0J&K`)*4W41(.RL$%RXXR7L&\2YO$I04&>$Z!-C4VN!L.-5QL,#:Z&^.QO\2QO::S +M^:5X3N8'\7Q=R4(\[9UMCL>F@,M[#X,Z7R#L07"AW1SG='K!.@E;.-$R94?' +ML=DLI0KH?6[0M(KDY3E:;+*3ZER816^CHM8MNTWKIJN*5K7;R!G9;:-W?W"T +M7!Q0LB1_8O70U(D\R6G92DPWA:@?=>!E"TM(RJH=-N/)\;S)35:I;RL6<5SW +M)746D.2X1IE1OBLQW[?$"4F;E+BOUY3$3D`& +M3K6OE$U+#:FF30C;=:M\RF)Z\A-52L_H/&'7K?#-L2.F1HKX?9;)R[5[0!:6 +MB?8DTL8#M_SEM`RUG7+O1V0&,WL:I*HY`W_F5<[/V$^F'+'I3HQ?1:9-"&7F +M5/N635F10V_8;DM]]ZW*2;HG-C_HF]PP?E6UCYH3_I^_(RL]8GO_Y''I;B'J +M6E@K>/!+AO0EKJ:)R-_2=ZCP[-3 +M*"7B37^U?95(>'*SAD[W!U>(SP'_-L[>_PH`_&W=J?1+4!R7X;KRD;O:G%G,%R?:>? +M0O^E%\O`E:#I0)7H*4PSVT67Z'&EJ25;4"=LU!`)X@J,I\50EBX808XXZIRE +MT>Y^HZ2Y4O1T0@P*LYWZ*(W^IO].@7<%77?RJ/>?&O#^;FO#RYM>;K0UUEAV +M>!/\L@]B'NX'_@EF0O_2*D8_9^Z!343?NXG;3#6NS33MP.95`DD7-W.LTC#' +MD@YMH>]?SB]?2'RTX/IK8;T4YH(H%?H"7X.RC>^_E5=X?4$N@)HH+PQ4\S5F +M18-"WRW-&6Q2ZQW!^[-YY7QZ5WI76M=L?DZ9C.5F[MUR9DO.W2@7S1?F50=A +M=@/9>GL09CNTX['W@&-PI:(_W3C^-#5FG@1ZZI^UT"S=+IPCZ>KH]<-:L'R' +M56ME0AU^F-%@52C38Z]$^A)OQM'_09^*/>`W\E9#YM*:V1;O-0M+#7-N:K_- +MT$39B56YED.3%6QM`XW^N`]E72-;ZZ?1'_9!_\=1YGF]CQJ>]-+HG_HLE^;% +M77TY`I93*Y57:[A.Q/&./&,.2?``O.,WD+S']RCXUX!9"68IF&5@0JBW-:D/ +M_1U%XMX8KIN+09903Y)P<*4[P9WP0[[*3Z%MQ$7JIJN\%U-OE15I;V/<* +M\*)?\O'8:X._=/R8;[]GN_\75>=7[K65A:RF@I#V';.)#2G?T:)V/),I3/4M +M#=-$BVE"J,1D",O!E2_6F+)#B\%G"<2YU30QK`'?'!'6"+!N8>#_>%$&_[6B +M`OZ/$U7P7R.JX;]*3('_]"F6ZQ[S&'5908>$^)FBUD= +MT";1ZHOT.WF;OYW7+*63=_"%922Z,;E*U1XE^0_P,JA7::WJVQJVXAT%:C"YM7:U-`_]Z>QZA\D=:K/J$-'/ +MNWE4GW2#<%^GO'VEL+S:7*YAE:R62R^!U%5B0E^%+/RD3UU$P,S46"T^B+X[,!7=:N6P/ +MB?YB))]WEM'U)K[+3Z+7Q_6"LYRO*Q6NY;7ESK+N6I!DHZ5Q`N7P-!)C5YC1 +M'_9.$2@G(94`U1_W3W.@KB6!6)=/$HX'$8N$1+=+IZH[1QC]!YM(]$Z\X]D?ONZJ3>UD! +MDI`Y4-YX#YZ_!VN3[ZL2=X8_R4WH3D&>8TS*'WC'&&41=E)23UM2'W23?[&$ +MC%5XAI^1'\:^8A)]A4B)7IDI-_RB(/B.*Y4]5-_K/0`]UFX_X,T0J5X/:W6_ +M'Y$D9"95F)^A"/],BGE\(K7T>JT@F4X'SA2/?33P;+61O<8\$E.,/%/%>;@Z +MO>>PU,[;1YQU%VI)],_#J#]-K'N*)\&..FRY>T80805U=9A&*%=3REWB9/$8 +M-["GFDZ=SM:43MWT'9@!,.?3PT:/L<[DP7Y:-N*N^Z26%-P50-?M(TJV8!/V +MPT?#"A;X!&HX]ZN,6>$=/,I^Z>'[!*>%S$@)OP[RKRK\5D/7C@17>6J8B!E> +MY$5O#8]BYL1C]PWXJFM`YDW4Z'O#6Q8B[1YB/P7:/3`,6$4Y +M/5MC"38D:AR%^J8FZ@MYIX^,XM+4\]L[%3[59"SA_N&;6&XVV15%CGPRW9AV +M!GDISO-X!X$`G>ZXI.MON7!L\]>$=$Z]&LNZ=OA6GNB=YNZ&KPN+JYAVH:FF +ME`#O8O:F`$?/#'4V+Q&LRJX,M5<>DC0!&IYK,(I1_\(D;S>$4\2`OU+B[)]> +MXNP3PR1Z?)@8QX=EQ=AJDIY%3FPH@W?1U48EK#X,6+;KI;+-'>Z,()=/E+=X +MN/P2G[^.GV.FNU*+)X8OY]'K+^&IMP16+BU>9J_@K_#J?=U>"G)&OH5";A\/ +MQ6,-P]'F*0+?(.=0*P+P_+UXAX"%>2'7\CS,"V>'.OTZP;`PN+GLP6"K[\%C +MK<\_J-YN]N&ME@F"W&`N5P?3!'4Y']#Q"4];,4DI()R$*#C +M>.P;0UB#LT/O>Q=&$O+\Z)XQCBMK$BM-6NN3R]AHH^,1QQR.0YROI?-H1#R/ +M-F+CHFU-[3@?4`7.26%ZU,VK/EKA:G'5.Z@^TULOO.Y)36S<8"DA^H7@?F4(717@J@+7BQ"W +MLGIQ21Y+]$9V)'9DB%]$"^.&S)*9X%/&K@6:?P92W%P5-[@@#3N7@U@'AFYP +M$*YD3MY*"SLPC9PA4"OICHPYW?C%V;AA)M]0D@[O3R\;B>T+7F.@9G#5;_-,=BU=.=[1O"?BG"2DKI_'A%H/CI#\^ +M;7SH6E5FST2?ROMUWP+O=WW?]O[9]WOO1/^"S5_WJ^[ZKG_!7;*[LYHFY^4N +M?=E'\J8LZBIBPC=Y7_$2\0:O)D<[YT1S'/BU;7.F8X=NU,7<)>1HRX\WQT&^ +MJ+AK)+9A:"36)+7G_L&1V!U#R1DP-R&?(<_]&O!1Q$,=Q4)%6GEO%#>/)&0] +MU%L5.]K:F<9>"[/,G?/=\TET<=_D1:A;L<,RCL5;-]L'\9Z5B26B3G`2DC-1 +MFD,F.K)6+2&M.OD>7#%VD:X<9C^)CAL:G?%P]<,3JRY=BCW.D<%1+\<3,@)-0?CS"B.%^H-1AW"^4G,$%C!+R`+U`NT"W0+N`7&!>8% +M90OP?+Z,+#F_@Y!]LB[M.3R?2LWA]QBR\GP:URK2KO"CU-SU'OB5RO%\9U<7 +MNDMEYLQS]7B^E5MRKIF0.;(N2X0AMTKG6S,(V3&]M*-7WO6S"QB>-G=[K]P< +M>*\_'B^BVI9S&PGY<'K9%>%EE\,9"%^'X7.O""^]'"Z#\&^2Q+V"0+[V'"%. +M6X6Y1"1:E^'_U+V)9^C_O7L3KV24B`\*28XZNYF=&74V'<=0&?X/4_F]V]EX*(S_C=:2#UT)^S%N=T`?M +M^=`/^5`^VGH=WM,(SP.ZR`<:R:=<%SQWP7,7AOHFUHW>,@W&VR(VYL>[>@=+;.,%'\P#E-AS*:;'Q'KL,SF5\Y;)S]T3@7O4VF[ +MS\O(XEZ9MJ.%(15B-KP3ZR#-;1S4E23*-NKG/9J^@FWL@8L\,\I3W<4Y/$?%YMI:&\IZX1CQ':4_!4 +MEA@$N_"I=)$G:3U3GX*5&G#>-%8IIACE8=2\7?@T$:<]C5S_GGZCA+!J]-%9 +M)'JWY.H+QUTBX/Y70+$N<,ML@($>[NON00[ESC +M<]5MYI:LV737ALTP.#E^CX>PUCW'5>% +MMUP[UIVB&.M>D#?6_=I5X;"&'^.^_JKX.5?%OV_.6+>P>*R[@1GK_N"J\J^Y +M*K^C5]7GYU>E_YELK+M7/M;]^%7Q/5>Y55>EWW95^/A)8]U_UUU5OJOZ9T+Y +M6'=;)0@IT6LO;`7[TMG_Q^/,Z//,[X\]EWZCXW(\_Q.),$SOVX//"7KR`#TA +MSR':P*6Q'I=^%;5W;FR\P[6!V[RF\0[/G:/$7M'HV>R^8\UF3QVWQE>WQHO> +MV!7#?/X>I<=T[=S&WT +MKL&2++H+'M=R[LO#2HI]VZ8UC<6KUZSUW+EF=7)4<99_[ET"C/^NQC7<%D_C +MYKO`O?9.>`.4>#6Q3YO&;?#4-KI@K%ZJ_;\]F]3UE'0G`-<2Y(&E8_P(KB_< +M>D)6$_-=JY/QY3(B_]7L--UM"_E_FR^E]+)C(&&*4HI2KB5QHE:/!ORG7!(] +MC3G1?_%'R&AH\HE>-E<$$T:NUCH+"1-7P=^U1$FF$"Y^\Q#="E.L%Z)H.;.E +MQ%I1LWC)K5!TC2:=RF1R!7%:N\84*`"MDBPR6AVD!C("^8YHT$N6J/J_K1+^ +MY+^&%DP\9OZ'WV@2PW_XC<:;^1]^H_'F_8???ZS#?_AE0XOLPE-82DI4X&Z] +M=^=CEEW=+/\+!IOZ'Y#Q(&8.]*1`81],!IAL,#E@IH#) +M`V,$4PRF!,Q-ZL1[S;2/])`WP-Y#[B+K21?X0/VKP>_S3 +MO[NW;^\G#_YC7/RE/_WL+TO;:YPRYO";V[Z6$ZD]^G[UOH]N>?CQ:ZUMWQZ8 +M\/>_/7?\H=3!CRK6_7SXFQ_>\MN\V*V/O;=B_\MWL;T_N;&^:OF&BGN8+Q=M +M7^G^8G%I6-W_R+E-S]Y:>W-1FGK)=];,_\;C1O.!ZS,T1Z]+29^=OW_2C7\M +M_*-GX1^_]<2'D[*^/WGSLAFEQ;.?>^>3(X,K_O%4]1;7+]__=7#MO'N6/GO#]M37'S#]_N3ZN4;_#\^]./F:+3^^ +MX>S75B_=7/7'G2W^W_^#50^5/6:X_N?.SDA[[SMOO_.7; +M#]#5/SOQ/5$XL/??'!`IVV9V,PNM'1N#*_[-.O_W[3XN_F +MO;'UP//NR]CEVC;^FK#,W\XO4NAI+$L]N#+WZSO_TG(TSYQ +MV=ZIR!E8N[;:RQ__MV]SX=>:>TTW;T\<\H;S4.'_G3'G.G_NV-AK:?QCKM=C6NN +M',_\]?_9]_=VW:[&KD..)>TUB[IG'SOXRW +MKG&-:[/;]2^;(U$9\R7[_T]^#WSZQ(5_9T;O%XO*Q/JJ)1/6,MH62>;!NYM: +M6/>P\$PA3`WV2HKW/!,R$::#(/.82E83BD5X,))/TQ/89][9V.\WSR +M7O?7V([S?^">N#!ZOYO1MH@R>*=<6W&.AB#?CL2Z\$<0Y\2_B#-:AP#>1=5N +MO^!+WH7%M4``GM'?RR7NP>*]8(8$1"_&D>XWMUQ8)H6U2NLL$#X^Q#T#:+H/ +M8?K_<`.LOVZ3ZML%;=!U@0$C`X-[G.9,\B$3_;P_F__V?$%Z_ME0%CQOSB!) +MI%HBS%6%V@7E4E<"VXPC.`824@BD#,Q>,%,+.E= +MGT52<1UN)L]=Q/1ID)X!.P5LF?75\_*:VR#=O?E#D.8S2,-_-\YL2)I[P:B/ +MRJ+VP?_NG/DZA_M`/4\>E45?'/S7Y\QKD^?,:P\X';O,LN@/!FL/K.5ET6N& +M5O-K#G#@DSE4RZ\[8(6GM"%Y="N85C!!,`])^Y@5`_)H^U#-/SUY+H\^,"1< +M<>(U=)*$]J4),=&.?/OE5G(GN +MZ:/PYHX^)KJ\+W$Z71Y]I$\>_6W?O"M.IM/HN1%Y=/U5)],+'.XYEW&!RZ[` +M!8YS%O,4X?OEZD#PVD"08\.3.*[]$XS=3KU%8>^]RJW2"\J@!Y';M$G]G-_GNYMDIJ%0 +M%R>//CWPO6HE>]%SF*KM)O:82ZWHZX//K-03.$?VU@$Z\U=S)4WKJTB1)I3K +M0QW%6NE[-*]WM>CT^A:9N`N>S/!4(>%="W%GF[[-JELMJ`/QV`LC"3IAV*_S +M\E#%5HII-V./6;>.&+16?C-J`L+>>=(3P*^I4N\\Z;8:SCD-GMW0[@9V@N),4^>-O;SESI;;F>$_!_G_NT4\I'O&DVA]Q/>+9"?\K@()D$@7)/>?AOXP-N.,V1"8Y3GEO3OF<_Y9(KVHC>'E"K[=I:;;V5&>H)0=E"4KQ7))RD@)J& +M:-EPV+L@6U`YU%Y.3XTA#Q-.G/Q,W$J`M6_R+$P`3'-?C<.$"Y+R,!<*6`:S:X/HDPW$<1[1&DDLNZ +MI)@0E31.T3E?A%$+-FJND_FH.17O@-(H@? +MN6;AQ*I9;'Q6Q2S"75-)IN:X-4U+E.-Z,AH-P6P++3$$3D%&=".[C6 +M^+&D,3E-4+L9U*EV5N/(-H]GXS,K9NZQJ2%O#7`M'_39O#18ST$9S\'S7.QK +MO)>3CONZGU4C)L2DT*>7SL;/T]7>@RW_,8]GJ-/#')MK_IN`V$XPYX25!L0Q +MNPCNF^.46TCU.\CNG)/UDW0G:V'.,<7.G!%JRG=X +MLG0[7#L\2\@2]0Z7PZ/5(*C-B;\(,RFM)#9(]TRF"$+XXE0,D,=A9O==#2%VNWU5+N +M3.0AONPHB&/Z0%!0SM.U)[&R###_=REG]\C$Q)/E%-H!57%//L>M)$83]%2^ +M^18?*9:%[A$$_V$;%V;,16PK]-7M(XANY,SAS%U^:X[1K%\IDVXI;!4"ON-M +M05NJA$-<'Y>SR'7GQ/$L",="NR5O/N'SBC@#]+NE[\O(&H?Y2,V<\:QUYCO- +M=PB*Z2EN>3C-T^/)U_W(EGI&D?_.IA1/BL[)=SM;@`_GV%M<7>Z0I%6[[^C7 +M*VG!%/<=RI\'#0:2ORKGF96$.Z%B3B7&P.?!?(/\AOQIL][]Z4KE=44GZ,&S +M$LX(DU*HS38_JUOAVZ=C)`W<.O%*5Z8HD^QQX+O,G^-_P@]SN_VT?X6/,(DX +M9?:LM,^#\AL>L87?@=J%@C;9B8"2I*$F/8[];>2GNE_Y1GPW^D?R?C/_1_,G +M6Z^K5%Q/OIM]P]F@;.IO9;^V8ZO^G=";G[`IW[Y[_K=\W\J)$QVXZ#LD;YSX +M,5DUZ>\3OY6Q+>=C;;&2/%&MTUBVFIUUA_\.Z=9*=_B:*E*@ +M+7W:NV;^QRI%#RF2A9_V,5-OM#_M/:N2]1STR0NFV0]ZTRJ?]M7DT3//91E+$A5254+:''K&1T[EL-ON=""%XIK$TR9L1^^U%^64< +M6'17`1__!DGP\S*(%W&4LB<>>LXFGLYF[XH@[R2^[9T!(Q/6`"TTQL7JB_Z_ +M5)E+J5$;=C8AA@!BR6A"9R5Z5(;>EK1[,F'$I=X4-_NZIP:`QA#15!/&]!`G +M?`+B+&@<'1N(8\3[.+J8]'HL/ +M$6-IF/._M)`QPAQFG"G1J&Z$[$)\UHO#-!H=2)P)Y6`<7@-CRKT)\7X5K#H$ +M4BZ$>>R(DO2<4*%3B4X_T2?0A6C('*0R/"V!9TF'!\@>6?3C8;G()4]E6D>H +M=)8M'OL-E*`C=$`JY?-)?>_3[5<24&N:2H].J:]GV\C;D1AIS//;;(0KM +MH7=W0&5QX2N:X&9-/,`?W2Q1. +M2(XJ1Y6=F9.3F3-.-8X@&E158^);G9;%$\A]D7AL>OQ+^)\_;'3/:XQ&JAH_ +MB90=]5<3/;B;*AH#00K2285.X].J2(;:.#%\)V^6N)0FK"Y2AWF?7,^P&BNG +M5UOUT&N'1O#;WR-QH]O:E$3UEL9]/'90\OLBTLU]%M$>[9+XIASO!PPA)_C: +M<*)V-&\_2#\LR%!,3T(;I,YYNS/71;F^2-_1&N#ZZ6S-[$X?8]P(O=[IK>)K +MREZM1W3YA8Z@W>G5^JJKJ=$3KDZ>:=?IB3A%[U@T)[@XU^%(D8]WIZ0=UV4Z +MZWPKE+1'79Z9G/D.VK+"3JCA]5+>N.QG_8;?8BJ +M%VV*Q]X:8$2DL3<&BGQ&EA0UK2\2:+BKA(JIP1,Z8V6N\UJ'L3++?:)I?],^ +M&W-B`DO%9G$RF^/(\C&H&3//(;I$!N1;=?C:2@^Y??F4RK>#2TB;KLNB%G,K +MZ\F^Y;F59X,IP17DA&ZQ3NM(@]PF^>B8(F$XPAY*R&Y"5`T +MRO1_Y9GHI.&_\G\5\)0[SI7?&!Z]/_%V]70):5H&H_;THC,+RZ!ES="R3+]9 +M:ED16M:0;-DI`V7NL'`9@=WB(R;/>FAC"R/^P9$5;-.]XK"23&>7XT1PL:[; +MH5V>(I6O$,IGG>5ND',=WG'P]FN'1T_+;BL@AF+Z[4Y4L0EL<[P_^YQTCU7!B8V8OLL]NCIF +M]OQ8`.EZ)4H^\=AG?9=C?!SYH<#L4;8_+EA5&M994F.1M\/HV;WZ;3GD_WG_ +M`4'=P.R!LO1D`U6GZ[^_B#&4P0A:(YVSO)S/\8B$L^BF^[1V*K[NUMI?5M)3 +M],;^$W@>GQ0S[RCTO8V_B#SH&.]G#)II*:'L::FAZZ>-"]TY+3VL>%R6M]Z; +M)2H>)V"G@TW!UH!=[U6)V3-D)Q(QJ.1SW$WMX]A#2EF/6T5/&=F=$?E>DE?I +M=2O8'F;/$:,J]*HQ.W3*J(>Z7CLR19PIGFOP!>\`OBPOYP-EB,2[-QZS#Z1! +MR]<.I8OQF#R>*C)[GH)9X8A1#:DII&;"OF!=I0ZDW!61&N%84+%OB:]&PC_] +M1F6K+C?`[#M2%`VW!05BU>4@@E_@@\BR!`89Y"'?^RK'>R^W3WD$:7!6GVG& +MN!.(F3F_WR$<:TC5-]C?5,OTLG:B+.ZA-TT3L=7+^I$[V`2-4=TP/I1MG!"Z +MWC@Q=*=Q4AA3FOKG7I52"RG3Q7^H";@TXB_4%&REF,IY[I-^0.WBGP`4:\0X#8`??"#8+9 +M'0A6Z-;SU&GR\299V..S&MKM'J_')RB-IRSNXT'BUI4S,!Q9?J4U8B4J=\[W&_`N9FRJ9;C*S2H(49^=T^E%#D>VG>3D@W_OTE +MU28\!Y_,)_7]*IXQ$+<<>F'O%?G'+ZSF\)9DV%T.8_*D.\?^!K95&8[)=GL& +M"S&3;?7AA;D\=3M\:EBG:.T[8)VBM<]Q:)W'?7,<;2F9WMF.:3Y9P1U*ZQPZ +M+3L\+N]V>YM.TYREU-J-SAW-?#.F>KTY92NF0[06MY/F/>N<)C+33/\R-L;5 +M;$5?MW/'5GZKY"OEH-DF^;IV;..W2;[;4NX9S?F0JX4[Y#3#ZA>UT'/EZ="F +MUPZ-4AZB,I>QVR]@N+J\.R"3:M=\`6D&:>]K9ZO0M: +MP&\P!)*53V.,G7%X-=YCOB3RE5=F_.3,#J^,.^;%>X^MG2B%Y/3_%>3GIUO_ +M(NA;GPYDZ_4!1G^@]1U8XA*WM/*,9U)]"=8_]NX6.33HZ^#?")GK:6]?F):$SX`_VM# +MOPT-9;Y.P4K2ERM$ +M0X.K00=S9IEWR_J1V+KA!'(CX49BWQY)$V%6W5OYMO.I)CJ= +M"?W(3Z:/"SU6=5^]M3ZH:W,\NNB$?S?YU;*`+HBKVUGZ5T^[`SFGDSL3"0EP +M!9[\`PZX/A[@M64538BG*]-7-*)$6-V7D`@_/;J5IWD4>,>.(,G_DZZQ\G5) +M1B(G<]FM,`?L7[[5<2QX(KAQT>.ZIDKMS2O:]MC,9Q`_O#C<(.UJF\(;^2-Y +MT\TR[_$FFD],ZK`'Y*8Z1\V<)>M1?JH(I(CHLT:2$E8E_2L"M3!+F2WFR2.Q +MST>^B<_L;(O&/!+[:(1R98VD\)Z&>&Q_/!Y[&^;?W/`2&`/S&\F>*V_](PZM +M`NKY99^,(]-)F.'F"T&OB<5=]0^'*/>WR"V"G$/$=\)=B'B/RBU_(#3$]0;DHM%>"[E:K^R.K +M22)^YJ7X:5+\CR#^A[`F,_)DJL)-N<-!JW)[IUI'_7+V.&I<+R0B*2P04F#\ +M-(9SA.,^O$6F]ZE-*>'LRKT^1+[YH.EM7[N-GCGC^Z!Q/,B]QVK)C(;P9.%B +M,*4MJU)>'K35OYN]B!KF>(GA5UX#.Z5DP*6!-71+KI:=T\+LUI7)HG?W4;,! +MYJ"Y:8EY!O5L=#R06&NJD_(FSD-+DO,/SD,HGZ[&,S3RR_(GSEDZR_.N52"56HEL>EF0*(NK$+K-*M))P4+<< +M?3X44D#.>,'S*^!#B.K@]RS04=&S/D.'ZP5$F!TOGN.)@0&>=#%X1E#78._*':L1&SP@A +MDO#OI=M'3/25*VX?T6??X&ET2AS#?SE""C^!\)^/=/&_J:;N;TWEFYR0FH75 +M2Y>2]'SB1?3;]/`+?)_H`#TV5M;;QTX*0=33*\%RT373.(]Y,NUFWE`\%#=#$"*^2SX2C[T'\]MK(+4QT=0XY6IF&1M^ +M`^.6B*\H%WO#GTM?]QIPC6,]*=HGAL +M\W`\]O,A;W+UPT3U\DF&A&LG;SI=I=&!Z])Q6/W0:I'QU*W)1B +MHC^^ZJ941?*FU.Q_<5/JR8'$32DFNNO2^FN6,*U*:R'MI8)IX3@V?9:*=9;6 +MS.9!FK^.IP:;UVP1I+MCP+?#F?H*KUXP\:.W`)GH,R,%/);X%R,HM9&]([%% +M0Q,%':>NHX;:AFP)NWI1#^O08T&9/G'K;S1N^5":H,6XG!=XC=*0X=58 +MQO,CL>(A+:X>+'BS9>J0K-JT7BZUA',X1QR588/)/2E'F`=QW'7O"Q]`V_]B*![[$LC,/EPW1/MTS6\Q3,9G7Q&K&;RGIX>%X5=XC=#.(@ +M3XS?(G9+B,B1$:O81?#IX9$;1.RK/P\!OVQ]72AO_55@M;X<))`76FN]3/2- +M(:.$HWPMQ#4,X_.WC!/#F.(WT,]X/YCSOL2_`"MG:[G::7(CCO1(3`\SRTAL +MU2#2[#.(\Z'\ZRE,\Y3TECG;,>?O#Z'/_B%FWW)])G".QX:^$RD[.A+KZ'_: +M89VSV&/-K2"".EL:;[B'%5I/Q)![/%LS]5DVI3P=O+CX"3=?K(BY_;< +MG<`W^J-]<0@?G]A^OCEB\MB/8[*7G/7=]$3%-"W^#= +M`LX:HWL+:Q;>0KPKXK$?Q6_G<0]C.JP+?H[Y-&(^ZOZ&%:/YQ/K>CKC@O9Z0 +MBK6NQYVQ:BC-[^J],!O,Z<%;9*T>JUYC;W6U>G;`_XMN&KUW8"%/?3((8TQ, +MN$7?XJ0BA?_$(`@./AZ[)VX72CB'>XD\4;\RAU;Z=M_N"TEH7\JRS#:N7";V +MU9>OUYFY\L3:468XP<`HB1>)TP4UQ->'U&P@L4=6`#-``7ZA!LG$WB>U2E6\ +M:,P[KH7Q3MNZ/,(DS`MCW!!7B'EB^?I$_%*HO;,!SQ+PC2B]DG!'8[#![.]2 +MR4YIX7U4PGH?B37U)23-+7W^]:-MM*:/CZB@'>5ZSHQ:?"PL^B[ONS&"X]2: +M'+_X/5&KS4$W#,H\R`:PB6(X15X#=")NKI*Q0T;JWU +MF#-!/]ZCN"9NJ;^E7L^3X+T,T@0'(\7?E\X2_7$[/F_JX]GY=KS'P$3OZ&O0 +MH>WI4R>EK(2_"]S_B&0ZVCVTC.9MM^ZUM[N\"\S2;9AX[/-XXAR`QF'-.0"R +MY;%:I1#TT+G4\*05O]";$]HBF`0?&MU3[SOZ27+'"Y&T/UHH#Z?#*/W3H-F] +MH!%WP13A#'"_.6AQ,S`G&UFK>4$CT5A$__HVXV"QI`0*:?!>XTL;D +M%W3QTA?T,^"[>O!S6)FT=C)[_B2HK6%A')L&HP.EC8;0R84Q3Z>G2Z7JZ5,I +M>CH]5K65=+KBL>?B?U@(+F5.CT\Y$?UAA6]A@ZYC"Z.>ME2U/>K20*_^O2_J +M>17RC+I@/F[H;9:92$C<)#:^!&F)\KJ>,F4QI`U`VDY7;_//>84T!\M,66&B +M[W9U^"7,1AC_B-NMDW"[)X1A9`UGB0SX9H@'FJBDX:N[#M&ONIVCW`:1@T"B +MZS_HV.5Y?*%5Y9Q-C+/>]JEF]NSRR.%MNUP7_=\5J%$>NN@GXB]%E3$'YO!H +M`^',7A(U#E_T$I"S'Q;4JR_"7$G#:NYBPT68.Y4@L5^4\,I1XT)^/WZ)8$+X +MS4$);\00E:0/86+_??#F@%+H>5ZY`-[)2>_<+JT^QH>,/CDBMW/N!B/P&2?( +M$QV-\=BO1[9>TLL4CYT?F2;Z!#6B?N_"W?7\,'[!T(?=S=3LWN1NQI4:!RW< +MV"<7U1(*>#QV?(0FD:,98UJX4](;`?+!8*=/ZC5O)TAGT-+>;V#95'-[GE?- +M@;(Q4MF60[\M8LJ@WZ*>2>`3=2D@]PSHO^?A^2)046;X-M3$T*K>3O6N1F<# +MU]C1B#2V=P3I:#Z/.EY4XD6@++E$63;PN7[`KQ<4P1V(6Y](>XM`.;5W'L_L +MI59-R,]9%2T[<"5!]'1[2^N-4FB<8_8R9FK-#94)F/8:2*O>'FQUP7I0&QI] +M^V'O`6F5GRC%UZ12Y,,[A_LO?2?5JX].X:WFEH9NB*D)=P/?586[FQ4F>:@+ +M6A`UW#R8O%U;=G1\->$D>1+HE.&HJ2PD-^6$Q4UJ:-GLD4,>#\R!5G)XO57= +M8AMWXO#ZBES4<[-V!$N1'_Y@?8N-.?G!>G7NQ;JR2V/9FES#H*RAU4J'W*5Q +MC?MGR)_DR?7.7@AG&$*`TB,?N%ML[Y[\P`TY.<^`Q#L2R^^+\5U!U,DEAYKZ +MD[BUGR^B^K+DUW3.IU`59ZA1^UCQW\.?+#0#Q22^HVO-?Q-H]#O#Q'@^]#[? +MY1Z&M74YK"_Q/K?::`M?`%E)8>PY:?:+U88;D6Z\.M`1WDA4@>4S*R6VD +M%L2&;@EH38BCUQ((!+=+9U1(3IFS%EKS\**:F\MQC\7W+*SO6D'2X'W/5!N] +MPS%Q*/%U!JF)2/L?P[&A83P_)_J_NU`[&^GZ5>`/>`YN0C]*TO+P*7#+P3VN +MOR&XEP?J"CWB.!&6VQ`@^@:O1N^OQ3U!DT\61ET2765R$>V' +M<,V8^WSM3;44)(Y1&3NA/9/L(GM(X?W`._6A^W%]I:*GNE63>JRJM![<:7YC +M"*4>]7HKV2Q8U37EO(LI3!-'_39*?D$7+1S08^P7A\B>NR`O#ZS1+W-W3PCC +MO[7^>>6X'G6]E=0F4R&WQ;'ACL=CWQBDA5E`GD'O3LJ`_HNLR)4Q<:L?J2WQ)'5C"@2_AC&V\;(IS8 +MP#6DB?'8S*'G5>H>FZ-FSBY/E9#BMDKQ:EQ](!]CW'5#SB8&:(3H]8TH?Y+P +M@49/XV'DGHVPCFFEVXFAG+7R)#H2)WMOYBF4ERJ.NTT\GJ\YKKRFI[=)9AH? +MENM[&U.4Q]VM[DQ[BS//D>F>Y6@+MNE2?()2W@,Q4;<@K%LF\0%W0,5,)<:- +M;^LWV'-Q=54/#8XB-\8HH.BQ+F1IWPX&-E$N&*Q3R3DG>3>>6ER#8)[ +M'_@M'=+9I7G)O!/="1M0UUBMB6LY*`\=VD2AQMC* +M([$G!NH=[6ZU?9?S$$I?H4,^U.WY4R^%]G]CL`YKK-S8(WT7J';]QD'Z'8YL'D19<@S?#>+""+,\4$I$64EB[ +M_DRB^E(H:]"5H'C[H-BDP+5N$_)-D`L:AV/S!AG1*%+NT*9#3<3(A)89Q%IPR"Y+K)V"#)%J$#0#>I87SN:%2%D=YPGKF61QS;>(1P +MAQI]`;%)#G()YI.5'"7@OPG?.4[BA:J053I=XY9J&H]-&*8S&+!?&Y*)S`ST +M>0;&9SQV8U(ZNTP/.(=(8Y +M0TMPB?+SA0_HB*&U\7/?IP*9)@O+\M[P[O!JO`YO=U.;JBVCNY'S=X,/ +M@[E`*^WWJ,44'S4IPJA946E(-P_':H`2VC8FI*0UVDYUO#[*G'K<.R'`]S.Q-A9-=`!8TN.-*)( +MGN+E!B*_!FE$6\Y#.Q,5GOW]957-7-Q'><-_%-=@9CI-%GK#KYI&0HS76EK7 +MC'M7J'$LD<,;/F@9"(G'?AO_,E+I)],8"#T2_WM$E@S!MUV,I#8E0@[$ST5D +M?BD$N`Y1GHT<@WE3&_YNXJNBM(Z?'0]%4"-7WY"<'8ZM'4(,\\^&4/]J]$@[ +M_W"UV6QOHE-K;H0VYK\.K$Y +MW4C.O+493Q&BUNMN+WY%,&Z@9<;5Q#CUW>FLL_385L6EN/1,>MFQS61:2@C/ +MO![;>O?"0`YJ@1D'$O2[D0[_YH568E[^YE8ZE=[T2VN9%7"/+S3K4O+T3_A"=ZK;F[8;&PJ,IL01TV5VJP.=1<+6FP.>:5AVCT +M]6%J>*;!)%[T\TD--GF2!IOYD@:;#RYIL-'!B/E:G!BSP[(95VJPN1[>55-& +M5YLOZ;"Y52J?>>@GD@Z;1)F%P=)+.FRF)W38S!BKPZ:8I][B?Z'#9CCVY0"- +M;AN^V)PS1H?-<.R#@9RD#IOAV/F!0_X)PE@--ED\!?E3&TX7)CI2@KK*[$69 +M@0D.HM^F*]ZV:NEM2U&;:=]):@#Z*C"RLAGZT+7BZ-X5[E.%DFM#:9T[JOL< +MO\&F)N:(>\>Y3Z4DPS3M"# +M*U;BR:`BN3I-FZV#97*+[WU'FRY7;/%=`/L:L-\#.POL\V"G@WT.;`W8O6`K +MP1;!9L#^*]C$E!.R^U"/%RY[TIJ>-RY\EX=+L?6=1EUW +M&-HR\/<(ZO3#Y^:!#R+>HZ]5(7>9<8(Y.&EEXMS2:/DZ?+\5;H%2=?A^`W86 +MV"^!G0[VBV!KP/XUV$JP?P4V`_8+8)/BO!!2\?1!EP]WR:`7DJ6CTCV*Q"I> +MKTOQ4[/)Z_+162VVV&G4[8_:.S,'L:08K#_F&8]5]TO@?4+%&G]APT<=YOR/@_N4<2S[PQ-/]19QMU4/\+L'6D&LQ +M`IV\U;^3?Z@:5X6I(0[F8W5H)/;+N"FY"AR)B?$,T8AK0#\#ZY=>OP+6+T%! +M\%4T&*4UWTCLK;@7>+("Z!=F.TEVO;$?UZ>I4,93_:A1[V<##;R\#.>AC!!J +M)8-YW*FI%.#$LJPN]\(9=@X$(XP +M7*?WS4@\UC7R1H2"W'PL0J.?#KX&__\Q^'($)$@#HR?1IOX7(]JCBZLXX*H< +MR!S#L:XA/:Q7AF,?#S%0NX&^1,AGH5&->3;^ID4U94H6=_1J9BM8\_7.6?'8 +MNR"[7A>?*_!0@XGA*+1.MD0#10/7"V37,3>%@#/-&' +MHT0WP#4O-[X3+A:"/L:8&\9TZ0-D%TJ\6FD78ER8`N\K@-PIR"=\`P69@T39 +M?EPS;)/R^$?_9&E7+26$J912*CR3"ZO;6-5P//;#(>`/3C[9OC/"03?5IX"L +MI`R/%ZQ%^A3@&T&;[`R,MT'@_]*;O]X_.8+U +MX)/GT%`&>CZ5D+ZC)?RK]8AA3QAS-=&8'6[G8M\T5E:8X[7F[5^Y14FG987' +MY57:]^G&-T]2RNPSG=]MOK7Y9N8&^Y^;L[;>++_!GJ7,M3J_C(GQ +M)FZ]67F#?9/SNUMOW2KY2JDG;I-\7=_==NLVR7=;UCVCN3[G:E-1NP;6"^H2 +MCS-OY?BEU*PS#IS,W*+6U&Q1I^W:HDX/;1F5\5"VPW,-V'^H33:=Q?9\NT_. +M*GF%=[Y7RPW%ML=1A@@E]:D0\E$J8I1KJ[0"YZZ>$K3)0P7.H=CK@R3:.)#& +M%SB)>RC6"1('YZ31>%_G2]JC2EY>1U;,!\SLFY:EW.>F)0 +M[,9;;0PKVR5Z]/5DEY+'>VSJ`TJ'HK+3#/RT[^G:"[7*SLZ7"-D,^2/.NZ6" +MD%O]FS:ON8-;ZKEC32.W-''1*GIT/$_RY4X%N\$YW<5QAUQ&G9W=X**&:QBY +M5\L2O4Q$#8I6=4KZ[U7]/3E>.I.6/&?[]*122)1/"^7[D?,CYT>N*+SOB!KF +MQ!3"Q(^V=&I^F@H\(?W'C\W/_^,K;QVLW32_;K5\_\'5HM/ELNI(WD$GM(LK +MJNQ*[U<>3Q=K>^N>=,GT^KISKCIGGE!7YUISL.ZI-75K\]90_<&UY]>V6//6 +MZ5?7K9LL8)]<(W%Z6=\DP<#JG;E"H"353::I0U/8P.Q/W5\X@X6;:\+.1YR, +MF.9\U'D*6G;\P@3RN@7^6YPD>B%.BE42>OR>`6F?,[J\3R6BQL#3<8A3CG%. +MQB6M^2]];",D\R9"YBWAE[X(=>P"$U(CWGR%$T],=$#O.%VB$U._$$\54AUZ +M9Z8;]]5>]_S!]:A+5ZI\E1&SG4^YWG,I+B'`/Q5'K'G$=%^J($W6$'GB=:K)K08;=\'\G/=,KV'E?-[3GL_IG]L+-, +M5.63ZV:%6"'-S0H'UOY@72$KVQN8;7'*]YU;=V&MR8/?4O7K3!YAHTOZGP;_ +MJ]8QXG17_KK5ZSP>K8-:/"X5M#_5'ZA+E#`"!+(DWLS*H)6J@+)L@]A:IGZO +M&]N$1.?!Z.B/8)_?9R<$VV/DJ(I-8R>P6/I9\<.J%]Q,C][Z`I1/;W_!.==# +MIJ\.-7M@/I]6$BY@`[.FN?>K#FYD>G;:IT+M4JWYH?,; +M2#7'U>1Z$2+1N^+U(HE^ +M,;).9!Z=XZ*/5%>2]APW*20%U)(#\2*2#M'W1OJACS0AHN]W,M_S>VC["VZR +M#^^?D.GV4!X;F)GC_O[\!^:WJ0YLE/60?>UV99@1(8:5P?U2<:VHTALV$I,Q +M3/9BN5WSKRRW?N,!&^Z-,^UJD=E_T`;KTO:ZC97K]!OK-N:L\WLVS:?E?A?1 +M'UA[NQ/OBQ2R!:P>>V2=?ET!2+39+"VG[8?"S-YR%XD^-$+RV477B$6B]\Y9 +M&['V9JGVIP:(^,5JK,VVD7)HGW*HG6\$=4(5]\]@R8Q(&,,V8E@YAM6/I/(P +MI[E3W,B]--+Y?A)>`ROID9?\TM>JVD@_Y-/O_$8DT:?8O\^K$WKX`D?Q"W<\ +M]O0P3(?`ST`VB_YR@$0G@#UI,`#\+K5*[PYN$#:0Z/DXOKED1`^K8DW=CKK+ +M=&\<`1DBJNC3OG0D.8[Z@&XP]J01YT)GM<5=`G5_8'ZF\X7UQ-00(H6_J>NO +MGUN_PK&B\D5;?NB>^C:RMG9N_3WUI;4KE[UHRPC/K?_:PI4U%C>>^)^[X8#= +M`C3TL$T6SG2WD=N7F>"=GPPOA+J:H-9K0M52K5WA^\4%E22_C:RL$82Y&U+= +M!^VISGG"%!8Y"0VA:R8[6SD[W5X%KE69XB3-%'`Q\*R>J;G"I9TI`Q?0[DK= +MS/'.:>XG;+;P1#;+;:[<3?8MNTXH\\/A+DD7:H+/3%U( +MQ%GB3'<.2&WJD&NE3N3TT$[YTR'F[N&98HY&H\R"-QU8J;9HQ!3))0.7UB(3 +M"\$-*2P3'&UD\;+7U\]U/VF3G38Y4S;LA!D5YJ5A;;+>F:$,J=[CPAH1=9MJ +MDOZ*4(KD3\,D>F:X[Z50LK__D.3EQY(T@/W_*OI)_87S%=;!-FQR%"%G+<]T +M'EB/=ROUZY4A:BH/,:;K0T_6&>I*16(J";G6HVYB6+<")YPF&NIZZR,*MU)GCS!"O +M=;]@2SN1XSRY?J=-?29>Z2R%^@X,I4)M+&.H&]=SE^N% +M=7HU6;\KZ]:),;..<>-IYBL\&Z]TRJ,<]XFZCT';+BG +MKA9K/0Z7WE/KR709/,SA=GAFVO5NSB0[PY7KG5`'L7!R[9OP!"U.#Q]PY;OP +MZ]P!X"+KAT@Q$T+NP$HN9:/1%IN0%H*'T*ID!:EM'#3OJTB[Q`VZ(<\=CP\-;(B2:.[0I +M,O(2RBSW@NP2!!,`\X`JT4^).3=!>0I8EP#O#3WI(44%X)_F*0%/]#DB[6#7>^=&6Y#P\>`#X[,63PD+PG;?*P!D9L1CC5 +M.4YT>18G^_6`!WWE88,'>_=)3Z;S(/3>`U*I&)"\U$Y>NJN.OI/`J"/301)PZ*'VEC`I_,E:T\;#0#F%+J6H=WDV%FUPV+%VLOU>CK@XA_D#8BK1^B;PX"_42K!]W2K&N$>0=OU!'Q +M$VG>J0#>?_.@5Y)CL)Y7EF^E9JQ[]57N#5>Y-X-;>T1>E'Y2QJ;:]ZLT8?4Q +M[?&#,!+D<^1%?2<.VFA(7B8O1XZ0N(UT$L^4E"C$RW>(5>'+SS3,S/DTK)OT +M`A=L[F>*<.9=T\=0F;]I[N/K)T,YU27;R0_(8[?W+*-S?YS34S/;0*:G.65OTS+>J7&"-`TVZ7$XW<2JQANQ +MA&R%.O?F_&GM'\=12=<@Z@WY/Z5CE27_]W2L,J2C=U2W*CR?9[0=YV.4?)A! +MBC\8U:WR!]2APCUR@9`EYY6H`Y=K/8/.=+/N/[5O\7[ZFZZCVE_^8]7#+NE>G3 +MDGXX=R!OEB>K2S +MMROS\KNG0GB7Y7+Y(7[NH:2;(36]Z+XZO1KQDHAXX+)/788-G! +M)BT7CA/RX:A.G-\E]>R,ZM?YPOS?U9=H'[]P+99+2\4LLOA\*L1Y43NV#5XT +MCVV#I\S_^VT0_@]M8-5>;@.K^3^W01#JK0.:&VV'>\$]2@>HGP?G>I\J,5]A +M^TQ/MC$E@7.87F>YFCXOMQ>\,S<-PJGTKNT7OAAM%V[7I?:,0AEILDPJ>#?J +M(CIU1?L`&>9VH9L\(NDENKHM.Z]H:P[U2XO%8\89JISKN-27B?$1`'I?!GX9 +M8D?O>!P+!W4+KAQG&D@S]ZKPY%C*Y9-YZZ`.K)1F^P6C5+Y$'>7BX^\A[^B_ +MF9`_6@G!MMM\Q?R/<_#6I!R0GY39,![&E]H8WV7.Z+U9HBD9\*667HJZG,@K +M$D_"<"V\6\:]?)Y'_=K0[\3<>F$FV'*P"=AJL-/`:,%D@]&!8<%P8/+!&,%, +ME^+LNF!.IBD%NPS,7#!6;>N%>6"K@5ZD=T*_CT_2!W]%VP[%XYI1&DWPG)8+ +MHY[`F@1^AOR0WW"F(X"K4<#P^KX7XOV"R?B\0]' +M\T5]I5_L'JO7=-NNL>Z&[6/=;UWE_FW+6/?QJ]);'ACK?N7;8]TT,-9]_J&Q +M[IU7Q3^Z8ZS[Z=:Q[KNNRF_"5?7;>]]8]X&VL>Z-]XYU#UZ5?_%5^9NN2C_A +MJG!]<*S[UU?E=]]5\7]_57M]^O!5[?W@6'?=SK'NWJO"+UR57^I5_3/KJO*H +MKFJO#'`CG60_FM"K^M7OJ]]7OZ]^7_V^^GWU^^KWU>^KWU>_KWY?_;[Z??7[ +MZO?5[_];/YF`MZ5:`D3?TH+?LC[_G)#Q@L.=11DO_L_2V+R\FYKQZY[W""G* +M#H]S[&[:82.G,]G4JK1J@=0N_R2X.^>$CO&ZEG\8;-,=UZ5H*KS2ES$]]59X +M^R,!9JR>.T8($,TR6J*I\2[`,YC>H]N#M.`.)<,NRZ&^^SO5IO%ARFHM#S0? +M;]8MS&?T]M+@`S8FM!G^:R!D/*^S*`UXJXX,*I/Z@63YJYD#-M49RJ9)H7(( +M_73@[Q'US$GR26DZRR.!<&!ESAWS=0;/?!I];T!GT+-XKO:O`^]&$*/2>Q2U +M4),\8E2?F5?]R=C +ML)]VCT,=Q^9=ML].'N-H]%?)4]&?ZU,40;>".^942[K%XY>>@FZUE%_0C:>` +MO0O*CBK8FA2U7FW-%UA69E9['=YX[*_Q+M7@*;PIV3Y@8$TLWAT[E-3X&M!_ +MSA$%=4)+.ZF^PDF=J.OZC(<:EL@R[6=Z*%,0AJ:!07UF?+>'24OH3IMD +M:)?L5IIPMZ8EW#8I'$NSS\/I-?9]KCF5^SP:ZSY7N8/HVULSMU/%Z^[CZQ.: +MTDFPE+?ZB5)]ZCI!S05=B5+AS1@LD_JHFBL6:#1GH%B0<<Z;JH_FZ?/Y +M%E>BQJCSZPR\MT#2Y5;`=[61J&UH5"OZ4#^>TP!Z&8C'3B=1Q'65*_PK)#QN +M;3B5O4;@+&1:=I@4I83'.^1YVA)B#/KDX3WVH)=PVD;O`AT\U3018W^82F[& +M@#&8\"X[ZL_62O^3]\G`X%TRO(L6')_0VXWW59'V/^,_%\Q'U,[/'%\(6N=G +M/,E70\\=5\D;J5/-9KK!57"'[,'`'P)IC1$'X7+T;70[F:2KL.\G^W5"#C5K +MC7L#GY^\P$<$>>`"+P]H.378C-,L:1TG^O,\CKH6;[;/:ZEE6EM>:0D[F-9YK7*#;;O,P&PO,+2V_LGQD9SV)8WUF\$:!^]_>. +M";KB;:28A.0L-0=ML;.O\@=MS+OW-B(WV-XX&(D>_3DO+R#N#Q2!X/9.4CA/ +M]Z+`25K@F'8:+>]/G'8>O0O#<=Q*O3YE50JCMJO8[.OH"<)%(P=YXKY_?E?0 +M9$3WQ8A![UHIW3KDSD7R#?*R?..T=^FA`RN)*35$37GA`[H'Y@L^A8F<&,<2 +M/2G.?#=%/*`3?'C>A'#'(K1PAXXIT8BWZB;E[/?9EU++8:B1"]*@?\/\XT%Y +M>;OM3^^0&31,N,Z(B8W'[HCC[?4/^AZJ4G!B`][\^EO?`]5XFS?=PNRAT2-] +M)O9^/MO"&;@R&OUQ'\-QWE(]?]M6_KK`Z,V9EIU:R49=&4T",02]5+KY_F8? +MY;9%/CUZ?R?AF%WK>'DA<7^F:`EV!1_4F8QRJ/.HWLL[%BGWS+FYG)UC4;13 +M8TH8[TEHS8J]-/IH7^(>P0<1CC-"&PK0AM1.V[--V&9_B1C`-R"UV>G((CX_ +MG[JQEOFF.>^6L[D6>;MQ%=ZGH,;KPD4Y-3Z%D9R0;GW,F/*N[-D)XG4Y"_DF +M'^H=QW?\,O(\*]^+9V\3[_QIA$*Y?3YY#E.:(NJ!9MM\.4NIN1-:M4;R+4%] +M44%Y68?M]7=0VS:VZZ,1"RL[A'<;L&7G]EGXJ]L)3POS?2552N#;>FAGK5EI +M4+!X7Q7KK=A+HOUQ8[6>K??+]V1;2/2S>.$BO$U9JE??1O?J`X>\RCU`V:C+ +M08_W]HKZ\%R=W*46:71Z'WM)*Y[;H.#Z\)9:-!['&RQI?/>MQ%^64=[GBO",^&T"!?;'20Z(>!K: +M(UKO._#F'!@O\E"VCIKEQ@/>V,D:K_9%QHPZ_7JJK)RRE/.2@C5>/8Q5C65- +M(,P#=XW'@7*=#1T-8@/7^,>%SD:\NVB&&'/,)#HS7K#EN-0;N>"7:Z[=0J*F +MN-M/A'7XS8F(?XO'6)M;[ER-QSMC@;CC4<+'! +MV.ANC,?>B<=CW?'I;'XIGC%[.IZO0[L"['MYZST,:J$`]T-)_ZUQU/=NG:1V +ME25OYVRM)/F3W/GZLT%BD-_PO?GYT_+.T*GVE;)IJ2'5M`EANVZ53UE,3WZB +M2ND9U9)GUZWPS;'?KF,L*>+W628OU^X!N4PFHC_Z/G#+7T[+BG"TOA^I%62& +M.18\47C[2"VOL-V6^J[RRLGZ9[8 +M_*!O=!Y(@PU4=R(F +MO*P.`0(Z8RG:_^_JCHO!''/K+L>I_K\ +M?=^W[JW[^F_5_?^/?75`=VK3>L(:_22Z/^Y`R:#H0_&C?I1,VQ?O\:-6K+^. +M.^[.!+,M;KPG!W%EXXY[9H+9&C?^E0',/?&C=V>!Z8WWW)T-9D-<5^2X:R[8 +MW`JR")[#0PX!9:>9LDZ'.'A@%/%\J'@13[GP7MOBA6##OGY+W,P?(ZS>4GQZ +M)Y9F0WPIA&C`9HLO!AMJ2%H;7P0VE#^RQ`MX.2Z.\E70EI]#FYX;$P=W2G>( +M*#JUBT\A?DG(S5YSO"SD"+GSX1_S#(^%W.B#<5\<4U`7H+0%@B1KU"GS!T&1 +M$)P/$G)([8JN6+6B8POG%)1%0EGE*.J%!GH!Z"30DU +M;ZFWRKS/(\\N.H@9&B/1)X%.C+VZGC9R-QQM(L:>)M9'I3A\5-I1WRM6DB'X +MD`-8;Y$G1M7\K=M*)6G.D;//6[6KDMN-`=3^^LSHW_&4L8JC&C7& +MT]+LS"GM`?.:B>2>X#/"&>&T\#&>*U89V&6']KRW9_:=J,/JN/7)BO;[45=S +M^WWML*Z@B9+,BPULD="2D3_K72I_YMDC5M21`:,BNFWLL4I.DM5[7)*<[1F7 +MG*4CH18*M>695$9L\<&8@J@#]N%8DN%H2P=O,65NKEIA]K15%IFX[W95FUHI +MP[[U<\S'YVH,-8TD^D3,;,@QYQMJ6DCT2$P^<78Z8'B4_7KJ6OL1?V>D%_6B^\;01UF=?S:QL3\ +MX:K`LOT,RH:C[^&8O9*P52NB'JQ[2-&F_P/Q%KZD%;53HG[G9*@C8F8(+5L4 +M*>+,2*JPB#LL/H:X^MG;*N +M=X$9:BVS:DU\8ZAEM=5B9CS:5?F0,CNV4I(%/CZ71--C1UM4+%T`?"7<01S< +M*SVOTEC^@[*>O?28V2JT)-KNWMAU*/$GZ3T,Q%Z!9[2H@N3]9^,B7AR\.;:` +MUYJ"]\Z'NA06&"(I'^@*,B,L$%>0%3$77-VM,@8;YPD6\"D!GZJ"K.XD\)DI +M[&W,1HUAC3J!AO]T00W_*8(&_I.$MD8-4*`EV\ILR["V[W&U4OFF[C0KS_)! +M/!O=`TADJ(O2AB7AX:%I2 +M0WV!I$"O%&9$;6TECJ!CHXTR9GJJK&^[4]/FE+WM>-M]=>YAR50K)BN9;>X0 +MK&5MCC/N?6F=96?`M*7IP,3U6309"[6YQ&B!=MXZ))INK*`*4\"-YZ`W#67D +MY1I$D[F0&%=#N&T(727@6@FN,LFU$5S+P77#$"7%S01W(;B+ACA>6QQL28+] +M@A;:.]BRQ+9QVQ);UYY`RQ)H\2762/"3%G%13F2A86Y2YKF9_G1/M;_"\ZC_ +M0<\Y_S]Y9K94^*I;TIL?;:EH3KTSJW5N[M;-;_M)+EL17DAW+_;\VD.$19X< +M6YM>M_J=N\2%)&+S94URI33/L`7T"80POEDP[=4F$1HRH!#[4>5KN3]B6,47/&^K$``ZOG)0SY;IRV&^5YY=SY<7E +M>/XWD*?K)<1>6L(5"D3G,/VYSC-OI[Z^\\R_FE$H_'1&0"I_XEPSFI6$?'(3 +M13XQA(_TSP@_(%#$T)6=19?LG`,Z,0WSP=ZHKA&56A +MGHWP##5"J(=80CWINE!/"A?J22+A/GLDT(OIU:+X":9)BISN(_90'V)'DH", +MU:D.AWK"R2Z7I#O=IR(;>U2Z4)`F)4(.W#.!ZPZK*F*8 +M2F5+^'E.952F&RB#VG#O&D[J`;3A9*FV&W5ZD>@<1>98R_O7M)6J(N@K#JZ+ +M$_:S`4).[2!CC^Z0^Q8A1Z3SIO94Q/HJG9>^,._8@G=FF7+7E9;=M>:,9"17*/726<(=2Y:XYE">U@+CB6(?`D[=RUQU($!M;T +M-(-62$:-+P5T]X(G8(9Y`N>+I)]:&/8YZ=QV[P>/T)F#MP9M9X][CKG.RI2WL5J=W +M-R$;)B'.5S?4C3NL#4Z_H];';G(V-=?[8%)@^0FP>;9VMP1X[ZR#-#L;=M_9 +MH,#*3_3+9^'YXUGI1!M,/LOH8##>A#N8--7]T[RI;O,T=\FT](],"^^:EM]; +MQ5/=';:I[I^KI[K73LOOHVGYO350.P_3UTAE4N;VZ +MH+T2>,")-BNI:=CMW>6H9WU.[RYW0Z(;E7C=/MJ]FB;6^ +MWGD'1'8W-/F\S;5*9.A(D!H["^MUUCK=>YQU4A]-Q';4U7F=34V)SQR;)^X$ +M\1N;G4T2TO/W?([:G>SN27U5NC8YZ]R0JV\U6^MHN-;'[O8XL20;FL&ZG75- +M=%@I=G63T[NDSKG=W>"L4_HK:_YB[T*84IN]3G:/V^MK!O?V!K@#E+B.E"U: +MQ-:[:[P.&`7CM;_,=YL/#HD)_HND54[Q(\B3%:?C(L_HZ@C77*>D4:N(^L45 +M:?KJ2OZRWX0HBIIPC,BT,'EA\GPB$H9)!'Q9+J)T84XIA*C@)^=]B1]1:-Q& +M3="D8"(FP6\^T9)YA!5OC%$K@W\,//TT9B[]#^E8SEQH*:F".J2D9%`J8K>$ +MIQ0K`).54O#+EU^YU"_!$YOJE3GYNI(\E.+CE0-/HY-P)$-+$1C>I&WO_8^I +M:8Z`%WD7QNN6Z;?_"H1/X;\@TU',&-I)@T(@0#.`9('RG>875^\OU#;VVN[V[[G1XG=C4W^1Q>EB4NI[?&Z?5=,MX=7J?#YW)<\GG(E>'&S6_(]<`?CO1?CA+R +M<8)6YLV#F<`'ZX+2>HZR1SK@F0U@IR",`7,;A7)*\GH/_'+/9(HJ>:@A+`W# +M(3T#%%#\,3V&W?Q!J(]7Y!)O-H3Z?L,>Z4_()]*ZH*"">ZIU);U4!/(-R7N* +M$Q#GG4O$2=0A@+)4NOOZ_8HL%_*1`;"COX>5Y;A0KHTF`<&#<23YO&#_%BFL +M3>+184+\&/=_\.@^AN7MXWK@W:NE^H;A&83[:2`5$+[O>%M'/J:C[PWE\#^Z +MJ4^R'Q[-`CMC(,K;$R(M##DYA"X"*@:Z(0?UD$)W`O\BH&(@V'<2"]`V(!8*#,#-2;8=L$AKM/H$Y:>JEP:2]%JGI@[YWB +M(23%(\QFD +MR?FQ2!KNMDU-% +MWQ^Q'ZWC55';:`U?>Y0%G[6C=MYYU`(VRZ@Z>A+H>:"7@5Z3WN8?'E9'WQBM +MY!\H_EQ[/*`S%@2#][^5%#M'V.,!=30\6KYA*^NZ$?47LTWH?K()XX?N(ODK +M(MEL?E`^I:`R=DA?XM315TTTX;B0EN`-LPLW!=( +MY:PS:LXRG[?@M,<4: +M6L7[4_R=L&/E_?@>\>7Q]P-_/P\8:3_KDS5/$1*#7KRSB)"*.W:->T(X3*B^ +MYB9V>[WCCB9B4!,:PZ=XPK5Y"UN^X2)?0N^5WY/2LJY_C_2-,J!MJRFIP>]] +MB*B@L9&"C2XZPI1508F#91OMB7,70Z=J*]4&SF#A3K>J"F*1,*N.)HUHI!Q. +MN\([M_'R:1.JG71LY<-N/#F2L?A66UKWK5;"5M7.V/;C6M0W-GSVH*2E_Z`C +M5?C>12&4D2D[Z`#F=[;\3HZ.:(S)VC.UZ\9]2"3BX/G7@ZP!^LN(.OHXT%LC +M^>`*#W.&*N[T752!C"A@@?[:.J)\01A'%+@>?'>/_'%@M8TYI?.OMC*.U?QU +MZTI:E_%XIB'33PJ8R&P79T%^@XXDK@=W*@V^2X +M&FS_V\'^5.:78]9[IF#6LQ=AUL^:@EFO^T9AUN^=0^@T6"<.7#%F_?&O';/^ +M`6BW=Z$=UT,9/P/[9C"WH(ZA.=\>S/KKQ_'H5UP2L[Y@/$[>MQ2S?LU%F/77 +M3\*L7RYAUE?]!;/^_REF_8>T/,9Q;LX!^LTTS/HZF,>W$GD^K_I2S/KU7PFS +MON(BS/KUE\6L7_(_QJS_;&P"L_[NRV#6-UPA9GV'A%G_YK<2L[[M*V#6KYB$ +M6<]]0S'K/XI=&K.^>F0"L_[&41E9_?K1_TO,>N2S<4S_#'@LV%M*8QLQZQ%_ +M'M?O7RAX]6>`7@=Z6>'/D"][02W/`W9:'N_A:9CU#XY]NN[=]D_7S79].@6S +MGOX"S/I9(Q.8]1_R=/3SV(?\A^.8]<7CF(G_,0FS_M\W_&X$1GM&PJQ_0\*L_\=QS/IGAJ9BU@_'IF+6WW\2=2U3^]M= +MVM08J[6\REMVOF(E=,=.IHPVO,RK]E,[U5TO64\RS+9G$1H8X^.2PA!@N +M(86G*G/5LU9/4DK7TU89CY[I(OG)^QO?/SF.07]"P:"_9P*#7DK_NRO"H/_U +M@/IP\N.;M)LRMEZ$)/_+`>80,=D\+LW5YYY;JHV\OC0G\EN8+Z"/QN'FBT +MGFE//KS)WRBAR-^GO\N6'7ANZ1\4#/G,=B+0@D6O"UP8:-Y0K.#(,Q,X\E+= +MZB4<^=3A73SEVL7/,"3/R4$>*S8[]W$*912VE%GT+P1NY@,=JL-JKK.4/JLZ +MK%_(O,M(J.X3^?`#`2A?U=)9W=4\V?%]ZY!WWX[O\\#7=U.F?346%X%_(EA< +M(ZTXZO'K;/L.G7X>-^1]09KI+'K:A*CO+XU-;0/#I#90"5^&T:X9N/X+,-J7 +MP_.2PS\_O](VRZXZ_%I`?2AY'*6=F832KNGT:[+/4:9>!:4=6^3DL.:@A(72 +MSEJQI53"/-BCHFT^GV%*GMBNY!=&@,1_- +M(=1`6F"XRDQ%S;`6F15,]1/G<4SC&,?QC?LRW(L?4/CZVQ0>X'9EKQ;&,)A# +M#D"\WZOEM1_W`[C7(Q31Q!0LK6'H2]>@OJCV<.(NX6GGK/,"<=%`=S +MAI%G8`Y2IC9(47Z^J@*_;B=RN/&\K9(V<1**?&12SLO.7RF*_+SSJRK-TU#D +MBR44^942BGS15T>1-SW]OX@BGUZ)./%IXSCRU=-PY)^?AB/_BWYL)VS#3K7\ +M=O(8](67H7U?R/SZL..ONRQV/#L-._YN"3M^YG`".UXW_,W!CK?&)[#CEXF3 +ML>,7BS*B9[[X]6+'-UX&.[[VO]F[&^@FJGP!X'*_HHE5! +M>>JN3?68(=/RJ)B)R +MG7RH'&B\1.WXK%'L^"[)CC\ZPHXO$&3U/TMV_,'OP8[_ZCNWXV<,L^.?%K:P +M_!QV?-DH=OSV4>WXM?^$'>_OB[7CIPVSXS7#[/B?#[/C;QIFQR^0['@&YQTI +M`Q=BQ\\=Q8[/.D\[_LT+M.-OC]KQ_W61[/AVR8Y_)VK'WW\!=OQ=Y[#C[3%V +M?&6<'1\I-VZ0G@U9I'O(WTG/_"'/@7PCF":6-\H%._Y/YV7'OR78\9X23YP= +M_P;?CL]#Q[>RXS\75/?G1]CQ'YW3CC\2M>.?X!Z+L^-7"G;\3L&.;X^QXU^- +ML>/W"G;\"U$[_G>2';^N;_.8=GS]=VC'SY+L^#MY,F6S%>K9#UGQJG%V7ETD +M&?',5RR,3[%ODX3X\A+CSR!_8$`L\K;>#IY4Q(?OBOKP4Z3_OJ`D1'E+N'\= +M9L+?)+0U@2=4G&#"Z^%)6-2$#_7Z`Q:\]"ZO;?4;[+6%Y5'S_ +MEV\0WY-BQ/>UO96@??3&,O]->7BO#N3UB#EA;)8O]=,UIP6(_+5GLXP;! +M8C]=ZZ^50=M[O]7OERQV?]1BO[?WT5$L]AV2 +MQXX--L=8[+)PKO^!81:[7[#8+6L)UE)CB5KLRMXA +MB_V342WV]2,L]KL$BUW1N3])%K78:\ZAH]\9IZ.O'J:CVR4=W5YMJ])7MSAV +M"_>QK8(CYPG#\7$+/CZ>Z(O5T+4CGR;USN;FER)9/>]QL"9HEQ_?WAK7LU5`N2*LQT)N@ +MK;.7S+;ZQ&?ZBZCL6K#%X5X/_G]5:@WX#NO7(?_ZH)8@=ZTGC3B?PB4U@RM8 +MC7SWN*XP5[G5MC?=!RGJ6G#"JUPOU1&YB[UD[CP?9?"X*(XJ5;/IU[]@*Z0H +M+8-+!T3*"9&Z`!'G?8-8 +M0TIPW?=(/C,\GX#G%(AIL\C];?CL`/FXK3K6=S\1\=UC_GEFG,JD:T3?_*D1W?T/>/KK1\3IH+L_@Z?O%<3?;-\A030>+^CN6D%WO^*( +MNF#76K?^29]_[5;]+I^HNC\ZINK>+JGN]_G>$%3WQLZ7N=^/8;HCWWTNEWL/ +M'S'=518;/FZ>C9KNST5-]SV"Z?[UP)#I[I=,]^.#HNG^=&FLZ&Z)$]V7]U:Y +M'Q-$]XX.\+AGJV2X5XJZ=1#3V#0/GEMN+HW*[&>=,RT)H)\\1QML$N?TJSF/QC"*W=]C2 +MBCR6/'.:;6&,W.Z)RNU97+LDMYL^T,;)[9HXLYT=PVQ/ZH?G^?TQ9OO7@MD^ +MI*HG\^D&U5I2*>N$G%Y5X\8EYAO.RLT^FZK(:VEULGZ??R[.(SZ3GB_#/0(\ +MFY@@_>\,]Q4.Z;DSY!?PO*(I;>A>(]9XWR_E(72,\2[4-=,KXRSW+9`&RBK) +MI[`I) +M9;]=4-F'-':YI+'?@^\F(A:[5K#8KQ`L=EIPTC,$B_WZ$1;[>,EB3Q8M=K_* +M#U>VFSGP_L;VV&\8U6/OZ!<]]BU1C[U*\-A7G(V

0[ENS:BJ6Q+G&M"?**'(EDTNL\-PQR+;SF4VYJ3S +M*!(*I7,_IQ#&>AB.T6A&AZ%48LD;T^U'$$6NG/X(:0C@1#WZHU:\ZSD\&;:& +M60E"4;1P<05I^$UBF"TF#/?$S!<="],43TU:NUN3A%T[#X-P"YR8XYPG5"K^:X==H#&\`YS9R.B +MAJFTFE1:S9C6L'()$ANYO^XC6Z0\_$T<&ZL<%.;^2O_5IGQ1=>_:-9V$.%ET"_>E>3E]U8J\<, +MKN!A!(H\H70(PGS66L$6WRSD!<7'L3M=I(>:S5 +M\U59W@'=0GNE"85^;L3=;U;L+0S:B"0)I><`^O5\X9H]-(.!?:0U(&2*4;9L +MQ3EM](,0Z<7X/*ZL1X^RN'9NB];T)C76TB^@@_;^3L'U/5ZQ7X!VYEF5EF@= +M:C\,SI[E">7/!>'>V,AUY)L4(R'.1?\**$$2JL)&+EUH/:?OGXU4HW%^!^=S +M_D4Y7G%]$KW1KH0[Y_2-M\B']*HZ3Y[QD7,.](N)?[$T%(:^+].*7G>7PRB` +MO8M^LPE:2))0^/ZYZGUNCN4COV=J%W2^WX-NX933-= +MC[[FT)TZY=4;K<46ON3/W&0)-935DY;W\X2JD/H7C9F%7DQG-\:M&8T6C6M% +M0J&L-`ON?D_=Q3[,@]^GJ]_V8X2JDI5">ET.ZQQ(\(G'6%X=P[Y6*19NIK$) +M>TP+ZT2N@_Q/$&KC?\A?!/HS@;I1.`"?Y-2],-Q+<5H'J:>0`]J=XIK'<11A +MGDN2)M0Y]7$+;0"_(3GV_*,J?OTTN'<2?(97:1TT*OK/"+O++"F?RQPIG\L<+9_C?W +M3,)*D0T?>V4E?ZPT]@IK+M8O1J%75OA%7EF5Q=^D%]3<-#Q+$LJW+$+)`VHV +MS;PVH@W2Y?1&BE":VF%D[^N25PDU7\[\(E02OBI:_\;4/,>+)8$>X.<*P6EE +M"16D(1S('>G%W/.$&D:CTN6#J([H]32F/H21=H5+5L"*EM,76R[R+0(EL/.: +MJU'XA7RS(,UAN&,?]M+KAXL1ZD%,7EOW4KE%26S&OOC:_]P>6U'&G +M1`O2N.U]CM_QN(E,GG@\*)/7G`=8?>/)R<<5OV:A;B<6;^B8N#CN4JYDQK_..(?3U#4'O$;N`:-!6\RO[J+Y]A!ZB831/D&HT&O,<^F^ +MX,CM[&U;*PW&W>W1C))O(M6_[BF/!L]'T=D,L\H>`]7'")P +M-];5X?G^8>!MC)129-3PEWB=$.X*ZWI/I]?S(:[Z`[^>U/5K;_O4$X22]S[D +MR-)@/B&',(YGDE'_>,AA7R8AP3Z'9JJUF)#5#;#4DWY+4Z,,[A!#U&,O,`K; +M1)I1S:#;P=/Z/8'XX@'/P%E&H=_N"?`-<;S^7^0N]#]-@M=G[MCEY)DNBH2I +M5I!4G')MJXLY%\MI!7(8Y`]F<_!K5^]RU3&`$XS"U4CXTB29]:*/<]9.2)X# +MR2VY6=>O.X+^Z=`#TX>AN.90:C/+)B]V2K6>.1_DNG6XA]OF.!G]H+6D.:W? +M8GL$:7;_,G+SXEQ'+@1]-<8[8=1/WR"+<-GWD(,^4L/*NO1.-9KF&;5'K3%= +M_A#-;Z"75SG_#0?E:?*'K*C7[[FV['G(\2*, +M:V'0WR8(A4_"ZDD$T9#3,L6ST]$>@%!R1S@>]`M?O6<)_?7+ +M=?]RTH1"J\'@%ZZO>BO[E):0=3W/;0G[LU/D.W7N6T[^*17T]K?@GE^2=<12/U]T\':V&%5Z(`CR7W](>-)E.\@(P/IEZ6M?"(+5+E>VD?'>G0^M#A.HARY87.Z\B),;E +MB2;1@AFM$IKAVV8YK7O0+ZSK83]/;?#^`4>,;B#:KH$W\XS"?>6JU'YY`W)G +MD5"8QE`V'61__\RG?J%);SF)9TR^4/(9_86HY,_LK/F%4L]4?Z&Z&E\H_4SP +M"R%M\M=;*U;[Y1F;G>PS^@O1"-#SM!.MD59^4%KDCS?89T":14;]\S$>IYO0 +M:P/W`D$/U=4^UUW5'K5AWU,[!>1R< +MB]U3K2RC(B'2`&]3_2AZ'RLNB=KRZIU.V]+Q5OY9O_]24MK=A"0/)CS?`?6X +M^*RN]Q664/(@'D7)]RUP8C=R`KB"5B]H +MZ97GM$A7'TS/XTC),>%XD5$D8=S?^3;D<`!HFZ-Q=YR.E<<=^7M="7_]4 +MM;!5VYX`(/&\'M,.`-UC-.H?2/U5SS@Z?>1VDE!QJ"%R5(E&^/C2:-G//\@Y +MV-I2S^LV1)8'D;(,%JS1Z>=UC9;-G):X;;WCM\^EX\E;0I90U(9!;HIUC[?6 +M03L6\_I_39 +M/8%X;#V"/`&E"!7\.IBC_CK4;_<]X:0)13W'EY^M^"J'+RG/+V0Y1YU.N)P. +MYKH?CI6H;Q.JN4:\QJ"'YR+GJ*()#?8*S;G;_T74/W4](#_X_$0"%^2OH%VN +M*;4G_LN<6._('Y4]EYEF84[5&\KA-7 +MVB**"V1IH<:G+*'Z_LB\_Z'%^V+GWQL6!R\7%$%4O-?FY0DU&_FU"210VQTM +MU/O7XPBFWBHR]?!N#-\-;9W.809"27R#1J]Q7S_%?H%N7A\_A:R5*.="(T4" +MC'.:2$WB!?\[=L,3J)NQ7H[JB+NS(Y+L6+WD"_[H'N,Z)<_>R#+`02*6Z0/= +MMNZUZ2E"-2J?O$C?\VSX)2S"*]=`]'>,"(WV2_ +MJM+B=['.ZXBHN`Y)UXTB9K_(=.V8O@(U2C@O;RB7I*6;Z4H0"GNUT_NF6:=3 +MR;=.;WP/WH#S\#!R8YJ5)!3Q!7V3OH-^1+<3[\//LM?>#5#6%.=X,/#F>FO0 +MGE,]]YY^,3CRQ8<8^;(O!D>^\NY9]N),]J+?V>#D.4>!/A25C>EAZ&DZ-HN^ +M`Z[T7K^CL\@H'+LPYMDGVZ;CG!7JWKL&QDRA^K4Z.LLN4*O-7$[RA)"7LU6W +M!.D8]X7A+&A;NY<@E(A-\\2AT&_%'NYH0DXDE&94!G7./FC]& +M#TG(5>`,C3!?W^2D"#545&=M]9HF5/5^9JC['GF2770M10#+$FIJX\'6\?5A +M"V-MB>50^ZYPW5"HPZ:Y+-#8\X0Z/C3%+L&W'QXB7Z`>_H;1V>N_\ELVQ7HE +M%*:*Z56D51^R/NG^ECT`2'LKE1'N8+PSXGT_Y')Y6/1'A!T9@'ZV%'83C`H+ +M-S+P.?(-W-_]+4LLWN8$9S626ZO+6"OB=XI07`_$+/3"-6/@GQVB;7MG79GA_^5BKR*B^V-RCE@Q&I7IOM!!IOX2HQ(J.08@+ +MTV'(92E=^7A?N;IVQQ7[:S',>[T@:B;)E0DB#IUFZ-Y +M52A9+C[+OL2R"2-$$K[?0(-K!]_ZUC8G3ZC@UPB6$V/8A[H.=HN<%O0O;7U, +M<4\#4X]4:WKME_D[0LK'EZE&J0BIUO0FRBAW&]GG8IH4+0SZYQ8=KZF,FK3- +M&8J^%*,"M20!]:.",\=L<]*$"D7:+7\5ER2U\NIN:U>#FR54-/BN4\[Y*A&R +M?F&-M?(O5W!UPC8GU&7A.MUHC5P.TF"14#I:'ZY9X7Q[=;]AOT*MHZKWJ+;C +M3A"J8F:L:JV(?%$0BM:">BGVBHOS]DBGJV;FCP-I.44H6O7IK;'JT[N,O%6D +M"46K/H!J@[LG]ZI5'SA.AKO:>X2 +MZD`O:JL/=XC("726*D)0@E"T4M9[@M72MPS7T=P67$%"'_8](8I^E"247/J@ +M@ZAP%]QMPY6VR9[F81WH@RE"X>Y@FA'6<=-(B@RYI7J@-=+@I@E5JG/MTF)( +M1Z'#'Y?:*7?UM;*O:CD'RQCND[S:_`#'%=%S('E&J?6-TX:(#%@D5*T9NPI9 +M_8K(`_\-^MZLY]V@II413='->+]@Q]^8''$:P!*':L!?'.@'T+.S3/EC<5J0"8QLD"461N4]XER/' +M8`Q[E.?ZQY-'AU=`(DT1JJ]/]>_PU6=`KUGH=J%-1:V/%PMO*URG"?5#0+W4 +M+0=%A_3M5SG'@)Z!B:NHOF6V*'[K_JU!PFK9!]]GG2(27O`[.3 +M.W3]\EL=V@=&3V.NOXJJ=D2E=V@I;6^>0K,^ +M765/H2R?M`*GM=^G/*%P!K!)@NX"\O0,M-GN:7OW8[P? +MJ%5ZO2*>)%1P75ROB&/DCW/AC%&Q4X0Z'WYA;.P4K9:&Q`F^'RML91;TCUFFRW9;D9Y3T!Y`U5LLKRJ!FV<46;)`/XBSU/\' +M6E@C:XG#U;>8'W+\VXFXHGF%,$(HBF@\Q=X_! +M#>Y`"Z//7TAWQM-. +MUD]+O/:*/T+M4.W:][?-:0WATT?@0NG^NYSB&T&-M28::7Z3=070[3Y;[_NH +M1YJ^X.]_W.TDW@S6U:'23+Y9+N-DKWASF+S^:LM&\?>1'JXPI@A%.U(7H84K +M?B[4O,9<(R*['/E$/_LG?U./0]6Y!&?\LTP]Z=>N-U2N>49!WH%<$Y@KT<3> +M@451T97KQKI)^PSWWTWU-([7;2=X8K_=COT6I;5M\&XX'"\]I$TTVPE"M82A +M3XV`%AAMMF-6LSUN6+,=;VJV)S0#PFZVDX0Z>M]F>V)+LSUI5#/T%LWV\5#. +M:5#>$^0:,V?1\XNC=`Q'DHWQ-*YDJ. +M[TL$TYJ[B=,ZE)%90LW'M-I56A=4IG49/,MS6O<-D=981A8)U8MIC5%IG5J9 +MUL_@F?T.I96M2NO6W9S6`8Q,$.IJJJ.8UN=IMSA%&PRDER34]8BZN2J];N8? +MSC6E"(7X6[`N-'-ZU-/-W^6GE_91]R/JVG)Z:'TNYFVC42)+*+)34:N>OB>M +MR;O\M9C\.WJLQ?0>1?I^7:+>6]_+P[TB<^*JDB/?9#[U/%IJ#_:QV.+L(J)T +MNQNJQ24(I=O=4"TN22C=[H9J<2E"Z78W5(M+%ZMZ.:E;'(UZUT&+FU=RLD66 +MTKC=#=7B\H32[6ZH%E=DNE2[&ZK%V>\B2K<[;'&S:_`N0:A:?5:0=TE."SD( +MK70:H#KDXK1@_?DS@>H%N4)U7V`H/EU"R7W=Q^`T70\CVTMZ*$PYA7?Y;JJ[.Z[ +ME(^`$-KVJSF+D2)FOZ4>7->D+*&&ZL%U3\;MA!!7Y9D3X._9WH)0O'=L>1W9X2R!0%ZTD_6(1[[^K5 +M:N`G[.&#_(GN'$I*HQQ?+Y'%2YY0H49NCU=E`[(OSB:=Q?X'BH3"\J`7R.\@ +M/>\/^#,B]%;8M>T/B/JMG'+XPS(M%?9,C*J6(U!/N*F!+.&ZD5^,>F'`D2=& +M_+MB"_S^;OEWBE'/P5T8T>5-_W'DHP-^+%#Q#%R_6G+2C-)WGX*[SY3*J"<' +MV)*-4#NTETI\"MRDL5MR]%#T\9KGM+`67U:8CMY=T98F"KKMQ(5LAVJAO2^C +M`(%>7C$7^<8N1Z>!FC#M%]W%6@![7:0=M)R[+=^I\\N8()3XQX!#8_;?@?+' +MMCMH*3$&1ZOA.UC^(A3E]+I?O5 +M!5BW0BZ4=>MT^55!-4#[`\D2*F1SS=%(>AH.)7$N/@J`O$I+N-U?%6PAH6S( +MZNM47$/038N$PKOZ:?037G?D.,D>66[:'U)?B!&**/8VO$M^K#[OS[(@%0E" +MH;?9O5FY)C_49=R-]K[?WE[;WO?#8%T=9`&*^ZR3]LA +M]19NBHAV*\NH]W!E`&.+@)SK(U#+0Z=?FTW5G&UBMY_C +M]QYQ:)8:KN5BT*P#?LZ2A#H=_L<==?T@->(QLDN(MJ[R.;5[$">6;F._J:L; +M[/#`>$DK[82Z2JT0T,H(.BC$G!?R#E_B%Z&B>Y0U,+P7C!`<8J*3><[QU_]V +M@KF&T8\QSNVH/(J,TCF1]Q.FC;QJ*]KLCW2=J*8MN#*2^(A;[:?$=R<46[[= +MWXE?J:U[JE5'=+W8N28'":_QW!2GU3W60@]>`LXXER#?R3D^VNI)IIDNP$>6 +M0WN#`ZUN2J68.VY)E#P=1KJZ?YXEU(%=RY:+R'CH&T!FNB:6;$-;N==ROD:< +MKZ"^9D19],?GP^LF=(TM)VFW8W9#K.71PC +MRS$<)].$DC=MXQEEU'#PR>0G';D->L^PB",WLGN"G*@U`TOVO&=_3'WT)VR7@Y3'T3II;;LG;]O&.B1H>`E" +MB=$P!BI+'NT;*^CE*$DH'&^.[XXJ"Q+XTGOVL*T;M(4,VG]]S&4$2O%`^Y++ +M2H[.?4;WMD:1W>&D.<=`N>3;2".G06_="?(7H_#7Q:#WW1KD1#O-T\T`2O*, +M0JMBM6\QF+M(E1S,M4@H^?L=#G'Q9=P_5SA9O%1J'X%<>+74+@N@3_97U$+! +M,M>@^7M"Z>ASB]!^%6TY3G[!CP].]DR$TND,-1N8XAQK]?4^%;G&-*&T[X3$ +M7\.B'SW0!G(7Q[_@9`E%_FBPU^Z-^ONMT"*5WL#^BU`R7G2T72YY#<]6]M%% +MIJOMX9/),EEY>:G>L61_POQ2=&#)JSRU4SR*3[1<.%3?1?$H."UML[5ZO"=_ +M\H!C#\2DW=701VL$<"_%J(OXB;`;6O'),.A+90KT/1TODU!#675K[[;93_1W +MK&5#1G[+H;[E"?6KXZ&\BQ;/.A%;?^FUC@6E0\N6JI.V.<5/]/BX00JNLT\^ +MX4PK-;HK$8FHB=N`9EV_KCX64&>!U/W#';ZOCC;)O5Z"4'FT+8QP3%@<6^5J +MM4<*:_EWMBK-*>C5WVZ]Q.Q+.<8LTX)#4R>1;$G-(T]EJ\CYQDU +M[NNG4%_5#(H3ZE1]CSN:`N1*D5!'8?Y';?/7>R'W613Q>:`!_00<8)<09>W9 +M/GTX6@PL?*W"+_RM]5#\VS]Q$H227\PY%31='TO1?ANX'^JRIB0)):Z/3XDL +MW#%]Q1NE=BR?WE](\U9`7XI0S*?7*'K2AZ7)'OHL$E][E;[43O0'PW1)]D`/ +M9QLYBFA+\;`.QJ@LYVB]ZLB>48]4FD56;W+KD@H]KD#7[Q' +ML!\*W!&4&6.!=C@-#][RH']5'SC/(61F3()0Z'7=$.%KT_X*PZR,$Q^+T*R(D-Q)(I1H&D@/5(M)T%I;\1^#:6 +M/0Q?OIULRM*,TGZ'X=R*WIMQS0G3!\D]C/Y%%`IRP=D_&(]L@=8MUWFM*C8R +M>IC,*^HAEZ4OD<;+Z89ME"1;`-G2$[*+A,+W[6785ZEU&F`)K@W!H-V2E."_ZS(X""`^^*7CBNF$+E[H&Q*$VH2%>/ +MBW83EW?BH2J9;%6ME7+==JT[9&\!V+;#M2\X)$(5]="7?.XSK$U83+,WW'R +M+*HYU\=/0=Y3+01./[1W5-3%-**R/&$N$TD,[`[2R1Z[\ +MOC`]"H"LIHON4+RMGM@LJH68/M2/'JB%>4)%!CI=K,DQ^"+-19Q7R(SQ[2`/ +MMNQB.2T<\W&`7SLX1HE=1W3MQ9Z)]C\2BF8543-\\M6:FF&247O9A8OR04JE +M]6)G@?3C$^S$XILZ4$+8@',HF5?)VC[-*.C)Q=@3;'G;_=1STJYE/>*`Q)`E +M%.[A(]GR?^\G+9]VZEWS*GN8O/E^)^]37TM;DBHR1I%0)$O$H$_^_?VT-Q"? +MA`)^=>T(3GW6JJNBA;Y*M>8P5="L!=D-_U3$8X32JQ1!#LK=>QSY"?>Q;DN0 +MDY3.987IXKVP6(EUXA.0:'>6'*^<%M[]>$_-2"B240%_&N+],'$CA&8):J8Z +M0ZCUBZ#AJRB?UZT4//\8<6D>8=H#89'CM"*%FZYZ3_@1>U9"&K@BG,99FNT? +M.X5*NM[8PS/"\$0<_+)/H]B/^K\:.D8K6>U(#^.-QO;C;[?8F_!WM`IXP`UW +M:1_-9;_%+J/ZA3OM!E"FNC[GBMX.^-!GDEWMM)584&B0A++$[ZTF\:!%T5Y& +M8YTL>2W-D&/3RYZ\_65'[J>I)_LN%:_@WG]T;`=RR! +M)7.-Y.58_089OZ.PG^IQ?6\Q)"^W@0ZTM>3[^!6C*"WX;Z)>Z?[@/4>0#YX& +M"RWAJ#<@5!3ZA/H/>*ZQUCY1=U0MZH.R+D9']T;IEDH^8),B675R# +MK)NA-V`4SGJAA?K-:K;N(Z#M"W]SAM-%Z?TKKNJ<< +M>5XYFGW85JW^2QR_+D8HZD]&*'N)B8%(F,-Y=Y;+:1U3?H*]#\T]_D_YGD]0KUNJ]1>N@M!)U\6I4;##J-[Q7NSO$N:$]G\NH,3C> +MARN>-I!M`E/@,>JAM\L\VD_QZ!_E>Y)0/?LJ?N<":%OMG?O;VTZ&T])?![ZE +M_$/1D==5TI8C5*-:-Q8/5-)FT=RQB!4XK+Y:C`MU3IX<@2(Y3\.]!R(QRWPW$WZ+6_*[(F3E,1'4F74:O>D=&< +M5H8E,T@#M!N;1GBUJH6Z.Y]U4K14\&TCQ?U9P'15QR6BIE2O/?@33/YC0SC+J_3`-9:#X:2'.. +MB.54CI#R7Y@&C13_+",+A.KQU$[;>ZO2?$`A#]0]4WB&XL"=E4CQ-Y`G#JRH +M]],5!VZOS-TEE+PO0.VIB@,WE]/T#F3J(>6[`QPX2:5Y`R/E@15A>EQ%Q]7P9(W5 +M%^HJ5+[11F7,!.A1D2]ENLR-&*$(OR9`S['J6ZP4\=+BASM<1H%T/JS(HZB? +MR]7EMSQ"]20471JA;.9KXC +MQR6AKG@CP'>DZ_S`6XTBEOFLW])^R"70/8@XIXS,$:I'[_']'M.CD7(.(PN? +MU5\(1\Q.-0K+W>_BO#C3=RH@#^*:LZPB#LF@_62$JK7G+KBJZQ)J0'N@%#4)TVS3O>D/TND2JG*=L4`[GFE'#^2Z +M^388'PE%:R1PY]G;POYU$F?<:-<-\(M0R;O#)-DRM0TV^9V`L_@M:.)0FLP8 +M-?*Y9=0)%N4F0JZ(HF5]S,TQ"MZI_YCW0HF-95Z1)`BR>8%0M-L<+U1ZE-L^ +M2M;?#&_%@CTY(F=K>?!NJ`$C^,T8H30]4[I"[DR46L:(N!6ZW,9[KC769"'RA3,SOF2+- +M+4$=#8X^O"?<9BO'J.["]&:!\9YB=M`> +MJ;X0KN*AF#)6T\6HQ8SJB>'<_UQ:[81SC%#[4PRELN2"WEGH&N.H`[==0F&D +M"F'-6%Z9?V5]J]SC'&K8JTH;^`=HES2,S"J2I$\D. +MFN.))]5U!.-MPN\,H7#WY[2&;GMJ7;,ZI99!\?W!0\9_MI'W5D7;7UR*>V>YX!U?J?'TMM>S2Y,$LB9:M +MT[2E68NR-,/<,X3"*TT#YBPW;:>8)&(]Q[O.'>SK[K@>\0@\;1/)&%H)8$M3 +M)2HP:GT@1O;''.NMG8* +MON42*KQ'Y8)Q_NI#OA>H-J4S>)_38QKZB2K1&@+G9,FI+>'ZL;0O31)JW!UA +MWRN"G0V+48O'NO4H/:[[*VD6&4)]VJ[GW.>J1P4]1[1C75@\6Q(N2H,%0LG+ +MMCI8QX>RIA?C*$?UO@?O;X'WJ4>X)/#F.#T^UMIWI%>P74*]X^>'>G +MDQNG=;Y)?R>[?;M:D\9G!4*MP\ALW;Q>CW?Q=[P[L'Y_2+`]5ONPPH&`;"H) +M1>UE^5^=>M)97G*`?*`Z*KW"(;JE-87=%ODPEXW6?(&F=;H6C:=:^,6MM,;URBNXRBG< +M`NJ0H)^^@F?D%Z%>V<9/=ZBG;ZJGK^S@^RZABG!7PJ^=>!X0[FZ->IU1'J%( +M2T6?0,T-K>B)$Y].6AJSPETG2-'[+5<2JA#JL'`,&O59*,C"1XA&Y*@+Z>!\ +M=(90XBM;'5POL4#"&JYL`>7$AQWMSRTWOEH:FEBC)A;&ZUIXU9_#XA5=DP]4 +M7TK'WVY'U`V!,2@3N+Z9KKOM6+L>8:X*/$T'KM?`M=NN1ABZ2R=[*U"1&^E1\)JF2N.Y?L6I?GU4<+0MKHT>8M13N8OOQPC53=(V +M:*Q0)\@OTZ)K/?1PM&]XBCT2YR<(]9GP%**^-3+%1LEQO^@4>Q0<^\-Q(!P> +MH0Z`J]%PM,`1Q;*21,OI"6NL*PE5NMRUZY>Y]O!EN&-YK"M6\8[EGCUL.9,A +M%);IK,NGVG,OG^KS[5'EG1#GY7*$.F?)5/O$RWEO(JVH0)HG7;[,;H1[6`L+ +M\>I:6&V;@#*Y.'203`YTX,[!-N#;#,6W&*'D4\`].1EDK]C<,0.YY=3#-0IQ +M?/!D?3M4#?\J@U%9_^<*?C=D?MB7#/.U3+$[/Q:Q\D[$G7 +MLA?A4;@3[B`>#26A:$)?$,WVNY-FIGF'JX:H5CC%JO7T.^ +M9"2A2W4@61`JK.Y\X7/PL+-$AP;9T:@: +MB7N<8X3:#!SOEW:I&PB!`_LU6C_?!X +MA_G2$$@MZ.\(HQOQ7$RYEDM"S8:GX_33FPN^)3#7\H4) +M3?[L192R8`S('9!CE(HC2FEM>=&WB;Y3[?`N,*J&'4X%SPX?>GR\OW/-?3!: +M`F%\JR$T6/"_/W]0CUB'ZZI-)6 +M2-,G"=4:B)3HOZ'2QWA]&L)ZCHV0:24!,#M,P.7.<4,N/GN#GP +M[E.!ZWO@.C?!Y^JBLH]:TF<#UP5"K0GE\6@;^I^7K?M6JO>):J9'*)KM4?42;0C]ZV_PM>2T\,[ZP-,?@%RG +MKL6*DI-A5%OA;+'JX0,X7N1D#SUHB-4N[]J7KITCU)'P1<,P`B3@;AWSCG%4:D>H-6\8Y@"=FU1X'>5Y]Q[0FXVJ.B'?T!>#@, +M\HD12O[X+V5/%&I^P<-6,IK1+J'(XT.,[Z0"R&N>XVOO"/V%LL^5GU+?KZ[G +MPK4\(CB+<6[@J1UX*T.H!8&GBUY08T:@C><(]6F6*`5"^?I*ZX`UY8AQ+/`>\@WJ6\S18T>PUM&>[6?*$HWKZ'Z">"/+6L5L+??@ +M>IJCYR?PB5V%S*K?TD?5U+Y435_RE66RCF'-=8; +M.R)[MDT?WL]>RE[Z,5#S#H^33\-U@7-\K^3L;<>Y2/CZ(TK%+^1)ACX=6MP& +MK0'L>M&))72=.!;*+%_B7$["ZU?A>MG3&`\Q[B8^59O#&LFH.9#?&P.4SNLC +M(9UG2A6K<#)1K<-4^W`5(/-DF"[0CA:`=D0C\"LO4KTX'>ZM5-I4CE!RZXM^ +M3=%C2+_VA0$]3<$OX[\#(]4K@>NW\/K(8%_X:N"I]6+Y.D8H.W!GWQ?+(UZ+ +MNG:/U#F^'4CGG<#U;KCV*G)\,_!TLZ8>9XN/#$I#00E2Q[%'&]T,IR4\JVF9 +ML"TX6BFZO?"]4^",;(Y0&(.LI>HI>JZ6^V+,1F$55%JN%0:)F#S$+>4S>N/` +ME=X(OGT4H]BKQ0AXVHA/AXM8C-)VK0F],#X2*@Y71U?EB/$?T'XO`??=HS3U +MHH%S&J[6>\?IM[JW3O<(A3DU#03BKM'\8_DLCQJJ/>*JB_S%)SR?W +M'5^>X+36YOR]R[1C;76.?%CCRO7GT%?-4;HW08OW9+=KGZCVP\#9]V,A_B<, +MQ?![I`6*>WO]BQFA7".49X221JB,$2IGA"H8H<2E1OPR0KE&*,\()8U0&2-4 +MS@A5,$*)A4;\,D*Y1BC/""6-4!DC5,X(53!"B9\:\$ +M*ABA1(\1OXQ0KA'*,T))(U3&")4S0A6,4&*)$;^,4*X1RC-"22-4Q@B5,T(5 +MC%"BUXA?1BC7".49H:01*F.$RAFA"D8HL=2(7T8HUPCE&:&D$2ICA,H9H0I& +M*+',B%]&*-<(Y1FAI!$J8X3*&:$*1BB,(/#IJ)@1RC5">48H:83*&*%R1JB" +M$4KT&?'+".4:H3PCE#1"98Q0.2-4P0B%L2P^'14S0KE&*,\()8U0&2-4S@A5 +M,$*)*XSX981RC5">$4H:H3)&J)P1JF"$$BN,^&6$48H:83*&*%R1JB"$4K\UHA?1BC7".49H:01*F.$RAFA +M"D8HL<:(7T8HUPCE&:&D$2ICA,H9H0I&*/$[(WX9H5PCE&>$DD:HC!$J9X0J +M&*'$6B-^&:%<(Y1GA))&J(P1*F>$*ABAQ+5&_#)"N48HSP@EC5`9(U3."%4P +M0HF,$;^,4*X1RC-"22-4Q@B5,T(5C%#B.B-^&:%<(Y1GA))&J(P1*F>$*ABA +MQ/5&_#)"N48HSP@EC5`9(U3."%4P0HG?&_'+".4:H3PCE#1"98Q0.2-4P0@E +M;C#BEQ'*-4)Y1BAIA,H8H7)&J((12OS!B%]&*-<(Y1FAI!$J8X3*&:$*1BAQ +MHQ&_C%"N$W15E[^HSAU>P2E>S0^NP51K7@5$7P;_NSV,@KC0L3**/AS11DE +MBWO"4;B>!,_<6ZK+6((_2NOR7]9%-;\&H?3?^A5A\320FU$ZXBMX>% +M!4<3'#8<+7"TPO$F/,L0"J_P:(.[,3C&P1&'8P(<"3AR%2@\CH:[$^&8!(<+ +MQ_%P%`@U#:Y.A",)QVEPG`['##@\.&9C]+E;$347KLZ]O3;O4T@%H>;#U0(X +M%L$AX>B%H^_V,A7NK9JNE>IN.O"T'X[=Z/W11UVEGF(4O#5P9."X`8Z;,7U" +MW097V4`:>-P-O^^#8QV^0:@<7*V'8T,5_,X0:C93*796TQ0BU +M`9YL@N-H2"=Q1R4W\LBOVW3-V0R_GH5C"](!1U&5^14X>X1J@O=M..;#G1WX +M9>X'!)S[X=B)_")4"R!VP:_=<.S!4@!W!=QKA2,"1X90%EQ-A`,]E:+_TBUP +M%#`W;*-P/T>H@^!J#!PQ.-!+8OR.RC(6;@O6G%#-MB;HBV.T^+W_Q6XWZN^- +M4)X12AJA,D:HG!&J8(3"]OGIJ)@1RC5">48H:83*&*%R1JC"(%3-.G:'22V, +M^:AO["5'EU`81?CB?!N<1"E6X +MHQ97OW#D44J[<^9]_?P?72`P.!S&S]'WA:>[L`XB'<:M<>]HN;-.7/. +MV1?/F>D2:G[G13^>>=R4B^:<5QOM5:15HK_!*&E$5Z8F:OZ"B\Z<.V?VS#GJ +M=\Y'Z2=!&O6]`J%.G3-_^IS4-^=<>ESGN>?.ZCSSQZ=6E>,N(WX9H=R[:K5M +M/*.4?.JE%YW\D\YS3_4(->>\3G'1I1?-O!!NU>*N_-0<,=V,$5TY(U3!""7^ +M9,0O(Y1KA/(J4!>=V7G^O`4SY\\[2X@+YLV>,P]JQ247S/NQ)-3,\^8O0%1R +MVADS3YW[D_G'7W#)^?A[UIDS\<69&4)A/9HWY]P?73#OS#FIBU)4K^BQJD8Y +M0@U9X=5?P8AZ<;<1OWS4K#//GWG>!>?[5:+SS/EG7WSV_$NQQ*Y16IX12AJA +M,D:HG!&J8(02]QCQRPCEUD3)JM\>H:!USI]S7NRTL\^;,R]VVMQY]GC.C*#8G"OE/W&X6]IM4_\HV1SXS<-E+".3$$.G_P;]__!CX1:@IP,`P +ML/NF'_,9#WRJ[^<(=7?@:?#0?X6]TN7__=FH?AFAW)JH>7,N2EUP_D5SN(\" +M?A&J<_[9Y^D[M?[DD#E";Z<'/I$QHBMGA"H0*G7!)7/F_20U\Z*SSZ)LZ/?, +M\\XZ;[[*];Y/2PNG>6*$0F?_PP*'.(`/-ZH.0L7JN);(0^``<1-_XZ'_O+WF +MF)IWP?PY9\Z?*0F5NF3>S-FJCZ?NO(K%F4^E'O]R1J@"H<9`*<>(TLC@D_,N +MZ3Q;LPM]`GYZ6C$CE+M7U)GGS9Z)&7N$F@G%GZFK'CSM/!_X<>G/FH"$N\RETL3:0(Q3.W4T2%*T!@S:(D6(?L1]H(J/A&>(*A$+) +MITYDQ09Q^H'XD?&8#<];`#]RG\_L)_Z"*+C:?T3SR'U&[K/OJ)'[M(P:,6*D +MC5[4\>FQGP=^$6HE7$4<(2Z$\VM',$6?/46(QTX68C,<+J%&P)V7X-<3!J.M7#4P?'^3X!?A)H!5^?`\0\X +M5L`Q%XZ7X?CA3Q2_"/7J]X"NQ?#S^T*<]#T^\/<^H +MH7+2;TA"#963?B-#*/T>GB?#TUXXKE=OK$!^$>I0^/5N("<+C@\49X]#?A'J +MU_#TUPIQJ'H:?$.LTSGN[8B54?I;UFJ/Z_;6.GS]D5#S?W+^4(V,_N1>T])_ +MF9HHS"FFYL[Q+_?_C)T+=!15FH!O57OV;1I0E;Z^X]:U%02 +M.9K^*E1`ZWH(NJ5]/6$0,XN*0NJ-5*X&\1$([Z;>XQ"K%C4(J3.I7/[+E`?Y +M7U0AD6$(>YTD0#2+NG+E7L+?7/QON/@YX;!^!^[@:9X^.JRG^GAT;YI,4^.U +M5)&8%G7P9[SD"VCAB[UV+^Y-]1'ZPVO]U);EL'[IY.#/^7\:.;:7D&.6[#3E +MGZ!2=>NVILSIM,<3SI]^:E&+8ZV;_?7P)0*Y=9LG*'[>O*]CY7IF46O\-2MC +MT?8U'9#;\L0$E<-MT^A?JEH4_Q#^.QLBA_YQ@LJ#B'^,:A8%GQ?I!LFCCTU0 +M65PO^"[2+6H<@2NV:H+B_K]JS;]$9\[T%T962Z +MR6N!84P\A7\'%7_VOH?PCBF(H2D51&HK2492)HHB..D^@ +M*(JB&(I2492&HG049:(H,H2R%XJB*(JA*!5%:2A*1U$FBB*OH^R%HBB*8BA* +M15$:BM)1E(FBR&F4O5`415$,1:DH2D-1.HHR411Y`V4O%$51%$-1*HK24)2. +MHDP417Z&LA>*HBB*H2@516DH2D=1)HHB;Z+LA:(HBF(H2D51&HK2492)HLC/ +M4?9"411%,12EHB@-1>DHRD11Q$#9"T51%,50E(JB-!2EHR@319$DREXHBJ(H +MAJ)4%*6A*!U%F2B*O(6R%XJB*(JA*!5%:2A*1U$FBB*_0-D+15$4Q5"4BJ(T +M%*6C*!-%D6&4O5`415$,1:DH2D-1.HHR411Y&V4O%$51%$-1*HK24)2.HDP4 +M1490]D)1%$4Q%*6B*`U%Z2C*1%'D'92]4!1%40Q%J2A*0U$ZBC)1%'D792\4 +M15$40U$JBM)0E(ZB3!1%WD/9"T51%,50E(JB-!2EHR@319%?HNR%HBB*8BA* +M15$:BM)1E(FBR'^@[(6B*(IB*$I%41J*TE&4B:+(&92]4!1%40Q%J2A*0U$Z +MBC)1%'D?92\415$40U$JBM)0E(ZB3!1%_A-E+Q1%411#42J*TE"4CJ),%$7. +MHNR%HBB*8BA*15$:BM)1E(FBR`Z$HBJ(8BE)1E(:B=!1EHBCR7RA[H2B* +MHAB*4E&4AJ)T%&6B*/+?*'NA*(JB&(I2492&HG049:(H\BN4O5`415$,1:DH +M2D-1.HHR41091=D+15$4Q5"4BJ(T%*6C*!-%D3&4O5`415$,1:DH2D-1.HHR +M413Y$&4O%$51%$-1*HK24)2.HDP417Z-LA>*HBB*H2@516DH2D=1)HHB)LI> +M*(JB*(:B5!2EH2@=19DHBGR$LA>*HBB*H2@516DH2D=1)HHBYU#V0E$413$4 +MI:(H#47I*,I$4>1CE+U0%$51#$6I*$I#43J*,L>IYC^]&A94!+U>7G@^17F] +MP8J*ANN@_/);U`T*QR^*HAB*4E&4AJ)TBVJH2'?9[NR":SIK_AE9$^8BGZ2M +M>CT9Z*(JA*!5%:1BJ0;>HB2Y?O[/F#60U+(":$U4OC,]5;_"&!O-? +M0-D+13$4I:(H#4$U+-`MBG=ZTO+S6MV=U%_S!K(:*NQZ4&%!B54Z>&QRY>25^:15WYD^OBV/"I4Z\.TU!FJ]3E\/35!@-^H-S6.#Y^Y?$["9D==Q$?<1*9E)'?GOC?$UM/ +MWB'=+C4IM+B)DK;6VJTG^^3L.&&$7#E;&IK6TR>+C)Q];U]NO"B>"W<>2!O[ +MRH^VDS27:XT3]HH +M;Y7\,F%*2&"EXT%L*ZTCI#0$H5J*4:$T]$`/%4+"$5H:.EI56NV*D39Q`["> +MQI[?[.,U*G>72ZS]:SCS]_L*UU8N?LEZ*#O:P?Y\]\&1@ZNU,W?TT_[/5W"J/ZJ,34AQC'@/IZ5TI22] +M/$G*R]:=CFU)_O<)"U->6QR9?_B%^-7U7T[5MWM]=7U;PLS.Q9U9HWEC'?&= +ME+!%-(-1VA'GJR[B2FCJG(%YD)'O"CL\%T>.;F3OU\R(I$W +M]_/.X]T1]XLIHG4Q(0;AP*8G.(,YDIQ(H&.L,=H:?D5Q.N]P-AXA.-8+@CO@AJB,;, +MSD6*4+R(!N9[D_)9$5(YC,\ZF'',6@6AG0K,.)CE'7%QM"->GUB6F-G)K0OU +MRW.3V6>=4*=,SK-JI4G7:)GT(JQ1;INI9VU+\3IE)AMPO%"^C;IAI,LRMQL@,XGC[62)X`W< +MXP"&K@*JRC6T`MH7BCD;5H@O)[E$6;KDX?I''IQ!7"-<^VEL_DD^TX/A[7%K +M385;0R6L+30]9;$KL=GP]@NA-5P:6G.@-6SW,L4VV>P/!5Z+A-1+D>,#WB'" +MA&BHF1-#\'R[?Z.T=M':A6NKUX;>$C;*`A&C_QHG;3-C[W>TAMJJ!<\[![[F +MNX$[EBM[`EY'4+S5>5O.[?X[V)TS[Q+N)O<4W1NFGE!6U9QJSX+2A;D/1.IS +M'^ING+\L$)G3=$:8;/U+!A]S)_3X`NBDL<.@4V![#JSXZ9/>YTY*[QI/!^4, +MX%Z<5!:4CO2?$39*_K:U=6\)A'']UX8WRE\5$M_O#(%DC+-^*>4!I#D2]P`= +M\KU@+=Z[U'X-6KE`J_S8L7:PN%#[=#!<18FO,NGR?66"^5)/:Z3H +M0.!6EU&OB,7U-#I@S_!@>`&$G8*G<"'=7A"I?7/_7&F.7`)M=DB-LCT7F^AR +MNH(V4@=;1LUV?PQ\FO#$TU-948BOE@QH/0/LSM<#U]26RZV5:2\_K%6#$":F1[P==A*\6RU=S +MO%X6Q-D0V&H5LZ']SIY2FJ=%L#Z+(3@6>^V//P]O1GP +ME@G!/;YFIZ98L]UG,4HO%>RR]*A%>OG*7@(COI3:8RO`'K$]SOWN36`M<3@V +MF-XG0K2G/<,:G\V]SU/N%T!/[X[0IO7VJ#W1VP?E>P8E>-O5:Y-[>I^/7)F5 +ME0R&GX$V5.C)-@B=(;W=8Y4?ZCT0<10?Y8!Y!FN@F.^B,SL[ +MXJH2^,Z=22+MKN]Z\/;NWDB@),_0HQ`'IR19=$>$S)(-W1YBW]F\K,1AV&]NLB/"?5RF\?H3_.VGUO-5>.ZCW56V)JL3W'O.,NHCU?YB +M8ULD,->5#,R;GISV=>EQ[]=\3KK#[7C +MG2[P@&L2O*YLI%GBRS(XF69V`Q--0`_+@DGPSF7%Q@&Y1R9RH!+FJ/P\M)Z3 +ME$AAZBXKS"94V!':VGVU1U7!=XJ@[UHN";SAY-4B&ZKBA++FQ-4^7%7^4,AS +M5^E05S^&U@DF@*L7DNL03AG-1_^YWAZW"=&_-7QL?Z0_KIJM-T96RC0NC\\\T9[KI4B?3KC$AQ)46=, +MD'=$/M[MM.9C)YPA+N_E6G%]>*L'%*X1Y-QZ6Y*PU^GI*AC!\A+CH')HB1/: +MA/GB=QCN*&^1:^C6)VMWQXGK:2=;Z:4G0&IEGL%S>+D>=>IDE@B]\Q#>C@[G +M?!I*AZ-R7HS'R_LRVW2$/BY9=D+I77RR4E5HT#4,,9 +MVP[D\\!S_HJH5HX$'GE,0^A<&*CU1FQ8R=@9<#WE$@6"B2?UAWKL_7C +M[1[OXQ+=T]):_,32PCZ;@J;SIH)-!?D`V/_:DZ#`[!W0/M==/5Z<=Z7&BX^& +M:+P"9U0!O,U]M)7VTIW"E[MWP)J;R`F%>-X>R+O%.I4Z8$\43OK#TWSSAH/A +M7-]L@^^;$[[A(*0/0?@!A.%`K)3$&,;I8>W\%.0X*EYEI^$^-EB +M%=NVBN<1]NVJB1,2OXH%4I,IN&LJ(;X%8C@>&A[!;91"?!O$4R'.A?@NB(,0 +M9T,\'<*0P'V^4^)?;6<$TM((ST9HRXXO[[V\SRF1EGER1_P'RG-+"J)ZQ#W+ +M;0S!GN8R9D6W1<2B;;7Y9`_]?A4OY[,>>CTWRX`1G).1=%NK0`!F-^VJ$@@_ +M3\"91RZ1-TH!."?M@O`B!&*=F3;*0?AB%76AJ+7.#=X[++$%R%X +MF&WO(;`+M]D\F5M&(/>]-M@BGW]\+-GMF_7[I'AN[H_$][[Y^(+R*>Q3%^BG +M5?M?,Y6/(&W2CZJ6I,[E%VDXE?J2\AF?U5[>XI1KPE%:WE+3M*:VO"4\1J+9 +M/F]2B$[U24DQ6@E^P!&-^9Q)$<[8).J0`O-$PR&W+*@)E[R?N_^ENT?(\'8**U@^N.&[6K+^F#UV^=USRL?`G:,?5VT] +MZ7ACZ\EEB2MCM@_I!._32=^0;I>SV&KKWPA"R@J(6Y2'K3>F-%HQ5>JM>#J, +M)N][IU"C.`NGD=6TAN?+\!T(7EZ01,DA9;=O@IVBIFE38ULM]3O`#F^>^F/! +MYMJ:\*;&=73^V`9E(\RV?+*.^V2C&ORZF,PGLRWY_/\S+*UN4]8M"=R3;525 +MNY.TW&$\>:LS";)!CM>B)&"XM&QX:Z<\Y8+4>NH8R_KQ^5-\/2Q+B#+/OP3Y +M@;**).@E'ZOG7LPA\?S?0OX/4^^?C?&<\Y`3GT3\/WM_`M]4E3>,X^?^LN25W:\<>^5M^%>MQ_ +MO/U%$O90+.SK4U^?^N[4EK)KM>\[,?GEHZ>BYKA8\W/@NG#JZ"DAUA+JCY-? +M3MPMWW1H-_VR"SB]RWSTE"2)K#[`&!**"[*(RVP%GBGM3!!3)>ZVE%&3))VY +MNT^?*M@]YHUH6D*=B>PE[W"!9#"8[C*_?\I51NQEI]\_M4AWBBV- +MC*8WCN^$WQQIQ_HR[5P=^35.ZB1II>]J31F=8U[6FL9U5#%49]II^1]3WX2T +M)JK3\#(%91!:4)BLV42PU_*R:NV'K]P"1@/F>OCE/#/YY>C_Y5-?QN#WY>\) +M/(_&X$?RUZY`U5MM+FC)K`ZIB(%9*?H"KXBC:(R^P'?557?557_5M>VJ:_M5 +MU_U770^8I4F)2)F2@-YXFV][2]2R7:H7YQ_D*NY@/P> +M$7^/%B0B*>0E[J@\^C`&86U29N=C!14_>0ND@(-+#BT]7/"X]2V8P225ON!G +MR?M!/AT!.I$:"SF0'+6COZ0]4K$]4M"=M]JHP3^^_+-D;0N!:"(PQM.[9:?) +MVNO/DJ%E'_6\'"=2A@3T,[&4^>T3ZR8HDR>ZZ%[>_F)_T5'):+!Y-DG;L +MQD1J.K8[5/85T*Z0^2L+]>9/DXO?F+CANT<6B;D(E-E.[>Q%G=K6IJ,M\QD)6T8;*AJ'F(?.P);A!)4J8IL-$KOD5R"DH"6J?G=2Y +M_<6MH+_SNX=>07;R2UJA+WC]CRA9O5$A:GV%A\WX'&GK[!IHI[2#S(,W?@_X +M-\?5HHE*4N#RWB0]X-FWD)R="T[\X,Q:#3/67QV63?X +M2;Y;EHQ;^I=E?P7?7\Q_M41+X))(;F^9KQQDUX(4*\E=5U9?GH)2"\98H[FW +ME6T'?UK!6"O)?7_9`^"[I6"<-59"LL0N`:E&6B`KH-JWOUAWW;K[Z=WCWIBT +M810;@X>38=P4;UPI^Q3@>L7\J>72[S\K^SNX/S/_'=Q#KT37[`E7'2F+0/B( +M.0(<2Z0&G80VY>ZFWI@JSMGH;(WB&/7&AZ]<&V/2NR;Z"77YN_L8SF +M?>TF7*3>[A!KE3H'R@8A[8!YT/*?6_AFK(6C>/K0XS@IVK*A5T9K3;E:Z[=E +MWT%)WYJ_LYB!2DL[2)]3?K?]Q6MI=5?3?E\6AK3?F\.05@:S9?N+-TOT"(W* +M]$1F!QD')/BZ%Q&4EBM"FHQYXFD)<`H)Z,]D+.57H4WF/:GS\[(OH);/S5]8 +M"+5@1(PYO3ON#8(UB@___OAWCR3$Z,3=STM%+OO]X](D)4AP*Y*VOS@J=V`1 +M9MH[99VVI"CL%9"B=@5)?]:L^VN4:G6;,SZD8^Z_F,?%7'\U)W^8$G.?,R?$ +M7.?-"G!1'V(4E2D^_OW)LN/FUK(3YM^5/6-^L>Q9\TMESYE/E?W:7/SJRQ#S +M>XAY!6)>A9C7(.9UB$'56,3^BU#2\65$S\9)$1@YT`U(O1`J.WWBAO"W16GC +M;3'FF?^4XS4Q_-D;PI\72@E^(C3L2$'4:;\+(16AOIS8SN5.;E=B)!M](I@;/OQK%H*@V]=&K +M&)$5M2C=['T"Z.:K:.!T,C7P!<1P9?))TC\3#63!ZUS9?.!WDG>)K(]1]'?! +M2DFZ]#6W":]K7IK\6%^/K +M&,5=M)=N5UXSY*]2_>M(GP.IV!DQL<*S/@I,$^#^2687X$Y +M#N8$F&?`/`OF.3"_!O,;,/]10'+5@FL+F*U@[@5S'Q@O&!^8.C#U8+:!V0[F +M?C`/0"YDO]M,UO'(EXJ:)&/UNL+HUPTE:-'R#L62.R=)_DSDN+=!_UJ^<%OR +MMB14K=JT+9GZ]M1KK]]/5CRV)6'U;W_!+2!:+.`*:&)*LB*"Y*)10ZG-HM9% +M:IF$)B(:30"XIJ/Q*`/J3$%C4"H:AVY!:6@LBNJ`\AMTP#;\ +M7^F%#/2!<%+O,M]UG+1N6;W(20D?W;9L.[@)![U_V0/@HDZKWB;\+U@F*>#+ +MI`5=9;("G$16`YY[%-EM9I6SXL-C97CL,?.4SJG);?@L+ENEU8[O)+\C'5.3 +MI.U$5_MJM])9\J'\XAB>:*`?=ZYY/=VY2-1&/P)MU/.ZZI*' +M@D^+K5FY4LLD=1*=39LC[]`F9<&<9LW-KVN3LY*DX+K61JK3VS(U*8$_B_>\ +M?O?S*Y+:KEM3P(BT@"O+F?3(NXM>=Z,\@'(\&K6;41F,2#+23E5UD-*AQ@ZM +M-J&#E/_!Z]$0)83(Q9"L9"W`B]2/_^5.A?^;_]:Y/!OON:6YN[AP8_[DYM\+X_Q\!XO^?C_\R9Q53X=K$K'-M +MJ*IEP+$%`EP;'?>`[[XJ3Q5S3]6F*H]C2]5:9IUG\T;&6>586^6))E>Y-E5N +MV+H6HNYS;7&*.7-FFF::&$_5ABI';16S>9T8J"L@N,6L];CNK?+4ZJ:/QJ]5 +M5?B8:%SE9H^;U+Z@JK)J(XP#>3@JAW%L6LO4;JVHK:K96K5I"[-Q\UK7.E>E +M8XMK\Z;:Z2KRC,"&S8ZUHTT3,?B^#9!)K&AF[>:MGLJJ=9L]]U3-W%2UA5&I +M2&):IASZYKFW:NW,.$;\$\N+&_V[+@Q2KG75;O&X*K:2 +M4D2P;[TV?!M=E9[-E9O75C&UF]=M(<2"T>L6Q>B&SL"X:IEK?]$"W56>C:XM +M!&GM,$WG:EU5U6*"+*!^$@8Q=5KRPB"DK+_T!MV#A4F89RRUE%G'E +MQ7<5E"\$,KJ4X9;JF+NX92Q34LI`8'E!R3(.$EX'1*:TG.%*%BPL+N'$J+O8 +M@F5+2Q?^8&'YS-'R%ZXH*U^X=&G1W54_X*P+E][&%)4N%:&W?.G"Z5#5L@*Q*5`60`^BP6U9OI03 +MXP7B<"*C>LRZ[/`^T`+%IV'1"8DH6+B[C%"TNL"TEL*2GR +M+F[I0@-34,XM)0FN*Y"+-N>N`FC+(*5CP`XYT +M)Y;X)JP!L''1QD6!;65C`S7S&E6_@4"!]P:*?U.!T!;`4FMA2>E=10L7D/$F +M8"Q87+Y0G,L%R\1&`+("CB\5>WRU]0NO3?/K"KR+`UPE.&(M7UBP3,RQF/L! +M($-YZ?*2!:.SH@BP`+".L=P=G576`C*Z`(2ERTK+RA863;\!;:X">12@!"6* +MB@#!EQ>(I*=L83D`I)Q;S"Y;ROR3GNK+H#DE,.1$7Q"33F<`"18L!*R$MH*O +MN&!I(7-7:7GA]*N5BH67>1/7_A^FZZI_+7?_ +M_\K?3?J?^/LCQY9;YU;.,>;,N,_MF`D"T/^7=?RW^I_)F'NK*?=&_2_'9)SS +M;_WO_\C?(U\]>?F_,V=0\R44TO8(;)RWRL'92Z09!`G5)UP44UF*_!?]X";A;H:$-5Q&S([+%/(+;I*&@7Q,P^458ESCY8F163T4 +MM`N3MH&)1"*?;4!/7EXN]K<-8-!VF0(C`3,"<>=3T6=4:$Y_&OOC15^+[K>' +M4L'MG((H1!XI(@8*>W<"HCX'$P+S+1@&@HT0G@N&/,,X'PS9N+@:C),L1YHQ +M=:H8H1,E".WQ/WHQ&1VXHH0V*Z'?2J914!IW"+C%?!&W62YB5-:3A)#*C5JN +MR-"RGH%(1(51VJ5X\X-JC,9>BB][2$V!'0>VI.RM2U+[#RY*W8]E2=T/90U& +M(CN_A'Y(4'E/6AI92FV^9$0O7"'Y$R`_!78D9[%%$U[%&-QFB;X)BM+=LQISKQDSW0=5@QU9[HNP.\QIV!G7'YP +M,:XV^&UV]MSD5V@Y><"EM@8\UG +MW%IWG<^]U;0]C8F$FR,UV\>"_7BDEGVS@:&EH=T1:6A_I,_EYI3F/D=$.\.D +M8'#H#(3NB>@A_KV1OE>4KV@6JUM=A1JO65'!44GW%-G<]CK&@_2RH,:+]%10 +MS:BMK)OS8BA[4T0MYJ#HNUAIL&`;UJ58"[80R)JWC>C49A;<;A&*1UW^S$/6 +MHR(4CSK-NHMVG6L?P$='CW5]#O9C3BE-6\_:TUQ/@2\:ED;O-Q<_ +MK/G-FD_L4UR_@_`IKN_A]Y=.G+/3\O69*'PU`%\WP%>1N4JN/GG(Y=?NM!YR +M?),Y7G8(:GO?GB'6EN'J@M]#SG-V#4V)(908T@BU*W3E\OVN>.M^QW[7+O@M +M@)&6B",M=5V"7PGM=T88R"F.ZP'G?E>Z=:\XINJ38VUG7?L3'K>>=4AE34AK +M]2N55G6%NMI,#74'H6U!,=T;2*/Q([\2!W'>,.]>G,(I;$JW68OU01?%*R&5 +M>W%`_$5H@PQ1!`?]8";H$#4`LW4:V/E@C#![(_]`*"L345D845]D("J.4WDI +MJ\IM\U)F91!G7I`?V.572+HU`:E.;85JF8";E*N$Q>,U',>@O:T=^; +MY\2Y2F.>/9'U.YLME\_%LPU.;&JP-S@5!LEY.9=O5VH;[-&2(N'3D3PGR?=A +MKY"%J`U`NZ9#'_I:;RV]M3@_@)A=Z&Y-$W*6S2G!3*ZS3<'8_0SC<8Q/@_;G +MCN3Y]73$F)9;8'S0DFM'9^;8HRT)M687IC-^3$LG:F9+QRHEI#8 +M@F1.Z:2<*%MY(=&69AQ#1V87S#Y@44(;54"!TA2(RH7Q[8.QUB@1M1S^MD#_ +MR2>_[R%."C8S&5%YK9\6ZWU(/SYXA<5:Y.3D_L`"3<7]*%L5_)@U^_98DGB& +MSC!>Y*2A<3`F"EZN8VB5\6]<)#PV@AEG39[8&O?)#XJ?%$JS=B?:E +MGZD>KSE3@4U*0_A\D"O+W^E*U>QT['25HW+E3H?-I=:P#M9E1F8EZWA.G'M? +MM?ZQ$$U.=S:V!.HD>NEYQ$AB?=T9^$/AZR5=FF7>,=[.0!:5:7W,FR7-M)[U +M9LDSK9/H9;XQ/C'4U^4CX:GR,=:OZVA:DX_WX9"S'Q_ZVH.U3?*=U5SU;PKS +M-..=XUWO9+1I7K*@+IRKH)]E:2/R47K,X\D)`@;,`^FMYC$+/H\G2X7'+!3_ +MJ`6!FSJ`])(@FB&!^)9>-$,5]&9$P@V1>AKS:"K.)74\4E%:@9DCO8^Q>:W` +M[K3^`"=?H/DYZPG*!1$)))(E?]B[5K/+> +MK:%,EP)QTKB$79:_G_NX=XDFP9=$[_2^XY69'EDTHIU,)YJ7F_X]TMSQ$PO^``&\OT#%X[\<=V_RUO0OU#/D,Y+6 +M+=JZAE-PR7\R+^1H4XFO1LXE8<,+Y^_@T%2UZ5'WQPI9-\J6\(]XJ:GSK8^X +M/P3E(%>9L:`.&6"4 +MM=A#*%+/3]3T7LM#YY3TCMZ>GVCH@Y9'P;V]=Z>W7(&[L4Y50US[DA5\EFV? +MJUPA.;O3J\S,L.YT[_1*@1_M=-_3&P(ZAKP[6OQZBEI?GTN?\4GT4_F27ZD +MU_)22+/8,XK_"&V31>`WXAR!\)8K2]G\`/0?YB[KB +MD^J50#NEH7.#@+=\6"SS;.\5GTS/PSS^EC/2:B/>0^V5A`R`+7/X4`GC2[H# +MYD$0ZV>+V'1Y`.U!@$VF$1SZCT%3H(F*RV!@IMP",\!9&PE_,"*C@5^$CD"< +MR]I$*3,$KD"C$.P^I#7+S4E8C\\9`UB"#%10#M+"*X/H@#3T\H!48'P0QT?" +MZT?P"4FG7"<)]8X@_4/!/XNM;.C%-&+4K6\7(4,\S\3FD5G3L/WT]E0JQ:HR +M1L(?#6&`HM;Y!X;U1.4(=^MK19C6`5;O`:S^P^0VC<0[43$W&N/V#J0 +M7^,WFM=CHS0T>]#H;*CO5'0F-]3FR5&24J_C?\;J1&HSCF>\2A@ANU>JI6B5 +MF=$JS0;`">T@H;%JXZ.<)+1FA(S<'V+\#WA1N#9B=)KKON\ELYOX'Q+]7_;^ +M`;@LSCP,T@L-,A#5#="#F:RQWVW/<`#_A/9OXQ+ILCG'O91^'8^S?-QS[G>K +M[5ZE]KZ2@-7N-CH+ZBD#Q:-Z*O1TI-:F]F)(YV$U6H*UB)^H=9?."RS)<-OB +MI&.<<0F=FA1[I7>57-(]VWFXOC,CQ8Z-"'JXKA`K-.ZCVT.9<W( +MUA1GP)(B]G.-C=3E@#'&0#OR_12CAIK;ZE#HIR/+.+8R+["T4%,9#7E_B-@2 +MZ/^5NDCXBP%*()CXZ8#165[:#O-8&LRK(SB$!0_$6%`QNZ"P<>6J]5V:HL(, +M^VMUSP-U3Z(+;*E>*AOZE3E%6""0D9Y7A[,1CP2D*T>-*V^KPPR>AH*(N;.P +M#;5I:E';RCL*+P16@=NOF6/+*4QUCO?B>8=`#LFWI3IW:"@ANW#E^C$:I&N& +MT2H?R*_#60R-#:2,F6(9,PMKD'GE^4!V88:30TV:`@W4$;IC@&;-Q@4U4NT) +M=ZI`:/1'_28G`NS-XN*#(7 +M^_MB6*XJR:7+Y$Z.VF?G=,TMJ>A719>%<+X:YH +M7\`ICQ]BY.:_L6]5HQE4\"/V(4O*>=*>6_O?9]M=C3C%VNYH=YVWI9C;'5C6 +MX8R/4=%NKD6I7$WF322L[2>E=3A#O3SG5JCV!CD5;<^)VZ>BS3EE)L5>I%?N +MJWY?"J5^W_\VIZQ)T[;(T=DD;4PSN)6@EW@E@D2)FT&.D,Q<8?*W%BW +M3QYTHL,:*Q;..#76-^3X+)[?WZ7./&!%TW_Q89>3LJ;1S3#7[,"A&?JGO0JQ +M3+N,[CXY4QY\<^;8X-F96NA7PLA$07F@O<8;.,S)==)\UI\'TIKJ8"1\QT`" +M0/6-OB0A6XB$/QQ1"4_-5`5/SE1";@RY*=X;V%>H\3/TNMX=+-8AF%MDM(*H +MD8L[9-8L\7*HP5:P,A@(%,9ITOTG9W[*[X71,VO2`V903"[V[BC-4YMW'R/0491*X.]*5G'L8R;2>UPFK6R`\:9@3\B5T* +M2'=G_V:NHR9>Z[+^22G14GN1?$8WOGV:0$;"U$_HRSV<2J^L&0.0'@N0'@>0 +M'L^3G+I^^TTYU9`S2?A"B<"G$GZMQ&#+A7C&:97%422%<'>Q'_I>-E/.2Z`$ +MW.^7YSO]21V>Q:R_*6*_#+S +M8R4U!LYJZF3ER5+>'I@!(Y)'/_')+-LX^UM^ZF#<(0ZDH27N!H_B`-(6N+TR +M=;<2\.ITS:1BPC6DMT='>W&_PXL83H&Z[0&G?P++<,CI)^/$;OV6AUNAY>3YYP]:D/:5.>26CY`&Z2\\H!4 +MV^[)H_LN/VG;U[37(C]'YYN=E"X2KAJ*UOSWRTJ8KT&/?V8J+SOP,PZ!?)+( +M*PZT@;04!])2DDE/2T(_'2"2FP(@W@BE\9=WL@N=TMM=7KWWX<(X2FD]X8V3 +M*JT/+KKB_3'W<%P+\J>W(>D>LV:*5K4ZW6FKQ=GXC"P;G\^C?WLYJ19E[JI5 +M9N+]?_=*]A^6R[N?VAZ?F:5`06FF?V]A\^S#/C1-&GR'Z(VYQRSX7![] +M\\M4=A4O.7P`<"B/WG.YFJ5T9J<4\`[%>O+PY>T,U)JED_/.?)&BI%O?(1B7 +M!Q0%()1,0SK`.,]E@_>XE[3Z;N[!14I_M4_O2Z74UF=\J5*U]3-?JEQM#=B7 +MV[Y".S4GM4TK`A;9F8!%P3?GI.ZJ6"@YSQ5BW7CGH5H(/U\$%*-Q>1'K7X.% +M0OBM00ML3>F=*"&G26-&2HUC40Y-A7X[0"!U#4Y4:,;@3"'2.[]0>@AE'5I= +MN4@R.56>8=THS[;O\%J\XZD,ZQO>\=(,J\0W'L*K[5R]S#"6;_05^(@4>!I: +MFF*EZE+E*5:7H[&NH$X,K4/U)!S)E=;C#J:D@3$Y;?6$+V%&,GFC_+B](\#D +MX?'CV20"N;Q(N%*4CU'FL_8\NO=CHU.9VQZ(&]_NCV)$'OWAQ^-LQI-C://L +M#^H3.-GT.*>43W!UN[(TSUGBS\NR/JB-<\5IDMEV>X/+GYEN;7"T.8,.(\A? +M!-_)/""XKU%$YPY9.27\>0C\ZR<@ZIX)T;E#Y/F=H&VT*]0GORI,!!TG/KAD +M8MS9U9JL[6BZ)*@$ZD=D.IS_7;=?H>[^E"NCX[Q-BJ;D!DOWHD(;@R<-BHW'_$B0W]0ZU49 +MOC]/T78W8D@Z'O05O\(/I5-GCKH%]Y7>'B\%>7\->2_VOFM3.\T(&]7V%.?; +M;%M3`VC(:COTN/6/MA1OP"+E_U"87K>J[J"%"JK=(^%OAZ,K15^UOLI*:7-N +MCP\9[N&/P._:8$\]-CCXGCIL^"&/:;O1XCM9@IFRN0`!WE.'LI7\49`K9,$7 +M?`@DN9QZE!T7)+\XB"9CX3E;M\]>4[H^7=#5)=)(B[)/%"8&-`N&8V$L;2VYBG.B9)7RH1L<-MK-,ZWZNY:KP=X1<)/18B.AGD)Z*F(&0G_ +M;I@20G4CX1>&*<;N,TH8.A>@A:4OS3MV+=2A+0__>TMB"SN31<^MP)IYYX$B9M(\HY%(%$2 +M:5,[R\:A)2OKD%HSQ5:^WJ\Q:Z:#_+/`Q/JE)OV$D?#KPWKPZ^D2D\HX$GYI +M&#-&#YJ\M8;T?Q'HOF4\#?B\T$/JF\23>21C)*'I0Q(&34<\:"E%(&^[\VD, +M$%PYU`9Q*P8I;4^M)+3L*E346OSL6(`*'KRFMY/Y+AV/*'UF=(X3>7ITW97( +MY1DXRDL)?R4R>A:D_9@BWU"8Y.9'$#HIC_)<(HM?L4F9%"?K>:_7W2HUO8LN +M@S[ZE0?K-4$*C$2OYK5T/$.%VB.)M".#N%Z)2&DT0QK$N=(9N`LS(0]#1Z7J +MMD_A_2?@;[XK@TS8YUF^8D`FJK48)^4_K.BD_L^.0ZH +M10W?8>/!3@"JH33$\6_9]H)/%ORT[HSWH`6?Y[V?>E[ERO([*M!,)_\Z=R40 +MUR3-#U@J/CQ5BG7SW$CWLEM'3\P9<*BDJ0D-&6IZ7@/:I\F3A.H&L5%C>LF1 +M[]``3T>'<-Y+CGD.N]'\FF_)J_A>+W*Y=LB&23[.5A]DG;,2_MTZ<;319P5,3V9;@#7.0K-FN +M3"7XF$VP\7WTL\(N#<&EG]J0,%OH"I03345SPO6,%^?O!1W0Y5H,&J!<\*U/ +MUA"-5@GZ[#AA!XMTE+O1?27@AUXK*TE[)=W*]<_40RLKZR$L;CW18G41+[C9 +MRJWL;31RYM#M=?>$F2P\40GU_):7R?1 +MZ.MQZ%RD1EQ%&A>L(CIT_4Y4KMG(=:&E&JJ^V=3IVVG!0:PE,X*JUU1CHR2D +M&EPKMLWM(^LQ$I!>,'/%+17LWC8Y[D:ZS]QD%2*97\:V>0G%6,H6>"F#I`M[ +ML0F[L4#R1L(?#'%0G\(3I5%LX2HOFB8/+BI$NI5NI;;`H_!\U2LU3`A&PM\, +MW0$I&^JPJ<%#5A<(?*(UW!:K81['>J-K!:`CZ/%YI%-!#<\.&=DY-I(S==M> +MBZ*KH$X)&C[263R-6NPYW4O:*ST[V@LL]H+,QET#.K%ES_>&6K6VAUJFL>IY +MDGW2/:.SDGIV*J>'63FWGSK0+DGHGE+$.)'7K*\)/@6S>,=`U-?'NX1VG-PM +M/2`)-0Q,B*7Y49"%-#57T]PEM%-4MR3D'2@7VN7$53]0++2A3'#=/\""K$SF +M-%FK.Q#3KS.]1V9G(OO8)41E`!_-=K4Y)^58>U;D)99G6C[2^J0_( +M3C5^8IO7>,J_5C?/3^E>;KQ4Y'!+0G3_1=#X0<^2,]V1\/01XGY`K^%)SJ1^ +M.8V`JS/N]]D+G+\)">,$I=W@-#-*STCXDT$,G$T%N"8)]??!R,H_.DMR?=.' +MM*<:\W>0TK_H(R&?]4D.K=2F`'6[W+>R-Z]U)/Q`_Q]M2USFC`+$*=.`'S6+ +M*R_!]4@(.L?09;-7>5\I1M,F\CO0KP/C-8?1JO2[,W;!?$N'^98"8R74VH%W +MR?A$@_R\DE:"S#4X&%V5)A3XN\&^WI]6Q@D[D$;S]X`?M6D*,J*S=7\EX5E' +M^@G/^J072W]IBTM2MN[=$MPBT:9`;T+]4:DBGB:Z56%EH+*9^P4;YS6O3M$V +M@2RKM#[!L7;RM2DR^;LY>AI/^9WUOAJ!7O"7"$A!-01B\?TGJB.F[TQ`E$.K8VLP1%J8&/2S#W.$MC01VG)& +M23]8LA"Y5P$N1[PL6<-98(R$7R#E>$@YO7TUJT;+R>M_O]<.]=8$O>LCX?V1 +MS>Q;U4Z@&27="L8L;W29M2IKHZ/1M1-^0\YU)='5.1F/ZZ$/H3\/,0PEX-`/ +MAVB0;3F0GG"P`68]UDITY?*]=JSE)-AZ%[0A"UI0$UG-Y3`V9[DTVNLE-K67 +MK$?O]09="/BG/,_D;*I/;=+,6Y(A%_JJ\]=KC#E.3?Z^^J8,K$N5I%@ENBXJ +M$BZ.&`0+BX'.,T&_5S-%7!6<0KZ!FVAL[1.A=ENDX(:ZYK(8L'"5T#0^6A+2 +MM;DB87U$*N2OC^;0`7SL-?ETF8GU'!57CYH]@1J]KTTA.3L5:)VXPL<06CT2 +M7M3G6S\*P9_W,44Z9UD]I4?!W%YU/<&=R>+JF_\1;,12=7U<0O/L"[X#A")F +M0OY,9*#X"6S;:BR0WPGT>L#2\<47$)*GUK17, +M]THP>\!43"#?4*E0Y^`43N54FSOL41QVMY*]!0W5"ZNU+`H\2"'#+:"#4Z'S +M@TD@U79:B?O,($LOLAIHXO[38(V&V)V#RAA7CX:W@__[WA3;7A?.PYD[S`>M +M>QWNQ4:0*Q,!P[^)1/=CW5$SV65@%$LB_2%ZRN@W +MAK[6[V"ND#5'"N1,LO(XF6_VXBF4/E2LX)-`=OA91.]>Y1#H!YF;9'#)'+I2$72VN-H6BNP^DS1:766E&+8Y(^&3D;`GXY.G=7ODX +M$JX-6$UTP!$L";F:XI76D$,%6%/9%W*]"V6&'*#QU/342PPH*-0*GK<@+Y+/ +MZLZ3SX"\?LC;XNBI_STK,U!!DBJ51]IV!Y&C54%"P01P:43I>BP?"6\93A4H +M"$T6CH#>0I&TE4!3M>WV46H'84#;?MS_K&V/Z^F27W-FA7TNZ!A[+>][%>;N +M/2XIU+C'<<7W"PZD$>$/`A6\XE/HTWD)$P*YU.C&H82!*VX$(7+G%_1"TRR_GNE^2+X;6,&)K'F3]0!O2@GHO:!*@"3EK]$`#[;42IMD3 +M"?]FI)XSYL>)7X'DT+?ND6P!'[B70SYC/J7/XDE=6MY9CXW.6F<]J8N!D>9A +MMBL#6$)RO#*"#YA]T2]#">=;Q-E-A:Z,M'C%,763ML$XN'](VJ:8W_V28AZT +MC1+;MA)&M93*@U$-N<9#2,@A@]*W1$*NE\!]!32@%'XYAQBRAHZU#H^]AO$T +M>PBN98\03"L%3-L_K!"N`,V0\B3$"B$[A\5U]YUD;THT[R(.,TKW(I8ZB,VJ +MH(\QRQIV$MD6:?&.AL8[Q=@(0QVDC-@\,9C/DMB,()HBW_%P(VE%&D]&GW`] +MNV==S13/<7>S*&_^4FS+Q\-?BG@_'>HN&A[5%+!6V4J^#C34M`,V*?AVT(NE +M?!O`$'=%PG<,12E$7NN88L1,)_P7\)@"G7Y>4&I(YX5:);48G +MUIN5#9;$KA/KR7HK%7JIG^#H%/[3]427_W2],N-*9=[5>4YHV.AZOUJ-T.B< +M)VM[1%8A=(SH(T07.0@TCP+*(-1^U/NIL\%RXI%3 +M&?B&>@ITM`D\57^%^[2P"W5IXIS^G"655/TG7&]I7("$-.>D[,#U=:MQ=AS_ +M<6RQL" +MW:7G2A[1M`<2;I7FM_OSZD$S4/B3E;5YM)]()Z`5F7B3N)Y)`7\DJYER7?Z$ +MX?"I$6%[2(>IYNV4&3B2`B7G^_L\B/?Z]4Y?X'2@2:/))U^V??Z7@1]I@U1V +M(J\QM?M/<:=LM"EAWCYGDZ;!CYB78#S1'JGP4EU4'GW)\^OBDYS>Z0\LU/R& +M2\CO"&"@@E(8\[(8?6.\"L6=R4IH&YKU'?\TI&%=P^&[1IXDWW\\T>^#I?Q3 +M+%ESO'S&Z&LNU=U)Z1-XN[==\>%9O^)"-_2`)CVA0F5]2'^&-P(MB,;_">+? +M.1N-AQZ'S!#_AOB%L81OXII-`:!>"4&N#AGB@F2%5'[VN"^@?P'F[$_T_\%+ +M!;*N2;26$U=E[!P^7=L)?/_BD)]3FP)>I6Z/->">"BDG0[E^Z$69GN&KZWTE +M2],OU'=I4G.>7?U]TV\M`=X/T*=3=G8$R6@.:7WR78;74H.3UFG:? +MWT?6`*F@GQH)EX]4L_Y=?CDZNZ$7'2"TYT?= +MZ=HF;-8T&VFZR +M>=G"`^(7+=8+VC",R4CXIR-X"DC-T\D7ON'P\:'YQ>K;K_CN+"5TY$TFSRV' +M.7;+$*'+4OXL^*7@3QKR!?)LR)`4S"TTTN/KHM\8VY!?4XG:5DXOO!!HTR@S +MO(!'7K>>4S&@%59DWY2R`OE7DI4_/`WP2T>^JF6):TO^C$!%8_V5]`=!JBNY#]7[FQ]8MS&5&=AN@V +M#!/=\SA:P]=00\"!IPQH2\)DK3OK7])GM"MK#:C3\0< +MA,=BT")OC43"DP?PE%0FSUP>1#,13TUY"71@LOZX;Y"DFA1\27%+]_NB-BP- +MGF?159W^KYP9*5=V<61_T4Z77[.SVJ^)[C,B]#=K$#%"#5,3+T3"\P=?`IGB +MC\!KWH$9:!93E3GZ0+,C*9,'R;K8&,`6G2=*P8]ZJCW/U%00CNAI8QL;J1V? +M`2W/IU\#6KYN`!U\E<7FFB"6=3I_SV('IN-.'FGDW*E +M6+'C)-=:&.?<&8!9XRV7)XG[".//@K;K+JRGILGYN/IG"Q-F_V@U-0L%5RX[ +MSB+@AM14I%_R_M.%B%GA3Z>5;JS5T`5N`M^XP2N^G]FP/BI!J/DGN<`VF.V\ +MFK8;3_MPMH+_8XUR5^=.`O!P211Q/><66@MQ9F5"V&5A+H +M[.(T)F4]!6/3*"??ZO8EK[0^7'C('J6P2'A3"(!&:>IO*$QW*:T:QW'@Y)+@ +M<9`:,/\?;@RP_62@CK1:7M,M?@&K]MI2G6J'DFZ#L5YO(W`6ZHEDPE;S+O)E +MH;?60WB^R.DWE.:YS(ID&(4\=S[-!I!^>I`-J$#'ZY0$+%.ZR@(CX;E#.I@/ +M\]SMC--]L6:MJ"G*NLVHQJ!VV[D.KU_N3^IPIWK)^JU9I[9VN#N]$AC? +M60-DE.D!(M&!U"3B&`D9,Y`B8(!%GI?`T`8SB7`T!8_J%\&8I*\FW`3I,I8= +M!QTP*TA2(2%3F!0\7H_T=-#I);NTB*QSQP!H-K7Z&L)[DT&K<0`>)/!$,C%Q +MU[[SSP+<8?N1T.P!^'N\?J%."O(E*2LUAO?BN#""9XJH>RF"9A'CG6(_(V'K +M$)Y)@?W5H$2@9I*0\S#;(N&[!T:I0[R7\X8FTXIIYC@JW3JV,*U4,_MP75:R +M_E8\+;TXI60=KRZD9Z/L$AY-7QS,F)0:V&G1`P7JBZUABM\F_-?VBXY^"QR5 +M""T+_9.MI&6Q?.97,7$SKJ] +M%CD?+0.'WH82TH/BUP_F6.\$H27&+0BG0,`I\E>,L^T5ZWVLM\7>XLR+E;Z[ +MM\6IYO(T7&"TO@=[$1//H>D!#PK>WXO(FCY3!ZGR5BAL>\02:GLQM.=:&>M[ +ME;']E7VM;4#WB_H4]-?L:>?7W->%B31-VW.-),E.XMN< +M'FJ/1<4K`S)MG,1/%6C(K)S9W^QML3:#]H3U=X)4O*;?&>/$4M"UB'S<[)XM +M_-)M$L`'\W`&?]2KH5,5AN[S,+=2ZU+E66E[KSA:XAC`DS_V=7)$EE=F'+P>MU*#M2)\(>M%(>/.`R=GA40A'.8+]'3XD!.KR(>3G +M)65S3=Z?LI0AD3<:HQH&!920R#^)(->HQ75(I6#R8H.,U])JDUR79!P._[:? +MH6\!:>G'?43VN:,[Q[N;Q72SB1?4 +M$_UE$5`1I(BN%`AD+SZO)Q0N*+J!Y[X1T;M)B`1R04K9I^(*%15<5Z-F+O62 +M%2])<`J1>:4?])(]PY`.."&2=_<*(*^J^5O)OL8Z!-PS$OYNY.W>-M`_WQJ1 +M@OQV`J",0Z^/(.;UWKS6N3:4-=:+M?$S3%?WELZ0Q26FC$W73IXQ`>WS3BL\ +MJ\D2]GEG@,V`;0";!CL;;`W8X\%.`UL'MAKLR6`G@$V#K12(3BG52L'/@!\) +M4BV0,)Y\*9)HD0Z%T@<9.B^&N6.*"2=LC4CI=4%9B7&N&WHY)6B$WTS0^77" +MYQG1=9!1/>FE^*A^1-9UR7<=8VQ/YFH<6^?51?==-6\5I1LU +M:`NRX"=LDNYC#CEQR!$16"CK($C!/)J%@SADCX#\$?FH>*HH!/VG +M_&9W;R])\;&8H@?R?SWR42\.A4HN>)EW.0+8Y:Q@1L*_SB2S5C6^-G[.4L-DZ^?,!2^/[*-W5[L%[^` +M,"`G*8,CH+$;8FLI(^%9(\F"GC8:,8R$BN_QR4#BV,1QWH(:O;AV,A*>.&($ +MNB;CR6PC7W&&PB,C!*KQT,[_Z"<4.6G8+LH(J<$"^$WFL3?18"9S;#698_/E +M^7*Y/'[N_/GSY7*$&:,[1G6R2#]"0S+:&%N9N84O+C7?F0?2H]\'.M;J!5Q' +M`R9[40'6YEM?JB4KO[*LE^JC?-M8HY7')6&='-JQOE\O\F,>>'F+^\\`\\61 +M=WH!BW64EJR>OP7S_W;Q^P4#/&@XO&S``)HOJ;]E2$H/A6='"*5X9HB"WK6. +M1-/]/3@Z6_7L=,Z<)Z6-IK)<&6V>@_9&PG\%3<$884I(VV\183,F2,H+#"GH +M%B$70?#YR/AGL&0$^E_'GR:T==>K3LXB_5K8<:[ +MR4ZO!O=73J2;QJ*0:6A';^AD-HNG6NNHNNQB/8>F@?23/2ZH9]_THNEC@MD; +M\+SLM2A;]6''MNB7MHXM27IT_KTMF"'[^Y&VW4U.TN@WX#S]6J2?^N%TD%,Z +MMLFNIL7GD_(ZMJ!I<5"N(MBQ+;7$GV[>1O:R8^;#WF9?1N>BN]X +MT9QG!BK$\%?+._\!8M[N)6M*Y+N6$5U;(_\\MC?]70*/UBGLF]4XM+`/4UEL +MG(IRDE7\\1I=\07TY>JY\B3KK;1DRKWR6^VKTI_TKO'>2=UN_9OW3NGMUDF^ +M.^6W6[?:R^MEV6/Y)WPK?3.H;.N'OAG2;.N$NAGR;*O'\43=RCHQM&Y\/0DG +M^X=>]S]YWUSJ/45FSEV<_O,WO?LZES_&C,BGBK1,O)X^U^C<5I +MLS&=0& +MHP2P-QZ>E^K"U$CVO6>O^R&INRJ'7F%XKB +MY/9<.IV9__&NN*1UYES56G3[JNFJ&=1TZQSY%XG;5VTPO[5R;?KQ8ONRK06F@N:[M:0=A4T +M+*L?4Y]%59H+S7]+EI@M@29-@9_2VM`8 +M#7/;A5WD9-1JR+/:O&-E7-(ES8YRN2%TAF"Y\>3#7(,MSAE73\YX=<)H$$TH +MCBHTW\_93;:FI>8+LO%)X^4:JR1SE5QC5P:DY'I%*BM):F4#,OD,%;EL<;J5 +ML:ZP!ZZ+Z[@QSJ%LPF)<7)+2FB*/4\&O*DZNM!X0=X"Y3U84-:"GO17>.,T/ +M"SM1E?NHNU.S\Y'H>M3.!U-Y\I4*3\ZF=U@0696F5=4X1U6QW";)^1D]>W4* +M8*IIV60W.2$5[4>1S7TRVI>B8M(;&Z>>)XCPXUS^=4]`@VYB4RZ5@IG(",FO\QD7KM;3(VP<( +MC7VK/Y.3,_$0KZ7=X']V@,@<-->&%FFF,OXU9L7,[@P6:27&@N6@KC$R$[O\ +MUFH#K:-)[N<&QD!N$D9"O#3YGI%%PUZ-=+)]2"O=2]&2/8)+6XWVR%EJ']ZK/"*WR0I;C"A4T/=TQ>4*>4O+ +MJP@%H?QB;EF!;Q%"2WVU6ZHV,LO$VY*6.3U5CK4HU#J&15E2NXS>8)_N8)CC +M#KW&2F]P8-TME-2MI@'"`IDI9F5J,G(NV3PWM>\[^ +MN?US1PCJ4T\".LT@*@*T3/4?\;243OKUSQ9E_>F-]XY5U"ZJ7"L]?&RM8'J*M=E5F'M +ML767UC68,^_1KJV\9P)':.>;?02;GN\;S^EHK3V#\^?$.]$T97`B[9_[E?-; +M>V#*EC+>OM]."0GVQ^QG`;)C2E*WK;]:[C,84^R2 +M@YV*^=TGG,];3]CS!$46FC4G2',)3IH[LNZ7]TRA)0?]9W"1 +M]7OM/087M]DA_B;`;]$]E##=D77/VGM<+K4-FUP.!<`?:X]41EO8NQ:'4%\] +M+0$H%0%F608)M`S];B>!"0I]#5)7?R\9\S\!?`@\1EH5=`(]%F8Z"EV*G%"< +MLH^WX6FKPW6NT!*GI;#3Z;]G4,;BCTNXA]$UG+BK9JZ2`2/EG+ +MT)L@YK?]2+\11C*SKUI`H:.1>P3JL7D.O+^X$.U-=Z(I:#(VI4.ZGT9("_=% +M^F&,5$&D[;=3C_M<>.\I)SJ48D5[T71K,)/VSTYW_F+1(XN:%$8C%O)]E]JK%*C#QX!*4WLK +M-Q?>H]U,YG&!]-HG(_W +M'N>I@_D.%)H?05ETZ2U"MN#>-&ONA +MG'[[#WNC8TK&-PT,H5G^UDCX\G`D_/0P"L4/HE`*F!<'4&@LV.,'_4#OXHNT +MSL`&;@,.U?21FH41K1/K5)4[*V57Q^\O(XP3A61]ZE?5L7G4!WA#4G>.V$OL +MQ29G#O3]D44I]E/KD:$FB*:\5ME?/;]ZE6U5X2N6K.#]U4UH7<7\ZONKHRDY.<%YR_X8C5!#CTJ$7"ISB;T-TK#%#GXR,ET%<#]+HJ +M6"SVVL$_+"PN1%E-:'49Q\W?$.\\9HVW+^`FTH22X"#QS:;GRN4CI+?E(U$Z,[4$"7.$V62V +MD*Y2R5.AIB.KE2:5$"?Z).!3FR3"%/!##M-86Q-:LN+M]?.=1RV2Q.TZ^5!;,@/4H9;@T[M7'NZ/5F8Y#QE2>A*MY]9O\NB/,]7[P(<3MF09!OC +M3+>FV'.AO\>'XZ$WIANP&T_6T]?Z1?K$Q/IW?=]:""^<+'627CTTK(7VIO,] +MKB..)"Y.Q"N@BPZUH*L^:DD,]E1?6G_0$L]VP +MGFZYBMND/GVL[I%6C@M8JGG$L*5X#ZFI;'@1S!B5D]I']J53S^YWH,E,N]8^ +MS[D7J(<9ZM;:S5RB?;F@=1TA*S=:I5#ALCFTK@I7BD/GHD[L!3>U5^MD#)+S +M3+[6#GT0IDRH^#.X`.+XQ!%'EH/L,#D"5"1]F)Q](]3A&1$#4X:/N/`S>RU3 +M>)(?GY]$=H/EZP"74IU-&M(&Y9FFC+?'[4M>HIE@:U)#*,C#*B?92:]SJ)SE +MK@I'&MC+'$<<4D$G9#G6@BL!8/#Q$"F_9XAZ'$T_PB>+,$SFDXHD.NAM)=;M +MK$RX2@_^/,0X(^'AX7M[4:ACJ+9WY%4BLP@@NWP,Y@,P5R9$QRG*S)_+76I\9:GV)+O:']23>T7_F?VB^YKO4/#1'.C!"I7XBUH07J +M1>NE^@21HFX94EUM_Z8A!F3'K2,MKY*8>X:>WH1":X?0C.]%Z>*[X997KV_W +M74-'@,Z."^I<*/.H1D@"=BTT'L3CZ;\9IUA\PG` +MG"D.N:!UN#9G;UYRCV%S]>:4>QPNG.]P&-8K8&0>U"U9HK[:(]D0.2.<,$+X +M#`IM&P+\"0T..D6NJP>^$PD?B"#A2Y'O_`-H_Q>#;E&.(?V\OGTO,3?ZVV[R +M=]SD#X)??5*:G71&0L=;#RM4O+)#W7D,9H)TGC2[K^N8!0>E>=)\0A&B)Y7/ +MD)7*')D@\2:0G6K>5[QF_*=D[>7D9-LXH*MSM4OLNJ),&\RD +M7$G">,UN5+F$*<2F%5:_YE;#=Q>,H@XXCDGGTFU*^UR&M1,-`V9+1]K= +M`H/0/.V;;B$9;"1M[HED-5[2GG8+XV+A<:/A>@@'/[BUD>F-F21-$HEKTZV\#UZ$[E[2KBDT[3T8*;QXLFVH)!0-DV(V&47 +M'[:W]/RN;7_/Y+4M/:+;OK]'OFR^,&7M'$'N_K&`W0HAFG[JOT[O#PC8KXRE +MU__K]'N:!+PG3GBEK0S2&_YU^N:=`FY6"2^(Y6?_Z_0MNP0*#&Z)!YBF7I0B +M(7`F^F@RFO'I +MZ/U?[Y)[OIC]EQ'DE2.D(C`D]WHA5-HC%4HN8O.,3UO0DY?5D'V#L;3JX.Z+WIB;U+?V?Z&>HIOJR?UOZF%B::_/GQ`+(WR9 +MT'T'1F@CN0.L&2T>[>_'IF@[,&.)U5]^24+:8W[U"@IMAK:^>B4IU-+3EG*M +M[JD0WV:ZUGY(GW$\YJ=060_QWYQ?"?XD=7//&9B7%-0K5<^X3/!9`OC<%0LC +M:<^4-5^2B>X9GV)C\R4-V`MB=2N#_LL+KJN7@G9H&'_LKC72=K!1P^5.A#X; +MO;?M#[&[X$;O@/O6^+_67Z1^XO(DTBXU%E+1DDOQD.85]8TP>,5X(PR>,OZ_ +MAP'_+V!@5E^#@=GXKV$0@'YK`.=&X?`@^$?Q@-PA1^2HLQ.BL@"!S_08C#'R +M7R3Y-::;\?,:O*#.C`2(QV)=.RY_.PH79L]5>(:@C3C6)@743>[+.WL=?``- +M,]J('^T7[\Z[&98MU\$::+A**LRX89XI(:SYZEA&YX^)C0BX*%"(U=A!"! +M7?`ZV8K(-^=B,I9_8A3.)!U)+\*8U&5,[KE3Q"D)T/R&'DSN&T1OB/2>Q*NA +M;@ES^A(+L";CCHR-EV>#+04;@:T$.P&,&DP:&`T8&@P#)@N,'LQT,R\98 +MGERP\\#,!V-6-UY>`+82\$6L$\9]3`P_V.M@.Q2)J$9Q-$IS&BY+H6T:*)?` +M6@KY&>9)P$48;RA/`CA+\F'`]9!_6!GYV_"5M)A.0.!$ZA'AJ$[N8=0-E[X! +MVC1:_O08#NC)/8GJ?2)^(S.!^1(1M\D]D<@,?25W/IIW7.Z*1#X;+5<:FG3Y +M[.,1RKNX;1%J>_(R#7WJW7VC?_@G-_K;=]SH3VR\T?_=X1O]O__QC?XSC]SH +M?_'A&_U_.W2C?]R#-_I/--SH;[HI_9+]-_KWWI3^PD]O]-_]LQO]NVZ*_^M- +M_>5N\M]^4W\O[;O1+[O)_\>;_,E[;_0_>U-[?O_HC?Z?WC0>R?X;_;-N:L^M +MX"?CO/87$>I?WTCZ[[]___W[[]]___[[]]^___[]]^^_?__]^^]_UQ\Y1_U0 +M'SD=B1AR=\Z/6\B>"BD=T6+=7A-F)'OP7MD^:A^>,IO.M\T[,I]%CU&A+7TD +M52:-=:!;S(YH)9!NKVGO;(D.[<]EJ4RR#R/W2(YMCY$*_;`O]T@>2X4J^N:R +MMQYA(&1-7RZ;?\0,KA5].)0PA$/SAZ:PC^1])S_N5VL-#0V[.A5#W8@Y[D>A +MGT'L?_2AD"$RL70EX[Q3O&^@]I>U*&3O:ZXGYT?&,/H&]OOD$H@[,Y4S'E)K^I*HN;=6(C +M^2(0.HFR=7Q:T=&ZG19T+H6>7(=U9(\\TJF+NY"ZI#R=0^4KPX&N]"X-Y2TG:X+E:QN\#=WTOVZ)']E:/W:E"<'ZE6X!Q5 +MF7LQV7_M;B6WQ:-,I%>>7U#\Y>K1^]_Q[!V6\)E(YB4[0_N=H_?L(P9E)YR? +M[/HU^"[9)[N^`/MI9R*YK]RXQ_+UF0ZRIS02W>?WC39.%G#*F`Z[4KRK/W+5 +M%7`JQ?("3K*3TKTXKU5&E\4IM4IS%D?3$J/2;7-'PG^+M"D&SZ9!B3^*Z&AR +MKT`D?#P2W>7JUW[#(!FV0R_M6%M@QW9R)_UY%]:52U*LYQUC.%PYABNH;*AL +MK\0NO].].(H]Y,Z'Z.WOU_S1.^%)>07.9%VJ=*^UP%[@3(%?,EY#&8C""6`` +M=BS;[J(2HK<;CM?M%>W1VPZE,;\E(18NIB.M.N1BM"KK(<>\PD,NE?F0(]^& +MM'L;4W9@V=O.SO71%PA0()786IV0"CFCKR'D,TC9EJY*9P>'0I9$9 +MG(3IJ(V>/3]@3^,H%#=,`X= +M'8F$ST6B^36%JWRKY*N2J&EJ/IZ^A6-,:%H:C[+C^#$V::8Z!^D#7BE_P!IP +M(T;M<2_6@*NL#NG[>2SZ*1U)0?'DO*M[L=H:O?O>'+M/GYQ[(G,@,"9ZS[YX +M3IK;%?2*4ZE73;Y"VJW_UU_@N=C +M&V+(&26RW[7`>A@=UG#IV*C6'_1_<^8B^S$G]5]DI7XUHP3[$D?9TW4][#Z\ +M4Z.TJ\'=A9O`913?#D#:#U@R'QK<[>XX7:JDT9^8>8%ZP_^>C6I09RUHD.FZ +MJ,:&-QHZ;%3C@D:LL^R0ZJ@=B;K&QO=LIQL;=D1?E?A3B926ZDQTF@F')H^$ +MFI`V28_Y'O<1]U2O5SQ+@WDT>8Q`3LF8DZ2QF]*;15\\.<,_628(HN\6/>(E +MDRD=SFR<=8K%?'O-..$>[X.S,/]&3:KP*^\N<)VN211ZO3^;1?&2J7^L40CW +MII]<]%;-W.W^J7=8[UETQ]9/O/?)'T@ZN>B9DEO$-+>ZQT#.!R`L'G+GN!.@ +M1.*3@F^V6R9,%7W4+,2;W/Z=[G?<5N]*`OIT+2,#R7IA[UKY!N3J!D4 +M'^_&.8F"%%R%X%(*\>#:!2Z)<,L,S+\#+JL7YQZS?/R!#_`T2:_@E>2T'L^* +MI_7$$:,'>]>Q?5?OAD>3%V@\'$/+='[#(>3I@R":^SWIUD*9-@<\BYN/>+"8K._U#G*E=C0S*(!;O +MAW+BF2,4$-NY\T9MA7+=08ZR41V9HX9-M`+V#03HV/R@`<.4PSC +MSM6RR_/9F?Z&78PNQ=JPHV&76K3)/3IS.:0+N+%X)\788(^O>C=!*72`_/NS*?GF21[L7@'IQX@)#F(0Q_$3@Q^ +MVLLP>H`/!_#!5K0WS4`@\A%`1+_:+T+D7&\\FY6%G9V!+$/YA_ETAHG:JU^# +M],8@UK.\/AV?B(2E`)M%_!N]H^\EB.>A)T?W?Y-W%+Y51-],(&\GD'-^Y#T% +M96R?_^CYG]$[WNIB9Z6!=5*STO_!UGG)&PJDK?M[7Z*I@V3?=[3MNWHQ([=Z +MO=+T3U@J%SG;`LV6YS^0S"0CL1U&0@XC@8^3F]?)2*P?^HB]&:YD9^%]0^>+ +MY+2>UL*XJ(URG0S&9N$0@12!DWGHS\5:NMI''2#S.G_HO5)RHC97JUR.#FK] +MQ]W2`R@+D[,(6@1EW3WT)N"5U*$4<&C5T!O#!SB.SN +MO6U(>H#<;D#.R9`QG39$"6:P%P]A9F+O[PJ!FVH;D4C1R@;.`$4=O;'32V[F +M;/22&SO)K<=['05>Y$74*#VCW8G?K_B(SX"J:LLXMUVEIE6F=_U$6AYX=C`"6VFN::X0:QF/WD#BU:2?$ +M_&)P>_&4>ZM]6OIA-L/$Y%72DRE.3 +MHO?2D1.I2M=]-K_F0QWEQC`VXB^8,M'UM?B+X=>O(4;N5KJ41J4C*F'(0<;! +M1DKKL&%W2A.D@U\B_T@9]V*)&(?AUZRIX#J;L%O"D#=S$&,\65ZH=*_TH6SE +M^:5%.DWJ]D0--CX#(8V6\+D5/M:]PF=\A3*Z%Q=R2]BFNF4VG;$)8?\^!&P-,]37.FN,U5VKT'J"+XW/=3Y,X8B-L-/F+71QB-EC./)Q".0B:O-9%.HS&6P>AK!@UK4&:F +MK<$B.:/,``Z['`MJIV2YVHG79*_9:T'G)8!B\YK(E=(]45F@ +M(8)0POCH>;^ZV-L+Y!T&3S5NEHR+3ZHF#:6 +MMVK6>.4S\)DO%7'=HUS"JEGEG6]$IV1/@<25\[`7UF%_6OZRXDG+9JN,6O0M+'!E/1B[XJ)J]+Q;3LL +M\1^^5SA>\^26W=X)-6/6%'NQ,1K^S0>2W).63\YTBF<3R5T-2R*8>;E7W?I6 +M$6*T7AQ:/O`FQ]8I/3BT8N"(EP*X%PWT>`D58P<S<@9YM8PC_B9V^(SNNB-Q([@=06O:/GNZCSI%W[^C&,6M(,"?BBF-Q8)+BF)!BM +M@D-P'4E0BC:'HC:Y5U)PU,,L*H&VM,&\*8V0G5QU$<'5`C&8^:!7V8I#+_;7 +M>]E@\9::=[BAU[(.41_O)OG@B5$\BWBG>+-'CP^TP_R=9K69"C;[@'^!GBC1DM&XTA>MF$R#?O]&'=43<._;7/=)4+[NV;R)%VJL7VJD6;\#]2\[-][;UY +MK;,$,M\)S9B'HC2`G!$> +M`;*$$FC+`BIZIIC0(')F[KLB//FR>$.`^'9*/SFC_Q6[L&:4ROVCF/1]`_2= +MS+>ROD]+0,.Y(^0F,&V.O;@R.W*9)>_@)`3);?UQ`$-*+^<%7P]GUI`S?NJ@ +M2KC`^GT?W01MJ9@R"20GR,F$:C!`GC+R!\Y1C*3,)0!!:50?B3\`W$L +M9'WZW>3D.PH%(X*/G!=\F=SRY2:XMKCO#:`\+[&1\)\'7[3]AMU[_P[?[XHN +MK3YHR0N:#9.#Z@^,!CHH_T!-[M(S&'BL;:B9)I@,8X,Y!ATO!5^64&9("RZ! +MD')(L]0PCE=!:+J`X/<6@8+?,8($?M6"#'X3!07\J@0E_"J$./B5"G+X]?N8 +MU7ON#0;V!BR:)9J?V\R:%/_/N(C19%3ZHQ1$V9JM?82U^/:QJF5XPDYV2AX* +MN6/ZJKH59>UFI>[[676>%/J=U[>3?=`Q>O(X4-)4C+*:V":.6J-,WC[MX1YJD>Y=S:TJ-N:K:#FM +M9I)R0#.Y?;K&>"L[4[)O%N]BL5:=5^"N\Z5HEXI:-N8+W`HA>KN%A#_J568C +M"+%S<';D=_`GYD@,H].+(9-:>A]<;V#8?"ADC6LZ>SU;. +MX2:QZGQ[7GL%R*VA&1$$[7!YD+Z-I[0GW!,YS(COF@#6=_JFV\C-3!PRKQS/ +M=0;(RR4H]*"X!_OY$4K[:2T*_7KDVHW0U+-::$%"9`*Y109@L2K8X(V^Y=;@ +MEAKF=)&3O;M[$7I$%CTG2^;ZZ/E896Q]RX^B,@:1+SX&]^.@B_Q"$3UC_&5& +M]*X50F/T,7F#G$DFL@<]/G:O6^S^Z#K?$O$EK2GGV9E9/!DM*CI:Y&5%M\20 +MP;_"<=Y.N;P;:T'SAS';:SWB3A:P5EN3(/A\Y.4)B4'!LS-E_/-BRLYQV-1# +M7B!T3P/J%PE_._!LL9Z^Q3@2'AQ^IHAQ,95:UPD1TO4C]LK+%2CTUV%RWYI0 +M^12+`LV5!';WCI`762EF0/%>.ITNBQW:NU/@0>0DO\\ +MK'?I*PTN,E)E(\[*+RO0Y*U^XELR(JB^Q3Z5'XG2V2] +M)/XASFY",^/XMT'>5?#OU;3MC-*5IX:1D.PFU.B]X=$W=D`&'?`6EX&,&^W1 +MON%[2PCV'J>_`NS]^3#(N1.VPMC^9'AS$6:T=)DI4!/M<0CZ*XGV%\J6CXR^ +M8U/-[FB1>1432`L/#]]!,W/1GA"AR6>2]`GG"34E=]&3,PL(,'7GU;L!5W(= +M6W[`)3'*M:2MZX:7LDAK-[;7W,4M*:+V<@AG+277&?&4@ +M@5/FLWX-*S6E&5'H-/0\QRW>VS8#!170#@1X'`E/'R(]N##TB;ND-RJ_CZXC +MDWEECKVM)NKVZ-I;:J/SD[G$-L&QT=+EO" +M'FL'V#L3U&"/A(/#(V'ER$CX'T,JP`+KT*AD%]%I<^292+N,'0EW#$5T.$<% +MOB7@:Q]*RLJD(SI3#M*6@/_4$/$5@*\(?"]`VL+B)3F9--+JZ9'P,T-L*9X2 +MT:7DS(:0/'H=X'PSY+BS**)S0!YZ/@.I?CYTFPTQ.?,R5YOH@6GH/()>B6=J +MC$GZ;R]$=+/9FIPDJ#\I;R3<,&0JFL4F@2:=#;RNHV\ZFY.WP$YNE6CPJ0SX +M/.&;#4!/EZR>;MM[K]\WC8M;/8WE&W2V,[[(M#'!28J4[G%>A?LN[V+WS[T_ +M=O_5^T?W.-_B+7?Y%%M_[EN\57)?:MV$S(QEI[TH@^+S)HD,76B+9,N7TW2!R!,QK7!;[.)G-F(2@K+CD6HT7>_R#W# +MY,[AK-@;(Z"Q+T:+E8O5BS6+F<7ZQ<;%>8O)?GX)*K^T$Z%#DC;U1;*?%1OY +MCRFT^E("TRC@-OXQ;&S[&,)RI60_:%L;\>=*C"D7J\E^6*;\8CU"\R1MIEX* +M+17WPR8CM'-Z;G./M.WYRR0^8?Z.'JG1_W%_))*-U0T7-R/TV?2\Z^+SKL53 +M$'\/B9]_77SNM7@)Q/\(1<\A^+/4%Q&R6PJ,.0)2.W3_4^",Y +M1SB6[!?;/WK>@M@`V[\_C-'?Z;8G+R>W/2)@1%]*%!Y-31::,=F/B-L>O4AL +M%++UI5^*1$@^LM=^&^0A^[UQ#$:$-IT;B8AN-=F?#_`$%6.>INQYO::L63]J +M0[A.A/^?6WJNQJ'G60UJ9M50'O5>"XS!WBP8ARQH'VZ<1@K4HA/K(^LWSL1>>0^*]`3M:@"X/H,?P3PEG1'W4GBFL:Y%W +M`7&3\]((I#GBCIJ#`V2-C[@54-[7?5"J5E$1#2F@'16CL4C;7#'J$F(NIO): +M.?^UT=,F>I3#*ENOCXE25H0>`PB.PFXZP);L+P9X*`D,"%P:8K!-*FON60)C +M)A.:>Y"YN2=1W=RC,C;W*%#;)7O0?Y'D]XY$_D[R*(+MEY"]^1)YBQSYHV^_ +M2]N:>]KBGKMRO1D#>:+[E9MAA"-_-P/N8\8O+)C5>)%F'KRL43\H[GU7HP:>T39+T(Q/IT&[2)O(_FC:^-AEB;%82&,>NTS>A4="HR!! +M/^R)ASF;9-PO5)(V&]^X9)[PDXL*J$^A;K\D04MZ).KF!@H5"&E0)^F#R-L8 +MZ"N*MFTTS-V:5))(8UI*W[_`*&(`1;=8Y#RYE1R%,OIB*YNL=T&C11(DH9'P +MB\.(^1KX<)4=#2\$$\7;)\6]X:]HR?O$EHF)V5E/3>D:I\LLM%CK%W1KQMU. +MZ=-X%N-NYJGQ0A:K-.-@YE.W"!T(=T]^*E4(@#WEJ22!10G=4Y\"70TH;P(M +M%^+T4I[YI0_7O[]>*+K'HOGH-"FT5?'\^(88P7YZ)053\CAI'4 +M/Q+7=S"C61S=>[!.@A"WZ5['!M=:IM1=Y7%L<6W>1!8*$5(N<-WK6EO%6'S, +MRBH/$+W2>ZL\ZS9LOH_D6[YI[54/MZG*ZZC19OVGS?9N86M<]FQP;KN'E;P'^Y%S#Z!C@_I;O1O\1VH[]JTHW^+Z0W^J=EWN@_(;O1_\1-]8V_ +M*?WP3>6YYMWHG['D1G\-=:/_3S>UG[NI_H,W]>>)F_+_5'*C_ZV;VW-3^J]N +M\F^_R1_.N-%_1G-3>VX:C_Z\&_T;"T$H"4VZ;`?[*DR?B%"C[L6_N''?NM9V +M+=WN)Z-Q)/\C!X@[BC\;`7\(C4%J_]6Y'1'_"BHV;?9L=&Q@ME1Y-KHVC2)W +M@<>UQ;FQ:HNKDJGR5E:Y2?`\!G$;-E3=`XE=FVJW>+96QA(#>D-N@L*,IZJR +MRG5OU5IQYHRF=JQ=ZZFJK1W=S+/L6DV0OF9K5>T6$KQTBZ-R/;/YNADD_I57 +MK75!J5OF,96.35.W,)O=5:0EI5O!N8YQ7IM&8NKEM56>&6NKUKDV5:V-S2+& +M]%\'YP"AW^JI8NYU>;9L!?^Z35`#M'@MLDZ;QFQP57@<,#>O]OZ_W9_TYE/B +MF0&B.R#WLAO"$-$GG%J$UB+CUK6Q]%()DKX\-T&SO(3];\O%&%_S#$1-=EQV +MW"0404KE:,2_*B4ZTJ0D_$_^$1J-C;GP-7-=-**D2K5]"J(B"OB?A.1H(F(B +M=P[A;:"LB7E2Z'I*E42EDBD,F0WM]W0(#]`)=9D8C6C,B@( +MY#FD(D&2:-?_VRZ1/^GO`8)19\J_^!O-HOL7?Z/I9O^+O]%T"_[%W[_LP[_X +M2P.(["$[L>08*<#?^."NGTDI8T<;LHL;M,X!OJVX&2S_'Q@"ZN^AX$%2.."3 +MC`CW8)+!I(%)!S,13"88/9@98'+`W*&,UFO$?:@;O0/V`;05K4=M$`8M0T#B +M42J8$/R1[^VCAGQO?_H/#_8=_'+W]XF15__R_$?+]I;9)=2)/V__07IO1>LG +MQ8<^7_CH$Y/,33\>&/N/O[_0^9/XP<\+[OGM\(\^6_AZ9GCISSY>=?CT5KKG +M-[=7%ZW<4'`_]5WICM7.;Y?D\LK^_1=KGUU:<6=V@K+\IU6+?OB$WGCDUF15 +MZZRXI+E9A\??_K%#[X\.;CJ^Z>*[W6\ +M^.?M]>5W?%CSPY^/^>Z7SE,(36^WFR==ZO!]\;O7SB[:??Z>0L]'CYT]<*7% +M]M#ZWV>_=;GTEB_>>OBOAY:O>RSEO9WJ3^72AI%0\P+ORY,O%7YS=&1-FW^G +M[-=WOJ)EW=*O_E;9?M_6_ZBT&)F,RTG#&U\O:DC3S)DRZXV>UX[.>3>0/_.N +M_5\O;QQ:7/=<1^_+TW)^^DESVX%T_AF%]]_!*]]ONMQ@3MY;N`YQ3>3W_N/MW_R[:>+->KNS8'09IMG=5;> +M5W?]L7;)SS/?V7;D\2O:.S[\V0>.AQ,?2MXC6+:]6?/,N^?VR.0XG$H?._VC +MZO[?!%U[QZTX.'7>J:EYY\?\_;?39NM^W^4^T:3XU>S?S=#-WS>6Z>1^''G& +M6U;W]*.2OKO]<>,RWJ\R_?4/#[X4?*.QQ7#?RI2)[]0/'?_+QGG3_]_,@W4N +MS\;[')ZJ68XM&ZLV1']_Y-ARZ]S*.<:%OKM%(;-.M_6N<:<7&0RFDRY?67,08_P?J_I=_6VNW.#P,@YQ5GHHJ +MSY9_FNX>3Y5CB]/Q3^$1[8SQJOU_R=\C7SUY^;\SHV>/!7E4EVI(`;U%W2#* +M.^1L=E;^R<+)'[_>`FX6XF>D:6G!FFD%]PDS3BV>>&RRO$N$91IP+!XS.R +M/@"@^PQ8_V<;0-=:+O:W#6#0=ID"(P%#UC-GI:#/J-"G_6GLCQ>QHOM70ZG@ +MWI*,8J_8(I$;NQ6(V@/F,47TW3L&$?J/4"Z8/##SP9C!K`;C)-S;C*D4LF8! +M0-KC?_1B,CIP10EM5D*_E4RCH#3N$'"+^2)NLUS$J*PG"5B/&[5ZE043W1N(WKA"LF?`/DIL./`EIC?O"0M6P[Y'LP:@CQ?0Y[Y/X]0]ICQ +M@E&V2D(%@_]K^\SOL3F/5+/H,4GHY<%_OL^\(K;/O.*(W;;'*`D]-5AQ9!TK +M":4-K66KCC`0DCQ4P=YSQ$S>G2H[+_<>2X- +M[1SBKMMQ3OR_K"7IR:[SN?_%KG-IJ&EH25$N@]:0M]B4[E+Q)2A%D`I5]6EC +MW\"IT$_Z,-3GXGN3I>&]O9)0Z_V+;AN9SH.G1N1AEPW[4R?;'/.N_9F +M<-YU;P9'&)-Q(O>+?*4_,,D?H.B\')N?HL?F[/3'&SO\X]AF[<_RL+],6^"? +MJ&WP)VO;_>/9-JW=B.UV;8$]4]M@3]6V0SGJUH2BI^8W>QW>@$41;/;:W2CT +M:9_#.Y$UKV9B;QT#*61NW!]_!;`Y,N>_WQ^OE/ZO[X^7DKW!8!9$9P@5?6_- +MO9BBB:NQHJ""[-8B[^;);,BPQ$D%E=8R:'V#=8E]=)^Q^B39;W+,Y=?MMQYS +MD'WLQYSFS$OV3-=A&.%,UP7X/>84[(RXZWQT#WO/37Z%EI,'7.15-W7L[LZ# +M;'N=Q#`4;&.DH6,#/R^5T7VN4UAIS:<['$I9FQ/,>B4=W;F-`ZCI4;;-]2B[ +MIP2EDZ_$$3T*NK?L9J_YC%MW7>=S;S5M3V,BX>9(S?:Q8#\>>9!]LX&AI:'U +M@U*8/WVN!@[PPS&Z=_N>B#2T;E`/\6L&:EFUL;V>O'U%7L7PPDP8-QC;S5%/ +MZ?O%T"T0FC#X36]MH;I5XS4K<)*+K;$5N,OKJHM0MBJ8X26W%:O%;\VLUM&@ +MT6H;),(>L3=IF\R:M9S2'PF?'HEB!47?Q4J#!=LPR;N%C(]Y +MVXA.;6:WD#N!R%@<=?G)=U)Q+(XZS;J+=IUK'T!91X]U?0[V8TXI35O/VM-< +M3X$O&I9&[W.2F]02S]]9_+#F-VM&3R!,<7T/O[]TXIR=EJ_/1$=)`Z-$[A$B +M>][5)P^Y_-J=UD..;S+'RPY!;>_;,\3:,EQ=\'O(>JZ!+\2VN^,,)!3Q(X#SOVN=.M>$3/4)]-L9UW[ +M$QZWGG5(94U(:_4KE59UA;K:3`UU!Z%M03'=&^*+27XE#N*\8=Z].(V3VY3D +M^Z\^Z*+XZ![.Z!F$MMB>%C^8]GA0#S&BW@/[0S![<'3//)E3>C"+J.A\8<&6 +M@4ZLX%1>RJIRV[R461;$F1?DFH!4I[9"U0S9B4_VSRA;"V3R;@5@<8I/.];GMR& +M36ZPDWBQ,9Z<^9C7#_T+M^"$A;QI$:5U;_E)67E.G*LTYMD36;^SV7+Y7#S;X,2F!GN#4V&0G)=S +M^78E4*W1DDY'\IPDWX>]H41$>8&_^BER-]_DTLG%^0'$D'M_FY"S++,$,[G. +M-@5C]S.,QS$^#?KWE_X\OYZ.&--R"XP/6G+MZ,RY6 +MNZ"RI1G'T)'9!;,/6)10M@HHE!?&;$$"Z&W0QHO@GD_&FIS!22+KM5\7D[_8K$6.3FY/[!`4W$_@?P7+-D+G<0S=(;Q[QQYXPGX"R_7D??,KH#_S@AF +MG+&O_^Z3EXN?6O].5JMGIV.DJ +M1^7*G0Z;2ZTA[SU%WWEZ3IQ)7[4&V<86B?,LA_VU^+"X-[G1U^8CX4#YK.<""?1;Z$!=V^WD'1X,A@)#WD0ST/&,).0: +M3J9=&<2U=AC-@A1&M:"GDP2G,D'8B*)I[KJ:IAS2($B#I[XN?[G:5XT.:S3X +M\'C7.QEO:=#A)\A+M[F_8FDC$G=BX2FI`KKZLCO6Q_-/%(+44?.8!9_'4Z3" +M8Q:*WPV<$T^A#HAG!69*>+*S$\U4!IT9D;`CLIXFIS5P[BL5VRLP<[[W)VS> +MU?,&"S1[8V]FZ8#7M\GG=DN$J,MTEMA^Q8SN+(99C?0&&*DLXT(OFB$)WL]Q +MOA,6AJ>,V70CC-7=(^25(WLZ8VSSF=/U1NUJB7C68!OG]W8V!2SQXGO$GHB4 +M)C1W7H3L\6!H@%OLE!-Q5T8HP-_[^[[KK;(93Y;-&T.;9W]0OY&338]S2OD$ +M5[+MV7^M=A7CR1.=&^6\# +M.AW*6I/^S&K$="FHL]$Y\$T@2R>]+6O:G`__8[5\5G87/G9!?&^$BINB3C,^ +MJUGE/:2AQ)NX-<+UOA1!(MJ)$+K"E^Y[T@=\W'K.M\J+J&B:/&MJPC$>_MOI',UQ8]MVB">5:A[%;T\[3; +M+@0D4U^7_-Y*H/H/A.]\TB)__[Y%#W@?2(\@#?CP!R@S4?@"K1G_CW$/)&]/ +M_T(]0XZ>G)&T?M& +MV1+^:2\U]7;KT^X+"DGW,:]T\C3K,7="X=/>LMN48OA3WK60LFSVZCHT'?,X +MB_:@;":H*(2V_62_!9W+H-/HG_8B1/8FYL9H,WD#[A7IM?=@B;\(Z/@/492> +MYT&Z7ELNW?63%RS"N31Z:R^AG7D?> +M$B!ORJB"%T1\E`??%V_YI'CR/G5]Q.AMG^H''",OFZIXDA_2\%V09K%G=&Z0 +M]TZ50'DEH540*^'?$6/_T4O>(?VS(P#V^!.>6L)>_^RFAE$(H$KT"@$NP]IHZ\,X:`Q@"5D%P39)3H\@`Y(0M\-2P4FMM_2/(+%76J1\&O0 +M@N;@$;&5C_>2'?OJUE\4(4,\S\1FIUG3L/WT=D*-5,9(^/4A#/#0.ML9UC/Z +MTL^^8HHV.'%F(+!*WI[5II%X)RKF)J.9##\Q)7'FA"[JV&$1PQ%*5Z0KTE+2 +MTU/2$Q6)B+P*5>2)?H-3TV1/<5]O)#P]\AW\9@WKG0L\H=XBSY>]>:V^8J0% +M?UV!QQ_`()L4:%1>M0(E*_7C^$VL4:12*EZ9K>19KU1+T2HSHU6:M3!J+2/D +MF][^B-YIKHN][BW.^TCXF!CV;6\[\W6ONK5-I)M2LL]_B%""'PY'>XF]7DE?D2 +M6\!J=ZN]Q<58[^*+8WO3-5HD3-3:2N<%EF38;''2,VAS+CD#'.*U6P[LC7%&;"D\G;HX:UBV?-AU+`T+B'?3S%J +MM][95H="DX>G09O8RKR`H;3LSKS*F;;9Q6J(T;LCX5/]>B]Y70\0-QP_LQDT^;36R-5/N\6R40;M#0;W`BP&@BT?^-I4*9PW]C +M_\:1_>N$5ZX;'CT'\7[Q=/'%:0G,VG.EYTOR`+)&@&Q"OU&$K`"0S8Q!=M)` +MGI/GKKW$;O(B@VL]P-A$">_:4@--FC=L9I1B;[-U!99HVFWJE7%B^Z9`^\QS +MG#52IMF="+5/'1[=![M],M+-P#]N(3H;W@>R7_P08/G+I=2>D>J31>9<-),* +MOL0^;!E[GM0_KK_?E4='WS@G9V1?$,^JRAC!0_*W.4K`KSF0K5<3R2<2 +M'NJ[EN*+WE]QU`'YWB]NVUC?)1.-2TNF#8M/GCKM,3@IFE)O.P)2>9Z=ZH@>P*!G00V!EL% +M=K5;(:3-E'1%4V`QI-.)K8GT<;FDVZG`9_7TKE[I0919Z';*Z&[JP$F](OBF +M/BUX5J^%ODX:F2C,%B[6>`,;@2Y+\UE_'GF1]V`D;!U(`,A7#R4)Y"Q>O$`= +M>`JXPDF]$G)CR$WQWD!EH0:DW%6]95Q'0':HW%LFOH/ZP\)&38:?.G0R.\0W +M!3ADUJ23E_S\G_:NB+Y%!F5(#[[)L.YK\,GO)3AX9Y]A9F(7>3MS<;^-ZZB) +MU]98_ZR4:"5[D7Q&-[YCFD"@GM]/J(.%4^F5-6.":?JQP5OUXX*;].-YDC.[ +M?_Y-.=60,TGX7HG`IQ)^I\1@RX5XQFV5QU$DA3"[!,90#]/P0!E@`'G-3=$_ +M@_/+XYS^I`Y/.NMODAI;+/B,9F;J.>G!-Z#E-^(5?1->=7TRD<.92N%F# +MA'=YS;J]5I?;Y>7D^K,F9V<`.37Y%/#BSB$B,41;,.L3"=AD9-+X-6RN-FXU +M>;%3>K#3)P/>C.DDDYZ6Z]3`D3_L(Q**]"#.W`7YQGQ27FP@.]QCY<1_4L12 +M.N24PB@<:9;WR&PRB-SZ9UG:XI+<<^U3?-*)F^4F^?A:6E\8N;=UB:-JCY5 +MKK;J[3OKV7J2Z^WZN&TD'WFUQ6G'F<_:IPG4-,,_34W2JK:14*=]YS9VFQ@J +MEJ#:+H8Z=FYGMXNAV^/N'RWYN*.!.6XW@O9+;J-G\I,`II.&1C&/O,Z<1^^X +M3.*5^>U^B=B[^LL$9PCN7`'SN33VMC#!*[`?(>\/`V]*`Q-F"X"S8,,MYU-H +MBQN[V[V8K*,$V[U2@ZH+?/GM$$;>2/^2X^K(VWZGW8UN]^(&"!L,@F3E5>G# +MYVUNE;O#&WL!RRW1?WE^IUO"=+C)^<7&%B*%:/O_!O+STXT?<=K&I_UI6JV? +MTAYI_`!TSJ]J):'4_L_$??P96OSL.>!4F_I)'D7_=[5/-T[>(0E1_?A`@T+9 +MC132[D:&:HF]`@7ZOX4)]W[5^C;()U+:G-OC0X8J_@C\5@1[ZK'A1WP/M'DU +M8);=9/.!GIS=7OIZ<3Q?746XDY+MU-7G>%LZ,DE;*!%V-HT8#/#//?>_Z +MD7#-R$.OU(V$&T8(#QT);Q^A&+O'+$>'"JK)>5!TJ$F# +M!)4)ZYXH[)*LM..*>>0-7;Y-1PD9PD'@J@<+W[<_58>G4\'G?&AZ8O!G10]5 +MFZL#FB;;8Z5=OGWHY15^38!HMW.T;YYS^M//Q58FHA)@)=G1!Q1P?<3/JO,* +MZLB[NA)M@8=(A,O[HA+A5ZW;6)R)@7;L#*"LOV@\A6^+,A(ZDT%O`QYP>.4V +M6T>@*["Y]`E-7:'ZSE5-!RS&\^0=\1E\C;B";>`WLR^7HB/Q7XXP024B5*"6MBX07^"N!21I-QPDCXFY$?$3<]UZ0RCH0_ +M'\%,G@=-N;\F$CXN/[M/WJ.503^'^R0,FHYXBEG$ +M!=P&FJR@?S:$F;_W+N2D#'GY'3&7>]VM4M.[Z/82I/W*@_6:(`5&`IJ2EHYG +MJ)!I.)%V9!#7=)";T0QI$.=*9^`NS(0`7E&\6ZOL[UV+HNG3KZ9/$]-_#ND_ +M`YU,SZ*I,B=F3@3,\ATM2@WV2>E."SY_W?NH9`W)O1P6:6<-/X*X$XII2"Z7Y`4OUAVFE +M6#?/C70ONW7TQ)P!APITZ(8,-3VO@=JGR9.$'NC#1AWPH/D)43Y#[M)H?B2J +M:RIC\B;A0^4Q_D/X$)%/UY*],M)K\B?A61K32XY\AP:H+W4(Y[WDF.<@MU/( +M0/)0&O,:\ESPZ[A2E^\B)U2]CORF<+&A,@SCU`9R(QM!`B<8:+;R&PAIK_N: +M]=E"F0H!':C`K!C/B`9B4)^8R+`SGCE.MEH$/D +M=0>?:[$&"Z[UR1JB+Y"79L<(%UFDHX`F70FEP?.5'YX,B[Q>2-].0@>5'X/?%<$15ZY[IS +M1?C9=UB07B,D_O41-.5+B/_]2!O[6C%V/C"5K;-#;AJTES8YZO[235[!3>)/ +ML6U>HF^_6K@"-"A)EP8HHP:HQD20J1%&^O1>5*Z9O@@ +M>\1&\J5NVVN1=Q74*0V2X")/HQ9[WNHEK00,U'U&7IT-+1_\B=B24Z#Q4:&? +MBSTL&0D4R^GI0$F;ZR3DO"?3[#'25,@R,OIN;K-G9VF>^)+OPY'H^:#[V39? +M)+QLQ%GYCPHJM'&0G#NZ4KF-]0>.5Q(:3`$EE@*7)Y0X0:3-<<%/UT=76N,T +M2FB)9E#*"+42H(FDKH212/ACX&]O@=1&A<9$,%,V1U_S&LQ;*K0@4GWUI!`5 +M6ACYT=630E1H9N1'+#DKE$7.+@W]X#^=%8J$*?&L4"2\93@2_NV0.Z;]4"%# +MI/#JZ:=R\?03%1H7Z]TBL7>7AT?//T7"RR'W8T/1$U!4J/6F$U`%L1-0<__) +M":BC`]$34%3HP%7]:PXWK4AM0GMS.4-)(ITT1T';<\OFLB#-SV*QSN(VFCCQ +M3!C0;3Y%6^#6<@9V]'P?%7IA9#)+6OS:")':T,&1<.G0.$[#*"NQKJ(F37S# +MNK2;MJF9,G='0**-GN<;39L_E,"I25K&#;1&KDMVJTQCV)'PC"$UT1Y,Y,3* +MU"%)L6&]5(2$?3A=&)5A`[$U*5M,=ST0^\Y`:`ZA&T6RJ+RQ`-(X*S_A/@78 +M_VXH$OYND)S[J_$\-4O"D]4#S!@]H]K@WVP[6GQ3/RC^H.@!&;5O=![B9]_G +M+L`\K!C&!]HEDNZG@)M51LJ$=BSI9L&])F(3VBGR'O*XR$*A77P9N7?$++0A +MXGITY#:!C-7?AH!>-K[-Y3>^[%^KS0<)Y%1CA9L*G1G2B^\I3X*TNF'B?D`_ +MCB#&:-I'?@7X=&*\YC%:EWYVQ"^AF.LBP*3R&^6*' +M&2KC$PWR\TI:F1<);QN,K00!/.X=[.O]:66<0$Z[_#W@1VV:@@Q1/J#W5RK% +M'=9DQGW2BZ4!6UR2LG7OEN`6B38%^G/[P+5[/IKDA96!R@8V18N\32"5*JT/ +M<.2.L;[6R)3OYAII//G76D]M>L&BTGW/=^KP/J=045M'D]61DKAM;\H=H- +MW&!>-SD=UN@R:U761D>C:R?\7G'BT",#)2SV2B".,E!\@[;!C@4,OTC'<38V +M$KX_8N5R&)NS7!KM7YY-+7ZGW^L-BJ]^R?-2FIA\B=!7G;]>8V3RH[JC1-=% +MP2R)9`O3.7(CD3:HI/W1-;+)P`$FDZ_1()E8^T2H%$6R;ZAC$LQWW-3FXL:3 +MLDB*VR(R(5/(7Q]-GPN]M]>0?0.LATBOB&_V!&J,OC:%Y*P:ZL/BF^\CX0?[ +MHI*FO\^W?A1&57ULKP+@*-4R`,?DB(DFH2O[;N\E\]0Z):G9+"DC4J +MD!?(/":ZZ(*8G$#F/)$9B`Y!,PC1,O*-D`K5]$WA5$ZUN<,>Q1]W*]&)&ZH7 +M5FM9%'B0(CC!P$QIZ$NBD;;32MSU?2R]R$K.)U"AK7TU&F+7]"EC4E8TW`7^ +M[WM3;'M=.`]G[C`?M.YUN!<;Q5,ND?`WD>@W?Y7-G'X$9,N."CD7<.'Y6'?4 +M3+[&&Z,WO5%1.C2ZIM[7^F5LQ8N\J/UYB91/@EGZT:#1N=A#5L%D?#+X_S)H +MKW\_,0NF'P +M&]!,&ENH`W_AE&:>2Z038'80::,F>*8D[&IQM2D4W7T*67>+RZPTHQ9')/Q" +MY-T2\,G3N[WR<20<-'P3'7!TE(1<3?%*:\BA@E$-]85<;T*9(0?PXYJ>>HD! +M!85:P?,JY$7R6=UY\AF0UP]Y6QP]];]E92(/EAA2>:1M=S3[Q+<;8?Z3][LU +MXOO=8WF86<.I`@6AR<*1.G)Z`])6DE>PVNVCU(:\(`027?\QVQ[7$R5FA7TN +MTL]YWZN8W;W')87:]CBN^'[.8;TT>,6'A!<%A3X=>'BH!C%&-PH9AZ^X$`5V)>R5RIN0*\4PX2^Q7QW7)RE\+T?O(E@@J2;PYRJ)'$*,2;#B;U +M/P0U^^5<]TORQ5`G(]:Y0]0^Q@3U7BEYP9UQUNB!SMA!GFCV1,*_']EV]7ZE +M2/C2R#3!RRG)Z]][R.IZ%D^^8&AY9STV.FN=]4138P#"GCZIH!1?`X^$.T=P +M[`5I2I_`MX@W0H!\,-CB%4?-W0+2&4#:_4/2-L7\[I<4\Z!ME-BVE3!NI50> +MC%O(-1Y"0@X9E*Z&\7L)W%<`BU+XY>2.A4;E#JQU>.PUC*?90W#LV`C!HT4L +MNT=!XNQ@;8:B#E!&;,X)Y',E["^15[@@T.D`?5`=':S_A/B)J^=%6V,56 +M9$&=LH&KWTFURM:)K-G84-,.*55\.]!=!=]>+S-(@VT`07)3S>[8J=F\UC'% +MB!'E2*`9G5AO5C98$KM.K"_((/?5;!HA +MKF7&E,N_J7#;'=!@B:ZC5XF9V<5Z3]3-"GZ0Q?><@Q%,4 +M0H#IO9\Z&RP?GOG4"279SX/$.Q+.Z@NS;0%RMY84>NJ+O5_[32G6YL6^IC-> +MF6)&LI+<(C;C'_R7)4;`F.AW=+7Q[QP./3&,])>"G[!MSF'0K?-!OR3GM)5Z +M"W\99"69OON,T2<4ZVXG>&/WMBO^=-:O>*>;W-M$OL3CT';(_P9OA!D0C7\5 +MXG]_-AI/;JC;"/&_Y8G4/X/GQ??F4X)$]I\2)%I.YEF2JJ$^`'.UK?XG^O'! +MYNU(<3@X3KP[\.=GQPA$4F"\?FA_&=0PF4%K<#ICZO2!II7.&%_C_'7D"W(C +M_PKKW^67H[/;>W_+OES4'F!T.+_=WQ#8A5:!Y#$^/<.#3>2-Z`:_VD#>TVOP +M^P,[Q!TJ*#W/7@'0/%%:=F<^66/Q/@OZ72-(&JSWF6*]>SC\V5#TZPS!)BRN +M?PR'AX?)7CG!]_,2]5R"UV\"?2![WB;T$TE:RI\%OQ3\8_MK`@=9P*[@?EM7 +M8)IW%7IC99>F*:/&C[0U;I765T'6!`U>"4]NB6C+DPK$_@G1&3->JKBC`H/$ +M,2IC1V_(1'O0`33E8:"=VN##1+]2X+/MBO'=9D5"-UEI?F>(2#W*]6:TA3,K +MR_)9!S4E01@-VRR&!1QXRH"6I'YE"!W8"F6Y0$>_1MU=09+^O?4OR1.[E=5F +M5!'+1:@MF1O.2"3\PT$\)97),R\-HIF(IZ:\I*"ZR=VDNX9(*FWP)86F>Z7X +M;2V.+X?2`ZZ=U7Y-FS&ZZT(E%%\-*[>E!OR::#B!\8^'$"/4,#4)0B0\>^@E +MA;+;8BN;M\=5Q,4YS6*Z,D.'FGL]&9 +M8FVP9]I2G'-L38$F39R7DTN[(26Y(1#TEO&LW^E74%.1?O/[&AMBROPIM-*- +MM6JZP$W@F3`TSG;%5S8/B]1?`;PBBPML0X"[:MIN/.W#H$G]L4:YJW.G.8-H +M4Y'PX"#YQA`:%$3*36C*9X.]M8B9(?0)"'T06SO/C>D@9.V#?$LG.@O9V[0@ +MMC9"UD)&=1B&B=T_"LA-UNX)'2&TQFR.'K\A\M#Q6@P])E`>"3\Y4&W;ZU1: +M]]B/$^DK>-Q+[NS\#S<&^+\S6$EZ+-_<+7X7J+;;4IUJ1P?@Q(\X,EY"O0SZ +M1N+8ZI5RPM?M(W03Y`+/<+ADD!+T`F:.UQZO0WHFF`KT?ZC*`3W.-X +MPD4G#H+D6JNO$66+X!'`FWB>N)L]"I[@&^$SDU@4XDGL +M&CX0'B+R#!C_MMB>.3+F9)S=K]TZURV]SM=5_:FA1-R>V>KJ:D;-!I#:#3:ML]C*\= +MY')R)UG+2)(0$:D@#CT#5)#Z%.G)[WFG/1YS*^Q%+92?R1N.H +MM*$6:7\B\`:UN/ZC%.*\V"#CR8V)+A&W#X1,#S*[H7%H^T+R- +MW*`*.66Q';S,0.]+()VH\UF`.U*0?;\GB\KFDW65=WPO$)W,B*=)@N_X%--0 +MD'*;^ZRWTH6D4Q)Z,_*-7$HLAM5WIC:^+ +MQAR)7.R5^,08H$)(?J&W`_BHFM\?_T0,EG)5-(CQX=0GNNW'!/C5&\]^78(#J` +M0_ZA40EL.=>QI9Q+8LKRR4TUD;"[OY1%6K6QO::$*RHRFLA=-=??5'.\WB;> +M5-/AE@9QZ.UAK'NFQB!<\2V,W523*=Y48Q5OJOGTZDTU&I[<"X;T:;QDYO4W +MU>1"765Y>*WQZETU2\7V&8=^(]Y5$VTS-VBZ>E>-(7I7S@#A"\"8R%K6H:_GL$ZP-#)>EHR\]J=-Z"[#!-(/#MXV:WO_8)5MV)OG&%F +M%SZV:C79*90M52:HTS2@-C=X/[$U:3*$!N]EL&\!^V.P4\&^!'82V!?!5H'= +M`[8<;`%L"NR_@8T,Z4&KE]R9G'Q>(1"-GFCR>V)W..Y:_:`&YV366+W[+7WG +MR+UY)+9AX!^]Y/8^XJX?^+37W?I6$:$N,[NH8^-71_MZ4L)^R6GQB,[6\Q3[R$16B%9S;U''D%',6`'?(*1[GA@[UI]OGAS9.*K<_V$=F]VN^R[ +M,XORP$[>&3OJ?'X]SA(3`QR,STQ@:N1'$4ML5C@U\E$D1<[#.>%^&N8S`_LU +M,)]I=;F:RW?G*7/`J9%W(C[PR1JP7QC]E%AVQ1C.5Q.!QQMCB)WWX_!NIWH5 +MCDLI`<0?@W&]F;%4W.U[NVI%:=D:IB0R8H_--*ALE.)[80WKB^%7+@AZ\>TF +M!8'1ZV)J/:YK+51(/X&^Q[;RTA[\,KO34BFS%K@X?A8'O#0 +M%`X.TURW[_WAR,C5J;\?IB".OC9,A;X8_SOX_7K\9\,049IIGH2>'+LR;.RI +MJ>+`JW(0@TR.7)K@8?XR.3(T08-T7XY&KWP9F,;&LSN_L;%ZE9;%)WS5*S2L +M=:6P/#+R:XAE'XR4N9P@P<)@"+0S3[&!_/!*%VF_)E'6:P)1ZX+N9NA-!=?- +M"7."[X_B76(*S?NG8*&KM9G.RPQBN>0P:<<(V*@\E4@*4N#[/KL<7*4[:$`);2*J7P'5V8[8Y4349&?C@QW]4J.&/Z +M?2#8*E%\`L1.VF"ZR\8E2(PRRSTP:L`YN/#","%XS[?&XD7T!]U)4=\P'3=F +M3_L+3=0O3)#H^UWH4PI;82)ZD2/?J&&D_'WU&%QH) +M,]QY'\IPJM;$FJ:E[*JW`R?+>NE +MVGU::FE:,"FKTG':E'Y@D5;E*!%>//#P@37T0XX/#Z0=7*-^R)&FS70\+EAD +M>NG]_V5.S+?PX!KM0XX]PHL''SZHG%5*+WQ*.2N^^-3#3REGGTK[SG2M;XAM +M.LJAA_D#4^P5LFK3-U-64UZX+W4?HZ_>QQC:]S')@7W3,1_&>OB>`_8?XL4F +MLZC/7XZJ6:U3XZOP&;D)Q#Z&NR<0PTTAY+-$_':YL$PG9"_7C +M]]\+RPEY>/^>O5MW28'NT.D +MS`MHM<_($EXE(U:BC4E(?D +M10;&QP1"1WI:NO4_2@2?D/SZ"Q79OWCK'[KJ]E1XZM4O==7+@BC:3"2K2P"] +MB"'MU>0Q[?5DN6[`C[BUR_/:5L^VK*T4W[5M<%N++:N! +MK_M?\85T1VC-W5L=%$X(M&P0 +M3@HW0+/I&Z)?9"^"WR*!A(8BI%"G?%7^^V'EN6?HT5&=C,B`'T4@3RGFZ8LH +M6/B]G]@)2?H&(6LW.3=?`1FOPAY@\#OTY0*^07$&>D<090%+7XXDNA+=O)`J +MX7.V=[WOB2=%TS+MV[0\3WA-_%C4W/TR_&L1_`8]?NM]LY[06_2H-[1#T-VK +M6-/)B.I4F^Z"I+I9S#[K`)\G%]GT@0N2^C3)3A54IZ[KRFY>D'[LN""LDG79 +MY,'E`=9ED%A7Y[8?-.2RJE/^%46"^O2MAJ%M%B_^M\HW6+RN)E'Y-8N#$-3'5(^.-;#S6>1^>>2"[K)$W^1MEX$_WG%9*/.2@OK``2^, +MYTN+@SFL?_E2Z25=5Q-]\ZCC?I`NT98=&&S*$"P2(J5>EKJ:3D&IU>*3XMEM +M"]C:NWIC(L(N]&Q1KB#&E/^EGF-WP96?C)&\G0$2>B+2*)/0G:D&F3ZY6J1. +MK*\D'1D2R24Y5%$&Y!M6T$(_GAJ#/M('"#\FT"_O]U(=ER5R&M>CD`)'((OU +MEV1(?U)QK*)-U]FDNDE.=SBT05J&'#8:GY_*VV0=;VXBEKP@.85\BQ4S^>:; +M.NWXK)SN8&3ZI2X[S%,[/$V5#7R3IRFC8;]W3P55NE\D?.>V1P1T\EBJE.LX'Z5.E(@D]/T6RV8T+Y'S9MVMY$TIO5:2_$2;RG7J4 +MYJFI4M!/*4C7/(783X5C#[#D@>$@7FO":Z5XK7$JT0ECFI0@H??2*^_[D^!6 +MF%E/]>Y7_KVJ&QZ#>L:$/QJ.]BGV[R4FBK?G[\%_O",CYR9A.`1_!K%9Z*_" +M)#0?TD7C?O!WB56\U+K#M8.$!B/8=9SSV[SYN"&"*D&37V7HS= +M1Z-@-YA[T92P05A?)!6#[,5TFRVTAMM+I=(&1"U,0&QUB1S/.@I +MNP!R'I\LD3/T>FT:M-19RQ3IY02%4@%E+%+)N4!#B:+Y[C92L^7=[6726;OJ +M(XN0L.,HC*@P+DT:8W*G!E(4N9.">ADQ3/6Q\YI`@G*>"I)0_^1H;R#6W^_% +M?/FUF`U@_[^-YY3^PO$*9;!/6MSYZ%E+4X7.[;C2DM^N#5"6T@!M61DXZS%[ +MELG$4AP0MR,*,@<;%&X^2\!9\MZZFT5"WN4ZL,]JL^OJ +MZQ96FG?<)ZUV9`K%TOQ*?.-MF9`AI,CW29?MA@\RA+[M1^U,?[#Q*-APZHYD +M=[J4X4@5EH&\X8E$D*9HEG7C;.R>7"C3VS'Y9LK6C6-ACEI"J3ZK69 +MVWW7MK&]]V)M3_6X7*WV1HA#G1NI=FSI[$0%W#%ZB3Y.\JD`_6SOM^(R=D>N\;I'WUGE31;.7OM`!QW0'+W$653]7 +MR@L@@YR[N.Y].`*-4QEKRWQWX?&4&M-B=YL1SA*8?4HD/R%@%O72)F^= +M.`_2S6*GJ);-K(7;& +MUG\^KK_+_]5Q7%_SQ%1WKS+^CY_;14)_.4X*OU:BBX;)[MZ9?%\8[P0_NS!@ +M]I*LLW9U4`]W;$HP44B216]-K%\[O7A6'31[L7?/>E.%+NB]8PI7-$1>C.!4 +MUJECW.#K>7N71JGYX/B%703N.E(`D8";!^F+@B3W+[99FBZ`Y>2*6ID7O4WY +M334-EJ;&IM0&T4N5BJ)ENPYZYHBYIL9X5Z)OCN.7#@Q3ROPA]/XXV$]H_;BD +MC+IY,.[@"CLB?ZZ,.^7@^]>,^Y0X!N6I2Y%CQ!=G=2'[Y@4:^1[:XIUP7O' +M5)!>_470M.@3&,NL%W/<"\&OKN!K!'-5EAONI&4JPR+3<\13PU5215L,RT,N^. +MDM]W,=F5Y'9*!HDI/DQ^0%YXY.86JNSUC)O5*\RDP""H?DFM<@IZ`:)I2,E- +MMR`1&X,K9`DY"#(/9/SCME\D40JF(&*&_&]AJ;+D_PY+E29G!J8Q5.%XD#:> +M&1RAR*"B$;!]3RAEN(H=I-7ATR +M(L9J[-K+,:P5Q/Y4(PP9%\VKAKQ'8GF-@>=N-<>.L;WZWZ.=JKAVEOTW[7"Q +MO#/+&V+G<.Q`WR12A.Q$;)4S9-VTO!\71?F@.'NL_4V#*N3'UGL;HC+@M?=V +M0QC9QI;YX[U]Y.7&%\9N@_Y,E)R&JD93(0\5XRS=7#% +M.EL'KUG_YSH(_@X=V(SW=&"S_FX=M(+<)K"Y:3T<`7K:#A";!\?Z9EUTO$+] +M%,1T3!'_+2QO*HJWSWOZ@C8S#7"=4MHZ/'1G6B]<^UU]AH!'*L:3#MI&'*(; +M,_0#9IAY%6ER0L$DBM=E]PQ=4OQ27C= +M"&VKN)\-.A%'&_J=6`\-E4"JAI1`RD!J@-T(^SS83;"SL'.P9\.>!WN!DJ=] +MR!HKLPS25;"7P6XS'AI:"RD#]J*T"?V>'K,/YPS=3D0B^FD;C?JE'7:BC/<:^"+4)_0WV(&XSE*+#UD'^2B?QF\O:EF`Y03]A.%*\_/)O^,([^VY;9=&]<^?N/S:9O?G?'72]IG4V_%^/T1<7IL^>YV?2;1^/Z)^[ZK^+J6Q17W_(X?L8[XN0'_:&=,">C>*IS +MV]PVM\UM<]O<-K?-;7/;W#:WS6USV]PVM\UM<]O_OTWEPA54+7["M[3@_UE? +M?45(NLLMI5&T#W_3]':?4Z*L^`^?[R+)GQ=,1ND<_ +M;SV>\8&)]HF/?MK:9KIN2M"7^Y1_QWC*5^X;&_;3L['O:)>?Z+=0Q?IJWSI\ +M#]/7<[B5RMFII=DM&53S,]V,)3U(L<:B8P>N'S!MR*9YQ[+68W8ZL!=^]7`E +MW6DJTIIQI5TXK(UA!JFRZ^E.NZZ?8@W*535<_=?POP\S)8O4BPRFHA/^H+\V +M8V>%R>RMH$+_'#:9>1;?K>T/_WH8OT?IZT%<:I)%\IC^M>L_KYU&FJ9*#MM' +M^B)9@P+'^J5I7'#"D7Q#?X[W=:`&A1SOOT%Z3DI"W&-KN_W+OFL<%;H8>S/Z +M*SY!TRIIN&L"HV"+1^X>M4J,4E^KA&\"^]:MZM&PU0D,S]BR72RKLC(^MR\R +M\IO(5=WX#5P]>31L9BTLKB<['T.!]?-?<41#":!I@>++!4I`].M^+V7>I$IU +M](OI+LJ3[BKWM'C>]%!>O^1;%\6LIWB7*HHS?8^.HD]C?>52BCE-W>$H%\JE +M5/A%NUBE(31E@!W74SG?]-*&*)[:(G.'DAZBHK0Z1ML-L?-*/N3JM)?C]8[3 +MXNK*TUZ][;18ZB9\QZ'4PY3F7>GZ]BAB.FE=YK3M)UKFQH,NAFL5H]SA*AGD +MC>EAN$(7%4H)%[I4W+4]T;6H3$\6G^UL$:.2(QY8/[2;H^"\Y3BOMI'0SHEI +MO/0OQTCH/]C[%_`FCJM_')]=72T;(QL39+.0E7Q!,A@D8\`F))$M`KOR!4.@ +M)5P:R<8@`0'9!B+9D,J&)#(DC4W2%DC:F)#T);?627%+VJ0UN4*2-A+@MQ"2 +M=@TA)FF2*FD3R3?M_YR5S*VW]_O]O<_O>7[_I_8SFIW9V=FYGCEG]LSY[!]& +M_6(Q`8?S[+B +M'.CG+O'F(VI'O_T37NOHYTB.&GKPA$K>0#G43)H+0KEWR1[TO^M/:?C`3MA, +M?1NUDTS4E=H>)8_J^$S*K#7N]__UU/O=-.M\YOE1O*=LH,],Y< +M0VOK._976UMV:J6OXB2'RD:=H+M^JG2]':^N"Y?*\_K]"6[\$[R@_O +M756@)+WC&+P7/8>G`UZQJSXGP#4H9# +M9=2'NQH&^G]<)9U.9,_WYQCD +MQ3G&J1]2AP^N(J;D(&7*#AW4/;"`]RI,Y.08ANA)0=J'2<)!'>]%/13"'N^G +M\G;KZ$*-<+MN8N:C7MM2RO(TU,X)SV!\_8(3`7E)1]E_?T"F4R'"=O6;&#&R +M3L13[F>C_@H%*]3CB;!ST7LJ\=1OJH7>1X6?C)H8+Y=A80UL,17^491F64^1 +MGENVB9OA'SU1T[)'*_EH4V,C3PP!#R6=D/]-E&)W]'_9?5\78>GV.SAY'G%] +MI6@)]`0>U)F,QF^;-W,I9>Z"5JV68G/0KE1`7MQ9]O8':)4;V_61?@LC +M.RQ&?A63[`=$L[GKVPFUB(NC.15*H.5Z:&>M66E0,"3\A8CU5NPGX4_$K$H] +ML]XGWY=A(>'SHFX1GKHLTJN74?OU_L,>Y3X8Y493"+%0J7!6E(9RR)WYPJA] +M]N*$77;4HT>[[8+\BLUV/$.$.N5X?@CG-*YQ]Y`KYXY(>%",7+920,(_%^?5 +M*]@HGH`+_TY$/:[W1>4^/'&)9V2`5(3?%FG!"O['(L6.[_^D'-I7WTJDN5X] +M>`IHC:]4LK3^JF1_O56ROXYV$3N7.K/U+4[(6:%QODJ5 +M.>2&5QUG[*TU7QE:'84&NS-.=>,8L#].T$)$V-`>T7K>@S=GPFR1!S-TE%EN +M/.B)G*KV:%^FS6CY[ZT**ZLL8CTDM\ZCAYFJL=3Y7^-(>*8HPKAUU'?6"_5L +M0T^5HP%/-)HAQ5PS">>(N=M>EOHB"^*RS#7;2#A+=/E(9I89+?B[?-T\*YW' +M4SL32*?`/U!F6O\3.^5):Z/,^(N\A9SU+)1)]RCXM>H.\R?:*(^,1=0)PIJ/ +M/%&N]JSPD7SUV7T5!EWZCC%0AV<@IK4L&FU50/A[B?CM(JO;S%LGJIW%B3,[=Y63G(FN'/VY`#'( +M;WIL0<[4[+/4%-LJV=3DH&KJ^)!-M]JK+*!.?:%*ZAVUI6?3K?3.M=VAHRU) +MPH\9.CO+Y@9.329@/,8^<-L?S\CR<:Y^W&_G98:Y%AR?]MCMG,KQ%?/%Y"-E +MNI/C5I.IXX-IF97>Y9-79E(W[2Q+_K"\?*+N\2T/>B?5CUM=Z:7,\?B_?B`K +M.E+V\2F*_6V_MMM605B]EX1WQIQX7BC\W=A!KW1>+=;G1=M9=\>/!WQ#3?Y,]6T?AU:.$I@CJ).''`*>JU;;VIUB +MI'T(<7TB(T:.&4LEWN2L#IK\;$-6(;;8@:XHX`K:XR%*[2> +M=%/L1KC"LTBS8Y.X>%J,\)SR6&T`0WN*+@N<$?`38/[?T-;\-V(E]+I9G,/ +MVSJ=G6XC_&))]XQTNC$&2W#O2`+G`7C&"#=ZLACUZDCX\1$*>C^U0`9K67PF +MA2L$=UZ*V28X!??!%+7D\R3NH[T]P7D)QNU*J-\/8&SFB:@_6"T*[BZX0[$? +M]".^\Y$1@>><`:?`H:5IRJ!FK.;6^E<;7VTH:ZBV[/;$*8BV&]]/PJAC_NQ( +MJ(+6F^<=;"3ZOD9V"Z5Q;J%2#FYYCR>IPA9H7^F$0[9R1:'VB7@63_ADOM2>U) +MZ?D%9RZ6,>S,_=O.;LN\&ZU9O<0?K0SL0:O-@9T!6#G0QS/,TQBV2/"E&B>< +MH8SC3[W`H[4,&/E0_\-59NF4WO/2F=F^RV=FZ6"GCT*[>0:9'GOBFP32/6I0 +M1H=5S$'?`:2JR&"^I6.9H8EB'JO(LAR>I&!JZDGXR6$+DV$Q +M,C4^H+?#8F2]6`PS[.PP97C"0\(7ARV7UXG'A_?P6%ZM5&ZMY.,*@6]^:?A8 +M?W'W/154KJ/HHJ?3&[>0OV,0K9EMY6ZK'Z41ODHLVS-0-IQAWQNNKR)L]>RP +M!^O>F;"K?Z?HYDJ;T$XE6GI.@CHB>H;@:<:9LGX8Z[0YT3IX:AAC[QS^]C4K=P?XG4W+>*6!J^_T5?!6B]JC +M+#'"D^G#G'0*^/`D$DX9/NB3L;0)N$AX@QC9);57Z;#QP;C%O93A,E[PC?;= +MCN%2/.LG64#\[O!OH(UNKB0YG]7/X\3(FN%B3FEHN0>$6'.AB0EJ/M":TH(L +M.+,I/6@Q30S)]"WUDP4KQ)1"3+4I/:2"F/'"KOIQ:#NL7BO0\#M&D,.O1E#` +MKTIHK5>`\_MR>?4JE@]L-%O,:O\E'^MAO3?P:A@-><,D/&U8[\W@C`(A +M*#\@;?E`$3_WAG1E0>(\\^A9YO;$V>;1,XY_2]B@?@QXE1^#NRUAFYI@7JO& +MPEN*$\CM^?H4KLR7PFF64I-2@`I4#UV>R3E)G-P##EI?,:#F=CGC\VY^0I[' +ME'E>WJTVE;J;'$NME/Z-$\U +M_[8[.27+]K;S;??$[`.2+T_X5LEO=7?":M7J/.ZVI[3;CH._.T4+/J[`HD%? +MJ,PF>BOTLB,J&FZMI`HU$$;ZM3R:FI/-B`9+(='/A?O540R50F@.A'@IM!A" +MLR!4%J6DM&D0+H3PW*B94Q:W^%0@#RBAMUM\!?;%JPKL'=O\O@+H[P(^V/)G +MGS@U(YC/3%*E]8[WCO$L\U9ZON]]T-/K_9UGO*]RRS+?F*W?]U5N3;X[O6E2 +M]HJE;WM)-EO9DT^'IGG>\1!AJB?#WJK3SCW9+.:3H'U+^E4AS=:Q=K]N%!6, +MVRI&LJ-BQ!)%RA\`IC(GFK`)2)(4\;&!?;Y&16C$BAK%B?J8CH\#'!O#"7MO +M:!L#>+B%9*%ZH78AR%,+C0O-"XL7HMZO/T=[GA!'6:FY4"!:I^%_2X]Y+?7_ +MGA[S:V,+A4-C_5+Y1_69T:\BY,\+*/)GIN?QBV-['A`HPEP8(SR4/E;HI"1= +MK)Z'SJ,/-"AZUV8R@L^AGO`\>`9U51'S4=+OAK'-P;A&WH.$210YM$\25C'" +MDO4ZD&'#38/D$>K[N!:3*-V>Q[D7>.?C-9X/)$_+3N!UW"T>C'/@)*J"_+Y" +MB\YZ54T\II1QUHS>)?K.FM$K(7'%UE[)YQ\[(P,25$(RQ#7\RIWX')?LTI-1 +M+',UU!5U%;765]309A3BF8^!NN+]U.K.OL70A@JALX]8._O&:#O[-.;./A7I +MN>`(^L_C\W)1_#,^HPH>NT`07DP? +M,$KH0$8O-8N$ITBA:(B5XE@O543"DP98*0Y33QA`RD*QNH7Q_6&@ZX3?M,VY +MT;V&7>2I:QB%L8=H]7SW-O>:.K;,QZZH:]A,R**K$.:7;5IS.P +M2^H:MV[<`D2!Y:Z`R[.UFR6`^[HU\,R&39OOWI2`D;\R+G\.[8\ZTJ-]<+4. +M8Z4:TUT);U9=&WXHY]KPI.O"!=<]_]WK[G_WNOS>*+XV?*_]VO#S\FO#ENOR +MZ[TNO[/7I5]XW?VGKKO_]/QKPXK;KJN/XMKP2]<]'[GN_ELR6#S"-U[,6``= +M-=JF#XOTZ/6?'[Y.QW?^E726[\?OX?,.2?R6NH:[W)M&AU%I@WN+ZZZZ+>Y:MLY;6^?!Z+DLX3=NK%L'B=V;&K.BS)HJUPN99U71FP4NIEC74- +M!6OJUKHWU:U)C%?6\H^C"X&D;FVH8[>Y&[9LA?#:3?`&*/$:8ILZE=WHKFEP +MPBRX7/M_\:TFN%_2TT6;K41==4T<09ZL>`PN\FKM&F+>NB;QC%Q&Y+^:G:); +M5L7]R^]`%$5="0S&77Y2?M*-1"1J]>B-?Y>+*/UA3AI"9/`?S_N?_).$NWQ% +M77%7W2:B"OYO)$HRF;#BKO_#QRVPC>0Z1!F#/VDP,,?X,:"RP"7"6XRN&QP1G!( +M[PK!W:*.OS<,?[C7.>IPK_-_6+W__/W_P=]:=\-==SL;ZF8XM]Q5MS'^>Z=S +MRYS9M;/,A7?.K-U\5\'='N?T&O>_(DS_YL\,?[/-9O0MXG/^T&D1.4<3Z])0UX8FV+M+;C^2,M\,\, +M7%-P3PW^*@K/*L77?N"=^ZYVX40>34X?R(>G\=[W_J@\P*7.)OX +M+:;SPKOLXQ='SRC2VA9!!N^4:TO/4T'(MS,N7SP':4[^DS2C=?#C>2KMSHO> +MQ'DNY"G]<(WQ'C9^E@O/MM'$+W@PC71&K^7BJ\2O`W'\%&5!:+I/8:G[ +M="/P\1W%Q +M)!GE.3-Y\1(^GP+/T^`G@2^SOGY!7KT,GMN5,PS/?`7/G#XHTM&$TSXA_E]B +MN+=77'#7I#QLN_!_C>#^7?ZX&W>+1O';MU^%W_Y>S/MO\=OKN1YW/==P#7[[ +MYFOPV^_Z!_CM3R3PVW\LKDW@MR\4Y>%*,>JNO0:__9<0:Q<1O[TM-HKLM*H< +MD=F7\73JB@J[Q]'$-B`ZKLZ+5L&UK-;&>7@)A]TCCB*OV_\%\OJM%>?=M2D' +M;.?_!>ZZ/T?^3W'79_X+W'4CM*T.=^(DC8/<\O?==Z3LMKW_?X2Y/L%^RIUL +M.^4\Y=X#O_\.$+L> +M/]T=NQH_O28VBI_^]_CHT7^!CRX/_W+@6GSTZ/\"/OJ9'$*O`?HS38%V8.8L +MFG,-/OJL?X"/KHG]4WST[OSR3-9/,?+)NIGRB2FM7>3AW'(K],&N!2IY+I>3 +MDEU)]+>F4(_AE\+<1Z@],,_T-GI$%7Y>+^R^?)##7+_T=YOI'5V&N +MG^?EX<^C5S#7_\2+D?'78*Y_D,!#_T/,];?*26ZFJ[4KT"0SRL]> +MT7S9'7BS_+=5)W5+O>.\)P(Y=+;M$6^./-MVVINCS+;=R"SUC?-)L;Z3/HQ/ +M5XZS?=7$,+H2:B\5=@U0![YJ0)N!N]?SZW]:7JR;Z$+\]![=40D]7<4\F\!/ +MIT)4;HI`P<@##BR.F9X;QTQ_"#'3?C\4!PW +M?7D"-UT>/CLTBILN#Y\:0MSTGPQ_W;_1'CZ2X:*RGPBL5!KT)W6+5Q$6]8;0 +M9O"%0(X^9^K`V66KE`7?H+U/"15:)J-ELC%?]-^>^&Y^(8`6]/>4_?G,1_V+ +M=2F^5&:W]QVOPO+`@I@^EQEC7<;+IF24G`C\5O;29<3RA\H4[V_S;LO\ANAN +M^1[BE4-[?TXJ)WXQ8=O8K1)>>4'JV@5;5_,J?NSOK+?QC*7*5Z_D4RG3BV=O +MX4AST<)K/('O/24>;8'/)\!G7K`*\^=!M?%%5N5=Z5FS*,+F%`A]Z"W +MNEB=-\OVH*?-RR-NN1F_^4$OZZD&I$A]W],R'67WGE$S._O[OJ=C]I<]!-<[ +M^G=[EZ!U%H.F'J_VCE6%KL+-MNSVXO?JG9[5EW'5:Y/'QI +M**/RDN^&"N;OL,HS$UCENLM8Y?+P)T-F[YM3_,8B":L\-X3/$Z,^)+\&JYR0 +M[8KX7$9:G0%T/"_[6CSU88A?0>)T_8LL\"$\BG`N#_]T"/%$(U*>IR6$\Q#, +MX[_QH_CFLK`8(\99H7`5ZTN]Y0K"N3S\Z\$XPKDE1H5_-O3W"..5XY3CM^/': +M\2G*%(+VII8E\,W5#&JH(+YYNH1OOFF$==W6$.Z/=O]7%=&;793AMJ;2!K2> +M_H!.[QVK*FV^=2QMTH9:FMM4ZEZJ^:#]./'K_&;K!LHL#R<-F5TMS2=4)\:V +M-!9+2!J&T`\X@T1M)DBVT-423O@H$KH)QD1D,(['\1`O"\^,8<^]F5C_\-M> +MHVAV69N^Z%[I?`7_6_"*ONO,="W\V.8ZEF'O;1Q;8C*\?'/>=Z5\,_O +MKD*,R0L=,]U6.BRWIFN1YM/ +M9(WBH:^]#@^]+H&'GB;5<[6$A^Z\!@_=+.&A?S^VE$'T8\C +MC8J1I*$X6K<"6G3)HF--J*%5+"&,44(#W"DCE=S\\M85*S>,%_`GIXKH4P1@1B6D-85-S51+#45[?C>6MY#>G2-I&?%+>7G +M`BOAVJ^;92^\C(8N"Y78TUT[=;207[YBPS@=HI?+P\;!DB8JAV4H$^8Q7GD]L:XX&\@OSW+QI$T7QS._99#AK.;Y]7+]TYYT`6GT\(!%0C//X9-/*(S8ST(97$ +M<=E!7J*KJ3BO@VO]/ECS#X#K1'MD:!,,W&%5G)Y4($8[7)^FX_3C.;@^#OF< +M5A+:*NGRC1\V)GH"<=/G)W#3K8-&5Y1_M2D@H:-H&:#)0<00PZUIPM75[(WX%(F#[-*ZY^X-]:C3;@_6I4DXZLL&WN>N:&.?E;2@ +M*<5Q5W*"BO;R71)ZN@*HSJT#<5SK<'^(]Z@T'4$><=.3]FH8:V&U1=5!C.J] +MZR7T=.W@V[RZ/D/?I22G4_7'$\CI=FE>QO/X??^KO-I'ZS7&I&"&,3DX!RC^ +M)F-J*.F`C*WV:(6D`P3\%"%I'R(?JL$O]2@$&9M10$[1;-*!:@_J,09=Y%&= +MA/"LL[V&",_S!DYJL_?9R+0??WC21=LRF$Z8:PY8H5GF^_TJ*4^'@ND],ET9 +M?'WZ^.#IZ8B4GA*;+*CW':OW!AZ]"BE=LU^,W#*8`JVZ/YHJY`MBY,.81GAR +MNB9X9+H:GJ;@:41*WUNN\[/,VOZ='&4@B)X"O14DK7S2`:MNL9]$,[,?I13Z$_1RFU6GW&\J"/CCB.IW#&R6<-'=MM^I97HZCJA^38&/B.HNFR*)QA3"'95^J'OU=*6$ +MICYQP*\LD;#4%W+^M@SSX3+J%%.0>E(E8:G;KAI;99?'5O#C!==@J#-Z*,G( +ME;$QBI].#FAM,N$:M/-YE]'.IU$?%#//?CSS,M+Y:0GI7!YR!`J@1XJ9'WT\ +MPS[!\8:?WI]T&>5EU!%S^ +M21S+$YV:X +MKH'U0&/5,S=8J/!S(ZCW7,P8/Z;VH4;C"_R+Y>I&G>L%'C'97^#*7!UER<%2 +ME^$>C:?F'KOGB7MV>\[?\[:GU"6WE#KT$EZ[4\)K=WJ<7EY9>/H).]&GNQ8W +MA@*,21Y2[Y/KCS44,]&+C]OWMG64*<\P)5878KG7#+:IBOP0;_]/20 +M8M\/>.)#:^VJ?8AZA;KDB.,N"V\81,Y-!2W>"KF%+N[F;G/);W9[C=[[RE$O +M_VEODEQMV[7@DO=^_KZD+N+/["'R=JLN3Z]9E>FR-U+YU"E%/G6VF/GYQ=1& +MDKVG49U-/?QGK^SA1Y7*WB=W)&?GJ$A0GJV>23V\K;QSYJ,^1!]Y!^7&HD-E +MU)EBYH<7Z?RZD.S1?3"&BIGVB^LYVF"54.-)HB;W7=S!PEMS#/\",QY'7,-% +MD_>P%TM]![]K@=J_WF?T(5+[,S[$:?_4A_CM`<"0H8.MPUB2UUI)SHL&YHNB/WSRM$R](%5M0MDN6@/_2YEOF.GM\P[D:=*,^RR7P3(7Z]@V]6F,:'6D=UP7VH"TXWH2ZXV]G:5-HDQ3:19HPG$M(\ +M6]7"6ESV9ER7*%:6>Y?RL.-X@"VF)D[D4K'EBL5(K<0?D^QG'<5,_T=FE[KH +M6"!IXC%_?$04,Q]^-,%N/C*.L<[\H#F%5TQ+Y>=X[NN;+DLXJ<#QJ3 +MW$FZL=PQ1XO;GYUI:W'VN()./(V"XQWG`8Y]G2H^=W#W$]?G80C73B+TG9/B +MMA:0D+4.U,!_RY[F#93)0V^69S:M;-I? +M1@>UGEA$&XOO%'W9_0HWBFN_3L).7B/AVCLE-.7O(*Z]NYKV +M-K6742<5#!'&,_KZ)WD7&;M"(>3#M:->YWJCZ=L;$-].C#PIHHQ&A60%<93[ +MDR.T$&Z*17X_\L]P[?<*`.`V^?<]E?/NP9&UU9YB<=%)KEQC0))R$UA)B8R<'PAO7\3M(6P+W!4@F9>F@8 +M<7+_JP&QJ542'S=;1,PT*H@QP)GK6UJ==KJUQ9^AI_PTA*IG1QKQ?=U#H]C% +M67KZV3LX.EPS1.]K06DZ>?M7W:G@106`"GLMJHW=.\T +M_;*)Y.B87Y>U=I%3QV7;@;*"L_0!DI\/?/=>+\G/"\TI/V*8/S/+?Z[]`),;J$`/C^;8&?-^-(9Q'"E86IH=E+)E&0B"E5`"_[2EA*,27'>Z! +M>].':'U?HRR^2BR"/?ME`&75!&IS, +MJ`WIF606<<_',,XLO-HKRAE2(`]21?("ZB3%AAO8!!+M&O5`_QH23__=R^F; +MI/2?0?I/05Y\UTZQXUU6Y=,!,D6MHWQRYO>J$_PW8Y.`6M2'CMM#B`D#5$-M +M2@J]8>_P(FK`)TVGO/O+J+,A[R<-K_#5)<=KR'17Z+?\I4!2F[PD4%;SX4N+ +M*,-<#S'\RF-@)A<..C7R])26+"TSMX7LU17+4`?7K+,<=98X=;"FDP-4\5'G +M7"?B/ZI[#S>3`R6,7U?<DX'A'+)?M]\H/RDSH< +M2]^W$V&F<#*P!"45W=/N9[Q420?(@&[W0I``E8)OPU@=2K2(8C9!V,D1`^UI +M]5P*^*'6ZEHLKZQ7O>&99BAE;3/$)6U`*=8@>N&:J]W*W<005R%SK*D39I9R +MR`QU6!/SV#V56M=WIY0V:6=MJR(F>PAE'39SL^SX9/KVCC+5R=(F-4CXQ%#6T*JG&E[M +MQ_+*3X_6@I)J@;-QSZ!!*MD+_>%NO?W>KJF<=JYLK[Q]=%;2ST[AC3`K4P;H +M?<=D*;UYB!#DM1KK@T_"++YC,!Z*AMS",6ILKWR?+/SMP4F)-'<&.4BS\'*: +M;TN([+)PU>`2"9%=%EX\6"GTD&RX6CK("9+.$8U[=?L2LC7.>YSS.+]'>6?D +M?9=/BO,`61/CV-1_4\9E;J0LU`#1^Z9\5_%2Z\?VN:TO^=<8YOIIPZ]:+U0X +M/;+P5]'SE7%L=[97C$R+Q;'==2%\\J/H*+;[^]PYWM]&A`G"%73WCX<01UL# +M8TT6?B^*Z.Y_/(U/G8@2_4NM)3LQ]]>B&-,3E4GH[K+PKZ,K)'3W'PV\9?_7 +MV.XO_Q]BNP]=A>W^];_!=C]X&=O])]=ANZ?\';9[)_]C+LEK796FC^.[_V@4 +MWSWWZUE&ALK[A=)R&=]][R)$;65]B!Q\=#W2D=]?1G?_[\OH[J:KT-U7)?9@ +MD%N8'/1S]UV#[KXK@>[^K.B5T-WGFQ'_>A3=77$5NGOQP/O]#A_B9GLE;/?- +MW!OK74`SJOX!LGO8M;8JOCNG"%'->'+_R6&6I04J7#3,`&_+`_=$!5O0AKQ> +M9EBB['#@F7;*]FTH0PZ4H%Y<=0TB^V()25-S%>J[Q=76G-ZFF[LX2YG`?B]T +MZ4KV-K=E78T`7RF:A#()IY(-^KVZ/&E7,`^_8ULNH[_?))9>\Z[9'`6C<*70 +M-C&>$S'TN,6(491?QG\W_$/\=Z.$_SY%POX\:LS-3IJ'#Q,`M4=0*^-SQY1-VOO(PN__N824*77QD=^9@0 +M7)OW);ZCX?P>E7U?3ZSON*;C_,?U'>?Y:ICO*\$%P*V8%,>7?WSH?X8O_[.A +M*_CR3P]=P9<_-!3'EW]\Z%I\^1\._3_'E\?ZD&OPY;^&N8)[CC3PF;CSF!OJ +M]%)YM#%*1M>"AL^!%B_P7$&<=XHF"7&^F+&:%P#'=5N]HN$G$N+\ +M/>)%:9_S/$>%?YS0`(ACR_^15UO/7H,M?^Z?8,L?$4__0VSYX#78\@W1L/O= +M?X`M_\8_Q);_]?\06W[+_Q!;_OZ!9^WM[J>JGN?CZ/)41]G[7I7U*GSY'_/` +MC0AO"G&$X"OX\E3XS8$XOOP/_@V^_'V#_PQ?WC=X2=J_H/9SB953%NJ25N4N +MSS]"GM\E(<]G2,CS:7^'//_36#-O+KF"/=\;RQ>H?=MXXC.7_#/D^9%(2+R" +M//_R9>1YRIAR=A1Y_C>Q_UOD^9'(3O'?(\]S$N;[(AAI[I&KD>=M$.,8N1YY +M?H&$+;_@GR#/WWH-\OSD8`F'=[.")$^Y\[Y6+$5&"'L_3<(`7EN?UW#8$T>B +M_HE4%CKVA33NI\&[#2-7(]`SEQ'H51("O3PD8<^?%".W_%/L^;E78<\K_PGV +M/!W^W@".T;Q_@#T_^GU@=+__>NQYY%4D/@;D$91%]JM&\>?_*.'/GTO@S_\! +MY(7/H6RDW2BM5*902S,-,MJD$-U\B?^D_"0YJ4MR^0L7U]+-'_/]BY("&--9 +MF+:3:FY:1>4GA3ZJ.E_9N&K]J@U+J>8&<-N7R@6J^8-%OE7X5:JE66]K:1R) +MV,33E93!Z%JB;`GT+CI3]8#N6"!ECKSDF+^X&20#E7^LNK&8\2-W`E*1)621 +M]C-I6!]Q-U-I*)DT$GDI)NP(&RBZ*/+'[A-]U,^I>1X`$]%RJ'/JQ/TC?6J5+>.5:-=B!E?AYZ"-)Q[)/+M +MV./X_:A)#O<<+YXR^SH7&6ZEC2DAA_>8ZL/3?M6Y7J@!@S6APWE1 +M8CP5,ONHQ/W?P?UW3L?O0XW#-\#]UZ0OC%6A-K[3$@#JE1)$%-VD(.Z0*D\? +M]@6,+\*<_9[Q9R&Y@/N:*+4\?9G'+@QEZD_`NG]^V,]K+0&O&D\1>Z9`RES( +MUP^UJ#:RH?7-OJK;,\\UG]2E%SZ[ZINVGY<%0GZ8`P;6NKI'I>T]$:AF="#Y +M)9\TK9*;U"&C[IC/[\,]0#KHIV.1);'UG'^/7TE.;^PG^Y#VW,G?60GM?/-A +M5Y).9V"9D8@P!,K05LEAQV)>[6IMWJN2@6RT9!$QS%U: +MS2VO3"E^-<#F4'-?];<&'B:/2MPHTT`5IH.DV>K7YE,P]UO]_L!.26/*FJEV +MS(#1N["R^F83X[#8O5SY/NF+%N<%:1CZ)!;Y?HS*`ZYY&G[A&XF\/CRO4GOS +M)=^MBY".O,X6>Y0PQSX;0KHL#YV&L!S"'PWY`L5V8DH-%I6;F8E-\6^,/<2O +MJR4]*Z:5GPOTZ-197AA'7H^1U[`@%=;D7Y>RAOA7X,X?-17&EP&_JN5(>TO^ +MK$#-V)KI]='$B>>X_2#2#NV7-PE6NH5!!F4P%77ZF*JTUZJ:V8M?2+X90AX9 +M\<]3>*L:WN>D\PI!9L']2585YU-PCQ+W)7%/$OQN.*E-ZU>NM +MY&/I"5QC*9`BYXAB)'>0RDMGBZU+$ECI1T$&QOW'O4.8ZL;@4=4-O>]+TK`\ +M>)8CEV7Z/T@GMD_RJ%^TV^W7[5[OU\7UC)#^E@T1%G'NDP4Q,F_H*/`4;\%: +M\P[,0*N4JMH9!TC+ +M.,RO^JA\5>BM>O6>$[NM67%<](%!W`/^8E"0UFA<.RX-]C=*6/102FR=/;S. +MHFZFH6]:E?BM;N_8%;;[R@\XXA26"*\+`9`H+0,MY9ENM4WGE#!@@X>!:Z!" +M/_-0T+8?#S9AJ97UO=(7L/5>>[I+ZU0S/=#7&^S8SD(SVXYX17!OU;.8B] +M/'<0.3K@FJ0QAC&6P32!@K8H]F(;VF$FX8JF"I'F!=`GF:MP-2&&K*6'00;, +M"6(J(F0+-P8/-Q,C$W1Y44L+>9U;!D&R:336X]H[%J0:)XR#E!!R)A;^RG?^ +M&3!V)@\0H;,!VK_!ZQ>:Y,!?8E[IB7$O]0LK-.1)LI8**GQL.&XI +MZ1D;@)7VE_VY=BQ9DRO)30U97`]U> +MI@FI`PI]DLQ/E^IP5DX?Z/1VV3HERQ:W`E<\<\"56(GE(&LA?]SIF2G\Q&,1 +M.B7E*[,.7T>9#+4PP`:Y\FK9P0KS'^2KPOU2%*+ +MR_=>93S'<3!.WHJ>D"PTJ;,.EZG/NLM*=3AJ_QREP['H3SQC!-Q)T@BO7\9; +MYC,#9?19.OP7N(OXX,^+HR,,]W2+)9[L`=U+=J)O:5CL.=:$7Z:.-;"^8RKY +M:0(MLS)*I@G'!8M5UI@BB/F*(,;3H1*7IA$X5[CWM@^O2USVYI3F0V1BYCG@-UBSW]=:I@EJ +M02;&73FD-Z4#HW,-J)9LH'\-R#`:IKI0VQWT."S'Z]T5PO:1R.0HNR=.O;.B +M![=#2DG?:%3O[=M\"DCG@F]9)[:=Y(SW4OKD`LMEW=("1=*8M/&9^MR"262O=VKY:5V.L-=;`#X+O@E\ +M!OQ\\'7@3P0_`WP#^%KP<\%/`9\!7RV@3"G7RR',0I@([VI=#Z.547`^3L"IEA+LUM><>THYMDA9;[\6O +ME*JSZW7I/LIB\*SW4D6[RR)GJ+`LAB6@I1)DA/XL<3=:D!84P4^Y5,,EGKBH +M\!SQ(P[RVA]`5,T95)`*SQ:!_Q#/5TZ1>&ZZE^2D"5.%15*(ZJ5R-,+=B6LZ +M1RX\+EU/[I7E=!*2V0,<,&MN\=$F9:C'YU<=FT!9\#R_,'20)&6>('PF:R'L +M\7H*V@[WVZL3ZXH\YPO@FM^L='FI*;3QC8H;)%3W0R-*!KFS%&F?)"E$A:.Q +M2]YB&R*YQ['NS8-F&`L/C>!(2X41;/3\LM+H51A-0?#BR-V;TIA@_"6WV]/=CBH^D%'WP_#NQ +M/_93X6#L7+\8T8AG^K7=/ZJ0%R$'B9JF8X,U4B\HSY:MJM51EJSZ&J`ZT3-H +M;0CW^3X8T";&R/].Q?A=P\6N"-U,!9)CI4D=E!BD:)8 +MJE#,F,T4M']2J,^G@%YP>TOKBZ7]DE@D)X;MEHR8V@/8;G\=WBAQ`1G!4OA- +M"U'>,:;Y)^E#*U?A+`(>7'6S2J4:4V*U6E4JT5Y&@+3E8ZE/#*ZH43-@; +MWX&Y(?3M1=9;BR6[3RMY]:HJ_G@+%;XUABUKG7.T$7=X%3E'F^/K<]BC5R:E +M4@:TTU0Y@/O0SPT'^Q?P-,MYWH4V7B2>Z(?Q:J#U)'SSP&LPTQ=*7RI86&U& +M(G<.FD#&Q3)T#,N9X<@M$D+]GF&:'8[TQ.+I_APM4$O"'RE`^;V637$A= +M<7P0O=OQQ_XPT"AER)O8>Z+.BI$IPRX7,8:"3[%LX^5G07+RZV&6>5"[JL7C +M=A&#CH/Z#K_2'SZ2QB57FLVVIC$\-<5Z\]P2,I5NFARXUM2C>3L>ULH-BQ9%V[QX$D8XT:JV+B&&*=\.`WXC./;%9?3 +M4F=3BX]O(5.3H'2JX/'M8ZK\F6C7:@Q0M0_[.WV:*BLQK_C]=FH*=(U^L +MFJU,M/FE8T2;%-$YLQ'G5]7G3Z590MV4[8[%7C +MEE)FG7'P5-HVM:9ZFSJE?9LZ-;CM:OX4VQ';_&45VC-&6S,XTE8-R1DEI_`L +M\&AA)#PX@B-NR9`G\1SVRU^[6[KH`VQV!VG3]=E/D._ICCP@5.H,3CF?FFD; +MRU"2I>1[AEF-<1N._LW;GMZ&Z?=26;9/MWVER_`FR:?=O=2[\>Y'O,_=?=H[ +ME];:*%N(^^QNJ_<]N[;03\8M3[;)]+PRV>'7E;GLCE:7W=GC"CA'=_X>)@=T +M)\FKY>$C)W6RMM<6W:$[5HZ[3XZ9=[0L\V9X"^B-U@JK7L,3WXH_5U&6''JM]<6*)*6CB,EDYWVT)REUK;5( +MLX;9INE_'S,CI4;K6^L6)-YN-(QZ[,E"M.?3G$D;15(R%Y"EUJ- +MC*SM#FNR9B496@'2ZAC?"D8SDG<'CS%M`J>667= +MN2(I]8)NYQ*E*7PJ+.'6WL>WV)-<2WF&QM]UN/:>8 +MF#I1J;/)LE\^I;J.D +M>TFI:EN:,DD#OYHDI=JVSQE'PZVI:"%/>6N\2;KOE)\@=9XG/"=TNQ^([QWM +MWI4>PB]*5&X^L[.,X`XRHUE/%6IJEMEEA3]@9JY*@Y%J69HK60"/UZ/"[CD2 +MKTM%)=;&SFMG7:D/H]Q)/JM6!U9F7ET;I7*V5.*B?U.;?8Y_5ILS#D_BS.<8 +M:1Z<&9C&JQC@0RSJ97)P4WB!6'5^\X(->@97E5\,(C__QD`VKV23X;Z>\4#X +MV4'D#QB^ARS036']JZVJZ;U9:*W07+H,D845%F[9G/4FQL#@T\\-CH.G,0YC +MO!!S:'#L(@(2O-+UB +M9&U"GAB=Q_B-7"V+RY5=W=H*+<^Z*BAZ1=NMY.055#$+J59"JCL':8YU:%_Y&^3S93@4)U*% +MFK[:)YPRO;[VO+/6D[-KN.TA]:>V%MBS5[G7Y-[;I)/-+. +MUZ,XFEZ(3N0-C-Z1Q?L+DUUDJCHXF?'/_M+U-T<@;TMUR/&P@Q92'(\X3D/+ +MCJN*(W-;X-<"_?-PE!2H)'3Q?8/2=[6P>D`E8*[W12%-":9IB<+8Z@J_\A30 +MZ!-EA,Q?PBW50ATSP.7D>:"R6=M]WO +M.A]QZHJ4K]-"AN-)YT=.10(A'.A_%+'($?/[,+39UO +M4SWMDO46,KMM8T*48+%J@D^[4$,US2';?T(UK_=IUPNVIQW%@BJ'S)@59/@4 +M%\,?7/N3=7F,;+]_ML4A/W!^W<6U)C?NM>O7F=S\9J?TFP*_%>MH89HS9]V: +M=6ZWUDY9W$X5M#^E/U@;+V'_&BI,HLV,#%JI`D96V1"VEFG`X\(V(>&O@&\: +MZ,<^OYDC!-LCUJUB4ICQ$I+Z!?%IU4LNNE=O?0G*I[>]Y)CG)M/6!)O=P-=. +M+0SE,OY94UV/J@YMIGOWV*9`[9*M.<$+FS,=)M<)E:SW)=>AS?OAJ;G.)N<3 +M:V]@5EU&5O^%Z)!0U..ENGV("!^O89E-<.?G`\1X%_1D=G2]0,)/B.L$^I&Y +M3NKARG+2D>DB>227LF1"NN^+6,*]X@#TD29(]`,.^C&?F^IXR44.I-E(!YEF +M"V8S_IF9KA\O>&!!F^K@9EDO.=!A4X9H`5)8:?P")ZP55'K#9F(RALA^++=S +MP=7EUF\^6(;?8ND.M4`_>@BH--U1N[E\G7YS[>;,=3YWXP*JQ.^5X#V=F,RE@.R6Y$+J +MI9'._Y%073]A8Z_X)!V,FOX!R&?`\9W^>)]B_Z:`0YKE[Q8C%T?$"-J531XB +MX31POQPDX?'@3QSR`[U+KM"[`AOYC52X/HIO%F)Z%V70U.ZN55SNO_^.L2X2 +M5D2UKZ@3\R@*XP93GX@YJAR5%EQH,V"XRAA\ID +MH317&[ECN0G>^5BL"NIJ@EK7!2NE6CM#]PD+RTE.&UE5S?/S-B:[#MF2'?/Y +MR0Q2$BJ(H9G,;.7L5%L%A%:G"1,UDR%$P[5ZIN:JD':F#$(P=E?I9HYS3'4] +M7E86FL"DN\SE>\F!Y3/X?$<2E*PX:*IR+D#:0\++8CV27>0XG9E21819PDQ7 +M)G!UZJ!SE4Y@]=!..=,<:!=YII"IT2C3X4T'5ZDM&B%)"LD@I+7(A#P(PQ.6 +M\?8VLGCYVQOFN9XHDYTQ.9(V[K'-A.?9F#91[[3@6*G>8T(:F!L9,4TB7A%, +MDN)!@@_?'XN^DI/H;S9!RYG$&,#^UV&SY2UI(TQ\$-:*U` +MOT$9I$PE0=HT)_A$K:&V2""FPJ!S`VK)RO1FH(13!4-MW_I)B_:0P>5X]G7Q +M^I2:I37.&D/-9&&X.J=F3*DLY +MF>DXM6%/F?IL:/T>&,-I&U/MXUR9MC1'$=3W\$@RU,9RS>BFRIL9ZG,?=*;R2=*X`KKHU`J&]4^4C0GVK;^P87]9 +M4DA=WD965*MY-?"+.-*H7!S?:T>,3-?EL8WO8Q/OCG7S?*!L?8BPW"*J'=]4 +M/;(`9HS&1>]%'7+ZV8>=))<]IG?,=74`];#"N_4.*S_&L4S0NP_B+HM>+=2X +M[4Z]N\:=YC2XZ:<[X)KNT+M8D^PL6Z)W0!V$O$DUOX'84&J%S`"UK:4,NVM3+M.#WP^S+C$R,K*MGX2/#S?VQUY! +MGN4,\"X?@#L-3I@4[Z?XFAL?>3\?UD.>QN`3;I*?&[I2^O1$Z=/LZ=>4/_6: +M\JO_KORRJTI_[S"NS(3@^\\DRM"%MD8WR(TI$D7=,JRY7/Y-PVA??<*3D.96"WNG>G+]Y\3K3YO6;T]8YW52) +MTVG:H(*>V658O%A[N4:*83S/FQ*34#_"VX=A_(2'AES2JFN$=4>,[!.)\(6T +M[OP%:/_G0QZ)C\%Z7EV^+O;:\-'KPCW7A8]#6'M$GI]Z2L8DVQY5:4+JX]H3 +MAV`FR.?*\Z,G#Y5107FQO`0I0OQ4\2G<52Q4"#)O"FH)FP^5J4)7KJD0/??+ +MD&[B)["6F8_DVB<`79VM7^PP5&3;8285R5(FZAXDM8O9XB%4M +MH3.1(-2Y+_._U_YN#"79VD1[1_];-G\9\O^>S5^:=/:-VOJ%ZPNTMO/"+73< +M7F_XSH)/:+0-Z^GLFQ+HZE-YN_JF@.MJ#_6]V!GJ.](5ZC-:T-:3<,&@Z^JC +MV-;S1WJ"0DKU5$%T*,[?Y^CJ^T7/PWVY:[KZI&O'PWW*I?.$O#6S!*7G?H'R +MJ(1X^BG_/KT_(%!^=2*]\=^G;V\3J/8DX>6>:DAO^O?I.W<+5*=&>%'*/__? +MI^_:(]#@J*YD:-/T\W)B35>1)1=>$<5?=7E>[WO1_WK?D?;7^W[1^7K?T:[7 +M^\)WQFUYHCPZEA1\,FIOZUVTJ\4^?)'`LTI"--B&:$>+D$5]7$O<<2-KC0WK`]'EG@Y*+8L\?XE%V18'NLKETAX +M,Y3UE4NIX:Z^GK0K[YX"]WLL5\H/Z;,.)\(TJ>[#\/7/JR&4N?."#OSYB7>K@_Z+\Z]Z+PWET+'^ +MA&TS+#OXI.7B"4(^';63]F;"]MJHS;6_F?]G]27:'UV\$:6]X)U9*7"?DMZU\^+?1MN%;;_C?;I3E_5/C`,LWHP3!Z6;-5=WY9=5[4UT'"-7"BX9IZA:=#.RWT9 +MGQ]^&._+(6ZLT-DW#N?"(=W"J^>9!IZ9=]W]Q%S*XA)YZZ`.C/3,SHM&J7SQ +M.LJ%'WV$].*%^83<>QLAV';'K^*MD+\))G@L[^1X.V,Z3"^U,;[+/+;O5FE, +MR8#FM_11:-^/O";1>[ROA7?+V%!RP!G!39/2M%\T)YXI`K\8W#QP5FWKQ?G@JV&\2.^$?A^7&!_<56T[ +M+(J:T3$:ISDM%^50-AWDBVTMA^=9]G$8B]#?D!_:*L?G*!CK8?^(6OS3R*64 +MA$R`[83OB=M&']O':ELN_!5HTVC^TQ)CP(AV";5[I?%-K-CFBZ6QC789B17J +MBC86K3LOGA3%3T?S15O-@<>NM>E\ZL%KPR>^=VVX>^>UX3&MUX:??O2Z\/W7 +MAG_[P+7A9^^[-OSP@6O#R;NNRZ_EVO#-UZ6?>)V-ZH[KTC_^_6O#DWYP;7C1 +M=???N:Z^_'7A+Z][__-[KPV_UW%=_:Z[?W?[M>'-UY6GY:%KPSNNZX^Q_FO# +M%ZXKSY\AC/VL^['X'UN^__G[S]]__O[S]Y^___S]Y^\_?__Y^\_??_XN_^$9 +M[#LE-##"HMV=^[M0QT/.B'K*T&&A6%D[U:'82^^E\F8R)?:Y!^=QY!$Z7!7% +M5-D,95#L%6>*>AFDZ[!TS)09R,-%')V->B%%!POM[68Z7!PM.EC,T>%YT=G< +MG(,LQ,R)%G$E!ZUP51BEPE\,4>$;AO.X!XJ_5A[V:_6FEI8])U3#O80]["?A +M/<-4^)$H"8\5)R]:P;INE6P5-/ZDD80=TW!4]Y^-QU61NEP"KCTJ)YO:^,)95%;H[48)N%;AD>QL],@IU@_(:%) +MA"SULEOBFBJ$/*(@]*-S"*E<=]?E2+C?N,6Y96LCNW:C&:MQ4_T+2VX'__7OQ*2Q=M=Z13MP=]T39F':=I>1,VE,;A-E0/UZ8M!6GB3:JB69/%FR(A(XF7E21WMR\"Z> +MU#.<)$LR%Z_X*M"F.Z%#[.2XYB0BPP_T3TM@2([:Y*!Y/]$LIPHUU9Z%J+OM +MZ4:;\22;&-5GYU=^L6K4"CPU-1P50GJ?5J:P[/,#*SVF/WB)$_B3VJH=,9D&.):�)H$8.2S&]6;] +M^K^R1$$YH)8.2E_JH!RJ[)7*LV[*L$269COK',=3M>/XTMJ6VF.UE-OO\BR, +MCQZT%Q&0\+.OA.-XVIA?J6NL(5W>82MUE+K2X!?[ZV]9A*92P$';W<8=<],I +M<"+,)?V=*)OASR_>[TZS[G25VHN]H3=M)*>*(W/%SC$6< +MU4>4ZM,S>#4;<,9+A.:K:`I\*OQ0IX&7N\,7XN6MV=K<_A6ISQVJ*- +MN[/PKES)2F,N:HJ'%XZ,X@[\)(;?BJEP:PQUBN//Z\I7^E8J5Z;24[6A9.8& +MGK60J1DADI\4&F>79VL+B3'@E8?VV0(>PFH;/`MU<%7=1(P#(4H*TP9,08?P +M?*QGH=86MY4/XUSNQ[,"A!V+XSXPCA#4!Y;.5:.=9NXOO/F(VO&%/:4*=VU+;H^11'9\I8:/[ +M_WJJC[O`R_U]G-RO9=7@G^=I1Z9!X/92NW5JAQ:N3U)M<&66L`J(_AR'_NKK2T[XV@2[U;)&;D!47VIL"(6;B/Z5",5ZO,<]$SQ>J6S-U2(Y(X3 +M'))VMCQA6;U3"B7CF?]9XQL&3WX6X9'BZT),".6)(#J&9'H4P10K1,TC(XEFW()[O +M_0UC$V]K;=`(-=Y=^51H9X-",'A;X:JE@0CW-A1Z.[A7/=AZ<4U%\Q&2G>PI +M]^SQO..Q>4D.,9"I61_*,A_UKE;>E4H7T*%D#U4X1I##53E9([7U?/ +M(X+T6+3>':X:D6S2)TX0L2R[2J]/6HWGJY5,QG3J)&&_[%_&$=>K`5,^AC[M +M-T":'A5UFK`?]>>P.?F9'U+9^E7$I`Y2DCUY]P(QLE_%K_R$ +M_7V_6D>;)]E:RRY]("N0PQO?Z*=9A2W:[X+TW\30#H5VI+Q"P0KUY95*@XE) +MM:!>Z#?#)N8V+L/"&MAB*OR789IE/45Z;ME<;KK_:F1D]-'BSAR>&`(>2K)> +M$1ZFV+W]7W;GHCU:Z7Q93X#D/:@S&7=UR4]*6H)2K0L6R??-O;6$F6N1=5"2 +MM4XCM(UL/Q7^;>)LX2?]+&N$EN&A92@;Z<@P85O\$=K"N,HOM<69_F0N)X=R +MG0CDF&[_L(3)LM`=QM7$:`E21CYDS*2>%B,J:)6%H==@G1S%5D#=5,110/US +MQ%SXFRJ.KX`X"W@F$+$7U(DS`*-GA4;MP34ESE7#4DG/R/R":_(BW@*6=F__ +M48:&TCL2I=_=3[%*F]V$[]((2>H$Z+$9F2KU0 +M.?PA=WW+HF;CXN$S%4K&R.BA9[1FI4$!O3-E&-L*6\HP_+M*/;/>1^_#.3UQ +M^/>+\/1MD5Z]C.S7^P][Y/M(#@7C$U%9J?#,X==@3,F=:H$*SQI^E1^U"0+] +M/32O7L%&ZU&O6#I@6K.#G0+^R_;\HAW53WTHD.E8]>`KH +MZ*A=3R_:[VSUHEU/M(W`9[C#?*DS6]_BA)P5&N>K5)E#;GC5 +M\92]M>8K0ZNCT&!WQE>4>&D_&+IB)UK(;[NP +MEU68KDQ/C5NOPW.K:K?7[M=]:*`]%/2*]`NN6KKZ2OJEX->O0Z?TJ-UJL]J9 +MP%H%;H8RT_H:.^5):X-T\(NIJ^1-ME$?&(D(.8U;X2+[Z[.T5!EWZCC$ZROP,Q+261Y3[SR[39L[""7\RU-2VU&\QM +MA/+O1>N;01Q/E+^,3VJB3%1`%C)(85P#X_ZM_'PN*<":\=K375KI9XVP:KH\ +M+C_2!(WE%FBMSP;Q6FN9!]Q!"Z#>+K,[`6R=B"\=;IKA[#)/!4)0" +M>O_K0=-JDIUC;RF3G5)GP;JZC!*T+MDRK8M:G;^ZHXR$\^25025# +M93HWC3"ZR6KULNA"WCQQ-V$8@ +MB3F-/*2\/`UX3@C/UQ2";\7O7CZT2&$EZBP#C(\( +M+T8>$XU0QA(KM8PJ2IWVRW,XIS9=/M?]EW*2,]&5HS\7((:JI-[1U<&F6^F=:T/LCB3AQPR=G65S`V\L$VP) +M1(\';OOC&1E:564_[I<9S,P9X+1N&/P#IW)\Q7PQ^4B9[N2XU63J^&!:9J5W +M^>25F=1-.\N2/WRO?*+N\2T/>B?5CUM=Z:7,\?B_?B`K.E+V\:D3TAE&M.E0 +M+5+LK_JUW6]4$%;OI<*6P==YKDG=0(6+!@]Z:6AYXV"?%RE8SJ!S>QKX[*!^ +M!W*ZS*!SQWCP=8/Z[S+@9PP>W)Z.Z\U@W_9QX*<,:A,(4G*FRQYT+TY!2B%& +MV@I@>?@2ND"++!I[DG0>RS%A_;@+;GAP9^`G=PM'PS\"1< +MJ>'JRX%#<(4\XV<#![EX6J1B%P=$]FM8>7T#8F2=](8MB;."Q=WM%8+[J93# +M-L$IN(WPBSG6#0ANC,&4=PXD\'*`MZ>,U*G4`AFLK?$QVP+/YJ68I6=9X'?1 +METO^3I@G9?"V]V!FW"FBEMAN47!WP1V*%?K5W53XT$`SSSD#SB8.T0(H`Y[Z +M;:U_M?'5AK*&:LMN3YS^12'E]P:H\##(GIH!1P6MGSOO8"/1]S6R6RB-IZD"EN0OYAK285:WC"PEEM71;Q4[IP;01H*L0'D^[S^6@YU]^_D%!YO +M@/6C_H7^6,(R"<'SMMD+N=2>U)Z4GOGC:#<4^99?12G#$VB# +M*VJYO+8%HE-X+*=6*J]6\G%MPS]7@5H%;"FXYN"#:B`7W +M@2)^Y@WEZ%S@(\A$"1=7.GN,-.A=R8XD%;X#ZH^SZ;;H)U5X>A-;M3.!NE(H +M7N00"R%%O_PNA:72VE3@2M*P3.A +M]12T/,Z*K"BVVHV)]H<1*,6.C?[^&EZD`_S.IK=YI8&K[_2=X-4>98F1P7,+ +M;_*L(:_D\"02_E`\Z).QM(D$Y9"_&%D*_8'G'HP/XOEW$GY#%*"G"J-'T=:7 +M!V=O4?0UH"N_X&#M&/J%_7FNXQZM>:?O2,6%5?O+BH-64VY0^X'9Q`25'VC1 +MII[)%*+T+?53!8MI?+#09`C)(90C5)LR@HLA9@FDN=TT(:2!V$R!P.\-`@V_ +MXP09_&H%!?R.$53PJQ'4\*L2DN!7+BCAU^]C5[5O"P8Z`F6ZQ;KOVZVZ-/\C +MO&BVF-5^;0*+/E^_FROSM7.:I=2D`)=73,)K$G*HMIOD[.'DGAV<'.I]>[2- +MV^46UE:`,)I?6II;6E/\^M]YN<@7; +MK#K$\?-L&;5![>'O[9)WK.*5C+E$P]Q1F5H(T@8[36>>PTV7[9T1EOER1G*E3J40EQ"Q>RT!->=3Z!F#OY)%>;%W6B2[UJ1.GSE/,DFQAH +M\PE?+)(NRB3L'^C_F)77L6@YE]([ZUGAH)=7J4Y7 +MV9Q,;R[N";3)U+9J_V@>QV(S>&T\#];58(4QIBU)]6@L9HZ$?QZ;!^&4$MD^ +M$GX^ELM5%U,;C%R/CX0GBWK)(F\1?R.G+:DN/E8#7&EXHDB@'.X&8NP)T?JG +M/9-XBI6P36#,G_!-M:-U)IY85V3Q)P*(7D+"39)N]^,Q6O])(PD_&KMB%9I^ +MEH42#,;0)A.>VKXCV.*-X[FU>.2FF2?QI/&#_7&,)S.YDX(>XJ.]U3V`=L3'IDI*_0RSWM/*)6]E!XD>>BO#MM!SUB!TNOK4P2?#Y$G +M9"95B)NN"+T@I3PQ@;+T>:S`8Q8`[0/Y:.C92B-S@SD6R8P]4\&ZV5J]^VFI +ME3?$'+47:TCXO1&TMR;4/LF10&K'4&E,R>0V8B]\,*)@ +M@$:@172?RI@>VLTA%Y<:NI=W6,CTI-#;P,FJ0N_5]^R.4Y3'1H@PUH-TZ+9KZ$D=L]`ASLI*W0K_>-;*Z@6#U3;0G4 +MQVL7PJN:A"7<,W(+P\XF[6&?Q`484\XB'45; +M]"2\=83`*&VZ;!MP!7]\R[?X5%:]!LOZG9';.:)WF(_5?YM?7$%W\$W5102H +M%KT_">AY6K"K>0EO5?:,57OD0J,0]E4E*+LAE"3X?>425?_R,E6? +M$"+A%T:(<5Q(5H"M)MEE!$F^&-Y%K3$J08XP8-FF2&6;-M+5CQ0^7MY)(R67 +M:?P,;JZ9:D\NF!"ZDD>?KY"C/(4@@[1XZ/V\K]2C]Q[S4,!AY%@HR.WB,%K3 +M##=/YKEZ.8O6%&`EV4_"9X<96!.R+$=A33@UW.73\8:JP);B!P.MW@>/MQY] +M4+W3[,63->-YN<%Z)'LMA60H`K*06`ZKZXWSYZ%XPSBMK`EM-DM?)%2RUT?F(>5ZF[DR]9*EAC6_H.=TNMW2%NE^[%(>"06,<9BD?$C +M&NAUV_`H!R<:](7*;*)?RL4B7PR+!JI0`Z'%$.H?3LW)9D2#I9#HJR#\IV$, +ME4*H`D)G(&UYY>+";(;HC4PL$ASF%E%YHB&M<";$%#-K88R_"4_<6B$:G/`, +M,X^%5*\,WV0G;.'<[%469G`J.4OT:1[I7(XYU?BW'%TTB*TO=AI&$.E1G"^T*XPVAG,2F"(@>R\D"]4+M0MU +M"]F%QH7FA<4+\4R`C"RYL)N0`[(>[7G4B:7,H8]HLNI""MLJ4#VA1RASST<0 +M5R1'G=*>'@P7RC3BV[Y'PS(7-E/99^FMPNZ=2.)63WM*+./GG/"Q?Q +M?LJ\G7URL_^C`5',I[0MYS<3\NFTXJON%U^Y3\/]=7A_WE7WBZ[$$=9J;E0(%JGX7_KK,83U/][9S5>&ULH'!KKE\H_>F8#?6C;/[=2 +MY,],S^,7Q_8\(%"$N3!&>"A]K-!)H4XCU?/0>?1)V!ZMNR"*^!SJZWOA&=09 +MIQ)MA+3H@Y@H76M1QQ_:$T2%N;KJ%XRZZD[CJ`_Q!JG]?]_5=_D>>8'3D4Y. +M"_G1[W5!'W3D0#_D0/FHUAEX-B0T'\9%#HR1'(KM@>L>N.[!^WTX:DF81'$G +MYH4$,G-8LCVPLPOH\"!YA/H^KH0D2K?G<>X%WOEXC6>N"7!N>!UW'8.X6X?7 +M*N3WHY"K7E43CREEG#6C=XF^LV;T2DAG]\>$_^,SZB"QRX01^<%Q`\G_CA>N[RGLZ\GZ;E+5[MQ\$QEC\LQ7&/L7ZA?DS6L\S[*Z+.NTN27]>2W9='`?Y9H`/:?M2PYU]HV66D8)/ +MID*YL$RH8\V8'[DH,U<*&>PC%Q'+G0BM@HQ\IR\9YFRJ^6&A%LML?NV"==+W +MSJO@?2KML0LRLKA/INULH4FID`'OQ#K$US()QUXJVVB9,H16R`G(@XD]2LX[O[5,%L18,?++$<)^!>ON"PXRT@$N/FX?E_3+ +MC^@1C[AL\IC\G"?S3DXP9)>7V9KG]^HFW$P;,T(<1?6R3TX43!4XDM([Y4F0R8#RIC!*(_,F(D'9J^>[M[G7U+%E/G9%70,0O47;ZAK6;MQ\-SZW;-.: +MRP%^4YW76;N%75+7N'7C%IB<+%?G]+!WU=VUN<''UFYN:-CJV5*W!I[9L&GS +MW9O81O>Z3&?ZB[KCS6:\.6XFO#'T)Y +M47<]"/YHW.H?B?3H]="/KM/UYZ^D*WT\?@^?K]Z'U_'Q4@_C!6D*T?HOSV51 +M^BNMV;2YX2[G1G9+7<-=[DVC@[FTP;W%=5?=%GMK?-@]%R6\!LWUJV# +MQ.Y-C5L:MM8F$L-PAJ=QR+(-=;5U[FUU:Z29,IK:N69-0UUCXZC"S=(K;X+T +M]5OK&K=@].U;G+4;V,U7S1CI;TG=&C?DNF4N6^O<-&4+N]E3AR59M!4NU[*N +M*]-&2KVLL:ZA8$W=6O>FNC6)6<-:_G%T(1#VK0UU[#9WPY:M$%Z["=X`)5Y# +M;%.GLAO=-0U.F(N7:_\O=8A<3TKG#%`V(,+MU\01E!<<>D+6$//6-8GT:;OZ_^?NW=?@W?QG0(NVH+:6DB`K"K;OV_$!.FX_W$(>D +M1'4&QMORZYOE_\!A4W\#&0]AYC">%,C,@QL++@-<)KC)X++!&<$5@"L$=XLZ +M_EXS%26]Y!WP]Y&M9`/I@3@H&\7_KBTH]HAHY_^_8YO9?;7=']<>>"SVQ[ZT8W6MOL'Q__ESR^>^%[RT&>E +MZWX^GM_TV.W+[#SY:^>BK6YF^G]Z\OF+%QM)[Z*\7[5SE^MOBHI!ZX.'S +MC<_>7G-K?HIZR??K%GSG1T;SP3EC-=TSDE)GYSPZ\>8_Y?W.7?6[[S[^Z<3T +M'T_:LGQZ4<'L%S_XXLC0RF^>K-SF_.7O=S0ON>7#^N_\<-S7/W&]1,BT8P[K +MC1>.^S[_Q6].+WCP[+KRAC\^V/3<\?Y?32W\_L>=/?LR +M0S_^[J&U\^]9^NQ-.Y/??L#TUJD-\XR^_SK_\J0;MCU_T[EOK:G:,CGCW%Y- +MRD;NHZ.K']_TRE]L/WG]<,F3ECFG]GQ5V&O;<\>F7[[_`+7FA9./"?R1,X// +MJ?Z:^][/WO[>WSY9J-/V;@Z$-]L;5N44?_GMMQH7_S#[G>T''[NDO^7#'WS@ +MO&_,O6/;A;+MK]<_\^Z9=H62BJ0SAUZ]<_W`3X/NC@G+]T^9^]*4XK/C_OSS +MJ3,-OS[I>;I-]5\S?U%@F+=W/'N"OU]\QEO=]-1#LN@=_J0)6>_76?[PYJZC +MP==:NTQWKTB;_$[S\.'_OFONM/^G<^)_^V^MN^&NNYT-=3.<6^ZJVQC_O=.Y +M9<[LVEGFPCMGUFZ^:WJ-^U^3_W_[9X:_V68S^I8YLZ[QX6_.S$)+$;&8+9:B +MV9;9146SB+G04FB925CS_TX5__7?UL8MS@:6):ZZAIJZABW_--VZACKG%I?S +MGS9%O#+FR_[_1_[F?_GXQ7_E1L]""\JX7-:2!C*0MD7BI<*).#E#7%X[UL?=%XH39PI_Q;3>>$(^_C%T;/EM+9%D(',)=>6GJ>"D'=G +M7#Y\!-*<_"=I1LODPG.PVIT7'8ESN"@3N.`:XY>S\3.X>":9)GYA.::1SE:W +M7+1*]UHOCNY97N\>22.?TN&-(^.X^Q<\+UT_-Y0&UT]J20*YED@K]-(40F\! +MYP6W/05MP#4X%+`:<%E@&/!K8;EOA+XU7;_0^?'DGV7U%`N-=1-S;8* +M:O-.@>JRGJ=ZRLY3I+HO%98B#^FZI"!+^P9%44.1C`O)UEV0W?@+R=7W:FGP +MD\"75;]Q0>[XUGFYYY$?>G"%1W/T%U$%&EO0%TTDRRMQF\N(E?#X%GJ?! +M3P)?9GW]@KQZ&3RW*V<8GOD*GA$Z1%J^-^X8@G->`HU_N*Y=G_VW-W^9/-Q +M_U2N4Z\IIOS5^E+_9'V+?ZS^F+]'_PLSY7#H2QW9^A9'NOZ8P[-0VZVO8.9U +M>IU>M$'K\)#PX@&G=S)G7<4F,'H]1W25)(?*)H8;;J:%^U;]="E5N+ML\%R^ +MUY]7:,OW$(- +M2@_W8H[]=@4SJO,A#S\SK&'EX8*1"Q4TZW2A-@%A]>`+XI^XYXDQH?&!NK\* +MM@_B3XMJ]B#X05'%ZMUBY%WQOSEC0M=#C+PAHJZ'/*P8D8?OE7(F(_'2:H^< +MJ+C@KDEYV';!B;KBAUS6[`N.;/>CJN'>;/=UWX)?ZX +M6VL[[HSKU+Y4*6<.-\F,PT$Q\FWQQ451]TN4VE;"''>J%3TNK8\RUT)F;<^?57(L]6R(P-J=$BLWS$>_,?% +M)[C76W!/YCLB2(W#4??CO-H:=8J15-'(^,TM+@KQ5PU:_0%.(?A=<K`2[3SACHJ619O['.MJT;&TT`Z^ +MF36VB)%/8DX)@_H[(O1"S-5F:K/J[N75?C&R(A9O6Q]/,]QV.D@9M#9*B!FT +M5FX+VONYJ^*\NS;E@.V\U.)/N*R&\PZ#>R^TI8$9[_X,_$=<_ARY[;0CP_TD +MA.)Q&%S&LJ=0(]^E^NGI4DS_/_0W\_L2%<^6K4]^"GM!!3^",N+U<>^1] +M]QTINVWO._^:/5%Q`-[SOB-+>D^6^R3\'G"=<>@86HJAI9A6UP+[*7>R[93S +ME'L/_)9FO^:026-![KX`OS+&[Q)9>$KJ^7VN4^Y,6TCJ]Z[N.7^G,R0/_VYH +M5&=('GYK*#'BNF=*FE-BY%BB!5^)'900N5^*H=Z4&.F.H=Z4&'DAII?Z^OF8 +M4^KKIV.H-R5&GHKE1G!+'>$%I +M,#,E,/_?%XE1$RIV'0L\788(%?&=XC?\:&>[V$45JE@':EK6JTRRLPJ^Q*'6M]2,YO2&6.PZ#_7N40,=38K7E_:FV2@/E-F[VT;C +MZ0"O6K*Y#5?@CO#V]=+)E_6)DR_K*3-7@R.>Y*>'GK?O39Q\>:[B.5A$:U9\ +M$=@KG75QKO@T<;H%;GI?BRNX9I;E]!PK?/OX\3(.O%J#=?O5SD:4,/5C-I@9C&R7,S=MEO2 +M$LZ"N"QSS38Q4B6Z?"0SRXSX$6Z?6M?"9YFYVFOU4W?]`_U4A:39*H_KMWJ: +M>OKWC5LSY`UZ\/0!O5UWI;)Y&\8Y/( +MU+%!EK&:9;O'>>C=Z1J-A]J='VC+HEK);@+C?*V'$F[PI'K4++;-U5JQ=US6 +MBC4?0;U8M6=%Q9)RN?"O-&(7VZNXCJ:X/NS)IBOZL/-YC8^',%IAI`)42&]0 +M"91!(<1#!@,11O5C2_F;+^O'1KOG5OE9LP?&@,?C5QHLT`]SH!>>C%F8V1QB +ME&"K_R@FLN9Z3WU7?;C>W.!I$",?PDS[E5B4T)#M3&C!RL#/X:R7M6/;(#R9 +MF[2(^(@Q/W@S4SWKDI>TEW@O>5D[:O=KFR]YVIM0UPLQC'#,>SW5S<6>8J]H +M+O8`Q980/S"GN9!3Y\2C:UB&[$?$UD^\K$ZT?.)1"'@W161U+1-?6N.?Z*T= +MM4_B_$6/9%->C%P8JJJLXJ>YJLK5@?.!B0&M[D!6 +M17FZ_,=M1$Y2TE-^4"8[PY=/#%!392$YT,)3T9N$(PO2IHCTKODOWZ8Z6YRE +MS<*4]Y7]Y21R#[=6J?WF`&56R6]-(:QVQAP_"9G])8NHFV[RSRHOJCQ7Z*[5&Q#C_+-M`0\UC4#*F7VZR9 +M.95&AQAI&8K7;PJ?8=8P8F%I8;N$^ROA"T=V#)&<,7G,(GWE-[31137QRHF] +M,)H;C@7FPBQ%"^DE_A>`9[S%/]Z>%J`L&)/FUYHP1HSTBE11CC(G53O-Z/C3 +M*3%2GG@7Y2(FU;DQ?_=&B<^FUP+MW)2@GQO!7P_N93FT/?C`@]/;96A#,5+A +MD+"IOJG\1L(GM.K*O&A-\F\\[^LHTX;^RM,PSNX800IH='W.^P.I)5;=%[S2 +M`*OT",5V-L97H#]S_F[$ZI/UBA$6QN`NT?_RJ-X:A5]]3"FA#SE*3UR\$M_2 +MLN/5':C/KX'<;2,4C+$_<'X?VC,\"=S+?"?R?J/<;6_EJAK*H39&S;_+6DKKGU[PQ*R1/UV[>X-6EV@-K`!,=L" +MM<])*_>7W:_PO[&/=>WJ>BE`<68IH;1%Q-&ASB=5F89%86GC5,==1GX95Y +MF-J/V#M`1?)^H7QQ??UZ^E&=[B;W.UEOZ>A''T?4ZJ+'.<9,?#3:MS8FA7Z( +MB&V-C\!(?J2,#CT$(X#*E>^3$*L*,D-73K&8F=Y^C_I4OX?(VBGIK8-#LGVI +M3*GTWK\-D>EO!%_K)P7JH#<+K:4W,U2(3*&*CM3<74.QY_KO06XL<4JHV3Y? +MU\*ENRCOW@#,"Z46D8>\J+EQ3#FCEQ*.*:>=]JOR>W-8=A4QY@&]R#'?YB4% +MLN!F&!-/ETT*T>9\IH$'^CY,C#>$')FLN<=GS32:]:MDIM00J]O(^[TGV@)E +MZI`8(1*>G%7$DTMBY(N!^&@!3F^`AI*KQ&_ZD>_O-6:>6EIIO?EPL\*(3WT] +M8-JHSNHL2SV#.M;O``?QV0#)-*[1,_'P4D[N4+"'$V,OVKV@G,J;Z-JF_%$` +MZ&G.\YG/K"+L215].CY/_AC(,4SXV2KE#')JKT`?.K03?FM[-[V:*1`^)<)WQV[(_-S+4ABCQ>D[EB]4K5R[(?6J4Q6)3/K+A]=<%MH7$5U +MT5/-ZBDWVYYJ?*I9/N45R:JRI]JMMXDE])7 +MSWS,1Z91(2IG5;VB',KUO0E"#YX]H.(XC4AS3X,[#_-_E2RN&[@%PK1"+,P94PCU +M:%"?/&T(M=7$2"A*]A.6C/A@BZ%#A_QH$OC=ZG-/[S,64Z0;(7<[$\^\;Q%50C!R,8IY](U1X +M[:#^LJ[W'GBN+-F6$3#Z%*>VJ7'X#N22%R/YX^5R#;.*] +M&^#Y=2,/]5/,\T`U85X:_($E2K^.]HY3:4/I:6/RQYRD#SV:P.U)@3^M*BE) +ME0071(PL2%!6-;RA>B3:+T:8D:_[_=UV55KHA%9K2KT*\T>CUESS)T;FC/@3 +M<^8AZ!\569H6>20SLXY"544'O$F&WB96'3`#%^%HPCURX-F7V;KD*L%8#"_/$R +M8JTL/`[2_O=5B+5!N/_[RXBULK`,[K\I(;;EA]9(*$>IP1X))0I/D2:?QE0M +MS0'3D5!/\_>,+X1HZ73I\Z>KH52(/X9E'!.2ZQV,"EJM:E#)L/IBN.('"QD3 +MC,MSPWHO2B>KQ(?[BY4=(;PVBP_VO]Q-^-V<'6..QQ9(.5$^[7=,RJJYW5*E`VI +MUYH!PK)K<.4DX:`XJL.=5UE]L\M-&Q?`V'V@7JF\;;U99Q#LH_ +MGA_');610$:YAF'FMI;EOY\C_$3`LP5AQ#E+(?0\H!O>ST01:4I&2IRF(-^& +M=.2H)DY'/@$Z\BG2&'">Y#A/UY",-OQTP$-=\J1!WR"^N<-SB2,!G1EY-)V? +MUEL\1J/LI!'JM5+0^;'_Z%Y=0&W6^3,#3Z_](XS6GB82KA[^@#^^]GWN`Q[# +M:D\LLCEVEE=[$6?YTF9$]HQ%/A?Q/6:O=-(X6RN\QX6DU&U-`8E#>D_2N!1WH045IW%RY/%*ZRZU_DD +M29\;YG^4UKN=?W$>XP-MAYV7-F':W_)J1ZI`P=N?COW%^2O.#W=>X(B!N+3Z +MA0U'.3J\8\@_:[-S5(?XV0J'6V8L"AVN?+K*"&4S0TTT,;-4#R%1CS:HA^`Q +MNI[@>YIV-Z4Q[0>+R>!C/C-*LPSFJ:[PCEQ@*J/N[$+F1[`VX2/*P'B3.]G;N]?5D +MFB9TY83^@](I>4IQW/4S80]/[5-V[.!W5/DM5E7[;*#5'?F&,H.'AY1,;\G2%BO+G(`]VW>=FEMKRJIT]3- +M`R=)P>ZO3"V0+B#5R,F(7)B4LFL"NM8.JB0UI/7V6])??G:B&E: +M\DD57-%BLMYI>UU,"M5#"F8\H%,ZK-6 +M`>S+K+U.;L/]ES6)^:U.B>_-6!/8\//5\3V<<'*<__@NIW)X%8K>>R!? +MKC[>QMNY'3`K4190[E<:8I$Y(KUO6Z6G<1N?Y'K7'V@@;#ZC=08"E&&)N +MQOM.0,_(6=IZ@R5PH[R="B\?5.2A)NU/&Z8#1=G`ERG=7*J9Y)O.K;6WM:6[ +M'@[